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

@ -73,11 +73,11 @@ class MeshBatch {
var scontext = b.shader.getContext(context);
if (scontext == null) continue;
g.setPipeline(scontext.pipeState);
// #if lnx_deinterleaved // TODO
// g.setVertexBuffers(b.vertexBuffers);
// #else
#if lnx_deinterleaved
g.setVertexBuffers(b.getVertexBuffers(scontext.raw.vertex_elements));
#else
g.setVertexBuffer(b.getVertexBuffer(scontext.raw.vertex_elements));
// #end
#end
g.setIndexBuffer(b.indexBuffer);
Uniforms.setContextConstants(g, scontext, bindParams);
@ -127,8 +127,12 @@ class Bucket {
public var batched = false;
public var shader: ShaderData;
#if lnx_deinterleaved
public var vertexBuffers: Array<InterleavedVertexBuffer> = [];
#else
var vertexBuffer: VertexBuffer;
var vertexBufferMap: Map<String, VertexBuffer> = new Map();
#end
public var indexBuffer: IndexBuffer;
public var meshes: Array<MeshObject> = [];
@ -138,8 +142,12 @@ class Bucket {
public function remove() {
indexBuffer.delete();
#if lnx_deinterleaved
for (buf in vertexBuffers) buf.buffer.delete();
#else
// this.vertexBuffer is in the map, so it's also deleted here
for (buf in vertexBufferMap) buf.delete();
#end
meshes = [];
}
@ -151,6 +159,20 @@ class Bucket {
meshes.remove(m);
}
#if lnx_deinterleaved
public function getVertexBuffers(elems: Array<TVertexElement>): Array<VertexBuffer> {
var vbs: Array<VertexBuffer> = [];
for (e in elems) {
for (v in vertexBuffers) {
if (v.name == e.name) {
vbs.push(v.buffer);
break;
}
}
}
return vbs;
}
#else
function copyAttribute(attribSize: Int, count: Int, to: ByteArray, toStride: Int, toOffset: Int, from: ByteArray, fromStride: Int, fromOffset: Int) {
for (i in 0...count) {
for (j in 0...attribSize) {
@ -196,6 +218,7 @@ class Bucket {
}
return vb;
}
#end
function vertexCount(g: Geometry, hasUVs: Bool): Int {
var vcount = g.getVerticesLength();
@ -240,6 +263,50 @@ class Bucket {
if (mdatas.length == 0) return;
#if lnx_deinterleaved
var attrNames: Array<String> = [];
var attrReps = new Map<String, TVertexArray>();
for (md in mdatas) {
for (va in md.geom.vertexArrays) {
if (attrReps.get(va.attrib) == null) {
attrReps.set(va.attrib, va);
attrNames.push(va.attrib);
}
}
}
for (name in attrNames) {
var rep = attrReps.get(name);
var attrStruct = new VertexStructure();
attrStruct.add(name, ShaderContext.parseData(rep.data));
var stride = Std.int(attrStruct.byteSize() / 2);
var vtotal = 0;
for (md in mdatas) vtotal += md.geom.getVerticesCount();
var vb = new VertexBuffer(vtotal, attrStruct, Usage.StaticUsage);
var vertices = vb.lock();
var ai = -1;
for (md in mdatas) {
var va: TVertexArray = null;
for (v in md.geom.vertexArrays) {
if (v.attrib == name) {
va = v;
break;
}
}
if (va != null && va.values != null) {
var nverts = md.geom.getVerticesCount();
for (i in 0...nverts) {
for (o in 0...va.size) vertices.setInt16(++ai * 2, va.values[i * va.size + o]);
for (o in va.size...stride) vertices.setInt16(++ai * 2, 0);
}
}
else {
for (i in 0...md.geom.getVerticesCount() * stride) vertices.setInt16(++ai * 2, 0);
}
}
vb.unlock();
vertexBuffers.push({name: name, buffer: vb});
}
#else
// Pick UVs if present
var vs = mdatas[0].geom.struct;
for (md in mdatas) if (md.geom.struct.size() > vs.size()) vs = md.geom.struct;