Deinterleaved Vertex Buffer Update

This commit is contained in:
2026-10-09 16:30:11 -07:00
parent c320c4bb19
commit c1aa2837ca
3 changed files with 97 additions and 14 deletions

View File

@ -14,6 +14,7 @@ import iron.math.Vec4;
import iron.math.Mat4;
import iron.data.SceneFormat;
import iron.data.MeshData;
import iron.data.ShaderData;
class Geometry {
#if lnx_deinterleaved
@ -208,7 +209,7 @@ class Geometry {
for (v in 0...vertexBuffers.length)
if (vertexBuffers[v].name == e.name) {
vbs.push(vertexBuffers[v].buffer);
continue;
break;
}
if (e.name == "ipos" && instancedVB != null) {
vbs.push(instancedVB);
@ -264,7 +265,7 @@ class Geometry {
for (i in 0...vaLength)
vertexBuffers[i] = {
name: vertexArrays[i].attrib,
buffer: makeDeinterleavedVB(vertexArrays[i].values, vertexArrays[i].attrib, vertexArrays[i].size)
buffer: makeDeinterleavedVB(vertexArrays[i])
};
#else
@ -295,14 +296,20 @@ class Geometry {
}
#if lnx_deinterleaved
function makeDeinterleavedVB(data: ByteArray, name: String, structLength: Int): VertexBuffer {
function makeDeinterleavedVB(va: TVertexArray): VertexBuffer {
var struct = new VertexStructure();
struct.add(name, structLength == 2 ? VertexData.Short2Norm : VertexData.Short4Norm);
struct.add(va.attrib, ShaderContext.parseData(va.data));
var vertexBuffer = new VertexBuffer(Std.int(data.byteLength / 2 / structLength), struct, usage);
var vcount = verticesCount(va);
var vertexBuffer = new VertexBuffer(vcount, struct, usage);
var stride = Std.int(struct.byteSize() / 2);
var vertices = vertexBuffer.lock();
for (i in 0...Std.int(vertices.byteLength / 2)) vertices.setInt16(i * 2, data.getInt16(i * 2));
var di = -1;
for (i in 0...vcount) {
for (o in 0...va.size) vertices.setInt16(++di * 2, va.values[i * va.size + o]);
for (o in va.size...stride) vertices.setInt16(++di * 2, 0);
}
vertexBuffer.unlock();
return vertexBuffer;