Wonder-Technology/Wonder.js

View on GitHub
lib/js/src/construct/domain_layer/domain/ray_tracing/service/BuildAccerlerationContainerDoService.bs.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

var Curry = require("bs-platform/lib/js/curry.js");
var ListSt$Wonderjs = require("../../../library/structure/ListSt.bs.js");
var Result$Wonderjs = require("../../../library/structure/Result.bs.js");
var Tuple2$Wonderjs = require("../../../library/structure/tuple/Tuple2.bs.js");
var ArraySt$Wonderjs = require("../../../library/structure/ArraySt.bs.js");
var Matrix4$Wonderjs = require("../../../library/structure/matrix/Matrix4.bs.js");
var ScaleVO$Wonderjs = require("../../scene/scene_graph/value_object/ScaleVO.bs.js");
var OptionSt$Wonderjs = require("../../../library/structure/OptionSt.bs.js");
var IndicesVO$Wonderjs = require("../../scene/scene_graph/value_object/IndicesVO.bs.js");
var MathUtils$Wonderjs = require("../../../library/structure/utils/MathUtils.bs.js");
var SceneRoot$Wonderjs = require("../../scene/scene_graph/root/SceneRoot.bs.js");
var PositionVO$Wonderjs = require("../../scene/scene_graph/value_object/PositionVO.bs.js");
var RotationVO$Wonderjs = require("../../scene/scene_graph/value_object/RotationVO.bs.js");
var VerticesVO$Wonderjs = require("../../scene/scene_graph/value_object/VerticesVO.bs.js");
var DpContainer$Wonderjs = require("../../../dependency/container/DpContainer.bs.js");
var GameObjectRunAPI$Wonderjs = require("../../../../external_layer/api/domain/GameObjectRunAPI.bs.js");
var ImmutableSparseMap$Wonderjs = require("../../../library/structure/sparse_map/ImmutableSparseMap.bs.js");
var RayTracingBufferVO$Wonderjs = require("../value_object/RayTracingBufferVO.bs.js");
var IndicesGeometryDoService$Wonderjs = require("../../scene/scene_graph/service/geometry/IndicesGeometryDoService.bs.js");
var OperateGeometryDoService$Wonderjs = require("../../scene/scene_graph/service/geometry/OperateGeometryDoService.bs.js");
var OperateTransformDoService$Wonderjs = require("../../scene/scene_graph/service/transform/OperateTransformDoService.bs.js");
var VerticesGeometryDoService$Wonderjs = require("../../scene/scene_graph/service/geometry/VerticesGeometryDoService.bs.js");
var AllRenderGameObjectsDoService$Wonderjs = require("../../scene/scene_graph/service/gameObject/AllRenderGameObjectsDoService.bs.js");

function _buildSceneGeometryContainers(device) {
  return Result$Wonderjs.mapSuccess(ListSt$Wonderjs.traverseResultM(AllRenderGameObjectsDoService$Wonderjs.getAllRenderGeometries(SceneRoot$Wonderjs.getSceneGameObject(undefined)), (function (geometry) {
                    return Result$Wonderjs.mapSuccess(OptionSt$Wonderjs.get(IndicesGeometryDoService$Wonderjs.getIndices(geometry)), (function (indices) {
                                  return [
                                          geometry,
                                          VerticesVO$Wonderjs.value(VerticesGeometryDoService$Wonderjs.getVertices(geometry)),
                                          IndicesVO$Wonderjs.value(indices)
                                        ];
                                }));
                  })), (function (list) {
                return ListSt$Wonderjs.reduce(list, ImmutableSparseMap$Wonderjs.createEmpty(undefined, undefined), (function (geometryContainerMap, param) {
                              var indices = param[2];
                              var vertices = param[1];
                              var geometryVertexBuffer = RayTracingBufferVO$Wonderjs.createFromDevice(device, vertices.byteLength);
                              Curry._3(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).buffer.setSubFloat32Data, 0, vertices, RayTracingBufferVO$Wonderjs.value(geometryVertexBuffer));
                              var geometryIndexBuffer = RayTracingBufferVO$Wonderjs.createFromDevice(device, indices.byteLength);
                              Curry._3(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).buffer.setSubUint32Data, 0, indices, RayTracingBufferVO$Wonderjs.value(geometryIndexBuffer));
                              return ImmutableSparseMap$Wonderjs.set(geometryContainerMap, OperateGeometryDoService$Wonderjs.getId(param[0]), Curry._2(DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).device.createRayTracingAccelerationContainer, {
                                              level: "bottom",
                                              usage: DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).accelerationContainerUsage.prefer_fast_trace,
                                              geometries: [{
                                                  usage: DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).accelerationGeometryUsage.allow_any_hit,
                                                  type: "triangles",
                                                  vertex: {
                                                    buffer: RayTracingBufferVO$Wonderjs.value(geometryVertexBuffer),
                                                    format: "float3",
                                                    stride: Math.imul(3, Float32Array.BYTES_PER_ELEMENT),
                                                    count: vertices.length
                                                  },
                                                  index: {
                                                    buffer: RayTracingBufferVO$Wonderjs.value(geometryIndexBuffer),
                                                    format: "uint32",
                                                    count: indices.length
                                                  }
                                                }]
                                            }, device));
                            }));
              }));
}

function _convertMat4To34RowMajorMatrix(mat4) {
  return new Float32Array([
              mat4[0],
              mat4[4],
              mat4[8],
              mat4[12],
              mat4[1],
              mat4[5],
              mat4[9],
              mat4[13],
              mat4[2],
              mat4[6],
              mat4[10],
              mat4[14]
            ]);
}

function _convertInstanceTransformDataToContainerTransformMatrix(param) {
  return _convertMat4To34RowMajorMatrix(Matrix4$Wonderjs.fromTranslationRotationScale(Matrix4$Wonderjs.createIdentityMatrix4(undefined), param[0], param[1], param[2]));
}

function _convertHitGroupIndexToInstanceOffset(hitGroupIndex) {
  return MathUtils$Wonderjs.convertDecimalToHex(hitGroupIndex, 16);
}

function _createInstances(geometryContainerMap) {
  return Result$Wonderjs.mapSuccess(Result$Wonderjs.mapSuccess(ListSt$Wonderjs.traverseResultM(GameObjectRunAPI$Wonderjs.getAllRenderGameObjects(SceneRoot$Wonderjs.getSceneGameObject(undefined)), (function (gameObject) {
                        return Tuple2$Wonderjs.collectOption(GameObjectRunAPI$Wonderjs.getTransform(gameObject), OptionSt$Wonderjs.flatMap(GameObjectRunAPI$Wonderjs.getGeometry(gameObject), (function (geometry) {
                                          return ImmutableSparseMap$Wonderjs.get(geometryContainerMap, OperateGeometryDoService$Wonderjs.getId(geometry));
                                        })));
                      })), (function (list) {
                    return ListSt$Wonderjs.reduce(list, [
                                [],
                                0
                              ], (function (param, param$1) {
                                  var transform = param$1[0];
                                  var instanceIndex = param[1];
                                  return [
                                          ArraySt$Wonderjs.push(param[0], {
                                                usage: DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).accelerationInstanceUsage.triangle_cull_disable,
                                                mask: 255,
                                                instanceId: instanceIndex,
                                                instanceOffset: MathUtils$Wonderjs.convertDecimalToHex(0, 16),
                                                geometryContainer: param$1[1],
                                                transformMatrix: _convertInstanceTransformDataToContainerTransformMatrix([
                                                      PositionVO$Wonderjs.value(OperateTransformDoService$Wonderjs.getPosition(transform)),
                                                      RotationVO$Wonderjs.value(OperateTransformDoService$Wonderjs.getRotation(transform)),
                                                      ScaleVO$Wonderjs.value(OperateTransformDoService$Wonderjs.getScale(transform))
                                                    ])
                                              }),
                                          instanceIndex + 1 | 0
                                        ];
                                }));
                  })), Tuple2$Wonderjs.getFirst);
}

function _createInstanceContainer(geometryContainerMap, device) {
  return Result$Wonderjs.mapSuccess(_createInstances(geometryContainerMap), (function (instances) {
                return Curry._2(DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).device.createRayTracingAccelerationContainer, {
                            level: "top",
                            usage: DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).accelerationContainerUsage.prefer_fast_trace,
                            instances: instances
                          }, device);
              }));
}

function buildContainers(device, queue) {
  return Result$Wonderjs.bind(_buildSceneGeometryContainers(device), (function (geometryContainerMap) {
                return Result$Wonderjs.tap(_createInstanceContainer(geometryContainerMap, device), (function (instanceContainer) {
                              var commandEncoder = Curry._2(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).device.createCommandEncoder, {}, device);
                              ArraySt$Wonderjs.forEach(ImmutableSparseMap$Wonderjs.getValues(geometryContainerMap), (function (geometryContainer) {
                                      return Curry._2(DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).commandEncoder.buildRayTracingAccelerationContainer, geometryContainer, commandEncoder);
                                    }));
                              Curry._2(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).queue.submit, [Curry._1(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).commandEncoder.finish, commandEncoder)], queue);
                              var commandEncoder$1 = Curry._2(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).device.createCommandEncoder, {}, device);
                              Curry._2(DpContainer$Wonderjs.unsafeGetWebGPURayTracingDp(undefined).commandEncoder.buildRayTracingAccelerationContainer, instanceContainer, commandEncoder$1);
                              Curry._2(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).queue.submit, [Curry._1(DpContainer$Wonderjs.unsafeGetWebGPUCoreDp(undefined).commandEncoder.finish, commandEncoder$1)], queue);
                              
                            }));
              }));
}

exports._buildSceneGeometryContainers = _buildSceneGeometryContainers;
exports._convertMat4To34RowMajorMatrix = _convertMat4To34RowMajorMatrix;
exports._convertInstanceTransformDataToContainerTransformMatrix = _convertInstanceTransformDataToContainerTransformMatrix;
exports._convertHitGroupIndexToInstanceOffset = _convertHitGroupIndexToInstanceOffset;
exports._createInstances = _createInstances;
exports._createInstanceContainer = _createInstanceContainer;
exports.buildContainers = buildContainers;
/* No side effect */