@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.
- package/dist/animation/animation.js +173 -0
- package/dist/animation/animation.js.map +1 -0
- package/dist/animation/animationset.js +95 -0
- package/dist/animation/animationset.js.map +1 -0
- package/dist/animation/animationtrack.js +38 -0
- package/dist/animation/animationtrack.js.map +1 -0
- package/dist/animation/eulerrotationtrack.js +33 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -0
- package/dist/animation/rotationtrack.js +37 -0
- package/dist/animation/rotationtrack.js.map +1 -0
- package/dist/animation/scaletrack.js +36 -0
- package/dist/animation/scaletrack.js.map +1 -0
- package/dist/animation/skeleton.js +97 -0
- package/dist/animation/skeleton.js.map +1 -0
- package/dist/animation/translationtrack.js +36 -0
- package/dist/animation/translationtrack.js.map +1 -0
- package/dist/animation/usertrack.js +47 -0
- package/dist/animation/usertrack.js.map +1 -0
- package/dist/app.js +173 -0
- package/dist/app.js.map +1 -0
- package/dist/asset/assetmanager.js +476 -0
- package/dist/asset/assetmanager.js.map +1 -0
- package/dist/asset/builtin.js +373 -0
- package/dist/asset/builtin.js.map +1 -0
- package/dist/asset/loaders/dds/dds.js +472 -0
- package/dist/asset/loaders/dds/dds.js.map +1 -0
- package/dist/asset/loaders/dds/dds_loader.js +38 -0
- package/dist/asset/loaders/dds/dds_loader.js.map +1 -0
- package/dist/asset/loaders/gltf/gltf_loader.js +981 -0
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -0
- package/dist/asset/loaders/gltf/helpers.js +314 -0
- package/dist/asset/loaders/gltf/helpers.js.map +1 -0
- package/dist/asset/loaders/hdr/hdr.js +175 -0
- package/dist/asset/loaders/hdr/hdr.js.map +1 -0
- package/dist/asset/loaders/image/tga_Loader.js +117 -0
- package/dist/asset/loaders/image/tga_Loader.js.map +1 -0
- package/dist/asset/loaders/image/webimage_loader.js +50 -0
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -0
- package/dist/asset/loaders/loader.js +45 -0
- package/dist/asset/loaders/loader.js.map +1 -0
- package/dist/asset/model.js +264 -0
- package/dist/asset/model.js.map +1 -0
- package/dist/blitter/blitter.js +389 -0
- package/dist/blitter/blitter.js.map +1 -0
- package/dist/blitter/box.js +118 -0
- package/dist/blitter/box.js.map +1 -0
- package/dist/blitter/copy.js +22 -0
- package/dist/blitter/copy.js.map +1 -0
- package/dist/blitter/depthlimitedgaussion.js +166 -0
- package/dist/blitter/depthlimitedgaussion.js.map +1 -0
- package/dist/blitter/gaussianblur.js +229 -0
- package/dist/blitter/gaussianblur.js.map +1 -0
- package/dist/camera/base.js +90 -0
- package/dist/camera/base.js.map +1 -0
- package/dist/camera/camera.js +358 -0
- package/dist/camera/camera.js.map +1 -0
- package/dist/camera/fps.js +246 -0
- package/dist/camera/fps.js.map +1 -0
- package/dist/camera/orbit.js +157 -0
- package/dist/camera/orbit.js.map +1 -0
- package/dist/camera/orthocamera.js +126 -0
- package/dist/camera/orthocamera.js.map +1 -0
- package/dist/camera/perspectivecamera.js +133 -0
- package/dist/camera/perspectivecamera.js.map +1 -0
- package/dist/index.d.ts +8402 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/input/inputmgr.js +242 -0
- package/dist/input/inputmgr.js.map +1 -0
- package/dist/material/blinn.js +75 -0
- package/dist/material/blinn.js.map +1 -0
- package/dist/material/grassmaterial.js +221 -0
- package/dist/material/grassmaterial.js.map +1 -0
- package/dist/material/lambert.js +52 -0
- package/dist/material/lambert.js.map +1 -0
- package/dist/material/lightmodel.js +2074 -0
- package/dist/material/lightmodel.js.map +1 -0
- package/dist/material/lit.js +578 -0
- package/dist/material/lit.js.map +1 -0
- package/dist/material/material.js +458 -0
- package/dist/material/material.js.map +1 -0
- package/dist/material/meshmaterial.js +311 -0
- package/dist/material/meshmaterial.js.map +1 -0
- package/dist/material/mixins/albedocolor.js +130 -0
- package/dist/material/mixins/albedocolor.js.map +1 -0
- package/dist/material/mixins/texture.js +110 -0
- package/dist/material/mixins/texture.js.map +1 -0
- package/dist/material/mixins/vertexcolor.js +45 -0
- package/dist/material/mixins/vertexcolor.js.map +1 -0
- package/dist/material/pbr.js +27 -0
- package/dist/material/pbr.js.map +1 -0
- package/dist/material/standard.js +282 -0
- package/dist/material/standard.js.map +1 -0
- package/dist/material/terrainlightmodel.js +259 -0
- package/dist/material/terrainlightmodel.js.map +1 -0
- package/dist/material/terrainmaterial.js +139 -0
- package/dist/material/terrainmaterial.js.map +1 -0
- package/dist/material/unlit.js +29 -0
- package/dist/material/unlit.js.map +1 -0
- package/dist/posteffect/bloom.js +398 -0
- package/dist/posteffect/bloom.js.map +1 -0
- package/dist/posteffect/compositor.js +264 -0
- package/dist/posteffect/compositor.js.map +1 -0
- package/dist/posteffect/fxaa.js +291 -0
- package/dist/posteffect/fxaa.js.map +1 -0
- package/dist/posteffect/grayscale.js +87 -0
- package/dist/posteffect/grayscale.js.map +1 -0
- package/dist/posteffect/posteffect.js +165 -0
- package/dist/posteffect/posteffect.js.map +1 -0
- package/dist/posteffect/sao.js +327 -0
- package/dist/posteffect/sao.js.map +1 -0
- package/dist/posteffect/tonemap.js +112 -0
- package/dist/posteffect/tonemap.js.map +1 -0
- package/dist/posteffect/water.js +535 -0
- package/dist/posteffect/water.js.map +1 -0
- package/dist/render/clipmap.js +462 -0
- package/dist/render/clipmap.js.map +1 -0
- package/dist/render/cluster_light.js +329 -0
- package/dist/render/cluster_light.js.map +1 -0
- package/dist/render/cull_visitor.js +124 -0
- package/dist/render/cull_visitor.js.map +1 -0
- package/dist/render/depth_pass.js +47 -0
- package/dist/render/depth_pass.js.map +1 -0
- package/dist/render/envlight.js +282 -0
- package/dist/render/envlight.js.map +1 -0
- package/dist/render/forward.js +186 -0
- package/dist/render/forward.js.map +1 -0
- package/dist/render/forward_pass.js +137 -0
- package/dist/render/forward_pass.js.map +1 -0
- package/dist/render/helper.js +38 -0
- package/dist/render/helper.js.map +1 -0
- package/dist/render/primitive.js +246 -0
- package/dist/render/primitive.js.map +1 -0
- package/dist/render/render_queue.js +163 -0
- package/dist/render/render_queue.js.map +1 -0
- package/dist/render/renderpass.js +151 -0
- package/dist/render/renderpass.js.map +1 -0
- package/dist/render/renderscheme.js +61 -0
- package/dist/render/renderscheme.js.map +1 -0
- package/dist/render/scatteringlut.js +634 -0
- package/dist/render/scatteringlut.js.map +1 -0
- package/dist/render/shadowmap_pass.js +70 -0
- package/dist/render/shadowmap_pass.js.map +1 -0
- package/dist/render/sky.js +881 -0
- package/dist/render/sky.js.map +1 -0
- package/dist/render/temporalcache.js +222 -0
- package/dist/render/temporalcache.js.map +1 -0
- package/dist/render/watermesh.js +835 -0
- package/dist/render/watermesh.js.map +1 -0
- package/dist/scene/environment.js +146 -0
- package/dist/scene/environment.js.map +1 -0
- package/dist/scene/graph_node.js +69 -0
- package/dist/scene/graph_node.js.map +1 -0
- package/dist/scene/light.js +436 -0
- package/dist/scene/light.js.map +1 -0
- package/dist/scene/mesh.js +215 -0
- package/dist/scene/mesh.js.map +1 -0
- package/dist/scene/model.js +111 -0
- package/dist/scene/model.js.map +1 -0
- package/dist/scene/octree.js +651 -0
- package/dist/scene/octree.js.map +1 -0
- package/dist/scene/octree_update_visitor.js +16 -0
- package/dist/scene/octree_update_visitor.js.map +1 -0
- package/dist/scene/raycast_visitor.js +72 -0
- package/dist/scene/raycast_visitor.js.map +1 -0
- package/dist/scene/scene.js +225 -0
- package/dist/scene/scene.js.map +1 -0
- package/dist/scene/scene_node.js +299 -0
- package/dist/scene/scene_node.js.map +1 -0
- package/dist/scene/terrain/grass.js +277 -0
- package/dist/scene/terrain/grass.js.map +1 -0
- package/dist/scene/terrain/heightfield.js +391 -0
- package/dist/scene/terrain/heightfield.js.map +1 -0
- package/dist/scene/terrain/patch.js +530 -0
- package/dist/scene/terrain/patch.js.map +1 -0
- package/dist/scene/terrain/quadtree.js +430 -0
- package/dist/scene/terrain/quadtree.js.map +1 -0
- package/dist/scene/terrain/terrain.js +258 -0
- package/dist/scene/terrain/terrain.js.map +1 -0
- package/dist/scene/xform.js +224 -0
- package/dist/scene/xform.js.map +1 -0
- package/dist/shaders/builtins.js +110 -0
- package/dist/shaders/builtins.js.map +1 -0
- package/dist/shaders/framework.js +709 -0
- package/dist/shaders/framework.js.map +1 -0
- package/dist/shaders/lighting.js +335 -0
- package/dist/shaders/lighting.js.map +1 -0
- package/dist/shaders/misc.js +405 -0
- package/dist/shaders/misc.js.map +1 -0
- package/dist/shaders/noise.js +157 -0
- package/dist/shaders/noise.js.map +1 -0
- package/dist/shaders/pbr.js +132 -0
- package/dist/shaders/pbr.js.map +1 -0
- package/dist/shaders/shadow.js +642 -0
- package/dist/shaders/shadow.js.map +1 -0
- package/dist/shaders/water.js +630 -0
- package/dist/shaders/water.js.map +1 -0
- package/dist/shadow/esm.js +235 -0
- package/dist/shadow/esm.js.map +1 -0
- package/dist/shadow/pcf_opt.js +182 -0
- package/dist/shadow/pcf_opt.js.map +1 -0
- package/dist/shadow/pcf_pd.js +190 -0
- package/dist/shadow/pcf_pd.js.map +1 -0
- package/dist/shadow/shadow_impl.js +15 -0
- package/dist/shadow/shadow_impl.js.map +1 -0
- package/dist/shadow/shadowmapper.js +709 -0
- package/dist/shadow/shadowmapper.js.map +1 -0
- package/dist/shadow/ssm.js +194 -0
- package/dist/shadow/ssm.js.map +1 -0
- package/dist/shadow/vsm.js +298 -0
- package/dist/shadow/vsm.js.map +1 -0
- package/dist/shapes/box.js +313 -0
- package/dist/shapes/box.js.map +1 -0
- package/dist/shapes/cylinder.js +74 -0
- package/dist/shapes/cylinder.js.map +1 -0
- package/dist/shapes/plane.js +48 -0
- package/dist/shapes/plane.js.map +1 -0
- package/dist/shapes/shape.js +33 -0
- package/dist/shapes/shape.js.map +1 -0
- package/dist/shapes/sphere.js +91 -0
- package/dist/shapes/sphere.js.map +1 -0
- package/dist/shapes/torus.js +100 -0
- package/dist/shapes/torus.js.map +1 -0
- package/dist/utility/aabbtree.js +390 -0
- package/dist/utility/aabbtree.js.map +1 -0
- package/dist/utility/bounding_volume.js +78 -0
- package/dist/utility/bounding_volume.js.map +1 -0
- package/dist/utility/panorama.js +163 -0
- package/dist/utility/panorama.js.map +1 -0
- package/dist/utility/pmrem.js +345 -0
- package/dist/utility/pmrem.js.map +1 -0
- package/dist/utility/shprojection.js +448 -0
- package/dist/utility/shprojection.js.map +1 -0
- package/dist/values.js +48 -0
- package/dist/values.js.map +1 -0
- 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|