UNPKG

@xtor/cga.js

Version:

Xtor Compute Geometry Algorithm Libary 计算几何算法库

69 lines (60 loc) 1.83 kB
import { Vector3 } from "../math/Vector3"; import { Vector2 } from "../math/Vector2"; export function indexable(obj, refIndexInfo = { index: 0 }, force = false) { if (obj instanceof Array) { for (var i = 0; i < obj.length; i++) indexable(obj[i], refIndexInfo); } else if (obj instanceof Object) { if (obj.index === undefined) obj.index = refIndexInfo.index++; else if (force) obj.index = refIndexInfo.index++; } } export function triangListToBuffer(vertices, triangleList) { indexable(triangleList); var indices = []; triangleList.forall((v) => { indices.push(v.index); }) return toBuffer(vertices, indices); } /** * * @param {Array<Verctor3|Number>} vertices * @param {Array<Number>} indices * @param {Array<Verctor2|Number>} uvs */ export function toBuffer(inVertices, indices, inUvs = []) { var vertices = [] if (Vector3.isVector3(inVertices[0])) { for (let i = 0; i < inVertices.length; i++) { const v = inVertices[i]; vertices.push(v.x, v.y, v.z); } } else { vertices = inVertices; } var uvs = [] if (inUvs.length > 0 && Vector2.isVector2(inUvs[0])) { for (let i = 0; i < inUvs.length; i++) { const uv = inVertices[i]; uvs.push(uv.x, uv.y); } } else { uvs = inUvs; } var verticesBuffer = new Float32Array(vertices); var uvsBuffer = new Float32Array(uvs.length === 0 ? vertices.length / 3 * 2 : uvs); var indicesBuffer = new ((verticesBuffer.length / 3) > 65535 ? Uint32Array : Uint16Array)(indices); return { verticesBuffer, uvsBuffer, indicesBuffer }; }