mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-21 12:23:51 +00:00
Implement BillboardNode
This commit is contained in:
parent
d486cde330
commit
32bb202290
1 changed files with 36 additions and 3 deletions
|
@ -128,6 +128,7 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeCallback used to update the bone matrices in skeleton space as needed for skinning.
|
// NodeCallback used to update the bone matrices in skeleton space as needed for skinning.
|
||||||
|
// Must be set on a Bone.
|
||||||
class UpdateBone : public osg::NodeCallback
|
class UpdateBone : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -161,10 +162,39 @@ namespace
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Custom node used to have a transform always oriented towards the camera. Can have translation and scale
|
||||||
|
// set just like a regular MatrixTransform, but the rotation set will be overridden in order to face the camera.
|
||||||
|
class BillboardNode : public osg::MatrixTransform
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BillboardNode() : osg::MatrixTransform() {}
|
||||||
|
BillboardNode(const BillboardNode& copy, const osg::CopyOp& copyop)
|
||||||
|
: osg::MatrixTransform(copy, copyop) {}
|
||||||
|
BillboardNode(const osg::Matrix& matrix)
|
||||||
|
: osg::MatrixTransform(matrix) {}
|
||||||
|
|
||||||
|
META_Node(NifOsg, BillboardNode)
|
||||||
|
|
||||||
|
virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix, osg::NodeVisitor*) const
|
||||||
|
{
|
||||||
|
if (_referenceFrame==RELATIVE_RF)
|
||||||
|
{
|
||||||
|
matrix.preMult(_matrix);
|
||||||
|
matrix.setRotate(osg::Quat());
|
||||||
|
}
|
||||||
|
else // absolute
|
||||||
|
{
|
||||||
|
matrix = _matrix;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// NodeCallback used to set the inverse of the parent bone's matrix in skeleton space
|
// NodeCallback used to set the inverse of the parent bone's matrix in skeleton space
|
||||||
// on the MatrixTransform that the NodeCallback is attached to. This is used so we can
|
// on the MatrixTransform that the NodeCallback is attached to. This is used so we can
|
||||||
// attach skinned meshes to their actual parent node, while still having the skinning
|
// attach skinned meshes to their actual parent node, while still having the skinning
|
||||||
// work in skeleton space as expected.
|
// work in skeleton space as expected.
|
||||||
|
// Must be set on a MatrixTransform.
|
||||||
class InvertBoneMatrix : public osg::NodeCallback
|
class InvertBoneMatrix : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -298,7 +328,11 @@ namespace NifOsg
|
||||||
std::map<int, int> boundTextures, int animflags, int particleflags, bool collisionNode)
|
std::map<int, int> boundTextures, int animflags, int particleflags, bool collisionNode)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::MatrixTransform> transformNode;
|
osg::ref_ptr<osg::MatrixTransform> transformNode;
|
||||||
if (createSkeleton)
|
if (nifNode->recType == Nif::RC_NiBillboardNode)
|
||||||
|
{
|
||||||
|
transformNode = new BillboardNode(toMatrix(nifNode->trafo));
|
||||||
|
}
|
||||||
|
else if (createSkeleton)
|
||||||
{
|
{
|
||||||
osgAnimation::Bone* bone = new osgAnimation::Bone;
|
osgAnimation::Bone* bone = new osgAnimation::Bone;
|
||||||
transformNode = bone;
|
transformNode = bone;
|
||||||
|
@ -308,8 +342,7 @@ namespace NifOsg
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
transformNode = new osg::MatrixTransform;
|
transformNode = new osg::MatrixTransform(toMatrix(nifNode->trafo));
|
||||||
transformNode->setMatrix(toMatrix(nifNode->trafo));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nifNode->recType == Nif::RC_NiBSAnimationNode)
|
if (nifNode->recType == Nif::RC_NiBSAnimationNode)
|
||||||
|
|
Loading…
Reference in a new issue