wonder.js
Version:
193 lines (175 loc) • 11.2 kB
JavaScript
'use strict';
var Js_option = require("bs-platform/lib/js/js_option.js");
var Caml_array = require("bs-platform/lib/js/caml_array.js");
var ArrayService$Wonderjs = require("../../../service/atom/ArrayService.js");
var RenderJobUtils$Wonderjs = require("../../utils/render/RenderJobUtils.js");
var ArrayService$WonderCommonlib = require("wonder-commonlib/lib/js/src/ArrayService.js");
var AllGLSLLocationService$Wonderjs = require("../../../service/record/all/location/AllGLSLLocationService.js");
var AllDeviceManagerService$Wonderjs = require("../../../service/record/all/device/AllDeviceManagerService.js");
var UseProgramRenderService$Wonderjs = require("../../../service/state/render/program/UseProgramRenderService.js");
var DrawModeMeshRendererService$Wonderjs = require("../../../service/state/render/meshRenderer/DrawModeMeshRendererService.js");
var OperateRenderJobDataService$Wonderjs = require("../../../service/record/render/jobData/OperateRenderJobDataService.js");
var CreateRenderStateMainService$Wonderjs = require("../../../service/state/main/render/CreateRenderStateMainService.js");
var GetComponentGameObjectService$Wonderjs = require("../../../service/record/main/gameObject/GetComponentGameObjectService.js");
var ClearLastSendComponentJobUtils$Wonderjs = require("../../utils/ClearLastSendComponentJobUtils.js");
var NoMaterialShaderIndexAllShaderService$Wonderjs = require("../../../service/record/all/shader/NoMaterialShaderIndexAllShaderService.js");
var CreateGetRenederDataSubStateRenderService$Wonderjs = require("../../../service/state/render/sub/get_render_data/CreateGetRenederDataSubStateRenderService.js");
var CreateSendRenederDataSubStateRenderService$Wonderjs = require("../../../service/state/render/sub/send_render_data/CreateSendRenederDataSubStateRenderService.js");
var HandleNoMaterialShaderUniformConfigDataService$Wonderjs = require("../../../service/record/all/sender/uniform/no_material_shader/HandleNoMaterialShaderUniformConfigDataService.js");
function draw(gl, shaderIndex, renderDataArr, state) {
return ArrayService$WonderCommonlib.reduceOneParam((function (state, param) {
var geometryIndex = param[2];
var sendRenderDataSubState = CreateSendRenederDataSubStateRenderService$Wonderjs.createState(state);
RenderJobUtils$Wonderjs.sendAttributeData(gl, /* tuple */[
shaderIndex,
geometryIndex
], sendRenderDataSubState, state);
var getRenderDataSubState = CreateGetRenederDataSubStateRenderService$Wonderjs.createState(state);
RenderJobUtils$Wonderjs.sendUniformRenderObjectModelData(gl, /* tuple */[
shaderIndex,
param[0]
], /* tuple */[
getRenderDataSubState,
state
]);
RenderJobUtils$Wonderjs.draw(gl, DrawModeMeshRendererService$Wonderjs.getGlDrawMode(gl, param[1], state), geometryIndex, state);
return state;
}), state, renderDataArr);
}
var DrawOriginGameObjects = /* module */[/* draw */draw];
function _sendUniformNoMaterialShaderData(gl, shaderIndex, getRenderDataSubState, state) {
ArrayService$WonderCommonlib.forEach((function (param) {
var pos = param[/* pos */2];
var match = AllGLSLLocationService$Wonderjs.isUniformLocationExist(pos);
if (match) {
return param[/* sendDataFunc */4](gl, param[/* shaderCacheMap */0], /* tuple */[
param[/* name */1],
pos
], param[/* getDataFunc */3](getRenderDataSubState));
} else {
return /* () */0;
}
}), HandleNoMaterialShaderUniformConfigDataService$Wonderjs.unsafeGetUniformSendData(shaderIndex, state[/* glslSenderRecord */3]));
return state;
}
function draw$1(gl, shaderIndex, renderDataArr, state) {
return ArrayService$WonderCommonlib.reduceOneParam((function (state, param) {
var geometryIndex = param[2];
var sendRenderDataSubState = CreateSendRenederDataSubStateRenderService$Wonderjs.createState(state);
RenderJobUtils$Wonderjs.sendAttributeData(gl, /* tuple */[
shaderIndex,
geometryIndex
], sendRenderDataSubState, state);
var getRenderDataSubState = CreateGetRenederDataSubStateRenderService$Wonderjs.createState(state);
RenderJobUtils$Wonderjs.sendUniformRenderObjectModelData(gl, /* tuple */[
shaderIndex,
param[0]
], /* tuple */[
getRenderDataSubState,
state
]);
_sendUniformNoMaterialShaderData(gl, shaderIndex, getRenderDataSubState, state);
RenderJobUtils$Wonderjs.draw(gl, DrawModeMeshRendererService$Wonderjs.getGlDrawMode(gl, param[1], state), geometryIndex, state);
return state;
}), state, renderDataArr);
}
var DrawExpandGameObjects = /* module */[
/* _sendUniformNoMaterialShaderData */_sendUniformNoMaterialShaderData,
/* draw */draw$1
];
function _prepareGlState(gl, state) {
var deviceManagerRecord = AllDeviceManagerService$Wonderjs.setColorWrite(gl, /* tuple */[
false,
false,
false,
false
], AllDeviceManagerService$Wonderjs.setDepthWrite(gl, false, AllDeviceManagerService$Wonderjs.setDepthTest(gl, false, AllDeviceManagerService$Wonderjs.setStencilMask(gl, 255, AllDeviceManagerService$Wonderjs.setStencilFunc(gl, /* tuple */[
gl.ALWAYS,
1,
255
], AllDeviceManagerService$Wonderjs.setStencilOp(gl, /* tuple */[
gl.KEEP,
gl.KEEP,
gl.REPLACE
], AllDeviceManagerService$Wonderjs.setStencilTest(gl, true, state[/* deviceManagerRecord */20])))))));
var newrecord = Caml_array.caml_array_dup(state);
newrecord[/* deviceManagerRecord */20] = deviceManagerRecord;
return newrecord;
}
var _useDrawOriginGameObjectsProgram = UseProgramRenderService$Wonderjs.useByShaderIndex;
var _useDrawExpandGameObjectsProgram = UseProgramRenderService$Wonderjs.useByShaderIndex;
function _setGlStateBeforeDrawExpandGameObjects(gl, state) {
var deviceManagerRecord = AllDeviceManagerService$Wonderjs.setColorWrite(gl, /* tuple */[
true,
true,
true,
true
], AllDeviceManagerService$Wonderjs.setDepthWrite(gl, false, AllDeviceManagerService$Wonderjs.setDepthTest(gl, false, AllDeviceManagerService$Wonderjs.setStencilMask(gl, 0, AllDeviceManagerService$Wonderjs.setStencilFunc(gl, /* tuple */[
gl.NOTEQUAL,
1,
255
], state[/* deviceManagerRecord */20])))));
var newrecord = Caml_array.caml_array_dup(state);
newrecord[/* deviceManagerRecord */20] = deviceManagerRecord;
return newrecord;
}
function _restoreGlState(gl, state) {
var deviceManagerRecord = AllDeviceManagerService$Wonderjs.setDepthWrite(gl, true, AllDeviceManagerService$Wonderjs.setDepthTest(gl, true, AllDeviceManagerService$Wonderjs.setStencilMask(gl, 255, AllDeviceManagerService$Wonderjs.setStencilTest(gl, false, state[/* deviceManagerRecord */20]))));
var newrecord = Caml_array.caml_array_dup(state);
newrecord[/* deviceManagerRecord */20] = deviceManagerRecord;
return newrecord;
}
function _clearLastSendComponent(state) {
var newrecord = Caml_array.caml_array_dup(state);
newrecord[/* glslSenderRecord */3] = ClearLastSendComponentJobUtils$Wonderjs.execJob(state[/* glslSenderRecord */3]);
return newrecord;
}
function exec(renderDataArr, state) {
var shaderRecord = state[/* shaderRecord */25];
var drawOriginGameObjectsShaderIndex = NoMaterialShaderIndexAllShaderService$Wonderjs.unsafeGetShaderIndex("outline_draw_origin_gameObjects", shaderRecord);
var drawExpandGameObjectsShaderIndex = NoMaterialShaderIndexAllShaderService$Wonderjs.unsafeGetShaderIndex("outline_draw_expand_gameObjects", shaderRecord);
var gl = AllDeviceManagerService$Wonderjs.unsafeGetGl(state[/* deviceManagerRecord */20]);
var state$1 = _prepareGlState(gl, state);
var state$2 = _setGlStateBeforeDrawExpandGameObjects(gl, _clearLastSendComponent(draw(gl, drawOriginGameObjectsShaderIndex, renderDataArr, UseProgramRenderService$Wonderjs.useByShaderIndex(gl, drawOriginGameObjectsShaderIndex, state$1))));
return _restoreGlState(gl, draw$1(gl, drawExpandGameObjectsShaderIndex, renderDataArr, UseProgramRenderService$Wonderjs.useByShaderIndex(gl, drawExpandGameObjectsShaderIndex, state$2)));
}
var DrawOutlineJobUtils = /* module */[
/* DrawOriginGameObjects */DrawOriginGameObjects,
/* DrawExpandGameObjects */DrawExpandGameObjects,
/* _prepareGlState */_prepareGlState,
/* _useDrawOriginGameObjectsProgram */_useDrawOriginGameObjectsProgram,
/* _useDrawExpandGameObjectsProgram */_useDrawExpandGameObjectsProgram,
/* _setGlStateBeforeDrawExpandGameObjects */_setGlStateBeforeDrawExpandGameObjects,
/* _restoreGlState */_restoreGlState,
/* _clearLastSendComponent */_clearLastSendComponent,
/* exec */exec
];
function _getRenderDataArr(state) {
var gameObjectRecord = state[/* gameObjectRecord */10];
return ArrayService$WonderCommonlib.reduceOneParam((function (renderDataArr, gameObjectNeedDrawOutline) {
var transform = GetComponentGameObjectService$Wonderjs.unsafeGetTransformComponent(gameObjectNeedDrawOutline, gameObjectRecord);
var match = Js_option.andThen((function (geometry) {
return Js_option.andThen((function (meshRenderer) {
return /* tuple */[
transform,
meshRenderer,
geometry
];
}), GetComponentGameObjectService$Wonderjs.getMeshRendererComponent(gameObjectNeedDrawOutline, gameObjectRecord));
}), GetComponentGameObjectService$Wonderjs.getGeometryComponent(gameObjectNeedDrawOutline, gameObjectRecord));
if (match !== undefined) {
return ArrayService$Wonderjs.push(match, renderDataArr);
} else {
return renderDataArr;
}
}), /* array */[], OperateRenderJobDataService$Wonderjs.getGameObjectsNeedDrawOutline(state[/* jobDataRecord */46]));
}
function execJob(flags, state) {
var renderState = CreateRenderStateMainService$Wonderjs.createRenderState(state);
exec(_getRenderDataArr(state), renderState);
return state;
}
exports.DrawOutlineJobUtils = DrawOutlineJobUtils;
exports._getRenderDataArr = _getRenderDataArr;
exports.execJob = execJob;
/* ArrayService-Wonderjs Not a pure module */