@daidr/minecraft-skin-renderer 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/README.md +247 -0
- package/dist/animation/AnimationController.d.mts +15 -0
- package/dist/animation/AnimationController.d.mts.map +1 -0
- package/dist/animation/AnimationController.mjs +146 -0
- package/dist/animation/AnimationController.mjs.map +1 -0
- package/dist/animation/easing.mjs +9 -0
- package/dist/animation/easing.mjs.map +1 -0
- package/dist/animation/presets/fly.mjs +176 -0
- package/dist/animation/presets/fly.mjs.map +1 -0
- package/dist/animation/presets/idle.mjs +114 -0
- package/dist/animation/presets/idle.mjs.map +1 -0
- package/dist/animation/presets/index.mjs +7 -0
- package/dist/animation/presets/run.mjs +126 -0
- package/dist/animation/presets/run.mjs.map +1 -0
- package/dist/animation/presets/utils.mjs +166 -0
- package/dist/animation/presets/utils.mjs.map +1 -0
- package/dist/animation/presets/walk.mjs +76 -0
- package/dist/animation/presets/walk.mjs.map +1 -0
- package/dist/animation/types.d.mts +50 -0
- package/dist/animation/types.d.mts.map +1 -0
- package/dist/animation/types.mjs +22 -0
- package/dist/animation/types.mjs.map +1 -0
- package/dist/core/camera/Camera.d.mts +33 -0
- package/dist/core/camera/Camera.d.mts.map +1 -0
- package/dist/core/camera/Camera.mjs +77 -0
- package/dist/core/camera/Camera.mjs.map +1 -0
- package/dist/core/camera/OrbitControls.d.mts +50 -0
- package/dist/core/camera/OrbitControls.d.mts.map +1 -0
- package/dist/core/camera/OrbitControls.mjs +170 -0
- package/dist/core/camera/OrbitControls.mjs.map +1 -0
- package/dist/core/math/index.mjs +6 -0
- package/dist/core/math/mat4.d.mts +61 -0
- package/dist/core/math/mat4.d.mts.map +1 -0
- package/dist/core/math/mat4.mjs +513 -0
- package/dist/core/math/mat4.mjs.map +1 -0
- package/dist/core/math/quat.d.mts +61 -0
- package/dist/core/math/quat.d.mts.map +1 -0
- package/dist/core/math/quat.mjs +360 -0
- package/dist/core/math/quat.mjs.map +1 -0
- package/dist/core/math/utils.d.mts +43 -0
- package/dist/core/math/utils.d.mts.map +1 -0
- package/dist/core/math/utils.mjs +85 -0
- package/dist/core/math/utils.mjs.map +1 -0
- package/dist/core/math/vec3.d.mts +61 -0
- package/dist/core/math/vec3.d.mts.map +1 -0
- package/dist/core/math/vec3.mjs +198 -0
- package/dist/core/math/vec3.mjs.map +1 -0
- package/dist/core/plugins/registry.mjs +29 -0
- package/dist/core/plugins/registry.mjs.map +1 -0
- package/dist/core/plugins/types.d.mts +34 -0
- package/dist/core/plugins/types.d.mts.map +1 -0
- package/dist/core/renderer/registry.d.mts +46 -0
- package/dist/core/renderer/registry.d.mts.map +1 -0
- package/dist/core/renderer/registry.mjs +46 -0
- package/dist/core/renderer/registry.mjs.map +1 -0
- package/dist/core/renderer/shader-composer.mjs +30 -0
- package/dist/core/renderer/shader-composer.mjs.map +1 -0
- package/dist/core/renderer/types.d.mts +172 -0
- package/dist/core/renderer/types.d.mts.map +1 -0
- package/dist/core/renderer/types.mjs +90 -0
- package/dist/core/renderer/types.mjs.map +1 -0
- package/dist/core/renderer/utils.mjs +20 -0
- package/dist/core/renderer/utils.mjs.map +1 -0
- package/dist/core/renderer/webgl/WebGLBuffer.mjs +57 -0
- package/dist/core/renderer/webgl/WebGLBuffer.mjs.map +1 -0
- package/dist/core/renderer/webgl/WebGLPipeline.mjs +259 -0
- package/dist/core/renderer/webgl/WebGLPipeline.mjs.map +1 -0
- package/dist/core/renderer/webgl/WebGLRenderer.mjs +140 -0
- package/dist/core/renderer/webgl/WebGLRenderer.mjs.map +1 -0
- package/dist/core/renderer/webgl/WebGLTexture.mjs +87 -0
- package/dist/core/renderer/webgl/WebGLTexture.mjs.map +1 -0
- package/dist/core/renderer/webgl/plugin.d.mts +8 -0
- package/dist/core/renderer/webgl/plugin.d.mts.map +1 -0
- package/dist/core/renderer/webgl/plugin.mjs +24 -0
- package/dist/core/renderer/webgl/plugin.mjs.map +1 -0
- package/dist/core/renderer/webgl/shaders/index.mjs +81 -0
- package/dist/core/renderer/webgl/shaders/index.mjs.map +1 -0
- package/dist/core/renderer/webgpu/WebGPUBuffer.mjs +52 -0
- package/dist/core/renderer/webgpu/WebGPUBuffer.mjs.map +1 -0
- package/dist/core/renderer/webgpu/WebGPUPipeline.mjs +167 -0
- package/dist/core/renderer/webgpu/WebGPUPipeline.mjs.map +1 -0
- package/dist/core/renderer/webgpu/WebGPURenderer.mjs +299 -0
- package/dist/core/renderer/webgpu/WebGPURenderer.mjs.map +1 -0
- package/dist/core/renderer/webgpu/WebGPUTexture.mjs +126 -0
- package/dist/core/renderer/webgpu/WebGPUTexture.mjs.map +1 -0
- package/dist/core/renderer/webgpu/plugin.d.mts +8 -0
- package/dist/core/renderer/webgpu/plugin.d.mts.map +1 -0
- package/dist/core/renderer/webgpu/plugin.mjs +35 -0
- package/dist/core/renderer/webgpu/plugin.mjs.map +1 -0
- package/dist/core/renderer/webgpu/shaders/index.mjs +84 -0
- package/dist/core/renderer/webgpu/shaders/index.mjs.map +1 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +19 -0
- package/dist/model/PlayerModel.d.mts +8 -0
- package/dist/model/PlayerModel.d.mts.map +1 -0
- package/dist/model/PlayerModel.mjs +253 -0
- package/dist/model/PlayerModel.mjs.map +1 -0
- package/dist/model/bone-utils.mjs +3 -0
- package/dist/model/constants.mjs +20 -0
- package/dist/model/constants.mjs.map +1 -0
- package/dist/model/geometry/BoxGeometry.mjs +316 -0
- package/dist/model/geometry/BoxGeometry.mjs.map +1 -0
- package/dist/model/geometry/index.mjs +3 -0
- package/dist/model/index.mjs +10 -0
- package/dist/model/types.d.mts +64 -0
- package/dist/model/types.d.mts.map +1 -0
- package/dist/model/types.mjs +67 -0
- package/dist/model/types.mjs.map +1 -0
- package/dist/model/uv/CapeUV.mjs +25 -0
- package/dist/model/uv/CapeUV.mjs.map +1 -0
- package/dist/model/uv/SkinUV.mjs +104 -0
- package/dist/model/uv/SkinUV.mjs.map +1 -0
- package/dist/model/uv/common.mjs +147 -0
- package/dist/model/uv/common.mjs.map +1 -0
- package/dist/panorama.d.mts +2 -0
- package/dist/panorama.mjs +3 -0
- package/dist/plugins/panorama/PanoramaRenderer.mjs +94 -0
- package/dist/plugins/panorama/PanoramaRenderer.mjs.map +1 -0
- package/dist/plugins/panorama/SkyboxGeometry.mjs +132 -0
- package/dist/plugins/panorama/SkyboxGeometry.mjs.map +1 -0
- package/dist/plugins/panorama/plugin.d.mts +8 -0
- package/dist/plugins/panorama/plugin.d.mts.map +1 -0
- package/dist/plugins/panorama/plugin.mjs +13 -0
- package/dist/plugins/panorama/plugin.mjs.map +1 -0
- package/dist/plugins/panorama/shaders/webgl.mjs +59 -0
- package/dist/plugins/panorama/shaders/webgl.mjs.map +1 -0
- package/dist/plugins/panorama/shaders/webgpu.mjs +70 -0
- package/dist/plugins/panorama/shaders/webgpu.mjs.map +1 -0
- package/dist/texture/TextureLoader.d.mts +22 -0
- package/dist/texture/TextureLoader.d.mts.map +1 -0
- package/dist/texture/TextureLoader.mjs +114 -0
- package/dist/texture/TextureLoader.mjs.map +1 -0
- package/dist/viewer/BoneMatrixComputer.mjs +82 -0
- package/dist/viewer/BoneMatrixComputer.mjs.map +1 -0
- package/dist/viewer/RenderLoop.mjs +45 -0
- package/dist/viewer/RenderLoop.mjs.map +1 -0
- package/dist/viewer/RenderState.mjs +44 -0
- package/dist/viewer/RenderState.mjs.map +1 -0
- package/dist/viewer/ResourceManager.mjs +278 -0
- package/dist/viewer/ResourceManager.mjs.map +1 -0
- package/dist/viewer/SkinViewer.d.mts +98 -0
- package/dist/viewer/SkinViewer.d.mts.map +1 -0
- package/dist/viewer/SkinViewer.mjs +379 -0
- package/dist/viewer/SkinViewer.mjs.map +1 -0
- package/dist/viewer/index.mjs +7 -0
- package/dist/webgl.d.mts +2 -0
- package/dist/webgl.mjs +3 -0
- package/dist/webgpu.d.mts +2 -0
- package/dist/webgpu.mjs +3 -0
- package/package.json +75 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
//#region src/core/math/vec3.ts
|
|
2
|
+
/** Create a zero vector */
|
|
3
|
+
function vec3Zero() {
|
|
4
|
+
return [
|
|
5
|
+
0,
|
|
6
|
+
0,
|
|
7
|
+
0
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
/** Create a vector from components */
|
|
11
|
+
function vec3(x, y, z) {
|
|
12
|
+
return [
|
|
13
|
+
x,
|
|
14
|
+
y,
|
|
15
|
+
z
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
/** Clone a vector */
|
|
19
|
+
function vec3Clone(v) {
|
|
20
|
+
return [
|
|
21
|
+
v[0],
|
|
22
|
+
v[1],
|
|
23
|
+
v[2]
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
/** Add two vectors */
|
|
27
|
+
function vec3Add(a, b) {
|
|
28
|
+
return [
|
|
29
|
+
a[0] + b[0],
|
|
30
|
+
a[1] + b[1],
|
|
31
|
+
a[2] + b[2]
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
/** Subtract two vectors */
|
|
35
|
+
function vec3Sub(a, b) {
|
|
36
|
+
return [
|
|
37
|
+
a[0] - b[0],
|
|
38
|
+
a[1] - b[1],
|
|
39
|
+
a[2] - b[2]
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
/** Multiply vector by scalar */
|
|
43
|
+
function vec3Scale(v, s) {
|
|
44
|
+
return [
|
|
45
|
+
v[0] * s,
|
|
46
|
+
v[1] * s,
|
|
47
|
+
v[2] * s
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
/** Multiply two vectors component-wise */
|
|
51
|
+
function vec3Mul(a, b) {
|
|
52
|
+
return [
|
|
53
|
+
a[0] * b[0],
|
|
54
|
+
a[1] * b[1],
|
|
55
|
+
a[2] * b[2]
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
/** Dot product of two vectors */
|
|
59
|
+
function vec3Dot(a, b) {
|
|
60
|
+
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
61
|
+
}
|
|
62
|
+
/** Cross product of two vectors */
|
|
63
|
+
function vec3Cross(a, b) {
|
|
64
|
+
return [
|
|
65
|
+
a[1] * b[2] - a[2] * b[1],
|
|
66
|
+
a[2] * b[0] - a[0] * b[2],
|
|
67
|
+
a[0] * b[1] - a[1] * b[0]
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
/** Length (magnitude) of a vector */
|
|
71
|
+
function vec3Length(v) {
|
|
72
|
+
return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
|
|
73
|
+
}
|
|
74
|
+
/** Squared length of a vector (avoids sqrt) */
|
|
75
|
+
function vec3LengthSq(v) {
|
|
76
|
+
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
|
|
77
|
+
}
|
|
78
|
+
/** Normalize a vector */
|
|
79
|
+
function vec3Normalize(v) {
|
|
80
|
+
const len = vec3Length(v);
|
|
81
|
+
if (len === 0) return [
|
|
82
|
+
0,
|
|
83
|
+
0,
|
|
84
|
+
0
|
|
85
|
+
];
|
|
86
|
+
return [
|
|
87
|
+
v[0] / len,
|
|
88
|
+
v[1] / len,
|
|
89
|
+
v[2] / len
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
/** Negate a vector */
|
|
93
|
+
function vec3Negate(v) {
|
|
94
|
+
return [
|
|
95
|
+
-v[0],
|
|
96
|
+
-v[1],
|
|
97
|
+
-v[2]
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
/** Linear interpolation between two vectors */
|
|
101
|
+
function vec3Lerp(a, b, t) {
|
|
102
|
+
return [
|
|
103
|
+
a[0] + (b[0] - a[0]) * t,
|
|
104
|
+
a[1] + (b[1] - a[1]) * t,
|
|
105
|
+
a[2] + (b[2] - a[2]) * t
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
/** Distance between two vectors */
|
|
109
|
+
function vec3Distance(a, b) {
|
|
110
|
+
return vec3Length(vec3Sub(a, b));
|
|
111
|
+
}
|
|
112
|
+
/** Check if two vectors are equal (within epsilon) */
|
|
113
|
+
function vec3Equals(a, b, epsilon = 1e-6) {
|
|
114
|
+
return Math.abs(a[0] - b[0]) < epsilon && Math.abs(a[1] - b[1]) < epsilon && Math.abs(a[2] - b[2]) < epsilon;
|
|
115
|
+
}
|
|
116
|
+
/** Transform a vec3 by a 4x4 matrix (assumes w=1) */
|
|
117
|
+
function vec3TransformMat4(v, m) {
|
|
118
|
+
const x = v[0];
|
|
119
|
+
const y = v[1];
|
|
120
|
+
const z = v[2];
|
|
121
|
+
const w = m[3] * x + m[7] * y + m[11] * z + m[15];
|
|
122
|
+
return [
|
|
123
|
+
(m[0] * x + m[4] * y + m[8] * z + m[12]) / w,
|
|
124
|
+
(m[1] * x + m[5] * y + m[9] * z + m[13]) / w,
|
|
125
|
+
(m[2] * x + m[6] * y + m[10] * z + m[14]) / w
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
/** Convert Vec3 to Float32Array */
|
|
129
|
+
function vec3ToFloat32Array(v) {
|
|
130
|
+
return new Float32Array(v);
|
|
131
|
+
}
|
|
132
|
+
/** Add two vectors (mutable) */
|
|
133
|
+
function vec3AddMut(out, a, b) {
|
|
134
|
+
out[0] = a[0] + b[0];
|
|
135
|
+
out[1] = a[1] + b[1];
|
|
136
|
+
out[2] = a[2] + b[2];
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
/** Subtract two vectors (mutable) */
|
|
140
|
+
function vec3SubMut(out, a, b) {
|
|
141
|
+
out[0] = a[0] - b[0];
|
|
142
|
+
out[1] = a[1] - b[1];
|
|
143
|
+
out[2] = a[2] - b[2];
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
/** Multiply vector by scalar (mutable) */
|
|
147
|
+
function vec3ScaleMut(out, v, s) {
|
|
148
|
+
out[0] = v[0] * s;
|
|
149
|
+
out[1] = v[1] * s;
|
|
150
|
+
out[2] = v[2] * s;
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
/** Linear interpolation between two vectors (mutable) */
|
|
154
|
+
function vec3LerpMut(out, a, b, t) {
|
|
155
|
+
out[0] = a[0] + (b[0] - a[0]) * t;
|
|
156
|
+
out[1] = a[1] + (b[1] - a[1]) * t;
|
|
157
|
+
out[2] = a[2] + (b[2] - a[2]) * t;
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/** Normalize a vector (mutable) */
|
|
161
|
+
function vec3NormalizeMut(out, v) {
|
|
162
|
+
const len = vec3Length(v);
|
|
163
|
+
if (len === 0) {
|
|
164
|
+
out[0] = 0;
|
|
165
|
+
out[1] = 0;
|
|
166
|
+
out[2] = 0;
|
|
167
|
+
} else {
|
|
168
|
+
out[0] = v[0] / len;
|
|
169
|
+
out[1] = v[1] / len;
|
|
170
|
+
out[2] = v[2] / len;
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
174
|
+
/** Cross product of two vectors (mutable) */
|
|
175
|
+
function vec3CrossMut(out, a, b) {
|
|
176
|
+
out[0] = a[1] * b[2] - a[2] * b[1];
|
|
177
|
+
out[1] = a[2] * b[0] - a[0] * b[2];
|
|
178
|
+
out[2] = a[0] * b[1] - a[1] * b[0];
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/** Copy vector (mutable) */
|
|
182
|
+
function vec3CopyMut(out, v) {
|
|
183
|
+
out[0] = v[0];
|
|
184
|
+
out[1] = v[1];
|
|
185
|
+
out[2] = v[2];
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
188
|
+
/** Set vector to zero (mutable) */
|
|
189
|
+
function vec3ZeroMut(out) {
|
|
190
|
+
out[0] = 0;
|
|
191
|
+
out[1] = 0;
|
|
192
|
+
out[2] = 0;
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
//#endregion
|
|
197
|
+
export { vec3, vec3Add, vec3AddMut, vec3Clone, vec3CopyMut, vec3Cross, vec3CrossMut, vec3Distance, vec3Dot, vec3Equals, vec3Length, vec3LengthSq, vec3Lerp, vec3LerpMut, vec3Mul, vec3Negate, vec3Normalize, vec3NormalizeMut, vec3Scale, vec3ScaleMut, vec3Sub, vec3SubMut, vec3ToFloat32Array, vec3TransformMat4, vec3Zero, vec3ZeroMut };
|
|
198
|
+
//# sourceMappingURL=vec3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vec3.mjs","names":[],"sources":["../../../src/core/math/vec3.ts"],"sourcesContent":["/**\n * 3D Vector operations\n * All functions are immutable and return new arrays\n */\n\nexport type Vec3 = [number, number, number];\n\n/** Create a zero vector */\nexport function vec3Zero(): Vec3 {\n return [0, 0, 0];\n}\n\n/** Create a vector from components */\nexport function vec3(x: number, y: number, z: number): Vec3 {\n return [x, y, z];\n}\n\n/** Clone a vector */\nexport function vec3Clone(v: Vec3): Vec3 {\n return [v[0], v[1], v[2]];\n}\n\n/** Add two vectors */\nexport function vec3Add(a: Vec3, b: Vec3): Vec3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\n/** Subtract two vectors */\nexport function vec3Sub(a: Vec3, b: Vec3): Vec3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\n/** Multiply vector by scalar */\nexport function vec3Scale(v: Vec3, s: number): Vec3 {\n return [v[0] * s, v[1] * s, v[2] * s];\n}\n\n/** Multiply two vectors component-wise */\nexport function vec3Mul(a: Vec3, b: Vec3): Vec3 {\n return [a[0] * b[0], a[1] * b[1], a[2] * b[2]];\n}\n\n/** Dot product of two vectors */\nexport function vec3Dot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/** Cross product of two vectors */\nexport function vec3Cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n/** Length (magnitude) of a vector */\nexport function vec3Length(v: Vec3): number {\n return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n}\n\n/** Squared length of a vector (avoids sqrt) */\nexport function vec3LengthSq(v: Vec3): number {\n return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n}\n\n/** Normalize a vector */\nexport function vec3Normalize(v: Vec3): Vec3 {\n const len = vec3Length(v);\n if (len === 0) return [0, 0, 0];\n return [v[0] / len, v[1] / len, v[2] / len];\n}\n\n/** Negate a vector */\nexport function vec3Negate(v: Vec3): Vec3 {\n return [-v[0], -v[1], -v[2]];\n}\n\n/** Linear interpolation between two vectors */\nexport function vec3Lerp(a: Vec3, b: Vec3, t: number): Vec3 {\n return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];\n}\n\n/** Distance between two vectors */\nexport function vec3Distance(a: Vec3, b: Vec3): number {\n return vec3Length(vec3Sub(a, b));\n}\n\n/** Check if two vectors are equal (within epsilon) */\nexport function vec3Equals(a: Vec3, b: Vec3, epsilon = 0.000_001): boolean {\n return (\n Math.abs(a[0] - b[0]) < epsilon &&\n Math.abs(a[1] - b[1]) < epsilon &&\n Math.abs(a[2] - b[2]) < epsilon\n );\n}\n\n/** Transform a vec3 by a 4x4 matrix (assumes w=1) */\nexport function vec3TransformMat4(v: Vec3, m: Float32Array): Vec3 {\n const x = v[0];\n const y = v[1];\n const z = v[2];\n const w = m[3] * x + m[7] * y + m[11] * z + m[15];\n return [\n (m[0] * x + m[4] * y + m[8] * z + m[12]) / w,\n (m[1] * x + m[5] * y + m[9] * z + m[13]) / w,\n (m[2] * x + m[6] * y + m[10] * z + m[14]) / w,\n ];\n}\n\n/** Convert Vec3 to Float32Array */\nexport function vec3ToFloat32Array(v: Vec3): Float32Array {\n return new Float32Array(v);\n}\n\n// ============================================================================\n// Mutable versions (for performance-critical paths)\n// These functions modify the output parameter instead of creating new objects\n// ============================================================================\n\n/** Add two vectors (mutable) */\nexport function vec3AddMut(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/** Subtract two vectors (mutable) */\nexport function vec3SubMut(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/** Multiply vector by scalar (mutable) */\nexport function vec3ScaleMut(out: Vec3, v: Vec3, s: number): Vec3 {\n out[0] = v[0] * s;\n out[1] = v[1] * s;\n out[2] = v[2] * s;\n return out;\n}\n\n/** Linear interpolation between two vectors (mutable) */\nexport function vec3LerpMut(out: Vec3, a: Vec3, b: Vec3, t: number): Vec3 {\n out[0] = a[0] + (b[0] - a[0]) * t;\n out[1] = a[1] + (b[1] - a[1]) * t;\n out[2] = a[2] + (b[2] - a[2]) * t;\n return out;\n}\n\n/** Normalize a vector (mutable) */\nexport function vec3NormalizeMut(out: Vec3, v: Vec3): Vec3 {\n const len = vec3Length(v);\n if (len === 0) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n } else {\n out[0] = v[0] / len;\n out[1] = v[1] / len;\n out[2] = v[2] / len;\n }\n return out;\n}\n\n/** Cross product of two vectors (mutable) */\nexport function vec3CrossMut(out: Vec3, a: Vec3, b: Vec3): Vec3 {\n out[0] = a[1] * b[2] - a[2] * b[1];\n out[1] = a[2] * b[0] - a[0] * b[2];\n out[2] = a[0] * b[1] - a[1] * b[0];\n return out;\n}\n\n/** Copy vector (mutable) */\nexport function vec3CopyMut(out: Vec3, v: Vec3): Vec3 {\n out[0] = v[0];\n out[1] = v[1];\n out[2] = v[2];\n return out;\n}\n\n/** Set vector to zero (mutable) */\nexport function vec3ZeroMut(out: Vec3): Vec3 {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n return out;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/core/plugins/registry.ts
|
|
2
|
+
/** Feature plugin registry state */
|
|
3
|
+
const featureRegistry = /* @__PURE__ */ new Map();
|
|
4
|
+
/**
|
|
5
|
+
* Register a feature plugin
|
|
6
|
+
* @internal Used by the main `use()` function
|
|
7
|
+
*/
|
|
8
|
+
function registerFeaturePlugin(plugin) {
|
|
9
|
+
featureRegistry.set(plugin.name, plugin);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get a registered feature plugin by name
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
function getFeaturePlugin(name) {
|
|
16
|
+
return featureRegistry.get(name);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the background plugin if registered
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
function getBackgroundPlugin(name) {
|
|
23
|
+
const plugin = getFeaturePlugin(name);
|
|
24
|
+
return plugin?.type === "background" ? plugin : void 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { getBackgroundPlugin, registerFeaturePlugin };
|
|
29
|
+
//# sourceMappingURL=registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.mjs","names":[],"sources":["../../../src/core/plugins/registry.ts"],"sourcesContent":["/**\n * Feature Plugin Registry\n *\n * Manages registration and retrieval of feature plugins (background).\n * This is separate from the renderer registry to maintain clean separation of concerns.\n *\n * @example\n * ```ts\n * import { use } from 'minecraft-skin-renderer'\n * import { PanoramaPlugin } from 'minecraft-skin-renderer/panorama'\n *\n * use(PanoramaPlugin)\n * ```\n */\n\nimport type { PluginType, FeaturePlugin, BackgroundPlugin } from \"./types\";\n\n/** Feature plugin registry state */\nconst featureRegistry: Map<string, FeaturePlugin> = new Map();\n\n/**\n * Register a feature plugin\n * @internal Used by the main `use()` function\n */\nexport function registerFeaturePlugin(plugin: FeaturePlugin): void {\n featureRegistry.set(plugin.name, plugin);\n}\n\n/**\n * Get a registered feature plugin by name\n * @internal\n */\nexport function getFeaturePlugin<T extends FeaturePlugin>(name: string): T | undefined {\n return featureRegistry.get(name) as T | undefined;\n}\n\n/**\n * Get all registered feature plugins of a specific type\n * @internal\n */\nexport function getFeaturePluginsByType<T extends FeaturePlugin>(type: PluginType): T[] {\n return Array.from(featureRegistry.values()).filter((p) => p.type === type) as T[];\n}\n\n/**\n * Get the background plugin if registered\n * @internal\n */\nexport function getBackgroundPlugin(name: string): BackgroundPlugin | undefined {\n const plugin = getFeaturePlugin<BackgroundPlugin>(name);\n return plugin?.type === \"background\" ? plugin : undefined;\n}\n\n/**\n * Check if a feature plugin is registered\n * @internal\n */\nexport function isFeaturePluginRegistered(name: string): boolean {\n return featureRegistry.has(name);\n}\n\n/**\n * Get all registered feature plugin names\n * @internal\n */\nexport function getRegisteredFeaturePlugins(): string[] {\n return Array.from(featureRegistry.keys());\n}\n"],"mappings":";;AAkBA,MAAM,kCAA8C,IAAI,KAAK;;;;;AAM7D,SAAgB,sBAAsB,QAA6B;AACjE,iBAAgB,IAAI,OAAO,MAAM,OAAO;;;;;;AAO1C,SAAgB,iBAA0C,MAA6B;AACrF,QAAO,gBAAgB,IAAI,KAAK;;;;;;AAelC,SAAgB,oBAAoB,MAA4C;CAC9E,MAAM,SAAS,iBAAmC,KAAK;AACvD,QAAO,QAAQ,SAAS,eAAe,SAAS"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { IRenderer } from "../renderer/types.mjs";
|
|
2
|
+
import { Camera } from "../camera/Camera.mjs";
|
|
3
|
+
import { TextureSource } from "../../texture/TextureLoader.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/core/plugins/types.d.ts
|
|
6
|
+
/** Plugin type identifiers */
|
|
7
|
+
type PluginType = "renderer" | "background";
|
|
8
|
+
/** Base plugin interface */
|
|
9
|
+
interface BasePlugin {
|
|
10
|
+
/** Plugin type identifier */
|
|
11
|
+
readonly type: PluginType;
|
|
12
|
+
/** Unique plugin name */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
}
|
|
15
|
+
/** Background renderer interface */
|
|
16
|
+
interface BackgroundRenderer {
|
|
17
|
+
/** Set background source (image/panorama URL or data) */
|
|
18
|
+
setSource(source: TextureSource): Promise<void>;
|
|
19
|
+
/** Render the background */
|
|
20
|
+
render(camera: Camera): void;
|
|
21
|
+
/** Clean up resources */
|
|
22
|
+
dispose(): void;
|
|
23
|
+
}
|
|
24
|
+
/** Background plugin interface */
|
|
25
|
+
interface BackgroundPlugin extends BasePlugin {
|
|
26
|
+
readonly type: "background";
|
|
27
|
+
/** Create a background renderer for the given renderer */
|
|
28
|
+
createRenderer(renderer: IRenderer): BackgroundRenderer;
|
|
29
|
+
}
|
|
30
|
+
/** Union type for all feature plugins (non-renderer) */
|
|
31
|
+
type FeaturePlugin = BackgroundPlugin;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { BackgroundPlugin, FeaturePlugin, PluginType };
|
|
34
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/core/plugins/types.ts"],"mappings":";;;;;;KAYY,UAAA;;UAGK,UAAA;EAEU;EAAA,SAAhB,IAAA,EAAM,UAAA;EAAA;EAAA,SAEN,IAAA;AAAA;;UAIM,kBAAA;EAAkB;EAEjC,SAAA,CAAU,MAAA,EAAQ,aAAA,GAAgB,OAAA;EAAhB;EAElB,MAAA,CAAO,MAAA,EAAQ,MAAA;EAAA;EAEf,OAAA;AAAA;;UAIe,gBAAA,SAAyB,UAAA;EAAA,SAC/B,IAAA;EATyB;EAWlC,cAAA,CAAe,QAAA,EAAU,SAAA,GAAY,kBAAA;AAAA;;KAI3B,aAAA,GAAgB,gBAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BackendType, IRenderer, RendererOptions } from "./types.mjs";
|
|
2
|
+
import { FeaturePlugin } from "../plugins/types.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/core/renderer/registry.d.ts
|
|
5
|
+
/** Renderer factory function type */
|
|
6
|
+
type RendererFactory = (options: RendererOptions) => IRenderer | Promise<IRenderer>;
|
|
7
|
+
/** Shader sources for a renderer backend */
|
|
8
|
+
interface ShaderSources {
|
|
9
|
+
vertex: string;
|
|
10
|
+
fragment: string;
|
|
11
|
+
}
|
|
12
|
+
/** Renderer plugin definition */
|
|
13
|
+
interface RendererPlugin {
|
|
14
|
+
/** Type identifier - always 'renderer' for renderer plugins */
|
|
15
|
+
readonly type?: "renderer";
|
|
16
|
+
/** Backend type identifier */
|
|
17
|
+
backend: BackendType;
|
|
18
|
+
/** Factory function to create the renderer */
|
|
19
|
+
createRenderer: RendererFactory;
|
|
20
|
+
/** Shader sources for this backend (static or dynamic via function) */
|
|
21
|
+
shaders: ShaderSources;
|
|
22
|
+
/**
|
|
23
|
+
* Get composed shaders with plugin chunks injected.
|
|
24
|
+
* If not provided, shaders are used as-is.
|
|
25
|
+
*/
|
|
26
|
+
getComposedShaders?(): ShaderSources;
|
|
27
|
+
}
|
|
28
|
+
/** Union type for all plugins that can be registered with use() */
|
|
29
|
+
type AnyRegistrablePlugin = RendererPlugin | FeaturePlugin;
|
|
30
|
+
/**
|
|
31
|
+
* Register a plugin (renderer or feature plugin)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { use } from 'minecraft-skin-renderer'
|
|
36
|
+
* import { WebGLRendererPlugin } from 'minecraft-skin-renderer/webgl'
|
|
37
|
+
* import { LightingPlugin } from 'minecraft-skin-renderer/lighting'
|
|
38
|
+
*
|
|
39
|
+
* use(WebGLRendererPlugin) // Register renderer
|
|
40
|
+
* use(LightingPlugin) // Register feature plugin
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function use(plugin: AnyRegistrablePlugin): void;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { RendererPlugin, ShaderSources, use };
|
|
46
|
+
//# sourceMappingURL=registry.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.mts","names":[],"sources":["../../../src/core/renderer/registry.ts"],"mappings":";;;;;KAsBY,eAAA,IAAmB,OAAA,EAAS,eAAA,KAAoB,SAAA,GAAY,OAAA,CAAQ,SAAA;AAGhF;AAAA,UAAiB,aAAA;EACf,MAAA;EACA,QAAA;AAAA;AAIF;AAAA,UAAiB,cAAA;;WAEN,IAAA;EAIO;EAFhB,OAAA,EAAS,WAAA;EASc;EAPvB,cAAA,EAAgB,eAAA;EAOoB;EALpC,OAAA,EAAS,aAAA;EAJT;;;;EASA,kBAAA,KAAuB,aAAA;AAAA;;KAIb,oBAAA,GAAuB,cAAA,GAAiB,aAAA;;;AAApD;;;;;AAyBA;;;;;;iBAAgB,GAAA,CAAI,MAAA,EAAQ,oBAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { registerFeaturePlugin } from "../plugins/registry.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/renderer/registry.ts
|
|
4
|
+
/** Registry state */
|
|
5
|
+
const registry = /* @__PURE__ */ new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Check if a plugin is a renderer plugin
|
|
8
|
+
*/
|
|
9
|
+
function isRendererPlugin(plugin) {
|
|
10
|
+
return "backend" in plugin && "createRenderer" in plugin;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Register a plugin (renderer or feature plugin)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { use } from 'minecraft-skin-renderer'
|
|
18
|
+
* import { WebGLRendererPlugin } from 'minecraft-skin-renderer/webgl'
|
|
19
|
+
* import { LightingPlugin } from 'minecraft-skin-renderer/lighting'
|
|
20
|
+
*
|
|
21
|
+
* use(WebGLRendererPlugin) // Register renderer
|
|
22
|
+
* use(LightingPlugin) // Register feature plugin
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function use(plugin) {
|
|
26
|
+
if (isRendererPlugin(plugin)) registry.set(plugin.backend, plugin);
|
|
27
|
+
else registerFeaturePlugin(plugin);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get a registered renderer plugin by backend type
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
function getRendererPlugin(backend) {
|
|
34
|
+
return registry.get(backend);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get all registered backend types
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
function getRegisteredBackends() {
|
|
41
|
+
return Array.from(registry.keys());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { getRegisteredBackends, getRendererPlugin, use };
|
|
46
|
+
//# sourceMappingURL=registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.mjs","names":[],"sources":["../../../src/core/renderer/registry.ts"],"sourcesContent":["/**\n * Renderer Registry\n *\n * Provides a registration system for renderers and feature plugins to enable tree shaking.\n * Users must explicitly import and register the plugins they want to use.\n *\n * @example\n * ```ts\n * import { use } from 'minecraft-skin-renderer'\n * import { WebGLRendererPlugin } from 'minecraft-skin-renderer/webgl'\n * import { LightingPlugin } from 'minecraft-skin-renderer/lighting'\n *\n * use(WebGLRendererPlugin)\n * use(LightingPlugin)\n * ```\n */\n\nimport type { BackendType, IRenderer, RendererOptions } from \"./types\";\nimport type { FeaturePlugin } from \"../plugins/types\";\nimport { registerFeaturePlugin } from \"../plugins/registry\";\n\n/** Renderer factory function type */\nexport type RendererFactory = (options: RendererOptions) => IRenderer | Promise<IRenderer>;\n\n/** Shader sources for a renderer backend */\nexport interface ShaderSources {\n vertex: string;\n fragment: string;\n}\n\n/** Renderer plugin definition */\nexport interface RendererPlugin {\n /** Type identifier - always 'renderer' for renderer plugins */\n readonly type?: \"renderer\";\n /** Backend type identifier */\n backend: BackendType;\n /** Factory function to create the renderer */\n createRenderer: RendererFactory;\n /** Shader sources for this backend (static or dynamic via function) */\n shaders: ShaderSources;\n /**\n * Get composed shaders with plugin chunks injected.\n * If not provided, shaders are used as-is.\n */\n getComposedShaders?(): ShaderSources;\n}\n\n/** Union type for all plugins that can be registered with use() */\nexport type AnyRegistrablePlugin = RendererPlugin | FeaturePlugin;\n\n/** Registry state */\nconst registry: Map<BackendType, RendererPlugin> = new Map();\n\n/**\n * Check if a plugin is a renderer plugin\n */\nfunction isRendererPlugin(plugin: AnyRegistrablePlugin): plugin is RendererPlugin {\n return \"backend\" in plugin && \"createRenderer\" in plugin;\n}\n\n/**\n * Register a plugin (renderer or feature plugin)\n *\n * @example\n * ```ts\n * import { use } from 'minecraft-skin-renderer'\n * import { WebGLRendererPlugin } from 'minecraft-skin-renderer/webgl'\n * import { LightingPlugin } from 'minecraft-skin-renderer/lighting'\n *\n * use(WebGLRendererPlugin) // Register renderer\n * use(LightingPlugin) // Register feature plugin\n * ```\n */\nexport function use(plugin: AnyRegistrablePlugin): void {\n if (isRendererPlugin(plugin)) {\n registry.set(plugin.backend, plugin);\n } else {\n registerFeaturePlugin(plugin);\n }\n}\n\n/**\n * Get a registered renderer plugin by backend type\n * @internal\n */\nexport function getRendererPlugin(backend: BackendType): RendererPlugin | undefined {\n return registry.get(backend);\n}\n\n/**\n * Get all registered backend types\n * @internal\n */\nexport function getRegisteredBackends(): BackendType[] {\n return Array.from(registry.keys());\n}\n\n/**\n * Check if a backend is registered\n * @internal\n */\nexport function isBackendRegistered(backend: BackendType): boolean {\n return registry.has(backend);\n}\n"],"mappings":";;;;AAmDA,MAAM,2BAA6C,IAAI,KAAK;;;;AAK5D,SAAS,iBAAiB,QAAwD;AAChF,QAAO,aAAa,UAAU,oBAAoB;;;;;;;;;;;;;;;AAgBpD,SAAgB,IAAI,QAAoC;AACtD,KAAI,iBAAiB,OAAO,CAC1B,UAAS,IAAI,OAAO,SAAS,OAAO;KAEpC,uBAAsB,OAAO;;;;;;AAQjC,SAAgB,kBAAkB,SAAkD;AAClF,QAAO,SAAS,IAAI,QAAQ;;;;;;AAO9B,SAAgB,wBAAuC;AACrD,QAAO,MAAM,KAAK,SAAS,MAAM,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/core/renderer/shader-composer.ts
|
|
2
|
+
/** Markers for shader injection points */
|
|
3
|
+
const MARKERS = {
|
|
4
|
+
VERTEX_DECLARATIONS: "// [PLUGIN_VERTEX_DECLARATIONS]",
|
|
5
|
+
VERTEX_MAIN: "// [PLUGIN_VERTEX_MAIN]",
|
|
6
|
+
FRAGMENT_DECLARATIONS: "// [PLUGIN_FRAGMENT_DECLARATIONS]",
|
|
7
|
+
FRAGMENT_OUTPUT: "// [PLUGIN_FRAGMENT_OUTPUT]"
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Compose vertex shader (cleans up markers)
|
|
11
|
+
*/
|
|
12
|
+
function composeVertexShader(baseShader, _backend) {
|
|
13
|
+
let shader = baseShader;
|
|
14
|
+
shader = shader.replace(MARKERS.VERTEX_DECLARATIONS, "");
|
|
15
|
+
shader = shader.replace(MARKERS.VERTEX_MAIN, "");
|
|
16
|
+
return shader;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Compose fragment shader (cleans up markers)
|
|
20
|
+
*/
|
|
21
|
+
function composeFragmentShader(baseShader, _backend) {
|
|
22
|
+
let shader = baseShader;
|
|
23
|
+
shader = shader.replace(MARKERS.FRAGMENT_DECLARATIONS, "");
|
|
24
|
+
shader = shader.replace(MARKERS.FRAGMENT_OUTPUT, "");
|
|
25
|
+
return shader;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { composeFragmentShader, composeVertexShader };
|
|
30
|
+
//# sourceMappingURL=shader-composer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader-composer.mjs","names":[],"sources":["../../../src/core/renderer/shader-composer.ts"],"sourcesContent":["/**\n * Shader Composer\n *\n * Cleans up shader marker placeholders.\n * This module can be extended in the future to support plugin-based shader injection.\n */\n\nimport type { BackendType } from \"./types\";\n\n/** Markers for shader injection points */\nconst MARKERS = {\n VERTEX_DECLARATIONS: \"// [PLUGIN_VERTEX_DECLARATIONS]\",\n VERTEX_MAIN: \"// [PLUGIN_VERTEX_MAIN]\",\n FRAGMENT_DECLARATIONS: \"// [PLUGIN_FRAGMENT_DECLARATIONS]\",\n FRAGMENT_OUTPUT: \"// [PLUGIN_FRAGMENT_OUTPUT]\",\n};\n\n/**\n * Compose vertex shader (cleans up markers)\n */\nexport function composeVertexShader(baseShader: string, _backend: BackendType): string {\n let shader = baseShader;\n\n // Clean up markers\n shader = shader.replace(MARKERS.VERTEX_DECLARATIONS, \"\");\n shader = shader.replace(MARKERS.VERTEX_MAIN, \"\");\n\n return shader;\n}\n\n/**\n * Compose fragment shader (cleans up markers)\n */\nexport function composeFragmentShader(baseShader: string, _backend: BackendType): string {\n let shader = baseShader;\n\n // Clean up markers\n shader = shader.replace(MARKERS.FRAGMENT_DECLARATIONS, \"\");\n shader = shader.replace(MARKERS.FRAGMENT_OUTPUT, \"\");\n\n return shader;\n}\n"],"mappings":";;AAUA,MAAM,UAAU;CACd,qBAAqB;CACrB,aAAa;CACb,uBAAuB;CACvB,iBAAiB;CAClB;;;;AAKD,SAAgB,oBAAoB,YAAoB,UAA+B;CACrF,IAAI,SAAS;AAGb,UAAS,OAAO,QAAQ,QAAQ,qBAAqB,GAAG;AACxD,UAAS,OAAO,QAAQ,QAAQ,aAAa,GAAG;AAEhD,QAAO;;;;;AAMT,SAAgB,sBAAsB,YAAoB,UAA+B;CACvF,IAAI,SAAS;AAGb,UAAS,OAAO,QAAQ,QAAQ,uBAAuB,GAAG;AAC1D,UAAS,OAAO,QAAQ,QAAQ,iBAAiB,GAAG;AAEpD,QAAO"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Mat4 } from "../math/mat4.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/renderer/types.d.ts
|
|
4
|
+
/** Supported rendering backends */
|
|
5
|
+
type BackendType = "webgpu" | "webgl";
|
|
6
|
+
/** Buffer usage hints */
|
|
7
|
+
declare enum BufferUsage {
|
|
8
|
+
Vertex = 1,
|
|
9
|
+
Index = 2,
|
|
10
|
+
Uniform = 4
|
|
11
|
+
}
|
|
12
|
+
/** Texture format */
|
|
13
|
+
declare enum TextureFormat {
|
|
14
|
+
RGBA8 = "rgba8unorm",
|
|
15
|
+
RGBA8_SRGB = "rgba8unorm-srgb"
|
|
16
|
+
}
|
|
17
|
+
/** Texture filtering mode */
|
|
18
|
+
declare enum TextureFilter {
|
|
19
|
+
Nearest = "nearest",
|
|
20
|
+
Linear = "linear"
|
|
21
|
+
}
|
|
22
|
+
/** Texture wrapping mode */
|
|
23
|
+
declare enum TextureWrap {
|
|
24
|
+
Repeat = "repeat",
|
|
25
|
+
ClampToEdge = "clamp-to-edge",
|
|
26
|
+
MirrorRepeat = "mirror-repeat"
|
|
27
|
+
}
|
|
28
|
+
/** Vertex attribute format */
|
|
29
|
+
declare enum VertexFormat {
|
|
30
|
+
Float32 = "float32",
|
|
31
|
+
Float32x2 = "float32x2",
|
|
32
|
+
Float32x3 = "float32x3",
|
|
33
|
+
Float32x4 = "float32x4",
|
|
34
|
+
Uint8x4 = "uint8x4",
|
|
35
|
+
Uint32 = "uint32"
|
|
36
|
+
}
|
|
37
|
+
/** Primitive topology */
|
|
38
|
+
declare enum PrimitiveTopology {
|
|
39
|
+
TriangleList = "triangle-list",
|
|
40
|
+
TriangleStrip = "triangle-strip",
|
|
41
|
+
LineList = "line-list",
|
|
42
|
+
LineStrip = "line-strip",
|
|
43
|
+
PointList = "point-list"
|
|
44
|
+
}
|
|
45
|
+
/** Cull mode */
|
|
46
|
+
declare enum CullMode {
|
|
47
|
+
None = "none",
|
|
48
|
+
Front = "front",
|
|
49
|
+
Back = "back"
|
|
50
|
+
}
|
|
51
|
+
/** Blend mode presets */
|
|
52
|
+
declare enum BlendMode {
|
|
53
|
+
None = "none",
|
|
54
|
+
Alpha = "alpha",
|
|
55
|
+
Additive = "additive",
|
|
56
|
+
Multiply = "multiply"
|
|
57
|
+
}
|
|
58
|
+
/** Depth compare function */
|
|
59
|
+
declare enum DepthCompare {
|
|
60
|
+
Never = "never",
|
|
61
|
+
Less = "less",
|
|
62
|
+
Equal = "equal",
|
|
63
|
+
LessEqual = "less-equal",
|
|
64
|
+
Greater = "greater",
|
|
65
|
+
NotEqual = "not-equal",
|
|
66
|
+
GreaterEqual = "greater-equal",
|
|
67
|
+
Always = "always"
|
|
68
|
+
}
|
|
69
|
+
/** Renderer configuration */
|
|
70
|
+
interface RendererOptions {
|
|
71
|
+
canvas: HTMLCanvasElement;
|
|
72
|
+
preferredBackend?: BackendType;
|
|
73
|
+
antialias?: boolean;
|
|
74
|
+
pixelRatio?: number;
|
|
75
|
+
preserveDrawingBuffer?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** Texture configuration */
|
|
78
|
+
interface TextureOptions {
|
|
79
|
+
format?: TextureFormat;
|
|
80
|
+
minFilter?: TextureFilter;
|
|
81
|
+
magFilter?: TextureFilter;
|
|
82
|
+
wrapU?: TextureWrap;
|
|
83
|
+
wrapV?: TextureWrap;
|
|
84
|
+
generateMipmaps?: boolean;
|
|
85
|
+
}
|
|
86
|
+
/** Vertex attribute descriptor */
|
|
87
|
+
interface VertexAttribute {
|
|
88
|
+
name: string;
|
|
89
|
+
location: number;
|
|
90
|
+
format: VertexFormat;
|
|
91
|
+
offset: number;
|
|
92
|
+
}
|
|
93
|
+
/** Vertex buffer layout */
|
|
94
|
+
interface VertexBufferLayout {
|
|
95
|
+
stride: number;
|
|
96
|
+
attributes: VertexAttribute[];
|
|
97
|
+
}
|
|
98
|
+
/** Pipeline configuration */
|
|
99
|
+
interface PipelineConfig {
|
|
100
|
+
vertexShader: string;
|
|
101
|
+
fragmentShader: string;
|
|
102
|
+
vertexLayout: VertexBufferLayout;
|
|
103
|
+
primitive?: PrimitiveTopology;
|
|
104
|
+
cullMode?: CullMode;
|
|
105
|
+
blendMode?: BlendMode;
|
|
106
|
+
depthWrite?: boolean;
|
|
107
|
+
depthCompare?: DepthCompare;
|
|
108
|
+
}
|
|
109
|
+
/** Uniform value types */
|
|
110
|
+
type UniformValue = number | Float32Array | Mat4 | [number, number] | [number, number, number] | [number, number, number, number];
|
|
111
|
+
/** Buffer interface */
|
|
112
|
+
interface IBuffer {
|
|
113
|
+
readonly id: number;
|
|
114
|
+
readonly size: number;
|
|
115
|
+
readonly usage: BufferUsage;
|
|
116
|
+
update(data: ArrayBufferView, offset?: number): void;
|
|
117
|
+
dispose(): void;
|
|
118
|
+
}
|
|
119
|
+
/** Texture interface */
|
|
120
|
+
interface ITexture {
|
|
121
|
+
readonly id: number;
|
|
122
|
+
readonly width: number;
|
|
123
|
+
readonly height: number;
|
|
124
|
+
update(source: TexImageSource): void;
|
|
125
|
+
dispose(): void;
|
|
126
|
+
}
|
|
127
|
+
/** Pipeline interface */
|
|
128
|
+
interface IPipeline {
|
|
129
|
+
readonly id: number;
|
|
130
|
+
dispose(): void;
|
|
131
|
+
}
|
|
132
|
+
/** Bind group for uniforms and textures */
|
|
133
|
+
interface BindGroup {
|
|
134
|
+
uniforms: Record<string, UniformValue>;
|
|
135
|
+
textures: Record<string, ITexture>;
|
|
136
|
+
}
|
|
137
|
+
/** Draw call parameters */
|
|
138
|
+
interface DrawParams {
|
|
139
|
+
pipeline: IPipeline;
|
|
140
|
+
vertexBuffers: IBuffer[];
|
|
141
|
+
indexBuffer?: IBuffer;
|
|
142
|
+
indexCount?: number;
|
|
143
|
+
vertexCount?: number;
|
|
144
|
+
instanceCount?: number;
|
|
145
|
+
bindGroup: BindGroup;
|
|
146
|
+
}
|
|
147
|
+
/** Renderer interface */
|
|
148
|
+
interface IRenderer {
|
|
149
|
+
readonly backend: BackendType;
|
|
150
|
+
readonly canvas: HTMLCanvasElement;
|
|
151
|
+
readonly width: number;
|
|
152
|
+
readonly height: number;
|
|
153
|
+
readonly pixelRatio: number;
|
|
154
|
+
createBuffer(usage: BufferUsage, data: ArrayBufferView): IBuffer;
|
|
155
|
+
createTexture(source: TexImageSource, options?: TextureOptions): Promise<ITexture>;
|
|
156
|
+
createPipeline(config: PipelineConfig): IPipeline;
|
|
157
|
+
beginFrame(): void;
|
|
158
|
+
clear(r: number, g: number, b: number, a: number): void;
|
|
159
|
+
draw(params: DrawParams): void;
|
|
160
|
+
endFrame(): void;
|
|
161
|
+
resize(width: number, height: number): void;
|
|
162
|
+
dispose(): void;
|
|
163
|
+
}
|
|
164
|
+
/** Check if WebGPU is supported */
|
|
165
|
+
declare function isWebGPUSupported(): boolean;
|
|
166
|
+
/** Check if WebGL2 is supported */
|
|
167
|
+
declare function isWebGL2Supported(): boolean;
|
|
168
|
+
/** Detect best available backend */
|
|
169
|
+
declare function detectBestBackend(): BackendType | null;
|
|
170
|
+
//#endregion
|
|
171
|
+
export { BackendType, IRenderer, RendererOptions, detectBestBackend, isWebGL2Supported, isWebGPUSupported };
|
|
172
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/core/renderer/types.ts"],"mappings":"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"}
|