From 74fdb495bc99e06a248f974d226508060c7794e2 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Wed, 30 Mar 2022 21:20:02 +0300 Subject: [PATCH] cloning fixes and improvements --- node.cpp | 18 ++++++++++++------ nodeTest.cpp | 22 +++++++++++++++------- skeleton.cpp | 2 +- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/node.cpp b/node.cpp index 27d6a00..aecc973 100755 --- a/node.cpp +++ b/node.cpp @@ -76,7 +76,13 @@ namespace vb01{ for(int i = 0; i < numDescendants; i++){ Node *original = originalDescendants[i]; - Node *clone = new Node(original->getPosition(), original->getOrientation(), original->getScale(), original->getName()); + Bone *originalBone = dynamic_cast(original); + Node *clone = nullptr; + + if(originalBone) + clone = new Bone(originalBone->getName(), originalBone->getLength(), originalBone->getPosition(), originalBone->getOrientation(), originalBone->getScale()); + else + clone = new Node(original->getPosition(), original->getOrientation(), original->getScale(), original->getName()); for(int j = 0; j < i; j++) if(original->getParent() == originalDescendants[j]){ @@ -96,7 +102,7 @@ namespace vb01{ for(Bone *bone : skel->getBones()) for(int j = 0; j < numDescendants; j++) if(bone == originalDescendants[j]){ - sk->addBone((Bone*)clonedDescendants[j], nullptr); + sk->addBone(dynamic_cast(clonedDescendants[j]), nullptr); break; } @@ -106,12 +112,12 @@ namespace vb01{ for(Mesh *mesh : original->getMeshes()){ Mesh *m = new Mesh(MeshData(mesh->getMeshBase())); - if(mesh->getSkeleton()) + if(mesh->getMeshBase().fullSkeletonName != "") for(int j = 0; j < numDescendants; j++) for(int k = 0; k < clonedDescendants[j]->getNumSkeletons(); k++) if( clonedDescendants[j]->getName() == originalDescendants[j]->getName() && - clonedDescendants[j]->getSkeleton(k)->getAttachableName() == mesh->getSkeleton()->getAttachableName() + clonedDescendants[j]->getSkeleton(k)->getAttachableName() == mesh->getMeshBase().fullSkeletonName ){ m->setSkeleton(clonedDescendants[j]->getSkeleton(k)); break; @@ -119,7 +125,6 @@ namespace vb01{ clonedDescendants[i]->attachMesh(m); } - } for(int i = 0; i < numDescendants; i++){ @@ -134,7 +139,7 @@ namespace vb01{ for(int k = 0; k < originalDescendants[j]->getNumMeshes(); k++){ for(int l = 0; l < originalDescendants[j]->getMesh(k)->getMeshBase().numShapeKeys; l++) - if(originalDescendants[j]->getMesh(k)->getShapeKey(l) == driver->getAnimatable()){ + if(originalDescendants[j]->getMesh(k)->getShapeKey(l)->name == driver->getAnimatable()->getName()){ animatable = clonedDescendants[j]->getMesh(k)->getShapeKey(l); break; } @@ -215,6 +220,7 @@ namespace vb01{ } void Node::addSkeleton(Skeleton *skeleton){ + skeleton->onAttached(this); skeletons.push_back(skeleton); } diff --git a/nodeTest.cpp b/nodeTest.cpp index 8d507dc..9e4fa35 100644 --- a/nodeTest.cpp +++ b/nodeTest.cpp @@ -88,7 +88,7 @@ namespace vb01{ Mesh *mesh = new Mesh(MeshData(nullptr, nullptr, 0, "", nullptr, 0, "", new MeshData::ShapeKey[numKeys], numKeys)); originalD->attachMesh(mesh); - Driver *driver = new Driver(mesh->getShapeKey(0), channel, Driver::POS_X); + Driver *driver = new Driver(&mesh->getMeshBase().shapeKeys[0], channel, Driver::POS_X); originalB->addDriver(driver); Node *clonedA = originalA->clone(); @@ -113,23 +113,31 @@ namespace vb01{ void NodeTest::testClonedSkeletons(){ Skeleton *skeleton = new Skeleton(); - skeleton->addBone((Bone*)originalC, (Bone*)originalC->getParent()); - skeleton->addBone((Bone*)originalD, (Bone*)originalD->getParent()); + originalC->dettachChild(originalD); + originalA->dettachChild(originalC); + originalC = new Bone(originalC->getName(), .25); + originalD = new Bone(originalD->getName(), .5); + originalC->attachChild(originalD); + originalA->attachChild(originalC); + + skeleton->addBone(dynamic_cast(originalC), nullptr); + skeleton->addBone(dynamic_cast(originalD), nullptr); originalA->addSkeleton(skeleton); Node *clonedA = originalA->clone(); CPPUNIT_ASSERT(clonedA->getSkeleton(0)); Skeleton *clonedSkeleton = originalA->getSkeleton(0); - CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getName() == originalC->getName()); - CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getName() == originalD->getName()); + CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getName() == dynamic_cast(originalC)->getName()); + CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getLength() == dynamic_cast(originalC)->getLength()); + CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getLength() == dynamic_cast(originalD)->getLength()); + CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getName() == dynamic_cast(originalD)->getName()); } void NodeTest::testClonedMeshSkeleton(){ string name = "skeleton"; - Mesh *mesh = new Mesh(MeshData(nullptr, nullptr, 0)); + Mesh *mesh = new Mesh(MeshData(nullptr, nullptr, 0, "", nullptr, 0, name)); Skeleton *skeleton = new Skeleton(name); - mesh->setSkeleton(skeleton); originalD->attachMesh(mesh); originalD->addSkeleton(skeleton); diff --git a/skeleton.cpp b/skeleton.cpp index ab94e93..3a1c374 100644 --- a/skeleton.cpp +++ b/skeleton.cpp @@ -89,8 +89,8 @@ namespace vb01{ if(parent) parent->attachChild(bone); - bones.push_back(bone); bone->setSkeleton(this); + bones.push_back(bone); } Bone* Skeleton::getBone(string name){