-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgameHelpers.js
More file actions
135 lines (119 loc) · 3.72 KB
/
Copy pathgameHelpers.js
File metadata and controls
135 lines (119 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const activeFile = dc.resolvePath("GAME ENGINE BUILD") || "_RESOURCES/DATACORE/_DONE/GAME ENGINE BUILD/GAME ENGINE BUILD";
const outerFolderPath = activeFile.substring(0, activeFile.lastIndexOf('/'));
let helpers = null;
async function getHelpers() {
if (!helpers) {
helpers = await dc.require(outerFolderPath + "/src/utils/webglHelpers.js");
}
return helpers;
}
/** Spawns a new object in front of the character. */
function spawnObject(type, characterState, cameraState, addedObjects) {
const charPos = characterState.current.pos;
const forward = {
x: Math.sin(cameraState.current.yaw),
z: Math.cos(cameraState.current.yaw)
};
const spawnOffset = 2;
let baseOffset;
if (type === "pyramid") {
baseOffset = 1.0;
} else if (type === "pane") {
baseOffset = 0.5;
} else {
baseOffset = 0.5;
}
const newObject = {
type,
pos: {
x: charPos.x + forward.x * spawnOffset,
y: baseOffset,
z: charPos.z + forward.z * spawnOffset
},
rotation: 0,
scale: { x: 1.0, y: 1.0, z: 1.0 },
baseYOffset: baseOffset,
lottieSrc: null,
texture: null,
viewLoaded: false,
viewContainer: null
};
addedObjects.current.push(newObject);
}
/** Helper that returns a canvas element from a DOM node. */
async function getSourceCanvas(viewContainer) {
if (!viewContainer) return null;
if (viewContainer instanceof HTMLCanvasElement) {
return viewContainer;
}
const existingCanvas = viewContainer.querySelector('canvas');
if (existingCanvas) return existingCanvas;
if (window.html2canvas) {
try {
const capturedCanvas = await window.html2canvas(viewContainer);
return capturedCanvas;
} catch (err) {
console.error("html2canvas capture failed:", err);
return null;
}
} else {
console.error("html2canvas library is not loaded.");
return null;
}
}
async function updateViewTexture(gl, obj) {
const { isPowerOf2 } = await getHelpers();
const sourceCanvas = obj.viewContainer.querySelector("canvas");
if (!sourceCanvas) {
console.error("updateViewTexture: No valid canvas element found within the view container.");
return;
}
gl.bindTexture(gl.TEXTURE_2D, obj.texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
try {
gl.texImage2D(
gl.TEXTURE_2D,
0,
gl.RGBA,
gl.RGBA,
gl.UNSIGNED_BYTE,
sourceCanvas
);
} catch (err) {
console.error("updateViewTexture: texImage2D error:", err);
return;
}
if (isPowerOf2(sourceCanvas.width) && isPowerOf2(sourceCanvas.height)) {
gl.generateMipmap(gl.TEXTURE_2D);
} else {
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
}
function isLottieMedia(url) {
if (!url) return false;
const baseUrl = url.split("?")[0];
return baseUrl.toLowerCase().endsWith(".json");
}
async function updateLottieTexture(gl, obj) {
const { isPowerOf2 } = await getHelpers();
if (!obj.offscreenCanvas) return;
gl.bindTexture(gl.TEXTURE_2D, obj.texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, obj.offscreenCanvas);
if (isPowerOf2(obj.offscreenCanvas.width) && isPowerOf2(obj.offscreenCanvas.height)) {
gl.generateMipmap(gl.TEXTURE_2D);
} else {
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
}
return {
spawnObject,
getSourceCanvas,
updateViewTexture,
isLottieMedia,
updateLottieTexture
};