示例#1
0
void MeshSkin::clearJoints()
{
    setRootJoint(NULL);

    for (size_t i = 0, count = _joints.size(); i < count; ++i)
    {
        SAFE_RELEASE(_joints[i]);
    }
    _joints.clear();
}
void C3DMeshSkin::copyFrom(C3DMeshSkin* skin, C3DNode::CloneContext& context)
{
	
    _bindShape = skin->_bindShape;
    
    std::map<const C3DNode*, C3DNode*>::iterator it = context.cloneMap.find(skin->_rootJoint);
    C3DBone* rootbone = NULL;
    if (it == context.cloneMap.end())
        rootbone = (C3DBone*)skin->_rootJoint->clone(context);
    else
        rootbone = (C3DBone*)it->second;
    
    setJointCount(skin->getJointCount());
    setRootJoint(rootbone);
    
    size_t i;
    for (i = 0; i < skin->_joints.size(); i++) 
	{
        std::string strid = skin->_joints[i]->getId();
      //  strid += context.idSuffix;
        
       //C3DBone* bone = (strid == rootbone->getId() ? rootbone : (C3DBone*)rootbone->findNode(strid.c_str()));
		//C3DBone* bone = (C3DBone*)context.cloneMap[skin->_joints[i]];

		///....		
			std::map<const C3DNode*, C3DNode*>::iterator itr = context.cloneMap.find(skin->_joints[i]);

            C3DBone* bone = NULL;
			if (itr != context.cloneMap.end())
			{
                bone = static_cast<C3DBone*>(itr->second);
			}
			else
			{
				C3DBone* newNode = static_cast<C3DBone*>(skin->_joints[i]->clone(context));
				if (newNode)
				{
					context.cloneMap[skin->_joints[i]] = newNode;
                    bone = newNode;
				}
			}
		//.....

        setJoint(bone, i);
        //bone->release();
    }
    
    
    for (i = 0; i < skin->_partCount; i++) {
        addPart(skin->_parts[i]->_batchID, skin->_parts[i]->_offsetVertexIndex, skin->_parts[i]->_numVertexIndex);
        _parts[i]->setIndexData(&skin->_parts[i]->_indices[0], skin->_parts[i]->_indices.size());
    }
    setBonePartIndex(skin->getBonePartIndex());
    
}