cloning fixes and improvements

This commit is contained in:
devZoGok
2022-03-30 21:20:02 +03:00
parent feaae8e272
commit 74fdb495bc
3 changed files with 28 additions and 14 deletions
+12 -6
View File
@@ -76,7 +76,13 @@ namespace vb01{
for(int i = 0; i < numDescendants; i++){ for(int i = 0; i < numDescendants; i++){
Node *original = originalDescendants[i]; Node *original = originalDescendants[i];
Node *clone = new Node(original->getPosition(), original->getOrientation(), original->getScale(), original->getName()); Bone *originalBone = dynamic_cast<Bone*>(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++) for(int j = 0; j < i; j++)
if(original->getParent() == originalDescendants[j]){ if(original->getParent() == originalDescendants[j]){
@@ -96,7 +102,7 @@ namespace vb01{
for(Bone *bone : skel->getBones()) for(Bone *bone : skel->getBones())
for(int j = 0; j < numDescendants; j++) for(int j = 0; j < numDescendants; j++)
if(bone == originalDescendants[j]){ if(bone == originalDescendants[j]){
sk->addBone((Bone*)clonedDescendants[j], nullptr); sk->addBone(dynamic_cast<Bone*>(clonedDescendants[j]), nullptr);
break; break;
} }
@@ -106,12 +112,12 @@ namespace vb01{
for(Mesh *mesh : original->getMeshes()){ for(Mesh *mesh : original->getMeshes()){
Mesh *m = new Mesh(MeshData(mesh->getMeshBase())); Mesh *m = new Mesh(MeshData(mesh->getMeshBase()));
if(mesh->getSkeleton()) if(mesh->getMeshBase().fullSkeletonName != "")
for(int j = 0; j < numDescendants; j++) for(int j = 0; j < numDescendants; j++)
for(int k = 0; k < clonedDescendants[j]->getNumSkeletons(); k++) for(int k = 0; k < clonedDescendants[j]->getNumSkeletons(); k++)
if( if(
clonedDescendants[j]->getName() == originalDescendants[j]->getName() && 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)); m->setSkeleton(clonedDescendants[j]->getSkeleton(k));
break; break;
@@ -119,7 +125,6 @@ namespace vb01{
clonedDescendants[i]->attachMesh(m); clonedDescendants[i]->attachMesh(m);
} }
} }
for(int i = 0; i < numDescendants; i++){ for(int i = 0; i < numDescendants; i++){
@@ -134,7 +139,7 @@ namespace vb01{
for(int k = 0; k < originalDescendants[j]->getNumMeshes(); k++){ for(int k = 0; k < originalDescendants[j]->getNumMeshes(); k++){
for(int l = 0; l < originalDescendants[j]->getMesh(k)->getMeshBase().numShapeKeys; l++) 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); animatable = clonedDescendants[j]->getMesh(k)->getShapeKey(l);
break; break;
} }
@@ -215,6 +220,7 @@ namespace vb01{
} }
void Node::addSkeleton(Skeleton *skeleton){ void Node::addSkeleton(Skeleton *skeleton){
skeleton->onAttached(this);
skeletons.push_back(skeleton); skeletons.push_back(skeleton);
} }
+15 -7
View File
@@ -88,7 +88,7 @@ namespace vb01{
Mesh *mesh = new Mesh(MeshData(nullptr, nullptr, 0, "", nullptr, 0, "", new MeshData::ShapeKey[numKeys], numKeys)); Mesh *mesh = new Mesh(MeshData(nullptr, nullptr, 0, "", nullptr, 0, "", new MeshData::ShapeKey[numKeys], numKeys));
originalD->attachMesh(mesh); 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); originalB->addDriver(driver);
Node *clonedA = originalA->clone(); Node *clonedA = originalA->clone();
@@ -113,23 +113,31 @@ namespace vb01{
void NodeTest::testClonedSkeletons(){ void NodeTest::testClonedSkeletons(){
Skeleton *skeleton = new Skeleton(); Skeleton *skeleton = new Skeleton();
skeleton->addBone((Bone*)originalC, (Bone*)originalC->getParent()); originalC->dettachChild(originalD);
skeleton->addBone((Bone*)originalD, (Bone*)originalD->getParent()); 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<Bone*>(originalC), nullptr);
skeleton->addBone(dynamic_cast<Bone*>(originalD), nullptr);
originalA->addSkeleton(skeleton); originalA->addSkeleton(skeleton);
Node *clonedA = originalA->clone(); Node *clonedA = originalA->clone();
CPPUNIT_ASSERT(clonedA->getSkeleton(0)); CPPUNIT_ASSERT(clonedA->getSkeleton(0));
Skeleton *clonedSkeleton = originalA->getSkeleton(0); Skeleton *clonedSkeleton = originalA->getSkeleton(0);
CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getName() == originalC->getName()); CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getName() == dynamic_cast<Bone*>(originalC)->getName());
CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getName() == originalD->getName()); CPPUNIT_ASSERT(clonedSkeleton->getBone(0)->getLength() == dynamic_cast<Bone*>(originalC)->getLength());
CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getLength() == dynamic_cast<Bone*>(originalD)->getLength());
CPPUNIT_ASSERT(clonedSkeleton->getBone(1)->getName() == dynamic_cast<Bone*>(originalD)->getName());
} }
void NodeTest::testClonedMeshSkeleton(){ void NodeTest::testClonedMeshSkeleton(){
string name = "skeleton"; 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); Skeleton *skeleton = new Skeleton(name);
mesh->setSkeleton(skeleton);
originalD->attachMesh(mesh); originalD->attachMesh(mesh);
originalD->addSkeleton(skeleton); originalD->addSkeleton(skeleton);
+1 -1
View File
@@ -89,8 +89,8 @@ namespace vb01{
if(parent) if(parent)
parent->attachChild(bone); parent->attachChild(bone);
bones.push_back(bone);
bone->setSkeleton(this); bone->setSkeleton(this);
bones.push_back(bone);
} }
Bone* Skeleton::getBone(string name){ Bone* Skeleton::getBone(string name){