Add animation loader and animate with given values

This commit is contained in:
hodasemi 2018-05-31 10:19:04 +02:00
parent 71edbc6f51
commit b4bec44770
2 changed files with 46 additions and 46 deletions

View file

@ -33,12 +33,33 @@ SkeletonViewer::SkeletonViewer(DataStore *data)
colors[i][j] = static_cast<float>(rand()) / static_cast<float>(RAND_MAX); colors[i][j] = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
} }
} }
frame = 0;
} }
//draws a part of a skeleton, represented by the given root node //draws a part of a skeleton, represented by the given root node
void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_parent_local, context &c, int depth) void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_parent_local, context &c, int depth)
{ {
//Task: Draw skeleton //Task: Draw skeleton
if (frame < animations.size())
{
auto &current_step = animations[frame];
auto it = current_step.find(node->get_name());
if (it != current_step.end())
{
std::vector<float> &values = it->second;
if (values.size() == node->dof_count())
{
for (int i = 0; i < values.size(); i++)
{
node->get_dof(i)->set_value(values[i]);
}
}
}
}
Mat4 local_transform = node->calculate_transform_prev_to_current_with_dofs() * global_to_parent_local; Mat4 local_transform = node->calculate_transform_prev_to_current_with_dofs() * global_to_parent_local;
Vec4 zero = Vec4(0.0f, 0.0f, 0.0f, 1.0f); Vec4 zero = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
@ -49,8 +70,6 @@ void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_par
Vec3 p1_v3 = Vec3(p1.x(), p1.y(), p1.z()); Vec3 p1_v3 = Vec3(p1.x(), p1.y(), p1.z());
Vec3 p2_v3 = Vec3(p2.x(), p2.y(), p2.z()); Vec3 p2_v3 = Vec3(p2.x(), p2.y(), p2.z());
std::cout << node->get_name() << " start: " << from_Vec3(p1_v3) << ", end: " << from_Vec3(p2_v3) << std::endl;
glColor3f(colors[depth][0], colors[depth][1], colors[depth][2]); glColor3f(colors[depth][0], colors[depth][1], colors[depth][2]);
c.tesselate_arrow(p1_v3, p2_v3); c.tesselate_arrow(p1_v3, p2_v3);
@ -80,8 +99,6 @@ void SkeletonViewer::stop_animation()
void SkeletonViewer::skeleton_changed(std::shared_ptr<Skeleton> s) void SkeletonViewer::skeleton_changed(std::shared_ptr<Skeleton> s)
{ {
std::cout << "skeleton changed" << std::endl;
// This function is called whenever the according signal of the // This function is called whenever the according signal of the
// data store has been called. // data store has been called.
@ -120,8 +137,6 @@ void SkeletonViewer::recursive_connect_signals(Bone *b)
void SkeletonViewer::dof_changed(double) void SkeletonViewer::dof_changed(double)
{ {
std::cout << "dof changed" << std::endl;
if (!data->dof_changed_by_ik) if (!data->dof_changed_by_ik)
data->set_endeffector(nullptr); data->set_endeffector(nullptr);
@ -245,12 +260,14 @@ void SkeletonViewer::load_animation()
std::string filename = cgv::gui::file_open_dialog("Open", "Animation File (*.amc):*.amc"); std::string filename = cgv::gui::file_open_dialog("Open", "Animation File (*.amc):*.amc");
if (!filename.empty()) if (!filename.empty())
{ {
animations.clear();
std::ifstream file(filename); std::ifstream file(filename);
std::string line; std::string line;
int current_index = -1; int current_index = -1;
while(std::getline(file, line)) while (std::getline(file, line))
{ {
if (line[0] == '#' || line[0] == ':') if (line[0] == '#' || line[0] == ':')
{ {
@ -266,7 +283,9 @@ void SkeletonViewer::load_animation()
{ {
current_index = number - 1; current_index = number - 1;
std::cout << "current_index: " << current_index << std::endl; //std::map<std::string, std::vector<AtomicTransform *>> tmp;
std::map<std::string, std::vector<float>> tmp;
animations.emplace_back(tmp);
} }
else else
{ {
@ -274,53 +293,28 @@ void SkeletonViewer::load_animation()
abort(); abort();
std::string bone_name; std::string bone_name;
float bla; std::vector<float> values;
// sexy c-code for gettin string
while(!line.empty()) {
int first_blank = line.find_first_of(" "); int first_blank = line.find_first_of(" ");
string fnumbers = line.substr(first_blank + 1); bone_name = line.substr(0, first_blank);
string bonename = line.substr(0, first_blank);
}
if (!(sline >> bone_name)) auto &current_map = animations[current_index];
{
std::cout << "index(" << current_index << ") could not get bone name from: " << line << std::endl;
if (!(sline >> bla)) std::string rest = line.substr(first_blank + 1, line.size());
{ std::stringstream sstream(rest);
std::cout << "index(" << current_index << ") could not get value from: " << line << std::endl;
}
}
std::vector<AtomicTransform> transforms;
float value; float value;
if (name == "root" ) while (sstream >> value)
{ {
for(int i = 0; i < 6; i++) values.push_back(value);
{
if (!(sline >> value))
{
std::cout << "could not get value from: " << line << std::endl;
} }
else
{
} // test if values alone are enough
} current_map[bone_name] = values;
}
else if (!name.empty())
{
while (sline >> value)
{
// TODO
} }
} }
abort(); std::cout << "successfully loaded anination " << animations.size() << std::endl;
}
}
} }
} }
@ -389,4 +383,8 @@ void SkeletonViewer::draw(context &c)
if (data->get_skeleton() != nullptr) if (data->get_skeleton() != nullptr)
draw_skeleton_subtree(data->get_skeleton()->get_root(), data->get_skeleton()->get_origin(), c, 0); draw_skeleton_subtree(data->get_skeleton()->get_root(), data->get_skeleton()->get_origin(), c, 0);
frame++;
if (frame >= animations.size())
frame = 0;
} }

View file

@ -33,12 +33,14 @@ class SkeletonViewer : public node, public drawable, public provider
gui_group_ptr tree_view; gui_group_ptr tree_view;
gui_group_ptr bone_group; gui_group_ptr bone_group;
std::vector<std::map<std::string, std::vector<AtomicTransform* >>> animations; std::vector<std::map<std::string, std::vector<float>>> animations;
float colors[SKELETON_DEPTH][3]; float colors[SKELETON_DEPTH][3];
// Maps gui elements in the tree view to a specific bone // Maps gui elements in the tree view to a specific bone
std::map<base_ptr, Bone *> gui_to_bone; std::map<base_ptr, Bone *> gui_to_bone;
int frame;
// slot for the signal // slot for the signal
void timer_event(double, double dt); void timer_event(double, double dt);
void skeleton_changed(std::shared_ptr<Skeleton>); void skeleton_changed(std::shared_ptr<Skeleton>);