mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
501 lines
14 KiB
C++
Executable File
501 lines
14 KiB
C++
Executable File
// Created on: 2013-08-27
|
|
// Created by: Denis BOGOLEPOV
|
|
// Copyright (c) 2013-2014 OPEN CASCADE SAS
|
|
//
|
|
// This file is part of Open CASCADE Technology software library.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
// by the Free Software Foundation, with special exception defined in the file
|
|
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
// distribution for complete text of the license and disclaimer of any warranty.
|
|
//
|
|
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
// commercial license or contractual agreement.
|
|
|
|
#ifndef _OpenGl_SceneGeometry_Header
|
|
#define _OpenGl_SceneGeometry_Header
|
|
|
|
#include <BVH_Geometry.hxx>
|
|
#include <BVH_Triangulation.hxx>
|
|
#include <BVH_BinnedBuilder.hxx>
|
|
#include <NCollection_StdAllocator.hxx>
|
|
#include <OpenGl_TextureBufferArb.hxx>
|
|
#include <OpenGl_Texture.hxx>
|
|
#include <OpenGl_Sampler.hxx>
|
|
|
|
class OpenGl_Element;
|
|
struct OpenGl_ElementNode;
|
|
class OpenGl_Group;
|
|
class OpenGl_Structure;
|
|
class OpenGl_PrimitiveArray;
|
|
|
|
namespace OpenGl_Raytrace
|
|
{
|
|
//! Checks to see if the group contains ray-trace geometry.
|
|
Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup);
|
|
|
|
//! Checks to see if the element contains ray-trace geometry.
|
|
Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode);
|
|
|
|
//! Checks to see if the element contains ray-trace geometry.
|
|
Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement);
|
|
|
|
//! Checks to see if the structure contains ray-trace geometry.
|
|
Standard_Boolean IsRaytracedStructure (const OpenGl_Structure* theStructure);
|
|
}
|
|
|
|
//! Stores properties of surface material.
|
|
class OpenGl_RaytraceMaterial
|
|
{
|
|
public:
|
|
|
|
//! Ambient reflection coefficient.
|
|
BVH_Vec4f Ambient;
|
|
|
|
//! Diffuse reflection coefficient.
|
|
BVH_Vec4f Diffuse;
|
|
|
|
//! Glossy reflection coefficient.
|
|
BVH_Vec4f Specular;
|
|
|
|
//! Material emission.
|
|
BVH_Vec4f Emission;
|
|
|
|
//! Specular reflection coefficient.
|
|
BVH_Vec4f Reflection;
|
|
|
|
//! Specular refraction coefficient.
|
|
BVH_Vec4f Refraction;
|
|
|
|
//! Material transparency.
|
|
BVH_Vec4f Transparency;
|
|
|
|
//! Texture transformation matrix.
|
|
BVH_Mat4f TextureTransform;
|
|
|
|
//! Physically-based material properties (used in path tracing engine).
|
|
struct Physical
|
|
{
|
|
//! Weight of the diffuse BRDF.
|
|
BVH_Vec4f Kd;
|
|
|
|
//! Weight of the reflection BRDF.
|
|
BVH_Vec4f Kr;
|
|
|
|
//! Weight of the transmission BTDF.
|
|
BVH_Vec4f Kt;
|
|
|
|
//! Weight of the Blinn's glossy BRDF.
|
|
BVH_Vec4f Ks;
|
|
|
|
//! Self-emitted radiance.
|
|
BVH_Vec4f Le;
|
|
|
|
//! Fresnel coefficients.
|
|
BVH_Vec4f Fresnel;
|
|
|
|
//! Absorption color for the transmission BSDF.
|
|
BVH_Vec4f Absorption;
|
|
|
|
} BSDF;
|
|
|
|
public:
|
|
|
|
//! Creates new default material.
|
|
OpenGl_RaytraceMaterial();
|
|
|
|
//! Creates new material with specified properties.
|
|
OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
|
|
const BVH_Vec4f& theDiffuse,
|
|
const BVH_Vec4f& theSpecular);
|
|
|
|
//! Creates new material with specified properties.
|
|
OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
|
|
const BVH_Vec4f& theDiffuse,
|
|
const BVH_Vec4f& theSpecular,
|
|
const BVH_Vec4f& theEmission,
|
|
const BVH_Vec4f& theTranspar);
|
|
|
|
//! Creates new material with specified properties.
|
|
OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
|
|
const BVH_Vec4f& theDiffuse,
|
|
const BVH_Vec4f& theSpecular,
|
|
const BVH_Vec4f& theEmission,
|
|
const BVH_Vec4f& theTranspar,
|
|
const BVH_Vec4f& theReflection,
|
|
const BVH_Vec4f& theRefraction);
|
|
|
|
//! Returns packed (serialized) representation of material.
|
|
const Standard_ShortReal* Packed()
|
|
{
|
|
return reinterpret_cast<Standard_ShortReal*> (this);
|
|
}
|
|
};
|
|
|
|
//! Stores properties of OpenGL light source.
|
|
class OpenGl_RaytraceLight
|
|
{
|
|
public:
|
|
|
|
//! Diffuse intensity (in terms of OpenGL).
|
|
BVH_Vec4f Diffuse;
|
|
|
|
//! Position of light source (in terms of OpenGL).
|
|
BVH_Vec4f Position;
|
|
|
|
public:
|
|
|
|
//! Creates new light source.
|
|
OpenGl_RaytraceLight (const BVH_Vec4f& theDiffuse,
|
|
const BVH_Vec4f& thePosition);
|
|
|
|
//! Returns packed (serialized) representation of light source.
|
|
const Standard_ShortReal* Packed()
|
|
{
|
|
return reinterpret_cast<Standard_ShortReal*> (this);
|
|
}
|
|
};
|
|
|
|
//! Triangulation of single OpenGL primitive array.
|
|
class OpenGl_TriangleSet : public BVH_Triangulation<Standard_ShortReal, 3>
|
|
{
|
|
public:
|
|
|
|
//! Value of invalid material index to return in case of errors.
|
|
static const Standard_Integer INVALID_MATERIAL = -1;
|
|
|
|
public:
|
|
|
|
//! Creates new OpenGL element triangulation.
|
|
OpenGl_TriangleSet (const Standard_Size theArrayID);
|
|
|
|
//! Releases resources of OpenGL element triangulation.
|
|
~OpenGl_TriangleSet()
|
|
{
|
|
//
|
|
}
|
|
|
|
//! Returns Id of associated primitive array.
|
|
Standard_Size AssociatedPArrayID() const
|
|
{
|
|
return myArrayID;
|
|
}
|
|
|
|
//! Returns material index of triangle set.
|
|
Standard_Integer MaterialIndex() const
|
|
{
|
|
if (Elements.size() == 0)
|
|
{
|
|
return INVALID_MATERIAL;
|
|
}
|
|
|
|
return Elements.front().w();
|
|
}
|
|
|
|
//! Sets material index for entire triangle set.
|
|
void SetMaterialIndex (Standard_Integer theMatID)
|
|
{
|
|
for (Standard_Size anIdx = 0; anIdx < Elements.size(); ++anIdx)
|
|
{
|
|
Elements[anIdx].w() = theMatID;
|
|
}
|
|
}
|
|
|
|
//! Returns AABB of the given object.
|
|
using BVH_Triangulation<Standard_ShortReal, 3>::Box;
|
|
|
|
//! Returns AABB of primitive set.
|
|
BVH_BoxNt Box() const;
|
|
|
|
//! Returns centroid position along the given axis.
|
|
Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const;
|
|
|
|
public:
|
|
|
|
BVH_Array3f Normals; //!< Array of vertex normals.
|
|
|
|
BVH_Array2f TexCrds; //!< Array of vertex UV coords.
|
|
|
|
private:
|
|
|
|
Standard_Size myArrayID; //!< ID of associated primitive array.
|
|
|
|
};
|
|
|
|
//! Set of clipping planes specific for OpenGL primitive array.
|
|
class OpenGl_RaytraceClipPlanes
|
|
{
|
|
public:
|
|
|
|
//! Maximum number of clipping planes used in ray-tracing for each
|
|
//! OpenGL primitive array. This is not implementation restriction,
|
|
//! but it is reasonable to limit max number of planes in order to
|
|
//! simplify GLSL data representation.
|
|
static const Standard_Integer MAX_PLANE_NUMBER = 8;
|
|
|
|
//! State of clipping plane.
|
|
enum ClipPlaneState {
|
|
|
|
CLIP_PLANE_OFF = -1, //!< plane is deactivated
|
|
CLIP_PLANE_VIEW = 0, //!< plane is in view space
|
|
CLIP_PLANE_WORLD = 1 //!< plane is in world space
|
|
};
|
|
|
|
//! Wrapper for clipping plane configuration.
|
|
class ClipPlane
|
|
{
|
|
public:
|
|
|
|
//! Creates new clipping plane wrapper.
|
|
ClipPlane (BVH_Vec4f& theSettings,
|
|
BVH_Vec4f& theEquation) : mySettings (theSettings),
|
|
myEquation (theEquation) {}
|
|
|
|
//! Sets 4D equation vector for clipping plane.
|
|
void SetEquation (const BVH_Vec4d& theEquation, const ClipPlaneState theState = CLIP_PLANE_WORLD)
|
|
{
|
|
for (Standard_Integer anIndex = 0; anIndex < 4; ++anIndex)
|
|
{
|
|
myEquation[anIndex] = static_cast<Standard_ShortReal> (theEquation[anIndex]);
|
|
}
|
|
|
|
SetState (theState);
|
|
}
|
|
|
|
//! Returns state of clipping plane.
|
|
ClipPlaneState State()
|
|
{
|
|
return static_cast<ClipPlaneState> (mySettings.x());
|
|
}
|
|
|
|
//! Sets state of clipping plane.
|
|
void SetState (const ClipPlaneState theState)
|
|
{
|
|
mySettings.x() = static_cast<Standard_ShortReal> (theState);
|
|
}
|
|
|
|
private:
|
|
|
|
//! Settings of clipping plane.
|
|
BVH_Vec4f& mySettings;
|
|
|
|
//! 4D equation vector of clipping plane.
|
|
BVH_Vec4f& myEquation;
|
|
};
|
|
|
|
public:
|
|
|
|
//! Creates new set of clipping planes.
|
|
OpenGl_RaytraceClipPlanes();
|
|
|
|
//! Returns clipping plane for the given index.
|
|
ClipPlane operator[] (const Standard_Integer theIndex)
|
|
{
|
|
return ClipPlane (myClipPlanes[theIndex * 2 + 0],
|
|
myClipPlanes[theIndex * 2 + 1]);
|
|
}
|
|
|
|
//! Returns packed (serialized) representation of clipping planes set.
|
|
const Standard_ShortReal* Packed()
|
|
{
|
|
return reinterpret_cast<Standard_ShortReal*> (this);
|
|
}
|
|
|
|
private:
|
|
|
|
//! Serialized clipping planes storage.
|
|
BVH_Vec4f myClipPlanes[MAX_PLANE_NUMBER * 2];
|
|
|
|
};
|
|
|
|
//! Stores transform properties of ray-tracing object.
|
|
class OpenGl_RaytraceTransform : public BVH_Transform<Standard_ShortReal, 4>
|
|
{
|
|
public:
|
|
|
|
//! Value of invalid clipping plane set.
|
|
static const Standard_Integer NO_CLIPPING = -1;
|
|
|
|
public:
|
|
|
|
//! Creates new identity transformation.
|
|
OpenGl_RaytraceTransform() : BVH_Transform<Standard_ShortReal, 4>()
|
|
{
|
|
myClipSetID = NO_CLIPPING; // no clipping by default
|
|
}
|
|
|
|
//! Creates new transformation with specified matrix.
|
|
OpenGl_RaytraceTransform (const BVH_Mat4f& theTransform) : BVH_Transform<Standard_ShortReal, 4> (theTransform)
|
|
{
|
|
myClipSetID = NO_CLIPPING; // no clipping by default
|
|
}
|
|
|
|
//! Returns ID of associated set of clipping planes.
|
|
Standard_Integer ClipSetID() const
|
|
{
|
|
return myClipSetID;
|
|
}
|
|
|
|
//! Sets ID of associated set of clipping planes.
|
|
void SetClipSetID (const Standard_Integer theClipSetID)
|
|
{
|
|
myClipSetID = theClipSetID;
|
|
}
|
|
|
|
protected:
|
|
|
|
//! ID of associated set of clipping planes.
|
|
Standard_Integer myClipSetID;
|
|
|
|
};
|
|
|
|
//! Stores geometry of ray-tracing scene.
|
|
class OpenGl_RaytraceGeometry : public BVH_Geometry<Standard_ShortReal, 3>
|
|
{
|
|
public:
|
|
|
|
//! Value of invalid offset to return in case of errors.
|
|
static const Standard_Integer INVALID_OFFSET = -1;
|
|
|
|
//! Maximum number of textures used in ray-tracing shaders.
|
|
//! This is not restriction of the solution implemented, but
|
|
//! rather the reasonable limit of the number of textures in
|
|
//! various applications (can be increased if needed).
|
|
static const Standard_Integer MAX_TEX_NUMBER = 32;
|
|
|
|
public:
|
|
|
|
//! Array of properties of light sources.
|
|
std::vector<OpenGl_RaytraceLight,
|
|
NCollection_StdAllocator<OpenGl_RaytraceLight> > Sources;
|
|
|
|
//! Array of 'front' material properties.
|
|
std::vector<OpenGl_RaytraceMaterial,
|
|
NCollection_StdAllocator<OpenGl_RaytraceMaterial> > Materials;
|
|
|
|
//! Array of sets of clipping plane parameters.
|
|
std::vector<OpenGl_RaytraceClipPlanes,
|
|
NCollection_StdAllocator<OpenGl_RaytraceClipPlanes> > ClipPlanes;
|
|
|
|
//! Global ambient from all light sources.
|
|
BVH_Vec4f Ambient;
|
|
|
|
public:
|
|
|
|
//! Creates uninitialized ray-tracing geometry.
|
|
OpenGl_RaytraceGeometry()
|
|
: BVH_Geometry<Standard_ShortReal, 3>(),
|
|
myHighLevelTreeDepth (0),
|
|
myBottomLevelTreeDepth (0)
|
|
{
|
|
//
|
|
}
|
|
|
|
//! Releases resources of ray-tracing geometry.
|
|
~OpenGl_RaytraceGeometry()
|
|
{
|
|
//
|
|
}
|
|
|
|
//! Clears only ray-tracing materials.
|
|
void ClearMaterials()
|
|
{
|
|
std::vector<OpenGl_RaytraceMaterial,
|
|
NCollection_StdAllocator<OpenGl_RaytraceMaterial> > anEmptyMaterials;
|
|
|
|
Materials.swap (anEmptyMaterials);
|
|
|
|
myTextures.Clear();
|
|
}
|
|
|
|
//! Clears ray-tracing geometry.
|
|
void Clear();
|
|
|
|
public: //! @name methods related to acceleration structure
|
|
|
|
//! Performs post-processing of high-level scene BVH.
|
|
Standard_Boolean ProcessAcceleration();
|
|
|
|
//! Returns offset of bottom-level BVH for given leaf node.
|
|
//! If the node index is not valid the function returns -1.
|
|
//! @note Can be used after processing acceleration structure.
|
|
Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx);
|
|
|
|
//! Returns offset of triangulation vertices for given leaf node.
|
|
//! If the node index is not valid the function returns -1.
|
|
//! @note Can be used after processing acceleration structure.
|
|
Standard_Integer VerticesOffset (Standard_Integer theNodeIdx);
|
|
|
|
//! Returns offset of triangulation elements for given leaf node.
|
|
//! If the node index is not valid the function returns -1.
|
|
//! @note Can be used after processing acceleration structure.
|
|
Standard_Integer ElementsOffset (Standard_Integer theNodeIdx);
|
|
|
|
//! Returns triangulation data for given leaf node.
|
|
//! If the node index is not valid the function returns NULL.
|
|
//! @note Can be used after processing acceleration structure.
|
|
OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx);
|
|
|
|
public: //! @name methods related to texture management
|
|
|
|
//! Adds new OpenGL texture to the scene and returns its index.
|
|
Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture);
|
|
|
|
//! Updates unique 64-bit texture handles to use in shaders.
|
|
Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext);
|
|
|
|
//! Makes the OpenGL texture handles resident (must be called before using).
|
|
Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext) const;
|
|
|
|
//! Makes the OpenGL texture handles non-resident (must be called after using).
|
|
Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const;
|
|
|
|
//! Returns array of texture handles.
|
|
const std::vector<GLuint64>& TextureHandles() const
|
|
{
|
|
return myTextureHandles;
|
|
}
|
|
|
|
//! Checks if scene contains textured objects.
|
|
Standard_Boolean HasTextures() const
|
|
{
|
|
return !myTextures.IsEmpty();
|
|
}
|
|
|
|
//! Releases OpenGL resources.
|
|
void ReleaseResources (const Handle(OpenGl_Context)& theContext)
|
|
{
|
|
if (!myTextureSampler.IsNull())
|
|
{
|
|
myTextureSampler->Release (theContext.operator->());
|
|
myTextureSampler.Nullify();
|
|
}
|
|
}
|
|
|
|
public: //! @name auxiliary methods
|
|
|
|
//! Returns depth of high-level scene BVH from last build.
|
|
Standard_Integer HighLevelTreeDepth() const
|
|
{
|
|
return myHighLevelTreeDepth;
|
|
}
|
|
|
|
//! Returns maximum depth of bottom-level scene BVHs from last build.
|
|
Standard_Integer BottomLevelTreeDepth() const
|
|
{
|
|
return myBottomLevelTreeDepth;
|
|
}
|
|
|
|
protected:
|
|
|
|
NCollection_Vector<Handle(OpenGl_Texture)> myTextures; //!< Array of texture maps shared between rendered objects
|
|
Handle(OpenGl_Sampler) myTextureSampler; //!< Sampler object providing fixed sampling params for texures
|
|
std::vector<GLuint64> myTextureHandles; //!< Array of unique 64-bit texture handles obtained from OpenGL
|
|
Standard_Integer myHighLevelTreeDepth; //!< Depth of high-level scene BVH from last build
|
|
Standard_Integer myBottomLevelTreeDepth; //!< Maximum depth of bottom-level scene BVHs from last build
|
|
|
|
};
|
|
|
|
#endif
|