/** * Determines if the mesh uses bone animation. * * A mesh uses bone animation if it has bone index / weight buffers * such as {@link Type#BoneIndex} or {@link Type#HWBoneIndex}. * * @return true if the mesh uses bone animation, false otherwise */ public boolean isAnimated() { return getBuffer(Type.BoneIndex) != null || getBuffer(Type.HWBoneIndex) != null; }
@Override public void visit(Spatial spatial) { if (spatial instanceof Geometry) { Geometry geom = (Geometry) spatial; Mesh mesh = geom.getMesh(); // Check to ensure mesh has texcoords and normals before generating if (mesh.getBuffer(Type.TexCoord) != null && mesh.getBuffer(Type.Normal) != null) { meshes.add(mesh); } } } });
/** * Get the {@link VertexBuffer} data stored on this mesh in float * format. * * @param type The type of VertexBuffer * @return the VertexBuffer data, or null if not set */ public FloatBuffer getFloatBuffer(Type type) { VertexBuffer vb = getBuffer(type); if (vb == null) { return null; } return (FloatBuffer) vb.getData(); }
/** * Get the {@link VertexBuffer} data stored on this mesh in short * format. * * @param type The type of VertexBuffer * @return the VertexBuffer data, or null if not set */ public ShortBuffer getShortBuffer(Type type) { VertexBuffer vb = getBuffer(type); if (vb == null) { return null; } return (ShortBuffer) vb.getData(); }
@Override public void getTexCoord(float[] texOut, int face, int vert) { int vertIndex = getIndex(face, vert); VertexBuffer texCoord = mesh.getBuffer(VertexBuffer.Type.TexCoord); FloatBuffer tex = (FloatBuffer) texCoord.getData(); tex.position(vertIndex * 2); texOut[0] = tex.get(); texOut[1] = tex.get(); }
@Override public void getPosition(float[] posOut, int face, int vert) { int vertIndex = getIndex(face, vert); VertexBuffer position = mesh.getBuffer(VertexBuffer.Type.Position); FloatBuffer pos = (FloatBuffer) position.getData(); pos.position(vertIndex * 3); posOut[0] = pos.get(); posOut[1] = pos.get(); posOut[2] = pos.get(); }
@Override public void getNormal(float[] normOut, int face, int vert) { int vertIndex = getIndex(face, vert); VertexBuffer normal = mesh.getBuffer(VertexBuffer.Type.Normal); FloatBuffer norm = (FloatBuffer) normal.getData(); norm.position(vertIndex * 3); normOut[0] = norm.get(); normOut[1] = norm.get(); normOut[2] = norm.get(); }
protected void updateMesh() { FloatBuffer pb = (FloatBuffer)mesh.getBuffer(Type.Position).getData(); pb.rewind(); float scale = 1 / 1000000f; // scaled to ms as pixels for( int i = 0; i < size; i++ ) { float t1 = frames[i * 2] * scale; float t2 = frames[i * 2 + 1] * scale; pb.put(i).put(0).put(0); pb.put(i).put(t1).put(0); pb.put(i).put(t1).put(0); pb.put(i).put(t2).put(0); } mesh.setBuffer(Type.Position, 3, pb); }
private void pushAttrib(Type type, Attributes attribs) throws SAXException { try { FloatBuffer buf = (FloatBuffer) mesh.getBuffer(type).getData(); buf.put(parseFloat(attribs.getValue("x"))).put(parseFloat(attribs.getValue("y"))).put(parseFloat(attribs.getValue("z"))); } catch (Exception ex) { throw new SAXException("Failed to push attrib", ex); } }
protected Vector3f getMeshNormal(int x, int z) { if (x >= size || z >= size) return null; // out of range int index = (z*size+x)*3; FloatBuffer nb = (FloatBuffer)this.getMesh().getBuffer(Type.Normal).getData(); Vector3f normal = new Vector3f(); normal.x = nb.get(index); normal.y = nb.get(index+1); normal.z = nb.get(index+2); return normal; }
private void pushTangent(Attributes attribs) throws SAXException { try { VertexBuffer tangentBuf = mesh.getBuffer(Type.Tangent); FloatBuffer buf = (FloatBuffer) tangentBuf.getData(); buf.put(parseFloat(attribs.getValue("x"))).put(parseFloat(attribs.getValue("y"))).put(parseFloat(attribs.getValue("z"))); if (tangentBuf.getNumComponents() == 4) { buf.put(parseFloat(attribs.getValue("w"))); } } catch (Exception ex) { throw new SAXException("Failed to push attrib", ex); } }
public static Mesh genTbnLines(Mesh mesh, float scale) { if (mesh.getBuffer(Type.Tangent) == null) { return genNormalLines(mesh, scale); } else { return genTangentLines(mesh, scale); } }
/** * Updates the bounding volume of this mesh. * The method does nothing if the mesh has no {@link Type#Position} buffer. * It is expected that the position buffer is a float buffer with 3 components. */ public void updateBound(){ VertexBuffer posBuf = getBuffer(VertexBuffer.Type.Position); if (meshBound != null && posBuf != null){ meshBound.computeFromPoints((FloatBuffer)posBuf.getData()); } }
private void activateBuffer(Mesh mesh, int idx, int start, FloatBuffer b) { VertexBuffer.Type t = bufferTypes[start + idx]; VertexBuffer vb = mesh.getBuffer(t); // only set the buffer if it's different if (vb == null || vb.getData() != b) { mesh.setBuffer(t, 3, b); } }
@Override public void setTSpaceBasic(float[] tangent, float sign, int face, int vert) { int vertIndex = getIndex(face, vert); VertexBuffer tangentBuffer = mesh.getBuffer(VertexBuffer.Type.Tangent); FloatBuffer tan = (FloatBuffer) tangentBuffer.getData(); tan.position(vertIndex * 4); tan.put(tangent); tan.put(sign); tan.rewind(); tangentBuffer.setUpdateNeeded(); }
private void setInBuffer(Mesh mesh, int index, Vector3f normal, Vector3f tangent, Vector3f binormal) { VertexBuffer NB = mesh.getBuffer(Type.Normal); VertexBuffer TB = mesh.getBuffer(Type.Tangent); VertexBuffer BB = mesh.getBuffer(Type.Binormal); BufferUtils.setInBuffer(normal, (FloatBuffer)NB.getData(), index); BufferUtils.setInBuffer(tangent, (FloatBuffer)TB.getData(), index); BufferUtils.setInBuffer(binormal, (FloatBuffer)BB.getData(), index); NB.setUpdateNeeded(); TB.setUpdateNeeded(); BB.setUpdateNeeded(); }
/** * recalculate all of the normal vectors in this terrain patch */ protected void updateNormals() { FloatBuffer newNormalBuffer = geomap.writeNormalArray(null, getWorldScale()); getMesh().getBuffer(Type.Normal).updateData(newNormalBuffer); FloatBuffer newTangentBuffer = null; FloatBuffer newBinormalBuffer = null; FloatBuffer[] tb = geomap.writeTangentArray(newNormalBuffer, newTangentBuffer, newBinormalBuffer, (FloatBuffer)getMesh().getBuffer(Type.TexCoord).getData(), getWorldScale()); newTangentBuffer = tb[0]; newBinormalBuffer = tb[1]; getMesh().getBuffer(Type.Tangent).updateData(newTangentBuffer); getMesh().getBuffer(Type.Binormal).updateData(newBinormalBuffer); }
private void applyFrame(Mesh target, int frameIndex, float weight){ PoseFrame frame = frames[frameIndex]; VertexBuffer pb = target.getBuffer(Type.Position); for (int i = 0; i < frame.poses.length; i++){ Pose pose = frame.poses[i]; float poseWeight = frame.weights[i] * weight; pose.apply(poseWeight, (FloatBuffer) pb.getData()); } // force to re-upload data to gpu pb.updateData(pb.getData()); }
public static void setSkinBuffers(Mesh mesh, short[] jointsArray, float[] weightsArray, int componentSize) { if (componentSize == 1) { mesh.setBuffer(VertexBuffer.Type.BoneIndex, 4, BufferUtils.createByteBuffer(toByteArray(jointsArray))); } else { mesh.setBuffer(VertexBuffer.Type.BoneIndex, 4, BufferUtils.createShortBuffer(jointsArray)); } mesh.setBuffer(VertexBuffer.Type.BoneWeight, 4, BufferUtils.createFloatBuffer(weightsArray)); mesh.getBuffer(VertexBuffer.Type.BoneIndex).setUsage(VertexBuffer.Usage.CpuOnly); mesh.getBuffer(VertexBuffer.Type.BoneWeight).setUsage(VertexBuffer.Usage.CpuOnly); }
private void initOpenCL2() { //bind vertex buffer to OpenCL VertexBuffer vb = geom.getMesh().getBuffer(VertexBuffer.Type.Position); buffer = clContext.bindVertexBuffer(vb, MemoryAccess.READ_WRITE).register(); ws = new com.jme3.opencl.Kernel.WorkSize(geom.getMesh().getVertexCount()); } private void updateOpenCL(float tpf) {