@combos-fun/plugin-renderer-3d 0.0.6

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.
@@ -0,0 +1,258 @@
1
+ 'use strict';
2
+
3
+ var engine = require('@combos-fun/engine');
4
+ var three = require('three');
5
+ var GLTFLoader_js = require('three/addons/loaders/GLTFLoader.js');
6
+
7
+ class ThreeContext {
8
+ constructor(params) {
9
+ this.mixers = new Map();
10
+ this.models = new Map();
11
+ const { canvas, container, width, height, antialias = true, backgroundColor = 0x000000, backgroundAlpha = 1, } = params;
12
+ this.scene = new three.Scene();
13
+ this.camera = new three.PerspectiveCamera(75, width / height, 0.1, 1000);
14
+ this.camera.position.z = 5;
15
+ const rendererOpts = { antialias };
16
+ if (canvas) {
17
+ rendererOpts.canvas = canvas;
18
+ }
19
+ if (backgroundAlpha < 1) {
20
+ rendererOpts.alpha = true;
21
+ }
22
+ this.renderer = new three.WebGLRenderer(rendererOpts);
23
+ this.renderer.setSize(width, height);
24
+ this.renderer.setPixelRatio(window.devicePixelRatio);
25
+ this.renderer.setClearColor(backgroundColor, backgroundAlpha);
26
+ // If no canvas was provided but a container was, append the generated canvas
27
+ if (!canvas && container) {
28
+ container.appendChild(this.renderer.domElement);
29
+ }
30
+ const ambientLight = new three.AmbientLight(0xffffff, 0.6);
31
+ this.scene.add(ambientLight);
32
+ const directionalLight = new three.DirectionalLight(0xffffff, 0.8);
33
+ directionalLight.position.set(5, 10, 7.5);
34
+ this.scene.add(directionalLight);
35
+ this.clock = new three.Clock();
36
+ this.gltfLoader = new GLTFLoader_js.GLTFLoader();
37
+ }
38
+ update() {
39
+ const delta = this.clock.getDelta();
40
+ for (const mixer of this.mixers.values()) {
41
+ mixer.update(delta);
42
+ }
43
+ this.renderer.render(this.scene, this.camera);
44
+ }
45
+ async loadGLB(id, url) {
46
+ return new Promise((resolve, reject) => {
47
+ this.gltfLoader.load(url, (gltf) => {
48
+ const model = gltf.scene;
49
+ this.scene.add(model);
50
+ this.models.set(id, model);
51
+ if (gltf.animations && gltf.animations.length > 0) {
52
+ const mixer = new three.AnimationMixer(model);
53
+ this.mixers.set(id, mixer);
54
+ model.userData.animations = gltf.animations;
55
+ }
56
+ resolve(model);
57
+ }, undefined, (error) => {
58
+ reject(error);
59
+ });
60
+ });
61
+ }
62
+ playAnimation(id, animationIndex, speed) {
63
+ const mixer = this.mixers.get(id);
64
+ const model = this.models.get(id);
65
+ if (!mixer || !model)
66
+ return;
67
+ mixer.stopAllAction();
68
+ const animations = model.userData.animations;
69
+ if (animations && animations[animationIndex]) {
70
+ const action = mixer.clipAction(animations[animationIndex]);
71
+ action.timeScale = speed;
72
+ action.play();
73
+ }
74
+ }
75
+ stopAnimation(id) {
76
+ const mixer = this.mixers.get(id);
77
+ if (mixer)
78
+ mixer.stopAllAction();
79
+ }
80
+ removeModel(id) {
81
+ const model = this.models.get(id);
82
+ if (model) {
83
+ this.scene.remove(model);
84
+ model.traverse((child) => {
85
+ const mesh = child;
86
+ if (mesh.geometry) {
87
+ mesh.geometry.dispose();
88
+ }
89
+ if (mesh.material) {
90
+ const materials = Array.isArray(mesh.material)
91
+ ? mesh.material
92
+ : [mesh.material];
93
+ materials.forEach(m => m.dispose());
94
+ }
95
+ });
96
+ this.models.delete(id);
97
+ }
98
+ const mixer = this.mixers.get(id);
99
+ if (mixer) {
100
+ mixer.stopAllAction();
101
+ this.mixers.delete(id);
102
+ }
103
+ }
104
+ resize(width, height) {
105
+ this.camera.aspect = width / height;
106
+ this.camera.updateProjectionMatrix();
107
+ this.renderer.setSize(width, height);
108
+ }
109
+ destroy() {
110
+ for (const id of this.models.keys()) {
111
+ this.removeModel(id);
112
+ }
113
+ this.renderer.dispose();
114
+ this.renderer.domElement.remove();
115
+ this.scene = null;
116
+ this.camera = null;
117
+ this.renderer = null;
118
+ this.clock = null;
119
+ this.gltfLoader = null;
120
+ }
121
+ }
122
+
123
+ class Renderer3DManager {
124
+ constructor({ game, rendererSystem }) {
125
+ this.renderers = [];
126
+ this.game = game;
127
+ this.rendererSystem = rendererSystem;
128
+ }
129
+ register(...renderers) {
130
+ for (const renderer of renderers) {
131
+ renderer.game = this.game;
132
+ renderer.rendererManager = this;
133
+ renderer.threeContext = this.rendererSystem.threeContext;
134
+ this.renderers.push(renderer);
135
+ }
136
+ }
137
+ componentChanged(changes) {
138
+ for (const changed of changes) {
139
+ for (const renderer of this.renderers) {
140
+ const props = renderer.observerInfo[changed.componentName];
141
+ if (!props)
142
+ continue;
143
+ if (changed.type === engine.OBSERVER_TYPE.ADD || changed.type === engine.OBSERVER_TYPE.REMOVE) {
144
+ try {
145
+ renderer.componentChanged(changed);
146
+ }
147
+ catch (e) {
148
+ console.error(`gameObject: ${changed.gameObject.name}, ${changed.componentName} error.`, changed, e);
149
+ }
150
+ continue;
151
+ }
152
+ // CHANGE type: check if the changed prop matches
153
+ const index = props.findIndex((prop) => {
154
+ if (typeof prop === 'string' && typeof changed.prop === 'string') {
155
+ return prop === changed.prop;
156
+ }
157
+ // Deep comparison for object-style props
158
+ return JSON.stringify(prop) === JSON.stringify(changed.prop);
159
+ });
160
+ if (index > -1) {
161
+ try {
162
+ renderer.componentChanged(changed);
163
+ }
164
+ catch (e) {
165
+ console.error(`gameObject: ${changed.gameObject?.name}, ${changed.componentName} componentChanged error.`, changed, e);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ update(gameObject) {
172
+ for (const component of gameObject.components) {
173
+ for (const renderer of this.renderers) {
174
+ const props = renderer.observerInfo[component.name];
175
+ if (props) {
176
+ try {
177
+ renderer.rendererUpdate(gameObject);
178
+ }
179
+ catch (e) {
180
+ console.info(`gameObject: ${gameObject.name}, ${component.name} update error`, e);
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+
188
+ class Renderer3DSystem extends engine.System {
189
+ constructor() {
190
+ super(...arguments);
191
+ this.name = 'Renderer3DSystem';
192
+ }
193
+ static { this.systemName = 'Renderer3DSystem'; }
194
+ init(params) {
195
+ const opts = params || {};
196
+ const width = opts.width || 750;
197
+ const height = opts.height || 1000;
198
+ this.threeContext = new ThreeContext({
199
+ canvas: opts.canvas,
200
+ container: opts.container,
201
+ width,
202
+ height,
203
+ antialias: opts.antialias,
204
+ backgroundColor: opts.backgroundColor,
205
+ backgroundAlpha: opts.backgroundAlpha,
206
+ });
207
+ this.game.canvas = this.threeContext.renderer.domElement;
208
+ this.rendererManager = new Renderer3DManager({
209
+ game: this.game,
210
+ rendererSystem: this,
211
+ });
212
+ }
213
+ update(e) {
214
+ for (const gameObject of this.game.gameObjects) {
215
+ this.rendererManager.update(gameObject);
216
+ }
217
+ }
218
+ lateUpdate() {
219
+ this.threeContext?.update();
220
+ }
221
+ resize(width, height) {
222
+ this.threeContext?.resize(width, height);
223
+ }
224
+ onDestroy() {
225
+ this.threeContext?.destroy();
226
+ this.threeContext = null;
227
+ }
228
+ }
229
+
230
+ class Renderer3D extends engine.System {
231
+ constructor(params) {
232
+ super(params);
233
+ this.asyncIdMap = {};
234
+ const Ctor = this.constructor;
235
+ this.observerInfo = Ctor.observerInfo;
236
+ }
237
+ componentChanged(_changed) { }
238
+ rendererUpdate(_gameObject) { }
239
+ update(e) {
240
+ const changes = this.componentObserver.clear();
241
+ for (const changed of changes) {
242
+ this.componentChanged(changed);
243
+ }
244
+ }
245
+ increaseAsyncId(id) {
246
+ this.asyncIdMap[id] = (this.asyncIdMap[id] || 0) + 1;
247
+ return this.asyncIdMap[id];
248
+ }
249
+ validateAsyncId(id, asyncId) {
250
+ return this.asyncIdMap[id] === asyncId;
251
+ }
252
+ }
253
+
254
+ exports.Renderer3D = Renderer3D;
255
+ exports.Renderer3DManager = Renderer3DManager;
256
+ exports.Renderer3DSystem = Renderer3DSystem;
257
+ exports.ThreeContext = ThreeContext;
258
+ //# sourceMappingURL=plugin-renderer-3d.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-renderer-3d.cjs.js","sources":["../lib/ThreeContext.ts","../lib/Renderer3DManager.ts","../lib/system.ts","../lib/Renderer3D.ts"],"sourcesContent":["import {\n Scene,\n PerspectiveCamera,\n WebGLRenderer,\n Clock,\n AmbientLight,\n DirectionalLight,\n AnimationMixer,\n AnimationClip,\n Mesh,\n Material,\n Group,\n} from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n\nexport interface ThreeContextParams {\n canvas?: HTMLCanvasElement;\n container?: HTMLElement;\n width: number;\n height: number;\n antialias?: boolean;\n backgroundColor?: number;\n backgroundAlpha?: number;\n}\n\nexport default class ThreeContext {\n scene: Scene;\n camera: PerspectiveCamera;\n renderer: WebGLRenderer;\n clock: Clock;\n gltfLoader: GLTFLoader;\n mixers: Map<number, AnimationMixer> = new Map();\n models: Map<number, Group> = new Map();\n\n constructor(params: ThreeContextParams) {\n const {\n canvas,\n container,\n width,\n height,\n antialias = true,\n backgroundColor = 0x000000,\n backgroundAlpha = 1,\n } = params;\n\n this.scene = new Scene();\n\n this.camera = new PerspectiveCamera(75, width / height, 0.1, 1000);\n this.camera.position.z = 5;\n\n const rendererOpts: any = { antialias };\n if (canvas) {\n rendererOpts.canvas = canvas;\n }\n if (backgroundAlpha < 1) {\n rendererOpts.alpha = true;\n }\n\n this.renderer = new WebGLRenderer(rendererOpts);\n this.renderer.setSize(width, height);\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setClearColor(backgroundColor, backgroundAlpha);\n\n // If no canvas was provided but a container was, append the generated canvas\n if (!canvas && container) {\n container.appendChild(this.renderer.domElement);\n }\n\n const ambientLight = new AmbientLight(0xffffff, 0.6);\n this.scene.add(ambientLight);\n const directionalLight = new DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(5, 10, 7.5);\n this.scene.add(directionalLight);\n\n this.clock = new Clock();\n this.gltfLoader = new GLTFLoader();\n }\n\n update() {\n const delta = this.clock.getDelta();\n for (const mixer of this.mixers.values()) {\n mixer.update(delta);\n }\n this.renderer.render(this.scene, this.camera);\n }\n\n async loadGLB(id: number, url: string): Promise<Group> {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(url, (gltf) => {\n const model = gltf.scene;\n this.scene.add(model);\n this.models.set(id, model);\n\n if (gltf.animations && gltf.animations.length > 0) {\n const mixer = new AnimationMixer(model);\n this.mixers.set(id, mixer);\n model.userData.animations = gltf.animations;\n }\n\n resolve(model);\n }, undefined, (error) => {\n reject(error);\n });\n });\n }\n\n playAnimation(id: number, animationIndex: number, speed: number) {\n const mixer = this.mixers.get(id);\n const model = this.models.get(id);\n if (!mixer || !model) return;\n\n mixer.stopAllAction();\n const animations = model.userData.animations as AnimationClip[];\n if (animations && animations[animationIndex]) {\n const action = mixer.clipAction(animations[animationIndex]);\n action.timeScale = speed;\n action.play();\n }\n }\n\n stopAnimation(id: number) {\n const mixer = this.mixers.get(id);\n if (mixer) mixer.stopAllAction();\n }\n\n removeModel(id: number) {\n const model = this.models.get(id);\n if (model) {\n this.scene.remove(model);\n model.traverse((child) => {\n const mesh = child as Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n if (mesh.material) {\n const materials = Array.isArray(mesh.material)\n ? mesh.material as Material[]\n : [mesh.material as Material];\n materials.forEach(m => m.dispose());\n }\n });\n this.models.delete(id);\n }\n const mixer = this.mixers.get(id);\n if (mixer) {\n mixer.stopAllAction();\n this.mixers.delete(id);\n }\n }\n\n resize(width: number, height: number) {\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n }\n\n destroy() {\n for (const id of this.models.keys()) {\n this.removeModel(id);\n }\n this.renderer.dispose();\n this.renderer.domElement.remove();\n this.scene = null;\n this.camera = null;\n this.renderer = null;\n this.clock = null;\n this.gltfLoader = null;\n }\n}\n","import { GameObject, Game, ComponentChanged, OBSERVER_TYPE } from '@combos-fun/engine';\nimport type Renderer3D from './Renderer3D';\nimport type Renderer3DSystem from './system';\n\nexport default class Renderer3DManager {\n game: Game;\n rendererSystem: Renderer3DSystem;\n renderers: Renderer3D[] = [];\n\n constructor({ game, rendererSystem }: { game: Game; rendererSystem: Renderer3DSystem }) {\n this.game = game;\n this.rendererSystem = rendererSystem;\n }\n\n register(...renderers: Renderer3D[]) {\n for (const renderer of renderers) {\n renderer.game = this.game;\n renderer.rendererManager = this;\n renderer.threeContext = this.rendererSystem.threeContext;\n this.renderers.push(renderer);\n }\n }\n\n componentChanged(changes: ComponentChanged[]) {\n for (const changed of changes) {\n for (const renderer of this.renderers) {\n const props = renderer.observerInfo[changed.componentName];\n if (!props) continue;\n\n if (changed.type === OBSERVER_TYPE.ADD || changed.type === OBSERVER_TYPE.REMOVE) {\n try {\n renderer.componentChanged(changed);\n } catch (e) {\n console.error(\n `gameObject: ${changed.gameObject.name}, ${changed.componentName} error.`,\n changed,\n e,\n );\n }\n continue;\n }\n\n // CHANGE type: check if the changed prop matches\n const index = props.findIndex((prop) => {\n if (typeof prop === 'string' && typeof changed.prop === 'string') {\n return prop === changed.prop;\n }\n // Deep comparison for object-style props\n return JSON.stringify(prop) === JSON.stringify(changed.prop);\n });\n\n if (index > -1) {\n try {\n renderer.componentChanged(changed);\n } catch (e) {\n console.error(\n `gameObject: ${changed.gameObject?.name}, ${changed.componentName} componentChanged error.`,\n changed,\n e,\n );\n }\n }\n }\n }\n }\n\n update(gameObject: GameObject) {\n for (const component of gameObject.components) {\n for (const renderer of this.renderers) {\n const props = renderer.observerInfo[component.name];\n if (props) {\n try {\n renderer.rendererUpdate(gameObject);\n } catch (e) {\n console.info(\n `gameObject: ${gameObject.name}, ${component.name} update error`,\n e,\n );\n }\n }\n }\n }\n }\n}\n","import { System } from '@combos-fun/engine';\nimport type { UpdateParams } from '@combos-fun/engine';\nimport ThreeContext from './ThreeContext';\nimport type { ThreeContextParams } from './ThreeContext';\nimport Renderer3DManager from './Renderer3DManager';\n\nexport interface Renderer3DSystemParams extends Partial<ThreeContextParams> {\n canvas?: HTMLCanvasElement;\n container?: HTMLElement;\n width?: number;\n height?: number;\n antialias?: boolean;\n backgroundColor?: number;\n backgroundAlpha?: number;\n}\n\nexport default class Renderer3DSystem extends System<Renderer3DSystemParams> {\n static systemName = 'Renderer3DSystem';\n name: string = 'Renderer3DSystem';\n threeContext: ThreeContext;\n rendererManager: Renderer3DManager;\n\n init(params?: Renderer3DSystemParams) {\n const opts = params || {};\n const width = opts.width || 750;\n const height = opts.height || 1000;\n\n this.threeContext = new ThreeContext({\n canvas: opts.canvas,\n container: opts.container,\n width,\n height,\n antialias: opts.antialias,\n backgroundColor: opts.backgroundColor,\n backgroundAlpha: opts.backgroundAlpha,\n });\n\n this.game.canvas = this.threeContext.renderer.domElement;\n\n this.rendererManager = new Renderer3DManager({\n game: this.game,\n rendererSystem: this,\n });\n }\n\n update(e?: UpdateParams) {\n for (const gameObject of this.game.gameObjects) {\n this.rendererManager.update(gameObject);\n }\n }\n\n lateUpdate() {\n this.threeContext?.update();\n }\n\n resize(width: number, height: number) {\n this.threeContext?.resize(width, height);\n }\n\n onDestroy(): void {\n this.threeContext?.destroy();\n this.threeContext = null;\n }\n}\n","import { Game, PureObserverInfo, ComponentChanged, System, GameObject, UpdateParams } from '@combos-fun/engine';\nimport type Renderer3DManager from './Renderer3DManager';\nimport type ThreeContext from './ThreeContext';\n\nexport default class Renderer3D<T extends {} = {}> extends System<T> {\n name: string;\n game: Game;\n static observerInfo: PureObserverInfo;\n observerInfo: PureObserverInfo;\n rendererManager: Renderer3DManager;\n threeContext: ThreeContext;\n\n constructor(params?: T) {\n super(params);\n const Ctor = this.constructor as typeof Renderer3D & { observerInfo: PureObserverInfo };\n this.observerInfo = Ctor.observerInfo;\n }\n\n componentChanged(_changed: ComponentChanged) {}\n rendererUpdate(_gameObject: GameObject) {}\n\n override update(e?: UpdateParams): void {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n this.componentChanged(changed);\n }\n }\n\n protected asyncIdMap: Record<number, number> = {};\n\n protected increaseAsyncId(id: number) {\n this.asyncIdMap[id] = (this.asyncIdMap[id] || 0) + 1;\n return this.asyncIdMap[id];\n }\n\n protected validateAsyncId(id: number, asyncId: number) {\n return this.asyncIdMap[id] === asyncId;\n }\n}\n"],"names":["Scene","PerspectiveCamera","WebGLRenderer","AmbientLight","DirectionalLight","Clock","GLTFLoader","AnimationMixer","OBSERVER_TYPE","System"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ "use strict";var e=require("@combos-fun/engine"),t=require("three"),r=require("three/addons/loaders/GLTFLoader.js");class s{constructor(e){this.mixers=new Map,this.models=new Map;const{canvas:s,container:n,width:o,height:i,antialias:a=!0,backgroundColor:c=0,backgroundAlpha:h=1}=e;this.scene=new t.Scene,this.camera=new t.PerspectiveCamera(75,o/i,.1,1e3),this.camera.position.z=5;const d={antialias:a};s&&(d.canvas=s),h<1&&(d.alpha=!0),this.renderer=new t.WebGLRenderer(d),this.renderer.setSize(o,i),this.renderer.setPixelRatio(window.devicePixelRatio),this.renderer.setClearColor(c,h),!s&&n&&n.appendChild(this.renderer.domElement);const m=new t.AmbientLight(16777215,.6);this.scene.add(m);const l=new t.DirectionalLight(16777215,.8);l.position.set(5,10,7.5),this.scene.add(l),this.clock=new t.Clock,this.gltfLoader=new r.GLTFLoader}update(){const e=this.clock.getDelta();for(const t of this.mixers.values())t.update(e);this.renderer.render(this.scene,this.camera)}async loadGLB(e,r){return new Promise((s,n)=>{this.gltfLoader.load(r,r=>{const n=r.scene;if(this.scene.add(n),this.models.set(e,n),r.animations&&r.animations.length>0){const s=new t.AnimationMixer(n);this.mixers.set(e,s),n.userData.animations=r.animations}s(n)},void 0,e=>{n(e)})})}playAnimation(e,t,r){const s=this.mixers.get(e),n=this.models.get(e);if(!s||!n)return;s.stopAllAction();const o=n.userData.animations;if(o&&o[t]){const e=s.clipAction(o[t]);e.timeScale=r,e.play()}}stopAnimation(e){const t=this.mixers.get(e);t&&t.stopAllAction()}removeModel(e){const t=this.models.get(e);t&&(this.scene.remove(t),t.traverse(e=>{const t=e;if(t.geometry&&t.geometry.dispose(),t.material){(Array.isArray(t.material)?t.material:[t.material]).forEach(e=>e.dispose())}}),this.models.delete(e));const r=this.mixers.get(e);r&&(r.stopAllAction(),this.mixers.delete(e))}resize(e,t){this.camera.aspect=e/t,this.camera.updateProjectionMatrix(),this.renderer.setSize(e,t)}destroy(){for(const e of this.models.keys())this.removeModel(e);this.renderer.dispose(),this.renderer.domElement.remove(),this.scene=null,this.camera=null,this.renderer=null,this.clock=null,this.gltfLoader=null}}class n{constructor({game:e,rendererSystem:t}){this.renderers=[],this.game=e,this.rendererSystem=t}register(...e){for(const t of e)t.game=this.game,t.rendererManager=this,t.threeContext=this.rendererSystem.threeContext,this.renderers.push(t)}componentChanged(t){for(const r of t)for(const t of this.renderers){const s=t.observerInfo[r.componentName];if(!s)continue;if(r.type===e.OBSERVER_TYPE.ADD||r.type===e.OBSERVER_TYPE.REMOVE){try{t.componentChanged(r)}catch(e){console.error(`gameObject: ${r.gameObject.name}, ${r.componentName} error.`,r,e)}continue}if(s.findIndex(e=>"string"==typeof e&&"string"==typeof r.prop?e===r.prop:JSON.stringify(e)===JSON.stringify(r.prop))>-1)try{t.componentChanged(r)}catch(e){console.error(`gameObject: ${r.gameObject?.name}, ${r.componentName} componentChanged error.`,r,e)}}}update(e){for(const t of e.components)for(const r of this.renderers){if(r.observerInfo[t.name])try{r.rendererUpdate(e)}catch(r){console.info(`gameObject: ${e.name}, ${t.name} update error`,r)}}}}class o extends e.System{constructor(){super(...arguments),this.name="Renderer3DSystem"}static{this.systemName="Renderer3DSystem"}init(e){const t=e||{},r=t.width||750,o=t.height||1e3;this.threeContext=new s({canvas:t.canvas,container:t.container,width:r,height:o,antialias:t.antialias,backgroundColor:t.backgroundColor,backgroundAlpha:t.backgroundAlpha}),this.game.canvas=this.threeContext.renderer.domElement,this.rendererManager=new n({game:this.game,rendererSystem:this})}update(e){for(const e of this.game.gameObjects)this.rendererManager.update(e)}lateUpdate(){this.threeContext?.update()}resize(e,t){this.threeContext?.resize(e,t)}onDestroy(){this.threeContext?.destroy(),this.threeContext=null}}class i extends e.System{constructor(e){super(e),this.asyncIdMap={};const t=this.constructor;this.observerInfo=t.observerInfo}componentChanged(e){}rendererUpdate(e){}update(e){const t=this.componentObserver.clear();for(const e of t)this.componentChanged(e)}increaseAsyncId(e){return this.asyncIdMap[e]=(this.asyncIdMap[e]||0)+1,this.asyncIdMap[e]}validateAsyncId(e,t){return this.asyncIdMap[e]===t}}exports.Renderer3D=i,exports.Renderer3DManager=n,exports.Renderer3DSystem=o,exports.ThreeContext=s;
@@ -0,0 +1,83 @@
1
+ import { System, Game, PureObserverInfo, ComponentChanged, GameObject, UpdateParams } from '@combos-fun/engine';
2
+ import { Scene, PerspectiveCamera, WebGLRenderer, Clock, AnimationMixer, Group } from 'three';
3
+ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
4
+
5
+ interface ThreeContextParams {
6
+ canvas?: HTMLCanvasElement;
7
+ container?: HTMLElement;
8
+ width: number;
9
+ height: number;
10
+ antialias?: boolean;
11
+ backgroundColor?: number;
12
+ backgroundAlpha?: number;
13
+ }
14
+ declare class ThreeContext {
15
+ scene: Scene;
16
+ camera: PerspectiveCamera;
17
+ renderer: WebGLRenderer;
18
+ clock: Clock;
19
+ gltfLoader: GLTFLoader;
20
+ mixers: Map<number, AnimationMixer>;
21
+ models: Map<number, Group>;
22
+ constructor(params: ThreeContextParams);
23
+ update(): void;
24
+ loadGLB(id: number, url: string): Promise<Group>;
25
+ playAnimation(id: number, animationIndex: number, speed: number): void;
26
+ stopAnimation(id: number): void;
27
+ removeModel(id: number): void;
28
+ resize(width: number, height: number): void;
29
+ destroy(): void;
30
+ }
31
+
32
+ declare class Renderer3D<T extends {} = {}> extends System<T> {
33
+ name: string;
34
+ game: Game;
35
+ static observerInfo: PureObserverInfo;
36
+ observerInfo: PureObserverInfo;
37
+ rendererManager: Renderer3DManager;
38
+ threeContext: ThreeContext;
39
+ constructor(params?: T);
40
+ componentChanged(_changed: ComponentChanged): void;
41
+ rendererUpdate(_gameObject: GameObject): void;
42
+ update(e?: UpdateParams): void;
43
+ protected asyncIdMap: Record<number, number>;
44
+ protected increaseAsyncId(id: number): number;
45
+ protected validateAsyncId(id: number, asyncId: number): boolean;
46
+ }
47
+
48
+ declare class Renderer3DManager {
49
+ game: Game;
50
+ rendererSystem: Renderer3DSystem;
51
+ renderers: Renderer3D[];
52
+ constructor({ game, rendererSystem }: {
53
+ game: Game;
54
+ rendererSystem: Renderer3DSystem;
55
+ });
56
+ register(...renderers: Renderer3D[]): void;
57
+ componentChanged(changes: ComponentChanged[]): void;
58
+ update(gameObject: GameObject): void;
59
+ }
60
+
61
+ interface Renderer3DSystemParams extends Partial<ThreeContextParams> {
62
+ canvas?: HTMLCanvasElement;
63
+ container?: HTMLElement;
64
+ width?: number;
65
+ height?: number;
66
+ antialias?: boolean;
67
+ backgroundColor?: number;
68
+ backgroundAlpha?: number;
69
+ }
70
+ declare class Renderer3DSystem extends System<Renderer3DSystemParams> {
71
+ static systemName: string;
72
+ name: string;
73
+ threeContext: ThreeContext;
74
+ rendererManager: Renderer3DManager;
75
+ init(params?: Renderer3DSystemParams): void;
76
+ update(e?: UpdateParams): void;
77
+ lateUpdate(): void;
78
+ resize(width: number, height: number): void;
79
+ onDestroy(): void;
80
+ }
81
+
82
+ export { Renderer3D, Renderer3DManager, Renderer3DSystem, ThreeContext };
83
+ export type { Renderer3DSystemParams, ThreeContextParams };
@@ -0,0 +1,253 @@
1
+ import { OBSERVER_TYPE, System } from '@combos-fun/engine';
2
+ import { Scene, PerspectiveCamera, WebGLRenderer, AmbientLight, DirectionalLight, Clock, AnimationMixer } from 'three';
3
+ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
4
+
5
+ class ThreeContext {
6
+ constructor(params) {
7
+ this.mixers = new Map();
8
+ this.models = new Map();
9
+ const { canvas, container, width, height, antialias = true, backgroundColor = 0x000000, backgroundAlpha = 1, } = params;
10
+ this.scene = new Scene();
11
+ this.camera = new PerspectiveCamera(75, width / height, 0.1, 1000);
12
+ this.camera.position.z = 5;
13
+ const rendererOpts = { antialias };
14
+ if (canvas) {
15
+ rendererOpts.canvas = canvas;
16
+ }
17
+ if (backgroundAlpha < 1) {
18
+ rendererOpts.alpha = true;
19
+ }
20
+ this.renderer = new WebGLRenderer(rendererOpts);
21
+ this.renderer.setSize(width, height);
22
+ this.renderer.setPixelRatio(window.devicePixelRatio);
23
+ this.renderer.setClearColor(backgroundColor, backgroundAlpha);
24
+ // If no canvas was provided but a container was, append the generated canvas
25
+ if (!canvas && container) {
26
+ container.appendChild(this.renderer.domElement);
27
+ }
28
+ const ambientLight = new AmbientLight(0xffffff, 0.6);
29
+ this.scene.add(ambientLight);
30
+ const directionalLight = new DirectionalLight(0xffffff, 0.8);
31
+ directionalLight.position.set(5, 10, 7.5);
32
+ this.scene.add(directionalLight);
33
+ this.clock = new Clock();
34
+ this.gltfLoader = new GLTFLoader();
35
+ }
36
+ update() {
37
+ const delta = this.clock.getDelta();
38
+ for (const mixer of this.mixers.values()) {
39
+ mixer.update(delta);
40
+ }
41
+ this.renderer.render(this.scene, this.camera);
42
+ }
43
+ async loadGLB(id, url) {
44
+ return new Promise((resolve, reject) => {
45
+ this.gltfLoader.load(url, (gltf) => {
46
+ const model = gltf.scene;
47
+ this.scene.add(model);
48
+ this.models.set(id, model);
49
+ if (gltf.animations && gltf.animations.length > 0) {
50
+ const mixer = new AnimationMixer(model);
51
+ this.mixers.set(id, mixer);
52
+ model.userData.animations = gltf.animations;
53
+ }
54
+ resolve(model);
55
+ }, undefined, (error) => {
56
+ reject(error);
57
+ });
58
+ });
59
+ }
60
+ playAnimation(id, animationIndex, speed) {
61
+ const mixer = this.mixers.get(id);
62
+ const model = this.models.get(id);
63
+ if (!mixer || !model)
64
+ return;
65
+ mixer.stopAllAction();
66
+ const animations = model.userData.animations;
67
+ if (animations && animations[animationIndex]) {
68
+ const action = mixer.clipAction(animations[animationIndex]);
69
+ action.timeScale = speed;
70
+ action.play();
71
+ }
72
+ }
73
+ stopAnimation(id) {
74
+ const mixer = this.mixers.get(id);
75
+ if (mixer)
76
+ mixer.stopAllAction();
77
+ }
78
+ removeModel(id) {
79
+ const model = this.models.get(id);
80
+ if (model) {
81
+ this.scene.remove(model);
82
+ model.traverse((child) => {
83
+ const mesh = child;
84
+ if (mesh.geometry) {
85
+ mesh.geometry.dispose();
86
+ }
87
+ if (mesh.material) {
88
+ const materials = Array.isArray(mesh.material)
89
+ ? mesh.material
90
+ : [mesh.material];
91
+ materials.forEach(m => m.dispose());
92
+ }
93
+ });
94
+ this.models.delete(id);
95
+ }
96
+ const mixer = this.mixers.get(id);
97
+ if (mixer) {
98
+ mixer.stopAllAction();
99
+ this.mixers.delete(id);
100
+ }
101
+ }
102
+ resize(width, height) {
103
+ this.camera.aspect = width / height;
104
+ this.camera.updateProjectionMatrix();
105
+ this.renderer.setSize(width, height);
106
+ }
107
+ destroy() {
108
+ for (const id of this.models.keys()) {
109
+ this.removeModel(id);
110
+ }
111
+ this.renderer.dispose();
112
+ this.renderer.domElement.remove();
113
+ this.scene = null;
114
+ this.camera = null;
115
+ this.renderer = null;
116
+ this.clock = null;
117
+ this.gltfLoader = null;
118
+ }
119
+ }
120
+
121
+ class Renderer3DManager {
122
+ constructor({ game, rendererSystem }) {
123
+ this.renderers = [];
124
+ this.game = game;
125
+ this.rendererSystem = rendererSystem;
126
+ }
127
+ register(...renderers) {
128
+ for (const renderer of renderers) {
129
+ renderer.game = this.game;
130
+ renderer.rendererManager = this;
131
+ renderer.threeContext = this.rendererSystem.threeContext;
132
+ this.renderers.push(renderer);
133
+ }
134
+ }
135
+ componentChanged(changes) {
136
+ for (const changed of changes) {
137
+ for (const renderer of this.renderers) {
138
+ const props = renderer.observerInfo[changed.componentName];
139
+ if (!props)
140
+ continue;
141
+ if (changed.type === OBSERVER_TYPE.ADD || changed.type === OBSERVER_TYPE.REMOVE) {
142
+ try {
143
+ renderer.componentChanged(changed);
144
+ }
145
+ catch (e) {
146
+ console.error(`gameObject: ${changed.gameObject.name}, ${changed.componentName} error.`, changed, e);
147
+ }
148
+ continue;
149
+ }
150
+ // CHANGE type: check if the changed prop matches
151
+ const index = props.findIndex((prop) => {
152
+ if (typeof prop === 'string' && typeof changed.prop === 'string') {
153
+ return prop === changed.prop;
154
+ }
155
+ // Deep comparison for object-style props
156
+ return JSON.stringify(prop) === JSON.stringify(changed.prop);
157
+ });
158
+ if (index > -1) {
159
+ try {
160
+ renderer.componentChanged(changed);
161
+ }
162
+ catch (e) {
163
+ console.error(`gameObject: ${changed.gameObject?.name}, ${changed.componentName} componentChanged error.`, changed, e);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ update(gameObject) {
170
+ for (const component of gameObject.components) {
171
+ for (const renderer of this.renderers) {
172
+ const props = renderer.observerInfo[component.name];
173
+ if (props) {
174
+ try {
175
+ renderer.rendererUpdate(gameObject);
176
+ }
177
+ catch (e) {
178
+ console.info(`gameObject: ${gameObject.name}, ${component.name} update error`, e);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ class Renderer3DSystem extends System {
187
+ constructor() {
188
+ super(...arguments);
189
+ this.name = 'Renderer3DSystem';
190
+ }
191
+ static { this.systemName = 'Renderer3DSystem'; }
192
+ init(params) {
193
+ const opts = params || {};
194
+ const width = opts.width || 750;
195
+ const height = opts.height || 1000;
196
+ this.threeContext = new ThreeContext({
197
+ canvas: opts.canvas,
198
+ container: opts.container,
199
+ width,
200
+ height,
201
+ antialias: opts.antialias,
202
+ backgroundColor: opts.backgroundColor,
203
+ backgroundAlpha: opts.backgroundAlpha,
204
+ });
205
+ this.game.canvas = this.threeContext.renderer.domElement;
206
+ this.rendererManager = new Renderer3DManager({
207
+ game: this.game,
208
+ rendererSystem: this,
209
+ });
210
+ }
211
+ update(e) {
212
+ for (const gameObject of this.game.gameObjects) {
213
+ this.rendererManager.update(gameObject);
214
+ }
215
+ }
216
+ lateUpdate() {
217
+ this.threeContext?.update();
218
+ }
219
+ resize(width, height) {
220
+ this.threeContext?.resize(width, height);
221
+ }
222
+ onDestroy() {
223
+ this.threeContext?.destroy();
224
+ this.threeContext = null;
225
+ }
226
+ }
227
+
228
+ class Renderer3D extends System {
229
+ constructor(params) {
230
+ super(params);
231
+ this.asyncIdMap = {};
232
+ const Ctor = this.constructor;
233
+ this.observerInfo = Ctor.observerInfo;
234
+ }
235
+ componentChanged(_changed) { }
236
+ rendererUpdate(_gameObject) { }
237
+ update(e) {
238
+ const changes = this.componentObserver.clear();
239
+ for (const changed of changes) {
240
+ this.componentChanged(changed);
241
+ }
242
+ }
243
+ increaseAsyncId(id) {
244
+ this.asyncIdMap[id] = (this.asyncIdMap[id] || 0) + 1;
245
+ return this.asyncIdMap[id];
246
+ }
247
+ validateAsyncId(id, asyncId) {
248
+ return this.asyncIdMap[id] === asyncId;
249
+ }
250
+ }
251
+
252
+ export { Renderer3D, Renderer3DManager, Renderer3DSystem, ThreeContext };
253
+ //# sourceMappingURL=plugin-renderer-3d.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-renderer-3d.esm.js","sources":["../lib/ThreeContext.ts","../lib/Renderer3DManager.ts","../lib/system.ts","../lib/Renderer3D.ts"],"sourcesContent":["import {\n Scene,\n PerspectiveCamera,\n WebGLRenderer,\n Clock,\n AmbientLight,\n DirectionalLight,\n AnimationMixer,\n AnimationClip,\n Mesh,\n Material,\n Group,\n} from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n\nexport interface ThreeContextParams {\n canvas?: HTMLCanvasElement;\n container?: HTMLElement;\n width: number;\n height: number;\n antialias?: boolean;\n backgroundColor?: number;\n backgroundAlpha?: number;\n}\n\nexport default class ThreeContext {\n scene: Scene;\n camera: PerspectiveCamera;\n renderer: WebGLRenderer;\n clock: Clock;\n gltfLoader: GLTFLoader;\n mixers: Map<number, AnimationMixer> = new Map();\n models: Map<number, Group> = new Map();\n\n constructor(params: ThreeContextParams) {\n const {\n canvas,\n container,\n width,\n height,\n antialias = true,\n backgroundColor = 0x000000,\n backgroundAlpha = 1,\n } = params;\n\n this.scene = new Scene();\n\n this.camera = new PerspectiveCamera(75, width / height, 0.1, 1000);\n this.camera.position.z = 5;\n\n const rendererOpts: any = { antialias };\n if (canvas) {\n rendererOpts.canvas = canvas;\n }\n if (backgroundAlpha < 1) {\n rendererOpts.alpha = true;\n }\n\n this.renderer = new WebGLRenderer(rendererOpts);\n this.renderer.setSize(width, height);\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setClearColor(backgroundColor, backgroundAlpha);\n\n // If no canvas was provided but a container was, append the generated canvas\n if (!canvas && container) {\n container.appendChild(this.renderer.domElement);\n }\n\n const ambientLight = new AmbientLight(0xffffff, 0.6);\n this.scene.add(ambientLight);\n const directionalLight = new DirectionalLight(0xffffff, 0.8);\n directionalLight.position.set(5, 10, 7.5);\n this.scene.add(directionalLight);\n\n this.clock = new Clock();\n this.gltfLoader = new GLTFLoader();\n }\n\n update() {\n const delta = this.clock.getDelta();\n for (const mixer of this.mixers.values()) {\n mixer.update(delta);\n }\n this.renderer.render(this.scene, this.camera);\n }\n\n async loadGLB(id: number, url: string): Promise<Group> {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(url, (gltf) => {\n const model = gltf.scene;\n this.scene.add(model);\n this.models.set(id, model);\n\n if (gltf.animations && gltf.animations.length > 0) {\n const mixer = new AnimationMixer(model);\n this.mixers.set(id, mixer);\n model.userData.animations = gltf.animations;\n }\n\n resolve(model);\n }, undefined, (error) => {\n reject(error);\n });\n });\n }\n\n playAnimation(id: number, animationIndex: number, speed: number) {\n const mixer = this.mixers.get(id);\n const model = this.models.get(id);\n if (!mixer || !model) return;\n\n mixer.stopAllAction();\n const animations = model.userData.animations as AnimationClip[];\n if (animations && animations[animationIndex]) {\n const action = mixer.clipAction(animations[animationIndex]);\n action.timeScale = speed;\n action.play();\n }\n }\n\n stopAnimation(id: number) {\n const mixer = this.mixers.get(id);\n if (mixer) mixer.stopAllAction();\n }\n\n removeModel(id: number) {\n const model = this.models.get(id);\n if (model) {\n this.scene.remove(model);\n model.traverse((child) => {\n const mesh = child as Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n if (mesh.material) {\n const materials = Array.isArray(mesh.material)\n ? mesh.material as Material[]\n : [mesh.material as Material];\n materials.forEach(m => m.dispose());\n }\n });\n this.models.delete(id);\n }\n const mixer = this.mixers.get(id);\n if (mixer) {\n mixer.stopAllAction();\n this.mixers.delete(id);\n }\n }\n\n resize(width: number, height: number) {\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n }\n\n destroy() {\n for (const id of this.models.keys()) {\n this.removeModel(id);\n }\n this.renderer.dispose();\n this.renderer.domElement.remove();\n this.scene = null;\n this.camera = null;\n this.renderer = null;\n this.clock = null;\n this.gltfLoader = null;\n }\n}\n","import { GameObject, Game, ComponentChanged, OBSERVER_TYPE } from '@combos-fun/engine';\nimport type Renderer3D from './Renderer3D';\nimport type Renderer3DSystem from './system';\n\nexport default class Renderer3DManager {\n game: Game;\n rendererSystem: Renderer3DSystem;\n renderers: Renderer3D[] = [];\n\n constructor({ game, rendererSystem }: { game: Game; rendererSystem: Renderer3DSystem }) {\n this.game = game;\n this.rendererSystem = rendererSystem;\n }\n\n register(...renderers: Renderer3D[]) {\n for (const renderer of renderers) {\n renderer.game = this.game;\n renderer.rendererManager = this;\n renderer.threeContext = this.rendererSystem.threeContext;\n this.renderers.push(renderer);\n }\n }\n\n componentChanged(changes: ComponentChanged[]) {\n for (const changed of changes) {\n for (const renderer of this.renderers) {\n const props = renderer.observerInfo[changed.componentName];\n if (!props) continue;\n\n if (changed.type === OBSERVER_TYPE.ADD || changed.type === OBSERVER_TYPE.REMOVE) {\n try {\n renderer.componentChanged(changed);\n } catch (e) {\n console.error(\n `gameObject: ${changed.gameObject.name}, ${changed.componentName} error.`,\n changed,\n e,\n );\n }\n continue;\n }\n\n // CHANGE type: check if the changed prop matches\n const index = props.findIndex((prop) => {\n if (typeof prop === 'string' && typeof changed.prop === 'string') {\n return prop === changed.prop;\n }\n // Deep comparison for object-style props\n return JSON.stringify(prop) === JSON.stringify(changed.prop);\n });\n\n if (index > -1) {\n try {\n renderer.componentChanged(changed);\n } catch (e) {\n console.error(\n `gameObject: ${changed.gameObject?.name}, ${changed.componentName} componentChanged error.`,\n changed,\n e,\n );\n }\n }\n }\n }\n }\n\n update(gameObject: GameObject) {\n for (const component of gameObject.components) {\n for (const renderer of this.renderers) {\n const props = renderer.observerInfo[component.name];\n if (props) {\n try {\n renderer.rendererUpdate(gameObject);\n } catch (e) {\n console.info(\n `gameObject: ${gameObject.name}, ${component.name} update error`,\n e,\n );\n }\n }\n }\n }\n }\n}\n","import { System } from '@combos-fun/engine';\nimport type { UpdateParams } from '@combos-fun/engine';\nimport ThreeContext from './ThreeContext';\nimport type { ThreeContextParams } from './ThreeContext';\nimport Renderer3DManager from './Renderer3DManager';\n\nexport interface Renderer3DSystemParams extends Partial<ThreeContextParams> {\n canvas?: HTMLCanvasElement;\n container?: HTMLElement;\n width?: number;\n height?: number;\n antialias?: boolean;\n backgroundColor?: number;\n backgroundAlpha?: number;\n}\n\nexport default class Renderer3DSystem extends System<Renderer3DSystemParams> {\n static systemName = 'Renderer3DSystem';\n name: string = 'Renderer3DSystem';\n threeContext: ThreeContext;\n rendererManager: Renderer3DManager;\n\n init(params?: Renderer3DSystemParams) {\n const opts = params || {};\n const width = opts.width || 750;\n const height = opts.height || 1000;\n\n this.threeContext = new ThreeContext({\n canvas: opts.canvas,\n container: opts.container,\n width,\n height,\n antialias: opts.antialias,\n backgroundColor: opts.backgroundColor,\n backgroundAlpha: opts.backgroundAlpha,\n });\n\n this.game.canvas = this.threeContext.renderer.domElement;\n\n this.rendererManager = new Renderer3DManager({\n game: this.game,\n rendererSystem: this,\n });\n }\n\n update(e?: UpdateParams) {\n for (const gameObject of this.game.gameObjects) {\n this.rendererManager.update(gameObject);\n }\n }\n\n lateUpdate() {\n this.threeContext?.update();\n }\n\n resize(width: number, height: number) {\n this.threeContext?.resize(width, height);\n }\n\n onDestroy(): void {\n this.threeContext?.destroy();\n this.threeContext = null;\n }\n}\n","import { Game, PureObserverInfo, ComponentChanged, System, GameObject, UpdateParams } from '@combos-fun/engine';\nimport type Renderer3DManager from './Renderer3DManager';\nimport type ThreeContext from './ThreeContext';\n\nexport default class Renderer3D<T extends {} = {}> extends System<T> {\n name: string;\n game: Game;\n static observerInfo: PureObserverInfo;\n observerInfo: PureObserverInfo;\n rendererManager: Renderer3DManager;\n threeContext: ThreeContext;\n\n constructor(params?: T) {\n super(params);\n const Ctor = this.constructor as typeof Renderer3D & { observerInfo: PureObserverInfo };\n this.observerInfo = Ctor.observerInfo;\n }\n\n componentChanged(_changed: ComponentChanged) {}\n rendererUpdate(_gameObject: GameObject) {}\n\n override update(e?: UpdateParams): void {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n this.componentChanged(changed);\n }\n }\n\n protected asyncIdMap: Record<number, number> = {};\n\n protected increaseAsyncId(id: number) {\n this.asyncIdMap[id] = (this.asyncIdMap[id] || 0) + 1;\n return this.asyncIdMap[id];\n }\n\n protected validateAsyncId(id: number, asyncId: number) {\n return this.asyncIdMap[id] === asyncId;\n }\n}\n"],"names":[],"mappings":"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"}
package/index.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === 'production') {
4
+ module.exports = require('./dist/plugin-renderer-3d.cjs.prod.js');
5
+ } else {
6
+ module.exports = require('./dist/plugin-renderer-3d.cjs.js');
7
+ }
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@combos-fun/plugin-renderer-3d",
3
+ "version": "0.0.6",
4
+ "main": "index.js",
5
+ "module": "dist/plugin-renderer-3d.esm.js",
6
+ "bundle": "CombosFun.plugin.renderer.3d",
7
+ "unpkg": "dist/CombosFun.plugin.renderer.3d.min.js",
8
+ "types": "dist/plugin-renderer-3d.d.ts",
9
+ "files": [
10
+ "index.js",
11
+ "dist"
12
+ ],
13
+ "dependencies": {
14
+ "three": "^0.172.0",
15
+ "@combos-fun/engine": "0.0.6",
16
+ "@combos-fun/inspector-decorator": "0.0.6"
17
+ },
18
+ "scripts": {
19
+ "build": "node ../../scripts/build-package.mjs"
20
+ }
21
+ }