@zephyr3d/scene 0.4.0 → 0.6.0

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 (233) hide show
  1. package/dist/animation/animation.js +25 -117
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +191 -51
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js +6 -18
  6. package/dist/animation/animationtrack.js.map +1 -1
  7. package/dist/animation/eulerrotationtrack.js +16 -6
  8. package/dist/animation/eulerrotationtrack.js.map +1 -1
  9. package/dist/animation/morphtarget.js +104 -0
  10. package/dist/animation/morphtarget.js.map +1 -0
  11. package/dist/animation/morphtrack.js +70 -0
  12. package/dist/animation/morphtrack.js.map +1 -0
  13. package/dist/animation/rotationtrack.js +15 -7
  14. package/dist/animation/rotationtrack.js.map +1 -1
  15. package/dist/animation/scaletrack.js +15 -7
  16. package/dist/animation/scaletrack.js.map +1 -1
  17. package/dist/animation/skeleton.js +107 -5
  18. package/dist/animation/skeleton.js.map +1 -1
  19. package/dist/animation/translationtrack.js +15 -7
  20. package/dist/animation/translationtrack.js.map +1 -1
  21. package/dist/app.js +4 -26
  22. package/dist/app.js.map +1 -1
  23. package/dist/asset/assetmanager.js +60 -109
  24. package/dist/asset/assetmanager.js.map +1 -1
  25. package/dist/asset/loaders/dds/dds.js +77 -3
  26. package/dist/asset/loaders/dds/dds.js.map +1 -1
  27. package/dist/asset/loaders/dds/dds_loader.js +1 -1
  28. package/dist/asset/loaders/gltf/gltf_loader.js +287 -40
  29. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  30. package/dist/asset/loaders/image/tga_Loader.js +1 -1
  31. package/dist/asset/loaders/image/webimage_loader.js +16 -0
  32. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  33. package/dist/asset/model.js +16 -9
  34. package/dist/asset/model.js.map +1 -1
  35. package/dist/blitter/bilateralblur.js +222 -0
  36. package/dist/{render/temporalcache.js.map → blitter/bilateralblur.js.map} +1 -1
  37. package/dist/blitter/blitter.js +9 -3
  38. package/dist/blitter/blitter.js.map +1 -1
  39. package/dist/blitter/depthlimitedgaussion.js +96 -39
  40. package/dist/blitter/depthlimitedgaussion.js.map +1 -1
  41. package/dist/blitter/gaussianblur.js +21 -21
  42. package/dist/camera/camera.js +200 -4
  43. package/dist/camera/camera.js.map +1 -1
  44. package/dist/index.d.ts +6406 -5786
  45. package/dist/index.js +12 -10
  46. package/dist/index.js.map +1 -1
  47. package/dist/material/blinn.js +15 -4
  48. package/dist/material/blinn.js.map +1 -1
  49. package/dist/material/lambert.js +26 -17
  50. package/dist/material/lambert.js.map +1 -1
  51. package/dist/material/material.js +13 -2
  52. package/dist/material/material.js.map +1 -1
  53. package/dist/material/meshmaterial.js +103 -31
  54. package/dist/material/meshmaterial.js.map +1 -1
  55. package/dist/material/mixins/albedocolor.js +5 -4
  56. package/dist/material/mixins/albedocolor.js.map +1 -1
  57. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  58. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  59. package/dist/material/mixins/lightmodel/lambert.js +5 -5
  60. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -7
  61. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -7
  63. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  64. package/dist/material/mixins/lit.js +2 -2
  65. package/dist/material/mixins/pbr/common.js +454 -19
  66. package/dist/material/mixins/pbr/common.js.map +1 -1
  67. package/dist/material/pbrmr.js +28 -6
  68. package/dist/material/pbrmr.js.map +1 -1
  69. package/dist/material/pbrsg.js +27 -9
  70. package/dist/material/pbrsg.js.map +1 -1
  71. package/dist/material/shader/helper.js +128 -23
  72. package/dist/material/shader/helper.js.map +1 -1
  73. package/dist/material/unlit.js +8 -4
  74. package/dist/material/unlit.js.map +1 -1
  75. package/dist/posteffect/bloom.js +34 -53
  76. package/dist/posteffect/bloom.js.map +1 -1
  77. package/dist/posteffect/compositor.js +48 -58
  78. package/dist/posteffect/compositor.js.map +1 -1
  79. package/dist/posteffect/fxaa.js +3 -11
  80. package/dist/posteffect/fxaa.js.map +1 -1
  81. package/dist/posteffect/grayscale.js +3 -11
  82. package/dist/posteffect/grayscale.js.map +1 -1
  83. package/dist/posteffect/posteffect.js +4 -0
  84. package/dist/posteffect/posteffect.js.map +1 -1
  85. package/dist/posteffect/sao.js +55 -48
  86. package/dist/posteffect/sao.js.map +1 -1
  87. package/dist/posteffect/ssr.js +536 -0
  88. package/dist/{material/lit.js.map → posteffect/ssr.js.map} +1 -1
  89. package/dist/posteffect/tonemap.js +3 -11
  90. package/dist/posteffect/tonemap.js.map +1 -1
  91. package/dist/posteffect/water.js +306 -340
  92. package/dist/posteffect/water.js.map +1 -1
  93. package/dist/render/abuffer_oit.js +2 -2
  94. package/dist/render/clipmap.js +16 -19
  95. package/dist/render/clipmap.js.map +1 -1
  96. package/dist/render/cull_visitor.js +8 -6
  97. package/dist/render/cull_visitor.js.map +1 -1
  98. package/dist/render/depthpass.js +30 -14
  99. package/dist/render/depthpass.js.map +1 -1
  100. package/dist/render/drawable_mixin.js +70 -22
  101. package/dist/render/drawable_mixin.js.map +1 -1
  102. package/dist/render/envlight.js +169 -33
  103. package/dist/render/envlight.js.map +1 -1
  104. package/dist/render/fft_wavegenerator.js +989 -0
  105. package/dist/{shaders/framework.js.map → render/fft_wavegenerator.js.map} +1 -1
  106. package/dist/render/gerstner_wavegenerator.js +265 -0
  107. package/dist/{material/standard.js.map → render/gerstner_wavegenerator.js.map} +1 -1
  108. package/dist/render/globalbindgroup_allocator.js +2 -1
  109. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  110. package/dist/render/hzb.js +273 -0
  111. package/dist/{material/terrainlightmodel.js.map → render/hzb.js.map} +1 -1
  112. package/dist/render/lightpass.js +68 -28
  113. package/dist/render/lightpass.js.map +1 -1
  114. package/dist/render/objectcolorpass.js +51 -0
  115. package/dist/render/objectcolorpass.js.map +1 -0
  116. package/dist/render/render_queue.js +211 -158
  117. package/dist/render/render_queue.js.map +1 -1
  118. package/dist/render/renderbundle_wrapper.js +79 -0
  119. package/dist/render/renderbundle_wrapper.js.map +1 -1
  120. package/dist/render/renderer.js +151 -35
  121. package/dist/render/renderer.js.map +1 -1
  122. package/dist/render/renderpass.js +27 -20
  123. package/dist/render/renderpass.js.map +1 -1
  124. package/dist/render/shadowmap_pass.js +20 -14
  125. package/dist/render/shadowmap_pass.js.map +1 -1
  126. package/dist/render/sky.js +12 -13
  127. package/dist/render/sky.js.map +1 -1
  128. package/dist/render/watermesh.js +94 -828
  129. package/dist/render/watermesh.js.map +1 -1
  130. package/dist/render/wavegenerator.js +8 -0
  131. package/dist/render/wavegenerator.js.map +1 -0
  132. package/dist/render/weightedblended_oit.js +11 -28
  133. package/dist/render/weightedblended_oit.js.map +1 -1
  134. package/dist/scene/batchgroup.js +60 -14
  135. package/dist/scene/batchgroup.js.map +1 -1
  136. package/dist/scene/environment.js +24 -3
  137. package/dist/scene/environment.js.map +1 -1
  138. package/dist/scene/graph_node.js +0 -14
  139. package/dist/scene/graph_node.js.map +1 -1
  140. package/dist/scene/light.js +5 -5
  141. package/dist/scene/mesh.js +62 -15
  142. package/dist/scene/mesh.js.map +1 -1
  143. package/dist/scene/octree.js +5 -2
  144. package/dist/scene/octree.js.map +1 -1
  145. package/dist/scene/raycast_visitor.js +4 -2
  146. package/dist/scene/raycast_visitor.js.map +1 -1
  147. package/dist/scene/scene.js +6 -9
  148. package/dist/scene/scene.js.map +1 -1
  149. package/dist/scene/scene_node.js +11 -8
  150. package/dist/scene/scene_node.js.map +1 -1
  151. package/dist/scene/terrain/grass.js +10 -2
  152. package/dist/scene/terrain/grass.js.map +1 -1
  153. package/dist/scene/terrain/heightfield.js +135 -53
  154. package/dist/scene/terrain/heightfield.js.map +1 -1
  155. package/dist/scene/terrain/patch.js +10 -2
  156. package/dist/scene/terrain/patch.js.map +1 -1
  157. package/dist/scene/terrain/quadtree.js +2 -2
  158. package/dist/scene/terrain/terrain.js +1 -1
  159. package/dist/scene/xform.js +7 -9
  160. package/dist/scene/xform.js.map +1 -1
  161. package/dist/shaders/misc.js +10 -1
  162. package/dist/shaders/misc.js.map +1 -1
  163. package/dist/shaders/noise.js +81 -16
  164. package/dist/shaders/noise.js.map +1 -1
  165. package/dist/shaders/shadow.js +1 -9
  166. package/dist/shaders/shadow.js.map +1 -1
  167. package/dist/shaders/ssr.js +442 -0
  168. package/dist/{material/terrainmat.js.map → shaders/ssr.js.map} +1 -1
  169. package/dist/shaders/water.js +377 -250
  170. package/dist/shaders/water.js.map +1 -1
  171. package/dist/shadow/esm.js +4 -22
  172. package/dist/shadow/esm.js.map +1 -1
  173. package/dist/shadow/shadowmapper.js +56 -31
  174. package/dist/shadow/shadowmapper.js.map +1 -1
  175. package/dist/shadow/vsm.js +4 -24
  176. package/dist/shadow/vsm.js.map +1 -1
  177. package/dist/shapes/cylinder.js +6 -5
  178. package/dist/shapes/cylinder.js.map +1 -1
  179. package/dist/utility/bounding_volume.js +1 -53
  180. package/dist/utility/bounding_volume.js.map +1 -1
  181. package/dist/utility/draco/decoder.js +116 -0
  182. package/dist/utility/draco/decoder.js.map +1 -0
  183. package/dist/utility/misc.js +93 -0
  184. package/dist/utility/misc.js.map +1 -0
  185. package/dist/utility/shprojection.js +2 -7
  186. package/dist/utility/shprojection.js.map +1 -1
  187. package/dist/utility/textures/ggxlut.js +213 -0
  188. package/dist/utility/textures/ggxlut.js.map +1 -0
  189. package/dist/utility/textures/gradientnoise.js +61 -0
  190. package/dist/utility/textures/gradientnoise.js.map +1 -0
  191. package/dist/utility/textures/randomnoise.js +41 -0
  192. package/dist/utility/textures/randomnoise.js.map +1 -0
  193. package/dist/values.js +25 -1
  194. package/dist/values.js.map +1 -1
  195. package/package.json +5 -8
  196. package/dist/animation/usertrack.js +0 -47
  197. package/dist/animation/usertrack.js.map +0 -1
  198. package/dist/material/grassmat.js +0 -127
  199. package/dist/material/grassmat.js.map +0 -1
  200. package/dist/material/lightmodel.js +0 -2074
  201. package/dist/material/lightmodel.js.map +0 -1
  202. package/dist/material/lit.js +0 -578
  203. package/dist/material/mixins/pbr/metallicroughness.js +0 -126
  204. package/dist/material/mixins/pbr/metallicroughness.js.map +0 -1
  205. package/dist/material/mixins/pbr/specularglossness.js +0 -104
  206. package/dist/material/mixins/pbr/specularglossness.js.map +0 -1
  207. package/dist/material/pbr.js +0 -27
  208. package/dist/material/pbr.js.map +0 -1
  209. package/dist/material/standard.js +0 -282
  210. package/dist/material/terrainlightmodel.js +0 -259
  211. package/dist/material/terrainmat.js +0 -357
  212. package/dist/render/depth_pass.js +0 -47
  213. package/dist/render/depth_pass.js.map +0 -1
  214. package/dist/render/forward.js +0 -186
  215. package/dist/render/forward.js.map +0 -1
  216. package/dist/render/forward_pass.js +0 -137
  217. package/dist/render/forward_pass.js.map +0 -1
  218. package/dist/render/helper.js +0 -38
  219. package/dist/render/helper.js.map +0 -1
  220. package/dist/render/renderscheme.js +0 -61
  221. package/dist/render/renderscheme.js.map +0 -1
  222. package/dist/render/temporalcache.js +0 -222
  223. package/dist/scene/model.js +0 -111
  224. package/dist/scene/model.js.map +0 -1
  225. package/dist/scene/octree_update_visitor.js +0 -20
  226. package/dist/scene/octree_update_visitor.js.map +0 -1
  227. package/dist/shaders/builtins.js +0 -110
  228. package/dist/shaders/builtins.js.map +0 -1
  229. package/dist/shaders/framework.js +0 -723
  230. package/dist/shaders/lighting.js +0 -335
  231. package/dist/shaders/lighting.js.map +0 -1
  232. package/dist/utility/sheenlut.js +0 -196
  233. package/dist/utility/sheenlut.js.map +0 -1
@@ -6,12 +6,12 @@ import { ShaderHelper } from '../material/shader/helper.js';
6
6
  import '../material/lambert.js';
7
7
  import '../material/blinn.js';
8
8
  import '../material/unlit.js';
9
+ import { RenderBundleWrapper } from './renderbundle_wrapper.js';
9
10
  import '../material/meshmaterial.js';
10
11
  import '../material/grassmaterial.js';
11
12
  import '../material/terrainmaterial.js';
12
13
  import '../material/pbrmr.js';
13
14
  import '../material/pbrsg.js';
14
- import { RenderBundleWrapper } from './renderbundle_wrapper.js';
15
15
 
16
16
  const maxBufferSizeInFloats = 65536 / 4;
17
17
  /** @internal */ class InstanceBindGroupAllocator {
@@ -63,7 +63,7 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
63
63
  * A queue that contains the items to be rendered
64
64
  * @public
65
65
  */ class RenderQueue {
66
- /** @internal */ _itemLists;
66
+ /** @internal */ _itemList;
67
67
  /** @internal */ _renderPass;
68
68
  /** @internal */ _shadowedLightList;
69
69
  /** @internal */ _unshadowedLightList;
@@ -71,12 +71,15 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
71
71
  /** @internal */ _bindGroupAllocator;
72
72
  /** @internal */ _ref;
73
73
  /** @internal */ _instanceInfo;
74
+ /** @internal */ _needSceneColor;
75
+ /** @internal */ _drawTransparent;
76
+ /** @internal */ _objectColorMaps;
74
77
  /**
75
78
  * Creates an instance of a render queue
76
79
  * @param renderPass - The render pass to which the render queue belongs
77
80
  */ constructor(renderPass, bindGroupAllocator){
78
81
  this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;
79
- this._itemLists = {};
82
+ this._itemList = null;
80
83
  this._renderPass = renderPass;
81
84
  this._shadowedLightList = [];
82
85
  this._unshadowedLightList = [];
@@ -85,6 +88,11 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
85
88
  ref: this
86
89
  };
87
90
  this._instanceInfo = new Map();
91
+ this._needSceneColor = false;
92
+ this._drawTransparent = false;
93
+ this._objectColorMaps = [
94
+ new Map()
95
+ ];
88
96
  }
89
97
  /** The sun light */ get sunLight() {
90
98
  return this._sunLight;
@@ -92,13 +100,19 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
92
100
  set sunLight(light) {
93
101
  this._sunLight = light;
94
102
  }
103
+ /** Whether this render queue requires scene color pass */ get needSceneColor() {
104
+ return this._needSceneColor;
105
+ }
106
+ /** Whether this render queue has transparent objects to be drawn */ get drawTransparent() {
107
+ return this._drawTransparent;
108
+ }
95
109
  /** The render pass to which the render queue belongs */ get renderPass() {
96
110
  return this._renderPass;
97
111
  }
98
112
  /**
99
113
  * Gets the items of the render queue
100
- */ get items() {
101
- return this._itemLists;
114
+ */ get itemList() {
115
+ return this._itemList;
102
116
  }
103
117
  /**
104
118
  * Gets the shadowed lights
@@ -147,35 +161,45 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
147
161
  * Push items from another render queue
148
162
  * @param queue - The render queue to be pushed
149
163
  */ pushRenderQueue(queue) {
150
- for(const order in queue._itemLists){
151
- let itemLists = this._itemLists[order];
152
- if (!itemLists) {
153
- itemLists = this.newRenderItemList(true);
154
- this._itemLists[order] = itemLists;
155
- }
156
- const newItemLists = queue._itemLists[order];
157
- itemLists.opaque.lit.push(...newItemLists.opaque.lit);
158
- itemLists.opaque.unlit.push(...newItemLists.opaque.unlit);
159
- itemLists.transparent.lit.push(...newItemLists.transparent.lit);
160
- itemLists.transparent.unlit.push(...newItemLists.transparent.unlit);
164
+ const newItemLists = queue._itemList;
165
+ if (!newItemLists) {
166
+ return;
167
+ }
168
+ if (!this._itemList) {
169
+ this._itemList = this.newRenderItemList();
161
170
  }
171
+ this._itemList.opaque.lit.push(...newItemLists.opaque.lit);
172
+ this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);
173
+ this._itemList.transmission.lit.push(...newItemLists.transmission.lit);
174
+ this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);
175
+ this._itemList.transparent.lit.push(...newItemLists.transparent.lit);
176
+ this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);
177
+ this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);
178
+ this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);
179
+ this._needSceneColor ||= queue._needSceneColor;
180
+ this._drawTransparent ||= queue._drawTransparent;
181
+ this._objectColorMaps.push(...queue._objectColorMaps);
162
182
  }
163
183
  /**
164
184
  * Push an item to the render queue
165
185
  * @param camera - The camera for drawing the item
166
186
  * @param drawable - The object to be drawn
167
- * @param renderOrder - Render order of the object
168
- */ push(camera, drawable, renderOrder) {
187
+ */ push(camera, drawable) {
169
188
  if (drawable) {
170
- let itemList = this._itemLists[renderOrder];
171
- if (!itemList) {
172
- itemList = this.newRenderItemList(false);
173
- this._itemLists[renderOrder] = itemList;
189
+ if (!this._itemList) {
190
+ this._itemList = this.newRenderItemList();
174
191
  }
175
192
  const trans = drawable.getQueueType() === QUEUE_TRANSPARENT;
176
193
  const unlit = drawable.isUnlit();
194
+ const transmission = drawable.needSceneColor();
195
+ this._needSceneColor ||= transmission;
196
+ this._drawTransparent ||= trans;
197
+ if (camera.enablePicking) {
198
+ drawable.getMaterial().objectColor = drawable.getObjectColor();
199
+ this._objectColorMaps[0].set(drawable.getId(), drawable);
200
+ }
177
201
  if (drawable.isBatchable()) {
178
- const instanceList = trans ? unlit ? itemList.transparent.unlit[0].instanceList : itemList.transparent.lit[0].instanceList : unlit ? itemList.opaque.unlit[0].instanceList : itemList.opaque.lit[0].instanceList;
202
+ const instanceList = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0].instanceList : this._itemList.transmission_trans.lit[0].instanceList : unlit ? this._itemList.transparent.unlit[0].instanceList : this._itemList.transparent.lit[0].instanceList : transmission ? unlit ? this._itemList.transmission.unlit[0].instanceList : this._itemList.transmission.lit[0].instanceList : unlit ? this._itemList.opaque.unlit[0].instanceList : this._itemList.opaque.lit[0].instanceList;
179
203
  const hash = drawable.getInstanceId(this._renderPass);
180
204
  let drawableList = instanceList[hash];
181
205
  if (!drawableList) {
@@ -184,8 +208,20 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
184
208
  }
185
209
  drawableList.push(drawable);
186
210
  } else {
187
- const list = trans ? unlit ? itemList.transparent.unlit[0] : itemList.transparent.lit[0] : unlit ? itemList.opaque.unlit[0] : itemList.opaque.lit[0];
188
- this.binaryInsert(drawable.getBoneMatrices() ? list.skinItemList : list.itemList, {
211
+ const list = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0] : this._itemList.transmission_trans.lit[0] : unlit ? this._itemList.transparent.unlit[0] : this._itemList.transparent.lit[0] : transmission ? unlit ? this._itemList.transmission.unlit[0] : this._itemList.transmission.lit[0] : unlit ? this._itemList.opaque.unlit[0] : this._itemList.opaque.lit[0];
212
+ const skinAnimation = !!drawable.getBoneMatrices();
213
+ const morphAnimation = !!drawable.getMorphData();
214
+ let queue;
215
+ if (skinAnimation && morphAnimation) {
216
+ queue = list.skinAndMorphItemList;
217
+ } else if (skinAnimation) {
218
+ queue = list.skinItemList;
219
+ } else if (morphAnimation) {
220
+ queue = list.morphItemList;
221
+ } else {
222
+ queue = list.itemList;
223
+ }
224
+ this.binaryInsert(queue, {
189
225
  drawable,
190
226
  sortDistance: drawable.getSortDistance(camera),
191
227
  instanceData: null
@@ -199,13 +235,53 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
199
235
  drawable.pushRenderQueueRef(this._ref);
200
236
  }
201
237
  }
238
+ /** @internal */ getDrawableByColor(c) {
239
+ const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];
240
+ for (const m of this._objectColorMaps){
241
+ const drawable = m.get(id);
242
+ if (drawable) {
243
+ return drawable;
244
+ }
245
+ }
246
+ return null;
247
+ }
202
248
  /**
203
249
  * Removes all items in the render queue
204
250
  */ reset() {
205
- this._itemLists = {};
251
+ if (this._itemList) {
252
+ // Release all render bundles
253
+ for(const k in this._itemList){
254
+ const itemListBundle = this._itemList[k];
255
+ for(const l in itemListBundle){
256
+ const listInfo = itemListBundle[l];
257
+ for (const info of listInfo){
258
+ if (info.renderQueue === this) {
259
+ if (info.renderBundle) {
260
+ info.renderBundle.dispose();
261
+ }
262
+ if (info.skinRenderBundle) {
263
+ info.skinRenderBundle.dispose();
264
+ }
265
+ if (info.morphRenderBundle) {
266
+ info.morphRenderBundle.dispose();
267
+ }
268
+ if (info.skinAndMorphRenderBundle) {
269
+ info.skinAndMorphRenderBundle.dispose();
270
+ }
271
+ if (info.instanceRenderBundle) {
272
+ info.instanceRenderBundle.dispose();
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ this._itemList = null;
279
+ }
206
280
  this._shadowedLightList = [];
207
281
  this._unshadowedLightList = [];
208
282
  this._sunLight = null;
283
+ this._needSceneColor = false;
284
+ this._drawTransparent = false;
209
285
  }
210
286
  /** @internal */ dispose() {
211
287
  this._ref.ref = null;
@@ -214,95 +290,86 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
214
290
  }
215
291
  /** @internal */ end(camera, createRenderBundles) {
216
292
  const frameCounter = Application.instance.device.frameInfo.frameCounter;
217
- for(const k in this._itemLists){
218
- const itemList = this._itemLists[k];
219
- const lists = [
220
- itemList.opaque.lit,
221
- itemList.opaque.unlit,
222
- itemList.transparent.lit,
223
- itemList.transparent.unlit
224
- ];
225
- for(let i = 0; i < 4; i++){
226
- const list = lists[i];
227
- for (const info of list){
228
- if (info.renderQueue !== this) {
229
- continue;
230
- }
231
- const instanceList = info.instanceList;
232
- for(const x in instanceList){
233
- const drawables = instanceList[x];
234
- if (drawables.length === 1) {
235
- this.binaryInsert(info.itemList, {
236
- drawable: drawables[0],
237
- sortDistance: drawables[0].getSortDistance(camera),
238
- instanceData: null
239
- });
240
- drawables[0].applyTransformUniforms(this);
241
- const mat = drawables[0].getMaterial();
242
- if (mat) {
243
- info.materialList.add(mat.coreMaterial);
244
- }
245
- } else {
246
- let bindGroup = null;
247
- let item = null;
248
- for(let i = 0; i < drawables.length; i++){
249
- const drawable = drawables[i];
250
- const instanceUniforms = drawable.getInstanceUniforms();
251
- const instanceUniformsSize = instanceUniforms?.length ?? 0;
252
- const stride = 16 + instanceUniformsSize;
253
- if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {
254
- bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);
255
- item = {
256
- drawable,
257
- sortDistance: drawable.getSortDistance(camera),
258
- instanceData: {
259
- bindGroup,
260
- offset: bindGroup.offset,
261
- numInstances: 0,
262
- stride
263
- }
264
- };
265
- this.binaryInsert(info.instanceItemList, item);
266
- drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
267
- }
268
- const instanceInfo = {
293
+ const itemList = this._itemList;
294
+ if (!this.itemList) {
295
+ return this;
296
+ }
297
+ const lists = [
298
+ itemList.opaque.lit,
299
+ itemList.opaque.unlit,
300
+ itemList.transmission.lit,
301
+ itemList.transmission.unlit,
302
+ itemList.transparent.lit,
303
+ itemList.transparent.unlit,
304
+ itemList.transmission_trans.lit,
305
+ itemList.transmission_trans.unlit
306
+ ];
307
+ for(let i = 0; i < lists.length; i++){
308
+ const list = lists[i];
309
+ for (const info of list){
310
+ if (info.renderQueue !== this) {
311
+ continue;
312
+ }
313
+ const instanceList = info.instanceList;
314
+ for(const x in instanceList){
315
+ const drawables = instanceList[x];
316
+ let bindGroup = null;
317
+ let item = null;
318
+ for(let i = 0; i < drawables.length; i++){
319
+ const drawable = drawables[i];
320
+ const instanceUniforms = drawable.getInstanceUniforms();
321
+ const instanceUniformsSize = instanceUniforms?.length ?? 0;
322
+ const stride = 16 + instanceUniformsSize;
323
+ if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {
324
+ bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);
325
+ item = {
326
+ drawable,
327
+ sortDistance: drawable.getSortDistance(camera),
328
+ instanceData: {
269
329
  bindGroup,
270
- offset: bindGroup.offset
271
- };
272
- this._instanceInfo.set(drawable, instanceInfo);
273
- drawable.applyTransformUniforms(this);
274
- drawable.applyMaterialUniforms(instanceInfo);
275
- bindGroup.offset += stride;
276
- item.instanceData.numInstances++;
277
- const mat = drawable.getMaterial();
278
- if (mat) {
279
- info.materialList.add(mat.coreMaterial);
330
+ offset: bindGroup.offset,
331
+ numInstances: 0,
332
+ stride
280
333
  }
281
- }
282
- }
283
- }
284
- info.instanceList = {};
285
- if (createRenderBundles) {
286
- if (info.itemList.length > 0) {
287
- info.renderBundle = new RenderBundleWrapper();
288
- }
289
- if (info.skinItemList.length > 0) {
290
- info.skinRenderBundle = new RenderBundleWrapper();
334
+ };
335
+ this.binaryInsert(info.instanceItemList, item);
336
+ drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
291
337
  }
292
- if (info.instanceItemList.length > 0) {
293
- info.instanceRenderBundle = new RenderBundleWrapper();
338
+ const instanceInfo = {
339
+ bindGroup,
340
+ offset: bindGroup.offset
341
+ };
342
+ this._instanceInfo.set(drawable, instanceInfo);
343
+ drawable.applyTransformUniforms(this);
344
+ drawable.applyMaterialUniforms(instanceInfo);
345
+ bindGroup.offset += stride;
346
+ item.instanceData.numInstances++;
347
+ const mat = drawable.getMaterial();
348
+ if (mat) {
349
+ info.materialList.add(mat.coreMaterial);
294
350
  }
295
351
  }
296
352
  }
353
+ info.instanceList = {};
354
+ if (createRenderBundles) {
355
+ if (info.itemList.length > 0) {
356
+ info.renderBundle = new RenderBundleWrapper();
357
+ }
358
+ if (info.skinItemList.length > 0) {
359
+ info.skinRenderBundle = new RenderBundleWrapper();
360
+ }
361
+ if (info.morphItemList.length > 0) {
362
+ info.morphRenderBundle = new RenderBundleWrapper();
363
+ }
364
+ if (info.skinAndMorphItemList.length > 0) {
365
+ info.skinAndMorphRenderBundle = new RenderBundleWrapper();
366
+ }
367
+ if (info.instanceItemList.length > 0) {
368
+ info.instanceRenderBundle = new RenderBundleWrapper();
369
+ }
370
+ }
297
371
  }
298
- /*
299
- itemList.opaque.lit.forEach(info => {
300
- info.itemList.sort((a, b) => (a.drawable.getMaterial()?.instanceId ?? 0) - (b.drawable.getMaterial()?.instanceId ?? 0))
301
- });
302
- itemList.opaque.unlit.forEach(info => {
303
- info.itemList.sort((a, b) => (a.drawable.getMaterial()?.instanceId ?? 0) - (b.drawable.getMaterial()?.instanceId ?? 0))
304
- });
305
- */ }
372
+ }
306
373
  return this;
307
374
  }
308
375
  binaryInsert(itemList, item) {
@@ -326,63 +393,49 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
326
393
  /**
327
394
  * Sorts the items in the render queue for rendering
328
395
  */ sortTransparentItems(cameraPos) {
329
- for (const list of Object.values(this._itemLists)){
330
- list.transparent.lit[0].itemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
331
- list.transparent.lit[0].skinItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
332
- list.transparent.unlit[0].itemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
333
- list.transparent.unlit[0].skinItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
396
+ if (this._itemList) {
397
+ this._itemList.transparent.lit[0].itemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
398
+ this._itemList.transparent.lit[0].skinItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
399
+ this._itemList.transparent.lit[0].morphItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
400
+ this._itemList.transparent.lit[0].skinAndMorphItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
401
+ this._itemList.transparent.unlit[0].itemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
402
+ this._itemList.transparent.unlit[0].skinItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
403
+ this._itemList.transparent.unlit[0].morphItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
404
+ this._itemList.transparent.unlit[0].skinAndMorphItemList.sort((a, b)=>this.drawableDistanceToCamera(b.drawable, cameraPos) - this.drawableDistanceToCamera(a.drawable, cameraPos));
334
405
  }
335
406
  }
336
407
  drawableDistanceToCamera(drawable, cameraPos) {
337
408
  const drawablePos = drawable.getXForm().position;
338
409
  return Vector3.distanceSq(drawablePos, cameraPos);
339
410
  }
340
- newRenderItemList(empty) {
411
+ newRenderItemListInfo() {
341
412
  return {
342
- opaque: {
343
- lit: empty ? [] : [
344
- {
345
- itemList: [],
346
- skinItemList: [],
347
- instanceItemList: [],
348
- materialList: new Set(),
349
- instanceList: {},
350
- renderQueue: this
351
- }
352
- ],
353
- unlit: empty ? [] : [
354
- {
355
- itemList: [],
356
- skinItemList: [],
357
- instanceItemList: [],
358
- materialList: new Set(),
359
- instanceList: {},
360
- renderQueue: this
361
- }
362
- ]
363
- },
364
- transparent: {
365
- lit: empty ? [] : [
366
- {
367
- itemList: [],
368
- skinItemList: [],
369
- instanceItemList: [],
370
- materialList: new Set(),
371
- instanceList: {},
372
- renderQueue: this
373
- }
374
- ],
375
- unlit: empty ? [] : [
376
- {
377
- itemList: [],
378
- skinItemList: [],
379
- instanceItemList: [],
380
- materialList: new Set(),
381
- instanceList: {},
382
- renderQueue: this
383
- }
384
- ]
385
- }
413
+ itemList: [],
414
+ skinItemList: [],
415
+ morphItemList: [],
416
+ skinAndMorphItemList: [],
417
+ instanceItemList: [],
418
+ materialList: new Set(),
419
+ instanceList: {},
420
+ renderQueue: this
421
+ };
422
+ }
423
+ newRenderItemListBundle() {
424
+ return {
425
+ lit: [
426
+ this.newRenderItemListInfo()
427
+ ],
428
+ unlit: [
429
+ this.newRenderItemListInfo()
430
+ ]
431
+ };
432
+ }
433
+ newRenderItemList() {
434
+ return {
435
+ opaque: this.newRenderItemListBundle(),
436
+ transmission: this.newRenderItemListBundle(),
437
+ transparent: this.newRenderItemListBundle(),
438
+ transmission_trans: this.newRenderItemListBundle()
386
439
  };
387
440
  }
388
441
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render_queue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"render_queue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,8 +2,80 @@ import { Application } from '../app.js';
2
2
 
3
3
  class RenderBundleWrapper {
4
4
  _renderBundles;
5
+ _disposed;
6
+ static _drawableContainer = new WeakMap();
7
+ static _materialContainer = new WeakMap();
8
+ /** @internal */ static addDrawable(drawable, material, wrapper, hash) {
9
+ let renderBundles = this._drawableContainer.get(drawable);
10
+ if (!renderBundles) {
11
+ renderBundles = [];
12
+ this._drawableContainer.set(drawable, renderBundles);
13
+ }
14
+ const index = renderBundles.findIndex((rb)=>rb.wrapper === wrapper);
15
+ if (index < 0) {
16
+ renderBundles.push({
17
+ wrapper: wrapper,
18
+ hashes: [
19
+ hash
20
+ ]
21
+ });
22
+ } else {
23
+ if (!renderBundles[index].hashes.includes(hash)) {
24
+ renderBundles[index].hashes.push(hash);
25
+ }
26
+ }
27
+ if (material) {
28
+ let ownDrawables = this._materialContainer.get(material);
29
+ if (!ownDrawables) {
30
+ ownDrawables = new Set();
31
+ this._materialContainer.set(material, ownDrawables);
32
+ }
33
+ ownDrawables.add(drawable);
34
+ }
35
+ }
36
+ /** @internal */ static drawableChanged(drawable) {
37
+ const renderBundles = this._drawableContainer.get(drawable);
38
+ if (renderBundles) {
39
+ for(let i = renderBundles.length - 1; i >= 0; i--){
40
+ const renderBundle = renderBundles[i].wrapper;
41
+ if (renderBundle.disposed) {
42
+ renderBundles.splice(i, 1);
43
+ } else {
44
+ for (const hash of renderBundles[i].hashes){
45
+ renderBundles[i].wrapper.invalidate(hash);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ /** @internal */ static materialChanged(material) {
52
+ const ownDrawables = this._materialContainer.get(material);
53
+ if (ownDrawables) {
54
+ for (const drawable of ownDrawables){
55
+ this.drawableChanged(drawable);
56
+ }
57
+ }
58
+ }
59
+ /** @internal */ static materialAttached(material, drawable) {
60
+ const ownDrawables = this._materialContainer.get(material);
61
+ if (ownDrawables && !ownDrawables.has(drawable)) {
62
+ ownDrawables.add(drawable);
63
+ this.drawableChanged(drawable);
64
+ }
65
+ }
66
+ /** @internal */ static materialDetached(material, drawable) {
67
+ const ownDrawables = this._materialContainer.get(material);
68
+ if (ownDrawables && ownDrawables.has(drawable)) {
69
+ ownDrawables.delete(drawable);
70
+ this.drawableChanged(drawable);
71
+ }
72
+ }
5
73
  constructor(){
6
74
  this._renderBundles = {};
75
+ this._disposed = false;
76
+ }
77
+ get disposed() {
78
+ return this._disposed;
7
79
  }
8
80
  getRenderBundle(hash) {
9
81
  return this._renderBundles[hash] ?? null;
@@ -14,6 +86,13 @@ class RenderBundleWrapper {
14
86
  endRenderBundle(hash) {
15
87
  this._renderBundles[hash] = Application.instance.device.endCapture();
16
88
  }
89
+ invalidate(hash) {
90
+ this._renderBundles[hash] = undefined;
91
+ }
92
+ dispose() {
93
+ this._renderBundles = {};
94
+ this._disposed = true;
95
+ }
17
96
  }
18
97
 
19
98
  export { RenderBundleWrapper };
@@ -1 +1 @@
1
- {"version":3,"file":"renderbundle_wrapper.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"renderbundle_wrapper.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}