Java Code Examples for com.jme3.scene.VertexBuffer#setUpdateNeeded()
The following examples show how to use
com.jme3.scene.VertexBuffer#setUpdateNeeded() .
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: TerrainPatch.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 6 votes |
protected void setHeight(List<LocationHeight> locationHeights, boolean overrideHeight) { final float[] heightArray = geomap.getHeightArray(); final VertexBuffer vertexBuffer = mesh.getBuffer(Type.Position); final FloatBuffer floatBuffer = mesh.getFloatBuffer(Type.Position); for (LocationHeight lh : locationHeights) { if (lh.x < 0 || lh.z < 0 || lh.x >= size || lh.z >= size) { continue; } int idx = lh.z * size + lh.x; if (overrideHeight) { heightArray[idx] = lh.h; } else { float currentHeight = floatBuffer.get(idx * 3 + 1); heightArray[idx] = currentHeight + lh.h; } } floatBuffer.clear(); geomap.writeVertexArray(floatBuffer, stepScale, false); vertexBuffer.setUpdateNeeded(); }
Example 2
Source File: PMDNode.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 6 votes |
void _resetToBind(PMDMesh mesh) { VertexBuffer vb = mesh.getBuffer(VertexBuffer.Type.Position); FloatBuffer vfb = (FloatBuffer) vb.getData(); VertexBuffer nb = mesh.getBuffer(VertexBuffer.Type.Normal); FloatBuffer nfb = (FloatBuffer) nb.getData(); VertexBuffer bvb = mesh.getBuffer(VertexBuffer.Type.BindPosePosition); FloatBuffer bvfb = (FloatBuffer) bvb.getData(); VertexBuffer bnb = mesh.getBuffer(VertexBuffer.Type.BindPoseNormal); FloatBuffer bnfb = (FloatBuffer) bnb.getData(); for (int i = 0; i < vfb.capacity(); i++) { vfb.put(i, bvfb.get(i)); } for (int i = 0; i < nfb.capacity(); i++) { nfb.put(i, bnfb.get(i)); } vb.setUpdateNeeded(); nb.setUpdateNeeded(); }
Example 3
Source File: PMDNode.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 6 votes |
void resetToBindSkinBackData(PMDSkinMesh mesh) { VertexBuffer vb = mesh.getSkinvb2(); // mesh.getBuffer(VertexBuffer.Type.Position); FloatBuffer vfb = (FloatBuffer) vb.getData(); // VertexBuffer nb = mesh.getSkinnb2(); //mesh.getBuffer(VertexBuffer.Type.Normal); // FloatBuffer nfb = (FloatBuffer) nb.getData(); VertexBuffer bvb = mesh.getBuffer(VertexBuffer.Type.BindPosePosition); FloatBuffer bvfb = (FloatBuffer) bvb.getData(); VertexBuffer bnb = mesh.getBuffer(VertexBuffer.Type.BindPoseNormal); FloatBuffer bnfb = (FloatBuffer) bnb.getData(); for (int i = 0; i < vfb.capacity(); i++) { vfb.put(i, bvfb.get(i)); } // for (int i = 0; i < nfb.capacity(); i++) { // nfb.put(i, bnfb.get(i)); // } vb.setUpdateNeeded(); // nb.setUpdateNeeded(); }
Example 4
Source File: TerrainPatch.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
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(); }
Example 5
Source File: MikkTSpaceImpl.java From jmonkeyengine with BSD 3-Clause "New" or "Revised" License | 5 votes |
@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(); }
Example 6
Source File: TerrainPatch.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 5 votes |
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(); }
Example 7
Source File: SkeletonControl.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
void updateSkinMesh(PMDSkinMesh skinMesh) { VertexBuffer vb = skinMesh.getBuffer(Type.Position); FloatBuffer fvb = (FloatBuffer) vb.getData(); VertexBuffer nb = skinMesh.getBuffer(Type.Normal); FloatBuffer fnb = (FloatBuffer) nb.getData(); fvb.position(0); fnb.position(0); for (int i = 0; i < skinPosArray.length; i++) { int idxWeights = 0; TempVars vars = TempVars.get(); float[] posBuf = vars.skinPositions; float[] normBuf = vars.skinNormals; // read next set of positions and normals from native buffer int idxPositions = 0; // iterate vertices and apply skinning transform for each effecting bone float nmx = skinNormalArray[i].x;//normBuf[idxPositions]; float vtx = skinPosArray[i].x;//posBuf[idxPositions++]; float nmy = skinNormalArray[i].y;//normBuf[idxPositions]; float vty = skinPosArray[i].y;//posBuf[idxPositions++]; float nmz = skinNormalArray[i].z;//normBuf[idxPositions]; float vtz = skinPosArray[i].z;//posBuf[idxPositions++]; float rx = 0, ry = 0, rz = 0, rnx = 0, rny = 0, rnz = 0; for (int w = 2 - 1; w >= 0; w--) { float weight = skinBoneWeightArray[i];//(float) v.getBoneWeight();//weights[idxWeights]; if (w == 1) { weight = 1f - weight; } //weight = weight / 100f; Matrix4f mat = offsetMatrices[skinBoneArray[i * 2 + w]]; 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; } fnb.put(rnx).put(rny).put(rnz); fvb.put(rx).put(ry).put(rz); } vb.setUpdateNeeded(); nb.setUpdateNeeded(); }
Example 8
Source File: PMDNode.java From MikuMikuStudio with BSD 2-Clause "Simplified" License | 4 votes |
private void softwareSkinUpdate(PMDMesh mesh){ int maxWeightsPerVert = 2;//mesh.getMaxNumWeights(); int fourMinusMaxWeights = 4 - maxWeightsPerVert; // Matrix4f[] offsetMatrices = mesh.getBoneMatrixArray(); // NOTE: This code assumes the vertex buffer is in bind pose // resetToBind() has been called this frame resetToBind(mesh); 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(); FloatBuffer fvb2 = (FloatBuffer)mesh.getVbBackup().getData(); fvb2.rewind(); FloatBuffer fnb2 = (FloatBuffer)mesh.getNbBackup().getData(); fnb2.rewind(); // get boneIndexes and weights for mesh ShortBuffer ib = (ShortBuffer) mesh.getBuffer(VertexBuffer.Type.BoneIndex).getData(); FloatBuffer wb = (FloatBuffer) mesh.getBuffer(VertexBuffer.Type.BoneWeight).getData(); ib.rewind(); wb.rewind(); // float[] weights = wb.array(); // short[] 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()); fvb2.get(posBuf, 0, bufLength); fnb2.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 = wb.get(idxWeights); //weights[idxWeights]; Matrix4f mat = mesh.getBoneMatrixArray()[ib.get(idxWeights++)];//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(fvb2.position()-bufLength); fvb.put(posBuf, 0, bufLength); // fnb.position(fnb2.position()-bufLength); fnb.put(normBuf, 0, bufLength); } vb.setUpdateNeeded(); nb.setUpdateNeeded(); vars.release(); // mesh.updateBound(); }