@needle-tools/engine 2.51.0-pre → 2.52.0-pre
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.d.ts +56 -20
- package/dist/needle-engine.js +376 -377
- package/dist/needle-engine.js.map +4 -4
- package/dist/needle-engine.min.js +26 -27
- package/dist/needle-engine.min.js.map +4 -4
- package/lib/engine/engine_utils.d.ts +2 -0
- package/lib/engine/engine_utils.js +9 -0
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_deferred_texture.js +4 -3
- package/lib/engine/extensions/NEEDLE_deferred_texture.js.map +1 -1
- package/lib/engine-components/Camera.d.ts +8 -2
- package/lib/engine-components/Camera.js +39 -2
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/EventTrigger.d.ts +10 -1
- package/lib/engine-components/EventTrigger.js +47 -0
- package/lib/engine-components/EventTrigger.js.map +1 -1
- package/lib/engine-components/Light.js +5 -2
- package/lib/engine-components/Light.js.map +1 -1
- package/lib/engine-components/ParticleSystemModules.js +0 -1
- package/lib/engine-components/ParticleSystemModules.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +1 -0
- package/lib/engine-components/Renderer.js +10 -3
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/ShadowCatcher.js +5 -6
- package/lib/engine-components/ShadowCatcher.js.map +1 -1
- package/lib/engine-components/Skybox.d.ts +1 -0
- package/lib/engine-components/Skybox.js +5 -0
- package/lib/engine-components/Skybox.js.map +1 -1
- package/lib/engine-components/SpriteRenderer.d.ts +19 -3
- package/lib/engine-components/SpriteRenderer.js +154 -41
- package/lib/engine-components/SpriteRenderer.js.map +1 -1
- package/lib/engine-components/WebXRRig.js +12 -0
- package/lib/engine-components/WebXRRig.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -0
- package/lib/engine-components/codegen/components.js +1 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.js +6 -0
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/codegen/register_types.js +2 -0
- package/src/engine/engine_utils.ts +13 -2
- package/src/engine/extensions/NEEDLE_deferred_texture.ts +9 -6
- package/src/engine-components/Camera.ts +36 -2
- package/src/engine-components/EventTrigger.ts +39 -19
- package/src/engine-components/Light.ts +4 -2
- package/src/engine-components/ParticleSystemModules.ts +0 -3
- package/src/engine-components/Renderer.ts +10 -4
- package/src/engine-components/ShadowCatcher.ts +5 -6
- package/src/engine-components/Skybox.ts +4 -0
- package/src/engine-components/SpriteRenderer.ts +140 -44
- package/src/engine-components/WebXRRig.ts +14 -1
- package/src/engine-components/codegen/components.ts +1 -0
- package/src/engine-components/timeline/PlayableDirector.ts +5 -0
|
@@ -1,28 +1,48 @@
|
|
|
1
|
+
import { serializable } from "../engine/engine_serialization";
|
|
2
|
+
import { EventList } from "./EventList";
|
|
3
|
+
import { IPointerEventHandler, PointerEventData } from "./ui/PointerEvents"
|
|
1
4
|
import { Behaviour } from "./Component"
|
|
2
5
|
import { EventType } from "./EventType"
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
class TriggerEvent {
|
|
8
|
+
@serializable()
|
|
9
|
+
eventID!: EventType;
|
|
10
|
+
@serializable(EventList)
|
|
11
|
+
callback!: EventList;
|
|
12
|
+
}
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
export class EventTrigger extends Behaviour implements IPointerEventHandler {
|
|
15
|
+
|
|
16
|
+
@serializable(TriggerEvent)
|
|
17
|
+
private triggers?: Array<TriggerEvent>;
|
|
18
|
+
|
|
19
|
+
invoke(type: EventType) {
|
|
20
|
+
if(!this.triggers) return;
|
|
21
|
+
for(const trigger of this.triggers){
|
|
22
|
+
if(trigger.eventID === type){
|
|
23
|
+
trigger.callback.invoke();
|
|
24
|
+
}
|
|
14
25
|
}
|
|
15
|
-
console.log(this);
|
|
16
|
-
// console.log(this.events);
|
|
17
26
|
}
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
onPointerClick(_: PointerEventData) {
|
|
29
|
+
this.invoke(EventType.PointerClick);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
onPointerEnter(_: PointerEventData) {
|
|
33
|
+
this.invoke(EventType.PointerEnter);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
onPointerExit(_: PointerEventData) {
|
|
37
|
+
this.invoke(EventType.PointerExit);
|
|
26
38
|
}
|
|
27
|
-
|
|
39
|
+
|
|
40
|
+
onPointerDown(_: PointerEventData) {
|
|
41
|
+
this.invoke(EventType.PointerDown);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
onPointerUp(_: PointerEventData) {
|
|
45
|
+
this.invoke(EventType.PointerUp);
|
|
46
|
+
}
|
|
47
|
+
|
|
28
48
|
}
|
|
@@ -165,7 +165,7 @@ export class Light extends Behaviour implements ILight {
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
get intensity(): number { return this._intensity; }
|
|
168
|
-
private _intensity: number = 1;
|
|
168
|
+
private _intensity: number = -1;
|
|
169
169
|
|
|
170
170
|
@serializable()
|
|
171
171
|
get shadowDistance(): number {
|
|
@@ -344,7 +344,9 @@ export class Light extends Behaviour implements ILight {
|
|
|
344
344
|
|
|
345
345
|
|
|
346
346
|
if (this.light) {
|
|
347
|
-
this._intensity
|
|
347
|
+
if (this._intensity >= 0)
|
|
348
|
+
this.light.intensity = this._intensity;
|
|
349
|
+
else this._intensity = this.light.intensity;
|
|
348
350
|
|
|
349
351
|
if (this.shadows !== LightShadows.None) {
|
|
350
352
|
this.light.castShadow = true;
|
|
@@ -656,8 +656,6 @@ export class ShapeModule implements EmitterShape {
|
|
|
656
656
|
|
|
657
657
|
private randomizeDirection(direction: Vector3, amount: number) {
|
|
658
658
|
if (amount === 0) return;
|
|
659
|
-
console.log('randomizeDirection', amount);
|
|
660
|
-
|
|
661
659
|
const randomQuat = ShapeModule._randomQuat;
|
|
662
660
|
const tempVec = ShapeModule._tempVec;
|
|
663
661
|
tempVec.set(Math.random() - .5, Math.random() - .5, Math.random() - .5).normalize();
|
|
@@ -674,7 +672,6 @@ export class ShapeModule implements EmitterShape {
|
|
|
674
672
|
const z = Math.cos(phi);
|
|
675
673
|
const v = new Vector3(x, y, z);
|
|
676
674
|
dir.lerp(v, amount);
|
|
677
|
-
|
|
678
675
|
}
|
|
679
676
|
|
|
680
677
|
private randomSpherePoint(pos: Vec3, radius: number, thickness: number, arc: number, vec: Vec3) {
|
|
@@ -2,7 +2,7 @@ import { Behaviour, GameObject } from "./Component";
|
|
|
2
2
|
import * as THREE from "three";
|
|
3
3
|
// import { RendererCustomShader } from "./RendererCustomShader";
|
|
4
4
|
import { RendererLightmap } from "./RendererLightmap";
|
|
5
|
-
import { Context } from "../engine/engine_setup";
|
|
5
|
+
import { Context, FrameEvent } from "../engine/engine_setup";
|
|
6
6
|
import { getParam } from "../engine/engine_utils";
|
|
7
7
|
import { serializable } from "../engine/engine_serialization_decorator";
|
|
8
8
|
import { AxesHelper, Material, Mesh, Object3D, SkinnedMesh, Texture, Vector4 } from "three";
|
|
@@ -546,11 +546,17 @@ export class Renderer extends Behaviour implements IRenderer {
|
|
|
546
546
|
this._reflectionProbe = null;
|
|
547
547
|
if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
|
|
548
548
|
if (!this.probeAnchor) return;
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
549
|
+
// update the reflection probe right before rendering
|
|
550
|
+
// if we do it immediately the reflection probe might not be enabled yet
|
|
551
|
+
// (since this method is called from onEnable)
|
|
552
|
+
this.startCoroutine(this._updateReflectionProbe(), FrameEvent.OnBeforeRender);
|
|
552
553
|
}
|
|
553
554
|
}
|
|
555
|
+
private *_updateReflectionProbe(){
|
|
556
|
+
const obj = this.probeAnchor || this.gameObject;
|
|
557
|
+
const isAnchor = this.probeAnchor ? true : false;
|
|
558
|
+
this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor);
|
|
559
|
+
}
|
|
554
560
|
|
|
555
561
|
private setVisibility(visible: boolean) {
|
|
556
562
|
|
|
@@ -40,7 +40,7 @@ export class ShadowCatcher extends Behaviour {
|
|
|
40
40
|
applyLightBlendMaterial() {
|
|
41
41
|
const renderer = GameObject.getComponent(this.gameObject, Renderer);
|
|
42
42
|
if (renderer) {
|
|
43
|
-
const material = renderer.
|
|
43
|
+
const material = renderer.sharedMaterial;
|
|
44
44
|
material.blending = AdditiveBlending;
|
|
45
45
|
this.applyMaterialOptions(material);
|
|
46
46
|
material.onBeforeCompile = (shader) => {
|
|
@@ -50,9 +50,8 @@ export class ShadowCatcher extends Behaviour {
|
|
|
50
50
|
// see https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js#L2
|
|
51
51
|
// see https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js#L281
|
|
52
52
|
|
|
53
|
-
shader.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",
|
|
53
|
+
shader.fragmentShader = shader.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",
|
|
54
54
|
`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
|
|
55
|
-
|
|
56
55
|
// diffuse-only lighting with overdrive to somewhat compensate
|
|
57
56
|
// for the loss of indirect lighting and to make it more visible.
|
|
58
57
|
vec3 direct = reflectedLight.directDiffuse * 3.;
|
|
@@ -73,15 +72,15 @@ export class ShadowCatcher extends Behaviour {
|
|
|
73
72
|
applyShadowMaterial() {
|
|
74
73
|
const renderer = GameObject.getComponent(this.gameObject, Renderer);
|
|
75
74
|
if (renderer) {
|
|
76
|
-
if (renderer.
|
|
75
|
+
if (renderer.sharedMaterial?.type !== "ShadowMaterial") {
|
|
77
76
|
const material = new ShadowMaterial();
|
|
78
77
|
material.color = this.shadowColor;
|
|
79
78
|
material.opacity = this.shadowColor.alpha;
|
|
80
79
|
this.applyMaterialOptions(material);
|
|
81
|
-
renderer.
|
|
80
|
+
renderer.sharedMaterial = material;
|
|
82
81
|
}
|
|
83
82
|
else {
|
|
84
|
-
const material = renderer.
|
|
83
|
+
const material = renderer.sharedMaterial as ShadowMaterial;
|
|
85
84
|
material.color = this.shadowColor;
|
|
86
85
|
material.opacity = this.shadowColor.alpha;
|
|
87
86
|
this.applyMaterialOptions(material);
|
|
@@ -18,6 +18,9 @@ export class RemoteSkybox extends Behaviour {
|
|
|
18
18
|
@serializable()
|
|
19
19
|
background: boolean = true;
|
|
20
20
|
|
|
21
|
+
@serializable()
|
|
22
|
+
backgroundBlurriness: number = 0;
|
|
23
|
+
|
|
21
24
|
@serializable()
|
|
22
25
|
environment: boolean = true;
|
|
23
26
|
|
|
@@ -79,6 +82,7 @@ export class RemoteSkybox extends Behaviour {
|
|
|
79
82
|
this._prevLoadedEnvironment = envMap;
|
|
80
83
|
const nameIndex = url.lastIndexOf("/");
|
|
81
84
|
envMap.name = url.substring(nameIndex >= 0 ? nameIndex + 1 : 0);
|
|
85
|
+
this.context.scene.backgroundBlurriness = this.backgroundBlurriness;
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
|
|
@@ -1,9 +1,48 @@
|
|
|
1
1
|
import { Behaviour } from "./Component";
|
|
2
2
|
import * as THREE from "three";
|
|
3
|
-
import { serializable } from "../engine/engine_serialization_decorator";
|
|
4
|
-
import { Color, Material, Texture } from "three";
|
|
3
|
+
import { serializable, serializeable } from "../engine/engine_serialization_decorator";
|
|
4
|
+
import { Color, Material, NearestFilter, Texture, Vector2, TextureFilter } from "three";
|
|
5
5
|
import { RGBAColor } from "./js-extensions/RGBAColor";
|
|
6
|
+
import { getParam } from "../engine/engine_utils";
|
|
6
7
|
|
|
8
|
+
const debug = getParam("debugspriterenderer")
|
|
9
|
+
|
|
10
|
+
class SpriteUtils {
|
|
11
|
+
|
|
12
|
+
static cache: { [key: string]: THREE.BufferGeometry } = {};
|
|
13
|
+
|
|
14
|
+
static getOrCreateGeometry(sprite: Sprite): THREE.BufferGeometry {
|
|
15
|
+
if (sprite._geometry) return sprite._geometry;
|
|
16
|
+
if (sprite.guid) {
|
|
17
|
+
if (SpriteUtils.cache[sprite.guid]) {
|
|
18
|
+
if (debug) console.log("Take cached geometry for sprite", sprite.guid);
|
|
19
|
+
return SpriteUtils.cache[sprite.guid];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const geo = new THREE.BufferGeometry();
|
|
23
|
+
sprite._geometry = geo;
|
|
24
|
+
const vertices = new Float32Array(sprite.triangles.length * 3);
|
|
25
|
+
const uvs = new Float32Array(sprite.triangles.length * 2);
|
|
26
|
+
for (let i = 0; i < sprite.triangles.length; i += 1) {
|
|
27
|
+
const index = sprite.triangles[i];
|
|
28
|
+
|
|
29
|
+
vertices[i * 3] = -sprite.vertices[index].x;
|
|
30
|
+
vertices[i * 3 + 1] = sprite.vertices[index].y;
|
|
31
|
+
|
|
32
|
+
vertices[i * 3 + 2] = 0;
|
|
33
|
+
const uv = sprite.uv[index];
|
|
34
|
+
uvs[i * 2] = uv.x;
|
|
35
|
+
uvs[i * 2 + 1] = 1 - uv.y;
|
|
36
|
+
}
|
|
37
|
+
geo.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
|
|
38
|
+
geo.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
|
|
39
|
+
if (sprite.guid)
|
|
40
|
+
this.cache[sprite.guid] = geo;
|
|
41
|
+
if (debug)
|
|
42
|
+
console.log("Built sprite geometry", sprite, geo);
|
|
43
|
+
return geo;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
7
46
|
|
|
8
47
|
/// <summary>
|
|
9
48
|
/// <para>SpriteRenderer draw mode.</para>
|
|
@@ -30,42 +69,59 @@ class Vec2 {
|
|
|
30
69
|
|
|
31
70
|
export class Sprite {
|
|
32
71
|
|
|
72
|
+
@serializable()
|
|
73
|
+
guid?: string;
|
|
33
74
|
@serializable(Texture)
|
|
34
75
|
texture?: THREE.Texture;
|
|
35
|
-
|
|
76
|
+
@serializeable()
|
|
36
77
|
triangles!: Array<number>;
|
|
78
|
+
@serializeable()
|
|
37
79
|
uv!: Array<Vec2>;
|
|
80
|
+
@serializeable()
|
|
38
81
|
vertices!: Array<Vec2>;
|
|
39
82
|
|
|
40
83
|
_geometry?: THREE.BufferGeometry;
|
|
41
84
|
}
|
|
42
85
|
|
|
43
|
-
class SpriteUtils {
|
|
44
86
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
87
|
+
class Slice {
|
|
88
|
+
@serializable()
|
|
89
|
+
name!: string;
|
|
90
|
+
@serializable(Vector2)
|
|
91
|
+
offset!: Vector2;
|
|
92
|
+
@serializable(Vector2)
|
|
93
|
+
size!: Vector2;
|
|
94
|
+
}
|
|
53
95
|
|
|
54
|
-
|
|
55
|
-
vertices[i * 3 + 1] = sprite.vertices[index].y;
|
|
96
|
+
const $spriteTexOwner = Symbol("spriteOwner");
|
|
56
97
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
98
|
+
export class SpriteSheet {
|
|
99
|
+
|
|
100
|
+
@serializable(Sprite)
|
|
101
|
+
sprite?: Sprite;
|
|
102
|
+
@serializable()
|
|
103
|
+
index: number = 0;
|
|
104
|
+
@serializable(Slice)
|
|
105
|
+
slices!: Slice[];
|
|
106
|
+
|
|
107
|
+
update() {
|
|
108
|
+
const index = this.index;
|
|
109
|
+
if (index < 0 || index >= this.slices.length)
|
|
110
|
+
return;
|
|
111
|
+
const slice = this.slices[index];
|
|
112
|
+
let tex = this.sprite?.texture;
|
|
113
|
+
if (!tex) return;
|
|
114
|
+
tex.encoding = THREE.sRGBEncoding;
|
|
115
|
+
tex.offset.set(slice.offset.x, slice.offset.y);
|
|
116
|
+
// aniso > 1 makes the texture blurry
|
|
117
|
+
if (tex.minFilter == NearestFilter && tex.magFilter == NearestFilter)
|
|
118
|
+
tex.anisotropy = 1;
|
|
119
|
+
// tex.repeat.set(slice.size.x, -slice.size.y);
|
|
120
|
+
tex.needsUpdate = true;
|
|
66
121
|
}
|
|
67
122
|
}
|
|
68
123
|
|
|
124
|
+
|
|
69
125
|
export class SpriteRenderer extends Behaviour {
|
|
70
126
|
|
|
71
127
|
@serializable()
|
|
@@ -79,37 +135,69 @@ export class SpriteRenderer extends Behaviour {
|
|
|
79
135
|
@serializable(Material)
|
|
80
136
|
sharedMaterial?: THREE.Material;
|
|
81
137
|
|
|
82
|
-
|
|
83
|
-
|
|
138
|
+
@serializable(SpriteSheet)
|
|
139
|
+
get sprite(): SpriteSheet | undefined {
|
|
140
|
+
return this._spriteSheet;
|
|
84
141
|
}
|
|
85
|
-
set sprite(value:
|
|
86
|
-
if(value === this.
|
|
87
|
-
|
|
88
|
-
|
|
142
|
+
set sprite(value: SpriteSheet | undefined | number) {
|
|
143
|
+
if (value === this._spriteSheet) return;
|
|
144
|
+
if (typeof value === "number") {
|
|
145
|
+
const index = Math.floor(value);;
|
|
146
|
+
if (index === value)
|
|
147
|
+
this.spriteIndex = index;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this._spriteSheet = value;
|
|
152
|
+
this.updateSprite();
|
|
153
|
+
}
|
|
89
154
|
}
|
|
90
155
|
|
|
91
|
-
|
|
156
|
+
set spriteIndex(value: number) {
|
|
157
|
+
if (!this._spriteSheet) return;
|
|
158
|
+
this._spriteSheet.index = value;
|
|
159
|
+
this._spriteSheet.update();
|
|
160
|
+
}
|
|
161
|
+
get spriteIndex(): number {
|
|
162
|
+
return this._spriteSheet?.index ?? 0;
|
|
163
|
+
}
|
|
164
|
+
get spriteFrames(): number {
|
|
165
|
+
return this._spriteSheet?.slices.length ?? 0;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
private _spriteSheet?: SpriteSheet;
|
|
92
169
|
private _currentSprite?: THREE.Mesh;
|
|
93
170
|
|
|
94
171
|
awake(): void {
|
|
95
172
|
this._currentSprite = undefined;
|
|
173
|
+
if(debug) {
|
|
174
|
+
console.log("Awake", this.name, this, this.sprite?.sprite?.texture);
|
|
175
|
+
if(this.sprite?.sprite?.texture)
|
|
176
|
+
console.log(this.sprite.sprite.texture.minFilter.toString(), this.sprite.sprite.texture.magFilter.toString());
|
|
177
|
+
}
|
|
96
178
|
}
|
|
97
179
|
|
|
98
180
|
start() {
|
|
99
|
-
if (this.drawMode === SpriteDrawMode.Tiled) {
|
|
100
|
-
console.warn("Tiled draw mode is not supported yet", this);
|
|
101
|
-
}
|
|
102
181
|
if (!this._currentSprite)
|
|
103
182
|
this.updateSprite();
|
|
104
183
|
else if (this.gameObject)
|
|
105
184
|
this.gameObject.add(this._currentSprite);
|
|
106
185
|
}
|
|
107
186
|
|
|
187
|
+
// frame : number = 0;
|
|
188
|
+
// update(){
|
|
189
|
+
// // const frameRate = 12;
|
|
190
|
+
// // this.frame += frameRate * this.context.time.deltaTime;
|
|
191
|
+
// // if(this.frame >= this.spriteFrames)
|
|
192
|
+
// // this.frame = 0;
|
|
193
|
+
// // this.spriteIndex = Math.floor(this.frame);
|
|
194
|
+
// // console.log(this.spriteIndex);
|
|
195
|
+
// }
|
|
196
|
+
|
|
108
197
|
private updateSprite() {
|
|
109
198
|
if (!this.__didAwake) return;
|
|
110
|
-
if (!this.sprite) return;
|
|
111
|
-
|
|
112
|
-
|
|
199
|
+
if (!this.sprite?.sprite) return;
|
|
200
|
+
const sprite = this.sprite.sprite;
|
|
113
201
|
if (!this._currentSprite) {
|
|
114
202
|
const mat = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide });
|
|
115
203
|
if (!mat) return;
|
|
@@ -120,17 +208,23 @@ export class SpriteRenderer extends Behaviour {
|
|
|
120
208
|
}
|
|
121
209
|
mat.alphaTest = 0.5;
|
|
122
210
|
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
//
|
|
126
|
-
|
|
211
|
+
if (sprite.texture && !mat.wireframe) {
|
|
212
|
+
let tex = sprite.texture;
|
|
213
|
+
// the sprite renderer modifies the textue offset
|
|
214
|
+
// so we need to clone the texture
|
|
215
|
+
// if the same texture is used multiple times
|
|
216
|
+
if (tex[$spriteTexOwner] !== undefined && tex[$spriteTexOwner] !== this && this.spriteFrames > 1) {
|
|
217
|
+
tex = sprite!.texture = tex.clone();
|
|
218
|
+
}
|
|
219
|
+
tex[$spriteTexOwner] = this;
|
|
220
|
+
mat["map"] = tex;
|
|
127
221
|
}
|
|
128
|
-
|
|
129
|
-
this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(
|
|
222
|
+
this.sharedMaterial = mat;
|
|
223
|
+
this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(sprite), mat);
|
|
130
224
|
}
|
|
131
225
|
else {
|
|
132
|
-
this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(
|
|
133
|
-
this._currentSprite.material["map"] =
|
|
226
|
+
this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(sprite);
|
|
227
|
+
this._currentSprite.material["map"] = sprite.texture;
|
|
134
228
|
}
|
|
135
229
|
|
|
136
230
|
if (this._currentSprite.parent !== this.gameObject) {
|
|
@@ -139,5 +233,7 @@ export class SpriteRenderer extends Behaviour {
|
|
|
139
233
|
if (this.gameObject)
|
|
140
234
|
this.gameObject.add(this._currentSprite);
|
|
141
235
|
}
|
|
236
|
+
|
|
237
|
+
this._spriteSheet?.update();
|
|
142
238
|
}
|
|
143
239
|
}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Object3D } from "three";
|
|
2
|
+
import { IGameObject } from "../engine/engine_types";
|
|
3
|
+
import { getParam } from "../engine/engine_utils";
|
|
4
|
+
import { Behaviour, GameObject } from "./Component";
|
|
5
|
+
import { BoxGizmo } from "./Gizmos";
|
|
2
6
|
|
|
7
|
+
const debug = getParam("debugrig");
|
|
3
8
|
|
|
4
9
|
export class XRRig extends Behaviour {
|
|
5
10
|
awake(): void {
|
|
6
11
|
// const helper = new AxesHelper(.1);
|
|
7
12
|
// this.gameObject.add(helper);
|
|
13
|
+
if (debug) {
|
|
14
|
+
const gizmoObj = new Object3D() as IGameObject;
|
|
15
|
+
gizmoObj.position.y += .5;
|
|
16
|
+
this.gameObject.add(gizmoObj);
|
|
17
|
+
const gizmo = gizmoObj.addNewComponent(BoxGizmo);
|
|
18
|
+
if (gizmo)
|
|
19
|
+
gizmo.isGizmo = false;
|
|
20
|
+
}
|
|
8
21
|
}
|
|
9
22
|
}
|
|
@@ -85,6 +85,7 @@ export { SpatialTriggerReceiver } from "../SpatialTrigger";
|
|
|
85
85
|
export { SpatialTrigger } from "../SpatialTrigger";
|
|
86
86
|
export { SpectatorCamera } from "../SpectatorCamera";
|
|
87
87
|
export { Sprite } from "../SpriteRenderer";
|
|
88
|
+
export { SpriteSheet } from "../SpriteRenderer";
|
|
88
89
|
export { SpriteRenderer } from "../SpriteRenderer";
|
|
89
90
|
export { SyncedCamera } from "../SyncedCamera";
|
|
90
91
|
export { SyncedRoom } from "../SyncedRoom";
|
|
@@ -309,6 +309,11 @@ export class PlayableDirector extends Behaviour {
|
|
|
309
309
|
if (debug)
|
|
310
310
|
console.log("Resolved binding", binding, "to", obj);
|
|
311
311
|
track.outputs[i] = obj;
|
|
312
|
+
if(obj instanceof Animator) {
|
|
313
|
+
// TODO: should disable? animator but this is not the animator that is currently on the object? needs investigation
|
|
314
|
+
// console.log("DISABLE ANIMATOR", obj, obj.name, binding, this._guidsMap);
|
|
315
|
+
// obj.enabled = false;
|
|
316
|
+
}
|
|
312
317
|
}
|
|
313
318
|
}
|
|
314
319
|
else if (binding === null) {
|