Skip to content

Commit fce1184

Browse files
authored
Merge pull request #11840 from bghgary/revert-lod
Revert screen coverage support in MSFT_lod
2 parents d98ff0e + d777981 commit fce1184

File tree

2 files changed

+27
-77
lines changed

2 files changed

+27
-77
lines changed

dist/preview release/what's new.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@
9494
- Added support for more uv sets to glTF loader. ([bghgary](https://github.com/bghgary))
9595
- Added support for `KHR_materials_volume` for glTF loader. ([MiiBond](https://github.com/MiiBond/))
9696
- Added support for custom timeout in `WebRequest`. ([jamidwyer](https://github.com/jamidwyer/))
97-
- Improved support for `MSFT_lod`, now LOD levels are loaded and accurately displayed according to screen coverage ([CraigFeldspar](https://github.com/CraigFeldspar))
9897
- Added support for direct loading [base64 data URLs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) for all loader ([CoPrez](https://github.com/CoPrez))
9998
- Added `DO_NOT_ALTER_FILE_COORDINATES` flag to STL loader ([AlbertoPa](https://github.com/AlbertoPa))
10099
- Added support for pure geometry files to OBJ loader ([Deltakosh](https://github.com/deltakosh))
@@ -134,6 +133,7 @@
134133
- Add option to decompose the `newWorldMatrix` when passed into `TransformNode.freezeWorldMatrix`. ([bghgary](https://github.com/bghgary))
135134
- Added `mesh.onMeshReadyObservable` to get notified when a mesh is ready ([RaananW](https://github.com/RaananW))
136135
- Added support for morph targets to the mesh `BoundingInfo` refresh. ([EricBeetsOfficial-Opuscope](https://github.com/EricBeetsOfficial-Opuscope))
136+
- Added support for screen coverage in addition to distance for LOds. ([CraigFeldspar](https://github.com/CraigFeldspar))
137137

138138
### Inspector
139139

loaders/src/glTF/2.0/Extensions/MSFT_lod.ts

Lines changed: 26 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,6 @@ export class MSFT_lod implements IGLTFLoaderExtension {
153153

154154
const nodeLODs = this._getLODs(extensionContext, node, this._loader.gltf.nodes, extension.ids);
155155
this._loader.logOpen(`${extensionContext}`);
156-
const transformNodes: Nullable<TransformNode>[] = [];
157-
158-
for (let indexLOD = 0; indexLOD < nodeLODs.length; indexLOD++) {
159-
transformNodes.push(null);
160-
}
161156

162157
for (let indexLOD = 0; indexLOD < nodeLODs.length; indexLOD++) {
163158
const nodeLOD = nodeLODs[indexLOD];
@@ -167,42 +162,13 @@ export class MSFT_lod implements IGLTFLoaderExtension {
167162
this._nodeSignalLODs[indexLOD] = this._nodeSignalLODs[indexLOD] || new Deferred();
168163
}
169164

170-
const assignChild = (babylonTransformNode: TransformNode, index: number) => {
165+
const assignWrap = (babylonTransformNode: TransformNode) => {
166+
assign(babylonTransformNode);
171167
babylonTransformNode.setEnabled(false);
172-
transformNodes[index] = babylonTransformNode;
173-
174-
let fullArray = true;
175-
for (let i = 0; i < transformNodes.length; i++) {
176-
if (!transformNodes[i]) {
177-
fullArray = false;
178-
}
179-
}
180-
181-
const lod0 = transformNodes[transformNodes.length - 1];
182-
if (fullArray && lod0 && this._isMesh(lod0)) {
183-
const screenCoverages = lod0.metadata?.gltf?.extras?.MSFT_screencoverage as number[];
184-
185-
if (screenCoverages && screenCoverages.length) {
186-
screenCoverages.reverse();
187-
lod0.useLODScreenCoverage = true;
188-
for (let i = 0; i < transformNodes.length - 1; i++) {
189-
const transformNode = transformNodes[i];
190-
if (transformNode && this._isMesh(transformNode)) {
191-
lod0.addLODLevel(screenCoverages[i + 1], transformNode);
192-
}
193-
}
194-
if (screenCoverages[0] > 0) {
195-
// Adding empty LOD
196-
lod0.addLODLevel(screenCoverages[0], null);
197-
}
198-
}
199-
}
200168
};
201169

202-
const promise = this._loader.loadNodeAsync(`/nodes/${nodeLOD.index}`, nodeLOD, (node: TransformNode) => assignChild(node, indexLOD)).then((babylonMesh) => {
203-
const screenCoverages = (nodeLODs[nodeLODs.length - 1]._babylonTransformNode as Mesh).metadata?.gltf?.extras?.MSFT_screencoverage;
204-
205-
if (indexLOD !== 0 && !screenCoverages) {
170+
const promise = this._loader.loadNodeAsync(`/nodes/${nodeLOD.index}`, nodeLOD, assignWrap).then((babylonMesh) => {
171+
if (indexLOD !== 0) {
206172
// TODO: should not rely on _babylonTransformNode
207173
const previousNodeLOD = nodeLODs[indexLOD - 1];
208174
if (previousNodeLOD._babylonTransformNode) {
@@ -211,7 +177,6 @@ export class MSFT_lod implements IGLTFLoaderExtension {
211177
}
212178
}
213179

214-
assign(babylonMesh);
215180
babylonMesh.setEnabled(true);
216181
return babylonMesh;
217182
});
@@ -232,13 +197,7 @@ export class MSFT_lod implements IGLTFLoaderExtension {
232197
}
233198

234199
/** @hidden */
235-
public _loadMaterialAsync(
236-
context: string,
237-
material: IMaterial,
238-
babylonMesh: Nullable<Mesh>,
239-
babylonDrawMode: number,
240-
assign: (babylonMaterial: Material) => void
241-
): Nullable<Promise<Material>> {
200+
public _loadMaterialAsync(context: string, material: IMaterial, babylonMesh: Nullable<Mesh>, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<Material>> {
242201
// Don't load material LODs if already loading a node LOD.
243202
if (this._nodeIndexLOD) {
244203
return null;
@@ -257,26 +216,24 @@ export class MSFT_lod implements IGLTFLoaderExtension {
257216
this._materialIndexLOD = indexLOD;
258217
}
259218

260-
const promise = this._loader
261-
._loadMaterialAsync(`/materials/${materialLOD.index}`, materialLOD, babylonMesh, babylonDrawMode, (babylonMaterial) => {
262-
if (indexLOD === 0) {
263-
assign(babylonMaterial);
264-
}
265-
})
266-
.then((babylonMaterial) => {
267-
if (indexLOD !== 0) {
268-
assign(babylonMaterial);
269-
270-
// TODO: should not rely on _data
271-
const previousDataLOD = materialLODs[indexLOD - 1]._data!;
272-
if (previousDataLOD[babylonDrawMode]) {
273-
this._disposeMaterials([previousDataLOD[babylonDrawMode].babylonMaterial]);
274-
delete previousDataLOD[babylonDrawMode];
275-
}
219+
const promise = this._loader._loadMaterialAsync(`/materials/${materialLOD.index}`, materialLOD, babylonMesh, babylonDrawMode, (babylonMaterial) => {
220+
if (indexLOD === 0) {
221+
assign(babylonMaterial);
222+
}
223+
}).then((babylonMaterial) => {
224+
if (indexLOD !== 0) {
225+
assign(babylonMaterial);
226+
227+
// TODO: should not rely on _data
228+
const previousDataLOD = materialLODs[indexLOD - 1]._data!;
229+
if (previousDataLOD[babylonDrawMode]) {
230+
this._disposeMaterials([previousDataLOD[babylonDrawMode].babylonMaterial]);
231+
delete previousDataLOD[babylonDrawMode];
276232
}
233+
}
277234

278-
return babylonMaterial;
279-
});
235+
return babylonMaterial;
236+
});
280237

281238
this._materialPromiseLODs[indexLOD] = this._materialPromiseLODs[indexLOD] || [];
282239

@@ -353,22 +310,15 @@ export class MSFT_lod implements IGLTFLoaderExtension {
353310
return null;
354311
}
355312

356-
private _isMesh(mesh: TransformNode | Mesh): mesh is Mesh {
357-
return !!(mesh as Mesh).addLODLevel;
358-
}
359-
360313
private _loadBufferLOD(bufferLODs: Array<IBufferInfo>, indexLOD: number): void {
361314
const bufferLOD = bufferLODs[indexLOD];
362315
if (bufferLOD) {
363316
this._loader.log(`Loading buffer range [${bufferLOD.start}-${bufferLOD.end}]`);
364-
this._loader.bin!.readAsync(bufferLOD.start, bufferLOD.end - bufferLOD.start + 1).then(
365-
(data) => {
366-
bufferLOD.loaded.resolve(data);
367-
},
368-
(error) => {
369-
bufferLOD.loaded.reject(error);
370-
}
371-
);
317+
this._loader.bin!.readAsync(bufferLOD.start, bufferLOD.end - bufferLOD.start + 1).then((data) => {
318+
bufferLOD.loaded.resolve(data);
319+
}, (error) => {
320+
bufferLOD.loaded.reject(error);
321+
});
372322
}
373323
}
374324

0 commit comments

Comments
 (0)