@needle-tools/engine 2.26.0-pre → 2.27.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 +13 -0
- package/dist/needle-engine.d.ts +2 -8
- package/dist/needle-engine.js +37 -37
- package/dist/needle-engine.js.map +3 -3
- package/dist/needle-engine.min.js +9 -9
- package/dist/needle-engine.min.js.map +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.js +15 -4
- package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +1 -1
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
- package/lib/engine/extensions/extension_utils.js +6 -6
- package/lib/engine/extensions/extension_utils.js.map +1 -1
- package/lib/engine-components/AvatarLoader.d.ts +0 -3
- package/lib/engine-components/AvatarLoader.js +24 -53
- package/lib/engine-components/AvatarLoader.js.map +1 -1
- package/lib/engine-components/Component.js +10 -0
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +0 -2
- package/lib/engine-components/Renderer.js +0 -9
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/SmoothFollow.js +1 -1
- package/lib/engine-components/SmoothFollow.js.map +1 -1
- package/lib/engine-components/SpectatorCamera.d.ts +2 -3
- package/lib/engine-components/SpectatorCamera.js +50 -43
- package/lib/engine-components/SpectatorCamera.js.map +1 -1
- package/lib/engine-components/WebXRController.js +1 -0
- package/lib/engine-components/WebXRController.js.map +1 -1
- package/lib/engine-components/ui/BaseUIComponent.js +8 -5
- package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
- package/lib/engine-components/ui/Image.js +4 -0
- package/lib/engine-components/ui/Image.js.map +1 -1
- package/lib/engine-components/ui/RectTransform.js +1 -1
- package/lib/engine-components/ui/RectTransform.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/engine_serialization_builtin_serializer.ts +15 -3
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +1 -1
- package/src/engine/extensions/extension_utils.ts +6 -6
- package/src/engine-components/AvatarLoader.ts +24 -59
- package/src/engine-components/Component.ts +14 -3
- package/src/engine-components/Renderer.ts +0 -11
- package/src/engine-components/SmoothFollow.ts +1 -1
- package/src/engine-components/SpectatorCamera.ts +62 -48
- package/src/engine-components/WebXRController.ts +1 -0
- package/src/engine-components/ui/BaseUIComponent.ts +12 -5
- package/src/engine-components/ui/Image.ts +4 -0
- package/src/engine-components/ui/RectTransform.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../../../engine-components/ui/Image.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,MAAM;IAER,OAAO,CAAiB;IAExB,IAAI,CAAqC;CAC5C;AAHG;IADC,aAAa,CAAC,OAAO,CAAC;uCACC;AAK5B,MAAM,OAAO,KAAM,SAAQ,eAAe;IAGtC,MAAM,CAAU;IAER,eAAe;QACnB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAChC,KAAK,sBAAsB,CAAC;YAC5B,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACb,OAAO,IAAI,CAAC;SACnB;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,cAAc,CAAC,IAAS;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACzB;IACL,CAAC;IAES,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;
|
|
1
|
+
{"version":3,"file":"Image.js","sourceRoot":"","sources":["../../../../engine-components/ui/Image.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,MAAM;IAER,OAAO,CAAiB;IAExB,IAAI,CAAqC;CAC5C;AAHG;IADC,aAAa,CAAC,OAAO,CAAC;uCACC;AAK5B,MAAM,OAAO,KAAM,SAAQ,eAAe;IAGtC,MAAM,CAAU;IAER,eAAe;QACnB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAChC,KAAK,sBAAsB,CAAC;YAC5B,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACb,OAAO,IAAI,CAAC;SACnB;QACD,0FAA0F;QAC1F,0BAA0B;QAC1B,IAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE;YACtF,OAAO,IAAI,CAAC;QAChB,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,cAAc,CAAC,IAAS;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACzB;IACL,CAAC;IAES,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AA9BG;IADC,aAAa,CAAC,MAAM,CAAC;qCACN;AAgCpB,MAAM,OAAO,QAAS,SAAQ,eAAe;IAEzC,WAAW,CAAW;IAEZ,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,qBAAqB;QACrB,0BAA0B;QAC1B,qCAAqC;QACrC,2CAA2C;QAC3C,IAAI;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;CACJ;AAXG;IADC,aAAa,CAAC,OAAO,CAAC;6CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RectTransform.js","sourceRoot":"","sources":["../../../../engine-components/ui/RectTransform.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAS,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAElC,MAAM,OAAO,IAAI;IACb,KAAK,CAAU;IACf,MAAM,CAAU;CACnB;AAED,MAAM,OAAO,IAAI;IACb,CAAC,CAAU;IACX,CAAC,CAAU;IACX,KAAK,CAAU;IACf,MAAM,CAAU;CACnB;AAED,MAAM,OAAO,aAAc,SAAQ,eAAe;IAE9C,MAAM,GAAW,IAAI,CAAC;IAEtB,2BAA2B;IAC3B,oBAAoB;IAEpB,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,IAAI,KAAK,KAAoB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,iBAAiB,CAAW;IACpC,IAAY,gBAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAGD,IAAI,CAAQ;IAEZ,SAAS,CAAiB;IAE1B,kBAAkB,CAAiB;IAEnC,KAAK,CAAiB;IAEd,UAAU,CAAW;IACrB,SAAS,CAAY;IACrB,qBAAqB,GAAY,KAAK,CAAC;IAE/C,KAAK;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;QAAA,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEhC,mEAAmE;QACnE,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;QACpE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,QAAQ;QACJ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"RectTransform.js","sourceRoot":"","sources":["../../../../engine-components/ui/RectTransform.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.27.0-pre",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development, and can be deployed anywhere. It is flexible, extensible, and collaboration and XR come naturally.",
|
|
5
5
|
"main": "dist/needle-engine.js",
|
|
6
6
|
"module": "lib/needle-engine.js",
|
|
@@ -146,11 +146,23 @@ class ComponentSerializer extends TypeSerializer {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
findObjectForGuid(guid: string, root: THREE.Object3D): any {
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
// recursively search root
|
|
150
|
+
// need to check the root object too
|
|
151
|
+
if (root["guid"] === guid) return root;
|
|
152
|
+
|
|
153
|
+
const res = GameObject.foreachComponent(root, (c) => {
|
|
151
154
|
if (c.guid === guid) return c;
|
|
152
155
|
return undefined;
|
|
153
|
-
});
|
|
156
|
+
}, false);
|
|
157
|
+
if (res !== undefined)
|
|
158
|
+
return res;
|
|
159
|
+
|
|
160
|
+
// if not found, search in children
|
|
161
|
+
for (let i = 0; i < root.children.length; i++) {
|
|
162
|
+
const child = root.children[i];
|
|
163
|
+
const res = this.findObjectForGuid(guid, child);
|
|
164
|
+
if (res) return res;
|
|
165
|
+
}
|
|
154
166
|
}
|
|
155
167
|
}
|
|
156
168
|
export const componentSerializer = new ComponentSerializer();
|
|
@@ -392,7 +392,7 @@ export class NEEDLE_techniques_webgl implements GLTFLoaderPlugin {
|
|
|
392
392
|
for (const key in materialExtension.values) {
|
|
393
393
|
const val = materialExtension.values[key];
|
|
394
394
|
if (typeof val === "string") {
|
|
395
|
-
if (val.startsWith("textures/")) {
|
|
395
|
+
if (val.startsWith("/textures/")) {
|
|
396
396
|
const indexString = val.substring(9);
|
|
397
397
|
const texIndex = Number.parseInt(indexString);
|
|
398
398
|
if (texIndex >= 0) {
|
|
@@ -10,12 +10,13 @@ declare type DependencyInfo = {
|
|
|
10
10
|
dependencyName: string,
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
const rootExtensionPrefix = "/extensions/";
|
|
13
14
|
const defaultDependencies = [
|
|
14
|
-
{ prefix: "nodes/", dependencyName: "node" },
|
|
15
|
-
{ prefix: "meshes/", dependencyName: "mesh" },
|
|
16
|
-
{ prefix: "materials/", dependencyName: "material" },
|
|
17
|
-
{ prefix: "textures/", dependencyName: "texture" },
|
|
18
|
-
{ prefix: "animations/", dependencyName: "animation" }
|
|
15
|
+
{ prefix: "/nodes/", dependencyName: "node" },
|
|
16
|
+
{ prefix: "/meshes/", dependencyName: "mesh" },
|
|
17
|
+
{ prefix: "/materials/", dependencyName: "material" },
|
|
18
|
+
{ prefix: "/textures/", dependencyName: "texture" },
|
|
19
|
+
{ prefix: "/animations/", dependencyName: "animation" }
|
|
19
20
|
]
|
|
20
21
|
|
|
21
22
|
export async function resolveReferences(parser: GLTFParser, obj) {
|
|
@@ -93,7 +94,6 @@ function internalResolve(paths: DependencyInfo[], parser: GLTFParser, obj, promi
|
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
|
|
96
|
-
const rootExtensionPrefix = "extensions/";
|
|
97
97
|
function resolveExtension(parser: GLTFParser, str): Promise<void> | null {
|
|
98
98
|
if (parser && parser.plugins && typeof str === "string" && str.startsWith(rootExtensionPrefix)) {
|
|
99
99
|
let name = str.substring(rootExtensionPrefix.length);
|
|
@@ -31,26 +31,13 @@ export class AvatarModel {
|
|
|
31
31
|
// this.leftHand?.traverse(h => h.layers.set(2));
|
|
32
32
|
// this.rigthHand?.traverse(h => h.layers.set(2));
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
// createNewInstance(): AvatarModel {
|
|
36
|
-
// const head = GameObject.instantiate(this.head);
|
|
37
|
-
// const lh = GameObject.instantiate(this.leftHand);
|
|
38
|
-
// const rh = GameObject.instantiate(this.rigthHand);
|
|
39
|
-
// const model = new AvatarModel(this.root, head, lh, rh);
|
|
40
|
-
// this.assignRandomColors();
|
|
41
|
-
// return model;
|
|
42
|
-
// }
|
|
43
|
-
|
|
44
|
-
assignRandomColors() {
|
|
45
|
-
AvatarLoader.assignRandomPlayerColors(this);
|
|
46
|
-
}
|
|
47
34
|
}
|
|
48
35
|
|
|
49
36
|
export class AvatarLoader {
|
|
50
37
|
|
|
51
|
-
private readonly avatarRegistryUrl: string | null = null
|
|
38
|
+
private readonly avatarRegistryUrl: string | null = null;
|
|
52
39
|
// private loader: GLTFLoader | null;
|
|
53
|
-
private avatarModelCache: Map<string, AvatarModel | null> = new Map<string, AvatarModel | null>();
|
|
40
|
+
// private avatarModelCache: Map<string, AvatarModel | null> = new Map<string, AvatarModel | null>();
|
|
54
41
|
|
|
55
42
|
public async getOrCreateNewAvatarInstance(context: Context, avatarId: string | THREE.Object3D): Promise<AvatarModel | null> {
|
|
56
43
|
|
|
@@ -74,8 +61,7 @@ export class AvatarLoader {
|
|
|
74
61
|
return null;
|
|
75
62
|
}
|
|
76
63
|
const model = this.findAvatar(root);
|
|
77
|
-
//
|
|
78
|
-
model.assignRandomColors();
|
|
64
|
+
// model.assignRandomColors();
|
|
79
65
|
// this.cacheModel(avatarId, model);
|
|
80
66
|
|
|
81
67
|
if (model.isValid) {
|
|
@@ -166,19 +152,19 @@ export class AvatarLoader {
|
|
|
166
152
|
// some GLTFs have a "scene" root it seems, others don't, we skip the root here if there's only one child
|
|
167
153
|
if (searchIn.children.length == 1)
|
|
168
154
|
searchIn = obj.children[0];
|
|
169
|
-
let head = this.findAvatarPart(searchIn, "head");
|
|
155
|
+
let head = this.findAvatarPart(searchIn, ["head"]);
|
|
170
156
|
|
|
171
|
-
const leftHand = this.findAvatarPart(searchIn, "left");
|
|
172
|
-
const rightHand = this.findAvatarPart(searchIn, "right");
|
|
157
|
+
const leftHand = this.findAvatarPart(searchIn, ["left", "hand"]);
|
|
158
|
+
const rightHand = this.findAvatarPart(searchIn, ["right", "hand"]);
|
|
173
159
|
|
|
174
160
|
if (!head) {
|
|
175
161
|
// very last fallback, entire root is used as head
|
|
176
162
|
head = root;
|
|
177
163
|
|
|
178
164
|
// normalize size, if the object isn't properly setup the scale might be totally off
|
|
179
|
-
|
|
165
|
+
const boundsSize = new THREE.Vector3();
|
|
180
166
|
new THREE.Box3().setFromObject(head).getSize(boundsSize);
|
|
181
|
-
|
|
167
|
+
const maxAxis = Math.max(boundsSize.x, boundsSize.y, boundsSize.z);
|
|
182
168
|
console.warn("[Custom Avatar] " + "Normalizing head scale, it's too big: " + maxAxis + " meters! Should be < 0.3m");
|
|
183
169
|
if (maxAxis > 0.3) {
|
|
184
170
|
head.scale.multiplyScalar(1.0 / maxAxis * 0.3);
|
|
@@ -190,10 +176,22 @@ export class AvatarLoader {
|
|
|
190
176
|
}
|
|
191
177
|
|
|
192
178
|
|
|
193
|
-
private findAvatarPart(obj: THREE.Object3D, searchString: string): THREE.Object3D | null {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
179
|
+
private findAvatarPart(obj: THREE.Object3D, searchString: string[]): THREE.Object3D | null {
|
|
180
|
+
|
|
181
|
+
const name = obj.name.toLowerCase();
|
|
182
|
+
let matchesAll = true;
|
|
183
|
+
for (const str of searchString) {
|
|
184
|
+
if (!matchesAll) break;
|
|
185
|
+
if (name.indexOf(str) === -1)
|
|
186
|
+
matchesAll = false;
|
|
187
|
+
}
|
|
188
|
+
if (matchesAll) return obj;
|
|
189
|
+
|
|
190
|
+
if (obj.children) {
|
|
191
|
+
for (const child of obj.children) {
|
|
192
|
+
const found = this.findAvatarPart(child, searchString);
|
|
193
|
+
if (found) return found;
|
|
194
|
+
}
|
|
197
195
|
}
|
|
198
196
|
return null;
|
|
199
197
|
}
|
|
@@ -204,37 +202,4 @@ export class AvatarLoader {
|
|
|
204
202
|
}
|
|
205
203
|
return response;
|
|
206
204
|
}
|
|
207
|
-
|
|
208
|
-
public static assignRandomPlayerColors(model: AvatarModel) {
|
|
209
|
-
|
|
210
|
-
const foundMaterials: Map<string, THREE.Material> = new Map<string, THREE.Material>();
|
|
211
|
-
|
|
212
|
-
function findPlayerColorMeshesAndAssignColors(o) {
|
|
213
|
-
// console.log(o);
|
|
214
|
-
if (o.type === "Mesh") {
|
|
215
|
-
const mesh = o as THREE.Mesh;
|
|
216
|
-
const mat: THREE.Material = mesh.material as THREE.Material;
|
|
217
|
-
if (mat && mat.name) {
|
|
218
|
-
if (foundMaterials.has(mat.uuid)) {
|
|
219
|
-
const found = foundMaterials.get(mat.uuid);
|
|
220
|
-
if (found)
|
|
221
|
-
mesh.material = found;
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
if (mat.name.endsWith("_playercolor") || mat.name.endsWith("_player_color2")) {
|
|
225
|
-
const uuid = mat.uuid;
|
|
226
|
-
mesh.material = mat.clone();
|
|
227
|
-
mesh.material["color"] = new THREE.Color(Math.random(), Math.random(), Math.random());
|
|
228
|
-
foundMaterials.set(uuid, mesh.material);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (model.head)
|
|
234
|
-
model.head.traverse(findPlayerColorMeshesAndAssignColors);
|
|
235
|
-
if (model.leftHand)
|
|
236
|
-
model.leftHand.traverse(findPlayerColorMeshesAndAssignColors);
|
|
237
|
-
if (model.rigthHand)
|
|
238
|
-
model.rigthHand.traverse(findPlayerColorMeshesAndAssignColors);
|
|
239
|
-
}
|
|
240
205
|
}
|
|
@@ -680,6 +680,17 @@ abstract class GameObject extends THREE.Object3D implements THREE.Object3D {
|
|
|
680
680
|
}
|
|
681
681
|
|
|
682
682
|
|
|
683
|
+
// this is a fix to allow gameObject active animation be applied to a three object
|
|
684
|
+
Object.defineProperty(THREE.Object3D.prototype, "activeSelf", {
|
|
685
|
+
get: function () {
|
|
686
|
+
return this.visible;
|
|
687
|
+
},
|
|
688
|
+
set: function (val: boolean | number) {
|
|
689
|
+
const state = typeof val === "number" ? val > 0.5 : val;
|
|
690
|
+
this.visible = state;
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
|
|
683
694
|
|
|
684
695
|
THREE.Object3D.prototype["addNewComponent"] = function <T extends Behaviour>(type: ConstructorConcrete<T>) {
|
|
685
696
|
return GameObject.addNewComponent(this, type);
|
|
@@ -981,7 +992,7 @@ class Component implements EventTarget {
|
|
|
981
992
|
}
|
|
982
993
|
|
|
983
994
|
|
|
984
|
-
|
|
995
|
+
|
|
985
996
|
// EventTarget implementation:
|
|
986
997
|
|
|
987
998
|
private _eventListeners = new Map<string, EventListener[]>();
|
|
@@ -1021,12 +1032,12 @@ class Behaviour extends Component {
|
|
|
1021
1032
|
// when called from animationclip we receive numbers
|
|
1022
1033
|
// due to interpolation they can be anything between 0 and 1
|
|
1023
1034
|
if (typeof val === "number") {
|
|
1024
|
-
if(val >= 0.5) val = true;
|
|
1035
|
+
if (val >= 0.5) val = true;
|
|
1025
1036
|
else val = false;
|
|
1026
1037
|
}
|
|
1027
1038
|
|
|
1028
1039
|
if (val === this.__isEnabled) return;
|
|
1029
|
-
|
|
1040
|
+
|
|
1030
1041
|
this.__isEnabled = val;
|
|
1031
1042
|
// console.log(val);
|
|
1032
1043
|
// need to check here because codegen is calling this before everything is setup
|
|
@@ -171,17 +171,6 @@ export class Renderer extends Behaviour {
|
|
|
171
171
|
return lm !== null && lm !== undefined;
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
|
|
175
|
-
get activeSelf(): boolean {
|
|
176
|
-
return this.enabled;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
set activeSelf(val: boolean | number) {
|
|
180
|
-
const target = typeof val === "number" ? val > 0.5 : val;
|
|
181
|
-
this.enabled = target;
|
|
182
|
-
if (target) this.gameObject.visible = true;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
174
|
awake() {
|
|
186
175
|
const type = this.gameObject.type;
|
|
187
176
|
if (type === "Group") {
|
|
@@ -45,7 +45,7 @@ export class SmoothFollow extends Behaviour {
|
|
|
45
45
|
if (this.rotateFactor > 0) {
|
|
46
46
|
const wr = utils.getWorldQuaternion(this.target);
|
|
47
47
|
if(this.flipForward){
|
|
48
|
-
wr.
|
|
48
|
+
wr.premultiply(SmoothFollow._invertForward);
|
|
49
49
|
}
|
|
50
50
|
const frot = this._firstUpdate || hard ? 1 : Mathf.clamp01(this.context.time.deltaTime * this.rotateFactor);
|
|
51
51
|
this.worldQuaternion = this.worldQuaternion.slerp(wr, frot);
|
|
@@ -4,21 +4,22 @@ import * as THREE from "three";
|
|
|
4
4
|
import { OrbitControls } from "./OrbitControls";
|
|
5
5
|
import { WebXR, WebXREvent } from "./WebXR";
|
|
6
6
|
import { AvatarMarker } from "./WebXRAvatar";
|
|
7
|
-
import {
|
|
7
|
+
import { XRStateFlag } from "./XRFlag";
|
|
8
8
|
import { SmoothFollow } from "./SmoothFollow";
|
|
9
|
-
import { setWorldPosition, setWorldQuaternion, getWorldPosition, getWorldQuaternion } from "../engine/engine_three_utils";
|
|
9
|
+
import { setWorldPosition, setWorldQuaternion, getWorldPosition, getWorldQuaternion, lookAtInverse } from "../engine/engine_three_utils";
|
|
10
|
+
import { ArrayCamera } from "three";
|
|
11
|
+
import { KeyCode } from "../engine/engine_input";
|
|
10
12
|
|
|
11
13
|
export class SpectatorCamera extends Behaviour {
|
|
12
14
|
|
|
13
15
|
cam: Camera | null = null;
|
|
14
16
|
|
|
15
|
-
private _firstPersonMode: boolean | undefined =
|
|
17
|
+
private _firstPersonMode: boolean | undefined = true;
|
|
16
18
|
get firstPersonMode(): boolean {
|
|
17
|
-
return true;
|
|
18
19
|
return this._firstPersonMode ?? false;
|
|
19
20
|
}
|
|
20
|
-
set firstPersonMode(
|
|
21
|
-
|
|
21
|
+
set firstPersonMode(val: boolean) {
|
|
22
|
+
this._firstPersonMode = val;
|
|
22
23
|
// if (this._firstPersonMode) this.enableFirstPersonMode();
|
|
23
24
|
// else this.enableThirdPersonMode();
|
|
24
25
|
}
|
|
@@ -62,7 +63,6 @@ export class SpectatorCamera extends Behaviour {
|
|
|
62
63
|
private orbit: OrbitControls | null = null;
|
|
63
64
|
private firstPersonFollow: SmoothFollow | null = null;
|
|
64
65
|
private spectatorUIDomElement: HTMLElement | null = null;
|
|
65
|
-
private _avatar: AvatarMarker | null = null;
|
|
66
66
|
|
|
67
67
|
private eventSub_WebXRRequestStartEvent: Function | null = null;
|
|
68
68
|
private eventSub_WebXRStartEvent: Function | null = null;
|
|
@@ -72,14 +72,6 @@ export class SpectatorCamera extends Behaviour {
|
|
|
72
72
|
|
|
73
73
|
GameObject.setActive(this.gameObject, false);
|
|
74
74
|
|
|
75
|
-
const uiQuery = "#spectator-camera-ui";
|
|
76
|
-
this.spectatorUIDomElement = this.context.domElement.querySelector(uiQuery);
|
|
77
|
-
if (!this.spectatorUIDomElement) {
|
|
78
|
-
console.warn("Could not find spectator camera UI element", uiQuery);
|
|
79
|
-
}
|
|
80
|
-
this.spectatorUIDomElement?.classList.add("hidden");
|
|
81
|
-
|
|
82
|
-
|
|
83
75
|
if (!this.isSupportedPlatform()) {
|
|
84
76
|
console.log("Disable spectator cam", window.navigator.userAgent, this);
|
|
85
77
|
return;
|
|
@@ -93,6 +85,22 @@ export class SpectatorCamera extends Behaviour {
|
|
|
93
85
|
// this.cam = GameObject.addNewComponent(this.gameObject, Camera) as Camera;
|
|
94
86
|
}
|
|
95
87
|
|
|
88
|
+
const uiQuery = "#spectator-camera-ui";
|
|
89
|
+
this.spectatorUIDomElement = this.context.domElement.querySelector(uiQuery);
|
|
90
|
+
if (!this.spectatorUIDomElement) {
|
|
91
|
+
console.warn("Could not find spectator camera UI element", uiQuery);
|
|
92
|
+
// this.spectatorUIDomElement = document.createElement("div");
|
|
93
|
+
// this.spectatorUIDomElement.id = "spectator-camera-ui";
|
|
94
|
+
// this.spectatorUIDomElement.classList.add("desktop");
|
|
95
|
+
// this.context.domElement.appendChild(this.spectatorUIDomElement);
|
|
96
|
+
|
|
97
|
+
// const toggle = document.createElement("button");
|
|
98
|
+
// toggle.id = "toggle-spectator-view";
|
|
99
|
+
// this.spectatorUIDomElement.appendChild(toggle);
|
|
100
|
+
}
|
|
101
|
+
this.spectatorUIDomElement?.classList.add("hidden");
|
|
102
|
+
|
|
103
|
+
|
|
96
104
|
if (this.cam) {
|
|
97
105
|
this.cam.enabled = true;
|
|
98
106
|
this._orbitStartPos.copy(getWorldPosition(this.cam.cam));
|
|
@@ -189,53 +197,37 @@ export class SpectatorCamera extends Behaviour {
|
|
|
189
197
|
private onXRSessionStart(_evt) {
|
|
190
198
|
this._sessionHasStarted = true;
|
|
191
199
|
this.updateUI();
|
|
200
|
+
|
|
201
|
+
if (this.context.mainCamera) {
|
|
202
|
+
const cam = this.context.renderer.xr.getCamera(this.context.mainCamera) as ArrayCamera;
|
|
203
|
+
this.setupFollowMode(cam);
|
|
204
|
+
}
|
|
192
205
|
}
|
|
193
206
|
|
|
194
207
|
private onXRSessionEnded(_evt) {
|
|
195
208
|
this._sessionHasStarted = false;
|
|
209
|
+
this._firstPersonIsSetup = false;
|
|
196
210
|
this.spectatorUIDomElement?.classList.add("hidden");
|
|
197
211
|
GameObject.setActive(this.gameObject, false);
|
|
198
212
|
}
|
|
199
213
|
|
|
200
214
|
private _sessionHasStarted: boolean = false;
|
|
201
|
-
private _isFirstStart = true;
|
|
202
215
|
private _firstPersonIsSetup: boolean = false;
|
|
203
216
|
private _orbitStartPos: THREE.Vector3 = new THREE.Vector3();
|
|
204
217
|
private _orbitStartRot: THREE.Quaternion = new THREE.Quaternion();
|
|
205
218
|
private _orbitStartPos2: THREE.Vector3 = new THREE.Vector3();
|
|
206
219
|
private _orbitStartRot2: THREE.Quaternion = new THREE.Quaternion();
|
|
207
220
|
|
|
208
|
-
|
|
209
221
|
// TODO: only show Spectator cam for DesktopVR;
|
|
210
222
|
// don't show for AR, don't show on Quest
|
|
211
223
|
// TODO: properly align cameras on enter/exit VR, seems currently spectator cam breaks alignment
|
|
212
224
|
onAfterRender(): void {
|
|
213
225
|
if (!this.cam) return;
|
|
214
226
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if (this.firstPersonMode) {
|
|
220
|
-
if (!this._firstPersonIsSetup) {
|
|
221
|
-
if (!this._avatar || this._avatar?.destroyed) {
|
|
222
|
-
for (const av of AvatarMarker.instances) {
|
|
223
|
-
if (av.avatar && "isLocalAvatar" in av.avatar && av.avatar?.isLocalAvatar) {
|
|
224
|
-
this._avatar = av;
|
|
225
|
-
const head = av.avatar.head;
|
|
226
|
-
if (!head) continue;
|
|
227
|
-
this.setupFollowMode(head);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// else {
|
|
232
|
-
// if (this.context.mainCamera) {
|
|
233
|
-
// this.setupFollowMode(this.context.mainCamera, true);
|
|
234
|
-
// }
|
|
235
|
-
// }
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
227
|
+
if(this.context.input.isKeyDown(KeyCode.KEY_S))
|
|
228
|
+
this.firstPersonMode = !this.firstPersonMode;
|
|
229
|
+
|
|
230
|
+
this.updateFollowSettings();
|
|
239
231
|
|
|
240
232
|
const renderer = this.context.renderer;
|
|
241
233
|
const xrWasEnabled = renderer.xr.enabled;
|
|
@@ -295,20 +287,22 @@ export class SpectatorCamera extends Behaviour {
|
|
|
295
287
|
this.resetAvatarFlags();
|
|
296
288
|
}
|
|
297
289
|
|
|
298
|
-
private setupFollowMode(object: THREE.Object3D
|
|
290
|
+
private setupFollowMode(object: THREE.Object3D) {
|
|
299
291
|
if (!object) return;
|
|
300
292
|
if (!this.cam) return;
|
|
301
293
|
if (this._firstPersonIsSetup) return;
|
|
302
294
|
this._firstPersonIsSetup = true;
|
|
303
295
|
|
|
304
|
-
|
|
305
|
-
target.add(new THREE.AxesHelper());
|
|
296
|
+
|
|
306
297
|
this.firstPersonFollow = GameObject.addNewComponent(this.cam.gameObject, SmoothFollow);
|
|
298
|
+
|
|
299
|
+
const target = new THREE.Object3D();
|
|
300
|
+
object.add(target);
|
|
301
|
+
target.add(new THREE.AxesHelper(.2))
|
|
307
302
|
this.firstPersonFollow.target = target;
|
|
308
|
-
|
|
309
|
-
this.
|
|
310
|
-
|
|
311
|
-
if (flipForward) this.firstPersonFollow.flipForward = true;
|
|
303
|
+
|
|
304
|
+
this.updateFollowSettings();
|
|
305
|
+
|
|
312
306
|
const perspectiveCamera = this.context.mainCamera as THREE.PerspectiveCamera;
|
|
313
307
|
if (perspectiveCamera) {
|
|
314
308
|
this.cam.cam.near = perspectiveCamera.near;
|
|
@@ -318,6 +312,26 @@ export class SpectatorCamera extends Behaviour {
|
|
|
318
312
|
if (this.orbit) this.orbit.enabled = false;
|
|
319
313
|
}
|
|
320
314
|
|
|
315
|
+
private updateFollowSettings() {
|
|
316
|
+
const target = this.firstPersonFollow?.target;
|
|
317
|
+
if (!target || !this.firstPersonFollow) return;
|
|
318
|
+
if (this.firstPersonMode === false) {
|
|
319
|
+
this.firstPersonFollow.followFactor = 3;
|
|
320
|
+
this.firstPersonFollow.rotateFactor = 2;
|
|
321
|
+
this.firstPersonFollow.flipForward = false;
|
|
322
|
+
target.position.set(0, .5, 1.5);
|
|
323
|
+
target.quaternion.identity();
|
|
324
|
+
// lookAtInverse(target, new THREE.Vector3(0, 0, 0));
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
target.position.set(0, 0, 0);
|
|
328
|
+
target.quaternion.identity();
|
|
329
|
+
this.firstPersonFollow.followFactor = 12;
|
|
330
|
+
this.firstPersonFollow.rotateFactor = 5;
|
|
331
|
+
this.firstPersonFollow.flipForward = false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
321
335
|
private setAvatarFlagsBeforeRender() {
|
|
322
336
|
for (const av of AvatarMarker.instances) {
|
|
323
337
|
if (av.avatar && "isLocalAvatar" in av.avatar) {
|
|
@@ -249,6 +249,7 @@ export class WebXRController extends Behaviour {
|
|
|
249
249
|
this.webXR.Rig?.add(this.controller);
|
|
250
250
|
this.webXR.Rig?.add(this.raycastLine);
|
|
251
251
|
this.raycastLine?.add(this._raycastHitPoint);
|
|
252
|
+
this._raycastHitPoint.visible = false;
|
|
252
253
|
this.hand.add(this.handPointerModel);
|
|
253
254
|
console.log("ADDED TO RIG", this.webXR.Rig);
|
|
254
255
|
|
|
@@ -67,19 +67,26 @@ export class BaseUIComponent extends Behaviour {
|
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
// console.trace(container);
|
|
71
70
|
container.name = this.name + " (" + (this.constructor.name ?? "UI") + ")";
|
|
72
71
|
container.autoLayout = this._parentComponent.controlsChildLayout;
|
|
73
72
|
container.shadowComponentOwner = this;
|
|
74
|
-
|
|
73
|
+
|
|
74
|
+
// TODO: raycastTarget doesnt work anymore -> i think we need to set the gameObject layer and then check in the raycaster if the shadowComponentOwner is on the correct layer?!
|
|
75
|
+
// const raycastTarget = (this as unknown as IGraphic).raycastTarget;
|
|
76
|
+
// this.gameObject.layers.set(2)
|
|
77
|
+
|
|
78
|
+
|
|
75
79
|
// TODO: only traverse our own hierarchy, we can stop if we find another owner
|
|
76
80
|
container.traverse(c => {
|
|
77
|
-
if (c.shadowComponentOwner === undefined)
|
|
81
|
+
if (c.shadowComponentOwner === undefined) {
|
|
78
82
|
c.shadowComponentOwner = this;
|
|
79
|
-
if (raycastTarget === false) {
|
|
80
|
-
c.layers.set(2);
|
|
81
83
|
}
|
|
84
|
+
// // this makes text not render anymore when enabled again
|
|
85
|
+
// if (raycastTarget === false) {
|
|
86
|
+
// c.layers.set(2);
|
|
87
|
+
// }
|
|
82
88
|
})
|
|
89
|
+
|
|
83
90
|
if (this.Root?.gameObject === this.gameObject) {
|
|
84
91
|
this.gameObject.add(container);
|
|
85
92
|
}
|
|
@@ -22,6 +22,10 @@ export class Image extends MaskableGraphic {
|
|
|
22
22
|
case "Background":
|
|
23
23
|
return true;
|
|
24
24
|
}
|
|
25
|
+
// this is a hack/workaround for production builds where the name of the sprite is missing
|
|
26
|
+
// need to remove this!!!!
|
|
27
|
+
if(this.sprite?.texture?.image?.width === 32 && this.sprite?.texture?.image?.height === 32)
|
|
28
|
+
return true;
|
|
25
29
|
return false;
|
|
26
30
|
}
|
|
27
31
|
|