@needle-tools/engine 3.2.3-alpha → 3.2.4-alpha.1
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 +9 -0
- package/dist/needle-engine.js +24012 -22890
- package/dist/needle-engine.min.js +363 -363
- package/dist/needle-engine.umd.cjs +369 -369
- package/lib/engine/api.d.ts +33 -11
- package/lib/engine/api.js +33 -11
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_addressables.d.ts +3 -3
- package/lib/engine/engine_addressables.js +0 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_context.d.ts +11 -12
- package/lib/engine/engine_context.js +16 -17
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +2 -2
- package/lib/engine/engine_fileloader.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +8 -8
- package/lib/engine/engine_gameobject.js +1 -1
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_gizmos.d.ts +2 -3
- package/lib/engine/engine_gizmos.js +3 -3
- package/lib/engine/engine_gizmos.js.map +1 -1
- package/lib/engine/engine_gltf_builtin_components.js +4 -5
- package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
- package/lib/engine/engine_input.d.ts +7 -7
- package/lib/engine/engine_input.js +12 -12
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_license.js +2 -2
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_mainloop_utils.d.ts +1 -1
- package/lib/engine/engine_mainloop_utils.js +1 -1
- package/lib/engine/engine_mainloop_utils.js.map +1 -1
- package/lib/engine/engine_networking_auto.d.ts +1 -1
- package/lib/engine/engine_networking_auto.js.map +1 -1
- package/lib/engine/engine_networking_files.d.ts +4 -4
- package/lib/engine/engine_networking_files.js +4 -5
- package/lib/engine/engine_networking_files.js.map +1 -1
- package/lib/engine/engine_three_utils.d.ts +19 -19
- package/lib/engine/engine_three_utils.js +17 -18
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_components.d.ts +6 -5
- package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +14 -6
- package/lib/engine/extensions/NEEDLE_lighting_settings.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +3 -4
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +25 -26
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
- package/lib/engine-components/Animation.d.ts +6 -7
- package/lib/engine-components/Animation.js +5 -6
- package/lib/engine-components/Animation.js.map +1 -1
- package/lib/engine-components/Animator.d.ts +3 -4
- package/lib/engine-components/Animator.js.map +1 -1
- package/lib/engine-components/AnimatorController.js +3 -4
- package/lib/engine-components/AnimatorController.js.map +1 -1
- package/lib/engine-components/AudioListener.d.ts +2 -2
- package/lib/engine-components/AudioListener.js +2 -2
- package/lib/engine-components/AudioListener.js.map +1 -1
- package/lib/engine-components/AudioSource.d.ts +2 -2
- package/lib/engine-components/AudioSource.js +4 -4
- package/lib/engine-components/AudioSource.js.map +1 -1
- package/lib/engine-components/AvatarLoader.d.ts +7 -7
- package/lib/engine-components/AvatarLoader.js +3 -4
- package/lib/engine-components/AvatarLoader.js.map +1 -1
- package/lib/engine-components/AxesHelper.js.map +1 -1
- package/lib/engine-components/BasicIKConstraint.js +2 -2
- package/lib/engine-components/BasicIKConstraint.js.map +1 -1
- package/lib/engine-components/BoxHelperComponent.d.ts +5 -5
- package/lib/engine-components/BoxHelperComponent.js +6 -6
- package/lib/engine-components/BoxHelperComponent.js.map +1 -1
- package/lib/engine-components/Component.d.ts +45 -47
- package/lib/engine-components/Component.js +16 -17
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/DragControls.d.ts +3 -3
- package/lib/engine-components/DragControls.js +22 -24
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/api.d.ts +3 -0
- package/lib/engine-components/api.js +3 -0
- package/lib/engine-components/api.js.map +1 -1
- package/lib/engine-components/ui/Utils.d.ts +4 -3
- package/lib/engine-components/ui/Utils.js.map +1 -1
- package/lib/engine-components-experimental/api.d.ts +1 -0
- package/lib/engine-components-experimental/api.js +2 -0
- package/lib/engine-components-experimental/api.js.map +1 -0
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +2 -1
- package/lib/engine-components-experimental/networking/PlayerSync.js +18 -1
- package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
- package/lib/needle-engine.d.ts +1 -5
- package/lib/needle-engine.js +4 -5
- package/lib/needle-engine.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/plugins/vite/license.js +2 -2
- package/src/engine/api.ts +39 -20
- package/src/engine/codegen/register_types.js +2 -2
- package/src/engine/engine_addressables.ts +6 -7
- package/src/engine/engine_context.ts +31 -28
- package/src/engine/engine_fileloader.js +2 -2
- package/src/engine/engine_gameobject.ts +21 -21
- package/src/engine/engine_gizmos.ts +5 -6
- package/src/engine/engine_gltf_builtin_components.ts +9 -10
- package/src/engine/engine_input.ts +17 -18
- package/src/engine/engine_license.ts +2 -2
- package/src/engine/engine_mainloop_utils.ts +5 -5
- package/src/engine/engine_networking_auto.ts +1 -1
- package/src/engine/engine_networking_files.ts +10 -11
- package/src/engine/engine_three_utils.ts +37 -37
- package/src/engine/extensions/NEEDLE_components.ts +7 -6
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +15 -6
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +29 -30
- package/src/engine-components/Animation.ts +17 -19
- package/src/engine-components/Animator.ts +4 -5
- package/src/engine-components/AnimatorController.ts +16 -17
- package/src/engine-components/AudioListener.ts +4 -4
- package/src/engine-components/AudioSource.ts +8 -8
- package/src/engine-components/AvatarLoader.ts +15 -16
- package/src/engine-components/AxesHelper.ts +1 -1
- package/src/engine-components/BasicIKConstraint.ts +2 -2
- package/src/engine-components/BoxHelperComponent.ts +13 -13
- package/src/engine-components/Component.ts +65 -68
- package/src/engine-components/DragControls.ts +42 -43
- package/src/engine-components/ParticleSystemModules.ts +1483 -1483
- package/src/engine-components/api.ts +3 -0
- package/src/engine-components/ui/Utils.ts +4 -4
- package/src/engine-components-experimental/api.ts +1 -0
- package/src/engine-components-experimental/networking/PlayerSync.ts +17 -4
- package/src/needle-engine.ts +5 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.4-alpha.1",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in",
|
|
5
5
|
"main": "dist/needle-engine.umd.cjs",
|
|
6
6
|
"type": "module",
|
package/plugins/vite/license.js
CHANGED
|
@@ -7,11 +7,11 @@ export const needleLicense = (command, config, userSettings) => {
|
|
|
7
7
|
name: "needle-license",
|
|
8
8
|
enforce: 'pre',
|
|
9
9
|
async transform(src, id) {
|
|
10
|
-
if (id.includes("engine/engine_license.
|
|
10
|
+
if (id.includes("engine/engine_license") || id.includes("needle-tools_engine.js")) {
|
|
11
11
|
const needleConfig = await loadConfig();
|
|
12
12
|
if (needleConfig) {
|
|
13
13
|
if (needleConfig.hasProLicense !== undefined && typeof needleConfig.hasProLicense === "boolean") {
|
|
14
|
-
src = src.replace("
|
|
14
|
+
src = src.replace("NEEDLE_ENGINE_COMMERCIAL_USE_LICENSE = false;", "NEEDLE_ENGINE_COMMERCIAL_USE_LICENSE = " + needleConfig.hasProLicense + ";");
|
|
15
15
|
return { code: src, map: null }
|
|
16
16
|
}
|
|
17
17
|
}
|
package/src/engine/api.ts
CHANGED
|
@@ -1,20 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
export { TypeStore } from "./engine_typestore";
|
|
3
|
-
export * from "./engine_context_registry";
|
|
1
|
+
|
|
4
2
|
export * from "./extensions/extensions"
|
|
5
|
-
export
|
|
6
|
-
export * from "./
|
|
3
|
+
export * from "./engine_addressables";
|
|
4
|
+
export * from "./engine_application"
|
|
5
|
+
export * from "./engine_assetdatabase"
|
|
6
|
+
export * from "./engine_components_internal";
|
|
7
7
|
export * from "./engine_components";
|
|
8
8
|
export * from "./engine_components_internal";
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export * from "./
|
|
12
|
-
export
|
|
9
|
+
export * from "./engine_context_registry"
|
|
10
|
+
export * from "./engine_context";
|
|
11
|
+
export * from "./engine_coroutine"
|
|
12
|
+
export * from "./engine_constants";
|
|
13
|
+
export * from "./debug";
|
|
14
|
+
export * from "./engine_element";
|
|
13
15
|
export { Gizmos } from "./engine_gizmos"
|
|
16
|
+
export * from "./engine_gltf";
|
|
17
|
+
export * from "./engine_hot_reload";
|
|
18
|
+
export * from "./engine_gameobject";
|
|
19
|
+
export * from "./engine_networking";
|
|
20
|
+
export { syncField } from "./engine_networking_auto";
|
|
21
|
+
export * from "./engine_networking_files";
|
|
22
|
+
export * from "./engine_networking_instantiate";
|
|
23
|
+
export * from "./engine_networking_utils";
|
|
24
|
+
export * from "./engine_patcher"
|
|
25
|
+
export * from "./engine_playerview"
|
|
26
|
+
export * from "./engine_physics"
|
|
27
|
+
export * from "./engine_physics.types"
|
|
28
|
+
export * from "./engine_input";
|
|
29
|
+
export * from "./engine_math";
|
|
30
|
+
export * from "./js-extensions";
|
|
14
31
|
export * from "./engine_scenetools";
|
|
15
|
-
export * from "./
|
|
16
|
-
export * from "./
|
|
17
|
-
export
|
|
32
|
+
export * from "./engine_serialization";
|
|
33
|
+
export * from "./engine_texture";
|
|
34
|
+
export * from "./engine_time";
|
|
35
|
+
export * from "./engine_types";
|
|
36
|
+
export * from "./engine_utils_screenshot";
|
|
37
|
+
export * from "./engine_web_api";
|
|
38
|
+
|
|
39
|
+
export { TypeStore } from "./engine_typestore";
|
|
40
|
+
|
|
41
|
+
export { InstancingUtil } from "./engine_instancing";
|
|
42
|
+
export { validate, prefix } from "./engine_util_decorator"
|
|
43
|
+
export { hasProLicense } from "./engine_license";
|
|
18
44
|
|
|
19
45
|
export {
|
|
20
46
|
// url params
|
|
@@ -32,11 +58,4 @@ export {
|
|
|
32
58
|
isiOS,
|
|
33
59
|
isSafari,
|
|
34
60
|
isQuest,
|
|
35
|
-
} from "./engine_utils";
|
|
36
|
-
|
|
37
|
-
export {
|
|
38
|
-
setUsageTrackingEnabled,
|
|
39
|
-
isUsageTrackingEnabled,
|
|
40
|
-
findUsers,
|
|
41
|
-
getUserCount
|
|
42
|
-
} from "./engine_assetdatabase"
|
|
61
|
+
} from "./engine_utils";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TypeStore } from "./../engine_typestore"
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
// Import types
|
|
4
4
|
import { __Ignore } from "../../engine-components/codegen/components";
|
|
5
5
|
import { AlignmentConstraint } from "../../engine-components/AlignmentConstraint";
|
|
@@ -184,7 +184,7 @@ import { XRGrabModel } from "../../engine-components/WebXRGrabRendering";
|
|
|
184
184
|
import { XRGrabRendering } from "../../engine-components/WebXRGrabRendering";
|
|
185
185
|
import { XRRig } from "../../engine-components/WebXRRig";
|
|
186
186
|
import { XRState } from "../../engine-components/XRFlag";
|
|
187
|
-
|
|
187
|
+
|
|
188
188
|
// Register types
|
|
189
189
|
TypeStore.add("__Ignore", __Ignore);
|
|
190
190
|
TypeStore.add("AlignmentConstraint", AlignmentConstraint);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { getParam, resolveUrl } from "../engine/engine_utils";
|
|
2
|
-
// import { loadSync, parseSync } from "./engine_scenetools";
|
|
3
2
|
import { SerializationContext, TypeSerializer } from "./engine_serialization_core";
|
|
4
3
|
import { Context } from "./engine_setup";
|
|
5
|
-
import { Group, Object3D,
|
|
4
|
+
import { Group, Object3D, Texture } from "three";
|
|
6
5
|
import { processNewScripts } from "./engine_mainloop_utils";
|
|
7
6
|
import { registerPrefabProvider, syncInstantiate } from "./engine_networking_instantiate";
|
|
8
|
-
import { download
|
|
7
|
+
import { download } from "./engine_web_api";
|
|
9
8
|
import { getLoader } from "./engine_gltf";
|
|
10
9
|
import { SourceIdentifier } from "./engine_types";
|
|
11
10
|
import { destroy, instantiate, InstantiateOptions, isDestroyed } from "./engine_gameobject";
|
|
@@ -185,11 +184,11 @@ export class AssetReference {
|
|
|
185
184
|
}
|
|
186
185
|
}
|
|
187
186
|
|
|
188
|
-
async instantiate(parent?:
|
|
187
|
+
async instantiate(parent?: Object3D | InstantiateOptions) {
|
|
189
188
|
return this.onInstantiate(parent, false);
|
|
190
189
|
}
|
|
191
190
|
|
|
192
|
-
async instantiateSynced(parent?:
|
|
191
|
+
async instantiateSynced(parent?: Object3D | InstantiateOptions, saveOnServer: boolean = true) {
|
|
193
192
|
return this.onInstantiate(parent, true, saveOnServer);
|
|
194
193
|
}
|
|
195
194
|
|
|
@@ -211,7 +210,7 @@ export class AssetReference {
|
|
|
211
210
|
}
|
|
212
211
|
}
|
|
213
212
|
|
|
214
|
-
private async onInstantiate(parent?:
|
|
213
|
+
private async onInstantiate(parent?: Object3D | InstantiateOptions, networked: boolean = false, saveOnServer?: boolean) {
|
|
215
214
|
const context = Context.Current;
|
|
216
215
|
if (!parent) parent = context.scene;
|
|
217
216
|
if (this.mustLoad) {
|
|
@@ -282,7 +281,7 @@ export class AssetReference {
|
|
|
282
281
|
* and call destroy on the player marker root
|
|
283
282
|
* @returns the scene root object if the asset was a glb/gltf
|
|
284
283
|
*/
|
|
285
|
-
private tryGetActualGameObjectRoot(asset: any):
|
|
284
|
+
private tryGetActualGameObjectRoot(asset: any): Object3D | null {
|
|
286
285
|
if (asset && asset.scene) {
|
|
287
286
|
// some exporters produce additional root objects
|
|
288
287
|
const scene = asset.scene as Group;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { Camera, Clock,
|
|
2
|
-
|
|
1
|
+
import { BufferGeometry, Camera, Clock, Color, DepthTexture, Group,
|
|
2
|
+
Material, NearestFilter, NoToneMapping, Object3D, PCFSoftShadowMap,
|
|
3
|
+
PerspectiveCamera, RGBAFormat, Scene, sRGBEncoding,
|
|
4
|
+
Texture, WebGLRenderer, WebGLRenderTarget
|
|
5
|
+
} from 'three'
|
|
3
6
|
import { Input } from './engine_input';
|
|
4
7
|
import { Physics } from './engine_physics';
|
|
5
8
|
import { Time } from './engine_time';
|
|
@@ -50,7 +53,7 @@ export class ContextArgs {
|
|
|
50
53
|
name?: string;
|
|
51
54
|
alias?: string;
|
|
52
55
|
domElement: HTMLElement | null;
|
|
53
|
-
renderer?:
|
|
56
|
+
renderer?: WebGLRenderer = undefined;
|
|
54
57
|
hash?: string;
|
|
55
58
|
|
|
56
59
|
constructor(domElement: HTMLElement | null) {
|
|
@@ -74,7 +77,7 @@ export enum XRSessionMode {
|
|
|
74
77
|
ImmersiveAR = "immersive-ar",
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
export declare type OnBeforeRenderCallback = (renderer:
|
|
80
|
+
export declare type OnBeforeRenderCallback = (renderer: WebGLRenderer, scene: Scene, camera: Camera, geometry: BufferGeometry, material: Material, group: Group) => void
|
|
78
81
|
|
|
79
82
|
|
|
80
83
|
export function registerComponent(script: IComponent, context?: Context) {
|
|
@@ -175,8 +178,8 @@ export class Context implements IContext {
|
|
|
175
178
|
}
|
|
176
179
|
private _currentFrameEvent: FrameEvent = FrameEvent.Undefined;
|
|
177
180
|
|
|
178
|
-
scene:
|
|
179
|
-
renderer:
|
|
181
|
+
scene: Scene;
|
|
182
|
+
renderer: WebGLRenderer;
|
|
180
183
|
composer: EffectComposer | null = null;
|
|
181
184
|
|
|
182
185
|
// all scripts
|
|
@@ -191,7 +194,7 @@ export class Context implements IContext {
|
|
|
191
194
|
scripts_WithCorroutines: IComponent[] = [];
|
|
192
195
|
coroutines: { [FrameEvent: number]: Array<CoroutineData> } = {}
|
|
193
196
|
|
|
194
|
-
get mainCamera():
|
|
197
|
+
get mainCamera(): Camera | null {
|
|
195
198
|
if (this.mainCameraComponent) {
|
|
196
199
|
const cam = this.mainCameraComponent as ICamera;
|
|
197
200
|
if (!cam.cam)
|
|
@@ -251,21 +254,21 @@ export class Context implements IContext {
|
|
|
251
254
|
|
|
252
255
|
// some tonemapping other than "NONE" is required for adjusting exposure with EXR environments
|
|
253
256
|
this.renderer.toneMappingExposure = 1; // range [0...inf] instead of the usual -15..15
|
|
254
|
-
this.renderer.toneMapping =
|
|
257
|
+
this.renderer.toneMapping = NoToneMapping; // could also set to LinearToneMapping, ACESFilmicToneMapping
|
|
255
258
|
|
|
256
|
-
this.renderer.setClearColor(new
|
|
259
|
+
this.renderer.setClearColor(new Color('lightgrey'), 0);
|
|
257
260
|
// @ts-ignore
|
|
258
261
|
this.renderer.antialias = true;
|
|
259
262
|
// @ts-ignore
|
|
260
263
|
this.renderer.alpha = false;
|
|
261
264
|
this.renderer.shadowMap.enabled = true;
|
|
262
|
-
this.renderer.shadowMap.type =
|
|
265
|
+
this.renderer.shadowMap.type = PCFSoftShadowMap;
|
|
263
266
|
this.renderer.setSize(this.domWidth, this.domHeight);
|
|
264
|
-
this.renderer.outputEncoding =
|
|
267
|
+
this.renderer.outputEncoding = sRGBEncoding;
|
|
265
268
|
this.renderer.physicallyCorrectLights = true;
|
|
266
269
|
}
|
|
267
270
|
|
|
268
|
-
this.scene = new
|
|
271
|
+
this.scene = new Scene();
|
|
269
272
|
|
|
270
273
|
ContextRegistry.register(this);
|
|
271
274
|
|
|
@@ -328,7 +331,7 @@ export class Context implements IContext {
|
|
|
328
331
|
}
|
|
329
332
|
}
|
|
330
333
|
|
|
331
|
-
updateAspect(camera:
|
|
334
|
+
updateAspect(camera: PerspectiveCamera, width?: number, height?: number) {
|
|
332
335
|
if (!camera) return;
|
|
333
336
|
if (width === undefined)
|
|
334
337
|
width = this.domWidth;
|
|
@@ -410,7 +413,7 @@ export class Context implements IContext {
|
|
|
410
413
|
if (index >= 0) this._cameraStack.splice(index, 1);
|
|
411
414
|
this._cameraStack.push(cam);
|
|
412
415
|
this.mainCameraComponent = cam;
|
|
413
|
-
const camera = cam.cam as
|
|
416
|
+
const camera = cam.cam as PerspectiveCamera;
|
|
414
417
|
if (camera.isPerspectiveCamera)
|
|
415
418
|
this.updateAspect(camera);
|
|
416
419
|
(this.mainCameraComponent as ICamera)?.applyClearFlagsIfIsActiveCamera();
|
|
@@ -434,7 +437,7 @@ export class Context implements IContext {
|
|
|
434
437
|
private _onBeforeRenderListeners: { [key: string]: OnBeforeRenderCallback[] } = {};
|
|
435
438
|
|
|
436
439
|
/** use this to subscribe to onBeforeRender events on threejs objects */
|
|
437
|
-
addBeforeRenderListener(target:
|
|
440
|
+
addBeforeRenderListener(target: Object3D, callback: OnBeforeRenderCallback) {
|
|
438
441
|
if (!this._onBeforeRenderListeners[target.uuid]) {
|
|
439
442
|
this._onBeforeRenderListeners[target.uuid] = [];
|
|
440
443
|
const onBeforeRenderCallback = (renderer, scene, camera, geometry, material, group) => {
|
|
@@ -450,7 +453,7 @@ export class Context implements IContext {
|
|
|
450
453
|
this._onBeforeRenderListeners[target.uuid].push(callback);
|
|
451
454
|
}
|
|
452
455
|
|
|
453
|
-
removeBeforeRenderListener(target:
|
|
456
|
+
removeBeforeRenderListener(target: Object3D, callback: OnBeforeRenderCallback) {
|
|
454
457
|
if (this._onBeforeRenderListeners[target.uuid]) {
|
|
455
458
|
const arr = this._onBeforeRenderListeners[target.uuid];
|
|
456
459
|
const idx = arr.indexOf(callback);
|
|
@@ -473,11 +476,11 @@ export class Context implements IContext {
|
|
|
473
476
|
this._requireColorTexture = val;
|
|
474
477
|
}
|
|
475
478
|
|
|
476
|
-
get depthTexture():
|
|
479
|
+
get depthTexture(): DepthTexture | null {
|
|
477
480
|
return this._renderTarget?.depthTexture || null;
|
|
478
481
|
}
|
|
479
482
|
|
|
480
|
-
get opaqueColorTexture():
|
|
483
|
+
get opaqueColorTexture(): Texture | null {
|
|
481
484
|
return this._renderTarget?.texture || null;
|
|
482
485
|
}
|
|
483
486
|
|
|
@@ -822,17 +825,17 @@ export class Context implements IContext {
|
|
|
822
825
|
if (!this.mainCamera) return;
|
|
823
826
|
if (!this._requireDepthTexture && !this._requireColorTexture) return;
|
|
824
827
|
if (!this._renderTarget) {
|
|
825
|
-
this._renderTarget = new
|
|
828
|
+
this._renderTarget = new WebGLRenderTarget(this.domWidth, this.domHeight);
|
|
826
829
|
if (this._requireDepthTexture) {
|
|
827
830
|
const dt = new DepthTexture(this.domWidth, this.domHeight);;
|
|
828
831
|
this._renderTarget.depthTexture = dt;
|
|
829
832
|
}
|
|
830
833
|
if (this._requireColorTexture) {
|
|
831
|
-
this._renderTarget.texture = new
|
|
834
|
+
this._renderTarget.texture = new Texture();
|
|
832
835
|
this._renderTarget.texture.generateMipmaps = false;
|
|
833
|
-
this._renderTarget.texture.minFilter =
|
|
834
|
-
this._renderTarget.texture.magFilter =
|
|
835
|
-
this._renderTarget.texture.format =
|
|
836
|
+
this._renderTarget.texture.minFilter = NearestFilter;
|
|
837
|
+
this._renderTarget.texture.magFilter = NearestFilter;
|
|
838
|
+
this._renderTarget.texture.format = RGBAFormat;
|
|
836
839
|
}
|
|
837
840
|
}
|
|
838
841
|
const rt = this._renderTarget;
|
|
@@ -909,24 +912,24 @@ export class Context implements IContext {
|
|
|
909
912
|
}
|
|
910
913
|
|
|
911
914
|
|
|
912
|
-
// const scene = new
|
|
915
|
+
// const scene = new Scene();
|
|
913
916
|
// const useComposer = utils.getParam("postfx");
|
|
914
917
|
// const renderer = new WebGLRenderer({ antialias: true });
|
|
915
918
|
// const composer = useComposer ? new EffectComposer(renderer) : undefined;
|
|
916
919
|
|
|
917
|
-
// renderer.setClearColor(new
|
|
920
|
+
// renderer.setClearColor(new Color('lightgrey'), 0)
|
|
918
921
|
// renderer.antialias = true;
|
|
919
922
|
// renderer.alpha = false;
|
|
920
923
|
// renderer.shadowMap.enabled = true;
|
|
921
|
-
// renderer.shadowMap.type =
|
|
924
|
+
// renderer.shadowMap.type = PCFSoftShadowMap;
|
|
922
925
|
// renderer.setSize(window.innerWidth, window.innerHeight);
|
|
923
|
-
// renderer.outputEncoding =
|
|
926
|
+
// renderer.outputEncoding = sRGBEncoding;
|
|
924
927
|
// renderer.physicallyCorrectLights = true;
|
|
925
928
|
// document.body.appendChild(renderer.domElement);
|
|
926
929
|
|
|
927
930
|
// // generation pushes loading requests in this array
|
|
928
931
|
// const sceneData: {
|
|
929
|
-
// mainCamera:
|
|
932
|
+
// mainCamera: Camera | undefined
|
|
930
933
|
// } = {
|
|
931
934
|
// preparing: [],
|
|
932
935
|
// resolving: [],
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Bone, Object3D, Quaternion, SkinnedMesh, Vector3 } from "three";
|
|
2
2
|
import { processNewScripts } from "./engine_mainloop_utils";
|
|
3
3
|
import { InstantiateIdProvider } from "./engine_networking_instantiate";
|
|
4
4
|
import { Context, registerComponent } from "./engine_setup";
|
|
@@ -36,9 +36,9 @@ export class InstantiateOptions {
|
|
|
36
36
|
parent?: string | undefined | Object3D;
|
|
37
37
|
/** for duplicatable parenting */
|
|
38
38
|
keepWorldPosition?: boolean
|
|
39
|
-
position?:
|
|
40
|
-
rotation?:
|
|
41
|
-
scale?:
|
|
39
|
+
position?: Vector3 | undefined;
|
|
40
|
+
rotation?: Quaternion | undefined;
|
|
41
|
+
scale?: Vector3 | undefined;
|
|
42
42
|
|
|
43
43
|
visible?: boolean | undefined;
|
|
44
44
|
|
|
@@ -88,14 +88,14 @@ export function isActiveInHierarchy(go: Object3D): boolean {
|
|
|
88
88
|
return go[activeInHierarchyFieldName] || isUsingInstancing(go);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
export function markAsInstancedRendered(go:
|
|
91
|
+
export function markAsInstancedRendered(go: Object3D, instanced: boolean) {
|
|
92
92
|
go[$isUsingInstancing] = instanced;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
export function isUsingInstancing(instance:
|
|
95
|
+
export function isUsingInstancing(instance: Object3D): boolean { return InstancingUtil.isUsingInstancing(instance); }
|
|
96
96
|
|
|
97
97
|
|
|
98
|
-
export function findByGuid(guid: string, hierarchy:
|
|
98
|
+
export function findByGuid(guid: string, hierarchy: Object3D): GameObject | IComponent | null | undefined {
|
|
99
99
|
return tryFindObject(guid, hierarchy, true, true);
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -159,7 +159,7 @@ function internalDestroy(instance: Object3D | Component, recursive: boolean = tr
|
|
|
159
159
|
|
|
160
160
|
declare type ForEachComponentCallback = (comp: Component) => any;
|
|
161
161
|
|
|
162
|
-
export function foreachComponent(instance:
|
|
162
|
+
export function foreachComponent(instance: Object3D, cb: ForEachComponentCallback, recursive: boolean = true): any {
|
|
163
163
|
return internalForEachComponent(instance, cb, recursive);
|
|
164
164
|
}
|
|
165
165
|
|
|
@@ -198,8 +198,8 @@ function internalForEachComponent(instance: Object3D, cb: ForEachComponentCallba
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
declare class NewGameObjectReferenceInfo {
|
|
201
|
-
original:
|
|
202
|
-
clone:
|
|
201
|
+
original: Object3D;
|
|
202
|
+
clone: Object3D;
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
export function instantiate(instance: GameObject | Object3D | null, opts: InstantiateOptions | null = null): GameObject | null {
|
|
@@ -210,7 +210,7 @@ export function instantiate(instance: GameObject | Object3D | null, opts: Instan
|
|
|
210
210
|
// if x is defined assume this is a vec3 - this is just to not break everything at once and stay a little bit backwards compatible
|
|
211
211
|
if (opts["x"] !== undefined) {
|
|
212
212
|
options = new InstantiateOptions();
|
|
213
|
-
options.position = opts as unknown as
|
|
213
|
+
options.position = opts as unknown as Vector3;
|
|
214
214
|
}
|
|
215
215
|
else {
|
|
216
216
|
// if (opts instanceof InstantiateOptions)
|
|
@@ -276,12 +276,12 @@ export function instantiate(instance: GameObject | Object3D | null, opts: Instan
|
|
|
276
276
|
|
|
277
277
|
|
|
278
278
|
function internalInstantiate(
|
|
279
|
-
context: Context, instance: GameObject |
|
|
279
|
+
context: Context, instance: GameObject | Object3D, opts: InstantiateOptions | null,
|
|
280
280
|
componentsList: Array<Component>,
|
|
281
281
|
newGameObjectsMap: { [key: string]: NewGameObjectReferenceInfo },
|
|
282
282
|
skinnedMeshesMap: { [key: string]: NewGameObjectReferenceInfo }
|
|
283
283
|
)
|
|
284
|
-
: GameObject |
|
|
284
|
+
: GameObject | Object3D | null {
|
|
285
285
|
if (!instance) return null;
|
|
286
286
|
// prepare, remove things that dont work out of the box
|
|
287
287
|
// e.g. user data we want to manually clone
|
|
@@ -290,7 +290,7 @@ function internalInstantiate(
|
|
|
290
290
|
instance.userData = {};
|
|
291
291
|
const children = instance.children;
|
|
292
292
|
instance.children = [];
|
|
293
|
-
let clone:
|
|
293
|
+
let clone: Object3D | GameObject;
|
|
294
294
|
clone = instance.clone(false);
|
|
295
295
|
apply(clone);
|
|
296
296
|
// if(instance[$originalGuid])
|
|
@@ -408,9 +408,9 @@ function resolveAndBindSkinnedMeshBones(
|
|
|
408
408
|
) {
|
|
409
409
|
for (const key in skinnedMeshes) {
|
|
410
410
|
const val = skinnedMeshes[key];
|
|
411
|
-
const original = val.original as
|
|
411
|
+
const original = val.original as SkinnedMesh;
|
|
412
412
|
const originalSkeleton = original.skeleton;
|
|
413
|
-
const clone = val.clone as
|
|
413
|
+
const clone = val.clone as SkinnedMesh;
|
|
414
414
|
// clone.updateWorldMatrix(true, true);
|
|
415
415
|
if (!originalSkeleton) {
|
|
416
416
|
console.warn("Skinned mesh has no skeleton?", val);
|
|
@@ -426,16 +426,16 @@ function resolveAndBindSkinnedMeshBones(
|
|
|
426
426
|
// clone.bindMatrix.multiplyScalar(.025);
|
|
427
427
|
// console.assert(originalSkeleton.uuid !== clonedSkeleton.uuid);
|
|
428
428
|
// console.assert(originalBones.length === clonedSkeleton.bones.length);
|
|
429
|
-
const bones: Array<
|
|
429
|
+
const bones: Array<Bone> = [];
|
|
430
430
|
clonedSkeleton.bones = bones;
|
|
431
431
|
for (let i = 0; i < originalBones.length; i++) {
|
|
432
432
|
const bone = originalBones[i];
|
|
433
433
|
const newBoneInfo = newObjectsMap[bone.uuid];
|
|
434
|
-
const clonedBone = newBoneInfo.clone as
|
|
434
|
+
const clonedBone = newBoneInfo.clone as Bone;
|
|
435
435
|
// console.log("NEW BONE: ", clonedBone, "BEFORE", newBoneInfo.original);
|
|
436
436
|
bones.push(clonedBone);
|
|
437
437
|
}
|
|
438
|
-
// clone.skeleton = new
|
|
438
|
+
// clone.skeleton = new Skeleton(bones);
|
|
439
439
|
// clone.skeleton.update();
|
|
440
440
|
// clone.pose();
|
|
441
441
|
// clone.scale.set(1,1,1);
|
|
@@ -443,7 +443,7 @@ function resolveAndBindSkinnedMeshBones(
|
|
|
443
443
|
// console.log("ORIG", original, "CLONE", clone);
|
|
444
444
|
}
|
|
445
445
|
for (const key in skinnedMeshes) {
|
|
446
|
-
const clone = skinnedMeshes[key].clone as
|
|
446
|
+
const clone = skinnedMeshes[key].clone as SkinnedMesh;
|
|
447
447
|
clone.skeleton.update();
|
|
448
448
|
// clone.skeleton.calculateInverses();
|
|
449
449
|
clone.bind(clone.skeleton, clone.bindMatrix);
|
|
@@ -532,7 +532,7 @@ function resolveReferences(newObjectsMap: { [key: string]: NewGameObjectReferenc
|
|
|
532
532
|
|
|
533
533
|
}
|
|
534
534
|
|
|
535
|
-
function postProcessNewInstance(copy:
|
|
535
|
+
function postProcessNewInstance(copy: Object3D, key: string, value: IComponent | Object3D | any, newObjectsMap: { [key: string]: NewGameObjectReferenceInfo }) {
|
|
536
536
|
if (value === null || value === undefined) return;
|
|
537
537
|
if ((value as IComponent).isComponent === true) {
|
|
538
538
|
const originalGameObjectReference = value["gameObject"];
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
1
|
import { BufferAttribute, Line, BoxGeometry, EdgesGeometry, Color, LineSegments, LineBasicMaterial, Object3D, Mesh, SphereGeometry, ColorRepresentation, Vector3, Box3, Quaternion, CylinderGeometry } from 'three';
|
|
3
2
|
import { Context } from './engine_setup';
|
|
4
|
-
import {
|
|
3
|
+
import { setWorldPositionXYZ } from './engine_three_utils';
|
|
5
4
|
import { Vec3, Vec4 } from './engine_types';
|
|
6
5
|
|
|
7
6
|
const _tmp = new Vector3();
|
|
@@ -109,12 +108,12 @@ export class Gizmos {
|
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
const box: BoxGeometry = new BoxGeometry(1, 1, 1);
|
|
112
|
-
export function CreateWireCube(col:
|
|
111
|
+
export function CreateWireCube(col: ColorRepresentation | null = null): LineSegments {
|
|
113
112
|
const color = new Color(col ?? 0xdddddd);
|
|
114
|
-
// const material = new
|
|
115
|
-
// material.color = new
|
|
113
|
+
// const material = new MeshBasicMaterial();
|
|
114
|
+
// material.color = new Color(col ?? 0xdddddd);
|
|
116
115
|
// material.wireframe = true;
|
|
117
|
-
// const box = new
|
|
116
|
+
// const box = new Mesh(box, material);
|
|
118
117
|
// box.name = "BOX_GIZMO";
|
|
119
118
|
const edges = new EdgesGeometry(box);
|
|
120
119
|
const line = new LineSegments(edges, new LineBasicMaterial({ color: color }));
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import "./codegen/register_types";
|
|
2
2
|
import { TypeStore } from "./engine_typestore";
|
|
3
|
-
import * as THREE from "three";
|
|
4
|
-
// import { GameObject } from "../engine-components/Component";
|
|
5
3
|
import { InstantiateIdProvider } from "./engine_networking_instantiate"
|
|
6
4
|
import { Context } from "./engine_setup";
|
|
7
5
|
import { deserializeObject, serializeObject } from "./engine_serialization";
|
|
@@ -15,6 +13,7 @@ import { addNewComponent } from "./engine_components";
|
|
|
15
13
|
import { getParam } from "./engine_utils";
|
|
16
14
|
import { LogType, showBalloonMessage } from "./debug/debug";
|
|
17
15
|
import { isLocalNetwork } from "./engine_networking_utils";
|
|
16
|
+
import { Object3D } from "three";
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
const debug = debugExtension;
|
|
@@ -43,7 +42,7 @@ const $context_deserialize_queue = Symbol("deserialize-queue");
|
|
|
43
42
|
|
|
44
43
|
export async function createBuiltinComponents(context: Context, gltfId: SourceIdentifier, gltf, seed: number | null | UIDProvider = null, extension?: NEEDLE_components) {
|
|
45
44
|
if (!gltf) return;
|
|
46
|
-
const lateResolve: Array<(gltf:
|
|
45
|
+
const lateResolve: Array<(gltf: Object3D) => {}> = [];
|
|
47
46
|
|
|
48
47
|
let idProvider: UIDProvider | null = seed as UIDProvider;
|
|
49
48
|
if (typeof idProvider === "number") {
|
|
@@ -145,15 +144,15 @@ declare interface IGltfBuiltinComponentData {
|
|
|
145
144
|
declare class DeserializeData {
|
|
146
145
|
instance: any;
|
|
147
146
|
compData: IGltfbuiltinComponent;
|
|
148
|
-
obj:
|
|
147
|
+
obj: Object3D;
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
declare type LateResolveCallback = (gltf:
|
|
150
|
+
declare type LateResolveCallback = (gltf: Object3D) => void;
|
|
152
151
|
|
|
153
152
|
const unknownComponentsBuffer: Array<string> = [];
|
|
154
153
|
|
|
155
154
|
|
|
156
|
-
async function onCreateBuiltinComponents(context: SerializationContext, obj:
|
|
155
|
+
async function onCreateBuiltinComponents(context: SerializationContext, obj: Object3D,
|
|
157
156
|
deserialize: DeserializeData[], lateResolve: LateResolveCallback[]) {
|
|
158
157
|
if (!obj) return;
|
|
159
158
|
|
|
@@ -324,13 +323,13 @@ function handleDeserialization(data: DeserializeData, context: SerializationCont
|
|
|
324
323
|
// function tryResolveType(type, entry): any | undefined {
|
|
325
324
|
// switch (type) {
|
|
326
325
|
// case "Vector2":
|
|
327
|
-
// return new
|
|
326
|
+
// return new Vector2(entry.x, entry.y);
|
|
328
327
|
// case "Vector3":
|
|
329
|
-
// return new
|
|
328
|
+
// return new Vector3(entry.x, entry.y, entry.z);
|
|
330
329
|
// case "Vector4":
|
|
331
|
-
// return new
|
|
330
|
+
// return new Vector4(entry.x, entry.y, entry.z, entry.w);
|
|
332
331
|
// case "Quaternion":
|
|
333
|
-
// return new
|
|
332
|
+
// return new Quaternion(entry.x, entry.y, entry.z, entry.w);
|
|
334
333
|
// }
|
|
335
334
|
// return undefined;
|
|
336
335
|
// }
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
1
|
import { Vector2 } from 'three';
|
|
3
2
|
import { showBalloonMessage, showBalloonWarning } from './debug/debug';
|
|
4
3
|
import { assign } from './engine_serialization_core';
|
|
@@ -58,8 +57,8 @@ export class Input extends EventTarget {
|
|
|
58
57
|
_doubleClickTimeThreshold = .2;
|
|
59
58
|
_longPressTimeThreshold = 1;
|
|
60
59
|
|
|
61
|
-
get mousePosition():
|
|
62
|
-
get mousePositionRC():
|
|
60
|
+
get mousePosition(): Vector2 { return this._pointerPositions[0]; };
|
|
61
|
+
get mousePositionRC(): Vector2 { return this._pointerPositionsRC[0]; }
|
|
63
62
|
get mouseDown(): boolean { return this._pointerDown[0]; }
|
|
64
63
|
get mouseUp(): boolean { return this._pointerUp[0]; }
|
|
65
64
|
get mouseClick(): boolean { return this._pointerClick[0]; }
|
|
@@ -91,19 +90,19 @@ export class Input extends EventTarget {
|
|
|
91
90
|
return count;
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
getPointerPosition(i: number):
|
|
93
|
+
getPointerPosition(i: number): Vector2 | null {
|
|
95
94
|
if (i >= this._pointerPositions.length) return null;
|
|
96
95
|
return this._pointerPositions[i];
|
|
97
96
|
}
|
|
98
|
-
getPointerPositionLastFrame(i: number):
|
|
97
|
+
getPointerPositionLastFrame(i: number): Vector2 | null {
|
|
99
98
|
if (i >= this._pointerPositionsLastFrame.length) return null;
|
|
100
99
|
return this._pointerPositionsLastFrame[i];
|
|
101
100
|
}
|
|
102
|
-
getPointerPositionDelta(i: number):
|
|
101
|
+
getPointerPositionDelta(i: number): Vector2 | null {
|
|
103
102
|
if (i >= this._pointerPositionsDelta.length) return null;
|
|
104
103
|
return this._pointerPositionsDelta[i];
|
|
105
104
|
}
|
|
106
|
-
getPointerPositionRC(i: number):
|
|
105
|
+
getPointerPositionRC(i: number): Vector2 | null {
|
|
107
106
|
if (i >= this._pointerPositionsRC.length) return null;
|
|
108
107
|
return this._pointerPositionsRC[i];
|
|
109
108
|
}
|
|
@@ -213,11 +212,11 @@ export class Input extends EventTarget {
|
|
|
213
212
|
private _pointerClick: boolean[] = [false];
|
|
214
213
|
private _pointerDoubleClick: boolean[] = [false];
|
|
215
214
|
private _pointerPressed: boolean[] = [false];
|
|
216
|
-
private _pointerPositions:
|
|
217
|
-
private _pointerPositionsLastFrame:
|
|
218
|
-
private _pointerPositionsDelta:
|
|
219
|
-
private _pointerPositionsRC:
|
|
220
|
-
private _pointerPositionDown:
|
|
215
|
+
private _pointerPositions: Vector2[] = [new Vector2()];
|
|
216
|
+
private _pointerPositionsLastFrame: Vector2[] = [new Vector2()];
|
|
217
|
+
private _pointerPositionsDelta: Vector2[] = [new Vector2()];
|
|
218
|
+
private _pointerPositionsRC: Vector2[] = [new Vector2()];
|
|
219
|
+
private _pointerPositionDown: Vector2[] = [new Vector2()];
|
|
221
220
|
private _pointerDownTime: number[] = [];
|
|
222
221
|
private _pointerUpTime: number[] = [];
|
|
223
222
|
private _pointerUpTimestamp: number[] = [];
|
|
@@ -505,9 +504,9 @@ export class Input extends EventTarget {
|
|
|
505
504
|
while (evt.button >= this._pointerTypes.length) this._pointerTypes.push(evt.pointerType);
|
|
506
505
|
this._pointerTypes[evt.button] = evt.pointerType;
|
|
507
506
|
|
|
508
|
-
while (evt.button >= this._pointerPositionDown.length) this._pointerPositionDown.push(new
|
|
507
|
+
while (evt.button >= this._pointerPositionDown.length) this._pointerPositionDown.push(new Vector2());
|
|
509
508
|
this._pointerPositionDown[evt.button].set(evt.clientX, evt.clientY);
|
|
510
|
-
while (evt.button >= this._pointerPositions.length) this._pointerPositions.push(new
|
|
509
|
+
while (evt.button >= this._pointerPositions.length) this._pointerPositions.push(new Vector2());
|
|
511
510
|
this._pointerPositions[evt.button].set(evt.clientX, evt.clientY);
|
|
512
511
|
|
|
513
512
|
if (evt.button >= this._pointerDownTime.length) this._pointerDownTime.push(0);
|
|
@@ -577,9 +576,9 @@ export class Input extends EventTarget {
|
|
|
577
576
|
|
|
578
577
|
private updatePointerPosition(evt: PointerEventArgs) {
|
|
579
578
|
// console.log("MOVE");
|
|
580
|
-
while (evt.button >= this._pointerPositions.length) this._pointerPositions.push(new
|
|
581
|
-
while (evt.button >= this._pointerPositionsLastFrame.length) this._pointerPositionsLastFrame.push(new
|
|
582
|
-
while (evt.button >= this._pointerPositionsDelta.length) this._pointerPositionsDelta.push(new
|
|
579
|
+
while (evt.button >= this._pointerPositions.length) this._pointerPositions.push(new Vector2());
|
|
580
|
+
while (evt.button >= this._pointerPositionsLastFrame.length) this._pointerPositionsLastFrame.push(new Vector2());
|
|
581
|
+
while (evt.button >= this._pointerPositionsDelta.length) this._pointerPositionsDelta.push(new Vector2());
|
|
583
582
|
|
|
584
583
|
const lf = this._pointerPositionsLastFrame[evt.button];
|
|
585
584
|
lf.copy(this._pointerPositions[evt.button]);
|
|
@@ -593,7 +592,7 @@ export class Input extends EventTarget {
|
|
|
593
592
|
// we want to have the position 01 on the canvas for raycasting
|
|
594
593
|
const px = evt.clientX;
|
|
595
594
|
const py = evt.clientY;
|
|
596
|
-
while (evt.button >= this._pointerPositionsRC.length) this._pointerPositionsRC.push(new
|
|
595
|
+
while (evt.button >= this._pointerPositionsRC.length) this._pointerPositionsRC.push(new Vector2());
|
|
597
596
|
const rc = this._pointerPositionsRC[evt.button];
|
|
598
597
|
rc.set(px, py);
|
|
599
598
|
this.convertScreenspaceToRaycastSpace(rc);
|