void NCLDebug::DrawMatrixNDT(const Matrix4& mtx) { Vector3 position = mtx.GetPositionVector(); GenDrawHairLine(true, position, position + Vector3(mtx.values[0], mtx.values[1], mtx.values[2]), Vector4(1.0f, 0.0f, 0.0f, 1.0f)); GenDrawHairLine(true, position, position + Vector3(mtx.values[4], mtx.values[5], mtx.values[6]), Vector4(0.0f, 1.0f, 0.0f, 1.0f)); GenDrawHairLine(true, position, position + Vector3(mtx.values[8], mtx.values[9], mtx.values[10]), Vector4(0.0f, 0.0f, 1.0f, 1.0f)); }
void MD5Node::DebugDrawJointTransforms(float size, bool worldSpace) { //Temporary VAO and VBO unsigned int skeletonArray; unsigned int skeletonBuffer; unsigned int skeletonColourBuffer; glGenVertexArrays(1, &skeletonArray); glGenBuffers(1, &skeletonBuffer); glGenBuffers(1, &skeletonColourBuffer); //Temporary chunk of memory to keep our joint positions in int numVerts = currentSkeleton.numJoints * 6; Vector3* skeletonVertices = new Vector3[numVerts]; Vector4* skeletonColours = new Vector4[numVerts]; for (int i = 0; i < currentSkeleton.numJoints; ++i) { Matrix4 transform = (worldSpace ? currentSkeleton.joints[i].transform : currentSkeleton.joints[i].localTransform); Vector3 start = transform.GetPositionVector(); transform.SetPositionVector(Vector3(0, 0, 0)); Vector4 endX = transform * Vector4(1, 0, 0, 1); Vector4 endY = transform * Vector4(0, 1, 0, 1); Vector4 endZ = transform * Vector4(0, 0, 1, 1); skeletonVertices[(i * 6) + 0] = currentSkeleton.joints[i].transform.GetPositionVector(); skeletonVertices[(i * 6) + 1] = currentSkeleton.joints[i].transform.GetPositionVector() + (endX.ToVector3() * size); skeletonVertices[(i * 6) + 2] = currentSkeleton.joints[i].transform.GetPositionVector(); skeletonVertices[(i * 6) + 3] = currentSkeleton.joints[i].transform.GetPositionVector() + (endY.ToVector3() * size); skeletonVertices[(i * 6) + 4] = currentSkeleton.joints[i].transform.GetPositionVector(); skeletonVertices[(i * 6) + 5] = currentSkeleton.joints[i].transform.GetPositionVector() + (endZ.ToVector3() * size); skeletonColours[(i * 6) + 0] = Vector4(1, 0, 0, 1); skeletonColours[(i * 6) + 1] = Vector4(1, 0, 0, 1); skeletonColours[(i * 6) + 2] = Vector4(0, 1, 0, 1); skeletonColours[(i * 6) + 3] = Vector4(0, 1, 0, 1); skeletonColours[(i * 6) + 4] = Vector4(0, 0, 1, 1); skeletonColours[(i * 6) + 5] = Vector4(0, 0, 1, 1); } //You should know what this all does by now, except we combine it with the draw operations in a single function glBindVertexArray(skeletonArray); glBindBuffer(GL_ARRAY_BUFFER, skeletonBuffer); glBufferData(GL_ARRAY_BUFFER, currentSkeleton.numJoints*sizeof(Vector3) * 6, skeletonVertices, GL_STREAM_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, skeletonColourBuffer); glBufferData(GL_ARRAY_BUFFER, currentSkeleton.numJoints*sizeof(Vector4) * 6, skeletonColours, GL_STREAM_DRAW); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(1); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); glLineWidth(2.0f); glDrawArrays(GL_LINES, 0, currentSkeleton.numJoints * 6); // draw Bones glLineWidth(1.0f); glBindVertexArray(0); //Delete the VBO and VAO, and the heap memory we allocated earlier glDeleteVertexArrays(1, &skeletonArray); glDeleteBuffers(1, &skeletonBuffer); glDeleteBuffers(1, &skeletonColourBuffer); delete[]skeletonVertices; delete[]skeletonColours; }