mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
cloning fixes and improvements
This commit is contained in:
@@ -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
@@ -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
@@ -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){
|
||||||
|
|||||||
Reference in New Issue
Block a user