@codexo/exojs 0.9.0 → 0.10.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/CHANGELOG.md +44 -0
- package/README.md +14 -14
- package/dist/esm/core/Application.d.ts +25 -6
- package/dist/esm/core/Application.js +42 -8
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Perf.d.ts +23 -0
- package/dist/esm/core/Perf.js +49 -0
- package/dist/esm/core/Perf.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +8 -8
- package/dist/esm/core/Scene.js +7 -7
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +2 -2
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +0 -3
- package/dist/esm/core/SceneNode.js +0 -9
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +2 -0
- package/dist/esm/core/capabilities.js +15 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/utils.d.ts +12 -0
- package/dist/esm/core/utils.js +18 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/index.js +14 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/particles/ParticleSystem.d.ts +8 -5
- package/dist/esm/particles/ParticleSystem.js +9 -5
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
- package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
- package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
- package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
- package/dist/esm/particles/distributions/index.d.ts +2 -2
- package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
- package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
- package/dist/esm/particles/modules/UpdateModule.js +1 -1
- package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
- package/dist/esm/rendering/Camera.d.ts +33 -0
- package/dist/esm/rendering/Camera.js +38 -0
- package/dist/esm/rendering/Camera.js.map +1 -0
- package/dist/esm/rendering/Container.d.ts +5 -24
- package/dist/esm/rendering/Container.js +8 -71
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +8 -10
- package/dist/esm/rendering/Drawable.js +12 -20
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +18 -0
- package/dist/esm/rendering/RenderNode.d.ts +81 -8
- package/dist/esm/rendering/RenderNode.js +121 -144
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +13 -0
- package/dist/esm/rendering/RenderTarget.js +13 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.js +17 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +87 -0
- package/dist/esm/rendering/RenderingContext.js +157 -0
- package/dist/esm/rendering/RenderingContext.js.map +1 -0
- package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
- package/dist/esm/rendering/TransformBuffer.js +116 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
- package/dist/esm/rendering/geometry/Geometry.js +228 -0
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
- package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
- package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
- package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
- package/dist/esm/rendering/gradient/Gradient.js +114 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
- package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +16 -2
- package/dist/esm/rendering/material/Material.d.ts +114 -0
- package/dist/esm/rendering/material/Material.js +111 -0
- package/dist/esm/rendering/material/Material.js.map +1 -0
- package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
- package/dist/esm/rendering/material/MaterialKey.js +82 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
- package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
- package/dist/esm/rendering/material/MeshMaterial.js +21 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
- package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
- package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
- package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
- package/dist/esm/rendering/mesh/Mesh.js +122 -3
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
- package/dist/esm/rendering/plan/RenderCommand.js +94 -0
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
- package/dist/esm/rendering/plan/RenderPlan.js +12 -0
- package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
- package/dist/esm/rendering/plan/RenderScope.js +16 -0
- package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
- package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
- package/dist/esm/rendering/plan/playRenderTree.js +19 -0
- package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
- package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
- package/dist/esm/rendering/sprite/Sprite.js +33 -2
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/TextStyle.d.ts +1 -1
- package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
- package/dist/esm/rendering/texture/DataTexture.js +7 -0
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +3 -7
- package/dist/esm/rendering/video/Video.js +3 -8
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +303 -22
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +4 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +135 -19
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +488 -74
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +335 -26
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +14 -12
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
- package/dist/esm/resources/JsonStore.d.ts +18 -0
- package/dist/esm/resources/JsonStore.js +62 -0
- package/dist/esm/resources/JsonStore.js.map +1 -0
- package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
- package/dist/esm/resources/factories/ImageFactory.js +13 -6
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
- package/dist/esm/resources/factories/TextureFactory.js +8 -4
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/index.d.ts +1 -0
- package/dist/exo.esm.js +5424 -2205
- package/dist/exo.esm.js.map +1 -1
- package/package.json +30 -24
- package/dist/esm/particles/distributions/Gradient.js.map +0 -1
- package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
- package/dist/esm/vendor/webgl-debug.js +0 -1160
- package/dist/esm/vendor/webgl-debug.js.map +0 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { Rectangle } from '../../math/Rectangle.js';
|
|
2
|
+
|
|
3
|
+
const attributeTypeByteSizes = {
|
|
4
|
+
f32: 4,
|
|
5
|
+
u8: 1,
|
|
6
|
+
u16: 2,
|
|
7
|
+
u32: 4,
|
|
8
|
+
i32: 4,
|
|
9
|
+
};
|
|
10
|
+
const validTopologies = new Set(['triangle-list', 'triangle-strip']);
|
|
11
|
+
const validUsages = new Set(['static', 'dynamic', 'stream']);
|
|
12
|
+
const positionAttributeNames = new Set(['a_position', 'position']);
|
|
13
|
+
const geometryIds = new WeakMap();
|
|
14
|
+
let nextGeometryId = 1;
|
|
15
|
+
const getOrCreateGeometryId = (geometry) => {
|
|
16
|
+
const cached = geometryIds.get(geometry);
|
|
17
|
+
if (cached !== undefined) {
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
const id = nextGeometryId++;
|
|
21
|
+
geometryIds.set(geometry, id);
|
|
22
|
+
return id;
|
|
23
|
+
};
|
|
24
|
+
const getVertexCount = (vertexData, stride) => {
|
|
25
|
+
const { byteLength } = vertexData;
|
|
26
|
+
if (byteLength % stride !== 0) {
|
|
27
|
+
throw new Error(`Geometry vertexData byteLength ${byteLength} must be divisible by stride ${stride}.`);
|
|
28
|
+
}
|
|
29
|
+
return byteLength / stride;
|
|
30
|
+
};
|
|
31
|
+
const readComponent = (view, type, offset, normalized) => {
|
|
32
|
+
switch (type) {
|
|
33
|
+
case 'f32':
|
|
34
|
+
return view.getFloat32(offset, true);
|
|
35
|
+
case 'u8': {
|
|
36
|
+
const value = view.getUint8(offset);
|
|
37
|
+
return normalized ? value / 255 : value;
|
|
38
|
+
}
|
|
39
|
+
case 'u16': {
|
|
40
|
+
const value = view.getUint16(offset, true);
|
|
41
|
+
return normalized ? value / 65535 : value;
|
|
42
|
+
}
|
|
43
|
+
case 'u32': {
|
|
44
|
+
const value = view.getUint32(offset, true);
|
|
45
|
+
return normalized ? value / 4294967295 : value;
|
|
46
|
+
}
|
|
47
|
+
case 'i32': {
|
|
48
|
+
const value = view.getInt32(offset, true);
|
|
49
|
+
return normalized ? Math.max(value / 2147483647, -1) : value;
|
|
50
|
+
}
|
|
51
|
+
default:
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const cloneAttributes = (attributes) => {
|
|
56
|
+
return attributes.map(attribute => ({ ...attribute }));
|
|
57
|
+
};
|
|
58
|
+
const resolvePositionAttribute = (attributes) => {
|
|
59
|
+
const directMatch = attributes.find(attribute => positionAttributeNames.has(attribute.name));
|
|
60
|
+
if (directMatch) {
|
|
61
|
+
return directMatch;
|
|
62
|
+
}
|
|
63
|
+
const fuzzyMatch = attributes.find(attribute => attribute.name.toLowerCase().includes('position'));
|
|
64
|
+
if (fuzzyMatch) {
|
|
65
|
+
return fuzzyMatch;
|
|
66
|
+
}
|
|
67
|
+
throw new Error('Geometry requires a position attribute named `a_position` or `position`.');
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Non-renderable geometry data object used by advanced rendering paths.
|
|
71
|
+
*
|
|
72
|
+
* Geometry owns only vertex/index data and its layout metadata; it is not a
|
|
73
|
+
* scene node, has no transform state, and cannot render itself.
|
|
74
|
+
* @advanced
|
|
75
|
+
*/
|
|
76
|
+
class Geometry {
|
|
77
|
+
attributes;
|
|
78
|
+
stride;
|
|
79
|
+
topology;
|
|
80
|
+
usage;
|
|
81
|
+
indices;
|
|
82
|
+
vertexData;
|
|
83
|
+
_version = 0;
|
|
84
|
+
_localBounds = new Rectangle();
|
|
85
|
+
_localBoundsDirty = true;
|
|
86
|
+
_positionAttribute;
|
|
87
|
+
_disposeCallbacks = new Set();
|
|
88
|
+
constructor(options) {
|
|
89
|
+
const { attributes, vertexData, stride, indices = null, topology = 'triangle-list', usage = 'static' } = options;
|
|
90
|
+
if (attributes.length === 0) {
|
|
91
|
+
throw new Error('Geometry attributes must be a non-empty array.');
|
|
92
|
+
}
|
|
93
|
+
if (!Number.isInteger(stride) || stride <= 0) {
|
|
94
|
+
throw new Error(`Geometry stride must be a positive integer (got ${stride}).`);
|
|
95
|
+
}
|
|
96
|
+
if (!validTopologies.has(topology)) {
|
|
97
|
+
throw new Error(`Geometry topology must be one of: triangle-list, triangle-strip (got ${String(topology)}).`);
|
|
98
|
+
}
|
|
99
|
+
if (!validUsages.has(usage)) {
|
|
100
|
+
throw new Error(`Geometry usage must be one of: static, dynamic, stream (got ${String(usage)}).`);
|
|
101
|
+
}
|
|
102
|
+
const ranges = [];
|
|
103
|
+
const names = new Set();
|
|
104
|
+
for (const attribute of attributes) {
|
|
105
|
+
if (typeof attribute.name !== 'string' || attribute.name.length === 0) {
|
|
106
|
+
throw new Error('Geometry attribute name must be a non-empty string.');
|
|
107
|
+
}
|
|
108
|
+
if (names.has(attribute.name)) {
|
|
109
|
+
throw new Error(`Geometry attribute "${attribute.name}" is declared more than once.`);
|
|
110
|
+
}
|
|
111
|
+
names.add(attribute.name);
|
|
112
|
+
if (!Number.isInteger(attribute.size) || attribute.size < 1 || attribute.size > 4) {
|
|
113
|
+
throw new Error(`Geometry attribute "${attribute.name}" size must be an integer in [1..4] (got ${attribute.size}).`);
|
|
114
|
+
}
|
|
115
|
+
if (!Number.isInteger(attribute.offset) || attribute.offset < 0) {
|
|
116
|
+
throw new Error(`Geometry attribute "${attribute.name}" offset must be a non-negative integer (got ${attribute.offset}).`);
|
|
117
|
+
}
|
|
118
|
+
const byteSize = attributeTypeByteSizes[attribute.type];
|
|
119
|
+
const end = attribute.offset + byteSize * attribute.size;
|
|
120
|
+
if (end > stride) {
|
|
121
|
+
throw new Error(`Geometry attribute "${attribute.name}" range [${attribute.offset}, ${end}) exceeds stride ${stride}.`);
|
|
122
|
+
}
|
|
123
|
+
for (const range of ranges) {
|
|
124
|
+
if (attribute.offset < range.end && end > range.start) {
|
|
125
|
+
throw new Error(`Geometry attribute "${attribute.name}" overlaps attribute "${range.name}" in the interleaved layout.`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
ranges.push({ name: attribute.name, start: attribute.offset, end });
|
|
129
|
+
}
|
|
130
|
+
const positionAttribute = resolvePositionAttribute(attributes);
|
|
131
|
+
if (positionAttribute.size < 2) {
|
|
132
|
+
throw new Error(`Geometry position attribute "${positionAttribute.name}" must declare at least 2 components.`);
|
|
133
|
+
}
|
|
134
|
+
const vertexCount = getVertexCount(vertexData, stride);
|
|
135
|
+
if (indices !== null) {
|
|
136
|
+
for (let i = 0; i < indices.length; i++) {
|
|
137
|
+
if (indices[i] >= vertexCount) {
|
|
138
|
+
throw new Error(`Geometry index ${indices[i]} at position ${i} is out of range for vertex count ${vertexCount}.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.attributes = cloneAttributes(attributes);
|
|
143
|
+
this.vertexData = vertexData;
|
|
144
|
+
this.stride = stride;
|
|
145
|
+
this.indices = indices;
|
|
146
|
+
this.topology = topology;
|
|
147
|
+
this.usage = usage;
|
|
148
|
+
this._positionAttribute = { ...positionAttribute };
|
|
149
|
+
}
|
|
150
|
+
get vertexCount() {
|
|
151
|
+
return getVertexCount(this.vertexData, this.stride);
|
|
152
|
+
}
|
|
153
|
+
get indexCount() {
|
|
154
|
+
return this.indices?.length ?? this.vertexCount;
|
|
155
|
+
}
|
|
156
|
+
get version() {
|
|
157
|
+
return this._version;
|
|
158
|
+
}
|
|
159
|
+
get id() {
|
|
160
|
+
return getOrCreateGeometryId(this);
|
|
161
|
+
}
|
|
162
|
+
/** Mark vertex data as mutated in place so backends can re-upload GPU buffers. */
|
|
163
|
+
invalidate() {
|
|
164
|
+
this._version++;
|
|
165
|
+
this._localBoundsDirty = true;
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
/** Return local-space bounds; when `out` is provided it is populated and returned. */
|
|
169
|
+
getLocalBounds(out = this._localBounds) {
|
|
170
|
+
if (this._localBoundsDirty) {
|
|
171
|
+
this.recomputeLocalBounds();
|
|
172
|
+
}
|
|
173
|
+
if (out === this._localBounds) {
|
|
174
|
+
return this._localBounds;
|
|
175
|
+
}
|
|
176
|
+
return out.copy(this._localBounds);
|
|
177
|
+
}
|
|
178
|
+
/** Force local-space AABB recomputation from the current position attribute data. */
|
|
179
|
+
recomputeLocalBounds() {
|
|
180
|
+
const vertexCount = this.vertexCount;
|
|
181
|
+
if (vertexCount === 0) {
|
|
182
|
+
this._localBounds.set(0, 0, 0, 0);
|
|
183
|
+
this._localBoundsDirty = false;
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
const view = this.vertexData instanceof Float32Array
|
|
187
|
+
? new DataView(this.vertexData.buffer, this.vertexData.byteOffset, this.vertexData.byteLength)
|
|
188
|
+
: new DataView(this.vertexData);
|
|
189
|
+
const componentByteSize = attributeTypeByteSizes[this._positionAttribute.type];
|
|
190
|
+
let minX = Infinity;
|
|
191
|
+
let minY = Infinity;
|
|
192
|
+
let maxX = -Infinity;
|
|
193
|
+
let maxY = -Infinity;
|
|
194
|
+
for (let vertexIndex = 0; vertexIndex < vertexCount; vertexIndex++) {
|
|
195
|
+
const start = vertexIndex * this.stride + this._positionAttribute.offset;
|
|
196
|
+
const x = readComponent(view, this._positionAttribute.type, start, this._positionAttribute.normalized);
|
|
197
|
+
const y = readComponent(view, this._positionAttribute.type, start + componentByteSize, this._positionAttribute.normalized);
|
|
198
|
+
if (x < minX)
|
|
199
|
+
minX = x;
|
|
200
|
+
if (x > maxX)
|
|
201
|
+
maxX = x;
|
|
202
|
+
if (y < minY)
|
|
203
|
+
minY = y;
|
|
204
|
+
if (y > maxY)
|
|
205
|
+
maxY = y;
|
|
206
|
+
}
|
|
207
|
+
this._localBounds.set(minX, minY, maxX - minX, maxY - minY);
|
|
208
|
+
this._localBoundsDirty = false;
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
/** Release backend-owned resources associated with this geometry instance. */
|
|
212
|
+
destroy() {
|
|
213
|
+
for (const callback of this._disposeCallbacks) {
|
|
214
|
+
callback();
|
|
215
|
+
}
|
|
216
|
+
this._disposeCallbacks.clear();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Internal backend hook used to register per-geometry cleanup callbacks.
|
|
220
|
+
* @internal
|
|
221
|
+
*/
|
|
222
|
+
_onDispose(callback) {
|
|
223
|
+
this._disposeCallbacks.add(callback);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export { Geometry };
|
|
228
|
+
//# sourceMappingURL=Geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Geometry.js","sources":["../../../../../src/rendering/geometry/Geometry.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GPU buffer ownership strategy used by geometry-aware render paths.
|
|
3
|
+
*
|
|
4
|
+
* - `static` — immutable after creation; eligible for shared batched buffers.
|
|
5
|
+
* - `dynamic` — occasionally mutated; backend should keep a dedicated buffer.
|
|
6
|
+
* - `stream` — mutated every frame; backend should treat as immediate data.
|
|
7
|
+
*/
|
|
8
|
+
export type GeometryUsage = 'static' | 'dynamic' | 'stream';
|
|
9
|
+
/** Scalar component type used by a geometry vertex attribute. */
|
|
10
|
+
export type AttributeType = 'f32' | 'u8' | 'u16' | 'u32' | 'i32';
|
|
11
|
+
/** Primitive topology used when drawing this geometry. */
|
|
12
|
+
export type Topology = 'triangle-list' | 'triangle-strip';
|
|
13
|
+
/**
|
|
14
|
+
* Descriptor for one attribute in an interleaved vertex layout.
|
|
15
|
+
* Offsets and stride are expressed in bytes.
|
|
16
|
+
*/
|
|
17
|
+
export interface GeometryAttribute {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly size: number;
|
|
20
|
+
readonly type: AttributeType;
|
|
21
|
+
readonly normalized: boolean;
|
|
22
|
+
readonly offset: number;
|
|
23
|
+
}
|
|
24
|
+
/** Construction options for {@link Geometry}. */
|
|
25
|
+
export interface GeometryOptions {
|
|
26
|
+
readonly attributes: readonly GeometryAttribute[];
|
|
27
|
+
readonly vertexData: Float32Array | ArrayBuffer;
|
|
28
|
+
readonly stride: number;
|
|
29
|
+
readonly indices?: Uint16Array | Uint32Array | null;
|
|
30
|
+
readonly topology?: Topology;
|
|
31
|
+
readonly usage?: GeometryUsage;
|
|
32
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Color } from '@/core/Color';
|
|
2
|
+
import { DataTexture } from '@/rendering/texture/DataTexture';
|
|
3
|
+
import type { SamplerOptions } from '@/rendering/texture/Sampler';
|
|
4
|
+
export interface GradientStop {
|
|
5
|
+
offset: number;
|
|
6
|
+
color: Color;
|
|
7
|
+
}
|
|
8
|
+
export interface GradientToTextureOptions {
|
|
9
|
+
readonly format?: 'rgba8' | 'rgba32f';
|
|
10
|
+
readonly samplerOptions?: Partial<SamplerOptions>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* CPU-rasterized gradient base that can be converted into a {@link DataTexture}.
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class Gradient {
|
|
16
|
+
private _stops;
|
|
17
|
+
private readonly _sample;
|
|
18
|
+
protected constructor(stops: readonly GradientStop[]);
|
|
19
|
+
get stops(): readonly GradientStop[];
|
|
20
|
+
toTexture(width: number, height: number, options?: GradientToTextureOptions & {
|
|
21
|
+
format?: 'rgba8';
|
|
22
|
+
}): DataTexture<'rgba8'>;
|
|
23
|
+
toTexture(width: number, height: number, options: GradientToTextureOptions & {
|
|
24
|
+
format: 'rgba32f';
|
|
25
|
+
}): DataTexture<'rgba32f'>;
|
|
26
|
+
destroy(): void;
|
|
27
|
+
protected abstract resolveT(u: number, v: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Shared stop sampling logic ported from the legacy GLSL implementation.
|
|
30
|
+
*/
|
|
31
|
+
protected sampleAt(t: number, out: Float32Array): void;
|
|
32
|
+
private _toRgba8Texture;
|
|
33
|
+
private _toRgba32fTexture;
|
|
34
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { clamp } from '../../math/utils.js';
|
|
2
|
+
import { DataTexture } from '../texture/DataTexture.js';
|
|
3
|
+
|
|
4
|
+
const sortedStopOffset = (left, right) => left.offset - right.offset;
|
|
5
|
+
/**
|
|
6
|
+
* CPU-rasterized gradient base that can be converted into a {@link DataTexture}.
|
|
7
|
+
*/
|
|
8
|
+
class Gradient {
|
|
9
|
+
_stops;
|
|
10
|
+
_sample = new Float32Array(4);
|
|
11
|
+
constructor(stops) {
|
|
12
|
+
if (stops.length < 2) {
|
|
13
|
+
throw new Error('Gradient requires at least 2 color stops.');
|
|
14
|
+
}
|
|
15
|
+
this._stops = [...stops].map(stop => ({ offset: clamp(stop.offset, 0, 1), color: stop.color.clone() })).sort(sortedStopOffset);
|
|
16
|
+
}
|
|
17
|
+
get stops() {
|
|
18
|
+
return this._stops;
|
|
19
|
+
}
|
|
20
|
+
toTexture(width, height, options = {}) {
|
|
21
|
+
if (!Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) {
|
|
22
|
+
throw new Error('Gradient.toTexture() width/height must be positive integers.');
|
|
23
|
+
}
|
|
24
|
+
if (options.format === 'rgba32f') {
|
|
25
|
+
return this._toRgba32fTexture(width, height, options);
|
|
26
|
+
}
|
|
27
|
+
return this._toRgba8Texture(width, height, options);
|
|
28
|
+
}
|
|
29
|
+
destroy() {
|
|
30
|
+
for (const stop of this._stops) {
|
|
31
|
+
stop.color.destroy();
|
|
32
|
+
}
|
|
33
|
+
this._stops = [];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Shared stop sampling logic ported from the legacy GLSL implementation.
|
|
37
|
+
*/
|
|
38
|
+
sampleAt(t, out) {
|
|
39
|
+
const clamped = clamp(t, 0, 1);
|
|
40
|
+
const first = this._stops[0];
|
|
41
|
+
let previousOffset = first.offset;
|
|
42
|
+
let previousColor = first.color;
|
|
43
|
+
for (let i = 1; i < this._stops.length; i++) {
|
|
44
|
+
const current = this._stops[i];
|
|
45
|
+
if (clamped <= current.offset) {
|
|
46
|
+
const span = Math.max(current.offset - previousOffset, 0.000001);
|
|
47
|
+
const ratio = clamp((clamped - previousOffset) / span, 0, 1);
|
|
48
|
+
out[0] = previousColor.r / 255 + (current.color.r / 255 - previousColor.r / 255) * ratio;
|
|
49
|
+
out[1] = previousColor.g / 255 + (current.color.g / 255 - previousColor.g / 255) * ratio;
|
|
50
|
+
out[2] = previousColor.b / 255 + (current.color.b / 255 - previousColor.b / 255) * ratio;
|
|
51
|
+
out[3] = previousColor.a + (current.color.a - previousColor.a) * ratio;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
previousOffset = current.offset;
|
|
55
|
+
previousColor = current.color;
|
|
56
|
+
}
|
|
57
|
+
out[0] = previousColor.r / 255;
|
|
58
|
+
out[1] = previousColor.g / 255;
|
|
59
|
+
out[2] = previousColor.b / 255;
|
|
60
|
+
out[3] = previousColor.a;
|
|
61
|
+
}
|
|
62
|
+
_toRgba8Texture(width, height, options) {
|
|
63
|
+
const texture = new DataTexture({
|
|
64
|
+
width,
|
|
65
|
+
height,
|
|
66
|
+
format: 'rgba8',
|
|
67
|
+
samplerOptions: options.samplerOptions,
|
|
68
|
+
});
|
|
69
|
+
const buffer = texture.buffer;
|
|
70
|
+
let offset = 0;
|
|
71
|
+
for (let y = 0; y < height; y++) {
|
|
72
|
+
const v = height === 1 ? 0 : y / (height - 1);
|
|
73
|
+
for (let x = 0; x < width; x++) {
|
|
74
|
+
const u = width === 1 ? 0 : x / (width - 1);
|
|
75
|
+
this.sampleAt(this.resolveT(u, v), this._sample);
|
|
76
|
+
buffer[offset] = toUnorm8(this._sample[0]);
|
|
77
|
+
buffer[offset + 1] = toUnorm8(this._sample[1]);
|
|
78
|
+
buffer[offset + 2] = toUnorm8(this._sample[2]);
|
|
79
|
+
buffer[offset + 3] = toUnorm8(this._sample[3]);
|
|
80
|
+
offset += 4;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
texture.commit();
|
|
84
|
+
return texture;
|
|
85
|
+
}
|
|
86
|
+
_toRgba32fTexture(width, height, options) {
|
|
87
|
+
const texture = new DataTexture({
|
|
88
|
+
width,
|
|
89
|
+
height,
|
|
90
|
+
format: 'rgba32f',
|
|
91
|
+
samplerOptions: options.samplerOptions,
|
|
92
|
+
});
|
|
93
|
+
const buffer = texture.buffer;
|
|
94
|
+
let offset = 0;
|
|
95
|
+
for (let y = 0; y < height; y++) {
|
|
96
|
+
const v = height === 1 ? 0 : y / (height - 1);
|
|
97
|
+
for (let x = 0; x < width; x++) {
|
|
98
|
+
const u = width === 1 ? 0 : x / (width - 1);
|
|
99
|
+
this.sampleAt(this.resolveT(u, v), this._sample);
|
|
100
|
+
buffer[offset] = this._sample[0];
|
|
101
|
+
buffer[offset + 1] = this._sample[1];
|
|
102
|
+
buffer[offset + 2] = this._sample[2];
|
|
103
|
+
buffer[offset + 3] = this._sample[3];
|
|
104
|
+
offset += 4;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
texture.commit();
|
|
108
|
+
return texture;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const toUnorm8 = (value) => (clamp(value, 0, 1) * 255 + 0.5) | 0;
|
|
112
|
+
|
|
113
|
+
export { Gradient };
|
|
114
|
+
//# sourceMappingURL=Gradient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gradient.js","sources":["../../../../../src/rendering/gradient/Gradient.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Gradient, type GradientStop } from './Gradient';
|
|
2
|
+
/**
|
|
3
|
+
* Linear gradient in UV space projected from `start` to `end`.
|
|
4
|
+
*/
|
|
5
|
+
export declare class LinearGradient extends Gradient {
|
|
6
|
+
private readonly _start;
|
|
7
|
+
private readonly _end;
|
|
8
|
+
constructor(stops: readonly GradientStop[], start?: readonly [number, number], end?: readonly [number, number]);
|
|
9
|
+
protected resolveT(u: number, v: number): number;
|
|
10
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Gradient } from './Gradient.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Linear gradient in UV space projected from `start` to `end`.
|
|
5
|
+
*/
|
|
6
|
+
class LinearGradient extends Gradient {
|
|
7
|
+
_start;
|
|
8
|
+
_end;
|
|
9
|
+
constructor(stops, start = [0, 0], end = [1, 0]) {
|
|
10
|
+
super(stops);
|
|
11
|
+
this._start = [start[0], start[1]];
|
|
12
|
+
this._end = [end[0], end[1]];
|
|
13
|
+
}
|
|
14
|
+
resolveT(u, v) {
|
|
15
|
+
const axisX = this._end[0] - this._start[0];
|
|
16
|
+
const axisY = this._end[1] - this._start[1];
|
|
17
|
+
const lengthSquared = axisX * axisX + axisY * axisY;
|
|
18
|
+
if (lengthSquared <= 0.000001) {
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
return ((u - this._start[0]) * axisX + (v - this._start[1]) * axisY) / lengthSquared;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { LinearGradient };
|
|
26
|
+
//# sourceMappingURL=LinearGradient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinearGradient.js","sources":["../../../../../src/rendering/gradient/LinearGradient.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;AAEG;AACG,MAAO,cAAe,SAAQ,QAAQ,CAAA;AACzB,IAAA,MAAM;AACN,IAAA,IAAI;AAErB,IAAA,WAAA,CAAmB,KAA8B,EAAE,KAAA,GAAmC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAA,GAAiC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAA;QACnI,KAAK,CAAC,KAAK,CAAC;AAEZ,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B;IAEmB,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAA;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;AAEnD,QAAA,IAAI,aAAa,IAAI,QAAQ,EAAE;AAC7B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,aAAa;IACtF;AACD;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Gradient, type GradientStop } from './Gradient';
|
|
2
|
+
/**
|
|
3
|
+
* Radial gradient in UV space around `center` with normalized radius.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RadialGradient extends Gradient {
|
|
6
|
+
private readonly _center;
|
|
7
|
+
private readonly _radius;
|
|
8
|
+
constructor(stops: readonly GradientStop[], center?: readonly [number, number], radius?: number);
|
|
9
|
+
protected resolveT(u: number, v: number): number;
|
|
10
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Gradient } from './Gradient.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Radial gradient in UV space around `center` with normalized radius.
|
|
5
|
+
*/
|
|
6
|
+
class RadialGradient extends Gradient {
|
|
7
|
+
_center;
|
|
8
|
+
_radius;
|
|
9
|
+
constructor(stops, center = [0.5, 0.5], radius = 0.5) {
|
|
10
|
+
super(stops);
|
|
11
|
+
this._center = [center[0], center[1]];
|
|
12
|
+
this._radius = Math.max(0, radius);
|
|
13
|
+
}
|
|
14
|
+
resolveT(u, v) {
|
|
15
|
+
if (this._radius <= 0.000001) {
|
|
16
|
+
return 1;
|
|
17
|
+
}
|
|
18
|
+
const dx = u - this._center[0];
|
|
19
|
+
const dy = v - this._center[1];
|
|
20
|
+
return Math.sqrt(dx * dx + dy * dy) / this._radius;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { RadialGradient };
|
|
25
|
+
//# sourceMappingURL=RadialGradient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadialGradient.js","sources":["../../../../../src/rendering/gradient/RadialGradient.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;AAEG;AACG,MAAO,cAAe,SAAQ,QAAQ,CAAA;AACzB,IAAA,OAAO;AACP,IAAA,OAAO;IAExB,WAAA,CAAmB,KAA8B,EAAE,MAAA,GAAoC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,EAAA;QAC7G,KAAK,CAAC,KAAK,CAAC;AAEZ,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC;IAEmB,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;AAC5B,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAE9B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO;IACpD;AACD;;;;"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { CallbackRenderPass } from './CallbackRenderPass';
|
|
2
|
+
export type { CameraOptions } from './Camera';
|
|
3
|
+
export { Camera } from './Camera';
|
|
2
4
|
export { Container } from './Container';
|
|
3
5
|
export { Drawable } from './Drawable';
|
|
4
6
|
export type { BlurFilterOptions } from './filters/BlurFilter';
|
|
@@ -11,15 +13,27 @@ export type { ShaderFilterUniformValue, WebGl2ShaderFilterOptions } from './filt
|
|
|
11
13
|
export { WebGl2ShaderFilter } from './filters/WebGl2ShaderFilter';
|
|
12
14
|
export type { WebGpuShaderFilterOptions } from './filters/WebGpuShaderFilter';
|
|
13
15
|
export { WebGpuShaderFilter } from './filters/WebGpuShaderFilter';
|
|
16
|
+
export { Geometry } from './geometry/Geometry';
|
|
17
|
+
export type { AttributeType, GeometryAttribute, GeometryOptions, GeometryUsage, Topology } from './geometry/GeometryAttribute';
|
|
18
|
+
export type { GradientStop, GradientToTextureOptions } from './gradient/Gradient';
|
|
19
|
+
export { Gradient } from './gradient/Gradient';
|
|
20
|
+
export { LinearGradient } from './gradient/LinearGradient';
|
|
21
|
+
export { RadialGradient } from './gradient/RadialGradient';
|
|
22
|
+
export type { MaterialOptions, UniformValue } from './material/Material';
|
|
23
|
+
export { Material } from './material/Material';
|
|
24
|
+
export { MeshMaterial } from './material/MeshMaterial';
|
|
25
|
+
export type { ShaderSourceOptions } from './material/ShaderSource';
|
|
26
|
+
export { ShaderSource } from './material/ShaderSource';
|
|
27
|
+
export { SpriteMaterial } from './material/SpriteMaterial';
|
|
14
28
|
export type { MeshOptions } from './mesh/Mesh';
|
|
15
29
|
export { Mesh } from './mesh/Mesh';
|
|
16
|
-
export type { MeshShaderOptions, MeshShaderUniformValue } from './mesh/MeshShader';
|
|
17
|
-
export { MeshShader } from './mesh/MeshShader';
|
|
18
30
|
export { Graphics } from './primitives/Graphics';
|
|
19
31
|
export type { RenderBackend } from './RenderBackend';
|
|
20
32
|
export { RenderBackendType } from './RenderBackendType';
|
|
21
33
|
export type { DrawableConstructor, Renderer } from './Renderer';
|
|
22
34
|
export { RendererRegistry } from './RendererRegistry';
|
|
35
|
+
export type { RenderOptions, RenderToOptions } from './RenderingContext';
|
|
36
|
+
export { RenderingContext } from './RenderingContext';
|
|
23
37
|
export type { MaskSource } from './RenderNode';
|
|
24
38
|
export { RenderNode } from './RenderNode';
|
|
25
39
|
export type { RenderPass } from './RenderPass';
|