mirror of https://github.com/axmolengine/axmol.git
worldmat cache in bone
This commit is contained in:
parent
32ba5f2873
commit
87c7e2b0e9
|
@ -51,6 +51,45 @@ bool Bundle3D::load(const std::string& path)
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* load mesh data from bundle
|
||||
* @param id The ID of the mesh, load the first Mesh in the bundle if it is empty
|
||||
*/
|
||||
bool Bundle3D::loadMeshData(const std::string& id, MeshData* meshdata)
|
||||
{
|
||||
//meshdata->vertex;
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
/**
|
||||
* load skin data from bundle
|
||||
* @param id The ID of the skin, load the first Skin in the bundle if it is empty
|
||||
*/
|
||||
bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
/**
|
||||
* load material data from bundle
|
||||
* @param id The ID of the material, load the first Material in the bundle if it is empty
|
||||
*/
|
||||
bool Bundle3D::loadMaterialData(const std::string& id, MaterialData* materialdata)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* load material data from bundle
|
||||
* @param id The ID of the animation, load the first animation in the bundle if it is empty
|
||||
*/
|
||||
bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animationdata)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Bundle3D::Bundle3D()
|
||||
{
|
||||
|
||||
|
|
|
@ -45,6 +45,18 @@ const Mat4& Bone::getInverseBindPose()
|
|||
return _bindPose;
|
||||
}
|
||||
|
||||
bool Bone::needUpdateWorldMat() const
|
||||
{
|
||||
bool needupdate = _worldDirty;
|
||||
auto bone = _parent;
|
||||
while (!needupdate && bone) {
|
||||
needupdate = bone->_worldDirty;
|
||||
bone = bone->_parent;
|
||||
}
|
||||
|
||||
return needupdate;
|
||||
}
|
||||
|
||||
//update own world matrix and children's
|
||||
void Bone::updateWorldMat()
|
||||
{
|
||||
|
@ -56,11 +68,17 @@ void Bone::updateWorldMat()
|
|||
|
||||
const Mat4& Bone::getWorldMat()
|
||||
{
|
||||
if (_parent)
|
||||
if (needUpdateWorldMat())
|
||||
{
|
||||
updateLocalMat();
|
||||
_world = _parent->getWorldMat() * _local;
|
||||
if (_parent)
|
||||
{
|
||||
updateLocalMat();
|
||||
_world = _parent->getWorldMat() * _local;
|
||||
}
|
||||
else
|
||||
_world = _local;
|
||||
}
|
||||
|
||||
return _world;
|
||||
}
|
||||
|
||||
|
@ -165,6 +183,7 @@ Bone::Bone(const std::string& id)
|
|||
: _name(id)
|
||||
, _parent(nullptr)
|
||||
, _dirtyFlag(0)
|
||||
, _worldDirty(true)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -50,6 +50,8 @@ public:
|
|||
*/
|
||||
const Mat4& getInverseBindPose();
|
||||
|
||||
bool needUpdateWorldMat() const;
|
||||
|
||||
//update own world matrix and children's
|
||||
void updateWorldMat();
|
||||
|
||||
|
@ -138,6 +140,7 @@ protected:
|
|||
Vector<Bone*> _children;
|
||||
|
||||
int _dirtyFlag;
|
||||
bool _worldDirty;
|
||||
Mat4 _world;
|
||||
Mat4 _local;
|
||||
Vec3 _localTranslate;
|
||||
|
|
|
@ -141,10 +141,25 @@ bool Sprite3D::loadFromC3x(const std::string& path)
|
|||
{
|
||||
//load from .c3b or .c3t
|
||||
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path);
|
||||
if (!Bundle3D::getInstance()->load(fullPath))
|
||||
auto bundle = Bundle3D::getInstance();
|
||||
if (!bundle->load(fullPath))
|
||||
return false;
|
||||
|
||||
//Bundle3D::getInstance()->loadMeshData(<#const std::string &id#>, <#cocos2d::Bundle3D::MeshData *meshdata#>)
|
||||
Bundle3D::MeshData meshdata;
|
||||
bool ret = bundle->loadMeshData("", &meshdata);
|
||||
if (!ret)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_mesh = Mesh::create(meshdata.vertex, meshdata.vertexSizeInFloat, meshdata.indices, meshdata.numIndex, meshdata.attribs, meshdata.attribCount);
|
||||
_mesh->retain();
|
||||
|
||||
Bundle3D::SkinData skindata;
|
||||
ret = bundle->loadSkinData("", &skindata);
|
||||
|
||||
Bundle3D::MaterialData materialdata;
|
||||
ret = bundle->loadMaterialData("", &materialdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue