Skip to content

Commit 8c1ae6c

Browse files
committed
refactor(core): clean up renderer
1 parent 04b39d4 commit 8c1ae6c

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

apps/kitchen-sink-new/src/app/misc/basic/scene.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,22 @@ export class Box {
6767
<ngt-ambient-light [intensity]="Math.PI" />
6868
6969
<ngt-group #group>
70-
<ngt-mesh>
70+
<ngt-mesh (pointerover)="color.set('orange')" (pointerout)="color.set('hotpink')">
7171
<ngt-sphere-geometry *args="[0.5, 32, 32]" />
7272
<ngt-mesh-toon-material [color]="color()" (attached)="onAttach($event)" />
7373
</ngt-mesh>
7474
75+
<!--
7576
@if (show()) {
7677
<ngt-mesh [position]="[3, 0, 0]">
7778
<ngt-icosahedron-geometry />
7879
<ngt-mesh-normal-material />
7980
</ngt-mesh>
8081
}
82+
-->
8183
82-
<app-box [position]="[1, 0, 0]" />
84+
<!--
85+
<app-box [position]="[1, 0, 0]" />
8386
<app-box [position]="[-1, 0, 0]" color="red" />
8487
<app-box [position]="[0, 1, 0]">
8588
<ngt-mesh-standard-material color="green" />
@@ -113,11 +116,14 @@ export class Box {
113116
<app-box data-children [position]="[0.5, -0.5, 0]" color="black" />
114117
}
115118
</app-box>
119+
-->
116120
121+
<!--
117122
<app-condition-box [position]="[0, 2, 0]" />
118123
@if (show()) {
119124
<app-condition-box [position]="[0, -2, 0]" />
120125
}
126+
-->
121127
</ngt-group>
122128
123129
<ngt-portal [container]="virtualScene">

libs/core/src/lib/renderer/renderer.ts

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ export class NgtRendererFactory2 implements RendererFactory2 {
4747
/**
4848
* NOTE: We use `useFactory` to instantiate `NgtRendererFactory2`
4949
*/
50-
constructor(private delegateRendererFactory: RendererFactory2) {}
50+
constructor(private delegateRendererFactory: RendererFactory2) {
51+
console.log('this', this);
52+
}
5153

5254
createRenderer(hostElement: any, type: RendererType2 | null): Renderer2 {
5355
const delegateRenderer = this.delegateRendererFactory.createRenderer(hostElement, type);
@@ -68,7 +70,7 @@ export class NgtRendererFactory2 implements RendererFactory2 {
6870
store = type.type[NGT_MANUAL_INJECTED_STORE] as SignalState<NgtState> | null;
6971
}
7072

71-
const cacheKey = store ? `${type.id}-${store.snapshot.id}` : type.id;
73+
let cacheKey = store ? `${type.id}-${store.snapshot.id}` : type.id;
7274
let renderer = !isPortal ? this.rendererMap.get(cacheKey) : null;
7375

7476
if (!isRendererNode(hostElement)) {
@@ -94,10 +96,31 @@ export class NgtRendererFactory2 implements RendererFactory2 {
9496
}
9597

9698
const rS = (hostElement as NgtRendererNode).__ngt_renderer__;
97-
// reassign store if it's different
98-
if (rS[NgtRendererClassId.store] !== store) {
99+
100+
if (!rS[NgtRendererClassId.store]) {
99101
rS[NgtRendererClassId.store] = store;
102+
} else if (rS[NgtRendererClassId.store] !== store) {
103+
// reassign store if it's different
104+
let resolvedStore = store;
105+
let shouldReassign = false;
106+
107+
// check if resolved store has renderer state store as an ancestor
108+
while (resolvedStore.snapshot.previousRoot) {
109+
// if it is, then we reassign
110+
if (resolvedStore.snapshot.previousRoot.snapshot.id === rS[NgtRendererClassId.store].snapshot.id) {
111+
shouldReassign = true;
112+
break;
113+
}
114+
resolvedStore = resolvedStore.snapshot.previousRoot;
115+
}
116+
117+
if (shouldReassign) {
118+
rS[NgtRendererClassId.store] = store;
119+
}
100120
}
121+
122+
// reassign cache key
123+
cacheKey = `${type.id}-${rS[NgtRendererClassId.store].snapshot.id}`;
101124
}
102125

103126
const removeRenderer = (renderer: Renderer2) => {
@@ -117,7 +140,7 @@ export class NgtRendererFactory2 implements RendererFactory2 {
117140
if (isPortal) {
118141
this.portals.add(renderer);
119142
} else {
120-
this.rendererMap.set(type.id, renderer);
143+
this.rendererMap.set(cacheKey, renderer);
121144
}
122145
}
123146

@@ -139,7 +162,7 @@ export class NgtRenderer2 implements Renderer2 {
139162
private document: Document,
140163
private store: SignalState<NgtState> | null,
141164
private removeRenderer: (renderer: Renderer2) => void,
142-
private count = 1,
165+
private count = 0,
143166
) {}
144167

145168
get data(): { [key: string]: any } {

0 commit comments

Comments
 (0)