Java Code Examples for com.jme3.scene.VertexBuffer#updateData()
The following examples show how to use
com.jme3.scene.VertexBuffer#updateData() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: DMesh.java From Lemur with BSD 3-Clause "New" or "Revised" License | 6 votes |
protected void morph( VertexBuffer sourcePos, VertexBuffer sourceNorms, VertexBuffer targetPos, VertexBuffer targetNorms ) { FloatBuffer sp = (FloatBuffer)sourcePos.getData(); sp.rewind(); FloatBuffer sn = (FloatBuffer)sourceNorms.getData(); sn.rewind(); FloatBuffer tp = (FloatBuffer)targetPos.getData(); tp.rewind(); FloatBuffer tn = (FloatBuffer)targetNorms.getData(); tn.rewind(); morph(sp, sn, tp, tn); sp.rewind(); sn.rewind(); tp.rewind(); targetPos.updateData(tp); tn.rewind(); targetNorms.updateData(tn); }
Example 2
Source File: SkeletonInterBoneWire.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
/** * The method updates the geometry according to the poitions of the bones. */ public void updateGeometry() { VertexBuffer vb = this.getBuffer(Type.Position); FloatBuffer posBuf = this.getFloatBuffer(Type.Position); posBuf.clear(); for (int i = 0; i < skeleton.getBoneCount(); ++i) { Bone bone = skeleton.getBone(i); Vector3f parentTail = bone.getModelSpacePosition().add(bone.getModelSpaceRotation().mult(Vector3f.UNIT_Y.mult(boneLengths.get(i)))); for (Bone child : bone.getChildren()) { Vector3f childHead = child.getModelSpacePosition(); Vector3f v = childHead.subtract(parentTail); float pointDelta = v.length() / POINT_AMOUNT; v.normalizeLocal().multLocal(pointDelta); Vector3f pointPosition = parentTail.clone(); for (int j = 0; j < POINT_AMOUNT; ++j) { posBuf.put(pointPosition.getX()).put(pointPosition.getY()).put(pointPosition.getZ()); pointPosition.addLocal(v); } } } posBuf.flip(); vb.updateData(posBuf); this.updateBound(); }
Example 3
Source File: WireFrustum.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
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(); }
Example 4
Source File: SkeletonWire.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
/** * The method updates the geometry according to the poitions of the bones. */ public void updateGeometry() { VertexBuffer vb = this.getBuffer(Type.Position); FloatBuffer posBuf = this.getFloatBuffer(Type.Position); posBuf.clear(); for (int i = 0; i < skeleton.getBoneCount(); ++i) { Bone bone = skeleton.getBone(i); Vector3f head = bone.getModelSpacePosition(); posBuf.put(head.getX()).put(head.getY()).put(head.getZ()); if (boneLengths != null) { Vector3f tail = head.add(bone.getModelSpaceRotation().mult(Vector3f.UNIT_Y.mult(boneLengths.get(i)))); posBuf.put(tail.getX()).put(tail.getY()).put(tail.getZ()); } } posBuf.flip(); vb.updateData(posBuf); this.updateBound(); }
Example 5
Source File: Line.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
/** * Alter the start and end. * * @param start the desired mesh location of the start (not null, * unaffected) * @param end the desired mesh location of the end (not null, unaffected) */ public void updatePoints(Vector3f start, Vector3f end) { this.start.set(start); this.end.set(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(); }
Example 6
Source File: WireFrustum.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 6 votes |
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(); }
Example 7
Source File: PoseTrack.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
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()); }
Example 8
Source File: Arrow.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
/** * Sets the arrow's extent. * This will modify the buffers on the mesh. * * @param extent the arrow's extent. */ public void setArrowExtent(Vector3f extent) { float len = extent.length(); // Vector3f dir = extent.normalize(); tempQuat.lookAt(extent, Vector3f.UNIT_Y); tempQuat.normalizeLocal(); VertexBuffer pvb = getBuffer(Type.Position); FloatBuffer buffer = (FloatBuffer)pvb.getData(); buffer.rewind(); for (int i = 0; i < positions.length; i += 3) { Vector3f vec = tempVec.set(positions[i], positions[i + 1], positions[i + 2]); vec.multLocal(len); tempQuat.mult(vec, vec); buffer.put(vec.x); buffer.put(vec.y); buffer.put(vec.z); } pvb.updateData(buffer); updateBound(); updateCounts(); }
Example 9
Source File: Arrow.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
/** * Sets the arrow's extent. * This will modify the buffers on the mesh. * * @param extent the arrow's extent. */ public void setArrowExtent(Vector3f extent) { float len = extent.length(); // Vector3f dir = extent.normalize(); tempQuat.lookAt(extent, Vector3f.UNIT_Y); tempQuat.normalizeLocal(); VertexBuffer pvb = getBuffer(Type.Position); FloatBuffer buffer = (FloatBuffer)pvb.getData(); buffer.rewind(); for (int i = 0; i < positions.length; i += 3) { Vector3f vec = tempVec.set(positions[i], positions[i + 1], positions[i + 2]); vec.multLocal(len); tempQuat.mult(vec, vec); buffer.put(vec.x); buffer.put(vec.y); buffer.put(vec.z); } pvb.updateData(buffer); updateBound(); updateCounts(); }
Example 10
Source File: SkeletonWire.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
public void updateGeometry(){ VertexBuffer vb = getBuffer(Type.Position); FloatBuffer posBuf = getFloatBuffer(Type.Position); posBuf.clear(); for (int i = 0; i < skeleton.getBoneCount(); i++){ Bone bone = skeleton.getBone(i); Vector3f bonePos = bone.getModelSpacePosition(); posBuf.put(bonePos.getX()).put(bonePos.getY()).put(bonePos.getZ()); } posBuf.flip(); vb.updateData(posBuf); updateBound(); }
Example 11
Source File: SkeletonPoints.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
public void updateGeometry(){ VertexBuffer vb = getBuffer(Type.Position); FloatBuffer posBuf = getFloatBuffer(Type.Position); posBuf.clear(); for (int i = 0; i < skeleton.getBoneCount(); i++){ Bone bone = skeleton.getBone(i); Vector3f bonePos = bone.getModelSpacePosition(); posBuf.put(bonePos.getX()).put(bonePos.getY()).put(bonePos.getZ()); } posBuf.flip(); vb.updateData(posBuf); updateBound(); }
Example 12
Source File: ParticlePointMesh.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
@Override public void initParticleData(ParticleEmitter emitter, int numParticles) { setMode(Mode.Points); this.emitter = emitter; // set positions FloatBuffer pb = BufferUtils.createVector3Buffer(numParticles); VertexBuffer pvb = new VertexBuffer(VertexBuffer.Type.Position); pvb.setupData(Usage.Stream, 3, Format.Float, pb); //if the buffer is already set only update the data VertexBuffer buf = getBuffer(VertexBuffer.Type.Position); if (buf != null) { buf.updateData(pb); } else { setBuffer(pvb); } // set colors ByteBuffer cb = BufferUtils.createByteBuffer(numParticles * 4); VertexBuffer cvb = new VertexBuffer(VertexBuffer.Type.Color); cvb.setupData(Usage.Stream, 4, Format.UnsignedByte, cb); cvb.setNormalized(true); buf = getBuffer(VertexBuffer.Type.Color); if (buf != null) { buf.updateData(cb); } else { setBuffer(cvb); } // set sizes FloatBuffer sb = BufferUtils.createFloatBuffer(numParticles); VertexBuffer svb = new VertexBuffer(VertexBuffer.Type.Size); svb.setupData(Usage.Stream, 1, Format.Float, sb); buf = getBuffer(VertexBuffer.Type.Size); if (buf != null) { buf.updateData(sb); } else { setBuffer(svb); } // set UV-scale FloatBuffer tb = BufferUtils.createFloatBuffer(numParticles*4); VertexBuffer tvb = new VertexBuffer(VertexBuffer.Type.TexCoord); tvb.setupData(Usage.Stream, 4, Format.Float, tb); buf = getBuffer(VertexBuffer.Type.TexCoord); if (buf != null) { buf.updateData(tb); } else { setBuffer(tvb); } }
Example 13
Source File: ParticleTriMesh.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
@Override public void initParticleData(ParticleEmitter emitter, int numParticles) { setMode(Mode.Triangles); this.emitter = emitter; particlesCopy = new Particle[numParticles]; // set positions FloatBuffer pb = BufferUtils.createVector3Buffer(numParticles * 4); VertexBuffer pvb = new VertexBuffer(VertexBuffer.Type.Position); pvb.setupData(Usage.Stream, 3, Format.Float, pb); //if the buffer is already set only update the data VertexBuffer buf = getBuffer(VertexBuffer.Type.Position); if (buf != null) { buf.updateData(pb); } else { setBuffer(pvb); } // set colors ByteBuffer cb = BufferUtils.createByteBuffer(numParticles * 4 * 4); VertexBuffer cvb = new VertexBuffer(VertexBuffer.Type.Color); cvb.setupData(Usage.Stream, 4, Format.UnsignedByte, cb); cvb.setNormalized(true); buf = getBuffer(VertexBuffer.Type.Color); if (buf != null) { buf.updateData(cb); } else { setBuffer(cvb); } // set texcoords VertexBuffer tvb = new VertexBuffer(VertexBuffer.Type.TexCoord); FloatBuffer tb = BufferUtils.createVector2Buffer(numParticles * 4); uniqueTexCoords = false; for (int i = 0; i < numParticles; i++){ tb.put(0f).put(1f); tb.put(1f).put(1f); tb.put(0f).put(0f); tb.put(1f).put(0f); } tb.flip(); tvb.setupData(Usage.Static, 2, Format.Float, tb); buf = getBuffer(VertexBuffer.Type.TexCoord); if (buf != null) { buf.updateData(tb); } else { setBuffer(tvb); } // set indices ShortBuffer ib = BufferUtils.createShortBuffer(numParticles * 6); for (int i = 0; i < numParticles; i++){ int startIdx = (i * 4); // triangle 1 ib.put((short)(startIdx + 1)) .put((short)(startIdx + 0)) .put((short)(startIdx + 2)); // triangle 2 ib.put((short)(startIdx + 1)) .put((short)(startIdx + 2)) .put((short)(startIdx + 3)); } ib.flip(); VertexBuffer ivb = new VertexBuffer(VertexBuffer.Type.Index); ivb.setupData(Usage.Static, 3, Format.UnsignedShort, ib); buf = getBuffer(VertexBuffer.Type.Index); if (buf != null) { buf.updateData(ib); } else { setBuffer(ivb); } }
Example 14
Source File: SkeletonControl.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
private void softwareSkinUpdate(Mesh mesh, Matrix4f[] offsetMatrices) { int maxWeightsPerVert = mesh.getMaxNumWeights(); int fourMinusMaxWeights = 4 - maxWeightsPerVert; // NOTE: This code assumes the vertex buffer is in bind pose // resetToBind() has been called this frame VertexBuffer vb = mesh.getBuffer(VertexBuffer.Type.Position); FloatBuffer fvb = (FloatBuffer) vb.getData(); fvb.rewind(); VertexBuffer nb = mesh.getBuffer(VertexBuffer.Type.Normal); FloatBuffer fnb = (FloatBuffer) nb.getData(); fnb.rewind(); // get boneIndexes and weights for mesh ByteBuffer ib = (ByteBuffer) mesh.getBuffer(VertexBuffer.Type.BoneIndex).getData(); FloatBuffer wb = (FloatBuffer) mesh.getBuffer(VertexBuffer.Type.BoneWeight).getData(); ib.rewind(); wb.rewind(); float[] weights = wb.array(); byte[] indices = ib.array(); int idxWeights = 0; TempVars vars = TempVars.get(); float[] posBuf = vars.skinPositions; float[] normBuf = vars.skinNormals; int iterations = (int) FastMath.ceil(fvb.capacity() / ((float) posBuf.length)); int bufLength = posBuf.length * 3; for (int i = iterations - 1; i >= 0; i--) { // read next set of positions and normals from native buffer bufLength = Math.min(posBuf.length, fvb.remaining()); fvb.get(posBuf, 0, bufLength); fnb.get(normBuf, 0, bufLength); int verts = bufLength / 3; int idxPositions = 0; // iterate vertices and apply skinning transform for each effecting bone for (int vert = verts - 1; vert >= 0; vert--) { float nmx = normBuf[idxPositions]; float vtx = posBuf[idxPositions++]; float nmy = normBuf[idxPositions]; float vty = posBuf[idxPositions++]; float nmz = normBuf[idxPositions]; float vtz = posBuf[idxPositions++]; float rx = 0, ry = 0, rz = 0, rnx = 0, rny = 0, rnz = 0; for (int w = maxWeightsPerVert - 1; w >= 0; w--) { float weight = weights[idxWeights]; Matrix4f mat = offsetMatrices[indices[idxWeights++]]; rx += (mat.m00 * vtx + mat.m01 * vty + mat.m02 * vtz + mat.m03) * weight; ry += (mat.m10 * vtx + mat.m11 * vty + mat.m12 * vtz + mat.m13) * weight; rz += (mat.m20 * vtx + mat.m21 * vty + mat.m22 * vtz + mat.m23) * weight; rnx += (nmx * mat.m00 + nmy * mat.m01 + nmz * mat.m02) * weight; rny += (nmx * mat.m10 + nmy * mat.m11 + nmz * mat.m12) * weight; rnz += (nmx * mat.m20 + nmy * mat.m21 + nmz * mat.m22) * weight; } idxWeights += fourMinusMaxWeights; idxPositions -= 3; normBuf[idxPositions] = rnx; posBuf[idxPositions++] = rx; normBuf[idxPositions] = rny; posBuf[idxPositions++] = ry; normBuf[idxPositions] = rnz; posBuf[idxPositions++] = rz; } fvb.position(fvb.position() - bufLength); fvb.put(posBuf, 0, bufLength); fnb.position(fnb.position() - bufLength); fnb.put(normBuf, 0, bufLength); } vb.updateData(fvb); nb.updateData(fnb); // mesh.updateBound(); }
Example 15
Source File: LodGenerator.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
private VertexBuffer makeLod(Mesh mesh) { VertexBuffer indexBuffer = mesh.getBuffer(VertexBuffer.Type.Index); boolean isShortBuffer = indexBuffer.getFormat() == VertexBuffer.Format.UnsignedShort; // Create buffers. VertexBuffer lodBuffer = new VertexBuffer(VertexBuffer.Type.Index); int bufsize = indexCount == 0 ? 3 : indexCount; if (isShortBuffer) { lodBuffer.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.UnsignedShort, BufferUtils.createShortBuffer(bufsize)); } else { lodBuffer.setupData(VertexBuffer.Usage.Static, 3, VertexBuffer.Format.UnsignedInt, BufferUtils.createIntBuffer(bufsize)); } lodBuffer.getData().rewind(); //Check if we should fill it with a "dummy" triangle. if (indexCount == 0) { if (isShortBuffer) { for (int m = 0; m < 3; m++) { ((ShortBuffer) lodBuffer.getData()).put((short) 0); } } else { for (int m = 0; m < 3; m++) { ((IntBuffer) lodBuffer.getData()).put(0); } } } // Fill buffers. Buffer buf = lodBuffer.getData(); buf.rewind(); for (Triangle triangle : triangleList) { if (!triangle.isRemoved) { // assert (indexCount != 0); if (isShortBuffer) { for (int m = 0; m < 3; m++) { ((ShortBuffer) buf).put((short) triangle.vertexId[m]); } } else { for (int m = 0; m < 3; m++) { ((IntBuffer) buf).put(triangle.vertexId[m]); } } } } buf.clear(); lodBuffer.updateData(buf); return lodBuffer; }
Example 16
Source File: ParticleTriMesh.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
@Override public void initParticleData(ParticleEmitter emitter, int numParticles) { setMode(Mode.Triangles); this.emitter = emitter; // particlesCopy = new Particle[numParticles]; // set positions FloatBuffer pb = BufferUtils.createVector3Buffer(numParticles * 4); // if the buffer is already set only update the data VertexBuffer buf = getBuffer(VertexBuffer.Type.Position); if (buf != null) { buf.updateData(pb); } else { VertexBuffer pvb = new VertexBuffer(VertexBuffer.Type.Position); pvb.setupData(Usage.Stream, 3, Format.Float, pb); setBuffer(pvb); } // set colors ByteBuffer cb = BufferUtils.createByteBuffer(numParticles * 4 * 4); buf = getBuffer(VertexBuffer.Type.Color); if (buf != null) { buf.updateData(cb); } else { VertexBuffer cvb = new VertexBuffer(VertexBuffer.Type.Color); cvb.setupData(Usage.Stream, 4, Format.UnsignedByte, cb); cvb.setNormalized(true); setBuffer(cvb); } // set texcoords FloatBuffer tb = BufferUtils.createVector2Buffer(numParticles * 4); uniqueTexCoords = false; for (int i = 0; i < numParticles; i++){ tb.put(0f).put(1f); tb.put(1f).put(1f); tb.put(0f).put(0f); tb.put(1f).put(0f); } tb.flip(); buf = getBuffer(VertexBuffer.Type.TexCoord); if (buf != null) { buf.updateData(tb); } else { VertexBuffer tvb = new VertexBuffer(VertexBuffer.Type.TexCoord); tvb.setupData(Usage.Static, 2, Format.Float, tb); setBuffer(tvb); } // set indices ShortBuffer ib = BufferUtils.createShortBuffer(numParticles * 6); for (int i = 0; i < numParticles; i++){ int startIdx = (i * 4); // triangle 1 ib.put((short)(startIdx + 1)) .put((short)(startIdx + 0)) .put((short)(startIdx + 2)); // triangle 2 ib.put((short)(startIdx + 1)) .put((short)(startIdx + 2)) .put((short)(startIdx + 3)); } ib.flip(); buf = getBuffer(VertexBuffer.Type.Index); if (buf != null) { buf.updateData(ib); } else { VertexBuffer ivb = new VertexBuffer(VertexBuffer.Type.Index); ivb.setupData(Usage.Static, 3, Format.UnsignedShort, ib); setBuffer(ivb); } updateCounts(); }
Example 17
Source File: ParticlePointMesh.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
@Override public void updateParticleData(Particle[] particles, Camera cam, Matrix3f inverseRotation) { VertexBuffer pvb = getBuffer(VertexBuffer.Type.Position); FloatBuffer positions = (FloatBuffer) pvb.getData(); VertexBuffer cvb = getBuffer(VertexBuffer.Type.Color); ByteBuffer colors = (ByteBuffer) cvb.getData(); VertexBuffer svb = getBuffer(VertexBuffer.Type.Size); FloatBuffer sizes = (FloatBuffer) svb.getData(); VertexBuffer tvb = getBuffer(VertexBuffer.Type.TexCoord); FloatBuffer texcoords = (FloatBuffer) tvb.getData(); float sizeScale = emitter.getWorldScale().x; // update data in vertex buffers positions.rewind(); colors.rewind(); sizes.rewind(); texcoords.rewind(); for (int i = 0; i < particles.length; i++){ Particle p = particles[i]; positions.put(p.position.x) .put(p.position.y) .put(p.position.z); sizes.put(p.size * sizeScale); colors.putInt(p.color.asIntABGR()); int imgX = p.imageIndex % imagesX; int imgY = p.imageIndex/imagesX; float startX = ((float) imgX) / imagesX; float startY = ((float) imgY) / imagesY; float endX = startX + (1f / imagesX); float endY = startY + (1f / imagesY); texcoords.put(startX).put(startY).put(endX).put(endY); } positions.flip(); colors.flip(); sizes.flip(); texcoords.flip(); // force renderer to re-send data to GPU pvb.updateData(positions); cvb.updateData(colors); svb.updateData(sizes); tvb.updateData(texcoords); }
Example 18
Source File: ParticlePointMesh.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 4 votes |
@Override public void initParticleData(ParticleEmitter emitter, int numParticles) { setMode(Mode.Points); this.emitter = emitter; // set positions FloatBuffer pb = BufferUtils.createVector3Buffer(numParticles); //if the buffer is already set only update the data VertexBuffer buf = getBuffer(VertexBuffer.Type.Position); if (buf != null) { buf.updateData(pb); } else { VertexBuffer pvb = new VertexBuffer(VertexBuffer.Type.Position); pvb.setupData(Usage.Stream, 3, Format.Float, pb); setBuffer(pvb); } // set colors ByteBuffer cb = BufferUtils.createByteBuffer(numParticles * 4); buf = getBuffer(VertexBuffer.Type.Color); if (buf != null) { buf.updateData(cb); } else { VertexBuffer cvb = new VertexBuffer(VertexBuffer.Type.Color); cvb.setupData(Usage.Stream, 4, Format.UnsignedByte, cb); cvb.setNormalized(true); setBuffer(cvb); } // set sizes FloatBuffer sb = BufferUtils.createFloatBuffer(numParticles); buf = getBuffer(VertexBuffer.Type.Size); if (buf != null) { buf.updateData(sb); } else { VertexBuffer svb = new VertexBuffer(VertexBuffer.Type.Size); svb.setupData(Usage.Stream, 1, Format.Float, sb); setBuffer(svb); } // set UV-scale FloatBuffer tb = BufferUtils.createFloatBuffer(numParticles*4); buf = getBuffer(VertexBuffer.Type.TexCoord); if (buf != null) { buf.updateData(tb); } else { VertexBuffer tvb = new VertexBuffer(VertexBuffer.Type.TexCoord); tvb.setupData(Usage.Stream, 4, Format.Float, tb); setBuffer(tvb); } updateCounts(); }
Example 19
Source File: ParticlePointMesh.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
@Override public void updateParticleData(Particle[] particles, Camera cam, Matrix3f inverseRotation) { VertexBuffer pvb = getBuffer(VertexBuffer.Type.Position); FloatBuffer positions = (FloatBuffer) pvb.getData(); VertexBuffer cvb = getBuffer(VertexBuffer.Type.Color); ByteBuffer colors = (ByteBuffer) cvb.getData(); VertexBuffer svb = getBuffer(VertexBuffer.Type.Size); FloatBuffer sizes = (FloatBuffer) svb.getData(); VertexBuffer tvb = getBuffer(VertexBuffer.Type.TexCoord); FloatBuffer texcoords = (FloatBuffer) tvb.getData(); float sizeScale = emitter.getWorldScale().x; // update data in vertex buffers positions.rewind(); colors.rewind(); sizes.rewind(); texcoords.rewind(); for (int i = 0; i < particles.length; i++){ Particle p = particles[i]; positions.put(p.position.x) .put(p.position.y) .put(p.position.z); sizes.put(p.size * sizeScale); colors.putInt(p.color.asIntABGR()); int imgX = p.imageIndex % imagesX; int imgY = (p.imageIndex - imgX) / imagesY; float startX = ((float) imgX) / imagesX; float startY = ((float) imgY) / imagesY; float endX = startX + (1f / imagesX); float endY = startY + (1f / imagesY); texcoords.put(startX).put(startY).put(endX).put(endY); } positions.flip(); colors.flip(); sizes.flip(); texcoords.flip(); // force renderer to re-send data to GPU pvb.updateData(positions); cvb.updateData(colors); svb.updateData(sizes); tvb.updateData(texcoords); }
Example 20
Source File: Line.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 3 votes |
/** * 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.put(start.x).put(start.y).put(start.z); fb.put(end.x).put(end.y).put(end.z); posBuf.updateData(fb); updateBound(); }