1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.jme3.scene.debug; 34 35 import com.jme3.animation.Bone; 36 import com.jme3.animation.Skeleton; 37 import com.jme3.math.Vector3f; 38 import com.jme3.scene.Mesh; 39 import com.jme3.scene.VertexBuffer; 40 import com.jme3.scene.VertexBuffer.Format; 41 import com.jme3.scene.VertexBuffer.Type; 42 import com.jme3.scene.VertexBuffer.Usage; 43 import com.jme3.util.BufferUtils; 44 import java.nio.FloatBuffer; 45 import java.nio.ShortBuffer; 46 47 public class SkeletonWire extends Mesh { 48 49 private int numConnections = 0; 50 private Skeleton skeleton; 51 countConnections(Bone bone)52 private void countConnections(Bone bone){ 53 for (Bone child : bone.getChildren()){ 54 numConnections ++; 55 countConnections(child); 56 } 57 } 58 writeConnections(ShortBuffer indexBuf, Bone bone)59 private void writeConnections(ShortBuffer indexBuf, Bone bone){ 60 for (Bone child : bone.getChildren()){ 61 // write myself 62 indexBuf.put( (short) skeleton.getBoneIndex(bone) ); 63 // write the child 64 indexBuf.put( (short) skeleton.getBoneIndex(child) ); 65 66 writeConnections(indexBuf, child); 67 } 68 } 69 SkeletonWire(Skeleton skeleton)70 public SkeletonWire(Skeleton skeleton){ 71 this.skeleton = skeleton; 72 for (Bone bone : skeleton.getRoots()) 73 countConnections(bone); 74 75 setMode(Mode.Lines); 76 77 VertexBuffer pb = new VertexBuffer(Type.Position); 78 FloatBuffer fpb = BufferUtils.createFloatBuffer(skeleton.getBoneCount() * 3); 79 pb.setupData(Usage.Stream, 3, Format.Float, fpb); 80 setBuffer(pb); 81 82 VertexBuffer ib = new VertexBuffer(Type.Index); 83 ShortBuffer sib = BufferUtils.createShortBuffer(numConnections * 2); 84 ib.setupData(Usage.Static, 2, Format.UnsignedShort, sib); 85 setBuffer(ib); 86 87 for (Bone bone : skeleton.getRoots()) 88 writeConnections(sib, bone); 89 sib.flip(); 90 91 updateCounts(); 92 } 93 updateGeometry()94 public void updateGeometry(){ 95 VertexBuffer vb = getBuffer(Type.Position); 96 FloatBuffer posBuf = getFloatBuffer(Type.Position); 97 posBuf.clear(); 98 for (int i = 0; i < skeleton.getBoneCount(); i++){ 99 Bone bone = skeleton.getBone(i); 100 Vector3f bonePos = bone.getModelSpacePosition(); 101 102 posBuf.put(bonePos.getX()).put(bonePos.getY()).put(bonePos.getZ()); 103 } 104 posBuf.flip(); 105 vb.updateData(posBuf); 106 107 updateBound(); 108 } 109 } 110