History

AnimDebugDraw Improvements

* Now always works, regardless of whether or not Rig or AnimGraph animations are enabled. * Changed joint radius to 1 cm. * Changed xyz axis length to 4 cm.

Anthony J. Thibault committed 11 years ago

Commit 69e463b1 parent d623ba39 files · +157 −63Browse files

Showing the changes to libraries/render-utils/src/AnimDebugDraw.cpp (1 of 9 files). Show all

Unified · Split

libraries/render-utils/src/AnimDebugDraw.cpp+66−8
@@ -152,22 +152,30 @@ AnimDebugDraw::~AnimDebugDraw() { · 151 unmodified lines
152152 }
153153 }
154154
155−void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::ConstPointer skeleton, const AnimPose& rootPose, const glm::vec4& color) {
155+void AnimDebugDraw::addSkeleton(const std::string& key, AnimSkeleton::ConstPointer skeleton, const AnimPose& rootPose, const glm::vec4& color) {
156156 _skeletons[key] = SkeletonInfo(skeleton, rootPose, color);
157157 }
158158
159−void AnimDebugDraw::removeSkeleton(std::string key) {
159+void AnimDebugDraw::removeSkeleton(const std::string& key) {
160160 _skeletons.erase(key);
161161 }
162162
163−void AnimDebugDraw::addAnimNode(std::string key, AnimNode::ConstPointer animNode, const AnimPose& rootPose, const glm::vec4& color) {
163+void AnimDebugDraw::addAnimNode(const std::string& key, AnimNode::ConstPointer animNode, const AnimPose& rootPose, const glm::vec4& color) {
164164 _animNodes[key] = AnimNodeInfo(animNode, rootPose, color);
165165 }
166166
167−void AnimDebugDraw::removeAnimNode(std::string key) {
167+void AnimDebugDraw::removeAnimNode(const std::string& key) {
168168 _animNodes.erase(key);
169169 }
170170
171+void AnimDebugDraw::addPoses(const std::string& key, AnimSkeleton::ConstPointer skeleton, const AnimPoseVec& poses, const AnimPose& rootPose, const glm::vec4& color) {
172+ _poses[key] = PosesInfo(skeleton, poses, rootPose, color);
173+}
174+
175+void AnimDebugDraw::removePoses(const std::string& key) {
176+ _poses.erase(key);
177+}
178+
171179 static const uint32_t red = toRGBA(255, 0, 0, 255);
172180 static const uint32_t green = toRGBA(0, 255, 0, 255);
173181 static const uint32_t blue = toRGBA(0, 0, 255, 255);
@@ -176,6 +184,8 @@ const int NUM_CIRCLE_SLICES = 24; · 2 unmodified lines
176184
177185 static void addBone(const AnimPose& rootPose, const AnimPose& pose, float radius, Vertex*& v) {
178186
187+ const float XYZ_AXIS_LENGTH = radius * 4.0f;
188+
179189 AnimPose finalPose = rootPose * pose;
180190 glm::vec3 base = rootPose * pose.trans;
181191
@@ -195,7 +205,7 @@ static void addBone(const AnimPose& rootPose, const AnimPose& pose, float radius · 13 unmodified lines
195205 v->pos = base;
196206 v->rgba = red;
197207 v++;
198− v->pos = finalPose * glm::vec3(radius * 2.0f, 0.0f, 0.0f);
208+ v->pos = finalPose * glm::vec3(XYZ_AXIS_LENGTH, 0.0f, 0.0f);
199209 v->rgba = red;
200210 v++;
201211
@@ -213,7 +223,7 @@ static void addBone(const AnimPose& rootPose, const AnimPose& pose, float radius · 11 unmodified lines
213223 v->pos = base;
214224 v->rgba = green;
215225 v++;
216− v->pos = finalPose * glm::vec3(0.0f, radius * 2.0f, 0.0f);
226+ v->pos = finalPose * glm::vec3(0.0f, XYZ_AXIS_LENGTH, 0.0f);
217227 v->rgba = green;
218228 v++;
219229
@@ -231,7 +241,7 @@ static void addBone(const AnimPose& rootPose, const AnimPose& pose, float radius · 11 unmodified lines
231241 v->pos = base;
232242 v->rgba = blue;
233243 v++;
234− v->pos = finalPose * glm::vec3(0.0f, 0.0f, radius * 2.0f);
244+ v->pos = finalPose * glm::vec3(0.0f, 0.0f, XYZ_AXIS_LENGTH);
235245 v->rgba = blue;
236246 v++;
237247
@@ -322,7 +332,7 @@ void AnimDebugDraw::update() { · 84 unmodified lines
322332 const size_t VERTICES_PER_BONE = (6 + (NUM_CIRCLE_SLICES * 2) * 3);
323333 const size_t VERTICES_PER_LINK = 8 * 2;
324334
325− const float BONE_RADIUS = 0.0075f;
335+ const float BONE_RADIUS = 0.01f; // 1 cm
326336
327337 // figure out how many verts we will need.
328338 int numVerts = 0;
@@ -350,6 +360,17 @@ void AnimDebugDraw::update() { · 21 unmodified lines
350360 }
351361 }
352362
363+ for (auto&& iter : _poses) {
364+ AnimSkeleton::ConstPointer& skeleton = std::get<0>(iter.second);
365+ numVerts += skeleton->getNumJoints() * VERTICES_PER_BONE;
366+ for (int i = 0; i < skeleton->getNumJoints(); i++) {
367+ auto parentIndex = skeleton->getParentIndex(i);
368+ if (parentIndex >= 0) {
369+ numVerts += VERTICES_PER_LINK;
370+ }
371+ }
372+ }
373+
353374 data._vertexBuffer->resize(sizeof(Vertex) * numVerts);
354375 Vertex* verts = (Vertex*)data._vertexBuffer->editData();
355376 Vertex* v = verts;
@@ -418,6 +439,43 @@ void AnimDebugDraw::update() { · 62 unmodified lines
418439 }
419440 }
420441
442+ for (auto&& iter : _poses) {
443+ AnimSkeleton::ConstPointer& skeleton = std::get<0>(iter.second);
444+ AnimPoseVec& poses = std::get<1>(iter.second);
445+ AnimPose rootPose = std::get<2>(iter.second);
446+ int hipsIndex = skeleton->nameToJointIndex("Hips");
447+ if (hipsIndex >= 0) {
448+ rootPose.trans -= skeleton->getRelativeBindPose(hipsIndex).trans;
449+ }
450+ glm::vec4 color = std::get<3>(iter.second);
451+
452+ std::vector<AnimPose> absAnimPose;
453+ absAnimPose.resize(skeleton->getNumJoints());
454+
455+ for (int i = 0; i < skeleton->getNumJoints(); i++) {
456+ AnimPose pose = poses[i];
457+
458+ const float radius = BONE_RADIUS / (pose.scale.x * rootPose.scale.x);
459+
460+ auto parentIndex = skeleton->getParentIndex(i);
461+ if (parentIndex >= 0) {
462+ absAnimPose[i] = absAnimPose[parentIndex] * poses[i];
463+ } else {
464+ absAnimPose[i] = poses[i];
465+ }
466+
467+ // draw bone
468+ addBone(rootPose, absAnimPose[i], radius, v);
469+
470+ // draw link to parent
471+ if (parentIndex >= 0) {
472+ assert(parentIndex < skeleton->getNumJoints());
473+ AnimPose parentPose = poses[parentIndex];
474+ addLink(rootPose, absAnimPose[i], absAnimPose[parentIndex], radius, color, v);
475+ }
476+ }
477+ }
478+
421479 assert(numVerts == (v - verts));
422480
423481 data._indexBuffer->resize(sizeof(uint16_t) * numVerts);