@zephyr3d/scene 0.1.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 (236) hide show
  1. package/dist/animation/animation.js +173 -0
  2. package/dist/animation/animation.js.map +1 -0
  3. package/dist/animation/animationset.js +95 -0
  4. package/dist/animation/animationset.js.map +1 -0
  5. package/dist/animation/animationtrack.js +38 -0
  6. package/dist/animation/animationtrack.js.map +1 -0
  7. package/dist/animation/eulerrotationtrack.js +33 -0
  8. package/dist/animation/eulerrotationtrack.js.map +1 -0
  9. package/dist/animation/rotationtrack.js +37 -0
  10. package/dist/animation/rotationtrack.js.map +1 -0
  11. package/dist/animation/scaletrack.js +36 -0
  12. package/dist/animation/scaletrack.js.map +1 -0
  13. package/dist/animation/skeleton.js +97 -0
  14. package/dist/animation/skeleton.js.map +1 -0
  15. package/dist/animation/translationtrack.js +36 -0
  16. package/dist/animation/translationtrack.js.map +1 -0
  17. package/dist/animation/usertrack.js +47 -0
  18. package/dist/animation/usertrack.js.map +1 -0
  19. package/dist/app.js +173 -0
  20. package/dist/app.js.map +1 -0
  21. package/dist/asset/assetmanager.js +476 -0
  22. package/dist/asset/assetmanager.js.map +1 -0
  23. package/dist/asset/builtin.js +373 -0
  24. package/dist/asset/builtin.js.map +1 -0
  25. package/dist/asset/loaders/dds/dds.js +472 -0
  26. package/dist/asset/loaders/dds/dds.js.map +1 -0
  27. package/dist/asset/loaders/dds/dds_loader.js +38 -0
  28. package/dist/asset/loaders/dds/dds_loader.js.map +1 -0
  29. package/dist/asset/loaders/gltf/gltf_loader.js +981 -0
  30. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -0
  31. package/dist/asset/loaders/gltf/helpers.js +314 -0
  32. package/dist/asset/loaders/gltf/helpers.js.map +1 -0
  33. package/dist/asset/loaders/hdr/hdr.js +175 -0
  34. package/dist/asset/loaders/hdr/hdr.js.map +1 -0
  35. package/dist/asset/loaders/image/tga_Loader.js +117 -0
  36. package/dist/asset/loaders/image/tga_Loader.js.map +1 -0
  37. package/dist/asset/loaders/image/webimage_loader.js +50 -0
  38. package/dist/asset/loaders/image/webimage_loader.js.map +1 -0
  39. package/dist/asset/loaders/loader.js +45 -0
  40. package/dist/asset/loaders/loader.js.map +1 -0
  41. package/dist/asset/model.js +264 -0
  42. package/dist/asset/model.js.map +1 -0
  43. package/dist/blitter/blitter.js +389 -0
  44. package/dist/blitter/blitter.js.map +1 -0
  45. package/dist/blitter/box.js +118 -0
  46. package/dist/blitter/box.js.map +1 -0
  47. package/dist/blitter/copy.js +22 -0
  48. package/dist/blitter/copy.js.map +1 -0
  49. package/dist/blitter/depthlimitedgaussion.js +166 -0
  50. package/dist/blitter/depthlimitedgaussion.js.map +1 -0
  51. package/dist/blitter/gaussianblur.js +229 -0
  52. package/dist/blitter/gaussianblur.js.map +1 -0
  53. package/dist/camera/base.js +90 -0
  54. package/dist/camera/base.js.map +1 -0
  55. package/dist/camera/camera.js +358 -0
  56. package/dist/camera/camera.js.map +1 -0
  57. package/dist/camera/fps.js +246 -0
  58. package/dist/camera/fps.js.map +1 -0
  59. package/dist/camera/orbit.js +157 -0
  60. package/dist/camera/orbit.js.map +1 -0
  61. package/dist/camera/orthocamera.js +126 -0
  62. package/dist/camera/orthocamera.js.map +1 -0
  63. package/dist/camera/perspectivecamera.js +133 -0
  64. package/dist/camera/perspectivecamera.js.map +1 -0
  65. package/dist/index.d.ts +8402 -0
  66. package/dist/index.js +87 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/input/inputmgr.js +242 -0
  69. package/dist/input/inputmgr.js.map +1 -0
  70. package/dist/material/blinn.js +75 -0
  71. package/dist/material/blinn.js.map +1 -0
  72. package/dist/material/grassmaterial.js +221 -0
  73. package/dist/material/grassmaterial.js.map +1 -0
  74. package/dist/material/lambert.js +52 -0
  75. package/dist/material/lambert.js.map +1 -0
  76. package/dist/material/lightmodel.js +2074 -0
  77. package/dist/material/lightmodel.js.map +1 -0
  78. package/dist/material/lit.js +578 -0
  79. package/dist/material/lit.js.map +1 -0
  80. package/dist/material/material.js +458 -0
  81. package/dist/material/material.js.map +1 -0
  82. package/dist/material/meshmaterial.js +311 -0
  83. package/dist/material/meshmaterial.js.map +1 -0
  84. package/dist/material/mixins/albedocolor.js +130 -0
  85. package/dist/material/mixins/albedocolor.js.map +1 -0
  86. package/dist/material/mixins/texture.js +110 -0
  87. package/dist/material/mixins/texture.js.map +1 -0
  88. package/dist/material/mixins/vertexcolor.js +45 -0
  89. package/dist/material/mixins/vertexcolor.js.map +1 -0
  90. package/dist/material/pbr.js +27 -0
  91. package/dist/material/pbr.js.map +1 -0
  92. package/dist/material/standard.js +282 -0
  93. package/dist/material/standard.js.map +1 -0
  94. package/dist/material/terrainlightmodel.js +259 -0
  95. package/dist/material/terrainlightmodel.js.map +1 -0
  96. package/dist/material/terrainmaterial.js +139 -0
  97. package/dist/material/terrainmaterial.js.map +1 -0
  98. package/dist/material/unlit.js +29 -0
  99. package/dist/material/unlit.js.map +1 -0
  100. package/dist/posteffect/bloom.js +398 -0
  101. package/dist/posteffect/bloom.js.map +1 -0
  102. package/dist/posteffect/compositor.js +264 -0
  103. package/dist/posteffect/compositor.js.map +1 -0
  104. package/dist/posteffect/fxaa.js +291 -0
  105. package/dist/posteffect/fxaa.js.map +1 -0
  106. package/dist/posteffect/grayscale.js +87 -0
  107. package/dist/posteffect/grayscale.js.map +1 -0
  108. package/dist/posteffect/posteffect.js +165 -0
  109. package/dist/posteffect/posteffect.js.map +1 -0
  110. package/dist/posteffect/sao.js +327 -0
  111. package/dist/posteffect/sao.js.map +1 -0
  112. package/dist/posteffect/tonemap.js +112 -0
  113. package/dist/posteffect/tonemap.js.map +1 -0
  114. package/dist/posteffect/water.js +535 -0
  115. package/dist/posteffect/water.js.map +1 -0
  116. package/dist/render/clipmap.js +462 -0
  117. package/dist/render/clipmap.js.map +1 -0
  118. package/dist/render/cluster_light.js +329 -0
  119. package/dist/render/cluster_light.js.map +1 -0
  120. package/dist/render/cull_visitor.js +124 -0
  121. package/dist/render/cull_visitor.js.map +1 -0
  122. package/dist/render/depth_pass.js +47 -0
  123. package/dist/render/depth_pass.js.map +1 -0
  124. package/dist/render/envlight.js +282 -0
  125. package/dist/render/envlight.js.map +1 -0
  126. package/dist/render/forward.js +186 -0
  127. package/dist/render/forward.js.map +1 -0
  128. package/dist/render/forward_pass.js +137 -0
  129. package/dist/render/forward_pass.js.map +1 -0
  130. package/dist/render/helper.js +38 -0
  131. package/dist/render/helper.js.map +1 -0
  132. package/dist/render/primitive.js +246 -0
  133. package/dist/render/primitive.js.map +1 -0
  134. package/dist/render/render_queue.js +163 -0
  135. package/dist/render/render_queue.js.map +1 -0
  136. package/dist/render/renderpass.js +151 -0
  137. package/dist/render/renderpass.js.map +1 -0
  138. package/dist/render/renderscheme.js +61 -0
  139. package/dist/render/renderscheme.js.map +1 -0
  140. package/dist/render/scatteringlut.js +634 -0
  141. package/dist/render/scatteringlut.js.map +1 -0
  142. package/dist/render/shadowmap_pass.js +70 -0
  143. package/dist/render/shadowmap_pass.js.map +1 -0
  144. package/dist/render/sky.js +881 -0
  145. package/dist/render/sky.js.map +1 -0
  146. package/dist/render/temporalcache.js +222 -0
  147. package/dist/render/temporalcache.js.map +1 -0
  148. package/dist/render/watermesh.js +835 -0
  149. package/dist/render/watermesh.js.map +1 -0
  150. package/dist/scene/environment.js +146 -0
  151. package/dist/scene/environment.js.map +1 -0
  152. package/dist/scene/graph_node.js +69 -0
  153. package/dist/scene/graph_node.js.map +1 -0
  154. package/dist/scene/light.js +436 -0
  155. package/dist/scene/light.js.map +1 -0
  156. package/dist/scene/mesh.js +215 -0
  157. package/dist/scene/mesh.js.map +1 -0
  158. package/dist/scene/model.js +111 -0
  159. package/dist/scene/model.js.map +1 -0
  160. package/dist/scene/octree.js +651 -0
  161. package/dist/scene/octree.js.map +1 -0
  162. package/dist/scene/octree_update_visitor.js +16 -0
  163. package/dist/scene/octree_update_visitor.js.map +1 -0
  164. package/dist/scene/raycast_visitor.js +72 -0
  165. package/dist/scene/raycast_visitor.js.map +1 -0
  166. package/dist/scene/scene.js +225 -0
  167. package/dist/scene/scene.js.map +1 -0
  168. package/dist/scene/scene_node.js +299 -0
  169. package/dist/scene/scene_node.js.map +1 -0
  170. package/dist/scene/terrain/grass.js +277 -0
  171. package/dist/scene/terrain/grass.js.map +1 -0
  172. package/dist/scene/terrain/heightfield.js +391 -0
  173. package/dist/scene/terrain/heightfield.js.map +1 -0
  174. package/dist/scene/terrain/patch.js +530 -0
  175. package/dist/scene/terrain/patch.js.map +1 -0
  176. package/dist/scene/terrain/quadtree.js +430 -0
  177. package/dist/scene/terrain/quadtree.js.map +1 -0
  178. package/dist/scene/terrain/terrain.js +258 -0
  179. package/dist/scene/terrain/terrain.js.map +1 -0
  180. package/dist/scene/xform.js +224 -0
  181. package/dist/scene/xform.js.map +1 -0
  182. package/dist/shaders/builtins.js +110 -0
  183. package/dist/shaders/builtins.js.map +1 -0
  184. package/dist/shaders/framework.js +709 -0
  185. package/dist/shaders/framework.js.map +1 -0
  186. package/dist/shaders/lighting.js +335 -0
  187. package/dist/shaders/lighting.js.map +1 -0
  188. package/dist/shaders/misc.js +405 -0
  189. package/dist/shaders/misc.js.map +1 -0
  190. package/dist/shaders/noise.js +157 -0
  191. package/dist/shaders/noise.js.map +1 -0
  192. package/dist/shaders/pbr.js +132 -0
  193. package/dist/shaders/pbr.js.map +1 -0
  194. package/dist/shaders/shadow.js +642 -0
  195. package/dist/shaders/shadow.js.map +1 -0
  196. package/dist/shaders/water.js +630 -0
  197. package/dist/shaders/water.js.map +1 -0
  198. package/dist/shadow/esm.js +235 -0
  199. package/dist/shadow/esm.js.map +1 -0
  200. package/dist/shadow/pcf_opt.js +182 -0
  201. package/dist/shadow/pcf_opt.js.map +1 -0
  202. package/dist/shadow/pcf_pd.js +190 -0
  203. package/dist/shadow/pcf_pd.js.map +1 -0
  204. package/dist/shadow/shadow_impl.js +15 -0
  205. package/dist/shadow/shadow_impl.js.map +1 -0
  206. package/dist/shadow/shadowmapper.js +709 -0
  207. package/dist/shadow/shadowmapper.js.map +1 -0
  208. package/dist/shadow/ssm.js +194 -0
  209. package/dist/shadow/ssm.js.map +1 -0
  210. package/dist/shadow/vsm.js +298 -0
  211. package/dist/shadow/vsm.js.map +1 -0
  212. package/dist/shapes/box.js +313 -0
  213. package/dist/shapes/box.js.map +1 -0
  214. package/dist/shapes/cylinder.js +74 -0
  215. package/dist/shapes/cylinder.js.map +1 -0
  216. package/dist/shapes/plane.js +48 -0
  217. package/dist/shapes/plane.js.map +1 -0
  218. package/dist/shapes/shape.js +33 -0
  219. package/dist/shapes/shape.js.map +1 -0
  220. package/dist/shapes/sphere.js +91 -0
  221. package/dist/shapes/sphere.js.map +1 -0
  222. package/dist/shapes/torus.js +100 -0
  223. package/dist/shapes/torus.js.map +1 -0
  224. package/dist/utility/aabbtree.js +390 -0
  225. package/dist/utility/aabbtree.js.map +1 -0
  226. package/dist/utility/bounding_volume.js +78 -0
  227. package/dist/utility/bounding_volume.js.map +1 -0
  228. package/dist/utility/panorama.js +163 -0
  229. package/dist/utility/panorama.js.map +1 -0
  230. package/dist/utility/pmrem.js +345 -0
  231. package/dist/utility/pmrem.js.map +1 -0
  232. package/dist/utility/shprojection.js +448 -0
  233. package/dist/utility/shprojection.js.map +1 -0
  234. package/dist/values.js +48 -0
  235. package/dist/values.js.map +1 -0
  236. package/package.json +70 -0
@@ -0,0 +1,458 @@
1
+ import { List } from '@zephyr3d/base';
2
+ import { ProgramBuilder } from '@zephyr3d/device';
3
+ import { Application } from '../app.js';
4
+ import { RENDER_PASS_TYPE_FORWARD, RENDER_PASS_TYPE_SHADOWMAP, RENDER_PASS_TYPE_DEPTH_ONLY } from '../values.js';
5
+
6
+ class InstanceBindGroupPool {
7
+ _bindGroups;
8
+ _frameStamp;
9
+ constructor(){
10
+ this._bindGroups = [];
11
+ this._frameStamp = -1;
12
+ }
13
+ apply(hash, index, worldMatrices) {
14
+ const device = Application.instance.device;
15
+ const maxSize = device.getDeviceCaps().shaderCaps.maxUniformBufferSize;
16
+ if (device.frameInfo.frameCounter !== this._frameStamp) {
17
+ this._frameStamp = device.frameInfo.frameCounter;
18
+ for (const bindGroup of this._bindGroups){
19
+ bindGroup.freeSize = maxSize;
20
+ }
21
+ }
22
+ let bindGroupIndex = -1;
23
+ for(let i = 0; i < this._bindGroups.length; i++){
24
+ if (this._bindGroups[i].freeSize >= worldMatrices.length * 64) {
25
+ bindGroupIndex = i;
26
+ break;
27
+ }
28
+ }
29
+ if (bindGroupIndex < 0) {
30
+ const program = Material.getProgramByHashIndex(hash, index);
31
+ const bindGroup = program?.bindGroupLayouts[3] ? device.createBindGroup(program.bindGroupLayouts[3]) : null;
32
+ this._bindGroups.push({
33
+ bindGroup: bindGroup,
34
+ freeSize: maxSize
35
+ });
36
+ bindGroupIndex = this._bindGroups.length - 1;
37
+ }
38
+ const bindGroup = this._bindGroups[bindGroupIndex];
39
+ const offset = (maxSize - bindGroup.freeSize) / 64;
40
+ for (const matrix of worldMatrices){
41
+ bindGroup.bindGroup.setRawData('worldMatrix', maxSize - bindGroup.freeSize, matrix);
42
+ bindGroup.freeSize -= 64;
43
+ }
44
+ device.setBindGroup(3, bindGroup.bindGroup);
45
+ return offset;
46
+ }
47
+ }
48
+ /**
49
+ * Base class for any kind of materials
50
+ * @public
51
+ */ class Material {
52
+ /** @internal */ static _debugChannel = '';
53
+ /** @internal */ static _nextId = 0;
54
+ /** @internal */ static _programMap = {};
55
+ /** @internal */ static _drawableTimestamps = new WeakMap();
56
+ /** @internal */ static _drawableIterators = new WeakMap();
57
+ /** @internal */ static _drawableLRU = new List();
58
+ /** @internal */ static _materialTimestamps = new WeakMap();
59
+ /** @internal */ static _materialIterators = new WeakMap();
60
+ /** @internal */ static _materialLRU = new List();
61
+ /** @internal */ static _gcOptions = {
62
+ disabled: false,
63
+ drawableCountThreshold: 500,
64
+ materialCountThreshold: 200,
65
+ inactiveTimeDuration: 30000
66
+ };
67
+ /** @internal */ static _boneMatrixTextureSampler = null;
68
+ /** @internal */ static _instanceBindGroupPool = new InstanceBindGroupPool();
69
+ /** @internal */ static _drawableBindGroupMap = new WeakMap();
70
+ /** @internal */ _hash;
71
+ /** @internal */ _renderStateSet;
72
+ /** @internal */ _bindGroupMap;
73
+ /** @internal */ _optionTag;
74
+ /** @internal */ _materialBindGroup;
75
+ /** @internal */ _id;
76
+ /**
77
+ * Creates an instance of material
78
+ */ constructor(){
79
+ this._id = ++Material._nextId;
80
+ this._hash = [];
81
+ this._renderStateSet = null;
82
+ this._bindGroupMap = {};
83
+ this._optionTag = 0;
84
+ this._materialBindGroup = null;
85
+ }
86
+ /** Debug channel */ static get debugChannel() {
87
+ return this._debugChannel;
88
+ }
89
+ static set debugChannel(val) {
90
+ this._debugChannel = val;
91
+ }
92
+ /** Unique identifier of the material */ get id() {
93
+ return this._id;
94
+ }
95
+ /** @internal */ getHash(renderPassType) {
96
+ if (this._hash[renderPassType] === void 0) {
97
+ this._hash[renderPassType] = this.createHash(renderPassType);
98
+ }
99
+ return this._hash[renderPassType];
100
+ }
101
+ /** Render states associated to this material */ get stateSet() {
102
+ if (!this._renderStateSet) {
103
+ this._renderStateSet = this.createRenderStateSet();
104
+ }
105
+ return this._renderStateSet;
106
+ }
107
+ set stateSet(stateset) {
108
+ this._renderStateSet = stateset;
109
+ }
110
+ /** Returns true if this is a transparency material */ isTransparent() {
111
+ return false;
112
+ }
113
+ /** Returns true if shading of the material will be affected by lights */ supportLighting() {
114
+ return true;
115
+ }
116
+ /**
117
+ * Draws a primitive using this material
118
+ * @param primitive - The prmitive to be drawn
119
+ * @param ctx - The context of current drawing task
120
+ */ draw(primitive, ctx) {
121
+ if (this.beginDraw(ctx)) {
122
+ if (ctx.instanceData?.worldMatrices.length > 1) {
123
+ primitive.drawInstanced(ctx.instanceData.worldMatrices.length);
124
+ } else {
125
+ primitive.draw();
126
+ }
127
+ this.endDraw();
128
+ }
129
+ }
130
+ /**
131
+ * Prepares for drawing
132
+ * @param ctx - The context of current drawing task
133
+ * @returns true if succeeded, otherwise false
134
+ */ beginDraw(ctx) {
135
+ const numInstances = ctx.instanceData?.worldMatrices?.length || 1;
136
+ const device = Application.instance.device;
137
+ const programInfo = this.getOrCreateProgram(ctx);
138
+ if (programInfo) {
139
+ const hash = programInfo.hash;
140
+ if (!programInfo.programs[ctx.renderPass.type]) {
141
+ return null;
142
+ }
143
+ this._materialBindGroup = this.applyMaterialBindGroups(ctx, hash);
144
+ if (numInstances > 1) {
145
+ this.applyInstanceBindGroups(ctx, hash);
146
+ } else {
147
+ this.applyDrawableBindGroups(ctx, hash);
148
+ }
149
+ ctx.renderPass.applyRenderStates(device, this.stateSet, ctx);
150
+ device.setProgram(programInfo.programs[ctx.renderPass.type]);
151
+ Material._drawableTimestamps.set(ctx.target, ctx.timestamp);
152
+ Material.lruPutDrawable(ctx.target);
153
+ Material._materialTimestamps.set(this, ctx.timestamp);
154
+ Material.lruPutMaterial(this);
155
+ return true;
156
+ }
157
+ return false;
158
+ }
159
+ /**
160
+ * Ends drawing a primitive
161
+ */ endDraw() {
162
+ this._materialBindGroup = null;
163
+ }
164
+ /**
165
+ * Gets the bind group of this material
166
+ * @returns The bind group of this material
167
+ */ getMaterialBindGroup() {
168
+ return this._materialBindGroup;
169
+ }
170
+ /**
171
+ * Sets all uniform values to the bind group of the material if needed
172
+ * @param bindGroup - The bind group of the material
173
+ * @param ctx - The context of current drawing task
174
+ * @param needUpdate - true if the uniform values needs to update
175
+ */ applyUniforms(bindGroup, ctx, needUpdate) {
176
+ if (needUpdate) {
177
+ this._applyUniforms(bindGroup, ctx);
178
+ }
179
+ }
180
+ /**
181
+ * Fetch the gpu program of the material for drawing
182
+ * @param ctx - The context for current drawing task
183
+ * @returns Information of the gpu program
184
+ */ getOrCreateProgram(ctx) {
185
+ const programMap = Material._programMap;
186
+ const renderPassType = ctx.renderPass.type;
187
+ const hash = `${Material.debugChannel}:${this.getHash(renderPassType)}:${!!ctx.target.getBoneMatrices()}:${Number(!!(ctx.instanceData?.worldMatrices.length > 1))}:${ctx.renderPassHash}`;
188
+ let programInfo = programMap[hash];
189
+ if (!programInfo || !programInfo.programs[renderPassType] || programInfo.programs[renderPassType].disposed) {
190
+ console.time(hash);
191
+ const program = this.createProgram(ctx);
192
+ console.timeEnd(hash);
193
+ if (!programInfo) {
194
+ programInfo = {
195
+ programs: [
196
+ null,
197
+ null,
198
+ null
199
+ ],
200
+ hash
201
+ };
202
+ programMap[hash] = programInfo;
203
+ }
204
+ programInfo.programs[renderPassType] = program;
205
+ }
206
+ return programInfo || null;
207
+ }
208
+ dispose() {
209
+ this.clearBindGroupCache();
210
+ }
211
+ /**
212
+ * Sets the options of garbage collection
213
+ * @param opt - The options to set
214
+ */ static setGCOptions(opt) {
215
+ this._gcOptions = Object.assign({}, this._gcOptions, opt || {});
216
+ }
217
+ /**
218
+ * Gets the options of garbage collection
219
+ * @returns The options of garbage collection
220
+ */ static getGCOptions() {
221
+ return this._gcOptions;
222
+ }
223
+ /**
224
+ * Performs a garbage collection for this material
225
+ * @param ts - Current time stamp
226
+ * @returns How many bind groups have been garbage collected
227
+ */ static garbageCollect(ts) {
228
+ let n = 0;
229
+ ts -= this._gcOptions.inactiveTimeDuration;
230
+ while(this._drawableLRU.length > this._gcOptions.drawableCountThreshold){
231
+ const iter = this._drawableLRU.begin();
232
+ if (this._drawableTimestamps.get(iter.data) < ts) {
233
+ const bindGroups = this._drawableBindGroupMap.get(iter.data);
234
+ if (bindGroups) {
235
+ for(const k in bindGroups){
236
+ for (const bindGroup of bindGroups[k].bindGroup){
237
+ if (bindGroup) {
238
+ this.bindGroupGarbageCollect(bindGroup);
239
+ n++;
240
+ }
241
+ }
242
+ }
243
+ }
244
+ this._drawableBindGroupMap.delete(iter.data);
245
+ this._drawableIterators.delete(iter.data);
246
+ this._drawableLRU.remove(iter);
247
+ } else {
248
+ break;
249
+ }
250
+ }
251
+ while(this._materialLRU.length > this._gcOptions.materialCountThreshold){
252
+ const iter = this._materialLRU.begin();
253
+ const mat = iter.data;
254
+ if (this._materialTimestamps.get(mat) < ts && mat._bindGroupMap) {
255
+ n += mat.clearBindGroupCache();
256
+ this._materialIterators.delete(mat);
257
+ this._materialLRU.remove(iter);
258
+ } else {
259
+ break;
260
+ }
261
+ }
262
+ if (n > 0 && this._gcOptions.verbose) {
263
+ console.log(`INFO: ${n} bind groups have been garbage collected`);
264
+ }
265
+ return n;
266
+ }
267
+ /** @internal */ optionChanged(changeHash) {
268
+ this._optionTag++;
269
+ if (changeHash) {
270
+ this._hash = [];
271
+ }
272
+ }
273
+ /** @internal */ static getProgramByHashIndex(hash, index) {
274
+ return this._programMap[hash].programs[index];
275
+ }
276
+ /** @internal */ applyMaterialBindGroups(ctx, hash) {
277
+ const index = ctx.renderPass.type;
278
+ let bindGroupInfo = this._bindGroupMap[hash];
279
+ if (!bindGroupInfo) {
280
+ // bindGroups not created or have been garbage collected
281
+ const materialBindGroup = [
282
+ RENDER_PASS_TYPE_FORWARD,
283
+ RENDER_PASS_TYPE_SHADOWMAP,
284
+ RENDER_PASS_TYPE_DEPTH_ONLY
285
+ ].map((k)=>{
286
+ const program = Material._programMap[hash].programs[k];
287
+ return program?.bindGroupLayouts[2] ? Application.instance.device.createBindGroup(program.bindGroupLayouts[2]) : null;
288
+ });
289
+ bindGroupInfo = this._bindGroupMap[hash] = {
290
+ materialBindGroup,
291
+ bindGroupTag: [
292
+ 0,
293
+ 0,
294
+ 0
295
+ ],
296
+ materialTag: [
297
+ -1,
298
+ -1,
299
+ -1
300
+ ]
301
+ };
302
+ }
303
+ const bindGroup = bindGroupInfo.materialBindGroup[index];
304
+ if (bindGroup) {
305
+ this.applyUniforms(bindGroup, ctx, bindGroupInfo.materialTag[index] < this._optionTag || bindGroupInfo.bindGroupTag[index] !== bindGroup.cid);
306
+ bindGroupInfo.materialTag[index] = this._optionTag;
307
+ bindGroupInfo.bindGroupTag[index] = bindGroup.cid;
308
+ Application.instance.device.setBindGroup(2, bindGroup);
309
+ } else {
310
+ Application.instance.device.setBindGroup(2, null);
311
+ }
312
+ return bindGroup;
313
+ }
314
+ /** @internal */ getDrawableBindGroup(ctx, hash) {
315
+ let drawableBindGroups = Material._drawableBindGroupMap.get(ctx.target);
316
+ if (!drawableBindGroups) {
317
+ drawableBindGroups = {};
318
+ Material._drawableBindGroupMap.set(ctx.target, drawableBindGroups);
319
+ }
320
+ let drawableBindGroup = drawableBindGroups[hash];
321
+ if (!drawableBindGroup) {
322
+ const bindGroup = [
323
+ RENDER_PASS_TYPE_FORWARD,
324
+ RENDER_PASS_TYPE_SHADOWMAP,
325
+ RENDER_PASS_TYPE_DEPTH_ONLY
326
+ ].map((k)=>{
327
+ const program = Material._programMap[hash].programs[k];
328
+ return program?.bindGroupLayouts[1] ? Application.instance.device.createBindGroup(program.bindGroupLayouts[1]) : null;
329
+ });
330
+ drawableBindGroup = drawableBindGroups[hash] = {
331
+ bindGroup,
332
+ bindGroupTag: [
333
+ 0,
334
+ 0,
335
+ 0
336
+ ],
337
+ xformTag: [
338
+ -1,
339
+ -1,
340
+ -1
341
+ ]
342
+ };
343
+ }
344
+ return drawableBindGroup;
345
+ }
346
+ /** @internal */ applyInstanceBindGroups(ctx, hash) {
347
+ const index = ctx.renderPass.type;
348
+ const offset = Material._instanceBindGroupPool.apply(hash, index, ctx.instanceData.worldMatrices);
349
+ const bindGroup = this.getDrawableBindGroup(ctx, hash).bindGroup?.[index];
350
+ if (bindGroup) {
351
+ bindGroup.setValue('instanceBufferOffset', offset);
352
+ Application.instance.device.setBindGroup(1, bindGroup);
353
+ } else {
354
+ Application.instance.device.setBindGroup(1, null);
355
+ }
356
+ }
357
+ /** @internal */ applyDrawableBindGroups(ctx, hash) {
358
+ const device = Application.instance.device;
359
+ const index = ctx.renderPass.type;
360
+ const drawableBindGroup = this.getDrawableBindGroup(ctx, hash);
361
+ if (drawableBindGroup.bindGroup) {
362
+ const bindGroup = drawableBindGroup.bindGroup[index];
363
+ if (drawableBindGroup.xformTag[index] < ctx.target.getXForm().getTag() || drawableBindGroup.bindGroupTag[index] !== bindGroup.cid) {
364
+ bindGroup.setValue('worldMatrix', ctx.target.getXForm().worldMatrix);
365
+ drawableBindGroup.xformTag[index] = ctx.target.getXForm().getTag();
366
+ drawableBindGroup.bindGroupTag[index] = bindGroup.cid;
367
+ }
368
+ const boneMatrices = ctx.target.getBoneMatrices();
369
+ if (boneMatrices) {
370
+ if (!Material._boneMatrixTextureSampler) {
371
+ Material._boneMatrixTextureSampler = device.createSampler({
372
+ magFilter: 'nearest',
373
+ minFilter: 'nearest',
374
+ mipFilter: 'none'
375
+ });
376
+ }
377
+ bindGroup.setTexture('boneMatrices', boneMatrices);
378
+ bindGroup.setValue('boneTextureSize', boneMatrices.width);
379
+ bindGroup.setValue('invBindMatrix', ctx.target.getInvBindMatrix());
380
+ }
381
+ device.setBindGroup(1, bindGroup);
382
+ } else {
383
+ device.setBindGroup(1, null);
384
+ }
385
+ }
386
+ /** @internal */ createHash(renderPassType) {
387
+ return `${this.constructor.name}|${this._createHash(renderPassType)}`;
388
+ }
389
+ /** @internal */ clearBindGroupCache() {
390
+ let n = 0;
391
+ for(const k in this._bindGroupMap){
392
+ for (const bindGroup of this._bindGroupMap[k].materialBindGroup){
393
+ if (bindGroup) {
394
+ Material.bindGroupGarbageCollect(bindGroup);
395
+ n++;
396
+ }
397
+ }
398
+ }
399
+ this._bindGroupMap = {};
400
+ return n;
401
+ }
402
+ /** @internal */ static bindGroupGarbageCollect(bindGroup) {
403
+ const layout = bindGroup.getLayout();
404
+ for (const entry of layout.entries){
405
+ if (entry.buffer) {
406
+ const buffer = bindGroup.getBuffer(entry.name);
407
+ if (buffer) {
408
+ buffer.dispose();
409
+ bindGroup.setBuffer(entry.name, null);
410
+ }
411
+ }
412
+ }
413
+ }
414
+ /** @internal */ static lruPutDrawable(drawable) {
415
+ const iter = this._drawableIterators.get(drawable);
416
+ if (iter) {
417
+ this._drawableLRU.remove(iter);
418
+ }
419
+ this._drawableIterators.set(drawable, this._drawableLRU.append(drawable));
420
+ }
421
+ /** @internal */ static lruPutMaterial(material) {
422
+ const iter = this._materialIterators.get(material);
423
+ if (iter) {
424
+ this._materialLRU.remove(iter);
425
+ }
426
+ this._materialIterators.set(material, this._materialLRU.append(material));
427
+ }
428
+ /** @internal */ createProgram(ctx) {
429
+ const pb = new ProgramBuilder(Application.instance.device);
430
+ return this._createProgram(pb, ctx);
431
+ }
432
+ /** @internal */ createRenderStateSet() {
433
+ return Application.instance.device.createRenderStateSet();
434
+ }
435
+ /**
436
+ * Creates the shader program
437
+ * @param pb - The program builder
438
+ * @param ctx - The drawing context
439
+ * @param func - The material func
440
+ * @returns The created shader program
441
+ */ _createProgram(pb, ctx) {
442
+ return null;
443
+ }
444
+ /**
445
+ * Applies uniform values
446
+ * @param bindGroup - The bind group
447
+ * @param ctx - The drawing context
448
+ */ _applyUniforms(bindGroup, ctx) {}
449
+ /**
450
+ * Calculates the hash code of the shader program
451
+ * @returns The hash code
452
+ */ _createHash(renderPassType) {
453
+ return '';
454
+ }
455
+ }
456
+
457
+ export { Material };
458
+ //# sourceMappingURL=material.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}