mirror of
https://github.com/luanti-org/luanti.git
synced 2025-11-05 01:35:29 +01:00
Refactor: Remove obsolete IAnimatedMeshSceneNode interface (#16631)
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CBoneSceneNode.h"
|
#include "CBoneSceneNode.h"
|
||||||
#include "IAnimatedMeshSceneNode.h"
|
#include "ISceneNode.h"
|
||||||
#include "IAnimatedMesh.h"
|
#include "IAnimatedMesh.h"
|
||||||
|
|
||||||
#include "SkinnedMesh.h"
|
#include "SkinnedMesh.h"
|
||||||
@@ -16,20 +16,17 @@
|
|||||||
namespace scene
|
namespace scene
|
||||||
{
|
{
|
||||||
|
|
||||||
class CAnimatedMeshSceneNode : public IAnimatedMeshSceneNode
|
class AnimatedMeshSceneNode : public ISceneNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! constructor
|
//! constructor
|
||||||
CAnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent, ISceneManager *mgr, s32 id,
|
AnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent, ISceneManager *mgr, s32 id,
|
||||||
const core::vector3df &position = core::vector3df(0, 0, 0),
|
const core::vector3df &position = core::vector3df(0, 0, 0),
|
||||||
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
||||||
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f));
|
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f));
|
||||||
|
|
||||||
//! destructor
|
//! destructor
|
||||||
virtual ~CAnimatedMeshSceneNode();
|
virtual ~AnimatedMeshSceneNode();
|
||||||
|
|
||||||
//! sets the current frame. from now on the animation is played from this frame.
|
|
||||||
void setCurrentFrame(f32 frame) override;
|
|
||||||
|
|
||||||
//! frame
|
//! frame
|
||||||
void OnRegisterSceneNode() override;
|
void OnRegisterSceneNode() override;
|
||||||
@@ -43,31 +40,6 @@ public:
|
|||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
const core::aabbox3d<f32> &getBoundingBox() const override;
|
const core::aabbox3d<f32> &getBoundingBox() const override;
|
||||||
|
|
||||||
//! sets the frames between the animation is looped.
|
|
||||||
//! the default is 0 - MaximalFrameCount of the mesh.
|
|
||||||
//! NOTE: setMesh will also change this value and set it to the full range of animations of the mesh
|
|
||||||
bool setFrameLoop(f32 begin, f32 end) override;
|
|
||||||
|
|
||||||
//! Sets looping mode which is on by default. If set to false,
|
|
||||||
//! animations will not be looped.
|
|
||||||
void setLoopMode(bool playAnimationLooped) override;
|
|
||||||
|
|
||||||
//! returns the current loop mode
|
|
||||||
bool getLoopMode() const override;
|
|
||||||
|
|
||||||
void setOnAnimateCallback(
|
|
||||||
const std::function<void(f32 dtime)> &cb) override
|
|
||||||
{
|
|
||||||
OnAnimateCallback = cb;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! sets the speed with which the animation is played
|
|
||||||
//! NOTE: setMesh will also change this value and set it to the default speed of the mesh
|
|
||||||
void setAnimationSpeed(f32 framesPerSecond) override;
|
|
||||||
|
|
||||||
//! gets the speed with which the animation is played
|
|
||||||
f32 getAnimationSpeed() const override;
|
|
||||||
|
|
||||||
//! returns the material based on the zero based index i. To get the amount
|
//! returns the material based on the zero based index i. To get the amount
|
||||||
//! of materials used by this scene node, use getMaterialCount().
|
//! of materials used by this scene node, use getMaterialCount().
|
||||||
//! This function is needed for inserting the node into the scene hierarchy on a
|
//! This function is needed for inserting the node into the scene hierarchy on a
|
||||||
@@ -78,68 +50,112 @@ public:
|
|||||||
//! returns amount of materials used by this scene node.
|
//! returns amount of materials used by this scene node.
|
||||||
u32 getMaterialCount() const override;
|
u32 getMaterialCount() const override;
|
||||||
|
|
||||||
//! Returns a pointer to a child node, which has the same transformation as
|
|
||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
|
||||||
IBoneSceneNode *getJointNode(const c8 *jointName) override;
|
|
||||||
|
|
||||||
//! same as getJointNode(const c8* jointName), but based on id
|
|
||||||
IBoneSceneNode *getJointNode(u32 jointID) override;
|
|
||||||
|
|
||||||
//! Gets joint count.
|
|
||||||
u32 getJointCount() const override;
|
|
||||||
|
|
||||||
//! Removes a child from this scene node.
|
//! Removes a child from this scene node.
|
||||||
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
||||||
//! or to remove attached child.
|
//! or to remove attached child.
|
||||||
bool removeChild(ISceneNode *child) override;
|
bool removeChild(ISceneNode *child) override;
|
||||||
|
|
||||||
//! Returns the current displayed frame number.
|
|
||||||
f32 getFrameNr() const override;
|
|
||||||
//! Returns the current start frame number.
|
|
||||||
f32 getStartFrame() const override;
|
|
||||||
//! Returns the current end frame number.
|
|
||||||
f32 getEndFrame() const override;
|
|
||||||
|
|
||||||
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
|
||||||
/* In this way it is possible to change the materials a mesh causing all mesh scene nodes
|
|
||||||
referencing this mesh to change too. */
|
|
||||||
void setReadOnlyMaterials(bool readonly) override;
|
|
||||||
|
|
||||||
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
|
||||||
bool isReadOnlyMaterials() const override;
|
|
||||||
|
|
||||||
//! Sets a new mesh
|
|
||||||
void setMesh(IAnimatedMesh *mesh) override;
|
|
||||||
|
|
||||||
//! Returns the current mesh
|
|
||||||
IAnimatedMesh *getMesh(void) override { return Mesh; }
|
|
||||||
|
|
||||||
//! Returns type of the scene node
|
//! Returns type of the scene node
|
||||||
ESCENE_NODE_TYPE getType() const override { return ESNT_ANIMATED_MESH; }
|
ESCENE_NODE_TYPE getType() const override { return ESNT_ANIMATED_MESH; }
|
||||||
|
|
||||||
//! updates the absolute position based on the relative and the parents position
|
|
||||||
void updateAbsolutePosition() override;
|
|
||||||
|
|
||||||
//! Sets the transition time in seconds (note: This needs to enable joints)
|
|
||||||
//! you must call animateJoints(), or the mesh will not animate
|
|
||||||
void setTransitionTime(f32 Time) override;
|
|
||||||
|
|
||||||
void updateJointSceneNodes(const std::vector<SkinnedMesh::SJoint::VariantTransform> &transforms);
|
|
||||||
|
|
||||||
//! updates the joint positions of this mesh
|
|
||||||
void animateJoints() override;
|
|
||||||
|
|
||||||
void addJoints();
|
|
||||||
|
|
||||||
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
|
||||||
void setRenderFromIdentity(bool On) override;
|
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
//! Creates a clone of this scene node and its children.
|
||||||
/** \param newParent An optional new parent.
|
/** \param newParent An optional new parent.
|
||||||
\param newManager An optional new scene manager.
|
\param newManager An optional new scene manager.
|
||||||
\return The newly created clone of this node. */
|
\return The newly created clone of this node. */
|
||||||
ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) override;
|
ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) override;
|
||||||
|
|
||||||
|
//! Sets the current frame number.
|
||||||
|
/** From now on the animation is played from this frame.
|
||||||
|
\param frame: Number of the frame to let the animation be started from.
|
||||||
|
The frame number must be a valid frame number of the IMesh used by this
|
||||||
|
scene node. Set IAnimatedMesh::getMesh() for details. */
|
||||||
|
void setCurrentFrame(f32 frame);
|
||||||
|
|
||||||
|
//! Sets the frame numbers between the animation is looped.
|
||||||
|
/** The default is 0 to getMaxFrameNumber() of the mesh.
|
||||||
|
Number of played frames is end-start.
|
||||||
|
It interpolates toward the last frame but stops when it is reached.
|
||||||
|
It does not interpolate back to start even when looping.
|
||||||
|
Looping animations should ensure last and first frame-key are identical.
|
||||||
|
\param begin: Start frame number of the loop.
|
||||||
|
\param end: End frame number of the loop.
|
||||||
|
\return True if successful, false if not. */
|
||||||
|
//! NOTE: setMesh will also change this value and set it to the full range of animations of the mesh
|
||||||
|
bool setFrameLoop(f32 begin, f32 end);
|
||||||
|
|
||||||
|
//! Sets looping mode which is on by default. If set to false,
|
||||||
|
//! animations will not be looped.
|
||||||
|
void setLoopMode(bool playAnimationLooped);
|
||||||
|
|
||||||
|
//! returns the current loop mode
|
||||||
|
bool getLoopMode() const;
|
||||||
|
|
||||||
|
//! Will be called right after the joints have been animated,
|
||||||
|
//! but before the transforms have been propagated recursively to children.
|
||||||
|
void setOnAnimateCallback(
|
||||||
|
const std::function<void(f32 dtime)> &cb)
|
||||||
|
{
|
||||||
|
OnAnimateCallback = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Sets the speed with which the animation is played.
|
||||||
|
/** \param framesPerSecond: Frames per second played. */
|
||||||
|
void setAnimationSpeed(f32 framesPerSecond);
|
||||||
|
|
||||||
|
//! Gets the speed with which the animation is played.
|
||||||
|
/** \return Frames per second played. */
|
||||||
|
f32 getAnimationSpeed() const;
|
||||||
|
|
||||||
|
//! Returns a pointer to a child node (nullptr if not found),
|
||||||
|
//! which has the same transformation as
|
||||||
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
|
//! This can be used to attach children.
|
||||||
|
IBoneSceneNode *getJointNode(const c8 *jointName);
|
||||||
|
|
||||||
|
//! same as getJointNode(const c8* jointName), but based on id
|
||||||
|
IBoneSceneNode *getJointNode(u32 jointID);
|
||||||
|
|
||||||
|
//! Gets joint count.
|
||||||
|
u32 getJointCount() const;
|
||||||
|
|
||||||
|
//! Returns the currently displayed frame number.
|
||||||
|
f32 getFrameNr() const;
|
||||||
|
//! Returns the current start frame number.
|
||||||
|
f32 getStartFrame() const;
|
||||||
|
//! Returns the current end frame number.
|
||||||
|
f32 getEndFrame() const;
|
||||||
|
|
||||||
|
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
||||||
|
/* In this way it is possible to change the materials a mesh causing all mesh scene nodes
|
||||||
|
referencing this mesh to change too. */
|
||||||
|
void setReadOnlyMaterials(bool readonly);
|
||||||
|
|
||||||
|
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
||||||
|
bool isReadOnlyMaterials() const;
|
||||||
|
|
||||||
|
//! Sets a new mesh
|
||||||
|
void setMesh(IAnimatedMesh *mesh);
|
||||||
|
|
||||||
|
//! Returns the current mesh
|
||||||
|
IAnimatedMesh *getMesh(void) { return Mesh; }
|
||||||
|
|
||||||
|
//! updates the absolute position based on the relative and the parents position
|
||||||
|
void updateAbsolutePosition() override;
|
||||||
|
|
||||||
|
//! Sets the transition time in seconds (note: This needs to enable joints)
|
||||||
|
//! you must call animateJoints(), or the mesh will not animate
|
||||||
|
void setTransitionTime(f32 Time);
|
||||||
|
|
||||||
|
void updateJointSceneNodes(const std::vector<SkinnedMesh::SJoint::VariantTransform> &transforms);
|
||||||
|
|
||||||
|
//! Updates the joint positions of this mesh, taking into accoutn transitions
|
||||||
|
void animateJoints();
|
||||||
|
|
||||||
|
void addJoints();
|
||||||
|
|
||||||
|
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
||||||
|
void setRenderFromIdentity(bool On);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//! Get a static mesh for the current frame of this animated mesh
|
//! Get a static mesh for the current frame of this animated mesh
|
||||||
IMesh *getMeshForCurrentFrame();
|
IMesh *getMeshForCurrentFrame();
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
||||||
// This file is part of the "Irrlicht Engine".
|
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "ISceneNode.h"
|
|
||||||
#include "IBoneSceneNode.h"
|
|
||||||
#include "IAnimatedMesh.h"
|
|
||||||
|
|
||||||
namespace scene
|
|
||||||
{
|
|
||||||
class IAnimatedMeshSceneNode;
|
|
||||||
|
|
||||||
//! Scene node capable of displaying an animated mesh.
|
|
||||||
class IAnimatedMeshSceneNode : public ISceneNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
//! Constructor
|
|
||||||
IAnimatedMeshSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id,
|
|
||||||
const core::vector3df &position = core::vector3df(0, 0, 0),
|
|
||||||
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
|
||||||
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f)) :
|
|
||||||
ISceneNode(parent, mgr, id, position, rotation, scale) {}
|
|
||||||
|
|
||||||
//! Destructor
|
|
||||||
virtual ~IAnimatedMeshSceneNode() {}
|
|
||||||
|
|
||||||
//! Sets the current frame number.
|
|
||||||
/** From now on the animation is played from this frame.
|
|
||||||
\param frame: Number of the frame to let the animation be started from.
|
|
||||||
The frame number must be a valid frame number of the IMesh used by this
|
|
||||||
scene node. Set IAnimatedMesh::getMesh() for details. */
|
|
||||||
virtual void setCurrentFrame(f32 frame) = 0;
|
|
||||||
|
|
||||||
//! Sets the frame numbers between the animation is looped.
|
|
||||||
/** The default is 0 to getMaxFrameNumber() of the mesh.
|
|
||||||
Number of played frames is end-start.
|
|
||||||
It interpolates toward the last frame but stops when it is reached.
|
|
||||||
It does not interpolate back to start even when looping.
|
|
||||||
Looping animations should ensure last and first frame-key are identical.
|
|
||||||
\param begin: Start frame number of the loop.
|
|
||||||
\param end: End frame number of the loop.
|
|
||||||
\return True if successful, false if not. */
|
|
||||||
virtual bool setFrameLoop(f32 begin, f32 end) = 0;
|
|
||||||
|
|
||||||
//! Sets the speed with which the animation is played.
|
|
||||||
/** \param framesPerSecond: Frames per second played. */
|
|
||||||
virtual void setAnimationSpeed(f32 framesPerSecond) = 0;
|
|
||||||
|
|
||||||
//! Gets the speed with which the animation is played.
|
|
||||||
/** \return Frames per second played. */
|
|
||||||
virtual f32 getAnimationSpeed() const = 0;
|
|
||||||
|
|
||||||
//! Get a pointer to a joint in the mesh (if the mesh is a bone based mesh).
|
|
||||||
/** With this method it is possible to attach scene nodes to
|
|
||||||
joints for example possible to attach a weapon to the left hand
|
|
||||||
of an animated model. This example shows how:
|
|
||||||
\code
|
|
||||||
ISceneNode* hand =
|
|
||||||
yourAnimatedMeshSceneNode->getJointNode("LeftHand");
|
|
||||||
hand->addChild(weaponSceneNode);
|
|
||||||
\endcode
|
|
||||||
Please note that the joint returned by this method may not exist
|
|
||||||
before this call and the joints in the node were created by it.
|
|
||||||
\param jointName: Name of the joint.
|
|
||||||
\return Pointer to the scene node which represents the joint
|
|
||||||
with the specified name. Returns 0 if the contained mesh is not
|
|
||||||
an skinned mesh or the name of the joint could not be found. */
|
|
||||||
virtual IBoneSceneNode *getJointNode(const c8 *jointName) = 0;
|
|
||||||
|
|
||||||
//! same as getJointNode(const c8* jointName), but based on id
|
|
||||||
virtual IBoneSceneNode *getJointNode(u32 jointID) = 0;
|
|
||||||
|
|
||||||
//! Gets joint count.
|
|
||||||
/** \return Amount of joints in the mesh. */
|
|
||||||
virtual u32 getJointCount() const = 0;
|
|
||||||
|
|
||||||
//! Returns the currently displayed frame number.
|
|
||||||
virtual f32 getFrameNr() const = 0;
|
|
||||||
//! Returns the current start frame number.
|
|
||||||
virtual f32 getStartFrame() const = 0;
|
|
||||||
//! Returns the current end frame number.
|
|
||||||
virtual f32 getEndFrame() const = 0;
|
|
||||||
|
|
||||||
//! Sets looping mode which is on by default.
|
|
||||||
/** If set to false, animations will not be played looped. */
|
|
||||||
virtual void setLoopMode(bool playAnimationLooped) = 0;
|
|
||||||
|
|
||||||
//! returns the current loop mode
|
|
||||||
/** When true the animations are played looped */
|
|
||||||
virtual bool getLoopMode() const = 0;
|
|
||||||
|
|
||||||
//! Will be called right after the joints have been animated,
|
|
||||||
//! but before the transforms have been propagated recursively to children.
|
|
||||||
virtual void setOnAnimateCallback(
|
|
||||||
const std::function<void(f32 dtime)> &cb) = 0;
|
|
||||||
|
|
||||||
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
|
||||||
/** In this way it is possible to change the materials a mesh
|
|
||||||
causing all mesh scene nodes referencing this mesh to change
|
|
||||||
too. */
|
|
||||||
virtual void setReadOnlyMaterials(bool readonly) = 0;
|
|
||||||
|
|
||||||
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
|
||||||
virtual bool isReadOnlyMaterials() const = 0;
|
|
||||||
|
|
||||||
//! Sets a new mesh
|
|
||||||
virtual void setMesh(IAnimatedMesh *mesh) = 0;
|
|
||||||
|
|
||||||
//! Returns the current mesh
|
|
||||||
virtual IAnimatedMesh *getMesh() = 0;
|
|
||||||
|
|
||||||
//! Sets the transition time in seconds
|
|
||||||
/** Note: You must call animateJoints(), or the mesh will not animate. */
|
|
||||||
virtual void setTransitionTime(f32 Time) = 0;
|
|
||||||
|
|
||||||
//! animates the joints in the mesh based on the current frame.
|
|
||||||
/** Also takes in to account transitions. */
|
|
||||||
virtual void animateJoints() = 0;
|
|
||||||
|
|
||||||
//! render mesh ignoring its transformation.
|
|
||||||
/** Culling is unaffected. */
|
|
||||||
virtual void setRenderFromIdentity(bool On) = 0;
|
|
||||||
|
|
||||||
//! Creates a clone of this scene node and its children.
|
|
||||||
/** \param newParent An optional new parent.
|
|
||||||
\param newManager An optional new scene manager.
|
|
||||||
\return The newly created clone of this node. */
|
|
||||||
virtual ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace scene
|
|
||||||
@@ -10,7 +10,7 @@ namespace scene
|
|||||||
{
|
{
|
||||||
|
|
||||||
//! Interface for bones used for skeletal animation.
|
//! Interface for bones used for skeletal animation.
|
||||||
/** Used with SkinnedMesh and IAnimatedMeshSceneNode. */
|
/** Used with SkinnedMesh and AnimatedMeshSceneNode. */
|
||||||
class IBoneSceneNode : public ISceneNode
|
class IBoneSceneNode : public ISceneNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace scene
|
|||||||
set/getRotation and set/getScale. Its just a simple scene node that takes a
|
set/getRotation and set/getScale. Its just a simple scene node that takes a
|
||||||
matrix as relative transformation, making it possible to insert any transformation
|
matrix as relative transformation, making it possible to insert any transformation
|
||||||
anywhere into the scene graph.
|
anywhere into the scene graph.
|
||||||
This scene node is for example used by the IAnimatedMeshSceneNode for emulating
|
This scene node is for example used by the AnimatedMeshSceneNode for emulating
|
||||||
joint scene nodes when playing skeletal animations.
|
joint scene nodes when playing skeletal animations.
|
||||||
*/
|
*/
|
||||||
class IDummyTransformationSceneNode : public ISceneNode
|
class IDummyTransformationSceneNode : public ISceneNode
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ enum E_SCENE_NODE_RENDER_PASS
|
|||||||
};
|
};
|
||||||
|
|
||||||
class IAnimatedMesh;
|
class IAnimatedMesh;
|
||||||
class IAnimatedMeshSceneNode;
|
class AnimatedMeshSceneNode;
|
||||||
class IBillboardSceneNode;
|
class IBillboardSceneNode;
|
||||||
class ICameraSceneNode;
|
class ICameraSceneNode;
|
||||||
class IDummyTransformationSceneNode;
|
class IDummyTransformationSceneNode;
|
||||||
@@ -133,7 +133,7 @@ public:
|
|||||||
\param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
|
\param alsoAddIfMeshPointerZero: Add the scene node even if a 0 pointer is passed.
|
||||||
\return Pointer to the created scene node.
|
\return Pointer to the created scene node.
|
||||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||||
virtual IAnimatedMeshSceneNode *addAnimatedMeshSceneNode(IAnimatedMesh *mesh,
|
virtual AnimatedMeshSceneNode *addAnimatedMeshSceneNode(IAnimatedMesh *mesh,
|
||||||
ISceneNode *parent = 0, s32 id = -1,
|
ISceneNode *parent = 0, s32 id = -1,
|
||||||
const core::vector3df &position = core::vector3df(0, 0, 0),
|
const core::vector3df &position = core::vector3df(0, 0, 0),
|
||||||
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
namespace scene
|
namespace scene
|
||||||
{
|
{
|
||||||
|
|
||||||
class IAnimatedMeshSceneNode;
|
class AnimatedMeshSceneNode;
|
||||||
class IBoneSceneNode;
|
class IBoneSceneNode;
|
||||||
class ISceneManager;
|
class ISceneManager;
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ public:
|
|||||||
|
|
||||||
//! Creates an array of joints from this mesh as children of node
|
//! Creates an array of joints from this mesh as children of node
|
||||||
std::vector<IBoneSceneNode *> addJoints(
|
std::vector<IBoneSceneNode *> addJoints(
|
||||||
IAnimatedMeshSceneNode *node, ISceneManager *smgr);
|
AnimatedMeshSceneNode *node, ISceneManager *smgr);
|
||||||
|
|
||||||
//! A vertex weight
|
//! A vertex weight
|
||||||
struct SWeight
|
struct SWeight
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
// This file is part of the "Irrlicht Engine".
|
// This file is part of the "Irrlicht Engine".
|
||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||||
|
|
||||||
#include "CAnimatedMeshSceneNode.h"
|
#include "AnimatedMeshSceneNode.h"
|
||||||
#include "CBoneSceneNode.h"
|
#include "CBoneSceneNode.h"
|
||||||
|
#include "ISceneNode.h"
|
||||||
#include "IVideoDriver.h"
|
#include "IVideoDriver.h"
|
||||||
#include "ISceneManager.h"
|
#include "ISceneManager.h"
|
||||||
#include "S3DVertex.h"
|
#include "S3DVertex.h"
|
||||||
@@ -29,12 +30,12 @@ namespace scene
|
|||||||
{
|
{
|
||||||
|
|
||||||
//! constructor
|
//! constructor
|
||||||
CAnimatedMeshSceneNode::CAnimatedMeshSceneNode(IAnimatedMesh *mesh,
|
AnimatedMeshSceneNode::AnimatedMeshSceneNode(IAnimatedMesh *mesh,
|
||||||
ISceneNode *parent, ISceneManager *mgr, s32 id,
|
ISceneNode *parent, ISceneManager *mgr, s32 id,
|
||||||
const core::vector3df &position,
|
const core::vector3df &position,
|
||||||
const core::vector3df &rotation,
|
const core::vector3df &rotation,
|
||||||
const core::vector3df &scale) :
|
const core::vector3df &scale) :
|
||||||
IAnimatedMeshSceneNode(parent, mgr, id, position, rotation, scale),
|
ISceneNode(parent, mgr, id, position, rotation, scale),
|
||||||
Mesh(nullptr),
|
Mesh(nullptr),
|
||||||
StartFrame(0), EndFrame(0), FramesPerSecond(0.025f),
|
StartFrame(0), EndFrame(0), FramesPerSecond(0.025f),
|
||||||
CurrentFrameNr(0.f), LastTimeMs(0),
|
CurrentFrameNr(0.f), LastTimeMs(0),
|
||||||
@@ -47,14 +48,14 @@ CAnimatedMeshSceneNode::CAnimatedMeshSceneNode(IAnimatedMesh *mesh,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! destructor
|
//! destructor
|
||||||
CAnimatedMeshSceneNode::~CAnimatedMeshSceneNode()
|
AnimatedMeshSceneNode::~AnimatedMeshSceneNode()
|
||||||
{
|
{
|
||||||
if (Mesh)
|
if (Mesh)
|
||||||
Mesh->drop();
|
Mesh->drop();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets the current frame. From now on the animation is played from this frame.
|
//! Sets the current frame. From now on the animation is played from this frame.
|
||||||
void CAnimatedMeshSceneNode::setCurrentFrame(f32 frame)
|
void AnimatedMeshSceneNode::setCurrentFrame(f32 frame)
|
||||||
{
|
{
|
||||||
// if you pass an out of range value, we just clamp it
|
// if you pass an out of range value, we just clamp it
|
||||||
CurrentFrameNr = core::clamp(frame, (f32)StartFrame, (f32)EndFrame);
|
CurrentFrameNr = core::clamp(frame, (f32)StartFrame, (f32)EndFrame);
|
||||||
@@ -63,13 +64,13 @@ void CAnimatedMeshSceneNode::setCurrentFrame(f32 frame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the currently displayed frame number.
|
//! Returns the currently displayed frame number.
|
||||||
f32 CAnimatedMeshSceneNode::getFrameNr() const
|
f32 AnimatedMeshSceneNode::getFrameNr() const
|
||||||
{
|
{
|
||||||
return CurrentFrameNr;
|
return CurrentFrameNr;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Get CurrentFrameNr and update transiting settings
|
//! Get CurrentFrameNr and update transiting settings
|
||||||
void CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
|
void AnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
|
||||||
{
|
{
|
||||||
if (Transiting != 0.f) {
|
if (Transiting != 0.f) {
|
||||||
TransitingBlend += (f32)(timeMs)*Transiting;
|
TransitingBlend += (f32)(timeMs)*Transiting;
|
||||||
@@ -106,7 +107,7 @@ void CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::OnRegisterSceneNode()
|
void AnimatedMeshSceneNode::OnRegisterSceneNode()
|
||||||
{
|
{
|
||||||
if (IsVisible && Mesh) {
|
if (IsVisible && Mesh) {
|
||||||
// because this node supports rendering of mixed mode meshes consisting of
|
// because this node supports rendering of mixed mode meshes consisting of
|
||||||
@@ -146,7 +147,7 @@ void CAnimatedMeshSceneNode::OnRegisterSceneNode()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IMesh *CAnimatedMeshSceneNode::getMeshForCurrentFrame()
|
IMesh *AnimatedMeshSceneNode::getMeshForCurrentFrame()
|
||||||
{
|
{
|
||||||
if (Mesh->getMeshType() != EAMT_SKINNED) {
|
if (Mesh->getMeshType() != EAMT_SKINNED) {
|
||||||
return Mesh;
|
return Mesh;
|
||||||
@@ -164,7 +165,7 @@ IMesh *CAnimatedMeshSceneNode::getMeshForCurrentFrame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! OnAnimate() is called just before rendering the whole scene.
|
//! OnAnimate() is called just before rendering the whole scene.
|
||||||
void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
void AnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
||||||
{
|
{
|
||||||
if (LastTimeMs == 0) { // first frame
|
if (LastTimeMs == 0) { // first frame
|
||||||
LastTimeMs = timeMs;
|
LastTimeMs = timeMs;
|
||||||
@@ -186,7 +187,7 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
|||||||
if (OnAnimateCallback)
|
if (OnAnimateCallback)
|
||||||
OnAnimateCallback(dtimeMs / 1000.0f);
|
OnAnimateCallback(dtimeMs / 1000.0f);
|
||||||
|
|
||||||
IAnimatedMeshSceneNode::OnAnimate(timeMs);
|
ISceneNode::OnAnimate(timeMs);
|
||||||
|
|
||||||
if (auto *skinnedMesh = dynamic_cast<SkinnedMesh*>(Mesh)) {
|
if (auto *skinnedMesh = dynamic_cast<SkinnedMesh*>(Mesh)) {
|
||||||
for (u16 i = 0; i < PerJoint.SceneNodes.size(); ++i)
|
for (u16 i = 0; i < PerJoint.SceneNodes.size(); ++i)
|
||||||
@@ -200,7 +201,7 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! renders the node.
|
//! renders the node.
|
||||||
void CAnimatedMeshSceneNode::render()
|
void AnimatedMeshSceneNode::render()
|
||||||
{
|
{
|
||||||
video::IVideoDriver *driver = SceneManager->getVideoDriver();
|
video::IVideoDriver *driver = SceneManager->getVideoDriver();
|
||||||
|
|
||||||
@@ -312,20 +313,20 @@ void CAnimatedMeshSceneNode::render()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the current start frame number.
|
//! Returns the current start frame number.
|
||||||
f32 CAnimatedMeshSceneNode::getStartFrame() const
|
f32 AnimatedMeshSceneNode::getStartFrame() const
|
||||||
{
|
{
|
||||||
return StartFrame;
|
return StartFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the current start frame number.
|
//! Returns the current start frame number.
|
||||||
f32 CAnimatedMeshSceneNode::getEndFrame() const
|
f32 AnimatedMeshSceneNode::getEndFrame() const
|
||||||
{
|
{
|
||||||
return EndFrame;
|
return EndFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! sets the frames between the animation is looped.
|
//! sets the frames between the animation is looped.
|
||||||
//! the default is 0 - MaximalFrameCount of the mesh.
|
//! the default is 0 - MaximalFrameCount of the mesh.
|
||||||
bool CAnimatedMeshSceneNode::setFrameLoop(f32 begin, f32 end)
|
bool AnimatedMeshSceneNode::setFrameLoop(f32 begin, f32 end)
|
||||||
{
|
{
|
||||||
const f32 maxFrame = Mesh->getMaxFrameNumber();
|
const f32 maxFrame = Mesh->getMaxFrameNumber();
|
||||||
if (end < begin) {
|
if (end < begin) {
|
||||||
@@ -344,24 +345,24 @@ bool CAnimatedMeshSceneNode::setFrameLoop(f32 begin, f32 end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! sets the speed with witch the animation is played
|
//! sets the speed with witch the animation is played
|
||||||
void CAnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
|
void AnimatedMeshSceneNode::setAnimationSpeed(f32 framesPerSecond)
|
||||||
{
|
{
|
||||||
FramesPerSecond = framesPerSecond * 0.001f;
|
FramesPerSecond = framesPerSecond * 0.001f;
|
||||||
}
|
}
|
||||||
|
|
||||||
f32 CAnimatedMeshSceneNode::getAnimationSpeed() const
|
f32 AnimatedMeshSceneNode::getAnimationSpeed() const
|
||||||
{
|
{
|
||||||
return FramesPerSecond * 1000.f;
|
return FramesPerSecond * 1000.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns the axis aligned bounding box of this node
|
//! returns the axis aligned bounding box of this node
|
||||||
const core::aabbox3d<f32> &CAnimatedMeshSceneNode::getBoundingBox() const
|
const core::aabbox3d<f32> &AnimatedMeshSceneNode::getBoundingBox() const
|
||||||
{
|
{
|
||||||
return Box;
|
return Box;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns the material based on the zero based index i.
|
//! returns the material based on the zero based index i.
|
||||||
video::SMaterial &CAnimatedMeshSceneNode::getMaterial(u32 i)
|
video::SMaterial &AnimatedMeshSceneNode::getMaterial(u32 i)
|
||||||
{
|
{
|
||||||
if (i >= Materials.size())
|
if (i >= Materials.size())
|
||||||
return ISceneNode::getMaterial(i);
|
return ISceneNode::getMaterial(i);
|
||||||
@@ -370,14 +371,14 @@ video::SMaterial &CAnimatedMeshSceneNode::getMaterial(u32 i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! returns amount of materials used by this scene node.
|
//! returns amount of materials used by this scene node.
|
||||||
u32 CAnimatedMeshSceneNode::getMaterialCount() const
|
u32 AnimatedMeshSceneNode::getMaterialCount() const
|
||||||
{
|
{
|
||||||
return Materials.size();
|
return Materials.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns a pointer to a child node, which has the same transformation as
|
//! Returns a pointer to a child node, which has the same transformation as
|
||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
IBoneSceneNode *CAnimatedMeshSceneNode::getJointNode(const c8 *jointName)
|
IBoneSceneNode *AnimatedMeshSceneNode::getJointNode(const c8 *jointName)
|
||||||
{
|
{
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED) {
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED) {
|
||||||
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
||||||
@@ -405,7 +406,7 @@ IBoneSceneNode *CAnimatedMeshSceneNode::getJointNode(const c8 *jointName)
|
|||||||
|
|
||||||
//! Returns a pointer to a child node, which has the same transformation as
|
//! Returns a pointer to a child node, which has the same transformation as
|
||||||
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
//! the corresponding joint, if the mesh in this scene node is a skinned mesh.
|
||||||
IBoneSceneNode *CAnimatedMeshSceneNode::getJointNode(u32 jointID)
|
IBoneSceneNode *AnimatedMeshSceneNode::getJointNode(u32 jointID)
|
||||||
{
|
{
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED) {
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED) {
|
||||||
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
os::Printer::log("No mesh, or mesh not of skinned mesh type", ELL_WARNING);
|
||||||
@@ -423,7 +424,7 @@ IBoneSceneNode *CAnimatedMeshSceneNode::getJointNode(u32 jointID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Gets joint count.
|
//! Gets joint count.
|
||||||
u32 CAnimatedMeshSceneNode::getJointCount() const
|
u32 AnimatedMeshSceneNode::getJointCount() const
|
||||||
{
|
{
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -436,7 +437,7 @@ u32 CAnimatedMeshSceneNode::getJointCount() const
|
|||||||
//! Removes a child from this scene node.
|
//! Removes a child from this scene node.
|
||||||
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
//! Implemented here, to be able to remove the shadow properly, if there is one,
|
||||||
//! or to remove attached childs.
|
//! or to remove attached childs.
|
||||||
bool CAnimatedMeshSceneNode::removeChild(ISceneNode *child)
|
bool AnimatedMeshSceneNode::removeChild(ISceneNode *child)
|
||||||
{
|
{
|
||||||
if (ISceneNode::removeChild(child)) {
|
if (ISceneNode::removeChild(child)) {
|
||||||
if (JointsUsed) { // stop weird bugs caused while changing parents as the joints are being created
|
if (JointsUsed) { // stop weird bugs caused while changing parents as the joints are being created
|
||||||
@@ -455,31 +456,31 @@ bool CAnimatedMeshSceneNode::removeChild(ISceneNode *child)
|
|||||||
|
|
||||||
//! Sets looping mode which is on by default. If set to false,
|
//! Sets looping mode which is on by default. If set to false,
|
||||||
//! animations will not be looped.
|
//! animations will not be looped.
|
||||||
void CAnimatedMeshSceneNode::setLoopMode(bool playAnimationLooped)
|
void AnimatedMeshSceneNode::setLoopMode(bool playAnimationLooped)
|
||||||
{
|
{
|
||||||
Looping = playAnimationLooped;
|
Looping = playAnimationLooped;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns the current loop mode
|
//! returns the current loop mode
|
||||||
bool CAnimatedMeshSceneNode::getLoopMode() const
|
bool AnimatedMeshSceneNode::getLoopMode() const
|
||||||
{
|
{
|
||||||
return Looping;
|
return Looping;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
||||||
void CAnimatedMeshSceneNode::setReadOnlyMaterials(bool readonly)
|
void AnimatedMeshSceneNode::setReadOnlyMaterials(bool readonly)
|
||||||
{
|
{
|
||||||
ReadOnlyMaterials = readonly;
|
ReadOnlyMaterials = readonly;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
|
||||||
bool CAnimatedMeshSceneNode::isReadOnlyMaterials() const
|
bool AnimatedMeshSceneNode::isReadOnlyMaterials() const
|
||||||
{
|
{
|
||||||
return ReadOnlyMaterials;
|
return ReadOnlyMaterials;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets a new mesh
|
//! Sets a new mesh
|
||||||
void CAnimatedMeshSceneNode::setMesh(IAnimatedMesh *mesh)
|
void AnimatedMeshSceneNode::setMesh(IAnimatedMesh *mesh)
|
||||||
{
|
{
|
||||||
if (!mesh)
|
if (!mesh)
|
||||||
return; // won't set null mesh
|
return; // won't set null mesh
|
||||||
@@ -520,14 +521,14 @@ void CAnimatedMeshSceneNode::setMesh(IAnimatedMesh *mesh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! updates the absolute position based on the relative and the parents position
|
//! updates the absolute position based on the relative and the parents position
|
||||||
void CAnimatedMeshSceneNode::updateAbsolutePosition()
|
void AnimatedMeshSceneNode::updateAbsolutePosition()
|
||||||
{
|
{
|
||||||
IAnimatedMeshSceneNode::updateAbsolutePosition();
|
ISceneNode::updateAbsolutePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Sets the transition time in seconds (note: This needs to enable joints)
|
//! Sets the transition time in seconds (note: This needs to enable joints)
|
||||||
//! you must call animateJoints(), or the mesh will not animate
|
//! you must call animateJoints(), or the mesh will not animate
|
||||||
void CAnimatedMeshSceneNode::setTransitionTime(f32 time)
|
void AnimatedMeshSceneNode::setTransitionTime(f32 time)
|
||||||
{
|
{
|
||||||
const u32 ttime = (u32)core::floor32(time * 1000.0f);
|
const u32 ttime = (u32)core::floor32(time * 1000.0f);
|
||||||
if (TransitionTime == ttime)
|
if (TransitionTime == ttime)
|
||||||
@@ -536,12 +537,12 @@ void CAnimatedMeshSceneNode::setTransitionTime(f32 time)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
//! render mesh ignoring its transformation. Used with ragdolls. (culling is unaffected)
|
||||||
void CAnimatedMeshSceneNode::setRenderFromIdentity(bool enable)
|
void AnimatedMeshSceneNode::setRenderFromIdentity(bool enable)
|
||||||
{
|
{
|
||||||
RenderFromIdentity = enable;
|
RenderFromIdentity = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::addJoints()
|
void AnimatedMeshSceneNode::addJoints()
|
||||||
{
|
{
|
||||||
const auto &joints = static_cast<SkinnedMesh*>(Mesh)->getAllJoints();
|
const auto &joints = static_cast<SkinnedMesh*>(Mesh)->getAllJoints();
|
||||||
PerJoint.setN(joints.size());
|
PerJoint.setN(joints.size());
|
||||||
@@ -561,7 +562,7 @@ void CAnimatedMeshSceneNode::addJoints()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::updateJointSceneNodes(
|
void AnimatedMeshSceneNode::updateJointSceneNodes(
|
||||||
const std::vector<SkinnedMesh::SJoint::VariantTransform> &transforms)
|
const std::vector<SkinnedMesh::SJoint::VariantTransform> &transforms)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < transforms.size(); ++i) {
|
for (size_t i = 0; i < transforms.size(); ++i) {
|
||||||
@@ -578,7 +579,7 @@ void CAnimatedMeshSceneNode::updateJointSceneNodes(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! updates the joint positions of this mesh
|
//! updates the joint positions of this mesh
|
||||||
void CAnimatedMeshSceneNode::animateJoints()
|
void AnimatedMeshSceneNode::animateJoints()
|
||||||
{
|
{
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
return;
|
return;
|
||||||
@@ -603,7 +604,7 @@ void CAnimatedMeshSceneNode::animateJoints()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::checkJoints()
|
void AnimatedMeshSceneNode::checkJoints()
|
||||||
{
|
{
|
||||||
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED)
|
||||||
return;
|
return;
|
||||||
@@ -617,7 +618,7 @@ void CAnimatedMeshSceneNode::checkJoints()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::copyOldTransforms()
|
void AnimatedMeshSceneNode::copyOldTransforms()
|
||||||
{
|
{
|
||||||
for (u32 i = 0; i < PerJoint.SceneNodes.size(); ++i) {
|
for (u32 i = 0; i < PerJoint.SceneNodes.size(); ++i) {
|
||||||
if (!PerJoint.SceneNodes[i]->Matrix) {
|
if (!PerJoint.SceneNodes[i]->Matrix) {
|
||||||
@@ -628,7 +629,7 @@ void CAnimatedMeshSceneNode::copyOldTransforms()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimatedMeshSceneNode::beginTransition()
|
void AnimatedMeshSceneNode::beginTransition()
|
||||||
{
|
{
|
||||||
if (!JointsUsed)
|
if (!JointsUsed)
|
||||||
return;
|
return;
|
||||||
@@ -639,15 +640,15 @@ void CAnimatedMeshSceneNode::beginTransition()
|
|||||||
TransitingBlend = 0.f;
|
TransitingBlend = 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
ISceneNode *CAnimatedMeshSceneNode::clone(ISceneNode *newParent, ISceneManager *newManager)
|
ISceneNode *AnimatedMeshSceneNode::clone(ISceneNode *newParent, ISceneManager *newManager)
|
||||||
{
|
{
|
||||||
if (!newParent)
|
if (!newParent)
|
||||||
newParent = Parent;
|
newParent = Parent;
|
||||||
if (!newManager)
|
if (!newManager)
|
||||||
newManager = SceneManager;
|
newManager = SceneManager;
|
||||||
|
|
||||||
CAnimatedMeshSceneNode *newNode =
|
AnimatedMeshSceneNode *newNode =
|
||||||
new CAnimatedMeshSceneNode(Mesh, NULL, newManager, ID, RelativeTranslation,
|
new AnimatedMeshSceneNode(Mesh, NULL, newManager, ID, RelativeTranslation,
|
||||||
RelativeRotation, RelativeScale);
|
RelativeRotation, RelativeScale);
|
||||||
|
|
||||||
if (newParent) {
|
if (newParent) {
|
||||||
@@ -251,11 +251,10 @@ set(IRRMESHLOADER
|
|||||||
|
|
||||||
add_library(IRRMESHOBJ OBJECT
|
add_library(IRRMESHOBJ OBJECT
|
||||||
CMeshSceneNode.h
|
CMeshSceneNode.h
|
||||||
CAnimatedMeshSceneNode.h
|
|
||||||
|
|
||||||
SkinnedMesh.cpp
|
SkinnedMesh.cpp
|
||||||
CMeshSceneNode.cpp
|
CMeshSceneNode.cpp
|
||||||
CAnimatedMeshSceneNode.cpp
|
AnimatedMeshSceneNode.cpp
|
||||||
|
|
||||||
${IRRMESHLOADER}
|
${IRRMESHLOADER}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include "IImageLoader.h"
|
#include "IImageLoader.h"
|
||||||
#include "IImageWriter.h"
|
#include "IImageWriter.h"
|
||||||
#include "IMaterialRenderer.h"
|
#include "IMaterialRenderer.h"
|
||||||
#include "IAnimatedMeshSceneNode.h"
|
#include "AnimatedMeshSceneNode.h"
|
||||||
#include "CMeshManipulator.h"
|
#include "CMeshManipulator.h"
|
||||||
#include "CColorConverter.h"
|
#include "CColorConverter.h"
|
||||||
#include "IReferenceCounted.h"
|
#include "IReferenceCounted.h"
|
||||||
@@ -1244,7 +1244,7 @@ void CNullDriver::addOcclusionQuery(scene::ISceneNode *node, const scene::IMesh
|
|||||||
else if (node->getType() == scene::ESNT_MESH)
|
else if (node->getType() == scene::ESNT_MESH)
|
||||||
mesh = static_cast<scene::IMeshSceneNode *>(node)->getMesh();
|
mesh = static_cast<scene::IMeshSceneNode *>(node)->getMesh();
|
||||||
else
|
else
|
||||||
mesh = static_cast<scene::IAnimatedMeshSceneNode *>(node)->getMesh();
|
mesh = static_cast<scene::AnimatedMeshSceneNode *>(node)->getMesh();
|
||||||
if (!mesh)
|
if (!mesh)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include "CB3DMeshFileLoader.h"
|
#include "CB3DMeshFileLoader.h"
|
||||||
#include "CGLTFMeshFileLoader.h"
|
#include "CGLTFMeshFileLoader.h"
|
||||||
#include "CBillboardSceneNode.h"
|
#include "CBillboardSceneNode.h"
|
||||||
#include "CAnimatedMeshSceneNode.h"
|
#include "AnimatedMeshSceneNode.h"
|
||||||
#include "CCameraSceneNode.h"
|
#include "CCameraSceneNode.h"
|
||||||
#include "CMeshSceneNode.h"
|
#include "CMeshSceneNode.h"
|
||||||
#include "CDummyTransformationSceneNode.h"
|
#include "CDummyTransformationSceneNode.h"
|
||||||
@@ -177,7 +177,7 @@ IMeshSceneNode *CSceneManager::addMeshSceneNode(IMesh *mesh, ISceneNode *parent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! adds a scene node for rendering an animated mesh model
|
//! adds a scene node for rendering an animated mesh model
|
||||||
IAnimatedMeshSceneNode *CSceneManager::addAnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent, s32 id,
|
AnimatedMeshSceneNode *CSceneManager::addAnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent, s32 id,
|
||||||
const core::vector3df &position, const core::vector3df &rotation,
|
const core::vector3df &position, const core::vector3df &rotation,
|
||||||
const core::vector3df &scale, bool alsoAddIfMeshPointerZero)
|
const core::vector3df &scale, bool alsoAddIfMeshPointerZero)
|
||||||
{
|
{
|
||||||
@@ -187,8 +187,8 @@ IAnimatedMeshSceneNode *CSceneManager::addAnimatedMeshSceneNode(IAnimatedMesh *m
|
|||||||
if (!parent)
|
if (!parent)
|
||||||
parent = this;
|
parent = this;
|
||||||
|
|
||||||
IAnimatedMeshSceneNode *node =
|
auto *node =
|
||||||
new CAnimatedMeshSceneNode(mesh, parent, this, id, position, rotation, scale);
|
new AnimatedMeshSceneNode(mesh, parent, this, id, position, rotation, scale);
|
||||||
node->drop();
|
node->drop();
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public:
|
|||||||
video::IVideoDriver *getVideoDriver() override;
|
video::IVideoDriver *getVideoDriver() override;
|
||||||
|
|
||||||
//! adds a scene node for rendering an animated mesh model
|
//! adds a scene node for rendering an animated mesh model
|
||||||
virtual IAnimatedMeshSceneNode *addAnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent = 0, s32 id = -1,
|
virtual AnimatedMeshSceneNode *addAnimatedMeshSceneNode(IAnimatedMesh *mesh, ISceneNode *parent = 0, s32 id = -1,
|
||||||
const core::vector3df &position = core::vector3df(0, 0, 0),
|
const core::vector3df &position = core::vector3df(0, 0, 0),
|
||||||
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
const core::vector3df &rotation = core::vector3df(0, 0, 0),
|
||||||
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f),
|
const core::vector3df &scale = core::vector3df(1.0f, 1.0f, 1.0f),
|
||||||
|
|||||||
@@ -3,13 +3,9 @@
|
|||||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||||
|
|
||||||
#include "SkinnedMesh.h"
|
#include "SkinnedMesh.h"
|
||||||
#include "IBoneSceneNode.h"
|
|
||||||
#include "CBoneSceneNode.h"
|
|
||||||
#include "IAnimatedMeshSceneNode.h"
|
|
||||||
#include "SSkinMeshBuffer.h"
|
#include "SSkinMeshBuffer.h"
|
||||||
#include "Transform.h"
|
#include "Transform.h"
|
||||||
#include "aabbox3d.h"
|
#include "aabbox3d.h"
|
||||||
#include "irrMath.h"
|
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ struct ItemStack;
|
|||||||
|
|
||||||
namespace scene
|
namespace scene
|
||||||
{
|
{
|
||||||
class IAnimatedMeshSceneNode;
|
class AnimatedMeshSceneNode;
|
||||||
class ISceneNode;
|
class ISceneNode;
|
||||||
class ISceneManager;
|
class ISceneManager;
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,7 @@ public:
|
|||||||
virtual const v3f getVelocity() const { return v3f(0.0f); } // in BS-space
|
virtual const v3f getVelocity() const { return v3f(0.0f); } // in BS-space
|
||||||
virtual scene::ISceneNode *getSceneNode() const
|
virtual scene::ISceneNode *getSceneNode() const
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode() const
|
virtual scene::AnimatedMeshSceneNode *getAnimatedMeshSceneNode() const
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
virtual bool isLocalPlayer() const { return false; }
|
virtual bool isLocalPlayer() const { return false; }
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include <IBillboardSceneNode.h>
|
#include <IBillboardSceneNode.h>
|
||||||
#include <ICameraSceneNode.h>
|
#include <ICameraSceneNode.h>
|
||||||
#include <IMeshManipulator.h>
|
#include <IMeshManipulator.h>
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include <ISceneNode.h>
|
#include <ISceneNode.h>
|
||||||
#include "client/client.h"
|
#include "client/client.h"
|
||||||
#include "client/renderingengine.h"
|
#include "client/renderingengine.h"
|
||||||
@@ -400,7 +400,7 @@ scene::ISceneNode *GenericCAO::getSceneNode() const
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
scene::IAnimatedMeshSceneNode *GenericCAO::getAnimatedMeshSceneNode() const
|
scene::AnimatedMeshSceneNode *GenericCAO::getAnimatedMeshSceneNode() const
|
||||||
{
|
{
|
||||||
return m_animated_meshnode;
|
return m_animated_meshnode;
|
||||||
}
|
}
|
||||||
@@ -1437,7 +1437,7 @@ void GenericCAO::updateAttachments()
|
|||||||
{
|
{
|
||||||
parent->updateAttachments();
|
parent->updateAttachments();
|
||||||
scene::ISceneNode *parent_node = parent->getSceneNode();
|
scene::ISceneNode *parent_node = parent->getSceneNode();
|
||||||
scene::IAnimatedMeshSceneNode *parent_animated_mesh_node =
|
scene::AnimatedMeshSceneNode *parent_animated_mesh_node =
|
||||||
parent->getAnimatedMeshSceneNode();
|
parent->getAnimatedMeshSceneNode();
|
||||||
if (parent_animated_mesh_node && !m_attachment_bone.empty()) {
|
if (parent_animated_mesh_node && !m_attachment_bone.empty()) {
|
||||||
parent_node = parent_animated_mesh_node->getJointNode(m_attachment_bone.c_str());
|
parent_node = parent_animated_mesh_node->getJointNode(m_attachment_bone.c_str());
|
||||||
|
|||||||
@@ -14,12 +14,12 @@
|
|||||||
#include "itemgroup.h"
|
#include "itemgroup.h"
|
||||||
#include "client/tile.h"
|
#include "client/tile.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace scene {
|
namespace scene {
|
||||||
class IMeshSceneNode;
|
class IMeshSceneNode;
|
||||||
class IBillboardSceneNode;
|
class IBillboardSceneNode;
|
||||||
|
class AnimatedMeshSceneNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Client;
|
class Client;
|
||||||
@@ -89,7 +89,7 @@ private:
|
|||||||
|
|
||||||
// Visuals
|
// Visuals
|
||||||
scene::IMeshSceneNode *m_meshnode = nullptr;
|
scene::IMeshSceneNode *m_meshnode = nullptr;
|
||||||
scene::IAnimatedMeshSceneNode *m_animated_meshnode = nullptr;
|
scene::AnimatedMeshSceneNode *m_animated_meshnode = nullptr;
|
||||||
WieldMeshSceneNode *m_wield_meshnode = nullptr;
|
WieldMeshSceneNode *m_wield_meshnode = nullptr;
|
||||||
scene::IBillboardSceneNode *m_spritenode = nullptr;
|
scene::IBillboardSceneNode *m_spritenode = nullptr;
|
||||||
scene::IDummyTransformationSceneNode *m_matrixnode = nullptr;
|
scene::IDummyTransformationSceneNode *m_matrixnode = nullptr;
|
||||||
@@ -191,7 +191,7 @@ public:
|
|||||||
|
|
||||||
scene::ISceneNode *getSceneNode() const override;
|
scene::ISceneNode *getSceneNode() const override;
|
||||||
|
|
||||||
scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode() const override;
|
scene::AnimatedMeshSceneNode *getAnimatedMeshSceneNode() const override;
|
||||||
|
|
||||||
// m_matrixnode controls the position and rotation of the child node
|
// m_matrixnode controls the position and rotation of the child node
|
||||||
// for all scene nodes, as a workaround for an Irrlicht problem with
|
// for all scene nodes, as a workaround for an Irrlicht problem with
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "script/scripting_client.h"
|
#include "script/scripting_client.h"
|
||||||
#include "hud.h"
|
#include "hud.h"
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include "util/tracy_wrapper.h"
|
#include "util/tracy_wrapper.h"
|
||||||
#include "item_visuals_manager.h"
|
#include "item_visuals_manager.h"
|
||||||
|
|
||||||
@@ -2226,7 +2226,7 @@ static void pauseNodeAnimation(PausedNodesList &paused, scene::ISceneNode *node)
|
|||||||
pauseNodeAnimation(paused, child);
|
pauseNodeAnimation(paused, child);
|
||||||
if (node->getType() != scene::ESNT_ANIMATED_MESH)
|
if (node->getType() != scene::ESNT_ANIMATED_MESH)
|
||||||
return;
|
return;
|
||||||
auto animated_node = static_cast<scene::IAnimatedMeshSceneNode *>(node);
|
auto animated_node = static_cast<scene::AnimatedMeshSceneNode *>(node);
|
||||||
float speed = animated_node->getAnimationSpeed();
|
float speed = animated_node->getAnimationSpeed();
|
||||||
if (!speed)
|
if (!speed)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
|
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
@@ -83,7 +83,7 @@ struct ClientEventHandler
|
|||||||
void (Game::*handler)(ClientEvent *, CameraOrientation *);
|
void (Game::*handler)(ClientEvent *, CameraOrientation *);
|
||||||
};
|
};
|
||||||
|
|
||||||
using PausedNodesList = std::vector<std::pair<irr_ptr<scene::IAnimatedMeshSceneNode>, float>>;
|
using PausedNodesList = std::vector<std::pair<irr_ptr<scene::AnimatedMeshSceneNode>, float>>;
|
||||||
|
|
||||||
/* This is not intended to be a public class. If a public class becomes
|
/* This is not intended to be a public class. If a public class becomes
|
||||||
* desirable then it may be better to create another 'wrapper' class that
|
* desirable then it may be better to create another 'wrapper' class that
|
||||||
|
|||||||
@@ -8,9 +8,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <iostream>
|
|
||||||
#include <IAnimatedMesh.h>
|
#include <IAnimatedMesh.h>
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
|
||||||
#include "S3DVertex.h"
|
#include "S3DVertex.h"
|
||||||
#include <SMesh.h>
|
#include <SMesh.h>
|
||||||
#include "CMeshBuffer.h"
|
#include "CMeshBuffer.h"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <IGUIFont.h>
|
#include <IGUIFont.h>
|
||||||
#include <IGUITabControl.h>
|
#include <IGUITabControl.h>
|
||||||
#include <IGUIImage.h>
|
#include <IGUIImage.h>
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include "client/renderingengine.h"
|
#include "client/renderingengine.h"
|
||||||
#include "client/joystick_controller.h"
|
#include "client/joystick_controller.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "guiScene.h"
|
#include "guiScene.h"
|
||||||
|
|
||||||
#include <SViewFrustum.h>
|
#include <SViewFrustum.h>
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include <IVideoDriver.h>
|
#include <IVideoDriver.h>
|
||||||
#include <ISceneManager.h>
|
#include <ISceneManager.h>
|
||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
@@ -29,7 +29,7 @@ GUIScene::~GUIScene()
|
|||||||
m_smgr->drop();
|
m_smgr->drop();
|
||||||
}
|
}
|
||||||
|
|
||||||
scene::IAnimatedMeshSceneNode *GUIScene::setMesh(scene::IAnimatedMesh *mesh)
|
scene::AnimatedMeshSceneNode *GUIScene::setMesh(scene::IAnimatedMesh *mesh)
|
||||||
{
|
{
|
||||||
if (m_mesh) {
|
if (m_mesh) {
|
||||||
m_mesh->remove();
|
m_mesh->remove();
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "ICameraSceneNode.h"
|
#include "ICameraSceneNode.h"
|
||||||
#include "StyleSpec.h"
|
#include "StyleSpec.h"
|
||||||
#include <IAnimatedMeshSceneNode.h>
|
#include <AnimatedMeshSceneNode.h>
|
||||||
#include <IGUIElement.h>
|
#include <IGUIElement.h>
|
||||||
#include <IGUIEnvironment.h>
|
#include <IGUIEnvironment.h>
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ public:
|
|||||||
|
|
||||||
~GUIScene();
|
~GUIScene();
|
||||||
|
|
||||||
scene::IAnimatedMeshSceneNode *setMesh(scene::IAnimatedMesh *mesh = nullptr);
|
scene::AnimatedMeshSceneNode *setMesh(scene::IAnimatedMesh *mesh = nullptr);
|
||||||
void setTexture(u32 idx, video::ITexture *texture);
|
void setTexture(u32 idx, video::ITexture *texture);
|
||||||
void setBackgroundColor(const video::SColor &color) noexcept { m_bgcolor = color; };
|
void setBackgroundColor(const video::SColor &color) noexcept { m_bgcolor = color; };
|
||||||
void setFrameLoop(f32 begin, f32 end);
|
void setFrameLoop(f32 begin, f32 end);
|
||||||
@@ -49,7 +49,7 @@ private:
|
|||||||
video::IVideoDriver *m_driver;
|
video::IVideoDriver *m_driver;
|
||||||
scene::ICameraSceneNode *m_cam;
|
scene::ICameraSceneNode *m_cam;
|
||||||
scene::ISceneNode *m_target = nullptr;
|
scene::ISceneNode *m_target = nullptr;
|
||||||
scene::IAnimatedMeshSceneNode *m_mesh = nullptr;
|
scene::AnimatedMeshSceneNode *m_mesh = nullptr;
|
||||||
|
|
||||||
f32 m_cam_distance = 50.f;
|
f32 m_cam_distance = 50.f;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user