Added ClipNode::set/getReferenceFrame();
This commit is contained in:
parent
f4fe462b28
commit
0ea6cdeb96
@ -34,10 +34,31 @@ class OSG_EXPORT ClipNode : public Group
|
||||
|
||||
META_Node(osg, ClipNode);
|
||||
|
||||
enum ReferenceFrame
|
||||
{
|
||||
RELATIVE_RF,
|
||||
ABSOLUTE_RF
|
||||
};
|
||||
|
||||
/** Set the light sources's ReferenceFrame, either to be relative to its
|
||||
* parent reference frame, or relative to an absolute coordinate
|
||||
* frame. RELATIVE_RF is the default.
|
||||
* Note: setting the ReferenceFrame to be ABSOLUTE_RF will
|
||||
* also set the CullingActive flag on the light source, and hence all
|
||||
* of its parents, to false, thereby disabling culling of it and
|
||||
* all its parents. This is necessary to prevent inappropriate
|
||||
* culling, but may impact cull times if the absolute light source is
|
||||
* deep in the scene graph. It is therefore recommended to only use
|
||||
* absolute light source at the top of the scene.
|
||||
*/
|
||||
void setReferenceFrame(ReferenceFrame rf);
|
||||
|
||||
ReferenceFrame getReferenceFrame() const { return _referenceFrame; }
|
||||
|
||||
|
||||
/** Creates six clip planes corresponding to the given BoundingBox. */
|
||||
void createClipBox(const BoundingBox& bb,unsigned int clipPlaneNumberBase=0);
|
||||
|
||||
|
||||
/** Adds the clipplane. Returns true on success, and false if the plane
|
||||
* has already been added, or if clipplane is NULL. */
|
||||
bool addClipPlane(ClipPlane* clipplane);
|
||||
@ -83,6 +104,8 @@ class OSG_EXPORT ClipNode : public Group
|
||||
|
||||
StateAttribute::GLModeValue _value;
|
||||
ClipPlaneList _planes;
|
||||
|
||||
ReferenceFrame _referenceFrame;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -17,7 +17,8 @@
|
||||
using namespace osg;
|
||||
|
||||
ClipNode::ClipNode():
|
||||
_value(StateAttribute::ON)
|
||||
_value(StateAttribute::ON),
|
||||
_referenceFrame(RELATIVE_RF)
|
||||
{
|
||||
setStateSet(new StateSet);
|
||||
}
|
||||
@ -43,6 +44,12 @@ ClipNode::~ClipNode()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ClipNode::setReferenceFrame(ReferenceFrame rf)
|
||||
{
|
||||
_referenceFrame = rf;
|
||||
}
|
||||
|
||||
// Create a 6 clip planes to create a clip box.
|
||||
void ClipNode::createClipBox(const BoundingBox& bb,unsigned int clipPlaneNumberBase)
|
||||
{
|
||||
|
@ -32,6 +32,11 @@ void ClipNode::write(DataOutputStream* out){
|
||||
throw Exception("ClipNode::write(): Could not cast this osg::ClipNode to an osg::Group.");
|
||||
// Write ClipNode's properties.
|
||||
|
||||
if ( out->getVersion() >= VERSION_0037 )
|
||||
{
|
||||
out->writeInt((int)getReferenceFrame());
|
||||
}
|
||||
|
||||
out->writeUInt(getNumClipPlanes());
|
||||
|
||||
for (unsigned int i=0;i<getNumClipPlanes();++i)
|
||||
@ -56,6 +61,11 @@ void ClipNode::read(DataInputStream* in){
|
||||
throw Exception("ClipNode::read(): Could not cast this osg::ClipNode to an osg::Object.");
|
||||
// Read ClipNode's properties
|
||||
|
||||
if ( in->getVersion() >= VERSION_0037 )
|
||||
{
|
||||
setReferenceFrame((osg::ClipNode::ReferenceFrame) in->readInt());
|
||||
}
|
||||
|
||||
unsigned int numClipPlanes = in->readUInt();
|
||||
|
||||
for (unsigned int i=0;i<numClipPlanes;++i)
|
||||
|
@ -45,8 +45,9 @@
|
||||
#define VERSION_0034 34
|
||||
#define VERSION_0035 35
|
||||
#define VERSION_0036 36
|
||||
#define VERSION_0037 37
|
||||
|
||||
#define VERSION VERSION_0036
|
||||
#define VERSION VERSION_0037
|
||||
|
||||
/* The BYTE_SEX tag is used to check the endian
|
||||
of the IVE file being read in. The IVE format
|
||||
|
@ -27,6 +27,22 @@ bool ClipNode_readLocalData(Object& obj, Input& fr)
|
||||
|
||||
ClipNode& clipnode = static_cast<ClipNode&>(obj);
|
||||
|
||||
if (fr[0].matchWord("referenceFrame"))
|
||||
{
|
||||
if (fr[1].matchWord("ABSOLUTE"))
|
||||
{
|
||||
clipnode.setReferenceFrame(ClipNode::ABSOLUTE_RF);
|
||||
fr += 2;
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
if (fr[1].matchWord("RELATIVE"))
|
||||
{
|
||||
clipnode.setReferenceFrame(ClipNode::RELATIVE_RF);
|
||||
fr += 2;
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
}
|
||||
|
||||
osg::ref_ptr<StateAttribute> sa=0;
|
||||
while((sa=fr.readStateAttribute())!=0)
|
||||
{
|
||||
@ -43,6 +59,17 @@ bool ClipNode_writeLocalData(const Object& obj, Output& fw)
|
||||
{
|
||||
const ClipNode& clipnode = static_cast<const ClipNode&>(obj);
|
||||
|
||||
fw.indent() << "referenceFrame ";
|
||||
switch (clipnode.getReferenceFrame())
|
||||
{
|
||||
case ClipNode::ABSOLUTE_RF:
|
||||
fw << "ABSOLUTE\n";
|
||||
break;
|
||||
case ClipNode::RELATIVE_RF:
|
||||
default:
|
||||
fw << "RELATIVE\n";
|
||||
};
|
||||
|
||||
for(unsigned int i=0;i<clipnode.getNumClipPlanes();++i)
|
||||
{
|
||||
fw.writeObject(*clipnode.getClipPlane(i));
|
||||
|
@ -952,9 +952,16 @@ void CullVisitor::apply(ClipNode& node)
|
||||
for(ClipNode::ClipPlaneList::const_iterator itr=planes.begin();
|
||||
itr!=planes.end();
|
||||
++itr)
|
||||
{
|
||||
if (node.getReferenceFrame()==osg::ClipNode::RELATIVE_RF)
|
||||
{
|
||||
addPositionedAttribute(&matrix,itr->get());
|
||||
}
|
||||
else
|
||||
{
|
||||
addPositionedAttribute(0,itr->get());
|
||||
}
|
||||
}
|
||||
|
||||
handle_cull_callbacks_and_traverse(node);
|
||||
|
||||
|
@ -30,6 +30,12 @@
|
||||
|
||||
TYPE_NAME_ALIAS(std::vector< osg::ref_ptr< osg::ClipPlane > >, osg::ClipNode::ClipPlaneList)
|
||||
|
||||
BEGIN_ENUM_REFLECTOR(osg::ClipNode::ReferenceFrame)
|
||||
I_DeclaringFile("osg/ClipNode");
|
||||
I_EnumLabel(osg::ClipNode::RELATIVE_RF);
|
||||
I_EnumLabel(osg::ClipNode::ABSOLUTE_RF);
|
||||
END_REFLECTOR
|
||||
|
||||
BEGIN_OBJECT_REFLECTOR(osg::ClipNode)
|
||||
I_DeclaringFile("osg/ClipNode");
|
||||
I_BaseType(osg::Group);
|
||||
@ -70,6 +76,16 @@ BEGIN_OBJECT_REFLECTOR(osg::ClipNode)
|
||||
__void__accept__osg_NodeVisitor_R1,
|
||||
"Visitor Pattern : calls the apply method of a NodeVisitor with this node's type. ",
|
||||
"");
|
||||
I_Method1(void, setReferenceFrame, IN, osg::ClipNode::ReferenceFrame, rf,
|
||||
Properties::NON_VIRTUAL,
|
||||
__void__setReferenceFrame__ReferenceFrame,
|
||||
"Set the light sources's ReferenceFrame, either to be relative to its parent reference frame, or relative to an absolute coordinate frame. ",
|
||||
"RELATIVE_RF is the default. Note: setting the ReferenceFrame to be ABSOLUTE_RF will also set the CullingActive flag on the light source, and hence all of its parents, to false, thereby disabling culling of it and all its parents. This is necessary to prevent inappropriate culling, but may impact cull times if the absolute light source is deep in the scene graph. It is therefore recommended to only use absolute light source at the top of the scene. ");
|
||||
I_Method0(osg::ClipNode::ReferenceFrame, getReferenceFrame,
|
||||
Properties::NON_VIRTUAL,
|
||||
__ReferenceFrame__getReferenceFrame,
|
||||
"",
|
||||
"");
|
||||
I_MethodWithDefaults2(void, createClipBox, IN, const osg::BoundingBox &, bb, , IN, unsigned int, clipPlaneNumberBase, 0,
|
||||
Properties::NON_VIRTUAL,
|
||||
__void__createClipBox__C5_BoundingBox_R1__unsigned_int,
|
||||
@ -148,6 +164,9 @@ BEGIN_OBJECT_REFLECTOR(osg::ClipNode)
|
||||
I_SimpleProperty(osg::StateAttribute::GLModeValue, LocalStateSetModes,
|
||||
0,
|
||||
__void__setLocalStateSetModes__StateAttribute_GLModeValue);
|
||||
I_SimpleProperty(osg::ClipNode::ReferenceFrame, ReferenceFrame,
|
||||
__ReferenceFrame__getReferenceFrame,
|
||||
__void__setReferenceFrame__ReferenceFrame);
|
||||
END_REFLECTOR
|
||||
|
||||
BEGIN_VALUE_REFLECTOR(osg::ref_ptr< osg::ClipPlane >)
|
||||
|
Loading…
Reference in New Issue
Block a user