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
58typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload;58typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload;
59 59
60namespace render {60namespace 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(); }
62 template <> const Item::Bound payloadGetBound(const AnimDebugDrawData::Pointer& data) { return Item::Bound(); }62 template <> const Item::Bound payloadGetBound(const AnimDebugDrawData::Pointer& data) { return Item::Bound(); }
63 template <> void payloadRender(const AnimDebugDrawData::Pointer& data, RenderArgs* args) {63 template <> void payloadRender(const AnimDebugDrawData::Pointer& data, RenderArgs* args) {
64 data->render(args);64 data->render(args);
@@ -143,14 +143,65 @@ AnimDebugDraw::~AnimDebugDraw() { · 78 unmodified lines
143 }143 }
144}144}
145 145
146void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::Pointer skeleton, const Transform& worldTransform) {146void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::Pointer skeleton, const AnimPose& rootPose) {
147 _skeletons[key] = SkeletonInfo(skeleton, worldTransform);147 _skeletons[key] = SkeletonInfo(skeleton, rootPose);
148}148}
149 149
150void AnimDebugDraw::removeSkeleton(std::string key) {150void AnimDebugDraw::removeSkeleton(std::string key) {
151 _skeletons.erase(key);151 _skeletons.erase(key);
152}152}
153 153
154void AnimDebugDraw::addAnimNode(std::string key, AnimNode::Pointer animNode, const AnimPose& rootPose) {
155 _animNodes[key] = AnimNodeInfo(animNode, rootPose);
156}
157
158void AnimDebugDraw::removeAnimNode(std::string key) {
159 _animNodes.erase(key);
160}
161
162static const uint32_t red = toRGBA(255, 0, 0, 255);
163static const uint32_t green = toRGBA(0, 255, 0, 255);
164static const uint32_t blue = toRGBA(0, 0, 255, 255);
165static const uint32_t cyan = toRGBA(0, 128, 128, 255);
166
167static 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
194static 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
154void AnimDebugDraw::update() {205void AnimDebugDraw::update() {
155 206
156 render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();207 render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene();
@@ -173,59 +224,53 @@ void AnimDebugDraw::update() { · 16 unmodified lines
173 }224 }
174 }225 }
175 226
176 const uint32_t red = toRGBA(255, 0, 0, 255);227 for (auto&& iter : _animNodes) {
177 const uint32_t green = toRGBA(0, 255, 0, 255);228 AnimNode::Pointer& animNode = iter.second.first;
178 const uint32_t blue = toRGBA(0, 0, 255, 255);229 auto poses = animNode->getPosesInternal();
179 const uint32_t gray = toRGBA(64, 64, 64, 255);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 }
180 241
181 data._vertexBuffer->resize(sizeof(Vertex) * numVerts);242 data._vertexBuffer->resize(sizeof(Vertex) * numVerts);
182 Vertex* verts = (Vertex*)data._vertexBuffer->editData();243 Vertex* verts = (Vertex*)data._vertexBuffer->editData();
183 Vertex* v = verts;244 Vertex* v = verts;
184 for (auto&& iter : _skeletons) {245 for (auto&& iter : _skeletons) {
185 AnimSkeleton::Pointer& skeleton = iter.second.first;246 AnimSkeleton::Pointer& skeleton = iter.second.first;
186 Transform& xform = iter.second.second;247 AnimPose& rootPose = iter.second.second;
187 for (int i = 0; i < skeleton->getNumJoints(); i++) {248 for (int i = 0; i < skeleton->getNumJoints(); i++) {
188 AnimPose pose = skeleton->getBindPose(i);249 AnimPose pose = skeleton->getBindPose(i);
189 250
190 glm::vec3 base = xform.transform(pose.trans);251 // draw axes
191 252 const float radius = 1.0f;
192 // x-axis253 addWireframeSphereWithAxes(rootPose, pose, radius, v);
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++;
215 254
216 // line to parent.255 // line to parent.
217 if (skeleton->getParentIndex(i) >= 0) {256 if (skeleton->getParentIndex(i) >= 0) {
218 AnimPose parentPose = skeleton->getBindPose(skeleton->getParentIndex(i));257 AnimPose parentPose = skeleton->getBindPose(skeleton->getParentIndex(i));
219 v->pos = base;258 addWireframeBoneAxis(rootPose, pose, parentPose, radius, v);
220 v->rgba = gray;
221 v++;
222 v->pos = xform.transform(parentPose.trans);
223 v->rgba = gray;
224 v++;
225 }259 }
226 }260 }
227 }261 }
228 262
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
229 data._indexBuffer->resize(sizeof(uint16_t) * numVerts);274 data._indexBuffer->resize(sizeof(uint16_t) * numVerts);
230 uint16_t* indices = (uint16_t*)data._indexBuffer->editData();275 uint16_t* indices = (uint16_t*)data._indexBuffer->editData();
231 for (int i = 0; i < numVerts; i++) {276 for (int i = 0; i < numVerts; i++) {