mirror of
https://github.com/ApfelTeeSaft/vb01.git
synced 2026-08-26 19:33:45 +00:00
animation keyframe channels now use animatable names
This commit is contained in:
+2
-2
@@ -17,7 +17,7 @@ set(MATH quaternion.cpp vector.cpp matrix.cpp ray.cpp)
|
|||||||
set(RENDER lineRenderer.cpp particleEmitter.cpp camera.cpp light.cpp material.cpp mesh.cpp model.cpp node.cpp quad.cpp box.cpp root.cpp shader.cpp texture.cpp)
|
set(RENDER lineRenderer.cpp particleEmitter.cpp camera.cpp light.cpp material.cpp mesh.cpp model.cpp node.cpp quad.cpp box.cpp root.cpp shader.cpp texture.cpp)
|
||||||
set(ANIM animationController.cpp animationChannel.cpp animation.cpp animatable.cpp keyframeChannel.cpp driver.cpp)
|
set(ANIM animationController.cpp animationChannel.cpp animation.cpp animatable.cpp keyframeChannel.cpp driver.cpp)
|
||||||
set(ARMATURE skeleton.cpp bone.cpp ikSolver.cpp)
|
set(ARMATURE skeleton.cpp bone.cpp ikSolver.cpp)
|
||||||
set(ASSET_READERS abstractAssetReader.cpp imageReader.cpp fontReader.cpp modelReader.cpp assimpModelReader.cpp vbModelReader.cpp xmlModelReader.cpp)
|
set(ASSET_READERS abstractAssetReader.cpp imageReader.cpp fontReader.cpp modelReader.cpp assimpModelReader.cpp xmlModelReader.cpp)
|
||||||
set(ASSET_MANAGER assetManager.cpp textAsset.h imageAsset.h modelAsset.h fontAsset.h)
|
set(ASSET_MANAGER assetManager.cpp textAsset.h imageAsset.h modelAsset.h fontAsset.h)
|
||||||
set(LIB_SRC ${RENDER} ${MATH} ${UTILS} ${GUI} ${ARMATURE} ${ASSET_MANAGER} ${ASSET_READERS} ${ANIM})
|
set(LIB_SRC ${RENDER} ${MATH} ${UTILS} ${GUI} ${ARMATURE} ${ASSET_MANAGER} ${ASSET_READERS} ${ANIM})
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ if(BUILD_TESTS)
|
|||||||
set(ARMATURE_TEST boneTest.cpp ikSolverTest.cpp)
|
set(ARMATURE_TEST boneTest.cpp ikSolverTest.cpp)
|
||||||
set(MODEL_TEST vbModelReaderTest.cpp)
|
set(MODEL_TEST vbModelReaderTest.cpp)
|
||||||
set(ANIMATION_TEST animationChannelTest.cpp)
|
set(ANIMATION_TEST animationChannelTest.cpp)
|
||||||
set(TEST_SRC main.cpp ${LIB_SRC} ${RENDER_TEST} ${ARMATURE_TEST} ${MODEL_TEST} ${ANIMATION_TEST})
|
set(TEST_SRC main.cpp ${LIB_SRC} ${RENDER_TEST} ${ARMATURE_TEST} ${ANIMATION_TEST})
|
||||||
|
|
||||||
add_executable(vb01Tests ${TEST_SRC})
|
add_executable(vb01Tests ${TEST_SRC})
|
||||||
target_link_libraries(vb01Tests ${LIB_NAME} ${DEPS} cppunit)
|
target_link_libraries(vb01Tests ${LIB_NAME} ${DEPS} cppunit)
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ namespace vb01{
|
|||||||
this->name = name;
|
this->name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyframeChannel* Animation::getKeyframeChannel(Animatable *animatable, KeyframeChannelType type){
|
KeyframeChannel* Animation::getKeyframeChannel(string animatable, KeyframeChannelType type){
|
||||||
KeyframeChannel *k = nullptr;
|
KeyframeChannel *k = nullptr;
|
||||||
|
|
||||||
for(KeyframeChannel &channel : keyframeChannels)
|
for(KeyframeChannel &channel : keyframeChannels)
|
||||||
@@ -19,7 +19,7 @@ namespace vb01{
|
|||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<KeyframeChannel> Animation::getKeyframeChannelsByAnimatable(Animatable *animatable){
|
vector<KeyframeChannel> Animation::getKeyframeChannelsByAnimatable(string animatable){
|
||||||
vector<KeyframeChannel> channels;
|
vector<KeyframeChannel> channels;
|
||||||
|
|
||||||
for(KeyframeChannel channel : keyframeChannels)
|
for(KeyframeChannel channel : keyframeChannels)
|
||||||
|
|||||||
+2
-2
@@ -13,8 +13,8 @@ namespace vb01{
|
|||||||
public:
|
public:
|
||||||
Animation(std::string);
|
Animation(std::string);
|
||||||
~Animation(){}
|
~Animation(){}
|
||||||
KeyframeChannel* getKeyframeChannel(Animatable*, KeyframeChannel::Type);
|
KeyframeChannel* getKeyframeChannel(std::string, KeyframeChannel::Type);
|
||||||
std::vector<KeyframeChannel> getKeyframeChannelsByAnimatable(Animatable*);
|
std::vector<KeyframeChannel> getKeyframeChannelsByAnimatable(std::string);
|
||||||
inline void addKeyframeChannels(std::vector<KeyframeChannel> keyframeChannels){this->keyframeChannels.assign(keyframeChannels.begin(), keyframeChannels.end());}
|
inline void addKeyframeChannels(std::vector<KeyframeChannel> keyframeChannels){this->keyframeChannels.assign(keyframeChannels.begin(), keyframeChannels.end());}
|
||||||
inline void addKeyframeChannel(KeyframeChannel channel){keyframeChannels.push_back(channel);}
|
inline void addKeyframeChannel(KeyframeChannel channel){keyframeChannels.push_back(channel);}
|
||||||
inline std::string getName(){return name;}
|
inline std::string getName(){return name;}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace vb01{
|
|||||||
KeyframeChannel kc;
|
KeyframeChannel kc;
|
||||||
kc.type = KeyframeChannel::Type::POS_X;
|
kc.type = KeyframeChannel::Type::POS_X;
|
||||||
kc.keyframes = vector<Keyframe>({k1, k2});
|
kc.keyframes = vector<Keyframe>({k1, k2});
|
||||||
kc.animatable = bone;
|
kc.animatable = bone->getName();
|
||||||
Animation *anim = new Animation("anim");
|
Animation *anim = new Animation("anim");
|
||||||
anim->addKeyframeChannel(kc);
|
anim->addKeyframeChannel(kc);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace vb01{
|
|||||||
Animation *animation = getAnimation(channel->getAnimationName());
|
Animation *animation = getAnimation(channel->getAnimationName());
|
||||||
|
|
||||||
for(Animatable *animatable : channel->getAnimatables()){
|
for(Animatable *animatable : channel->getAnimatables()){
|
||||||
vector<KeyframeChannel> keyframeChannels = animation->getKeyframeChannelsByAnimatable(animatable);
|
vector<KeyframeChannel> keyframeChannels = animation->getKeyframeChannelsByAnimatable(animatable->getName());
|
||||||
|
|
||||||
for(KeyframeChannel keyframeChannel : keyframeChannels){
|
for(KeyframeChannel keyframeChannel : keyframeChannels){
|
||||||
int currentFrame = channel->getCurrentFrame();
|
int currentFrame = channel->getCurrentFrame();
|
||||||
|
|||||||
+6
-2
@@ -6,7 +6,8 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace vb01{
|
namespace vb01{
|
||||||
Driver::Driver(KeyframeChannel keyframeChannel, VariableType type){
|
Driver::Driver(Animatable *animatable, KeyframeChannel keyframeChannel, VariableType type){
|
||||||
|
this->animatable = animatable;
|
||||||
this->keyframeChannel = keyframeChannel;
|
this->keyframeChannel = keyframeChannel;
|
||||||
this->type = type;
|
this->type = type;
|
||||||
}
|
}
|
||||||
@@ -18,16 +19,18 @@ namespace vb01{
|
|||||||
float nextFrame = nextKeyframe.frame;
|
float nextFrame = nextKeyframe.frame;
|
||||||
|
|
||||||
float ratio = (float)(driverValue - pastFrame) / (nextFrame - pastFrame);
|
float ratio = (float)(driverValue - pastFrame) / (nextFrame - pastFrame);
|
||||||
|
|
||||||
if(ratio < 0)
|
if(ratio < 0)
|
||||||
ratio = 0;
|
ratio = 0;
|
||||||
|
|
||||||
Keyframe::Interpolation interp = pastKeyframe.interpolation;
|
Keyframe::Interpolation interp = pastKeyframe.interpolation;
|
||||||
float value = KeyframeChannel::interpolate(pastKeyframe, nextKeyframe, ratio);
|
float value = KeyframeChannel::interpolate(pastKeyframe, nextKeyframe, ratio);
|
||||||
keyframeChannel.animatable->animate(value, keyframeChannel);
|
animatable->animate(value, keyframeChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
Driver::VariableType Driver::getDriverVariableType(string typeString){
|
Driver::VariableType Driver::getDriverVariableType(string typeString){
|
||||||
VariableType type;
|
VariableType type;
|
||||||
|
|
||||||
if(typeString == "LOC_X")
|
if(typeString == "LOC_X")
|
||||||
type = Driver::POS_X;
|
type = Driver::POS_X;
|
||||||
else if(typeString == "LOC_Y")
|
else if(typeString == "LOC_Y")
|
||||||
@@ -48,6 +51,7 @@ namespace vb01{
|
|||||||
type = Driver::SCALE_Y;
|
type = Driver::SCALE_Y;
|
||||||
else if(typeString == "SCALE_Z")
|
else if(typeString == "SCALE_Z")
|
||||||
type = Driver::SCALE_Z;
|
type = Driver::SCALE_Z;
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,14 +23,16 @@ namespace vb01{
|
|||||||
SCALE_Z
|
SCALE_Z
|
||||||
};
|
};
|
||||||
|
|
||||||
Driver(KeyframeChannel, VariableType);
|
Driver(Animatable*, KeyframeChannel, VariableType);
|
||||||
void drive(float);
|
void drive(float);
|
||||||
static VariableType getDriverVariableType(std::string);
|
static VariableType getDriverVariableType(std::string);
|
||||||
inline VariableType getType(){return type;}
|
inline VariableType getType(){return type;}
|
||||||
inline KeyframeChannel& getKeyframeChannel(){return keyframeChannel;}
|
inline KeyframeChannel& getKeyframeChannel(){return keyframeChannel;}
|
||||||
|
inline Animatable* getAnimatable(){return animatable;}
|
||||||
private:
|
private:
|
||||||
VariableType type;
|
VariableType type;
|
||||||
KeyframeChannel keyframeChannel;
|
KeyframeChannel keyframeChannel;
|
||||||
|
Animatable *animatable = nullptr;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -82,7 +82,7 @@ int main(){
|
|||||||
* and frame number.
|
* and frame number.
|
||||||
*/
|
*/
|
||||||
KeyframeChannel kcL;
|
KeyframeChannel kcL;
|
||||||
kcL.animatable = leftMat->getUniform("diffuseColor");
|
kcL.animatable = leftMat->getUniform("diffuseColor")->getName();
|
||||||
kcL.type = KeyframeChannel::UNIFORM_1;
|
kcL.type = KeyframeChannel::UNIFORM_1;
|
||||||
kcL.keyframes = vector<Keyframe>({
|
kcL.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 1, 0),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 1, 0),
|
||||||
@@ -90,7 +90,7 @@ int main(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
KeyframeChannel kcR;
|
KeyframeChannel kcR;
|
||||||
kcR.animatable = rightNode;
|
kcR.animatable = rightNode->getName();
|
||||||
kcR.type = KeyframeChannel::SCALE_Z;
|
kcR.type = KeyframeChannel::SCALE_Z;
|
||||||
kcR.keyframes = vector<Keyframe>({
|
kcR.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 1, 0),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 1, 0),
|
||||||
@@ -98,7 +98,7 @@ int main(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
KeyframeChannel kcD;
|
KeyframeChannel kcD;
|
||||||
kcD.animatable = driver;
|
kcD.animatable = driver->getName();
|
||||||
kcD.type = KeyframeChannel::POS_Y;
|
kcD.type = KeyframeChannel::POS_Y;
|
||||||
kcD.keyframes = vector<Keyframe>({
|
kcD.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 0, 0),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 0, 0),
|
||||||
@@ -110,8 +110,8 @@ int main(){
|
|||||||
* A Driver class is given a transform component, e.g, y coordinate of the position
|
* A Driver class is given a transform component, e.g, y coordinate of the position
|
||||||
* and uses it to play the Keyframe.
|
* and uses it to play the Keyframe.
|
||||||
*/
|
*/
|
||||||
driver->addDriver(new Driver(kcL, Driver::POS_Y));
|
driver->addDriver(new Driver(leftMat->getUniform("diffuseColor"), kcL, Driver::POS_Y));
|
||||||
driver->addDriver(new Driver(kcR, Driver::POS_Y));
|
driver->addDriver(new Driver(rightNode, kcR, Driver::POS_Y));
|
||||||
|
|
||||||
Animation *anim = new Animation("anim");
|
Animation *anim = new Animation("anim");
|
||||||
anim->addKeyframeChannel(kcD);
|
anim->addKeyframeChannel(kcD);
|
||||||
|
|||||||
+1
-1
@@ -121,7 +121,7 @@ namespace vb01{
|
|||||||
return keyframe;
|
return keyframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyframeChannel KeyframeChannel::createKeyframeChannel(KeyframeChannelType type, Animatable *animatable, vector<Keyframe> keyframes){
|
KeyframeChannel KeyframeChannel::createKeyframeChannel(KeyframeChannelType type, string animatable, vector<Keyframe> keyframes){
|
||||||
KeyframeChannel keyframeChannel;
|
KeyframeChannel keyframeChannel;
|
||||||
keyframeChannel.type = type;
|
keyframeChannel.type = type;
|
||||||
keyframeChannel.animatable = animatable;
|
keyframeChannel.animatable = animatable;
|
||||||
|
|||||||
+2
-2
@@ -64,7 +64,7 @@ namespace vb01{
|
|||||||
};
|
};
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
Animatable *animatable = nullptr;
|
std::string animatable = "";
|
||||||
std::vector<Keyframe> keyframes;
|
std::vector<Keyframe> keyframes;
|
||||||
|
|
||||||
static float interpolateBezier(std::vector<float>, float);
|
static float interpolateBezier(std::vector<float>, float);
|
||||||
@@ -73,7 +73,7 @@ namespace vb01{
|
|||||||
static float interpolate(Keyframe, Keyframe, float);
|
static float interpolate(Keyframe, Keyframe, float);
|
||||||
static Keyframe findKeyframe(float, KeyframeChannel, bool);
|
static Keyframe findKeyframe(float, KeyframeChannel, bool);
|
||||||
static Keyframe createKeyframe(Keyframe::Interpolation, float, float, float = 0, float = 0, float = 0, float = 0);
|
static Keyframe createKeyframe(Keyframe::Interpolation, float, float, float = 0, float = 0, float = 0, float = 0);
|
||||||
static KeyframeChannel createKeyframeChannel(KeyframeChannel::Type, Animatable*, std::vector<Keyframe>);
|
static KeyframeChannel createKeyframeChannel(KeyframeChannel::Type, std::string, std::vector<Keyframe>);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef KeyframeChannel::Type KeyframeChannelType;
|
typedef KeyframeChannel::Type KeyframeChannelType;
|
||||||
|
|||||||
+2
-2
@@ -87,7 +87,7 @@ int main(){
|
|||||||
* and frame number.
|
* and frame number.
|
||||||
*/
|
*/
|
||||||
KeyframeChannel kcA;
|
KeyframeChannel kcA;
|
||||||
kcA.animatable = light;
|
kcA.animatable = light->getName();
|
||||||
kcA.type = KeyframeChannel::SPOTLIGHT_OUTER_ANGLE;
|
kcA.type = KeyframeChannel::SPOTLIGHT_OUTER_ANGLE;
|
||||||
kcA.keyframes = vector<Keyframe>({
|
kcA.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, .1, 1),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, .1, 1),
|
||||||
@@ -96,7 +96,7 @@ int main(){
|
|||||||
});
|
});
|
||||||
|
|
||||||
KeyframeChannel kcB;
|
KeyframeChannel kcB;
|
||||||
kcA.animatable = light;
|
kcA.animatable = light->getName();
|
||||||
kcA.type = KeyframeChannel::SPOTLIGHT_INNER_ANGLE;
|
kcA.type = KeyframeChannel::SPOTLIGHT_INNER_ANGLE;
|
||||||
kcA.keyframes = vector<Keyframe>({
|
kcA.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, .1, 1),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, .1, 1),
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include "root.h"
|
#include "root.h"
|
||||||
#include "skeleton.h"
|
#include "skeleton.h"
|
||||||
#include "animation.h"
|
#include "animation.h"
|
||||||
#include "vbModelReader.h"
|
|
||||||
#include "xmlModelReader.h"
|
#include "xmlModelReader.h"
|
||||||
#include "assimpModelReader.h"
|
#include "assimpModelReader.h"
|
||||||
|
|
||||||
@@ -28,8 +27,6 @@ namespace vb01{
|
|||||||
|
|
||||||
if(extension == "xml")
|
if(extension == "xml")
|
||||||
modelReader = new XmlModelReader(this, path);
|
modelReader = new XmlModelReader(this, path);
|
||||||
else if(extension == "vb")
|
|
||||||
modelReader = new VbModelReader(this, path);
|
|
||||||
else
|
else
|
||||||
modelReader = new AssimpModelReader(this, path);
|
modelReader = new AssimpModelReader(this, path);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -83,17 +83,17 @@ int main(){
|
|||||||
* and frame number.
|
* and frame number.
|
||||||
*/
|
*/
|
||||||
KeyframeChannel kcA;
|
KeyframeChannel kcA;
|
||||||
kcA.animatable = texture;
|
kcA.animatable = texture->getName();
|
||||||
kcA.type = KeyframeChannel::TEXTURE_FRAME_A;
|
kcA.type = KeyframeChannel::TEXTURE_FRAME_A;
|
||||||
kcA.keyframes = vector<Keyframe>({KeyframeChannel::createKeyframe(Keyframe::CONSTANT, 0, 1)});
|
kcA.keyframes = vector<Keyframe>({KeyframeChannel::createKeyframe(Keyframe::CONSTANT, 0, 1)});
|
||||||
|
|
||||||
KeyframeChannel kcB;
|
KeyframeChannel kcB;
|
||||||
kcB.animatable = texture;
|
kcB.animatable = texture->getName();
|
||||||
kcB.type = KeyframeChannel::TEXTURE_FRAME_B;
|
kcB.type = KeyframeChannel::TEXTURE_FRAME_B;
|
||||||
kcB.keyframes = vector<Keyframe>({KeyframeChannel::createKeyframe(Keyframe::CONSTANT, 1, 1)});
|
kcB.keyframes = vector<Keyframe>({KeyframeChannel::createKeyframe(Keyframe::CONSTANT, 1, 1)});
|
||||||
|
|
||||||
KeyframeChannel kcC;
|
KeyframeChannel kcC;
|
||||||
kcC.animatable = texture;
|
kcC.animatable = texture->getName();
|
||||||
kcC.type = KeyframeChannel::TEXTURE_MIX_RATIO;
|
kcC.type = KeyframeChannel::TEXTURE_MIX_RATIO;
|
||||||
kcC.keyframes = vector<Keyframe>({
|
kcC.keyframes = vector<Keyframe>({
|
||||||
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 0, 1),
|
KeyframeChannel::createKeyframe(Keyframe::LINEAR, 0, 1),
|
||||||
|
|||||||
+2
-10
@@ -176,16 +176,8 @@ namespace vb01{
|
|||||||
|
|
||||||
string typeStr = channelEl->Attribute("type");
|
string typeStr = channelEl->Attribute("type");
|
||||||
KeyframeChannel::Type type = KeyframeChannel::getKeyframeChannelType(typeStr);
|
KeyframeChannel::Type type = KeyframeChannel::getKeyframeChannelType(typeStr);
|
||||||
Animatable *animatable;
|
string channelName = channelEl->Attribute("name");
|
||||||
string name = channelEl->Attribute("name");
|
KeyframeChannel channel = KeyframeChannel::createKeyframeChannel(type, channelName, keyframes);
|
||||||
|
|
||||||
for(Animatable *an : animatables)
|
|
||||||
if(an->getName() == name){
|
|
||||||
animatable = an;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyframeChannel channel = KeyframeChannel::createKeyframeChannel(type, animatable, keyframes);
|
|
||||||
animation->addKeyframeChannel(channel);
|
animation->addKeyframeChannel(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user