Various API updates to suppor light points developments better, but should also
benifit other extensions to rendering.
This commit is contained in:
parent
116e0cd8c9
commit
00f91631c2
@ -22,6 +22,11 @@ class SG_EXPORT ClippingVolume
|
|||||||
|
|
||||||
inline ClippingVolume() {setupMask();}
|
inline ClippingVolume() {setupMask();}
|
||||||
|
|
||||||
|
inline ClippingVolume(const ClippingVolume& cs, const unsigned int mask)
|
||||||
|
{
|
||||||
|
set(cs,mask);
|
||||||
|
}
|
||||||
|
|
||||||
inline ClippingVolume(const ClippingVolume& cv) : _localMask(cv._localMask), _planeList(cv._planeList) {}
|
inline ClippingVolume(const ClippingVolume& cv) : _localMask(cv._localMask), _planeList(cv._planeList) {}
|
||||||
|
|
||||||
inline ClippingVolume(const PlaneList& pl) : _planeList(pl) {setupMask();}
|
inline ClippingVolume(const PlaneList& pl) : _planeList(pl) {setupMask();}
|
||||||
@ -61,6 +66,19 @@ class SG_EXPORT ClippingVolume
|
|||||||
setupMask();
|
setupMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void set(const ClippingVolume& cs, const unsigned int mask)
|
||||||
|
{
|
||||||
|
unsigned int selector_mask = 0x1;
|
||||||
|
for(PlaneList::const_iterator itr=cs._planeList.begin();
|
||||||
|
itr!=cs._planeList.end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
if (mask&selector_mask) _planeList.push_back(*itr);
|
||||||
|
selector_mask <<= 1;
|
||||||
|
}
|
||||||
|
setupMask();
|
||||||
|
}
|
||||||
|
|
||||||
inline void set(const ClippingVolume& cs) { _planeList = cs._planeList; setupMask(); }
|
inline void set(const ClippingVolume& cs) { _planeList = cs._planeList; setupMask(); }
|
||||||
|
|
||||||
inline void set(const PlaneList& pl) { _planeList = pl; setupMask(); }
|
inline void set(const PlaneList& pl) { _planeList = pl; setupMask(); }
|
||||||
@ -93,6 +111,20 @@ class SG_EXPORT ClippingVolume
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const bool contains(const osg::Vec3& v,const unsigned int mask) const
|
||||||
|
{
|
||||||
|
if (!(mask & _localMask)) return true;
|
||||||
|
unsigned int selector_mask = 0x1;
|
||||||
|
for(PlaneList::const_iterator itr=_planeList.begin();
|
||||||
|
itr!=_planeList.end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
if (mask&selector_mask && (itr->distance(v)<0.0f)) return false;
|
||||||
|
selector_mask <<= 1;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/** Check whether any part of a bounding sphere is contained within clipping set.
|
/** Check whether any part of a bounding sphere is contained within clipping set.
|
||||||
Using a mask to determine which planes should be used for the check, and
|
Using a mask to determine which planes should be used for the check, and
|
||||||
modifying the mask to turn off planes which wouldn't contribute to clipping
|
modifying the mask to turn off planes which wouldn't contribute to clipping
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#ifndef OSG_VEC4
|
#ifndef OSG_VEC4
|
||||||
#define OSG_VEC4 1
|
#define OSG_VEC4 1
|
||||||
|
|
||||||
#include <osg/Math>
|
#include <osg/Vec3>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
@ -24,11 +24,24 @@ class Vec4
|
|||||||
// Methods are defined here so that they are implicitly inlined
|
// Methods are defined here so that they are implicitly inlined
|
||||||
|
|
||||||
Vec4() { _v[0]=0.0f; _v[1]=0.0f; _v[2]=0.0f; _v[3]=0.0f;}
|
Vec4() { _v[0]=0.0f; _v[1]=0.0f; _v[2]=0.0f; _v[3]=0.0f;}
|
||||||
|
|
||||||
Vec4(float x, float y, float z, float w)
|
Vec4(float x, float y, float z, float w)
|
||||||
{
|
{
|
||||||
_v[0]=x; _v[1]=y; _v[2]=z; _v[3]=w;
|
_v[0]=x;
|
||||||
|
_v[1]=y;
|
||||||
|
_v[2]=z;
|
||||||
|
_v[3]=w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec4(const Vec3& v3,float w)
|
||||||
|
{
|
||||||
|
_v[0]=v3[0];
|
||||||
|
_v[1]=v3[1];
|
||||||
|
_v[2]=v3[2];
|
||||||
|
_v[3]=w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
float _v[4];
|
float _v[4];
|
||||||
|
|
||||||
inline const bool operator == (const Vec4& v) const { return _v[0]==v._v[0] && _v[1]==v._v[1] && _v[2]==v._v[2] && _v[3]==v._v[3]; }
|
inline const bool operator == (const Vec4& v) const { return _v[0]==v._v[0] && _v[1]==v._v[1] && _v[2]==v._v[2] && _v[3]==v._v[3]; }
|
||||||
@ -67,15 +80,21 @@ class Vec4
|
|||||||
inline float z() const { return _v[2]; }
|
inline float z() const { return _v[2]; }
|
||||||
inline float w() const { return _v[3]; }
|
inline float w() const { return _v[3]; }
|
||||||
|
|
||||||
inline unsigned long asABGR() const { return clampTo((unsigned long)(_v[0]*255),0ul,255ul)<<24 |
|
inline unsigned long asABGR() const
|
||||||
clampTo((unsigned long)(_v[1]*255),0ul,255ul)<<16 |
|
{
|
||||||
clampTo((unsigned long)(_v[2]*255),0ul,255ul)<<8 |
|
return (unsigned long)clampTo((_v[0]*255.0f),0.0f,255.0f)<<24 |
|
||||||
clampTo((unsigned long)(_v[3]*255),0ul,255ul); }
|
(unsigned long)clampTo((_v[1]*255.0f),0.0f,255.0f)<<16 |
|
||||||
|
(unsigned long)clampTo((_v[2]*255.0f),0.0f,255.0f)<<8 |
|
||||||
|
(unsigned long)clampTo((_v[3]*255.0f),0.0f,255.0f);
|
||||||
|
}
|
||||||
|
|
||||||
inline unsigned long asRGBA() const { return clampTo((unsigned long)(_v[3]*255),0ul,255ul)<<24 |
|
inline const unsigned long asRGBA() const
|
||||||
clampTo((unsigned long)(_v[2]*255),0ul,255ul)<<16 |
|
{
|
||||||
clampTo((unsigned long)(_v[1]*255),0ul,255ul)<<8 |
|
return (unsigned long)clampTo((_v[3]*255.0f),0.0f,255.0f)<<24 |
|
||||||
clampTo((unsigned long)(_v[0]*255),0ul,255ul); }
|
(unsigned long)clampTo((_v[2]*255.0f),0.0f,255.0f)<<16 |
|
||||||
|
(unsigned long)clampTo((_v[1]*255.0f),0.0f,255.0f)<<8 |
|
||||||
|
(unsigned long)clampTo((_v[0]*255.0f),0.0f,255.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline const bool valid() const { return !isNaN(); }
|
inline const bool valid() const { return !isNaN(); }
|
||||||
|
@ -238,6 +238,8 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
osg::ClippingVolume& getCurrentClippingVolume() { return _modelviewClippingVolumeStack.back(); }
|
||||||
|
|
||||||
inline bool isCulled(const osg::BoundingSphere& sp,CullingMode& mode)
|
inline bool isCulled(const osg::BoundingSphere& sp,CullingMode& mode)
|
||||||
{
|
{
|
||||||
if (!sp.isValid()) return true;
|
if (!sp.isValid()) return true;
|
||||||
@ -258,7 +260,10 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor
|
|||||||
return !_modelviewClippingVolumeStack.back().contains(bb,mode);
|
return !_modelviewClippingVolumeStack.back().contains(bb,mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateCalculatedNearFar(const osg::Matrix& matrix,const osg::Drawable& drawable);
|
const CullingMode getCurrentCullingMode() const { return _cullingModeStack.back(); }
|
||||||
|
|
||||||
|
void updateCalculatedNearFar(const osg::Matrix& matrix,const osg::Drawable& drawable) { updateCalculatedNearFar(matrix,drawable.getBound()); }
|
||||||
|
void updateCalculatedNearFar(const osg::Matrix& matrix,const osg::BoundingBox& bb);
|
||||||
void updateCalculatedNearFar(const osg::Vec3& pos);
|
void updateCalculatedNearFar(const osg::Vec3& pos);
|
||||||
|
|
||||||
/** Add a drawable to current render graph.*/
|
/** Add a drawable to current render graph.*/
|
||||||
|
@ -33,6 +33,8 @@ class OSGUTIL_EXPORT RenderGraph : public osg::Referenced
|
|||||||
int _depth;
|
int _depth;
|
||||||
ChildList _children;
|
ChildList _children;
|
||||||
LeafList _leaves;
|
LeafList _leaves;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Referenced> _userData;
|
||||||
|
|
||||||
|
|
||||||
RenderGraph():
|
RenderGraph():
|
||||||
@ -54,6 +56,10 @@ class OSGUTIL_EXPORT RenderGraph : public osg::Referenced
|
|||||||
|
|
||||||
RenderGraph* cloneType() const { return new RenderGraph; }
|
RenderGraph* cloneType() const { return new RenderGraph; }
|
||||||
|
|
||||||
|
void setUserData(osg::Referenced* obj) { _userData = obj; }
|
||||||
|
osg::Referenced* getUserData() { return _userData.get(); }
|
||||||
|
const osg::Referenced* getUserData() const { return _userData.get(); }
|
||||||
|
|
||||||
|
|
||||||
/** return true if all of drawables, lights and children are empty.*/
|
/** return true if all of drawables, lights and children are empty.*/
|
||||||
inline const bool empty() const
|
inline const bool empty() const
|
||||||
|
@ -304,9 +304,8 @@ inline float distance(const osg::Vec3& coord,const osg::Matrix& matrix)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CullVisitor::updateCalculatedNearFar(const osg::Matrix& matrix,const osg::Drawable& drawable)
|
void CullVisitor::updateCalculatedNearFar(const osg::Matrix& matrix,const osg::BoundingBox& bb)
|
||||||
{
|
{
|
||||||
const osg::BoundingBox& bb = drawable.getBound();
|
|
||||||
float d_near = distance(bb.corner(_bbCornerNear),matrix);
|
float d_near = distance(bb.corner(_bbCornerNear),matrix);
|
||||||
float d_far = distance(bb.corner(_bbCornerFar),matrix);
|
float d_far = distance(bb.corner(_bbCornerFar),matrix);
|
||||||
|
|
||||||
@ -329,7 +328,6 @@ void CullVisitor::updateCalculatedNearFar(const osg::Matrix& matrix,const osg::D
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CullVisitor::updateCalculatedNearFar(const osg::Vec3& pos)
|
void CullVisitor::updateCalculatedNearFar(const osg::Vec3& pos)
|
||||||
{
|
{
|
||||||
float d;
|
float d;
|
||||||
|
Loading…
Reference in New Issue
Block a user