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 vote down vote up
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 vote down vote up
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 vote down vote up
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 vote down vote up
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 vote down vote up
@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 vote down vote up
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 vote down vote up
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 vote down vote up
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();
    }