private FloatBuffer getFloatBuffer(VertexBuffer vb) { if (vb == null) { return null; } return (FloatBuffer) vb.getData(); }
/** * 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(); }
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()); }
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); } }
/** * Update the start and end points of the line. */ public void updatePoints(Vector3f start, Vector3f end) { VertexBuffer posBuf = getBuffer(Type.Position); FloatBuffer fb = (FloatBuffer) posBuf.getData(); fb.rewind(); fb.put(start.x).put(start.y).put(start.z); fb.put(end.x).put(end.y).put(end.z); posBuf.updateData(fb); updateBound(); }
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); } }
/** * 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(); }
/** * Get the index buffer for this mesh. * Will return <code>null</code> if no index buffer is set. * * @return The index buffer of this mesh. * * @see Type#Index */ public IndexBuffer getIndexBuffer() { VertexBuffer vb = getBuffer(Type.Index); if (vb == null) { return null; } return IndexBuffer.wrapIndexBuffer(vb.getData()); }
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(); }
public void update(Vector3f[] points){ VertexBuffer vb = getBuffer(Type.Position); if (vb == null){ setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(points)); return; } FloatBuffer b = BufferUtils.createFloatBuffer(points); FloatBuffer a = (FloatBuffer) vb.getData(); b.rewind(); a.rewind(); a.put(b); a.rewind(); vb.updateData(a); updateBound(); }
private void setColor(Geometry g, ColorRGBA color) { float[] colors = new float[g.getMesh().getVertexCount() * 4]; for (int i = 0; i < g.getMesh().getVertexCount() * 4; i += 4) { colors[i] = color.r; colors[i + 1] = color.g; colors[i + 2] = color.b; colors[i + 3] = color.a; } VertexBuffer colorBuff = g.getMesh().getBuffer(VertexBuffer.Type.Color); if (colorBuff == null) { g.getMesh().setBuffer(VertexBuffer.Type.Color, 4, colors); } else { FloatBuffer cBuff = (FloatBuffer) colorBuff.getData(); cBuff.rewind(); cBuff.put(colors); colorBuff.updateData(cBuff); } }
/** * 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); }