diff --git a/mesh.h b/mesh.h index 3965b8a..935fb8f 100755 --- a/mesh.h +++ b/mesh.h @@ -32,6 +32,7 @@ namespace vb01{ inline Material* getMaterial(){return material;} inline bool isReflective(){return reflective;} inline bool isCastShadow(){return castShadow;} + inline MeshData::ShapeKey* getShapeKey(int i){return &shapeKeys[i];} inline Skeleton* getSkeleton(){return skeleton;} inline Texture* getPrefilterMap(){return prefilterMap;} inline Texture* getIrradianceMap(){return irradianceMap;} diff --git a/node.cpp b/node.cpp index c3e5163..27d6a00 100755 --- a/node.cpp +++ b/node.cpp @@ -120,8 +120,28 @@ namespace vb01{ clonedDescendants[i]->attachMesh(m); } - for(Driver *driver : original->getDrivers()){ - Driver *dr = new Driver(nullptr, driver->getKeyframeChannel(), driver->getType()); + } + + for(int i = 0; i < numDescendants; i++){ + for(Driver *driver : originalDescendants[i]->getDrivers()){ + Animatable *animatable = nullptr; + + for(int j = 0; j < numDescendants; j++){ + if(originalDescendants[j] == driver->getAnimatable()){ + animatable = clonedDescendants[j]; + break; + } + + 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()){ + animatable = clonedDescendants[j]->getMesh(k)->getShapeKey(l); + break; + } + } + } + + Driver *dr = new Driver(animatable, driver->getKeyframeChannel(), driver->getType()); clonedDescendants[i]->addDriver(dr); } } diff --git a/node.h b/node.h index 47c5395..d1978a3 100755 --- a/node.h +++ b/node.h @@ -51,6 +51,7 @@ namespace vb01{ inline std::vector& getMeshes(){return meshes;} inline std::vector& getSkeletons(){return skeletons;} inline Mesh* getMesh(int i){return meshes[i];} + inline int getNumMeshes(){return meshes.size();} inline Node* getParent(){return parent;} inline void setParent(Node *par){this->parent = par;} inline Node* getChild(int i){return children[i];} diff --git a/nodeTest.cpp b/nodeTest.cpp index 419d6d5..8d507dc 100644 --- a/nodeTest.cpp +++ b/nodeTest.cpp @@ -83,8 +83,12 @@ namespace vb01{ KeyframeChannelType channelType = KeyframeChannelType::POS_X; string animName = "D"; KeyframeChannel channel = KeyframeChannel::createKeyframeChannel(channelType, animName, keyframes); - Driver::VariableType driverType = Driver::POS_X; - Driver *driver = new Driver(originalD, channel, driverType); + + int numKeys = 1; + 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); originalB->addDriver(driver); Node *clonedA = originalA->clone(); @@ -94,21 +98,17 @@ namespace vb01{ Node *clonedD = nullptr; for(Node *desc : clonedDescendands){ - if(desc->getName() == "B"){ + if(desc->getName() == "B") clonedB = desc; - break; - } - else if(desc->getName() == animName){ + else if(desc->getName() == animName) clonedD = desc; - break; - } } Driver *driverClone = clonedB->getDriver(0); - CPPUNIT_ASSERT(driverClone->getAnimatable() == clonedD); + CPPUNIT_ASSERT(driverClone->getAnimatable() == clonedD->getMesh(0)->getShapeKey(0)); CPPUNIT_ASSERT(driverClone->getKeyframeChannel().type == channelType); CPPUNIT_ASSERT(driverClone->getKeyframeChannel().animatable == animName); - CPPUNIT_ASSERT(driverClone->getType() == driverType); + CPPUNIT_ASSERT(driverClone->getType() == Driver::POS_X); } void NodeTest::testClonedSkeletons(){