|
@@ -49,8 +49,10 @@
|
|
|
Y: 1,
|
|
|
Z: 1
|
|
|
};
|
|
|
- private _facetDepthSort: boolean = false; // is the facet depth sort enabled
|
|
|
- private _originalIndices: IndicesArray; // copy of the original indices array
|
|
|
+ private _facetDepthSort: boolean = false; // is the facet depth sort to be computed
|
|
|
+ private _facetDepthSortEnabled: boolean = false; // is the facet depth sort initialized
|
|
|
+ private _originalIndices: IndicesArray; // reference to the original indices in a typed array to avoid arrayBuffer allocation on updates
|
|
|
+ private _depthSortedIndices: IndicesArray; // copy of the indices array to store them once sorted
|
|
|
private _depthSortedFacets: {ind: number, sqDistance: number}[]; // array of depth sorted facets
|
|
|
private _facetDepthSortFunction: (f1: {ind: number, sqDistance: number}, f2: {ind: number, sqDistance: number}) => number; // facet depth sort function
|
|
|
private _facetDepthSortFrom: Vector3; // location where to depth sort from
|
|
@@ -85,6 +87,7 @@
|
|
|
/**
|
|
|
* Boolean : must the facet be depth sorted on next call to `updateFacetData()` ?
|
|
|
* Works only for updatable meshes.
|
|
|
+ * Doesn't work with multi-materials.
|
|
|
*/
|
|
|
public get mustDepthSortFacets(): boolean {
|
|
|
return this._facetDepthSort;
|
|
@@ -2232,7 +2235,6 @@
|
|
|
}
|
|
|
var positions = this.getVerticesData(VertexBuffer.PositionKind);
|
|
|
var indices = this.getIndices();
|
|
|
- var indicesForComputeNormals = indices;
|
|
|
var normals = this.getVerticesData(VertexBuffer.NormalKind);
|
|
|
var bInfo = this.getBoundingInfo();
|
|
|
|
|
@@ -2240,9 +2242,34 @@
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
- if (this._facetDepthSort && !this._originalIndices) {
|
|
|
+ if (this._facetDepthSort && !this._facetDepthSortEnabled) {
|
|
|
// init arrays, matrix and sort function on first call
|
|
|
- this._originalIndices = new Uint32Array(indices!);
|
|
|
+ this._facetDepthSortEnabled = true;
|
|
|
+ if (indices instanceof Uint16Array) {
|
|
|
+ this._originalIndices = indices!;
|
|
|
+ this._depthSortedIndices = new Uint16Array(indices!);
|
|
|
+ }
|
|
|
+ else if (indices instanceof Uint32Array) {
|
|
|
+ this._originalIndices = indices!;
|
|
|
+ this._depthSortedIndices = new Uint32Array(indices!);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ var needs32bits = false;
|
|
|
+ for (var i = 0; i < indices!.length; i++) {
|
|
|
+ if (indices![i] > 65535) {
|
|
|
+ needs32bits = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (needs32bits) {
|
|
|
+ this._originalIndices = new Uint32Array(indices!);
|
|
|
+ this._depthSortedIndices = new Uint32Array(indices!);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this._originalIndices = new Uint16Array(indices!);
|
|
|
+ this._depthSortedIndices = new Uint16Array(indices!);
|
|
|
+ }
|
|
|
+ }
|
|
|
this._facetDepthSortFunction = function(f1, f2) {
|
|
|
return (f2.sqDistance - f1.sqDistance);
|
|
|
};
|
|
@@ -2280,25 +2307,25 @@
|
|
|
this._facetParameters.subDiv = this._subDiv;
|
|
|
this._facetParameters.ratio = this.partitioningBBoxRatio;
|
|
|
this._facetParameters.depthSort = this._facetDepthSort;
|
|
|
- if (this._facetDepthSort) {
|
|
|
+ if (this._facetDepthSort && this._facetDepthSortEnabled) {
|
|
|
this.computeWorldMatrix(true);
|
|
|
this._worldMatrix.invertToRef(this._invertedMatrix);
|
|
|
Vector3.TransformCoordinatesToRef(this._facetDepthSortFrom, this._invertedMatrix, this._facetDepthSortOrigin);
|
|
|
this._facetParameters.distanceTo = this._facetDepthSortOrigin;
|
|
|
- indicesForComputeNormals = this._originalIndices;
|
|
|
}
|
|
|
this._facetParameters.depthSortedFacets = this._depthSortedFacets;
|
|
|
- VertexData.ComputeNormals(positions, indicesForComputeNormals, normals, this._facetParameters);
|
|
|
+ VertexData.ComputeNormals(positions, this._originalIndices, normals, this._facetParameters);
|
|
|
|
|
|
- if (this._facetDepthSort) {
|
|
|
+ if (this._facetDepthSort && this._facetDepthSortEnabled) {
|
|
|
this._depthSortedFacets.sort(this._facetDepthSortFunction);
|
|
|
- for (var sorted = 0; sorted < this._facetNb; sorted++) {
|
|
|
- var sind = this._depthSortedFacets[sorted].ind;
|
|
|
- indices![sorted * 3] = this._originalIndices[sind];
|
|
|
- indices![sorted * 3 + 1] = this._originalIndices[sind + 1];
|
|
|
- indices![sorted * 3 + 2] = this._originalIndices[sind + 2];
|
|
|
+ var l = (this._depthSortedIndices.length / 3)|0;
|
|
|
+ for (var f = 0; f < l; f++) {
|
|
|
+ var sind = this._depthSortedFacets[f].ind;
|
|
|
+ this._depthSortedIndices[f * 3] = this._originalIndices[sind];
|
|
|
+ this._depthSortedIndices[f * 3 + 1] = this._originalIndices[sind + 1];
|
|
|
+ this._depthSortedIndices[f * 3 + 2] = this._originalIndices[sind + 2];
|
|
|
}
|
|
|
- this.updateIndices(indices!);
|
|
|
+ this.updateIndices(this._depthSortedIndices);
|
|
|
}
|
|
|
|
|
|
return this;
|
|
@@ -2487,7 +2514,7 @@
|
|
|
this._facetNormals = new Array<Vector3>();
|
|
|
this._facetPartitioning = new Array<number[]>();
|
|
|
this._facetParameters = null;
|
|
|
- this._originalIndices = new Uint32Array(0);
|
|
|
+ this._depthSortedIndices = new Uint32Array(0);
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
@@ -2498,7 +2525,10 @@
|
|
|
public updateIndices(indices: IndicesArray): AbstractMesh {
|
|
|
return this;
|
|
|
}
|
|
|
-
|
|
|
+ /**
|
|
|
+ * The mesh Geometry. Actually used by the Mesh object.
|
|
|
+ * Returns a blank geometry object.
|
|
|
+ */
|
|
|
/**
|
|
|
* Creates new normals data for the mesh.
|
|
|
* @param updatable.
|