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 | 58 | typedef render::Payload<AnimDebugDrawData> AnimDebugDrawPayload; |
| 59 | 59 | |
| 60 | 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 | 62 | template <> const Item::Bound payloadGetBound(const AnimDebugDrawData::Pointer& data) { return Item::Bound(); } |
| 63 | 63 | template <> void payloadRender(const AnimDebugDrawData::Pointer& data, RenderArgs* args) { |
| 64 | 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) { | |
| 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); | |
| 148 | 148 | } |
| 149 | 149 | |
| 150 | 150 | void AnimDebugDraw::removeSkeleton(std::string key) { |
| 151 | 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 | 205 | void AnimDebugDraw::update() { |
| 155 | 206 | |
| 156 | 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); | |
| 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 | + } | |
| 180 | 241 | |
| 181 | 242 | data._vertexBuffer->resize(sizeof(Vertex) * numVerts); |
| 182 | 243 | Vertex* verts = (Vertex*)data._vertexBuffer->editData(); |
| 183 | 244 | Vertex* v = verts; |
| 184 | 245 | for (auto&& iter : _skeletons) { |
| 185 | 246 | AnimSkeleton::Pointer& skeleton = iter.second.first; |
| 186 | − Transform& xform = iter.second.second; | |
| 247 | + AnimPose& rootPose = iter.second.second; | |
| 187 | 248 | for (int i = 0; i < skeleton->getNumJoints(); i++) { |
| 188 | 249 | AnimPose pose = skeleton->getBindPose(i); |
| 189 | 250 | |
| 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); | |
| 215 | 254 | |
| 216 | 255 | // line to parent. |
| 217 | 256 | if (skeleton->getParentIndex(i) >= 0) { |
| 218 | 257 | 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); | |
| 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 | 274 | data._indexBuffer->resize(sizeof(uint16_t) * numVerts); |
| 230 | 275 | uint16_t* indices = (uint16_t*)data._indexBuffer->editData(); |
| 231 | 276 | for (int i = 0; i < numVerts; i++) { |