private int bindMorphtargetBuffer(Mesh mesh, int targetNumBuffers, int boundBufferIdx, MorphTarget t) { int start = VertexBuffer.Type.MorphTarget0.ordinal(); if (targetNumBuffers >= 1) { activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Position)); boundBufferIdx++; } if (targetNumBuffers >= 2) { activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Normal)); boundBufferIdx++; } if (!approximateTangents && targetNumBuffers == 3) { activateBuffer(mesh, boundBufferIdx, start, t.getBuffer(VertexBuffer.Type.Tangent)); boundBufferIdx++; } return boundBufferIdx; }
private void ensureTmpArraysCapacity(int capacity, int targetNumBuffers) { if (targetNumBuffers >= 1) { tmpPosArray = ensureCapacity(tmpPosArray, capacity); } if (targetNumBuffers >= 2) { tmpNormArray = ensureCapacity(tmpNormArray, capacity); } if (!approximateTangents && targetNumBuffers == 3) { tmpTanArray = ensureCapacity(tmpTanArray, capacity); } }
float matWeights[]; int targetNumBuffers = getTargetNumBuffers(morphTargets[0]); int maxGPUTargets = getMaxGPUTargets(rm, geom, m, targetNumBuffers); boundBufferIdx = bindMorphtargetBuffer(mesh, targetNumBuffers, boundBufferIdx, t); mt = initCpuMorphTarget(geom); geom.setFallbackMorphTarget(mt); ensureTmpArraysCapacity(geom.getVertexCount() * 3, targetNumBuffers); mergeMorphTargets(targetNumBuffers, weight, t, i == lastGpuTargetIndex); writeCpuBuffer(targetNumBuffers, mt); bindMorphtargetBuffer(mesh, targetNumBuffers, (nbGPUTargets - 1) * targetNumBuffers, mt);
skin.morphControl = new MorphControl(); spatial.addControl(new MorphControl());
int nbMaxBuffers = getRemainingBuffers(geom.getMesh(), rm.getRenderer());
g.addControl(new MorphControl());