Files
Webcam/include/modules/raytracer/raytracer_scene.h
2026-06-22 11:49:35 +02:00

125 lines
2.6 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __NRAYTRACERSCENE__
#define __NRAYTRACERSCENE__
#include "core/geometry_tree.h"
#include "bih/bih.h"
namespace GS {
namespace Core {
class Object;
class Geometry;
struct Material;
}
namespace S3D {
class Scene;
struct MLight;
struct MObject;
}
namespace Raytrace {
using Core::IGeometryTree;
//
struct Trace : public Core::GeometryTrace
{
Vector4 pi; ///< Intersection point.
Vector4 n; ///< Normal.
float ir; ///< Current media index of refraction.
float td; ///< Total distance traveled by the ray.
Core::Object *o; ///< Object intersected.
Trace(bool closest = true) : Core::GeometryTrace(closest)
{
ir = 1;
td = 0;
m = NULL;
}
};
///
struct Object
{
Core::Object *o; ///< Object.
Core::sGeometry og, g; ///< Associated geometry.
AutoPtr <IGeometryTree> tree;
Object() : o(0) {}
};
///
struct Light
{
IGeometryTree *g; ///< Shadow cache tree.
uint ip; ///< Shadow cache polygon index.
S3D::MLight *l;
Light() : l(0) {}
};
/*!
@short Raytracer scene acceleration structure.
*/
class SceneBIH : BIH::Tree
{
Array <Object> obj; ///< Object array.
/// Trace leaf content.
void TraceLeaf(BIH::Node *, float tmin, float tmax, BIH::Trace &, void *parm = 0);
/// Add an object to the scene BIH.
void AddObject(Core::ResourceFactory &, S3D::MObject *, uint &obj_count, MinMax *varray, bool shadow);
public:
/*!
@short Translate proxy geometry.
The raytracer may need to make a hard copy of a geometry for example
to freeze its modifiers before building the acceleration structure.
This function returns the original geometry from the proxy one as
returned by a primary ray test.
@note If the geometry is not a proxy, it will be returned as is.
*/
Core::Geometry *TranslateGeometry(Core::Geometry *) const;
/*!
@group Statistics
@{
*/
uint ray_count; ///< Number of ray traced.
/// Reset internal statistic counters.
void ResetStats();
/// @}
/// Build scene tree based on a scene instance.
virtual bool SetScene(Core::ResourceFactory &, const S3D::Scene *, bool shadow = false);
/// Free tree structures.
virtual void Free();
/// Raytrace hierarchy.
virtual void RaytraceScene(Trace &, const Vector4 &s, const Vector4 &d, float l = -1.f);
SceneBIH() { min_leaf_vcount = 3; }
};
} // Raytrace
} // GS
#endif // __NRAYTRACERSCENE__