UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

97 lines (73 loc) 3.23 kB
import { GROUP_WITH_ANY } from "./constants/GROUP_WITH_ANY.js"; import { assert } from "../../../../core/assert.js"; import { ORIENT_PRESERVING } from "./constants/ORIENT_PRESERVING.js"; import { AddTriToGroup } from "./AddTriToGroup.js"; import { AssignRecur } from "./AssignRecur.js"; /** * * @param {STriInfo[]} pTriInfos * @param {SGroup[]} pGroups * @param {number[]|Int32Array} piGroupTrianglesBuffer * @param {number[]|Int32Array} piTriListIn * @param {number} iNrTrianglesIn * @return {number} */ export function Build4RuleGroups( pTriInfos, pGroups, piGroupTrianglesBuffer, piTriListIn, iNrTrianglesIn ) { const iNrMaxGroups = iNrTrianglesIn * 3; let iNrActiveGroups = 0; let iOffset = 0; for (let f=0; f < iNrTrianglesIn; f++) { const tri_info_f = pTriInfos[f]; for (let i = 0; i < 3; i++) { // if not assigned to a group if ((tri_info_f.iFlag & GROUP_WITH_ANY) === 0 && tri_info_f.AssignedGroup[i] === null) { const vert_index = piTriListIn[f * 3 + i]; assert.lessThan(iNrActiveGroups, iNrMaxGroups); const assigned_group = pGroups[iNrActiveGroups]; tri_info_f.AssignedGroup[i] = assigned_group; assigned_group.iVertexRepresentitive = vert_index; const bOrPre = (tri_info_f.iFlag & ORIENT_PRESERVING) !== 0; assigned_group.bOrientPreservering = bOrPre; assigned_group.iNrFaces = 0; assigned_group.pFaceIndices = new Int32Array(piGroupTrianglesBuffer.buffer, iOffset * 4); ++iNrActiveGroups; AddTriToGroup(assigned_group, f); const neigh_indexL = tri_info_f.FaceNeighbors[i]; const neigh_indexR = tri_info_f.FaceNeighbors[i > 0 ? (i - 1) : 2]; if (neigh_indexL >= 0) { // neighbor const bAnswer = AssignRecur( piTriListIn, pTriInfos, neigh_indexL, assigned_group ); assert(bAnswer || (bOrPre !== ((pTriInfos[neigh_indexL].iFlag & ORIENT_PRESERVING) !== 0)) ); } if (neigh_indexR >= 0) { // neighbor const bAnswer = AssignRecur( piTriListIn, pTriInfos, neigh_indexR, assigned_group ); assert(bAnswer || bOrPre !== ((pTriInfos[neigh_indexR].iFlag & ORIENT_PRESERVING) !== 0)); } // update offset iOffset += assigned_group.iNrFaces; // since the groups are disjoint a triangle can never // belong to more than 3 groups. Subsequently, something // is completely screwed if this assertion ever hits. assert.lessThanOrEqual(iOffset, iNrMaxGroups); } } } return iNrActiveGroups; }