UNPKG

wonder.js

Version:
258 lines (242 loc) 12.7 kB
'use strict'; var Caml_array = require("bs-platform/lib/js/caml_array.js"); var Caml_int32 = require("bs-platform/lib/js/caml_int32.js"); var DrawGLSLService$Wonderjs = require("../../../../service/record/all/sender/DrawGLSLService.js"); var TypeArrayService$Wonderjs = require("../../../../service/primitive/buffer/TypeArrayService.js"); var AllGPUDetectService$Wonderjs = require("../../../../service/record/all/gpu/AllGPUDetectService.js"); var ArrayService$WonderCommonlib = require("wonder-commonlib/lib/js/src/ArrayService.js"); var SendGLSLDataService$Wonderjs = require("../../../../service/record/all/sender/SendGLSLDataService.js"); var GeometryRenderService$Wonderjs = require("../../../../service/state/render/geometry/GeometryRenderService.js"); var DrawModeMeshRendererService$Wonderjs = require("../../../../service/state/render/meshRenderer/DrawModeMeshRendererService.js"); var InstanceBufferRenderService$Wonderjs = require("../../../../service/state/render/vboBuffer/InstanceBufferRenderService.js"); var GetGeometryIndicesRenderService$Wonderjs = require("../../../../service/state/render/geometry/GetGeometryIndicesRenderService.js"); var ObjectInstanceCollectionService$Wonderjs = require("../../../../service/primitive/instance/ObjectInstanceCollectionService.js"); var HandleAttributeConfigDataService$Wonderjs = require("../../../../service/record/all/sender/attribute/HandleAttributeConfigDataService.js"); var StaticRenderSourceInstanceService$Wonderjs = require("../../../../service/record/render/instance/sourceInstance/StaticRenderSourceInstanceService.js"); var GetTransformDataGetRenderDataService$Wonderjs = require("../../../../service/state/render/sub/get_render_data/transform/GetTransformDataGetRenderDataService.js"); var MarkIsSendTransformMatrixDataService$Wonderjs = require("../../../../service/primitive/instance/MarkIsSendTransformMatrixDataService.js"); var CreateGetRenederDataSubStateRenderService$Wonderjs = require("../../../../service/state/render/sub/get_render_data/CreateGetRenederDataSubStateRenderService.js"); var BuildObjectInstanceTransformDataTupleUtils$Wonderjs = require("./BuildObjectInstanceTransformDataTupleUtils.js"); var CreateSendRenederDataSubStateRenderService$Wonderjs = require("../../../../service/state/render/sub/send_render_data/CreateSendRenederDataSubStateRenderService.js"); function _fillObjectInstanceData(objectInstanceTransformDataTuple, matricesArrayForInstance, fillMatrixTypeArrFunc, getRenderDataSubState, offset) { ObjectInstanceCollectionService$Wonderjs.reduceObjectInstanceTransformCollection(objectInstanceTransformDataTuple, offset, (function (offset, objectInstanceTransform) { return fillMatrixTypeArrFunc(objectInstanceTransform, matricesArrayForInstance, getRenderDataSubState, offset); })); return /* () */0; } function _sendTransformMatrixDataBuffer(param, param$1, sendRenderDataSubState) { var match = param$1[0]; var pos = match[/* pos */0]; var gl = param[0]; gl.vertexAttribPointer(pos, match[/* size */1], gl.FLOAT, false, param$1[1], match[/* getOffsetFunc */2](param$1[2])); param[1].vertexAttribDivisorANGLE(pos, 1); SendGLSLDataService$Wonderjs.enableVertexAttribArray(gl, pos, sendRenderDataSubState[/* vertexAttribHistoryArray */0]); return sendRenderDataSubState; } function _sendTransformMatrixDataBufferData(glDataTuple, shaderIndex, stride, param) { var state = param[1]; var sendRenderDataSubState = param[0]; ArrayService$WonderCommonlib.forEachi((function (sendData, index) { return _sendTransformMatrixDataBuffer(glDataTuple, /* tuple */[ sendData, stride, index ], sendRenderDataSubState); }), HandleAttributeConfigDataService$Wonderjs.unsafeGetInstanceAttributeSendData(shaderIndex, state[/* glslSenderRecord */3])); return state; } function _updateAndSendTransformMatrixDataBufferData(glDataTuple, shaderIndex, param, param$1) { InstanceBufferRenderService$Wonderjs.updateData(glDataTuple[0], param[1], param[2]); return _sendTransformMatrixDataBufferData(glDataTuple, shaderIndex, param[0], /* tuple */[ param$1[0], param$1[1] ]); } function _sendTransformMatrixData(param, param$1, fillMatrixTypeArrFunc, state) { var match = param$1[2]; var matrixFloat32ArrayMap = match[2]; var matrixInstanceBufferMap = match[1]; var matrixInstanceBufferCapacityMap = match[0]; var match$1 = param$1[1]; var defaultCapacity = match$1[0]; var match$2 = param$1[0]; var gl = match$2[0]; var sourceInstance = param[1]; var matrixInstanceBuffer = InstanceBufferRenderService$Wonderjs.getOrCreateBuffer(/* tuple */[ gl, sourceInstance, defaultCapacity ], /* tuple */[ matrixInstanceBufferCapacityMap, matrixInstanceBufferMap ], state); var matricesArrayForInstance = InstanceBufferRenderService$Wonderjs.getOrCreateMatrixFloat32Array(sourceInstance, defaultCapacity, /* tuple */[ matrixInstanceBufferCapacityMap, matrixFloat32ArrayMap ], state); var match$3 = InstanceBufferRenderService$Wonderjs.setCapacityAndUpdateBufferTypeArray(/* tuple */[ gl, sourceInstance, Caml_int32.imul(match$1[4], match$1[1]), defaultCapacity ], /* tuple */[ matrixInstanceBuffer, matricesArrayForInstance ], /* tuple */[ matrixInstanceBufferMap, matrixFloat32ArrayMap, matrixInstanceBufferCapacityMap ], state); var matricesArrayForInstance$1 = match$3[1]; var getRenderDataSubState = CreateGetRenederDataSubStateRenderService$Wonderjs.createState(state); _fillObjectInstanceData(match$1[3], matricesArrayForInstance$1, fillMatrixTypeArrFunc, getRenderDataSubState, fillMatrixTypeArrFunc(param[0], matricesArrayForInstance$1, getRenderDataSubState, 0)); return _updateAndSendTransformMatrixDataBufferData(/* tuple */[ gl, match$2[1] ], match$2[2], /* tuple */[ match$1[2], matricesArrayForInstance$1, match$3[0] ], /* tuple */[ CreateSendRenederDataSubStateRenderService$Wonderjs.createState(state), state ]); } function _sendStaticTransformMatrixData(componentTuple, dataTuple, fillMatrixTypeArrFunc, state) { var match = dataTuple[2]; var match$1 = dataTuple[1]; var match$2 = dataTuple[0]; var gl = match$2[0]; var sourceInstance = componentTuple[1]; var match$3 = MarkIsSendTransformMatrixDataService$Wonderjs.isSendTransformMatrixData(sourceInstance, state[/* sourceInstanceRecord */17][/* isSendTransformMatrixDataMap */5]); if (match$3) { InstanceBufferRenderService$Wonderjs.bind(gl, InstanceBufferRenderService$Wonderjs.getOrCreateBuffer(/* tuple */[ gl, sourceInstance, match$1[0] ], /* tuple */[ match[0], match[1] ], state)); var sendRenderDataSubState = CreateSendRenederDataSubStateRenderService$Wonderjs.createState(state); return _sendTransformMatrixDataBufferData(/* tuple */[ gl, match$2[1] ], match$2[2], match$1[2], /* tuple */[ sendRenderDataSubState, state ]); } else { var state$1 = _sendTransformMatrixData(componentTuple, dataTuple, fillMatrixTypeArrFunc, state); var newrecord = Caml_array.caml_array_dup(state$1); newrecord[/* sourceInstanceRecord */17] = StaticRenderSourceInstanceService$Wonderjs.markIsSendTransformMatrixData(sourceInstance, true, state$1[/* sourceInstanceRecord */17]); return newrecord; } } function _sendDynamicTransformMatrixData(componentTuple, dataTuple, fillMatrixTypeArrFunc, state) { var newrecord = Caml_array.caml_array_dup(state); return _sendTransformMatrixData(componentTuple, dataTuple, fillMatrixTypeArrFunc, (newrecord[/* sourceInstanceRecord */17] = StaticRenderSourceInstanceService$Wonderjs.markIsSendTransformMatrixData(componentTuple[1], false, state[/* sourceInstanceRecord */17]), newrecord)); } function _geMatrixMapTuple(state) { var match = state[/* vboBufferRecord */1]; var match$1 = state[/* sourceInstanceRecord */17]; return /* tuple */[ match$1[/* matrixInstanceBufferCapacityMap */3], match[/* matrixInstanceBufferMap */4], match$1[/* matrixFloat32ArrayMap */4] ]; } function _renderSourceInstanceGameObject(gl, indexTuple, renderFunc, state) { return renderFunc(gl, indexTuple, state); } function _prepareData(gl, shaderIndex, param, state) { var extension = AllGPUDetectService$Wonderjs.unsafeGetInstanceExtension(state[/* gpuDetectRecord */18]); var match = BuildObjectInstanceTransformDataTupleUtils$Wonderjs.build(param[0], state); var instanceRenderListCount = ObjectInstanceCollectionService$Wonderjs.getObjectInstanceTransformCount(match[0]) + 1 | 0; return /* tuple */[ /* tuple */[ gl, extension, shaderIndex ], /* tuple */[ param[1], param[2], param[3], match[1], instanceRenderListCount ], _geMatrixMapTuple(state) ]; } function _unbind(shaderIndex, extension, state) { ArrayService$WonderCommonlib.forEach((function (param) { extension.vertexAttribDivisorANGLE(param[/* pos */0], 0); return /* () */0; }), HandleAttributeConfigDataService$Wonderjs.unsafeGetInstanceAttributeSendData(shaderIndex, state[/* glslSenderRecord */3])); return state; } function render(gl, param, param$1, state) { var fillMatrixTypeArrFunc = param$1[1]; var indexTuple = param[0]; var sourceInstance = indexTuple[5]; var geometryIndex = indexTuple[4]; var meshRendererIndex = indexTuple[3]; var shaderIndex = indexTuple[2]; var transformIndex = indexTuple[0]; var state$1 = _renderSourceInstanceGameObject(gl, /* tuple */[ transformIndex, indexTuple[1], shaderIndex, meshRendererIndex, geometryIndex ], param$1[0], state); var dataTuple = _prepareData(gl, shaderIndex, /* tuple */[ sourceInstance, param[1], param[2], param[3] ], state$1); var match = dataTuple[0]; var extension = match[1]; var gl$1 = match[0]; var match$1 = StaticRenderSourceInstanceService$Wonderjs.isTransformStatic(sourceInstance, state$1[/* sourceInstanceRecord */17]); var state$2 = match$1 ? _sendStaticTransformMatrixData(/* tuple */[ transformIndex, sourceInstance ], dataTuple, fillMatrixTypeArrFunc, state$1) : _sendDynamicTransformMatrixData(/* tuple */[ transformIndex, sourceInstance ], dataTuple, fillMatrixTypeArrFunc, state$1); DrawGLSLService$Wonderjs.drawElementsInstancedANGLE(/* tuple */[ DrawModeMeshRendererService$Wonderjs.getGlDrawMode(gl$1, meshRendererIndex, state$2), GeometryRenderService$Wonderjs.getIndexType(gl$1, geometryIndex, state$2), GeometryRenderService$Wonderjs.getIndexTypeSize(gl$1, geometryIndex, state$2), GetGeometryIndicesRenderService$Wonderjs.getIndicesCount(geometryIndex, state$2), dataTuple[1][4] ], extension); return _unbind(shaderIndex, extension, state$2); } function fillMatrixTypeArr(transformIndex, matricesArrayForInstance, state, offset) { return TypeArrayService$Wonderjs.fillFloat32ArrayWithFloat32Array(/* tuple */[ matricesArrayForInstance, offset ], /* tuple */[ GetTransformDataGetRenderDataService$Wonderjs.getLocalToWorldMatrixTypeArray(transformIndex, state), 0 ], 16); } exports._fillObjectInstanceData = _fillObjectInstanceData; exports._sendTransformMatrixDataBuffer = _sendTransformMatrixDataBuffer; exports._sendTransformMatrixDataBufferData = _sendTransformMatrixDataBufferData; exports._updateAndSendTransformMatrixDataBufferData = _updateAndSendTransformMatrixDataBufferData; exports._sendTransformMatrixData = _sendTransformMatrixData; exports._sendStaticTransformMatrixData = _sendStaticTransformMatrixData; exports._sendDynamicTransformMatrixData = _sendDynamicTransformMatrixData; exports._geMatrixMapTuple = _geMatrixMapTuple; exports._renderSourceInstanceGameObject = _renderSourceInstanceGameObject; exports._prepareData = _prepareData; exports._unbind = _unbind; exports.render = render; exports.fillMatrixTypeArr = fillMatrixTypeArr; /* TypeArrayService-Wonderjs Not a pure module */