|
@@ -192,7 +192,7 @@
|
|
}
|
|
}
|
|
|
|
|
|
if (this._renderableData) {
|
|
if (this._renderableData) {
|
|
- this._renderableData.dispose();
|
|
|
|
|
|
+ this._renderableData.dispose(this.owner.engine);
|
|
this._renderableData = null;
|
|
this._renderableData = null;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -557,7 +557,12 @@
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Free the existing TransparentSegments
|
|
|
|
+ for (let ts of rd._transparentSegments) {
|
|
|
|
+ ts.dispose(this.owner.engine);
|
|
|
|
+ }
|
|
rd._transparentSegments.splice(0);
|
|
rd._transparentSegments.splice(0);
|
|
|
|
+
|
|
let prevSeg = null;
|
|
let prevSeg = null;
|
|
|
|
|
|
for (let tpiI = 0; tpiI < rd._transparentPrimitives.length; tpiI++) {
|
|
for (let tpiI = 0; tpiI < rd._transparentPrimitives.length; tpiI++) {
|
|
@@ -601,22 +606,69 @@
|
|
let context = new Render2DContext(Render2DContext.RenderModeTransparent);
|
|
let context = new Render2DContext(Render2DContext.RenderModeTransparent);
|
|
let rd = this._renderableData;
|
|
let rd = this._renderableData;
|
|
|
|
|
|
|
|
+ let useInstanced = this.owner.supportInstancedArray;
|
|
|
|
+
|
|
let length = rd._transparentSegments.length;
|
|
let length = rd._transparentSegments.length;
|
|
for (let i = 0; i < length; i++) {
|
|
for (let i = 0; i < length; i++) {
|
|
- let ts = rd._transparentSegments[i];
|
|
|
|
-
|
|
|
|
|
|
+ context.instancedBuffers = null;
|
|
|
|
|
|
|
|
+ let ts = rd._transparentSegments[i];
|
|
let gii = ts.groupInsanceInfo;
|
|
let gii = ts.groupInsanceInfo;
|
|
let mrc = gii.modelRenderCache;
|
|
let mrc = gii.modelRenderCache;
|
|
|
|
+ let engine = this.owner.engine;
|
|
|
|
+ let count = ts.endDataIndex - ts.startDataIndex;
|
|
|
|
+
|
|
|
|
+ // Use Instanced Array if it's supported and if there's at least 5 prims to draw.
|
|
|
|
+ // We don't want to create an Instanced Buffer for less that 5 prims
|
|
|
|
+ if (useInstanced && count >= 5) {
|
|
|
|
+
|
|
|
|
+ if (!ts.partBuffers) {
|
|
|
|
+ let buffers = new Array<WebGLBuffer>();
|
|
|
|
+
|
|
|
|
+ for (let j = 0; j < gii.transparentData.length; j++) {
|
|
|
|
+ let gitd = gii.transparentData[j];
|
|
|
|
+ let dfa = gitd._partData;
|
|
|
|
+ let data = dfa.pack();
|
|
|
|
+ let stride = dfa.stride;
|
|
|
|
+ let neededSize = count * stride * 4;
|
|
|
|
+
|
|
|
|
+ let buffer = engine.createInstancesBuffer(neededSize); // Create + bind
|
|
|
|
+ let segData = data.subarray(ts.startDataIndex * stride, ts.endDataIndex * stride);
|
|
|
|
+ engine.updateArrayBuffer(segData);
|
|
|
|
+ buffers.push(buffer);
|
|
|
|
+ }
|
|
|
|
|
|
- context.useInstancing = false;
|
|
|
|
- context.partDataStartIndex = ts.startDataIndex;
|
|
|
|
- context.partDataEndIndex = ts.endDataIndex;
|
|
|
|
- context.groupInfoPartData = gii.transparentData;
|
|
|
|
|
|
+ ts.partBuffers = buffers;
|
|
|
|
+ } else if (gii.transparentDirty) {
|
|
|
|
+ for (let j = 0; j < gii.transparentData.length; j++) {
|
|
|
|
+ let gitd = gii.transparentData[j];
|
|
|
|
+ let dfa = gitd._partData;
|
|
|
|
+ let data = dfa.pack();
|
|
|
|
+ let stride = dfa.stride;
|
|
|
|
+
|
|
|
|
+ let buffer = ts.partBuffers[j];
|
|
|
|
+ let segData = data.subarray(ts.startDataIndex * stride, ts.endDataIndex * stride);
|
|
|
|
+ engine.bindArrayBuffer(buffer);
|
|
|
|
+ engine.updateArrayBuffer(segData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ context.useInstancing = true;
|
|
|
|
+ context.instancesCount = count;
|
|
|
|
+ context.instancedBuffers = ts.partBuffers;
|
|
|
|
+ context.groupInfoPartData = gii.transparentData;
|
|
|
|
|
|
- let renderFailed = !mrc.render(gii, context);
|
|
|
|
|
|
+ let renderFailed = !mrc.render(gii, context);
|
|
|
|
+ failedCount += renderFailed ? 1 : 0;
|
|
|
|
+ } else {
|
|
|
|
+ context.useInstancing = false;
|
|
|
|
+ context.partDataStartIndex = ts.startDataIndex;
|
|
|
|
+ context.partDataEndIndex = ts.endDataIndex;
|
|
|
|
+ context.groupInfoPartData = gii.transparentData;
|
|
|
|
|
|
- failedCount += renderFailed ? 1 : 0;
|
|
|
|
|
|
+ let renderFailed = !mrc.render(gii, context);
|
|
|
|
+ failedCount += renderFailed ? 1 : 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return failedCount;
|
|
return failedCount;
|
|
@@ -909,7 +961,7 @@
|
|
this._anisotropicLevel = 1;
|
|
this._anisotropicLevel = 1;
|
|
}
|
|
}
|
|
|
|
|
|
- dispose() {
|
|
|
|
|
|
+ dispose(engine: Engine) {
|
|
if (this._cacheRenderSprite) {
|
|
if (this._cacheRenderSprite) {
|
|
this._cacheRenderSprite.dispose();
|
|
this._cacheRenderSprite.dispose();
|
|
this._cacheRenderSprite = null;
|
|
this._cacheRenderSprite = null;
|
|
@@ -937,6 +989,14 @@
|
|
this._cacheNodeUVsChangedObservable.clear();
|
|
this._cacheNodeUVsChangedObservable.clear();
|
|
this._cacheNodeUVsChangedObservable = null;
|
|
this._cacheNodeUVsChangedObservable = null;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (this._transparentSegments) {
|
|
|
|
+ for (let ts of this._transparentSegments) {
|
|
|
|
+ ts.dispose(engine);
|
|
|
|
+ }
|
|
|
|
+ this._transparentSegments.splice(0);
|
|
|
|
+ this._transparentSegments = null;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
addNewTransparentPrimitiveInfo(prim: RenderablePrim2D, gii: GroupInstanceInfo): TransparentPrimitiveInfo {
|
|
addNewTransparentPrimitiveInfo(prim: RenderablePrim2D, gii: GroupInstanceInfo): TransparentPrimitiveInfo {
|