Added support for loading and rendering skeletons, added character editor

This commit is contained in:
parax0
2016-04-05 17:26:16 -06:00
parent f9a2d019e1
commit 2376a36f0b
21 changed files with 626 additions and 18 deletions

View 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();
}
}

View 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

View File

@@ -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)