|
@@ -9,6 +9,7 @@
|
|
|
#include "BsRenderQueue.h"
|
|
#include "BsRenderQueue.h"
|
|
|
#include "BsBounds.h"
|
|
#include "BsBounds.h"
|
|
|
#include "BsRenderer.h"
|
|
#include "BsRenderer.h"
|
|
|
|
|
+#include "BsAnimation.h"
|
|
|
#include "BsFrameAlloc.h"
|
|
#include "BsFrameAlloc.h"
|
|
|
#include "BsDebug.h"
|
|
#include "BsDebug.h"
|
|
|
|
|
|
|
@@ -47,6 +48,8 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
mMaterials.resize(numSubMeshes);
|
|
mMaterials.resize(numSubMeshes);
|
|
|
|
|
|
|
|
|
|
+ onMeshChanged();
|
|
|
|
|
+
|
|
|
_markDependenciesDirty();
|
|
_markDependenciesDirty();
|
|
|
_markResourcesDirty();
|
|
_markResourcesDirty();
|
|
|
_markCoreDirty();
|
|
_markCoreDirty();
|
|
@@ -124,7 +127,7 @@ namespace BansheeEngine
|
|
|
template class TRenderable < true >;
|
|
template class TRenderable < true >;
|
|
|
|
|
|
|
|
RenderableCore::RenderableCore()
|
|
RenderableCore::RenderableCore()
|
|
|
- :mRendererId(0)
|
|
|
|
|
|
|
+ :mRendererId(0), mAnimationId((UINT64)-1)
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -179,6 +182,7 @@ namespace BansheeEngine
|
|
|
dataPtr = rttiReadElem(mTransformNoScale, dataPtr);
|
|
dataPtr = rttiReadElem(mTransformNoScale, dataPtr);
|
|
|
dataPtr = rttiReadElem(mPosition, dataPtr);
|
|
dataPtr = rttiReadElem(mPosition, dataPtr);
|
|
|
dataPtr = rttiReadElem(mIsActive, dataPtr);
|
|
dataPtr = rttiReadElem(mIsActive, dataPtr);
|
|
|
|
|
+ dataPtr = rttiReadElem(mAnimationId, dataPtr);
|
|
|
dataPtr = rttiReadElem(dirtyFlags, dataPtr);
|
|
dataPtr = rttiReadElem(dirtyFlags, dataPtr);
|
|
|
|
|
|
|
|
SPtr<MeshCore>* mesh = (SPtr<MeshCore>*)dataPtr;
|
|
SPtr<MeshCore>* mesh = (SPtr<MeshCore>*)dataPtr;
|
|
@@ -222,6 +226,16 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void Renderable::setAnimation(const SPtr<Animation>& animation)
|
|
|
|
|
+ {
|
|
|
|
|
+ mAnimation = animation;
|
|
|
|
|
+
|
|
|
|
|
+ if (mAnimation != nullptr && mMesh.isLoaded(false))
|
|
|
|
|
+ mAnimation->setSkeleton(mMesh->getSkeleton());
|
|
|
|
|
+
|
|
|
|
|
+ _markCoreDirty();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Bounds Renderable::getBounds() const
|
|
Bounds Renderable::getBounds() const
|
|
|
{
|
|
{
|
|
|
HMesh mesh = getMesh();
|
|
HMesh mesh = getMesh();
|
|
@@ -256,6 +270,17 @@ namespace BansheeEngine
|
|
|
return handlerPtr;
|
|
return handlerPtr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ void Renderable::onMeshChanged()
|
|
|
|
|
+ {
|
|
|
|
|
+ if(mAnimation != nullptr)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (mMesh.isLoaded(false))
|
|
|
|
|
+ mAnimation->setSkeleton(mMesh->getSkeleton());
|
|
|
|
|
+ else
|
|
|
|
|
+ mAnimation->setSkeleton(nullptr);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
void Renderable::_markCoreDirty(RenderableDirtyFlag flag)
|
|
void Renderable::_markCoreDirty(RenderableDirtyFlag flag)
|
|
|
{
|
|
{
|
|
|
markCoreDirty((UINT32)flag);
|
|
markCoreDirty((UINT32)flag);
|
|
@@ -275,6 +300,12 @@ namespace BansheeEngine
|
|
|
{
|
|
{
|
|
|
UINT32 numMaterials = (UINT32)mMaterials.size();
|
|
UINT32 numMaterials = (UINT32)mMaterials.size();
|
|
|
|
|
|
|
|
|
|
+ UINT64 animationId;
|
|
|
|
|
+ if (mAnimation != nullptr)
|
|
|
|
|
+ animationId = mAnimation->_getId();
|
|
|
|
|
+ else
|
|
|
|
|
+ animationId = (UINT64)-1;
|
|
|
|
|
+
|
|
|
UINT32 size = rttiGetElemSize(mLayer) +
|
|
UINT32 size = rttiGetElemSize(mLayer) +
|
|
|
rttiGetElemSize(mWorldBounds) +
|
|
rttiGetElemSize(mWorldBounds) +
|
|
|
rttiGetElemSize(numMaterials) +
|
|
rttiGetElemSize(numMaterials) +
|
|
@@ -282,6 +313,7 @@ namespace BansheeEngine
|
|
|
rttiGetElemSize(mTransformNoScale) +
|
|
rttiGetElemSize(mTransformNoScale) +
|
|
|
rttiGetElemSize(mPosition) +
|
|
rttiGetElemSize(mPosition) +
|
|
|
rttiGetElemSize(mIsActive) +
|
|
rttiGetElemSize(mIsActive) +
|
|
|
|
|
+ rttiGetElemSize(animationId) +
|
|
|
rttiGetElemSize(getCoreDirtyFlags()) +
|
|
rttiGetElemSize(getCoreDirtyFlags()) +
|
|
|
sizeof(SPtr<MeshCore>) +
|
|
sizeof(SPtr<MeshCore>) +
|
|
|
numMaterials * sizeof(SPtr<MaterialCore>);
|
|
numMaterials * sizeof(SPtr<MaterialCore>);
|
|
@@ -295,6 +327,7 @@ namespace BansheeEngine
|
|
|
dataPtr = rttiWriteElem(mTransformNoScale, dataPtr);
|
|
dataPtr = rttiWriteElem(mTransformNoScale, dataPtr);
|
|
|
dataPtr = rttiWriteElem(mPosition, dataPtr);
|
|
dataPtr = rttiWriteElem(mPosition, dataPtr);
|
|
|
dataPtr = rttiWriteElem(mIsActive, dataPtr);
|
|
dataPtr = rttiWriteElem(mIsActive, dataPtr);
|
|
|
|
|
+ dataPtr = rttiWriteElem(animationId, dataPtr);
|
|
|
dataPtr = rttiWriteElem(getCoreDirtyFlags(), dataPtr);
|
|
dataPtr = rttiWriteElem(getCoreDirtyFlags(), dataPtr);
|
|
|
|
|
|
|
|
SPtr<MeshCore>* mesh = new (dataPtr) SPtr<MeshCore>();
|
|
SPtr<MeshCore>* mesh = new (dataPtr) SPtr<MeshCore>();
|