diff --git a/CMakeLists.txt b/CMakeLists.txt index b7e62e5..44a972c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,9 @@ find_package(OpenGL REQUIRED) include_directories("src/") include_directories("gl/include") add_subdirectory(lib/glm EXCLUDE_FROM_ALL) + add_subdirectory(src) +add_subdirectory(src/animation) add_executable(demo main.cpp gl/src/glad.c ${SOURCE}) target_link_libraries(demo glfw OpenGL::GL) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 14c9f32..cfc8072 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,3 +47,5 @@ set(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/timer.cpp PARENT_SCOPE ) + +#add_subdirectory(animation) diff --git a/src/animation/CMakeLists.txt b/src/animation/CMakeLists.txt new file mode 100644 index 0000000..4ca9159 --- /dev/null +++ b/src/animation/CMakeLists.txt @@ -0,0 +1,15 @@ +set(HEADERS + ${HEADERS} + ${CMAKE_CURRENT_SOURCE_DIR}/float_track.h + ${CMAKE_CURRENT_SOURCE_DIR}/integer_track.h + ${CMAKE_CURRENT_SOURCE_DIR}/vec3_track.h + PARENT_SCOPE + ) + +set(SOURCE + ${SOURCE} + ${CMAKE_CURRENT_SOURCE_DIR}/float_track.h + ${CMAKE_CURRENT_SOURCE_DIR}/integer_track.h + ${CMAKE_CURRENT_SOURCE_DIR}/vec3_track.h + PARENT_SCOPE + ) diff --git a/src/animation/float_track.cpp b/src/animation/float_track.cpp new file mode 100644 index 0000000..8232293 --- /dev/null +++ b/src/animation/float_track.cpp @@ -0,0 +1,15 @@ +#include "animation/float_track.h" + +BEGIN_NAMESPACE + +animated_value float_track::get_value(const animated_value &first, const animated_value &second, float alpha) { + animated_value result; + result.floatVal = glm::mix(first.floatVal, second.floatVal, alpha); + return result; +}; + +void float_track::control_object(void *controlled_object, const animated_value &value) { + *reinterpret_cast(controlled_object) = value.floatVal; +} + +END_NAMESPACE \ No newline at end of file diff --git a/src/animation/float_track.h b/src/animation/float_track.h new file mode 100644 index 0000000..615f3d1 --- /dev/null +++ b/src/animation/float_track.h @@ -0,0 +1,13 @@ +#pragma once + +#include "animation_track.h" + +BEGIN_NAMESPACE + +class float_track : public animation_track { +public: + animated_value get_value(const animated_value &first, const animated_value &second, float alpha) override; + void control_object(void *controlled_object, const animated_value &value) override; +}; + +END_NAMESPACE \ No newline at end of file diff --git a/src/animation/integer_track.cpp b/src/animation/integer_track.cpp new file mode 100644 index 0000000..9ebee13 --- /dev/null +++ b/src/animation/integer_track.cpp @@ -0,0 +1,16 @@ +#include "animation/integer_track.h" + +BEGIN_NAMESPACE + +animated_value integer_track::get_value(const animated_value &first, const animated_value &second, float alpha) { + // no interpolation here + animated_value result; + result.intVal = static_cast(first.intVal + (second.intVal - first.intVal) * alpha); + return result; +}; + +void integer_track::control_object(void *controlled_object, const animated_value &value) { + *reinterpret_cast(controlled_object) = value.intVal; +} + +END_NAMESPACE diff --git a/src/animation/integer_track.h b/src/animation/integer_track.h new file mode 100644 index 0000000..671cd6d --- /dev/null +++ b/src/animation/integer_track.h @@ -0,0 +1,13 @@ +#pragma once + +#include "animation_track.h" + +BEGIN_NAMESPACE + +class integer_track : public animation_track { +public: + animated_value get_value(const animated_value &first, const animated_value &second, float alpha) override; + void control_object(void *controlled_object, const animated_value &value) override; +}; + +END_NAMESPACE \ No newline at end of file diff --git a/src/animation/vec3_track.cpp b/src/animation/vec3_track.cpp new file mode 100644 index 0000000..1787789 --- /dev/null +++ b/src/animation/vec3_track.cpp @@ -0,0 +1,15 @@ +#include "vec3_track.h" + +BEGIN_NAMESPACE + +animated_value vec3_track::get_value(const animated_value &first, const animated_value &second, float alpha) { + animated_value result; + result.vec3_val = glm::mix(first.vec3_val, second.vec3_val, alpha); + return result; +}; + +void vec3_track::control_object(void *controlled_object, const animated_value &value) { + *reinterpret_cast(controlled_object) = value.vec3_val; +} + +END_NAMESPACE \ No newline at end of file diff --git a/src/animation/vec3_track.h b/src/animation/vec3_track.h new file mode 100644 index 0000000..f7172e5 --- /dev/null +++ b/src/animation/vec3_track.h @@ -0,0 +1,14 @@ +#pragma once + +#include "animation_track.h" + +BEGIN_NAMESPACE + +class vec3_track : public animation_track { +public: + + animated_value get_value(const animated_value &first, const animated_value &second, float alpha) override; + void control_object(void *controlled_object, const animated_value &value) override; +}; + +END_NAMESPACE \ No newline at end of file diff --git a/src/animation_track.h b/src/animation_track.h index b5bc4c5..09c4699 100644 --- a/src/animation_track.h +++ b/src/animation_track.h @@ -18,11 +18,11 @@ enum class animated_value_type { // sadly we cannot use union here since we have non-POD types struct animated_value { - int intVal; - float floatVal; - glm::vec3 vec3Val; - glm::vec4 vec4Val; - glm::quat quatVal; + int int_val; + float float_val; + glm::vec3 vec3_val; + glm::vec4 vec4_val; + glm::quat quat_val; }; struct animation_key { @@ -32,14 +32,14 @@ struct animation_key { static animation_key *vec3Key(float t, glm::vec3 val) { auto *result = new animation_key(); result->time = t; - result->value.vec3Val = val; + result->value.vec3_val = val; return result; } static animation_key *floatKey(float t, float val) { auto *result = new animation_key(); result->time = t; - result->value.floatVal = val; + result->value.float_val = val; return result; } };