UNPKG

vim-webgl-component

Version:

A demonstration app built on top of the vim-webgl-viewer

105 lines (104 loc) 4.96 kB
"use strict"; /** * @module vim-ts */ Object.defineProperty(exports, "__esModule", { value: true }); exports.G3dScene = exports.SceneAttributes = void 0; const g3d_1 = require("./g3d"); /** * See https://github.com/vimaec/vim#vim-geometry-attributes */ class SceneAttributes { } exports.SceneAttributes = SceneAttributes; SceneAttributes.chunkCount = 'g3d:chunk:count:0:int32:1'; SceneAttributes.instanceMesh = 'g3d:instance:mesh:0:int32:1'; SceneAttributes.instanceMatrix = 'g3d:instance:transform:0:float32:16'; SceneAttributes.instanceNodes = 'g3d:instance:node:0:int32:1'; SceneAttributes.instanceGroups = 'g3d:instance:group:0:int32:1'; SceneAttributes.instanceTags = 'g3d:instance:tag:0:int64:1'; SceneAttributes.instanceFlags = 'g3d:instance:tag:0:uint16:1'; SceneAttributes.instanceMins = 'g3d:instance:min:0:float32:3'; SceneAttributes.instanceMaxs = 'g3d:instance:max:0:float32:3'; SceneAttributes.meshChunk = 'g3d:mesh:chunk:0:int32:1'; SceneAttributes.meshChunkIndices = 'g3d:mesh:chunkindex:0:int32:1'; SceneAttributes.meshIndexCounts = 'g3d:mesh:indexcount:0:int32:1'; SceneAttributes.meshVertexCounts = 'g3d:mesh:vertexcount:0:int32:1'; SceneAttributes.meshOpaqueIndexCount = "g3d:mesh:opaqueindexcount:0:int32:1"; SceneAttributes.meshOpaqueVertexCount = "g3d:mesh:opaquevertexcount:0:int32:1"; /** * Represents the index, as in book index, of a collection of G3dMesh. * Allows to find and download G3dMesh as needed. * Allows to preallocate geometry to render G3dMeshes. */ class G3dScene { constructor(chunkCount, instanceMeshes, instanceMatrices, instanceNodes, instanceGroups, instanceTags, instanceFlags, instanceMins, instanceMaxs, meshChunks, meshChunkIndices, meshIndexCounts, meshVertexCounts, meshOpaqueIndexCounts, meshOpaqueVertexCounts) { this.chunkCount = chunkCount[0]; this.instanceMeshes = instanceMeshes; this.instanceMatrices = instanceMatrices; this.instanceNodes = instanceNodes; this.instanceGroups = instanceGroups; this.instanceTags = instanceTags; this.instanceFlags = instanceFlags; this.instanceMins = instanceMins; this.instanceMaxs = instanceMaxs; this.meshChunks = meshChunks; this.meshChunkIndices = meshChunkIndices; this.meshIndexCounts = meshIndexCounts; this.meshVertexCounts = meshVertexCounts; this.meshOpaqueIndexCounts = meshOpaqueIndexCounts; this.meshOpaqueVertexCounts = meshOpaqueVertexCounts; // Reverse instanceNodes this.nodeToInstance = new Map(); for (let i = 0; i < this.instanceNodes.length; i++) { this.nodeToInstance.set(this.instanceNodes[i], i); } } static async createFromBfast(bfast) { const values = await Promise.all([ bfast.getInt32Array(SceneAttributes.chunkCount), bfast.getInt32Array(SceneAttributes.instanceMesh), bfast.getFloat32Array(SceneAttributes.instanceMatrix), bfast.getInt32Array(SceneAttributes.instanceNodes), bfast.getInt32Array(SceneAttributes.instanceGroups), bfast.getBigInt64Array(SceneAttributes.instanceTags), bfast.getUint16Array(SceneAttributes.instanceFlags), bfast.getFloat32Array(SceneAttributes.instanceMins), bfast.getFloat32Array(SceneAttributes.instanceMaxs), bfast.getInt32Array(SceneAttributes.meshChunk), bfast.getInt32Array(SceneAttributes.meshChunkIndices), bfast.getInt32Array(SceneAttributes.meshIndexCounts), bfast.getInt32Array(SceneAttributes.meshVertexCounts), bfast.getInt32Array(SceneAttributes.meshOpaqueIndexCount), bfast.getInt32Array(SceneAttributes.meshOpaqueVertexCount), ]); return new G3dScene(...values); } getMeshCount() { return this.meshChunks.length; } getMeshIndexCount(mesh, section) { const all = this.meshIndexCounts[mesh]; if (section === 'all') return all; const opaque = this.meshOpaqueIndexCounts[mesh]; return section === 'opaque' ? opaque : all - opaque; } getMeshVertexCount(mesh, section) { const all = this.meshVertexCounts[mesh]; if (section === 'all') return all; const opaque = this.meshOpaqueVertexCounts[mesh]; return section === 'opaque' ? opaque : all - opaque; } getInstanceMin(instance) { return this.instanceMins.subarray(instance * g3d_1.G3d.POSITION_SIZE); } getInstanceMax(instance) { return this.instanceMaxs.subarray(instance * g3d_1.G3d.POSITION_SIZE); } getInstanceMatrix(instance) { return this.instanceMatrices.subarray(instance * g3d_1.G3d.MATRIX_SIZE, (instance + 1) * g3d_1.G3d.MATRIX_SIZE); } } exports.G3dScene = G3dScene;