Skip to content

Commit 95fff62

Browse files
committed
feat: implement lod edges
1 parent 929f142 commit 95fff62

File tree

4 files changed

+76
-9
lines changed

4 files changed

+76
-9
lines changed

packages/front/src/core/PostproductionRenderer/example.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,15 @@ const panel = BUI.Component.create<BUI.PanelSection>(() => {
320320
}}">
321321
</bim-color-input>
322322
323+
<bim-dropdown label="Edges Mode"
324+
@change="${({ target }: { target: BUI.Dropdown }) => {
325+
edgesPass.mode = target.value[0] as OBF.EdgeDetectionPassMode;
326+
updateIfManualMode();
327+
}}">
328+
<bim-option checked label="Default" value="${OBF.EdgeDetectionPassMode.DEFAULT}"></bim-option>
329+
<bim-option label="Global" value="${OBF.EdgeDetectionPassMode.GLOBAL}"></bim-option>
330+
</bim-dropdown>
331+
323332
</bim-panel-section>
324333
325334
<bim-panel-section label="Outline">

packages/front/src/core/PostproductionRenderer/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as OBC from "@thatopen/components";
33
import { RendererWith2D } from "../Marker";
44
import { Postproduction, PostproductionAspect } from "./src";
55

6-
export { PostproductionAspect, GlossPass } from "./src";
6+
export { PostproductionAspect, GlossPass, EdgeDetectionPassMode } from "./src";
77

88
/**
99
* A class that extends RendererWith2D and adds post-processing capabilities. 📕 [Tutorial](https://docs.thatopen.com/Tutorials/Components/Front/PostproductionRenderer). 📘 [API](https://docs.thatopen.com/api/@thatopen/components-front/classes/PostproductionRenderer).

packages/front/src/core/PostproductionRenderer/src/edge-detection-pass.ts

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@ import {
55
} from "three/examples/jsm/postprocessing/Pass.js";
66
import * as OBC from "@thatopen/components";
77

8+
/**
9+
* The mode of the edge detection pass.
10+
*/
11+
export enum EdgeDetectionPassMode {
12+
/**
13+
* Looks good, including LODs, but less performant.
14+
*/
15+
DEFAULT,
16+
/**
17+
* Doesn't include LODs, but much more performant.
18+
*/
19+
GLOBAL,
20+
}
21+
822
export class EdgeDetectionPass extends Pass {
923
private _edgeMaterial: THREE.ShaderMaterial;
1024
private _combineMaterial: THREE.ShaderMaterial;
@@ -17,6 +31,19 @@ export class EdgeDetectionPass extends Pass {
1731
private _overrideMaterial: THREE.ShaderMaterial;
1832
private _depthBiasStrength = 0.001; // Adjustable depth bias strength
1933

34+
private _mode = EdgeDetectionPassMode.DEFAULT;
35+
36+
get mode() {
37+
return this._mode;
38+
}
39+
40+
set mode(value: EdgeDetectionPassMode) {
41+
this._mode = value;
42+
const currentWorld = this._renderer.currentWorld as OBC.World;
43+
const scene = currentWorld!.scene.three as THREE.Scene;
44+
scene.traverse((child) => this.setMaterialToMesh(child, false));
45+
}
46+
2047
get width() {
2148
return this._edgeMaterial.uniforms.width.value;
2249
}
@@ -201,11 +228,18 @@ export class EdgeDetectionPass extends Pass {
201228
currentScene.fog = null;
202229
currentScene.background = null;
203230

204-
const previousOverrideMaterial = scene.overrideMaterial;
205-
scene.overrideMaterial = this._overrideMaterial;
206-
renderer.setRenderTarget(this._vertexColorRenderTarget);
207-
renderer.render(scene, currentWorld!.camera.three);
208-
scene.overrideMaterial = previousOverrideMaterial;
231+
if (this._mode === EdgeDetectionPassMode.DEFAULT) {
232+
scene.traverse((child) => this.setMaterialToMesh(child, true));
233+
renderer.setRenderTarget(this._vertexColorRenderTarget);
234+
renderer.render(scene, currentWorld!.camera.three);
235+
scene.traverse((child) => this.setMaterialToMesh(child, false));
236+
} else if (this._mode === EdgeDetectionPassMode.GLOBAL) {
237+
const previousOverrideMaterial = scene.overrideMaterial;
238+
scene.overrideMaterial = this._overrideMaterial;
239+
renderer.setRenderTarget(this._vertexColorRenderTarget);
240+
renderer.render(scene, currentWorld!.camera.three);
241+
scene.overrideMaterial = previousOverrideMaterial;
242+
}
209243

210244
currentScene.fog = prevFog;
211245
currentScene.background = prevBackground;
@@ -240,4 +274,27 @@ export class EdgeDetectionPass extends Pass {
240274
this._edgeRenderTarget.dispose();
241275
this._vertexColorRenderTarget.dispose();
242276
}
277+
278+
private setMaterialToMesh(object: THREE.Object3D, apply: boolean) {
279+
if (!("isMesh" in object)) {
280+
return;
281+
}
282+
283+
const mesh = object as THREE.Mesh;
284+
285+
if (!("geometry" in mesh)) {
286+
return;
287+
}
288+
289+
if ("isLODGeometry" in mesh.geometry) {
290+
return;
291+
}
292+
293+
if (apply) {
294+
mesh.userData.edgePassPreviousMaterial = mesh.material;
295+
mesh.material = this._overrideMaterial;
296+
} else if ("edgePassPreviousMaterial" in mesh.userData) {
297+
mesh.material = mesh.userData.edgePassPreviousMaterial;
298+
}
299+
}
243300
}

packages/front/src/core/PostproductionRenderer/src/index.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import { PostproductionRenderer } from "..";
1111
import { BasePass } from "./base-pass";
1212
import { GlossPass } from "./gloss-pass";
1313

14+
// Export the GlossPass for external use
15+
export { GlossPass };
16+
export { EdgeDetectionPassMode } from "./edge-detection-pass";
17+
1418
export enum PostproductionAspect {
1519
COLOR = 0,
1620
PEN = 1,
@@ -407,6 +411,3 @@ export class Postproduction {
407411
this.style = PostproductionAspect.COLOR;
408412
}
409413
}
410-
411-
// Export the GlossPass for external use
412-
export { GlossPass };

0 commit comments

Comments
 (0)