@woosh/meep-engine 2.34.48 → 2.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/core/binary/BitSet.js +7 -2
  2. package/core/bvh2/BinaryNode.js +19 -35
  3. package/core/bvh2/aabb3/aabb3_intersects_frustum_array.js +5 -5
  4. package/core/bvh2/aabb3_combined_surface_area.js +21 -0
  5. package/core/bvh2/traversal/queryBinaryNode_FrustumIntersections.js +24 -12
  6. package/core/cache/Cache.d.ts +2 -0
  7. package/core/cache/Cache.js +27 -23
  8. package/core/geom/3d/frustum/frustum_from_projection_matrix_array.js +29 -24
  9. package/core/math/max2.js +2 -6
  10. package/core/math/min2.js +2 -6
  11. package/engine/asset/loaders/geometry/geometry/computeGeometryEquality.js +3 -2
  12. package/engine/asset/loaders/geometry/geometry/computeGeometryHash.js +9 -1
  13. package/engine/ecs/EntityComponentDataset.js +7 -2
  14. package/engine/ecs/foliage/ViewState.js +13 -3
  15. package/engine/ecs/parent/EntityNode.js +23 -11
  16. package/engine/ecs/transform/Transform.js +15 -13
  17. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +63 -26
  18. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +63 -3
  19. package/engine/graphics/ecs/mesh-v2/render/AbstractRenderAdapter.js +67 -0
  20. package/engine/graphics/ecs/mesh-v2/render/GenericRendererAdapter.js +48 -0
  21. package/engine/graphics/ecs/mesh-v2/render/InstancedRendererAdapter.js +110 -0
  22. package/engine/graphics/ecs/mesh-v2/render/ShadedGeometryRendererContext.js +98 -0
  23. package/engine/graphics/ecs/mesh-v2/sample/load_gltf.js +5 -0
  24. package/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +23 -5
  25. package/engine/graphics/ecs/mesh-v2/three_object_to_entity_composition.js +8 -3
  26. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +23 -85
  27. package/engine/graphics/geometry/instancing/rewriteMaterial.js +9 -45
  28. package/engine/graphics/material/optimization/BUFFER_GEOMETRY_UVS.js +10 -0
  29. package/engine/graphics/material/optimization/MaterialDescriptor.js +46 -0
  30. package/engine/graphics/material/optimization/MaterialOptimizationContext.js +470 -201
  31. package/engine/graphics/material/optimization/UvContext.js +18 -0
  32. package/engine/graphics/material/optimization/is_compliant_mesh.js +71 -0
  33. package/engine/graphics/material/optimization/prepare_atlas_texture.js +23 -0
  34. package/engine/graphics/material/optimization/prototypeMaterialOptimizer.js +127 -0
  35. package/engine/graphics/micron/convert_three_object_to_micron.js +0 -2
  36. package/engine/graphics/micron/format/MicronGeometryPatch.js +34 -24
  37. package/engine/graphics/micron/format/VirtualGeometry.js +47 -11
  38. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +22 -0
  39. package/engine/graphics/micron/prototypeVirtualGeometry.js +6 -3
  40. package/engine/graphics/micron/render/VirtualGeometryBuilder.js +9 -18
  41. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +1 -45
  42. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +18 -7
  43. package/engine/graphics/micron/render/refinement/RefinementSpec.js +0 -12
  44. package/engine/graphics/micron/render/refinement/get_geometry_patch_cut.js +19 -24
  45. package/engine/graphics/micron/render/v1/MaterialContext.js +3 -2
  46. package/engine/graphics/micron/render/v1/VGThreeRenderer.js +19 -4
  47. package/engine/graphics/render/utils/ThreeBypassRenderer.js +3 -2
  48. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +1 -0
  49. package/engine/graphics/texture/normalized_internal_format.js +48 -0
  50. package/engine/graphics/texture/sampler/Sampler2D.js +6 -0
  51. package/engine/graphics/texture/sampler/sampler2d_copy_channel_data.js +25 -0
  52. package/engine/graphics/texture/sampler/scaleSampler2D.js +3 -0
  53. package/engine/graphics/texture/sampler/util/drawSamplerHTML.js +14 -1
  54. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ import Vector2 from "../../../../core/geom/Vector2.js";
2
+ import AABB2 from "../../../../core/geom/AABB2.js";
3
+
4
+ export class UvContext {
5
+ constructor() {
6
+ /**
7
+ * Resolution of texture
8
+ * @type {Vector2}
9
+ */
10
+ this.resolution = new Vector2(1, 1);
11
+
12
+ /**
13
+ *
14
+ * @type {AABB2}
15
+ */
16
+ this.atlas_patch = new AABB2();
17
+ }
18
+ }
@@ -0,0 +1,71 @@
1
+ import { TextureAttachmentsByMaterialType } from "../../../asset/loaders/material/TextureAttachmensByMaterialType.js";
2
+ import { max2 } from "../../../../core/math/max2.js";
3
+ import { BUFFER_GEOMETRY_UVS } from "./BUFFER_GEOMETRY_UVS.js";
4
+
5
+ /**
6
+ * Is this mesh qualified to be optimized?
7
+ * @param {THREE.Mesh} mesh
8
+ * @returns {boolean}
9
+ */
10
+ export function is_compliant_mesh(mesh) {
11
+ const material = mesh.material;
12
+
13
+ const attachments = TextureAttachmentsByMaterialType[material.type];
14
+
15
+ const uv_scales = [1, 1, 1, 1];
16
+
17
+ const texture_attachment_count = attachments.length;
18
+
19
+ for (let i = 0; i < texture_attachment_count; i++) {
20
+ const attachment = attachments[i];
21
+
22
+ const texture = attachment.read(material);
23
+ if (texture === undefined || texture === null) {
24
+ continue;
25
+ }
26
+
27
+ const uv_index = attachment.uv_index;
28
+
29
+ uv_scales[uv_index * 2] = max2(uv_scales[uv_index * 2], texture.repeat.x)
30
+ uv_scales[uv_index * 2 + 1] = max2(uv_scales[uv_index * 2 + 1], texture.repeat.y)
31
+ }
32
+
33
+ const geometry = mesh.geometry;
34
+
35
+ for (let i = 0; i < BUFFER_GEOMETRY_UVS.length; i++) {
36
+ const uv_metadata = BUFFER_GEOMETRY_UVS[i];
37
+
38
+ /**
39
+ *
40
+ * @type {THREE.BufferAttribute }
41
+ */
42
+ const attribute = geometry.attributes[uv_metadata.name];
43
+
44
+ if (attribute === undefined) {
45
+ continue;
46
+ }
47
+
48
+ const attribute_data = attribute.array;
49
+ const n = attribute_data.length;
50
+
51
+ const uv_index = uv_metadata.index;
52
+ const uv_index_2 = uv_index * 2;
53
+
54
+ for (let j = 0; j < n; j += 2) {
55
+ const x = attribute_data[j];
56
+ const y = attribute_data[j + 1];
57
+
58
+ const scaled_u = x * uv_scales[uv_index_2];
59
+ const scaled_v = y * uv_scales[uv_index_2 + 1];
60
+
61
+ if (scaled_u > 1 || scaled_u < 0 || scaled_v > 1 || scaled_v < 0) {
62
+ // repeating/negative UV value
63
+ return false;
64
+ }
65
+
66
+ }
67
+
68
+ }
69
+
70
+ return true;
71
+ }
@@ -0,0 +1,23 @@
1
+ import { LinearEncoding, LinearFilter, LinearMipmapLinearFilter, sRGBEncoding } from "three";
2
+
3
+ /**
4
+ *
5
+ * @param {Texture} texture
6
+ * @param {string} attachment_name
7
+ */
8
+ export function prepare_atlas_texture(texture, attachment_name) {
9
+
10
+ switch (attachment_name) {
11
+ case 'diffuse':
12
+ texture.encoding = sRGBEncoding;
13
+ break;
14
+ default:
15
+ texture.encoding = LinearEncoding;
16
+ }
17
+
18
+ texture.anisotropy = 4;
19
+ texture.minFilter = LinearMipmapLinearFilter;
20
+ texture.magFilter = LinearFilter;
21
+
22
+ texture.generateMipmaps = true;
23
+ }
@@ -0,0 +1,127 @@
1
+ import { EngineHarness } from "../../../EngineHarness.js";
2
+ import { EngineConfiguration } from "../../../EngineConfiguration.js";
3
+ import { ShadedGeometrySystem } from "../../ecs/mesh-v2/ShadedGeometrySystem.js";
4
+ import { AttachmentSystem } from "../../../ecs/attachment/AttachmentSystem.js";
5
+ import { TransformAttachmentSystem } from "../../../ecs/transform-attachment/TransformAttachmentSystem.js";
6
+ import { GameAssetType } from "../../../asset/GameAssetType.js";
7
+ import { GLTFAssetLoader } from "../../../asset/loaders/GLTFAssetLoader.js";
8
+ import { three_object_to_entity_composition } from "../../ecs/mesh-v2/three_object_to_entity_composition.js";
9
+ import { MaterialOptimizationContext } from "./MaterialOptimizationContext.js";
10
+ import { bvh_traverse_pre_order_using_stack } from "../../../../core/bvh2/traversal/bvh_traverse_pre_order_using_stack.js";
11
+
12
+ const eh = new EngineHarness();
13
+
14
+
15
+ /**
16
+ *
17
+ * @param {Engine} engine
18
+ */
19
+ function optimize(engine) {
20
+ MaterialOptimizationContext.MAX_TEXTURE_SIZE = engine.graphics.renderer.capabilities.maxTextureSize;
21
+
22
+ const optimizer = new MaterialOptimizationContext();
23
+
24
+ engine.graphics.layers.layers.forEach(l => {
25
+ bvh_traverse_pre_order_using_stack(l.bvh, node => {
26
+ if (node.isLeafNode) {
27
+ const object = l.extractRenderable(node.object);
28
+
29
+ if (object) {
30
+ optimizer.addObject(object);
31
+ }
32
+ }
33
+ });
34
+ });
35
+
36
+ optimizer.update();
37
+
38
+ console.log(optimizer);
39
+
40
+ // drawSamplerHTML(document.body, optimizer.atlases.get('roughness'), 20, 20, 1, 0, 512);
41
+ // drawSamplerHTML(document.body, optimizer.atlases.get('metalness'), 532, 20, 1, 0, 512);
42
+ // drawSamplerHTML(document.body, optimizer.atlases.get('ao'), 20, 532, 1, 0, 512);
43
+ // drawSamplerHTML(document.body, optimizer.atlases.get('normal'), 532, 20, 1, 0, 512);
44
+ // drawSamplerHTML(document.body, optimizer.atlases.get('diffuse'), 20, 20, 1, 0, 1024);
45
+ // drawSamplerHTML(document.body, optimizer.atlases.get('normal'), 552, 20, 1, 0, 512);
46
+ }
47
+
48
+ /**
49
+ *
50
+ * @param {EngineHarness} harness
51
+ * @return {Promise<void>}
52
+ */
53
+ async function init(harness) {
54
+ const engine = harness.engine;
55
+
56
+ const config = new EngineConfiguration();
57
+
58
+ config.addSystem(new ShadedGeometrySystem(engine));
59
+ config.addSystem(new AttachmentSystem());
60
+ config.addSystem(new TransformAttachmentSystem());
61
+
62
+ const gltf_loader = new GLTFAssetLoader();
63
+
64
+ config.addLoader(GameAssetType.ModelGLTF_JSON, gltf_loader);
65
+
66
+ await config.apply(engine);
67
+
68
+ eh.initialize().then(main);
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @param {string} path
74
+ * @param {Engine} engine
75
+ */
76
+ async function load_gltf(path, engine) {
77
+ const em = engine.entityManager;
78
+
79
+ const ecd = em.dataset;
80
+
81
+ const asset = await engine.assetManager.promise(path, GameAssetType.ModelGLTF_JSON);
82
+
83
+ const three_object = asset.create();
84
+
85
+ console.time('composition conversion');
86
+ const composition = three_object_to_entity_composition(three_object);
87
+ console.timeEnd('composition conversion');
88
+
89
+ console.time('composition build');
90
+ // console.profile('composition build');
91
+ composition.build(ecd);
92
+ // console.profileEnd('composition build');
93
+ console.timeEnd('composition build');
94
+ }
95
+
96
+ async function timeout(t = 1) {
97
+ await new Promise((resolve, reject) => setTimeout(resolve, t));
98
+ }
99
+
100
+ /**
101
+ *
102
+ * @param {Engine} engine
103
+ */
104
+ async function main(engine) {
105
+
106
+ EngineHarness.buildBasics({
107
+ engine,
108
+ enableWater: false,
109
+ enableTerrain: true
110
+ });
111
+
112
+ // a small delay to let background tasks finish, so we can get better performance reading later on
113
+ timeout(2000);
114
+
115
+ await load_gltf('moicon/06_04_hapro/08-clickable-assets-new/model.gltf', engine);
116
+ // await load_gltf('moicon/06_04_hapro/05-ground-floor/model.gltf', engine);
117
+
118
+ optimize(engine);
119
+
120
+ // load_gltf('moicon/06_04_hapro/07-1st-basement/model.gltf', engine);
121
+ // load_gltf('moicon/06_04_hapro/06-lower-ground/model.gltf', engine);
122
+ // load_gltf('moicon/06_04_hapro/05-ground-floor/model.gltf', engine);
123
+ // load_gltf('moicon/06_04_hapro/04-1st-floor/model.gltf', engine);
124
+ // load_gltf('moicon/06_04_hapro/03-2nd-floor/model.gltf', engine);
125
+ }
126
+
127
+ init(eh);
@@ -76,8 +76,6 @@ export async function convert_three_object_to_micron(object, micron_cache = defa
76
76
 
77
77
  await micron_cache.set(g, micron_geometry);
78
78
 
79
- // console.log(micron_geometry);
80
-
81
79
  return micron_geometry;
82
80
  }
83
81
 
@@ -1,6 +1,6 @@
1
- import { squirrel3 } from "../../../../core/math/hash/squirrel3.js";
2
1
  import { ConicRay } from "../../../../core/geom/ConicRay.js";
3
2
  import { vec4 } from "gl-matrix";
3
+ import { assert } from "../../../../core/assert.js";
4
4
 
5
5
  /**
6
6
  * Patches are organized into a tree hierarchy
@@ -13,36 +13,37 @@ export class MicronGeometryPatch {
13
13
  */
14
14
  this.id = 0;
15
15
 
16
- /**
17
- * Continuous memory region for various pieces of data to get better memory access patterns
18
- * All pieces of data end up in a continuous piece of memory, resulting in better cache coherence
19
- * @type {ArrayBuffer}
20
- */
21
- const array_buffer = new ArrayBuffer((6 + 6 + 24) * 4);
22
-
23
16
  /**
24
17
  * Bounds are used to determine screen error and whether a patch should be subdivided or not for rendering
25
18
  * @type {number[]}
26
19
  */
27
- this.bounding_box = new Float32Array(array_buffer, 0, 6);
20
+ this.bounding_box = null;
28
21
 
29
22
  /**
30
23
  *
31
24
  * @type {vec4|number[]}
32
25
  */
33
- this.bounding_sphere = vec4.create()
26
+ this.bounding_sphere = vec4.create();
34
27
 
35
28
  /**
36
29
  *
37
30
  * @type {number[]|Float32Array}
38
31
  */
39
- this.group_bounding_box = new Float32Array(array_buffer, 6 * 4, 6);
32
+ this.group_bounding_box = null;
40
33
 
41
34
  /**
42
35
  *
43
36
  * @type {number[]|Float32Array}
44
37
  */
45
- this.group_bounding_box_corners = new Float32Array(array_buffer, 12 * 4, 24);
38
+ this.group_bounding_box_corners = null;
39
+
40
+ /**
41
+ * Continuous memory region for various pieces of data to get better memory access patterns
42
+ * All pieces of data end up in a continuous piece of memory, resulting in better cache coherence
43
+ * @type {ArrayBuffer}
44
+ */
45
+ const array_buffer = new ArrayBuffer(144);
46
+ this.allocate_metadata(array_buffer, 0);
46
47
 
47
48
  /**
48
49
  *
@@ -114,21 +115,25 @@ export class MicronGeometryPatch {
114
115
  }
115
116
 
116
117
  /**
117
- * @deprecated
118
+ *
119
+ * @param {ArrayBuffer} buffer
120
+ * @param {number} offset
121
+ * @returns {number}
118
122
  */
119
- get parent() {
120
- throw new Error('Single parent is no longer supported, use .parents instead');
121
- }
123
+ allocate_metadata(buffer, offset) {
124
+ assert.greaterThanOrEqual(buffer.byteLength, offset + 144, 'buffer underflow');
122
125
 
123
- /**
124
- * @deprecated
125
- */
126
- set parent(v) {
127
- throw new Error('Single parent is no longer supported, use .parents instead');
126
+ this.bounding_box = new Float32Array(buffer, offset, 6);
127
+
128
+ this.group_bounding_box = new Float32Array(buffer, offset + 24, 6);
129
+
130
+ this.group_bounding_box_corners = new Float32Array(buffer, offset + 48, 24);
131
+
132
+ return 144;
128
133
  }
129
134
 
130
135
  hash() {
131
- return squirrel3(this.id);
136
+ return this.id;
132
137
  }
133
138
 
134
139
  computeByteSize() {
@@ -136,8 +141,13 @@ export class MicronGeometryPatch {
136
141
 
137
142
  result += this.face_indices.buffer.byteLength;
138
143
 
139
- for (let i = 0; i < this.vertex_attribute_arrays.length; i++) {
140
- result += this.vertex_attribute_arrays[i].buffer.byteLength;
144
+ const attribute_arrays = this.vertex_attribute_arrays;
145
+ const attribute_count = attribute_arrays.length;
146
+
147
+ for (let i = 0; i < attribute_count; i++) {
148
+ const attribute_array = attribute_arrays[i];
149
+
150
+ result += attribute_array.buffer.byteLength;
141
151
  }
142
152
 
143
153
  return result;
@@ -1,12 +1,31 @@
1
+ import { MicronGeometryPatchOccurrence } from "./MicronGeometryPatchOccurance.js";
2
+
1
3
  export class VirtualGeometry {
2
4
  constructor() {
5
+ /**
6
+ * pack patch instance as [INSTANCE_ID, GEOMETRY_ID, PATCH_ID]
7
+ * @type {number[]}
8
+ */
9
+ this.patches = new Uint32Array(300000);
10
+
3
11
  /**
4
12
  *
5
- * @type {MicronGeometryPatchOccurrence[]}
13
+ * @type {number}
6
14
  */
7
- this.patches = [];
8
15
  this.patch_count = 0;
9
16
 
17
+ /**
18
+ * Lookup table of matrix transforms
19
+ * @type {number[][]}
20
+ */
21
+ this.lookup_instance_transforms = [];
22
+
23
+ /**
24
+ * Lookup table of geometries
25
+ * @type {MicronGeometry[]}
26
+ */
27
+ this.loolup_geometries = [];
28
+
10
29
  /**
11
30
  *
12
31
  * @type {number}
@@ -30,11 +49,20 @@ export class VirtualGeometry {
30
49
  */
31
50
  computeFaceCount() {
32
51
  let r = 0;
33
- const patchCount = this.patch_count;
34
- for (let i = 0; i < patchCount; i++) {
35
- const occurrence = this.patches[i];
52
+ const patch_count = this.patch_count;
53
+ const patches = this.patches;
54
+
55
+ for (let i = 0; i < patch_count; i++) {
56
+ const i3 = i * 3;
57
+
58
+ const geometry_id = patches[i3 + 1];
59
+ const patch_id = patches[i3 + 2];
60
+
61
+ const geometry = this.loolup_geometries[geometry_id];
36
62
 
37
- r += occurrence.patch.polygon_count;
63
+ const patch = geometry.patches[patch_id];
64
+
65
+ r += patch.polygon_count;
38
66
  }
39
67
 
40
68
  return r;
@@ -46,11 +74,19 @@ export class VirtualGeometry {
46
74
  */
47
75
  computeVertexCount() {
48
76
  let r = 0;
49
- const patchCount = this.patch_count;
50
- for (let i = 0; i < patchCount; i++) {
51
- const occurrence = this.patches[i];
77
+ const patch_count = this.patch_count;
78
+ const patches = this.patches;
79
+ for (let i = 0; i < patch_count; i++) {
80
+ const i3 = i * 3;
81
+
82
+ const geometry_id = patches[i3 + 1];
83
+ const patch_id = patches[i3 + 2];
84
+
85
+ const geometry = this.loolup_geometries[geometry_id];
86
+
87
+ const patch = geometry.patches[patch_id];
52
88
 
53
- r += occurrence.patch.vertex_count;
89
+ r += patch.vertex_count;
54
90
  }
55
91
 
56
92
  return r;
@@ -61,7 +97,7 @@ export class VirtualGeometry {
61
97
  * @param {MicronGeometryPatchOccurrence} patch
62
98
  */
63
99
  add(patch) {
64
- this.patches[this.patch_count++] = patch;
100
+ throw new Error('Deprecated');
65
101
  }
66
102
 
67
103
  clear() {
@@ -77,25 +77,47 @@ export class MicronGeometryBinarySerializationAdapter extends BinaryClassSeriali
77
77
 
78
78
  const patch_count = buffer.readUintVar();
79
79
 
80
+ /**
81
+ *
82
+ * @type {MicronGeometryPatch[]}
83
+ */
80
84
  const patches = [];
81
85
 
86
+ // for the sake of speed, we will allocate all metadata in the same piece of memory to make traversal of patch hierarchy faster
87
+ const md_buffer = new ArrayBuffer(patch_count * 144);
88
+ let md_buffer_offset = 0;
89
+
82
90
  // build initial patches
83
91
  for (let i = 0; i < patch_count; i++) {
84
92
  const patch = new MicronGeometryPatch();
85
93
 
86
94
  patch.id = i;
87
95
 
96
+ md_buffer_offset += patch.allocate_metadata(md_buffer, md_buffer_offset);
97
+
88
98
  patches[i] = patch;
89
99
  }
90
100
 
101
+ let source_triangle_count = 0;
102
+ // NOTE: we can't easily find out source vertex count as vertices are duplicated across patches
103
+
104
+
91
105
  //read patches
92
106
  for (let i = 0; i < patch_count; i++) {
93
107
  const patch = patches[i];
94
108
 
95
109
  deserialize_patch(buffer, patch, vertex_spec, patches);
110
+
111
+ // collect source metadata
112
+ if (patch.lod === 0) {
113
+ source_triangle_count += patch.polygon_count;
114
+ }
96
115
  }
97
116
 
98
117
  value.patches = patches;
99
118
  value.root = patches[root_patch_index];
119
+
120
+ // write source metadata
121
+ value.source_triangle_count = source_triangle_count;
100
122
  }
101
123
  }
@@ -1,10 +1,8 @@
1
1
  import {
2
2
  AmbientLight,
3
3
  BoxBufferGeometry,
4
- CameraHelper,
5
4
  CubeTextureLoader,
6
5
  DirectionalLight,
7
- DirectionalLightHelper,
8
6
  FrontSide,
9
7
  Matrix4,
10
8
  Mesh,
@@ -64,6 +62,10 @@ metrics.create({
64
62
  name: 'adapter_update', buffer_size: METRIC_BUFFER_SIZE
65
63
  });
66
64
 
65
+ metrics.create({
66
+ name: 'debug_v0', buffer_size: METRIC_BUFFER_SIZE
67
+ });
68
+
67
69
  let container, stats;
68
70
 
69
71
  let camera, scene, renderer;
@@ -479,7 +481,8 @@ function init() {
479
481
  // gltf_sample('moicon/03_Jan_22_Demo/8-assets/model.gltf');
480
482
  // gltf_sample('moicon/03_Jan_22_Demo/worker_test/model.gltf');
481
483
  // gltf_sample('moicon/A4/A4/model.gltf');
482
- gltf_sample('moicon/ztest_object_many_pieces/model.gltf');
484
+ gltf_sample('moicon/06_04_hapro/08-clickable-assets-new/model.gltf');
485
+ // gltf_sample('moicon/ztest_object_many_pieces/model.gltf');
483
486
  // gltf_grid('moicon/ztest_object_many_pieces/model.gltf', 3, 3);
484
487
 
485
488
  document.addEventListener("mousemove", onDocumentMouseMove);
@@ -4,6 +4,7 @@ import { RefinementSpec } from "./refinement/RefinementSpec.js";
4
4
  import { ActivePatchList } from "./refinement/ActivePatchList.js";
5
5
  import { mat4 } from "gl-matrix";
6
6
  import { get_geometry_patch_cut } from "./refinement/get_geometry_patch_cut.js";
7
+ import { traverseThreeObject } from "../../ecs/highlight/renderer/traverseThreeObject.js";
7
8
 
8
9
  /**
9
10
  * @readonly
@@ -106,7 +107,7 @@ export class VirtualGeometryBuilder {
106
107
  }
107
108
 
108
109
  /**
109
- *
110
+ * @private
110
111
  * @param {THREE.Object3D|ThreeMicronMesh} object
111
112
  */
112
113
  buildForObject(object) {
@@ -133,15 +134,6 @@ export class VirtualGeometryBuilder {
133
134
  );
134
135
  }
135
136
  }
136
-
137
- const children = object.children;
138
- const children_count = children.length;
139
-
140
- for (let i = 0; i < children_count; i++) {
141
- const child = children[i];
142
-
143
- this.buildForObject(child);
144
- }
145
137
  }
146
138
 
147
139
  /**
@@ -165,19 +157,17 @@ export class VirtualGeometryBuilder {
165
157
  output.stats_source_triangle_count += geometry.source_triangle_count;
166
158
  output.stats_source_vertex_count += geometry.source_vertex_count;
167
159
 
168
- // build up occurances
169
- const output_patches = output.patches;
160
+ output.loolup_geometries[geometry.id] = geometry;
161
+ output.lookup_instance_transforms[instance_id] = transform;
170
162
 
171
- const added_patch_count = get_geometry_patch_cut(
172
- output_patches,
173
- output.patch_count,
163
+ // build up occurances
164
+ get_geometry_patch_cut(
165
+ output,
174
166
  refinement_spec,
175
167
  geometry,
176
168
  instance_id,
177
169
  transform
178
170
  );
179
-
180
- output.patch_count += added_patch_count;
181
171
  }
182
172
 
183
173
  clearScene() {
@@ -211,10 +201,11 @@ export class VirtualGeometryBuilder {
211
201
  const n = this.input_scene_length;
212
202
  const input_objects = this.input_scene;
213
203
 
204
+
214
205
  for (let i = 0; i < n; i++) {
215
206
  const object3D = input_objects[i];
216
207
 
217
- this.buildForObject(object3D);
208
+ traverseThreeObject(object3D, this.buildForObject, this);
218
209
  }
219
210
 
220
211
 
@@ -3,55 +3,11 @@ import { MICRON_PATCH_SIZE_MAX } from "../../build/MICRON_PATCH_SIZE_MAX.js";
3
3
  import { typed_array_copy } from "../../../../../core/collection/array/typed/typed_array_copy.js";
4
4
  import { channelCountToThreeTextureFormat } from "../../../texture/channelCountToThreeTextureFormat.js";
5
5
  import { DataTexture, NearestFilter } from "three";
6
- import { DataType } from "../../../../../core/collection/table/DataType.js";
7
6
  import { compute_micron_buffer_array_constructor } from "../../build/compute_micron_buffer_array_constructor.js";
8
7
  import { computeThreeTextureTypeFromDataType } from "../../../render/forward_plus/data/computeThreeTextureTypeFromDataType.js";
9
8
  import { computeThreeTextureInternalFormatFromDataType } from "../../../render/forward_plus/data/computeThreeTextureInternalFormatFromDataType.js";
10
9
  import { DataTypeByteSizes } from "../../../../../core/collection/table/DataTypeByteSizes.js";
11
-
12
- /**
13
- *
14
- * @returns {string}
15
- * @param {DataType} dt
16
- * @param {number} channel_count
17
- */
18
- function normalized_internal_format(dt, channel_count) {
19
- let suffix = '';
20
- switch (dt) {
21
- case DataType.Uint8:
22
- suffix = '8';
23
- break;
24
- case DataType.Int8:
25
- suffix = '8_SNORM';
26
- break;
27
- case DataType.Uint16:
28
- suffix = '16UI';
29
- break;
30
- default:
31
- throw new Error(`Unsupported data type '${dt}'`);
32
- }
33
-
34
- let prefix = '';
35
-
36
- switch (channel_count) {
37
- case 1:
38
- prefix = 'R';
39
- break;
40
- case 2:
41
- prefix = 'RG';
42
- break;
43
- case 3:
44
- prefix = 'RGB';
45
- break;
46
- case 4:
47
- prefix = 'RGBA';
48
- break;
49
- default:
50
- throw new Error(`Unsupported channel count '${channel_count}'`);
51
- }
52
-
53
- return prefix + suffix;
54
- }
10
+ import { normalized_internal_format } from "../../../texture/normalized_internal_format.js";
55
11
 
56
12
  export class AttributeDataTexture {
57
13
  /**