@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.
- package/dist/animation/animation.js +25 -117
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +191 -51
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js +6 -18
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +16 -6
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/morphtarget.js +104 -0
- package/dist/animation/morphtarget.js.map +1 -0
- package/dist/animation/morphtrack.js +70 -0
- package/dist/animation/morphtrack.js.map +1 -0
- package/dist/animation/rotationtrack.js +15 -7
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +15 -7
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +107 -5
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/translationtrack.js +15 -7
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app.js +4 -26
- package/dist/app.js.map +1 -1
- package/dist/asset/assetmanager.js +60 -109
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/dds/dds.js +77 -3
- package/dist/asset/loaders/dds/dds.js.map +1 -1
- package/dist/asset/loaders/dds/dds_loader.js +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +287 -40
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/image/tga_Loader.js +1 -1
- package/dist/asset/loaders/image/webimage_loader.js +16 -0
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/model.js +16 -9
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +222 -0
- package/dist/{render/temporalcache.js.map → blitter/bilateralblur.js.map} +1 -1
- package/dist/blitter/blitter.js +9 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/depthlimitedgaussion.js +96 -39
- package/dist/blitter/depthlimitedgaussion.js.map +1 -1
- package/dist/blitter/gaussianblur.js +21 -21
- package/dist/camera/camera.js +200 -4
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +6406 -5786
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +15 -4
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +26 -17
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +13 -2
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +103 -31
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +5 -4
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -7
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -7
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +2 -2
- package/dist/material/mixins/pbr/common.js +454 -19
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/pbrmr.js +28 -6
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +27 -9
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +128 -23
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/unlit.js +8 -4
- package/dist/material/unlit.js.map +1 -1
- package/dist/posteffect/bloom.js +34 -53
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +48 -58
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +3 -11
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -11
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/posteffect.js +4 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +55 -48
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +536 -0
- package/dist/{material/lit.js.map → posteffect/ssr.js.map} +1 -1
- package/dist/posteffect/tonemap.js +3 -11
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/posteffect/water.js +306 -340
- package/dist/posteffect/water.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/clipmap.js +16 -19
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +8 -6
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +30 -14
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +70 -22
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +169 -33
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +989 -0
- package/dist/{shaders/framework.js.map → render/fft_wavegenerator.js.map} +1 -1
- package/dist/render/gerstner_wavegenerator.js +265 -0
- package/dist/{material/standard.js.map → render/gerstner_wavegenerator.js.map} +1 -1
- package/dist/render/globalbindgroup_allocator.js +2 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +273 -0
- package/dist/{material/terrainlightmodel.js.map → render/hzb.js.map} +1 -1
- package/dist/render/lightpass.js +68 -28
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +51 -0
- package/dist/render/objectcolorpass.js.map +1 -0
- package/dist/render/render_queue.js +211 -158
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderbundle_wrapper.js +79 -0
- package/dist/render/renderbundle_wrapper.js.map +1 -1
- package/dist/render/renderer.js +151 -35
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +27 -20
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadowmap_pass.js +20 -14
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +12 -13
- package/dist/render/sky.js.map +1 -1
- package/dist/render/watermesh.js +94 -828
- package/dist/render/watermesh.js.map +1 -1
- package/dist/render/wavegenerator.js +8 -0
- package/dist/render/wavegenerator.js.map +1 -0
- package/dist/render/weightedblended_oit.js +11 -28
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/batchgroup.js +60 -14
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +24 -3
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/graph_node.js +0 -14
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +5 -5
- package/dist/scene/mesh.js +62 -15
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js +5 -2
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/raycast_visitor.js +4 -2
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +6 -9
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +11 -8
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain/grass.js +10 -2
- package/dist/scene/terrain/grass.js.map +1 -1
- package/dist/scene/terrain/heightfield.js +135 -53
- package/dist/scene/terrain/heightfield.js.map +1 -1
- package/dist/scene/terrain/patch.js +10 -2
- package/dist/scene/terrain/patch.js.map +1 -1
- package/dist/scene/terrain/quadtree.js +2 -2
- package/dist/scene/terrain/terrain.js +1 -1
- package/dist/scene/xform.js +7 -9
- package/dist/scene/xform.js.map +1 -1
- package/dist/shaders/misc.js +10 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +81 -16
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/shadow.js +1 -9
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js +442 -0
- package/dist/{material/terrainmat.js.map → shaders/ssr.js.map} +1 -1
- package/dist/shaders/water.js +377 -250
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/esm.js +4 -22
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/shadowmapper.js +56 -31
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/vsm.js +4 -24
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/cylinder.js +6 -5
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/utility/bounding_volume.js +1 -53
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/draco/decoder.js +116 -0
- package/dist/utility/draco/decoder.js.map +1 -0
- package/dist/utility/misc.js +93 -0
- package/dist/utility/misc.js.map +1 -0
- package/dist/utility/shprojection.js +2 -7
- package/dist/utility/shprojection.js.map +1 -1
- package/dist/utility/textures/ggxlut.js +213 -0
- package/dist/utility/textures/ggxlut.js.map +1 -0
- package/dist/utility/textures/gradientnoise.js +61 -0
- package/dist/utility/textures/gradientnoise.js.map +1 -0
- package/dist/utility/textures/randomnoise.js +41 -0
- package/dist/utility/textures/randomnoise.js.map +1 -0
- package/dist/values.js +25 -1
- package/dist/values.js.map +1 -1
- package/package.json +5 -8
- package/dist/animation/usertrack.js +0 -47
- package/dist/animation/usertrack.js.map +0 -1
- package/dist/material/grassmat.js +0 -127
- package/dist/material/grassmat.js.map +0 -1
- package/dist/material/lightmodel.js +0 -2074
- package/dist/material/lightmodel.js.map +0 -1
- package/dist/material/lit.js +0 -578
- package/dist/material/mixins/pbr/metallicroughness.js +0 -126
- package/dist/material/mixins/pbr/metallicroughness.js.map +0 -1
- package/dist/material/mixins/pbr/specularglossness.js +0 -104
- package/dist/material/mixins/pbr/specularglossness.js.map +0 -1
- package/dist/material/pbr.js +0 -27
- package/dist/material/pbr.js.map +0 -1
- package/dist/material/standard.js +0 -282
- package/dist/material/terrainlightmodel.js +0 -259
- package/dist/material/terrainmat.js +0 -357
- package/dist/render/depth_pass.js +0 -47
- package/dist/render/depth_pass.js.map +0 -1
- package/dist/render/forward.js +0 -186
- package/dist/render/forward.js.map +0 -1
- package/dist/render/forward_pass.js +0 -137
- package/dist/render/forward_pass.js.map +0 -1
- package/dist/render/helper.js +0 -38
- package/dist/render/helper.js.map +0 -1
- package/dist/render/renderscheme.js +0 -61
- package/dist/render/renderscheme.js.map +0 -1
- package/dist/render/temporalcache.js +0 -222
- package/dist/scene/model.js +0 -111
- package/dist/scene/model.js.map +0 -1
- package/dist/scene/octree_update_visitor.js +0 -20
- package/dist/scene/octree_update_visitor.js.map +0 -1
- package/dist/shaders/builtins.js +0 -110
- package/dist/shaders/builtins.js.map +0 -1
- package/dist/shaders/framework.js +0 -723
- package/dist/shaders/lighting.js +0 -335
- package/dist/shaders/lighting.js.map +0 -1
- package/dist/utility/sheenlut.js +0 -196
- 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 */
|
|
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.
|
|
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
|
|
101
|
-
return this.
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
168
|
-
*/ push(camera, drawable, renderOrder) {
|
|
187
|
+
*/ push(camera, drawable) {
|
|
169
188
|
if (drawable) {
|
|
170
|
-
|
|
171
|
-
|
|
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 ?
|
|
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 ?
|
|
188
|
-
|
|
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.
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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
|
-
|
|
293
|
-
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
411
|
+
newRenderItemListInfo() {
|
|
341
412
|
return {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|