first commit
This commit is contained in:
99
include/engine/core/geometry_bih.h
Normal file
99
include/engine/core/geometry_bih.h
Normal file
@ -0,0 +1,99 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
GSFramework
|
||||
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
||||
----------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
#ifndef __NGEOMETRYBIH__
|
||||
#define __NGEOMETRYBIH__
|
||||
|
||||
|
||||
#include "bih/bih.h"
|
||||
#include "core/shader_tree.h"
|
||||
#include "core/material.h"
|
||||
#include "core/geometry.h"
|
||||
#include "core/geometry_tree.h"
|
||||
|
||||
|
||||
namespace GS {
|
||||
namespace Core {
|
||||
struct ResourceFactory;
|
||||
|
||||
/// BIH ray/triangle intersection acceleration structure.
|
||||
struct GeometryBIHAccel
|
||||
{
|
||||
char cu, cv;
|
||||
Array <float> k;
|
||||
float d;
|
||||
};
|
||||
|
||||
struct GeometryBIHMaterial
|
||||
{
|
||||
sMaterial material;
|
||||
sShaderTree shader_tree;
|
||||
};
|
||||
|
||||
/*
|
||||
@short Geometry polygon bounding interval hierarchy.
|
||||
|
||||
Raytracing/intersection acceleration structure theoretically
|
||||
performing within 70% of the SAH/KD-Tree performances.
|
||||
|
||||
@author Emmanuel Julien (ejulien@gsworks.fr)
|
||||
*/
|
||||
class GeometryBIH : public IGeometryTree, public BIH::Tree
|
||||
{
|
||||
Array <GeometryBIHMaterial> material_table; ///< Material table.
|
||||
Array <uint> pol_index;
|
||||
|
||||
Array <GeometryBIHAccel> acc; ///< Raytracing lookup tables.
|
||||
|
||||
/// Trace leaf content.
|
||||
void TraceLeaf(BIH::Node *leaf, float tmin, float tmax, BIH::Trace &trace, void *parm = 0);
|
||||
/// Build raytracing lookup tables.
|
||||
bool BuildLUT();
|
||||
|
||||
public:
|
||||
|
||||
/// Return the raytracing LUT structure.
|
||||
const GeometryBIHAccel *GetRaytracingAccelerationStructure() const { return acc; }
|
||||
|
||||
/// Fast polygon test.
|
||||
bool FastPolyTest(uint ip, Vector4 &s, Vector4 &d, float l = -1.f);
|
||||
|
||||
void RaytraceGeometry(GeometryTrace &trace, const Vector4 &s, const Vector4 &d, float l = -1.f);
|
||||
bool BuildFromGeometry(ResourceFactory &, Geometry *);
|
||||
void Free();
|
||||
};
|
||||
|
||||
/*!
|
||||
@short Geometry BIH tree.
|
||||
@author Emmanuel Julien (ejulien@gsworks.fr)
|
||||
*/
|
||||
class GeometryBIHTree : public IGeometryTree
|
||||
{
|
||||
GeometryBIH bih;
|
||||
|
||||
public:
|
||||
|
||||
/*!
|
||||
@name Interface core functions.
|
||||
@{
|
||||
*/
|
||||
/// Raytrace the geometry tree.
|
||||
void RaytraceGeometry(GeometryTrace &trace, const Vector4 &s, const Vector4 &d, float l = -1.f) { bih.RaytraceGeometry(trace, s, d, l); }
|
||||
/// Build tree from a geometry.
|
||||
bool BuildFromGeometry(ResourceFactory &gf, Geometry *g) { return bih.BuildFromGeometry(gf, g); }
|
||||
/// Free all internal structures.
|
||||
void Free() { bih.Free(); }
|
||||
/// @}
|
||||
|
||||
~GeometryBIHTree()
|
||||
{ Free(); }
|
||||
};
|
||||
|
||||
} // Core
|
||||
} // GS
|
||||
|
||||
|
||||
#endif // __NGEOMETRYBIH__
|
||||
Reference in New Issue
Block a user