Showing the changes to libraries/render-utils/src/AnimDebugDraw.cpp (1 of 9 files). Show all
Unified · Split
| @@ -58,7 +58,7 @@ public: · 57 unmodified lines | |||
| 58 | typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload; | 58 | typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload; |
| 59 | 59 | ||
| 60 | namespace render { | 60 | 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(); } |
| 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 | ||
| 146 | void AnimDebugDraw::addSkeleton(std::string key, AnimSkeleton::Pointer skeleton, const Transform& worldTransform) { | 146 | void 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 | ||
| 150 | void AnimDebugDraw::removeSkeleton(std::string key) { | 150 | void AnimDebugDraw::removeSkeleton(std::string key) { |
| 151 | _skeletons.erase(key); | 151 | _skeletons.erase(key); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 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 | |||
| 154 | void AnimDebugDraw::update() { | 205 | void 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-axis | 253 | 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++) { |