History

WIP, animNode rendering

Anthony J. Thibault committed 11 years ago

Commit df794631 parent d1fdbe39 files · +136 −46Browse 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+84−39
@@ -58,7 +58,7 @@ public: · 57 unmodified lines
5858 typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload;
5959
6060 namespace render {
61− template <> const ItemKey payloadGetKey(const AnimDebugDrawData::Pointer& data) { return ItemKey::Builder::transparentShape(); }
61+ template <> const ItemKey payloadGetKey(const AnimDebugDrawData::Pointer& data) { return ItemKey::Builder::opaqueShape(); }
6262 template <> const Item::Bound payloadGetBound(const AnimDebugDrawData::Pointer& data) { return Item::Bound(); }
6363 template <> void payloadRender(const AnimDebugDrawData::Pointer& data, RenderArgs* args) {
6464 data->render(args);
@@ -143,14 +143,65 @@ AnimDebugDraw::~AnimDebugDraw() { · 78 unmodified lines
143143 }
144144 }
145145
146−void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::Pointer skeleton, const Transform& worldTransform) {
147− _skeletons[key] = SkeletonInfo(skeleton, worldTransform);
146+void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::Pointer skeleton, const AnimPose& rootPose) {
147+ _skeletons[key] = SkeletonInfo(skeleton, rootPose);
148148 }
149149
150150 void AnimDebugDraw::removeSkeleton(std::string key) {
151151 _skeletons.erase(key);
152152 }
153153
154+void AnimDebugDraw::addAnimNode(std::string key, AnimNode::Pointer animNode, const AnimPose& rootPose) {
155+ _animNodes[key] = AnimNodeInfo(animNode, rootPose);
156+}
157+
158+void AnimDebugDraw::removeAnimNode(std::string key) {
159+ _animNodes.erase(key);
160+}
161+
162+static const uint32_t red = toRGBA(255, 0, 0, 255);
163+static const uint32_t green = toRGBA(0, 255, 0, 255);
164+static const uint32_t blue = toRGBA(0, 0, 255, 255);
165+static const uint32_t cyan = toRGBA(0, 128, 128, 255);
166+
167+static void addWireframeSphereWithAxes(const AnimPose& rootPose, const AnimPose& pose, float radius, Vertex*& v) {
168+
169+ // x-axis
170+ v->pos = rootPose * pose.trans;
171+ v->rgba = red;
172+ v++;
173+ v->pos = rootPose * (pose.trans + pose.rot * glm::vec3(radius * 2.0f, 0.0f, 0.0f));
174+ v->rgba = red;
175+ v++;
176+
177+ // y-axis
178+ v->pos = rootPose * pose.trans;
179+ v->rgba = green;
180+ v++;
181+ v->pos = rootPose * (pose.trans + pose.rot * glm::vec3(0.0f, radius * 2.0f, 0.0f));
182+ v->rgba = green;
183+ v++;
184+
185+ // z-axis
186+ v->pos = rootPose * pose.trans;
187+ v->rgba = blue;
188+ v++;
189+ v->pos = rootPose * (pose.trans + pose.rot * glm::vec3(0.0f, 0.0f, radius * 2.0f));
190+ v->rgba = blue;
191+ v++;
192+}
193+
194+static void addWireframeBoneAxis(const AnimPose& rootPose, const AnimPose& pose,
195+ const AnimPose& parentPose, float radius, Vertex*& v) {
196+ v->pos = rootPose * pose.trans;
197+ v->rgba = cyan;
198+ v++;
199+ v->pos = rootPose * parentPose.trans;
200+ v->rgba = cyan;
201+ v++;
202+}
203+
204+
154205 void AnimDebugDraw::update() {
155206
156207 render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
@@ -173,59 +224,53 @@ void AnimDebugDraw::update() { · 16 unmodified lines
173224 }
174225 }
175226
176− const uint32_t red = toRGBA(255, 0, 0, 255);
177− const uint32_t green = toRGBA(0, 255, 0, 255);
178− const uint32_t blue = toRGBA(0, 0, 255, 255);
179− const uint32_t gray = toRGBA(64, 64, 64, 255);
227+ for (auto&& iter : _animNodes) {
228+ AnimNode::Pointer& animNode = iter.second.first;
229+ auto poses = animNode->getPosesInternal();
230+ numVerts += poses.size() * 6;
231+
232+ /*
233+ for (int i = 0; i < poses.size(); i++) {
234+ // TODO: need skeleton!
235+ if (skeleton->getParentIndex(i) >= 0) {
236+ numVerts += 2;
237+ }
238+ }
239+ */
240+ }
180241
181242 data._vertexBuffer->resize(sizeof(Vertex) * numVerts);
182243 Vertex* verts = (Vertex*)data._vertexBuffer->editData();
183244 Vertex* v = verts;
184245 for (auto&& iter : _skeletons) {
185246 AnimSkeleton::Pointer& skeleton = iter.second.first;
186− Transform& xform = iter.second.second;
247+ AnimPose& rootPose = iter.second.second;
187248 for (int i = 0; i < skeleton->getNumJoints(); i++) {
188249 AnimPose pose = skeleton->getBindPose(i);
189250
190− glm::vec3 base = xform.transform(pose.trans);
191−
192− // x-axis
193− v->pos = base;
194− v->rgba = red;
195− v++;
196− v->pos = base + pose.rot * glm::vec3(1.0f, 0.0f, 0.0f);
197− v->rgba = red;
198− v++;
199−
200− // y-axis
201− v->pos = xform.transform(pose.trans);
202− v->rgba = green;
203− v++;
204− v->pos = base + pose.rot * glm::vec3(0.0f, 1.0f, 0.0f);
205− v->rgba = green;
206− v++;
207−
208− // z-axis
209− v->pos = base;
210− v->rgba = blue;
211− v++;
212− v->pos = base + pose.rot * glm::vec3(0.0f, 0.0f, 1.0f);
213− v->rgba = blue;
214− v++;
251+ // draw axes
252+ const float radius = 1.0f;
253+ addWireframeSphereWithAxes(rootPose, pose, radius, v);
215254
216255 // line to parent.
217256 if (skeleton->getParentIndex(i) >= 0) {
218257 AnimPose parentPose = skeleton->getBindPose(skeleton->getParentIndex(i));
219− v->pos = base;
220− v->rgba = gray;
221− v++;
222− v->pos = xform.transform(parentPose.trans);
223− v->rgba = gray;
224− v++;
258+ addWireframeBoneAxis(rootPose, pose, parentPose, radius, v);
225259 }
226260 }
227261 }
228262
263+ for (auto&& iter : _animNodes) {
264+ AnimNode::Pointer& animNode = iter.second.first;
265+ AnimPose& rootPose = iter.second.second;
266+ auto poses = animNode->getPosesInternal();
267+ for (size_t i = 0; i < poses.size(); i++) {
268+ // draw axes
269+ const float radius = 1.0f;
270+ addWireframeSphereWithAxes(rootPose, poses[i], radius, v);
271+ }
272+ }
273+
229274 data._indexBuffer->resize(sizeof(uint16_t) * numVerts);
230275 uint16_t* indices = (uint16_t*)data._indexBuffer->editData();
231276 for (int i = 0; i < numVerts; i++) {