mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-13 15:16:28 +00:00
Added support for loading and rendering skeletons, added character editor
This commit is contained in:
64
src/Core/Scene/CCharacterNode.cpp
Normal file
64
src/Core/Scene/CCharacterNode.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "CCharacterNode.h"
|
||||
#include <Core/Render/CRenderer.h>
|
||||
|
||||
CCharacterNode::CCharacterNode(CScene *pScene, u32 NodeID, CAnimSet *pChar /*= 0*/, CSceneNode *pParent /*= 0*/)
|
||||
: CSceneNode(pScene, NodeID, pParent)
|
||||
{
|
||||
SetCharacter(pChar);
|
||||
}
|
||||
|
||||
ENodeType CCharacterNode::NodeType()
|
||||
{
|
||||
return eCharacterNode;
|
||||
}
|
||||
|
||||
void CCharacterNode::PostLoad()
|
||||
{
|
||||
if (mpCharacter)
|
||||
{
|
||||
for (u32 iChar = 0; iChar < mpCharacter->NumNodes(); iChar++)
|
||||
mpCharacter->NodeModel(iChar)->BufferGL();
|
||||
}
|
||||
}
|
||||
|
||||
void CCharacterNode::AddToRenderer(CRenderer *pRenderer, const SViewInfo& /*rkViewInfo*/)
|
||||
{
|
||||
if (!mpCharacter) return;
|
||||
|
||||
if (mpCharacter->NodeSkeleton(mActiveCharSet))
|
||||
{
|
||||
pRenderer->AddOpaqueMesh(this, 0, AABox(), eDrawMesh);
|
||||
}
|
||||
}
|
||||
|
||||
void CCharacterNode::Draw(FRenderOptions Options, int /*ComponentIndex*/, const SViewInfo& /*rkViewInfo*/)
|
||||
{
|
||||
CSkeleton *pSkel = mpCharacter->NodeSkeleton(mActiveCharSet);
|
||||
pSkel->Draw(Options);
|
||||
}
|
||||
|
||||
SRayIntersection CCharacterNode::RayNodeIntersectTest(const CRay& /*rkRay*/, u32 /*AssetID*/, const SViewInfo& /*rkViewInfo*/)
|
||||
{
|
||||
// Not currently doing any ray checks on character nodes so don't care about this right now.
|
||||
return SRayIntersection();
|
||||
}
|
||||
|
||||
void CCharacterNode::SetCharacter(CAnimSet *pChar)
|
||||
{
|
||||
mpCharacter = pChar;
|
||||
SetActiveCharSet(0);
|
||||
|
||||
if (!mpCharacter)
|
||||
mLocalAABox = CAABox::skOne;
|
||||
}
|
||||
|
||||
void CCharacterNode::SetActiveCharSet(u32 CharIndex)
|
||||
{
|
||||
mActiveCharSet = CharIndex;
|
||||
|
||||
if (mpCharacter)
|
||||
{
|
||||
mLocalAABox = mpCharacter->NodeModel(CharIndex)->AABox();
|
||||
MarkTransformChanged();
|
||||
}
|
||||
}
|
||||
27
src/Core/Scene/CCharacterNode.h
Normal file
27
src/Core/Scene/CCharacterNode.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef CCHARACTERNODE_H
|
||||
#define CCHARACTERNODE_H
|
||||
|
||||
#include "CSceneNode.h"
|
||||
#include "Core/Resource/CAnimSet.h"
|
||||
|
||||
class CCharacterNode : public CSceneNode
|
||||
{
|
||||
TResPtr<CAnimSet> mpCharacter;
|
||||
u32 mActiveCharSet;
|
||||
|
||||
public:
|
||||
explicit CCharacterNode(CScene *pScene, u32 NodeID, CAnimSet *pChar = 0, CSceneNode *pParent = 0);
|
||||
|
||||
virtual ENodeType NodeType();
|
||||
virtual void PostLoad();
|
||||
virtual void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo);
|
||||
virtual void Draw(FRenderOptions Options, int ComponentIndex, const SViewInfo& rkViewInfo);
|
||||
virtual SRayIntersection RayNodeIntersectTest(const CRay& rkRay, u32 AssetID, const SViewInfo& rkViewInfo);
|
||||
inline CAnimSet* Character() const { return mpCharacter; }
|
||||
inline u32 ActiveCharSet() const { return mActiveCharSet; }
|
||||
|
||||
void SetCharacter(CAnimSet *pChar);
|
||||
void SetActiveCharSet(u32 CharIndex);
|
||||
};
|
||||
|
||||
#endif // CCHARACTERNODE_H
|
||||
@@ -7,12 +7,13 @@ enum ENodeType
|
||||
{
|
||||
eRootNode = 0x0,
|
||||
eModelNode = 0x1,
|
||||
eStaticNode = 0x2,
|
||||
eCollisionNode = 0x4,
|
||||
eScriptNode = 0x8,
|
||||
eScriptExtraNode = 0x10,
|
||||
eLightNode = 0x20,
|
||||
eAllNodeTypes = 0x3F
|
||||
eCharacterNode = 0x2,
|
||||
eStaticNode = 0x4,
|
||||
eCollisionNode = 0x8,
|
||||
eScriptNode = 0x10,
|
||||
eScriptExtraNode = 0x20,
|
||||
eLightNode = 0x40,
|
||||
eAllNodeTypes = 0x7F
|
||||
};
|
||||
|
||||
DECLARE_FLAGS(ENodeType, FNodeFlags)
|
||||
|
||||
Reference in New Issue
Block a user