wonder.js
Version:
463 lines (446 loc) • 14.6 kB
JavaScript
;
var Curry = require("bs-platform/lib/js/curry.js");
var Caml_int32 = require("bs-platform/lib/js/caml_int32.js");
var Caml_option = require("bs-platform/lib/js/caml_option.js");
var Log$WonderLog = require("wonder-log/lib/js/src/Log.js");
var Contract$WonderLog = require("wonder-log/lib/js/src/Contract.js");
var BufferUtils$Wonderjs = require("../utils/BufferUtils.js");
var ArrayService$Wonderjs = require("../../service/atom/ArrayService.js");
var OptionService$Wonderjs = require("../../service/atom/OptionService.js");
var StateDataMain$Wonderjs = require("../../service/state/main/data/StateDataMain.js");
var GenerateCommon$Wonderjs = require("./GenerateCommon.js");
var IsDebugMainService$Wonderjs = require("../../service/state/main/state/IsDebugMainService.js");
var BuildGeometryDataUtils$Wonderjs = require("./utils/BuildGeometryDataUtils.js");
var MutableSparseMapService$WonderCommonlib = require("wonder-commonlib/lib/js/src/MutableSparseMapService.js");
function getComponentType(pointType) {
if (pointType !== 3) {
if (pointType >= 4) {
return 5125;
} else {
return 5126;
}
} else {
return 5123;
}
}
function getType(pointType) {
if (pointType !== 2) {
if (pointType >= 3) {
return "SCALAR";
} else {
return "VEC3";
}
} else {
return "VEC2";
}
}
function _addBufferViewData(param, param$1, totalByteLength) {
var accessorDataArr = param$1[2];
var bufferViewDataArr = param$1[1];
var bufferViewOffset = param$1[0];
var pointType = param[3];
var pointsLength = param[0];
if (pointsLength !== 0) {
var bufferViewByteLength = Caml_int32.imul(pointsLength, param[2]);
var bufferViewAlignedByteLength = BufferUtils$Wonderjs.alignedLength(bufferViewByteLength);
return /* tuple */[
accessorDataArr.length,
ArrayService$Wonderjs.push(/* record */[
/* bufferView */bufferViewDataArr.length,
/* componentType */getComponentType(pointType),
/* count */param[1],
/* type_ */getType(pointType)
], accessorDataArr),
ArrayService$Wonderjs.push(/* record */[
/* buffer */0,
/* byteOffset */bufferViewOffset,
/* byteLength */bufferViewByteLength
], bufferViewDataArr),
bufferViewOffset + bufferViewAlignedByteLength | 0,
totalByteLength + bufferViewAlignedByteLength | 0
];
} else {
return /* tuple */[
undefined,
accessorDataArr,
bufferViewDataArr,
bufferViewOffset,
totalByteLength
];
}
}
function _checkBufferViewOffsetAligned(bufferViewOffset) {
Contract$WonderLog.requireCheck((function (param) {
return Contract$WonderLog.test(Log$WonderLog.buildAssertMessage("bufferViewOffset aligned with multiple of 4", "not"), (function (param) {
return Contract$WonderLog.Operators[/* = */0](bufferViewOffset % 4, 0);
}));
}), IsDebugMainService$Wonderjs.getIsDebug(StateDataMain$Wonderjs.stateData));
return bufferViewOffset;
}
function _addVertexData(param, vertexDataArr) {
var bufferViewOffset = param[0];
_checkBufferViewOffsetAligned(bufferViewOffset);
return ArrayService$Wonderjs.push(/* tuple */[
bufferViewOffset,
param[1]
], vertexDataArr);
}
function _addIndexDataToArr(param, indexDataArr) {
var bufferViewOffset = param[0];
_checkBufferViewOffsetAligned(bufferViewOffset);
return ArrayService$Wonderjs.push(/* tuple */[
bufferViewOffset,
param[1]
], indexDataArr);
}
function _addPointData(param, param$1, vertexDataArr) {
var bufferViewOffset = param[0];
var vertexDataArr$1 = _addVertexData(/* tuple */[
bufferViewOffset,
param$1[0]
], vertexDataArr);
return /* tuple */[
vertexDataArr$1,
_addBufferViewData(/* tuple */[
param$1[1],
param$1[2],
Float32Array.BYTES_PER_ELEMENT,
param$1[3]
], /* tuple */[
bufferViewOffset,
param[1],
param[2]
], param[3])
];
}
function _addIndexData(param, param$1, param$2, getLengthFunc) {
var bufferViewOffset = param$2[0];
var indices = param[0];
var indicesLength = Curry._1(getLengthFunc, indices);
var indicesCount = Caml_int32.div(indicesLength, param[1]);
return /* tuple */[
_addIndexDataToArr(/* tuple */[
bufferViewOffset,
indices
], param$1[0]),
param$1[1],
_addBufferViewData(/* tuple */[
indicesLength,
indicesCount,
Uint16Array.BYTES_PER_ELEMENT,
/* Index */3
], /* tuple */[
bufferViewOffset,
param$2[1],
param$2[2]
], param$2[3])
];
}
function _addIndex16Data(param, param$1, param$2) {
var indices = param$1[0];
var bufferViewOffset = param[0];
var indicesLength = indices.length;
var indicesCount = Caml_int32.div(indicesLength, param$1[1]);
return /* tuple */[
_addIndexDataToArr(/* tuple */[
bufferViewOffset,
indices
], param$2[0]),
param$2[1],
_addBufferViewData(/* tuple */[
indicesLength,
indicesCount,
Uint16Array.BYTES_PER_ELEMENT,
/* Index */3
], /* tuple */[
bufferViewOffset,
param[1],
param[2]
], param[3])
];
}
function _addIndex32Data(param, param$1, param$2) {
var indices32 = param$1[0];
var bufferViewOffset = param[0];
if (indices32 !== undefined) {
var indices32$1 = Caml_option.valFromOption(indices32);
var indices32Length = indices32$1.length;
var indices32Count = Caml_int32.div(indices32Length, param$1[1]);
return /* tuple */[
param$2[0],
_addIndexDataToArr(/* tuple */[
bufferViewOffset,
indices32$1
], param$2[1]),
_addBufferViewData(/* tuple */[
indices32Length,
indices32Count,
Uint32Array.BYTES_PER_ELEMENT,
/* Index32 */4
], /* tuple */[
bufferViewOffset,
param[1],
param[2]
], param[3])
];
} else {
return Log$WonderLog.fatal(Log$WonderLog.buildFatalMessage("_addAllPointData", "should has indices data", "", "", ""));
}
}
function _addIndex16And32Data(param, param$1, param$2) {
var index32DataArr = param$2[1];
var indexDataArr = param$2[0];
var indicesSize = param$1[2];
var indices = param$1[0];
var totalByteLength = param[3];
var accessorDataArr = param[2];
var bufferViewDataArr = param[1];
var bufferViewOffset = param[0];
if (indices !== undefined) {
return _addIndex16Data(/* tuple */[
bufferViewOffset,
bufferViewDataArr,
accessorDataArr,
totalByteLength
], /* tuple */[
Caml_option.valFromOption(indices),
indicesSize
], /* tuple */[
indexDataArr,
index32DataArr
]);
} else {
return _addIndex32Data(/* tuple */[
bufferViewOffset,
bufferViewDataArr,
accessorDataArr,
totalByteLength
], /* tuple */[
param$1[1],
indicesSize
], /* tuple */[
indexDataArr,
index32DataArr
]);
}
}
function _addAllPointData(param, param$1, param$2) {
var match = param$2[1];
var match$1 = param$1[1];
var match$2 = param[2];
var texCoordsLength = match$2[2];
var normalsLength = match$2[1];
var verticesLength = match$2[0];
var match$3 = param[1];
var match$4 = param[0];
var verticesCount = Caml_int32.div(verticesLength, match$3[0]);
var normalsCount = Caml_int32.div(normalsLength, match$3[1]);
var texCoordsCount = Caml_int32.div(texCoordsLength, match$3[2]);
var match$5 = _addPointData(/* tuple */[
param$1[0],
match$1[0],
match$1[1],
param$2[0]
], /* tuple */[
match$4[0],
verticesLength,
verticesCount,
/* Vertex */0
], match[0]);
var match$6 = match$5[1];
var match$7 = _addPointData(/* tuple */[
match$6[3],
match$6[2],
match$6[1],
match$6[4]
], /* tuple */[
match$4[1],
normalsLength,
normalsCount,
/* Normal */1
], match$5[0]);
var match$8 = match$7[1];
var match$9 = _addPointData(/* tuple */[
match$8[3],
match$8[2],
match$8[1],
match$8[4]
], /* tuple */[
match$4[2],
texCoordsLength,
texCoordsCount,
/* TexCoord */2
], match$7[0]);
var match$10 = match$9[1];
var match$11 = _addIndex16And32Data(/* tuple */[
match$10[3],
match$10[2],
match$10[1],
match$10[4]
], /* tuple */[
match$4[3],
match$4[4],
match$3[3]
], /* tuple */[
match[1],
match[2]
]);
var match$12 = match$11[2];
return /* tuple */[
/* tuple */[
match$6[0],
match$8[0],
match$10[0],
match$12[0]
],
match$12[1],
match$12[2],
match$12[3],
/* tuple */[
match$12[4],
/* tuple */[
match$9[0],
match$11[0],
match$11[1]
]
]
];
}
function _addMeshData(param, texCoords, name, meshDataArr) {
return ArrayService$Wonderjs.push(/* record */[
/* primitives : record */[
/* attributes : record */[
/* position */OptionService$Wonderjs.unsafeGet(param[0]),
/* normal */param[1],
/* texCoord_0 */param[2]
],
/* indices */OptionService$Wonderjs.unsafeGet(param[3]),
/* material */undefined
],
/* name */name
], meshDataArr);
}
function build(meshPointAndNameDataMap) {
Contract$WonderLog.requireCheck((function (param) {
return GenerateCommon$Wonderjs.checkShouldHasNoSlot(meshPointAndNameDataMap);
}), IsDebugMainService$Wonderjs.getIsDebug(StateDataMain$Wonderjs.stateData));
var match = BuildGeometryDataUtils$Wonderjs.getPointSize(/* () */0);
var indicesSize = match[3];
var texCoordsSize = match[2];
var normalsSize = match[1];
var verticesSize = match[0];
var match$1 = MutableSparseMapService$WonderCommonlib.reduceiValid((function (param, param$1, meshIndex) {
var match = param$1[0];
var texCoords = match[2];
var normals = match[1];
var vertices = match[0];
var match$1 = param[2];
var match$2 = param[1];
var match$3 = param[0];
var verticesLength = vertices.length;
var normalsLength = normals.length;
var texCoordsLength = texCoords.length;
var match$4 = _addAllPointData(/* tuple */[
/* tuple */[
vertices,
normals,
texCoords,
match[3],
match[4]
],
/* tuple */[
verticesSize,
normalsSize,
texCoordsSize,
indicesSize
],
/* tuple */[
verticesLength,
normalsLength,
texCoordsLength
]
], /* tuple */[
match$3[1],
/* tuple */[
match$2[0],
match$2[1]
]
], /* tuple */[
match$3[0],
/* tuple */[
match$1[0],
match$1[1],
match$1[2]
]
]);
var match$5 = match$4[4];
var match$6 = match$5[1];
var match$7 = match$4[0];
return /* tuple */[
/* tuple */[
match$5[0],
match$4[3]
],
/* tuple */[
match$4[2],
match$4[1],
_addMeshData(/* tuple */[
match$7[0],
match$7[1],
match$7[2],
match$7[3]
], texCoords, param$1[1], match$2[2])
],
/* tuple */[
match$6[0],
match$6[1],
match$6[2]
]
];
}), /* tuple */[
/* tuple */[
0,
0
],
/* tuple */[
/* array */[],
/* array */[],
/* array */[]
],
/* tuple */[
/* array */[],
/* array */[],
/* array */[]
]
], meshPointAndNameDataMap);
var match$2 = match$1[2];
var match$3 = match$1[1];
return /* tuple */[
match$1[0][0],
/* tuple */[
match$3[0],
match$3[1],
match$3[2]
],
/* tuple */[
match$2[0],
match$2[1],
match$2[2]
]
];
}
exports.getComponentType = getComponentType;
exports.getType = getType;
exports._addBufferViewData = _addBufferViewData;
exports._checkBufferViewOffsetAligned = _checkBufferViewOffsetAligned;
exports._addVertexData = _addVertexData;
exports._addIndexDataToArr = _addIndexDataToArr;
exports._addPointData = _addPointData;
exports._addIndexData = _addIndexData;
exports._addIndex16Data = _addIndex16Data;
exports._addIndex32Data = _addIndex32Data;
exports._addIndex16And32Data = _addIndex16And32Data;
exports._addAllPointData = _addAllPointData;
exports._addMeshData = _addMeshData;
exports.build = build;
/* Log-WonderLog Not a pure module */