UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

549 lines (548 loc) 16 kB
"use strict"; import { Box3, Color, Vector2, Vector3, Vector4, Plane, Ray, Sphere, Quaternion, Matrix4, Euler } from "three"; import { isBoolean, isNumber, isString } from "../../../../../core/Type"; import { TypeAssert } from "../../../../poly/Assert"; import { JsConnectionPointType, JsConnectionPointTypeFromArrayTypeMap } from "../../../utils/io/connections/Js"; export class PrimitiveArray { constructor(_elements) { this._elements = _elements; this.isPrimitiveArray = true; } elements() { return this._elements; } clone() { return this._elements.map((v) => v); } } export class VectorArray { constructor(_elements) { this._elements = _elements; this.isVectorArray = true; } elements() { return this._elements; } clone() { return this._elements.map((v) => v.clone()); } } export function createVariable(type) { switch (type) { case JsConnectionPointType.BOOLEAN: case JsConnectionPointType.INT: case JsConnectionPointType.FLOAT: case JsConnectionPointType.STRING: { return null; } case JsConnectionPointType.COLOR: { return new Color(); } case JsConnectionPointType.EULER: { return new Euler(); } case JsConnectionPointType.MATRIX4: { return new Matrix4(); } case JsConnectionPointType.QUATERNION: { return new Quaternion(); } case JsConnectionPointType.VECTOR2: { return new Vector2(); } case JsConnectionPointType.VECTOR3: { return new Vector3(); } case JsConnectionPointType.VECTOR4: { return new Vector4(); } case JsConnectionPointType.BOX3: { return new Box3(); } case JsConnectionPointType.PLANE: { return new Plane(); } case JsConnectionPointType.RAY: { return new Ray(); } case JsConnectionPointType.SPHERE: { return new Sphere(); } case JsConnectionPointType.BOOLEAN_ARRAY: case JsConnectionPointType.FLOAT_ARRAY: case JsConnectionPointType.INT_ARRAY: case JsConnectionPointType.STRING_ARRAY: { return createPrimitiveArray(type); } case JsConnectionPointType.MATRIX4_ARRAY: case JsConnectionPointType.QUATERNION_ARRAY: case JsConnectionPointType.TEXTURE_ARRAY: case JsConnectionPointType.COLOR_ARRAY: case JsConnectionPointType.EULER_ARRAY: case JsConnectionPointType.OBJECT_3D_ARRAY: case JsConnectionPointType.VECTOR2_ARRAY: case JsConnectionPointType.VECTOR3_ARRAY: case JsConnectionPointType.VECTOR4_ARRAY: { return createVectorArray(type); } case JsConnectionPointType.ANIMATION_MIXER: case JsConnectionPointType.ANIMATION_ACTION: case JsConnectionPointType.CAMERA: case JsConnectionPointType.CATMULL_ROM_CURVE3: case JsConnectionPointType.INTERSECTION: case JsConnectionPointType.INTERSECTION_ARRAY: case JsConnectionPointType.MATERIAL: case JsConnectionPointType.NODE: case JsConnectionPointType.OBJECT_3D: case JsConnectionPointType.PARAM: case JsConnectionPointType.TEXTURE: case JsConnectionPointType.TEXTURE_ARRAY: case JsConnectionPointType.TRIGGER: { return null; } } console.warn("createVariable not implemented with type", type); TypeAssert.unreachable(type); } export function createPrimitiveArray(type) { type = JsConnectionPointTypeFromArrayTypeMap[type]; switch (type) { case JsConnectionPointType.BOOLEAN: { return new PrimitiveArray([false]); } case JsConnectionPointType.INT: { return new PrimitiveArray([0]); } case JsConnectionPointType.FLOAT: { return new PrimitiveArray([0]); } case JsConnectionPointType.STRING: { return new PrimitiveArray([""]); } } console.warn("createPrimitiveArray not implemented for type:", type); return new PrimitiveArray([0]); } export function createVectorArray(type) { type = JsConnectionPointTypeFromArrayTypeMap[type]; switch (type) { case JsConnectionPointType.COLOR: { return new VectorArray([new Color()]); } case JsConnectionPointType.EULER: { return new VectorArray([new Euler()]); } case JsConnectionPointType.MATRIX4: { return new VectorArray([new Matrix4()]); } case JsConnectionPointType.QUATERNION: { return new VectorArray([new Quaternion()]); } case JsConnectionPointType.VECTOR2: { return new VectorArray([new Vector2()]); } case JsConnectionPointType.VECTOR3: { return new VectorArray([new Vector3()]); } case JsConnectionPointType.VECTOR4: { return new VectorArray([new Vector4()]); } } console.warn("createVectorArray not implemented for type:", type); return new VectorArray([new Vector4()]); } export var SerializedVariableType = /* @__PURE__ */ ((SerializedVariableType2) => { SerializedVariableType2["Box3"] = "Box3"; SerializedVariableType2["Color"] = "Color"; SerializedVariableType2["Euler"] = "Euler"; SerializedVariableType2["Matrix4"] = "Matrix4"; SerializedVariableType2["Plane"] = "Plane"; SerializedVariableType2["Quaternion"] = "Quaternion"; SerializedVariableType2["Ray"] = "Ray"; SerializedVariableType2["Sphere"] = "Sphere"; SerializedVariableType2["Vector2"] = "Vector2"; SerializedVariableType2["Vector3"] = "Vector3"; SerializedVariableType2["Vector4"] = "Vector4"; SerializedVariableType2["boolean_Array"] = "boolean[]"; SerializedVariableType2["number_Array"] = "number[]"; SerializedVariableType2["string_Array"] = "string[]"; SerializedVariableType2["Color_Array"] = "Color[]"; SerializedVariableType2["Euler_Array"] = "Euler[]"; SerializedVariableType2["Matrix4_Array"] = "Matrix4[]"; SerializedVariableType2["Quaternion_Array"] = "Quaternion[]"; SerializedVariableType2["Vector2_Array"] = "Vector2[]"; SerializedVariableType2["Vector3_Array"] = "Vector3[]"; SerializedVariableType2["Vector4_Array"] = "Vector4[]"; return SerializedVariableType2; })(SerializedVariableType || {}); export function isVariableSerializable(variable) { if (variable instanceof Box3 || variable instanceof Color || variable instanceof Euler || variable instanceof Matrix4 || variable instanceof Plane || variable instanceof Quaternion || variable instanceof Ray || variable instanceof Sphere || variable instanceof Vector2 || variable instanceof Vector3 || variable instanceof Vector4 || variable instanceof PrimitiveArray || variable instanceof VectorArray) { return true; } else { console.warn("not serializable", variable); return false; } } export function serializeVariable(variable) { if (variable instanceof Box3) { const data2 = { type: "Box3" /* Box3 */, data: { min: variable.min.toArray(), max: variable.min.toArray() } }; return data2; } if (variable instanceof Color) { const data2 = { type: "Color" /* Color */, data: variable.toArray() }; return data2; } if (variable instanceof Euler) { const data2 = { type: "Euler" /* Euler */, data: { rotation: variable.toArray(), rotationOrder: variable.order } }; return data2; } if (variable instanceof Matrix4) { const data2 = { type: "Matrix4" /* Matrix4 */, data: variable.toArray() }; return data2; } if (variable instanceof Plane) { const data2 = { type: "Plane" /* Plane */, data: { normal: variable.normal.toArray(), constant: variable.constant } }; return data2; } if (variable instanceof Quaternion) { const data2 = { type: "Quaternion" /* Quaternion */, data: variable.toArray() }; return data2; } if (variable instanceof Ray) { const data2 = { type: "Ray" /* Ray */, data: { origin: variable.origin.toArray(), direction: variable.direction.toArray() } }; return data2; } if (variable instanceof Sphere) { const data2 = { type: "Sphere" /* Sphere */, data: { center: variable.center.toArray(), radius: variable.radius } }; return data2; } if (variable instanceof Vector2) { const data2 = { type: "Vector2" /* Vector2 */, data: variable.toArray() }; return data2; } if (variable instanceof Vector3) { const data2 = { type: "Vector3" /* Vector3 */, data: variable.toArray() }; return data2; } if (variable instanceof Vector4) { const data2 = { type: "Vector4" /* Vector4 */, data: variable.toArray() }; return data2; } if (variable.isPrimitiveArray) { const elements = variable.elements(); const firstElement = elements[0]; if (isBoolean(firstElement)) { const data2 = { type: "boolean[]" /* boolean_Array */, data: elements.map((v) => v) }; return data2; } if (isNumber(firstElement)) { const data2 = { type: "number[]" /* number_Array */, data: elements.map((v) => v) }; return data2; } if (isString(firstElement)) { const data2 = { type: "string[]" /* string_Array */, data: elements.map((v) => v) }; return data2; } } if (variable.isVectorArray) { const elements = variable.elements(); const firstElement = elements[0]; if (firstElement instanceof Color) { const data2 = { type: "Color[]" /* Color_Array */, data: elements.map((v) => v.toArray()) }; return data2; } if (firstElement instanceof Euler) { const data2 = { type: "Euler[]" /* Euler_Array */, data: elements.map((v) => ({ rotation: v.toArray(), rotationOrder: v.order })) }; return data2; } if (firstElement instanceof Matrix4) { const data2 = { type: "Matrix4[]" /* Matrix4_Array */, data: elements.map((v) => v.toArray()) }; return data2; } if (firstElement instanceof Quaternion) { const data2 = { type: "Quaternion[]" /* Quaternion_Array */, data: elements.map((v) => v.toArray()) }; return data2; } if (firstElement instanceof Vector2) { const data2 = { type: "Vector2[]" /* Vector2_Array */, data: elements.map((v) => v.toArray()) }; return data2; } if (firstElement instanceof Vector3) { const data2 = { type: "Vector3[]" /* Vector3_Array */, data: elements.map((v) => v.toArray()) }; return data2; } if (firstElement instanceof Vector4) { const data2 = { type: "Vector4[]" /* Vector4_Array */, data: elements.map((v) => v.toArray()) }; return data2; } console.log("array variable serialization not implemeted", variable, firstElement); } console.log("variable serialization not implemeted", variable); const data = { type: "Vector3" /* Vector3 */, data: new Vector3().toArray() }; return data; } export function deserializeVariable(serialized) { const type = serialized.type; switch (type) { case "Box3" /* Box3 */: { const data = serialized.data; const box3 = new Box3(); box3.min.set(data.min[0], data.min[1], data.min[2]); box3.max.set(data.max[0], data.max[1], data.max[2]); return box3; } case "Color" /* Color */: { const data = serialized.data; const color = new Color(); color.r = data[0]; color.g = data[1]; color.b = data[2]; return color; } case "Euler" /* Euler */: { const data = serialized.data; const euler = new Euler(data.rotation[0], data.rotation[1], data.rotation[2], data.rotationOrder); return euler; } case "Matrix4" /* Matrix4 */: { const data = serialized.data; const matrix = new Matrix4(); matrix.set(...data); return matrix; } case "Plane" /* Plane */: { const data = serialized.data; const plane = new Plane(); plane.normal.set(...data.normal); plane.constant = data.constant; return plane; } case "Quaternion" /* Quaternion */: { const data = serialized.data; const vector = new Quaternion(); vector.set(...data); return vector; } case "Ray" /* Ray */: { const data = serialized.data; const ray = new Ray(); ray.origin.set(...data.origin); ray.direction.set(...data.direction); return ray; } case "Sphere" /* Sphere */: { const data = serialized.data; const sphere = new Sphere(); sphere.center.set(...data.center); sphere.radius = data.radius; return sphere; } case "Vector2" /* Vector2 */: { const data = serialized.data; const vector = new Vector2(); vector.set(...data); return vector; } case "Vector3" /* Vector3 */: { const data = serialized.data; const vector = new Vector3(); vector.set(...data); return vector; } case "Vector4" /* Vector4 */: { const data = serialized.data; const vector = new Vector4(); vector.set(...data); return vector; } case "boolean[]" /* boolean_Array */: { const data = serialized.data; const values = [...data]; const numberArray = new PrimitiveArray(values); return numberArray; } case "number[]" /* number_Array */: { const data = serialized.data; const values = [...data]; const numberArray = new PrimitiveArray(values); return numberArray; } case "string[]" /* string_Array */: { const data = serialized.data; const values = [...data]; const numberArray = new PrimitiveArray(values); return numberArray; } case "Color[]" /* Color_Array */: { const data = serialized.data; const vectors = data.map((d) => { const color = new Color(); color.r = d[0]; color.g = d[1]; color.b = d[2]; return color; }); const vectorArray = new VectorArray(vectors); return vectorArray; } case "Euler[]" /* Euler_Array */: { const data = serialized.data; const eulers = data.map((d) => { const euler = new Euler(d.rotation[0], d.rotation[1], d.rotation[2], d.rotationOrder); return euler; }); const vectorArray = new VectorArray(eulers); return vectorArray; } case "Matrix4[]" /* Matrix4_Array */: { const data = serialized.data; const vectors = data.map((d) => { const v = new Matrix4(); v.set(...d); return v; }); const vectorArray = new VectorArray(vectors); return vectorArray; } case "Quaternion[]" /* Quaternion_Array */: { const data = serialized.data; const vectors = data.map((d) => { const v = new Quaternion(); v.set(...d); return v; }); const vectorArray = new VectorArray(vectors); return vectorArray; } case "Vector2[]" /* Vector2_Array */: { const data = serialized.data; const vectors = data.map((d) => { const v = new Vector2(); v.set(...d); return v; }); const vectorArray = new VectorArray(vectors); return vectorArray; } case "Vector3[]" /* Vector3_Array */: { const data = serialized.data; const vectors = data.map((d) => { const v = new Vector3(); v.set(...d); return v; }); const vectorArray = new VectorArray(vectors); return vectorArray; } case "Vector4[]" /* Vector4_Array */: { const data = serialized.data; const vectors = data.map((d) => { const v = new Vector4(); v.set(...d); return v; }); const vectorArray = new VectorArray(vectors); return vectorArray; } } TypeAssert.unreachable(type); }