UNPKG

wonder.js

Version:
766 lines (743 loc) 26.4 kB
'use strict'; var Caml_array = require("bs-platform/lib/js/caml_array.js"); var BufferUtils$Wonderjs = require("../utils/BufferUtils.js"); var ArrayService$Wonderjs = require("../../service/atom/ArrayService.js"); var ConvertCommon$Wonderjs = require("./ConvertCommon.js"); var OptionService$Wonderjs = require("../../service/atom/OptionService.js"); var ArrayService$WonderCommonlib = require("wonder-commonlib/lib/js/src/ArrayService.js"); var ConvertCamerasSystem$Wonderjs = require("./ConvertCamerasSystem.js"); var ConvertMaterialsSystem$Wonderjs = require("./ConvertMaterialsSystem.js"); var ConvertTransformsSystem$Wonderjs = require("./ConvertTransformsSystem.js"); var ConvertMultiPrimitivesSystem$Wonderjs = require("./ConvertMultiPrimitivesSystem.js"); var MutableSparseMapService$WonderCommonlib = require("wonder-commonlib/lib/js/src/MutableSparseMapService.js"); function _getImageComponentType(param) { return 0; } function _addAccessorData(oldAccessorIndex, param, param$1) { var newBufferViewOffset = param[2]; var bufferViewDataArr = param[1]; var accessorBufferArr = param[0]; var oldAccessor = param$1[/* accessors */8][oldAccessorIndex]; var oldBufferView = param$1[/* bufferViews */7][OptionService$Wonderjs.unsafeGet(oldAccessor[/* bufferView */0])]; var byteLength = BufferUtils$Wonderjs.computeByteLengthByAccessorData(oldAccessor[/* count */2], oldAccessor[/* componentType */3], BufferUtils$Wonderjs.convertType(oldAccessor[/* type_ */4])); return /* tuple */[ byteLength, oldAccessor[/* componentType */3], accessorBufferArr.length, ArrayService$Wonderjs.push(/* record */[ /* bufferView */bufferViewDataArr.length, /* byteOffset */0, /* count */oldAccessor[/* count */2], /* componentType */oldAccessor[/* componentType */3], /* type_ */oldAccessor[/* type_ */4] ], accessorBufferArr), ArrayService$Wonderjs.push(/* tuple */[ /* record */[ /* buffer */0, /* byteOffset */BufferUtils$Wonderjs.unsafeGetAccessorByteOffset(oldAccessor) + BufferUtils$Wonderjs.unsafeGetBufferViewByteOffset(oldBufferView) | 0, /* byteLength */byteLength, /* byteStride */oldBufferView[/* byteStride */3] ], /* record */[ /* buffer */0, /* byteOffset */newBufferViewOffset, /* byteLength */byteLength, /* byteStride */oldBufferView[/* byteStride */3] ], BufferUtils$Wonderjs.alignedLength(byteLength) ], bufferViewDataArr), newBufferViewOffset + BufferUtils$Wonderjs.alignedLength(byteLength) | 0 ]; } function _addBufferViewData(oldBufferViewIndex, bufferViewDataArr, newBufferViewOffset, bufferViews) { var oldBufferView = bufferViews[oldBufferViewIndex]; var byteLength = oldBufferView[/* byteLength */2]; return /* tuple */[ byteLength, bufferViewDataArr.length, ArrayService$Wonderjs.push(/* tuple */[ oldBufferView, /* record */[ /* buffer */0, /* byteOffset */newBufferViewOffset, /* byteLength */byteLength, /* byteStride */oldBufferView[/* byteStride */3] ], BufferUtils$Wonderjs.alignedLength(byteLength) ], bufferViewDataArr), newBufferViewOffset + BufferUtils$Wonderjs.alignedLength(byteLength) | 0 ]; } function _computeDistance(param, param$1) { return Math.sqrt(Math.pow(param[0] - param$1[0], 2) + Math.pow(param[1] - param$1[1], 2) + Math.pow(param[2] - param$1[2], 2)); } function _sortNodesByActiveCameraNodeWorldPosition(activeCameraNodeIndex, transforms, gltf) { var nodes = gltf[/* nodes */10]; if (activeCameraNodeIndex !== undefined) { var worldPositionTransformArr = ConvertTransformsSystem$Wonderjs.computeWorldPositionTransforms(transforms, gltf); var activeCameraNodeWorldPosition = worldPositionTransformArr[activeCameraNodeIndex]; return nodes.map((function (node, i) { return /* tuple */[ node, i ]; })).sort((function (param, param$1) { var match = _computeDistance(Caml_array.caml_array_get(worldPositionTransformArr, param[1]), activeCameraNodeWorldPosition) < _computeDistance(Caml_array.caml_array_get(worldPositionTransformArr, param$1[1]), activeCameraNodeWorldPosition); if (match) { return -1; } else { return 1; } })).map((function (param) { return param[0]; })); } else { return nodes; } } function _addPrimitivePointData(param, param$1, gltf) { var match = _addAccessorData(param[0], /* tuple */[ param$1[1], param$1[2], param$1[3] ], gltf); var byteLength = match[0]; return /* tuple */[ byteLength, match[2], match[3], match[4], match[5], ArrayService$Wonderjs.push(/* record */[ /* byteLength */byteLength, /* index */param[1], /* type_ */param[2], /* componentType */match[1] ], param$1[0]) ]; } function _addPrimitiveOptionPointData(param, param$1, gltf) { var newBufferViewOffset = param$1[3]; var bufferViewDataArr = param$1[2]; var accessorBufferArr = param$1[1]; var streamChunkArr = param$1[0]; var pointData = param[0]; if (pointData !== undefined) { return _addPrimitivePointData(/* tuple */[ pointData, param[1], param[2] ], /* tuple */[ streamChunkArr, accessorBufferArr, bufferViewDataArr, newBufferViewOffset ], gltf); } else { return /* tuple */[ 0, undefined, accessorBufferArr, bufferViewDataArr, newBufferViewOffset, streamChunkArr ]; } } function _addPrimitiveData(mesh, primitive, param, gltf) { var attributes = primitive[/* attributes */0]; var match = _addPrimitivePointData(/* tuple */[ attributes[/* position */0], mesh, /* Vertex */0 ], /* tuple */[ param[2], param[0], param[1], param[3] ], gltf); var match$1 = _addPrimitiveOptionPointData(/* tuple */[ attributes[/* normal */1], mesh, /* Normal */1 ], /* tuple */[ match[5], match[2], match[3], match[4] ], gltf); var match$2 = _addPrimitiveOptionPointData(/* tuple */[ attributes[/* texCoord_0 */2], mesh, /* TexCoord */2 ], /* tuple */[ match$1[5], match$1[2], match$1[3], match$1[4] ], gltf); var match$3 = _addPrimitiveOptionPointData(/* tuple */[ primitive[/* indices */1], mesh, /* Index */3 ], /* tuple */[ match$2[5], match$2[2], match$2[3], match$2[4] ], gltf); return /* tuple */[ match$3[4], match$3[2], match$3[3], match$3[5], /* tuple */[ match[1], match$1[1], match$2[1], match$3[1] ] ]; } function _hasAddDataBefore(hasAddBeforeMap, key) { if (MutableSparseMapService$WonderCommonlib.has(key, hasAddBeforeMap)) { return MutableSparseMapService$WonderCommonlib.unsafeGet(key, hasAddBeforeMap) === true; } else { return false; } } function _addPBRImageData(diffuseTextureIndex, param, param$1, noneData) { var hasImageAddBeforeMap = param[4]; var newBufferViewOffset = param[3]; var streamChunkArr = param[2]; var bufferViewDataArr = param[1]; var match = param$1[2][diffuseTextureIndex]; var imageIndex = OptionService$Wonderjs.unsafeGet(match[/* source */1]); var match$1 = _hasAddDataBefore(hasImageAddBeforeMap, imageIndex); if (match$1) { return /* tuple */[ bufferViewDataArr, ArrayService$Wonderjs.push(/* record */[ /* byteLength */0, /* index */imageIndex, /* type_ : Image */4, /* componentType */0 ], streamChunkArr), undefined, newBufferViewOffset, undefined, hasImageAddBeforeMap ]; } else { var image = param$1[3][imageIndex]; var match$2 = _addBufferViewData(OptionService$Wonderjs.unsafeGet(image[/* bufferView */2]), bufferViewDataArr, newBufferViewOffset, param[0][/* bufferViews */7]); return /* tuple */[ match$2[2], ArrayService$Wonderjs.push(/* record */[ /* byteLength */match$2[0], /* index */imageIndex, /* type_ : Image */4, /* componentType */0 ], streamChunkArr), match$2[1], match$2[3], /* tuple */[ imageIndex, image ], MutableSparseMapService$WonderCommonlib.set(imageIndex, true, hasImageAddBeforeMap) ]; } } function _addMetallicRoughnessImageData(pbrMetallicRoughness, param, param$1, noneData) { if (pbrMetallicRoughness !== undefined) { var baseColorTexture = pbrMetallicRoughness[/* baseColorTexture */1]; if (baseColorTexture !== undefined) { return _addPBRImageData(baseColorTexture[/* index */0], /* tuple */[ param[0], param[1], param[2], param[3], param[4] ], /* tuple */[ param$1[0], param$1[1], param$1[2], param$1[3] ], noneData); } else { return noneData; } } else { return noneData; } } function _addSpecularGlossinessImageData(pbrSpecularGlossiness, param, param$1, noneData) { var match = pbrSpecularGlossiness[/* diffuseTexture */1]; if (match !== undefined) { return _addPBRImageData(match[/* index */0], /* tuple */[ param[0], param[1], param[2], param[3], param[4] ], /* tuple */[ param$1[0], param$1[1], param$1[2], param$1[3] ], noneData); } else { return noneData; } } function _addNewImage(newBufferViewIndex, imageData, newImages) { if (newImages !== undefined) { var newImages$1 = newImages; var tmp; if (newBufferViewIndex !== undefined && imageData !== undefined) { var match = imageData; var image = match[1]; newImages$1[match[0]] = /* record */[ /* uri */image[/* uri */0], /* name */image[/* name */1], /* bufferView */newBufferViewIndex, /* mimeType */image[/* mimeType */3] ]; tmp = newImages$1; } else { tmp = newImages$1; } return tmp; } else { return newImages; } } function _addImageData(lightMaterial, param, gltf) { var materials = gltf[/* materials */12]; var textures = gltf[/* textures */4]; var images = gltf[/* images */3]; var hasImageAddBeforeMap = param[3]; var newBufferViewOffset = param[2]; var streamChunkArr = param[1]; var bufferViewDataArr = param[0]; var noneData = /* tuple */[ bufferViewDataArr, streamChunkArr, undefined, newBufferViewOffset, undefined, hasImageAddBeforeMap ]; if (lightMaterial !== undefined && materials !== undefined && textures !== undefined && images !== undefined) { var images$1 = images; var textures$1 = textures; var materials$1 = materials; var lightMaterial$1 = lightMaterial; var match = materials$1[lightMaterial$1]; var extensions = match[/* extensions */2]; var pbrMetallicRoughness = match[/* pbrMetallicRoughness */0]; if (extensions !== undefined) { var khr_materials_pbrSpecularGlossiness = extensions[/* khr_materials_pbrSpecularGlossiness */0]; if (khr_materials_pbrSpecularGlossiness !== undefined) { return _addSpecularGlossinessImageData(khr_materials_pbrSpecularGlossiness, /* tuple */[ gltf, bufferViewDataArr, streamChunkArr, newBufferViewOffset, hasImageAddBeforeMap ], /* tuple */[ lightMaterial$1, materials$1, textures$1, images$1 ], noneData); } else { return _addMetallicRoughnessImageData(pbrMetallicRoughness, /* tuple */[ gltf, bufferViewDataArr, streamChunkArr, newBufferViewOffset, hasImageAddBeforeMap ], /* tuple */[ lightMaterial$1, materials$1, textures$1, images$1 ], noneData); } } else { return _addMetallicRoughnessImageData(pbrMetallicRoughness, /* tuple */[ gltf, bufferViewDataArr, streamChunkArr, newBufferViewOffset, hasImageAddBeforeMap ], /* tuple */[ lightMaterial$1, materials$1, textures$1, images$1 ], noneData); } } else { return noneData; } } function _addCubemapOneFaceTextureImageData(source, param, param$1) { var hasImageAddBeforeMap = param$1[4]; var newImages = param$1[3]; var newBufferViewOffset = param$1[2]; var streamChunkArr = param$1[1]; var bufferViewDataArr = param$1[0]; var match = _hasAddDataBefore(hasImageAddBeforeMap, source); if (match) { return /* tuple */[ bufferViewDataArr, ArrayService$Wonderjs.push(/* record */[ /* byteLength */0, /* index */source, /* type_ : Image */4, /* componentType */0 ], streamChunkArr), newBufferViewOffset, newImages, hasImageAddBeforeMap ]; } else { var image = param[0][source]; var match$1 = _addBufferViewData(OptionService$Wonderjs.unsafeGet(image[/* bufferView */2]), bufferViewDataArr, newBufferViewOffset, param[1]); return /* tuple */[ match$1[2], ArrayService$Wonderjs.push(/* record */[ /* byteLength */match$1[0], /* index */source, /* type_ : Image */4, /* componentType */0 ], streamChunkArr), match$1[3], _addNewImage(match$1[1], /* tuple */[ source, image ], newImages), MutableSparseMapService$WonderCommonlib.set(source, true, hasImageAddBeforeMap) ]; } } function _addCubemapTextureImageData(cubemapTextures, param, param$1, noneData) { var bufferViews = param[1]; var images = param[0]; var match = ArrayService$WonderCommonlib.reduceOneParam((function (param, param$1) { var match = _addCubemapOneFaceTextureImageData(param$1[/* pxSource */3], /* tuple */[ images, bufferViews ], /* tuple */[ param[0], param[1], param[2], param[3], param[4] ]); var match$1 = _addCubemapOneFaceTextureImageData(param$1[/* nxSource */4], /* tuple */[ images, bufferViews ], /* tuple */[ match[0], match[1], match[2], match[3], match[4] ]); var match$2 = _addCubemapOneFaceTextureImageData(param$1[/* pySource */5], /* tuple */[ images, bufferViews ], /* tuple */[ match$1[0], match$1[1], match$1[2], match$1[3], match$1[4] ]); var match$3 = _addCubemapOneFaceTextureImageData(param$1[/* nySource */6], /* tuple */[ images, bufferViews ], /* tuple */[ match$2[0], match$2[1], match$2[2], match$2[3], match$2[4] ]); var match$4 = _addCubemapOneFaceTextureImageData(param$1[/* pzSource */7], /* tuple */[ images, bufferViews ], /* tuple */[ match$3[0], match$3[1], match$3[2], match$3[3], match$3[4] ]); var match$5 = _addCubemapOneFaceTextureImageData(param$1[/* nzSource */8], /* tuple */[ images, bufferViews ], /* tuple */[ match$4[0], match$4[1], match$4[2], match$4[3], match$4[4] ]); return /* tuple */[ match$5[0], match$5[1], match$5[2], match$5[3], match$5[4] ]; }), /* tuple */[ param$1[0], param$1[1], param$1[2], param$1[3], MutableSparseMapService$WonderCommonlib.createEmpty(/* () */0) ], cubemapTextures); return /* tuple */[ match[0], match[1], match[2], match[3] ]; } function _addImageDataForCubemapTexture(param, gltf) { var extras = gltf[/* extras */15]; var images = gltf[/* images */3]; var newImages = param[3]; var newBufferViewOffset = param[2]; var streamChunkArr = param[1]; var bufferViewDataArr = param[0]; var noneData = /* tuple */[ bufferViewDataArr, streamChunkArr, newBufferViewOffset, newImages ]; if (extras !== undefined && images !== undefined) { var cubemapTextures = extras[/* cubemapTextures */6]; if (cubemapTextures !== undefined) { return _addCubemapTextureImageData(cubemapTextures, /* tuple */[ images, gltf[/* bufferViews */7] ], /* tuple */[ bufferViewDataArr, streamChunkArr, newBufferViewOffset, newImages ], noneData); } else { return noneData; } } else { return noneData; } } function _buildNewGLTF(param, gltf) { return /* record */[ /* asset */gltf[/* asset */0], /* scenes */gltf[/* scenes */1], /* scene */gltf[/* scene */2], /* images */param[3], /* textures */gltf[/* textures */4], /* samplers */gltf[/* samplers */5], /* buffers */gltf[/* buffers */6], /* bufferViews */param[1], /* accessors */param[0], /* cameras */gltf[/* cameras */9], /* nodes */gltf[/* nodes */10], /* meshes */param[2], /* materials */gltf[/* materials */12], /* extensionsUsed */gltf[/* extensionsUsed */13], /* extensions */gltf[/* extensions */14], /* extras */gltf[/* extras */15] ]; } function _addMeshAndImageData(gltf, param, param$1, noneData) { var newMeshes = param$1[5]; var newBufferViewOffset = param$1[4]; var streamChunkArr = param$1[3]; var bufferViewDataArr = param$1[2]; var accessorBufferArr = param$1[1]; var match = param$1[0]; var hasMeshAddBeforeMap = match[0]; var mesh = param[2]; var meshes = param[1]; var meshData = meshes[mesh]; var primitives = meshData[/* primitives */0]; var match$1 = ConvertMultiPrimitivesSystem$Wonderjs.isMultiPrimitives(primitives); if (match$1) { return noneData; } else { var primitive = ConvertCommon$Wonderjs.getPrimitiveData(primitives); var match$2 = _hasAddDataBefore(hasMeshAddBeforeMap, mesh); var match$3; if (match$2) { match$3 = /* tuple */[ newBufferViewOffset, accessorBufferArr, bufferViewDataArr, streamChunkArr, newMeshes, hasMeshAddBeforeMap ]; } else { var match$4 = _addPrimitiveData(mesh, primitive, /* tuple */[ accessorBufferArr, bufferViewDataArr, streamChunkArr, newBufferViewOffset ], gltf); var match$5 = match$4[4]; newMeshes[mesh] = /* record */[ /* primitives : array */[/* record */[ /* attributes : record */[ /* position */OptionService$Wonderjs.unsafeGet(match$5[0]), /* normal */match$5[1], /* texCoord_0 */match$5[2], /* texCoord_1 */undefined ], /* indices */match$5[3], /* material */primitive[/* material */2], /* mode */primitive[/* mode */3] ]], /* name */meshData[/* name */1] ]; match$3 = /* tuple */[ match$4[0], match$4[1], match$4[2], match$4[3], newMeshes, MutableSparseMapService$WonderCommonlib.set(mesh, true, hasMeshAddBeforeMap) ]; } var match$6 = _addImageData(ConvertMaterialsSystem$Wonderjs.getLightMaterialOfNode(param[0], meshes), /* tuple */[ match$3[2], match$3[3], match$3[0], match[1] ], gltf); var newImages = _addNewImage(match$6[2], match$6[4], param$1[6]); return /* tuple */[ /* tuple */[ match$3[5], match$6[5] ], match$3[1], match$6[0], match$6[1], match$6[3], match$3[4], newImages ]; } } function buildJsonData(transforms, gltf) { var meshes = gltf[/* meshes */11]; var activeCameraNodeIndex = ConvertCamerasSystem$Wonderjs.getActiveCameraNodeIndex(gltf); var match = ArrayService$WonderCommonlib.reduceOneParam((function (param, node) { var mesh = node[/* mesh */2]; var newImages = param[6]; var newMeshes = param[5]; var newBufferViewOffset = param[4]; var streamChunkArr = param[3]; var bufferViewDataArr = param[2]; var accessorBufferArr = param[1]; var match = param[0]; var hasImageAddBeforeMap = match[1]; var hasMeshAddBeforeMap = match[0]; var noneData_000 = /* tuple */[ hasMeshAddBeforeMap, hasImageAddBeforeMap ]; var noneData = /* tuple */[ noneData_000, accessorBufferArr, bufferViewDataArr, streamChunkArr, newBufferViewOffset, newMeshes, newImages ]; if (mesh !== undefined) { return _addMeshAndImageData(gltf, /* tuple */[ node, meshes, mesh ], /* tuple */[ /* tuple */[ hasMeshAddBeforeMap, hasImageAddBeforeMap ], accessorBufferArr, bufferViewDataArr, streamChunkArr, newBufferViewOffset, newMeshes, newImages ], noneData); } else { return noneData; } }), /* tuple */[ /* tuple */[ MutableSparseMapService$WonderCommonlib.createEmpty(/* () */0), MutableSparseMapService$WonderCommonlib.createEmpty(/* () */0) ], /* array */[], /* array */[], /* array */[], 0, /* array */[], /* array */[] ], _sortNodesByActiveCameraNodeWorldPosition(activeCameraNodeIndex, transforms, gltf)); var match$1 = _addImageDataForCubemapTexture(/* tuple */[ match[2], match[3], match[4], match[6] ], gltf); var bufferViewDataArr = match$1[0]; return /* tuple */[ bufferViewDataArr, match$1[1], _buildNewGLTF(/* tuple */[ match[1], bufferViewDataArr.map((function (param) { return param[1]; })), match[5], match$1[3] ], gltf) ]; } exports._getImageComponentType = _getImageComponentType; exports._addAccessorData = _addAccessorData; exports._addBufferViewData = _addBufferViewData; exports._computeDistance = _computeDistance; exports._sortNodesByActiveCameraNodeWorldPosition = _sortNodesByActiveCameraNodeWorldPosition; exports._addPrimitivePointData = _addPrimitivePointData; exports._addPrimitiveOptionPointData = _addPrimitiveOptionPointData; exports._addPrimitiveData = _addPrimitiveData; exports._hasAddDataBefore = _hasAddDataBefore; exports._addPBRImageData = _addPBRImageData; exports._addMetallicRoughnessImageData = _addMetallicRoughnessImageData; exports._addSpecularGlossinessImageData = _addSpecularGlossinessImageData; exports._addNewImage = _addNewImage; exports._addImageData = _addImageData; exports._addCubemapOneFaceTextureImageData = _addCubemapOneFaceTextureImageData; exports._addCubemapTextureImageData = _addCubemapTextureImageData; exports._addImageDataForCubemapTexture = _addImageDataForCubemapTexture; exports._buildNewGLTF = _buildNewGLTF; exports._addMeshAndImageData = _addMeshAndImageData; exports.buildJsonData = buildJsonData; /* BufferUtils-Wonderjs Not a pure module */