forked from LeenkxTeam/LNXSDK
Deinterleaved Vertex Buffer Update
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user