Wonder-Technology/Wonder.js

View on GitHub
lib/js/src/run/rtx_path_tracer/domain_layer/domain/pipeline/pipeline/entity/jobs/update/UpdatePathTracingCPJobEntity.bs.js

Summary

Maintainability
F
3 days
Test Coverage
'use strict';

var Most = require("most");
var Curry = require("bs-platform/lib/js/curry.js");
var Caml_option = require("bs-platform/lib/js/caml_option.js");
var Log$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/log/Log.bs.js");
var IORVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/IORVO.bs.js");
var ListSt$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/ListSt.bs.js");
var Number$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/Number.bs.js");
var Result$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/Result.bs.js");
var Tuple2$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/tuple/Tuple2.bs.js");
var Tuple3$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/tuple/Tuple3.bs.js");
var Tuple6$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/tuple/Tuple6.bs.js");
var Tuple7$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/tuple/Tuple7.bs.js");
var WrapVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/WrapVO.bs.js");
var Contract$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/contract/Contract.bs.js");
var OptionSt$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/OptionSt.bs.js");
var DiffuseVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/DiffuseVO.bs.js");
var ImageIdVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/asset/image/value_object/ImageIdVO.bs.js");
var IndicesVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/IndicesVO.bs.js");
var JobEntity$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/pipeline/pipeline/entity/JobEntity.bs.js");
var NormalsVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/NormalsVO.bs.js");
var ListResult$Wonderjs = require("../../../../../../../../../construct/domain_layer/library/structure/ListResult.bs.js");
var PassCPRepo$Wonderjs = require("../../../../../../repo/pipeline/PassCPRepo.bs.js");
var SpecularVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/SpecularVO.bs.js");
var TangentsVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/TangentsVO.bs.js");
var VerticesVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/VerticesVO.bs.js");
var AssetRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/AssetRunAPI.bs.js");
var DpContainer$Wonderjs = require("../../../../../../../../../construct/domain_layer/dependency/container/DpContainer.bs.js");
var MetalnessVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/MetalnessVO.bs.js");
var RoughnessVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/RoughnessVO.bs.js");
var SceneRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/SceneRunAPI.bs.js");
var TexCoordsVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/TexCoordsVO.bs.js");
var WebGPUCPRepo$Wonderjs = require("../../../../../../repo/webgpu/WebGPUCPRepo.bs.js");
var AlphaCutoffVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/AlphaCutoffVO.bs.js");
var GeometryRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/GeometryRunAPI.bs.js");
var NormalMatrixVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/NormalMatrixVO.bs.js");
var TransmissionVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/TransmissionVO.bs.js");
var EmissionColorVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/EmissionColorVO.bs.js");
var PassCPDoService$Wonderjs = require("../../../service/PassCPDoService.bs.js");
var SpecularColorVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/SpecularColorVO.bs.js");
var StorageBufferVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/webgpu/core/value_object/StorageBufferVO.bs.js");
var TransformRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/TransformRunAPI.bs.js");
var UniformBufferVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/webgpu/core/value_object/UniformBufferVO.bs.js");
var GameObjectRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/GameObjectRunAPI.bs.js");
var BSDFMaterialRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/BSDFMaterialRunAPI.bs.js");
var WebGPUCoreDpRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/dependency/WebGPUCoreDpRunAPI.bs.js");
var LocalToWorldMatrixVO$Wonderjs = require("../../../../../../../../../construct/domain_layer/domain/scene/scene_graph/value_object/LocalToWorldMatrixVO.bs.js");
var TypeArrayCPRepoUtils$Wonderjs = require("../../../../../../../infrastructure_layer/dependency/repo/utils/TypeArrayCPRepoUtils.bs.js");
var PathTracingPassCPRepo$Wonderjs = require("../../../../../../repo/pipeline/PathTracingPassCPRepo.bs.js");
var WebGPURayTracingRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/domain/WebGPURayTracingRunAPI.bs.js");
var TextureArrayWebGPUCPRepo$Wonderjs = require("../../../../../../repo/webgpu/TextureArrayWebGPUCPRepo.bs.js");
var WebGPURayTracingDpRunAPI$Wonderjs = require("../../../../../../../../../construct/external_layer/api/dependency/WebGPURayTracingDpRunAPI.bs.js");
var TextureArrayWebGPUCPDoService$Wonderjs = require("../../../../../webgpu/core/service/TextureArrayWebGPUCPDoService.bs.js");

function create(param) {
  return JobEntity$Wonderjs.create("update_pathTracing");
}

function _findIndex(isSameFunc, component, components) {
  return OptionSt$Wonderjs.get(ListSt$Wonderjs.reducei(components, undefined, (function (indexOpt, sourceComponent, index) {
                    if (indexOpt !== undefined) {
                      return indexOpt;
                    } else if (Curry._2(isSameFunc, sourceComponent, component)) {
                      return index;
                    } else {
                      return ;
                    }
                  })));
}

function _buildAndSetSceneDescBufferData(device, allRenderGameObjects, allRenderGeometries, allRenderBSDFMaterials) {
  var gameObjectCount = ListSt$Wonderjs.length(allRenderGameObjects);
  var bufferData = new Float32Array((gameObjectCount << 5));
  var bufferSize = bufferData.byteLength;
  var buffer = StorageBufferVO$Wonderjs.createFromDevice(device, bufferSize, WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.copy_dst | WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.storage, undefined);
  return Result$Wonderjs.mapSuccess(Result$Wonderjs.bind(ListSt$Wonderjs.traverseResultM(allRenderGameObjects, (function (gameObject) {
                        return Tuple3$Wonderjs.collectOption(GameObjectRunAPI$Wonderjs.getTransform(gameObject), GameObjectRunAPI$Wonderjs.getGeometry(gameObject), GameObjectRunAPI$Wonderjs.getBSDFMaterial(gameObject));
                      })), (function (list) {
                    return ListSt$Wonderjs.traverseReduceResultM(list, 0, (function (offset, param) {
                                  var transform = param[0];
                                  return Result$Wonderjs.mapSuccess(Result$Wonderjs.bind(Tuple2$Wonderjs.collectResult(_findIndex(GeometryRunAPI$Wonderjs.isSame, param[1], allRenderGeometries), _findIndex(BSDFMaterialRunAPI$Wonderjs.isSame, param[2], allRenderBSDFMaterials)), (function (param) {
                                                    return ListResult$Wonderjs.mergeResults({
                                                                hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 0 | 0, [
                                                                      param[0],
                                                                      param[1]
                                                                    ], bufferData),
                                                                tl: {
                                                                  hd: TypeArrayCPRepoUtils$Wonderjs.setMat3Data(offset + 4 | 0, NormalMatrixVO$Wonderjs.value(TransformRunAPI$Wonderjs.getNormalMatrix(transform)), bufferData),
                                                                  tl: {
                                                                    hd: TypeArrayCPRepoUtils$Wonderjs.setFloat16WithFloat32Array((offset + 4 | 0) + 12 | 0, LocalToWorldMatrixVO$Wonderjs.value(TransformRunAPI$Wonderjs.getLocalToWorldMatrix(transform)), bufferData),
                                                                    tl: /* [] */0
                                                                  }
                                                                }
                                                              });
                                                  })), (function (param) {
                                                return ((offset + 4 | 0) + 12 | 0) + 16 | 0;
                                              }));
                                }));
                  })), (function (param) {
                Curry._3(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).buffer.setSubFloat32Data, 0, bufferData, StorageBufferVO$Wonderjs.value(buffer));
                return PathTracingPassCPRepo$Wonderjs.setSceneDescBufferData([
                            buffer,
                            bufferSize,
                            bufferData
                          ]);
              }));
}

var _computeVertexCount = VerticesVO$Wonderjs.getCount;

var _computeFaceCount = IndicesVO$Wonderjs.getCount;

function _computeFaceOptCount(indicesOpt) {
  if (indicesOpt !== undefined) {
    return IndicesVO$Wonderjs.getCount(indicesOpt);
  } else {
    return 0;
  }
}

function _buildAndSetPointIndexBufferData(device, allRenderGeometries) {
  var geometryCount = ListSt$Wonderjs.length(allRenderGeometries);
  var bufferData = new Uint32Array((geometryCount << 1));
  var bufferSize = bufferData.byteLength;
  var buffer = StorageBufferVO$Wonderjs.createFromDevice(device, bufferSize, WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.copy_dst | WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.storage, undefined);
  return Result$Wonderjs.mapSuccess(ListSt$Wonderjs.traverseReduceResultMi(allRenderGeometries, [
                  0,
                  0
                ], (function (param, param$1) {
                    var geometry = param$1[1];
                    var geometryIndex = param$1[0];
                    var faceIndex = param[1];
                    var vertexIndex = param[0];
                    return Result$Wonderjs.mapSuccess(ListResult$Wonderjs.mergeResults({
                                    hd: TypeArrayCPRepoUtils$Wonderjs.setUint32_1((geometryIndex << 1), vertexIndex, bufferData),
                                    tl: {
                                      hd: TypeArrayCPRepoUtils$Wonderjs.setUint32_1((geometryIndex << 1) + 1 | 0, faceIndex, bufferData),
                                      tl: /* [] */0
                                    }
                                  }), (function (param) {
                                  return [
                                          vertexIndex + VerticesVO$Wonderjs.getCount(GeometryRunAPI$Wonderjs.getVertices(geometry)) | 0,
                                          faceIndex + _computeFaceOptCount(GeometryRunAPI$Wonderjs.getIndices(geometry)) | 0
                                        ];
                                }));
                  })), (function (param) {
                Curry._3(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).buffer.setSubUint32Data, 0, bufferData, StorageBufferVO$Wonderjs.value(buffer));
                return PathTracingPassCPRepo$Wonderjs.setPointIndexBufferData([
                            buffer,
                            bufferSize,
                            bufferData
                          ]);
              }));
}

function _computeAllVertexCount(allRenderGeometries) {
  return ListSt$Wonderjs.reduce(allRenderGeometries, 0, (function (vertexCount, geometry) {
                return vertexCount + VerticesVO$Wonderjs.getCount(GeometryRunAPI$Wonderjs.getVertices(geometry)) | 0;
              }));
}

function _flipY(texCoordY) {
  return 1.0 - texCoordY;
}

function _getVertexBufferStride(param) {
  return 16;
}

function _createVertexBufferData(allRenderGeometries) {
  var bufferData = new Float32Array((_computeAllVertexCount(allRenderGeometries) << 4));
  ListSt$Wonderjs.reduce(allRenderGeometries, 0, (function (offset, geometry) {
          var vertices = VerticesVO$Wonderjs.value(GeometryRunAPI$Wonderjs.getVertices(geometry));
          var length = vertices.length;
          var i = 0;
          var j = offset;
          while(i < length) {
            bufferData[j] = vertices[i];
            bufferData[j + 1 | 0] = vertices[i + 1 | 0];
            bufferData[j + 2 | 0] = vertices[i + 2 | 0];
            i = i + 3 | 0;
            j = j + 16 | 0;
          };
          var newOffset = j;
          var texCoords = OptionSt$Wonderjs.map(GeometryRunAPI$Wonderjs.getTexCoords(geometry), TexCoordsVO$Wonderjs.value);
          if (texCoords !== undefined) {
            var texCoords$1 = Caml_option.valFromOption(texCoords);
            var length$1 = texCoords$1.length;
            var getTexCoordYFunc = GeometryRunAPI$Wonderjs.isFlipTexCoordY(geometry) ? (function (i) {
                  return 1.0 - texCoords$1[i.contents + 1 | 0];
                }) : (function (i) {
                  return texCoords$1[i.contents + 1 | 0];
                });
            var i$1 = {
              contents: 0
            };
            var j$1 = offset;
            while(i$1.contents < length$1) {
              bufferData[j$1 + 4 | 0] = texCoords$1[i$1.contents];
              bufferData[j$1 + 5 | 0] = Curry._1(getTexCoordYFunc, i$1);
              i$1.contents = i$1.contents + 2 | 0;
              j$1 = j$1 + 16 | 0;
            };
          }
          var normals = OptionSt$Wonderjs.map(GeometryRunAPI$Wonderjs.getNormals(geometry), NormalsVO$Wonderjs.value);
          if (normals !== undefined) {
            var normals$1 = Caml_option.valFromOption(normals);
            var length$2 = normals$1.length;
            var i$2 = 0;
            var j$2 = offset;
            while(i$2 < length$2) {
              bufferData[j$2 + 8 | 0] = normals$1[i$2];
              bufferData[j$2 + 9 | 0] = normals$1[i$2 + 1 | 0];
              bufferData[j$2 + 10 | 0] = normals$1[i$2 + 2 | 0];
              i$2 = i$2 + 3 | 0;
              j$2 = j$2 + 16 | 0;
            };
          }
          var tangents = OptionSt$Wonderjs.map(GeometryRunAPI$Wonderjs.getTangents(geometry), TangentsVO$Wonderjs.value);
          if (tangents !== undefined) {
            var tangents$1 = Caml_option.valFromOption(tangents);
            var length$3 = tangents$1.length;
            var i$3 = 0;
            var j$3 = offset;
            while(i$3 < length$3) {
              bufferData[j$3 + 12 | 0] = tangents$1[i$3];
              bufferData[j$3 + 13 | 0] = tangents$1[i$3 + 1 | 0];
              bufferData[j$3 + 14 | 0] = tangents$1[i$3 + 2 | 0];
              i$3 = i$3 + 3 | 0;
              j$3 = j$3 + 16 | 0;
            };
          }
          return newOffset;
        }));
  return bufferData;
}

function _buildAndSetVertexBufferData(device, allRenderGeometries) {
  var bufferData = _createVertexBufferData(allRenderGeometries);
  var bufferSize = bufferData.byteLength;
  var buffer = StorageBufferVO$Wonderjs.createFromDevice(device, bufferSize, WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.copy_dst | WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.storage, undefined);
  Curry._3(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).buffer.setSubFloat32Data, 0, bufferData, StorageBufferVO$Wonderjs.value(buffer));
  return PathTracingPassCPRepo$Wonderjs.setVertexBufferData([
              buffer,
              bufferSize,
              bufferData
            ]);
}

function _computeAllFaceCount(allRenderGeometries) {
  return ListSt$Wonderjs.reduce(allRenderGeometries, 0, (function (faceCount, geometry) {
                return faceCount + _computeFaceOptCount(GeometryRunAPI$Wonderjs.getIndices(geometry)) | 0;
              }));
}

function _createIndexBufferData(allRenderGeometries) {
  var bufferData = new Uint32Array((_computeAllFaceCount(allRenderGeometries) << 0));
  return Result$Wonderjs.mapSuccess(ListSt$Wonderjs.traverseReduceResultM(allRenderGeometries, 0, (function (offset, geometry) {
                    var indices = GeometryRunAPI$Wonderjs.getIndices(geometry);
                    if (indices !== undefined) {
                      return Result$Wonderjs.mapSuccess(TypeArrayCPRepoUtils$Wonderjs.fillUint32ArrayWithOffset(bufferData, IndicesVO$Wonderjs.value(indices), offset), (function (param) {
                                    return offset + IndicesVO$Wonderjs.getCount(indices) | 0;
                                  }));
                    } else {
                      return Result$Wonderjs.succeed(offset);
                    }
                  })), (function (param) {
                return bufferData;
              }));
}

function _buildAndSetIndexBufferData(device, allRenderGeometries) {
  return Result$Wonderjs.mapSuccess(_createIndexBufferData(allRenderGeometries), (function (bufferData) {
                var bufferSize = bufferData.byteLength;
                var buffer = StorageBufferVO$Wonderjs.createFromDevice(device, bufferSize, WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.copy_dst | WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.storage, undefined);
                Curry._3(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).buffer.setSubUint32Data, 0, bufferData, StorageBufferVO$Wonderjs.value(buffer));
                return PathTracingPassCPRepo$Wonderjs.setIndexBufferData([
                            buffer,
                            bufferSize
                          ]);
              }));
}

function _getMapLayerIndexForNotExist(param) {
  return 5000;
}

function _getMapLayerIndex(mapImageIdOpt) {
  if (mapImageIdOpt !== undefined) {
    return OptionSt$Wonderjs.getWithDefault(TextureArrayWebGPUCPRepo$Wonderjs.getLayerIndex(ImageIdVO$Wonderjs.value(mapImageIdOpt)), 5000);
  } else {
    return 5000;
  }
}

function _computeMapScale(mapImageIdOpt) {
  var defaultScale = [
    1.0,
    1.0
  ];
  var tmp;
  if (mapImageIdOpt !== undefined) {
    var match = AssetRunAPI$Wonderjs.getImageData(mapImageIdOpt);
    if (match !== undefined) {
      var match$1 = TextureArrayWebGPUCPDoService$Wonderjs.getTextureArrayLayerSize(undefined);
      tmp = [
        Number$Wonderjs.dividInt(match.width, match$1[0]),
        Number$Wonderjs.dividInt(match.height, match$1[1])
      ];
    } else {
      tmp = defaultScale;
    }
  } else {
    tmp = defaultScale;
  }
  return Contract$Wonderjs.ensureCheck(tmp, (function (param) {
                var scaleY = param[1];
                var scaleX = param[0];
                return Contract$Wonderjs.test(Log$Wonderjs.buildAssertMessage("map scale in (0.0, 1.0]", "not "), (function (param) {
                              if (Contract$Wonderjs.Operators.$great$dot(scaleX, 0.0) && Contract$Wonderjs.Operators.$less$eq$dot(scaleX, 1.0) && Contract$Wonderjs.Operators.$great$dot(scaleY, 0.0)) {
                                return Contract$Wonderjs.Operators.$less$eq$dot(scaleY, 1.0);
                              } else {
                                return false;
                              }
                            }));
              }), Curry._1(DpContainer$Wonderjs.unsafeGetConfigDp(undefined).getIsDebug, undefined));
}

function _getMapImageWrapData(mapImageWrapDataOpt) {
  if (mapImageWrapDataOpt !== undefined) {
    return [
            mapImageWrapDataOpt[0],
            mapImageWrapDataOpt[1]
          ];
  } else {
    return [
            1,
            1
          ];
  }
}

function _convertBoolToFloat(boolValue) {
  if (boolValue) {
    return 1.0;
  } else {
    return 0.0;
  }
}

function _buildAndSetBSDFMaterialBufferData(device, allRenderBSDFMaterials) {
  var bsdfMaterialCount = ListSt$Wonderjs.length(allRenderBSDFMaterials);
  var bufferData = new Float32Array(Math.imul(bsdfMaterialCount, 48));
  var bufferSize = bufferData.byteLength;
  var buffer = StorageBufferVO$Wonderjs.createFromDevice(device, bufferSize, WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.copy_dst | WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).bufferUsage.storage, undefined);
  return Result$Wonderjs.mapSuccess(ListSt$Wonderjs.traverseReduceResultM(allRenderBSDFMaterials, 0, (function (offset, bsdfMaterial) {
                    var diffuse = DiffuseVO$Wonderjs.getPrimitiveValue(BSDFMaterialRunAPI$Wonderjs.getDiffuseColor(bsdfMaterial));
                    var emissionColor = EmissionColorVO$Wonderjs.getPrimitiveValue(BSDFMaterialRunAPI$Wonderjs.getEmissionColor(bsdfMaterial));
                    var alphaCutoff = AlphaCutoffVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getAlphaCutoff(bsdfMaterial));
                    var specularColor = SpecularColorVO$Wonderjs.getPrimitiveValue(BSDFMaterialRunAPI$Wonderjs.getSpecularColor(bsdfMaterial));
                    var specular = SpecularVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getSpecular(bsdfMaterial));
                    var roughness = RoughnessVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getRoughness(bsdfMaterial));
                    var metalness = MetalnessVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getMetalness(bsdfMaterial));
                    var transmission = TransmissionVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getTransmission(bsdfMaterial));
                    var ior = IORVO$Wonderjs.value(BSDFMaterialRunAPI$Wonderjs.getIOR(bsdfMaterial));
                    var isDoubleSide = BSDFMaterialRunAPI$Wonderjs.isDoubleSide(bsdfMaterial);
                    var diffuseMapImageId = BSDFMaterialRunAPI$Wonderjs.getDiffuseMapImageId(bsdfMaterial);
                    var channelRoughnessMetallicMapImageId = BSDFMaterialRunAPI$Wonderjs.getChannelRoughnessMetallicMapImageId(bsdfMaterial);
                    var emissionMapImageId = BSDFMaterialRunAPI$Wonderjs.getEmissionMapImageId(bsdfMaterial);
                    var normalMapImageId = BSDFMaterialRunAPI$Wonderjs.getNormalMapImageId(bsdfMaterial);
                    var transmissionMapImageId = BSDFMaterialRunAPI$Wonderjs.getTransmissionMapImageId(bsdfMaterial);
                    var specularMapImageId = BSDFMaterialRunAPI$Wonderjs.getSpecularMapImageId(bsdfMaterial);
                    var diffuseMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getDiffuseMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    var channelRoughnessMetallicMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getChannelRoughnessMetallicMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    var emissionMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getEmissionMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    var normalMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getNormalMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    var transmissionMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getTransmissionMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    var specularMapImageWrapData = _getMapImageWrapData(OptionSt$Wonderjs.map(BSDFMaterialRunAPI$Wonderjs.getSpecularMapImageWrapData(bsdfMaterial), (function (param) {
                                return Tuple2$Wonderjs.map(WrapVO$Wonderjs.value, param);
                              })));
                    return Result$Wonderjs.mapSuccess(Result$Wonderjs.bind(Tuple6$Wonderjs.collectResult(_computeMapScale(diffuseMapImageId), _computeMapScale(channelRoughnessMetallicMapImageId), _computeMapScale(emissionMapImageId), _computeMapScale(normalMapImageId), _computeMapScale(transmissionMapImageId), _computeMapScale(specularMapImageId)), (function (param) {
                                      return ListResult$Wonderjs.mergeResults({
                                                  hd: TypeArrayCPRepoUtils$Wonderjs.setFloat4(offset + 0 | 0, diffuse, bufferData),
                                                  tl: {
                                                    hd: TypeArrayCPRepoUtils$Wonderjs.setFloat3(offset + 4 | 0, emissionColor, bufferData),
                                                    tl: {
                                                      hd: TypeArrayCPRepoUtils$Wonderjs.setFloat3(offset + 8 | 0, specularColor, bufferData),
                                                      tl: {
                                                        hd: TypeArrayCPRepoUtils$Wonderjs.setFloat1(offset + 11 | 0, alphaCutoff, bufferData),
                                                        tl: {
                                                          hd: TypeArrayCPRepoUtils$Wonderjs.setFloat4(offset + 12 | 0, [
                                                                metalness,
                                                                roughness,
                                                                specular,
                                                                transmission
                                                              ], bufferData),
                                                          tl: {
                                                            hd: TypeArrayCPRepoUtils$Wonderjs.setFloat4(offset + 16 | 0, [
                                                                  ior,
                                                                  isDoubleSide ? 1.0 : 0.0,
                                                                  _getMapLayerIndex(diffuseMapImageId),
                                                                  _getMapLayerIndex(channelRoughnessMetallicMapImageId)
                                                                ], bufferData),
                                                            tl: {
                                                              hd: TypeArrayCPRepoUtils$Wonderjs.setFloat4(offset + 20 | 0, [
                                                                    _getMapLayerIndex(emissionMapImageId),
                                                                    _getMapLayerIndex(normalMapImageId),
                                                                    _getMapLayerIndex(transmissionMapImageId),
                                                                    _getMapLayerIndex(specularMapImageId)
                                                                  ], bufferData),
                                                              tl: {
                                                                hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 24 | 0, param[0], bufferData),
                                                                tl: {
                                                                  hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 26 | 0, param[1], bufferData),
                                                                  tl: {
                                                                    hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 28 | 0, param[2], bufferData),
                                                                    tl: {
                                                                      hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 30 | 0, param[3], bufferData),
                                                                      tl: {
                                                                        hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 32 | 0, param[4], bufferData),
                                                                        tl: {
                                                                          hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 34 | 0, param[5], bufferData),
                                                                          tl: {
                                                                            hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 36 | 0, diffuseMapImageWrapData, bufferData),
                                                                            tl: {
                                                                              hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 38 | 0, channelRoughnessMetallicMapImageWrapData, bufferData),
                                                                              tl: {
                                                                                hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 40 | 0, emissionMapImageWrapData, bufferData),
                                                                                tl: {
                                                                                  hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 42 | 0, normalMapImageWrapData, bufferData),
                                                                                  tl: {
                                                                                    hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 44 | 0, transmissionMapImageWrapData, bufferData),
                                                                                    tl: {
                                                                                      hd: TypeArrayCPRepoUtils$Wonderjs.setFloat2(offset + 46 | 0, specularMapImageWrapData, bufferData),
                                                                                      tl: /* [] */0
                                                                                    }
                                                                                  }
                                                                                }
                                                                              }
                                                                            }
                                                                          }
                                                                        }
                                                                      }
                                                                    }
                                                                  }
                                                                }
                                                              }
                                                            }
                                                          }
                                                        }
                                                      }
                                                    }
                                                  }
                                                });
                                    })), (function (param) {
                                  return offset + 48 | 0;
                                }));
                  })), (function (param) {
                Curry._3(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).buffer.setSubFloat32Data, 0, bufferData, StorageBufferVO$Wonderjs.value(buffer));
                return PathTracingPassCPRepo$Wonderjs.setBSDFMaterialBufferData([
                            buffer,
                            bufferSize,
                            bufferData
                          ]);
              }));
}

function _buildAndSetAllBufferData(device, sceneGameObject) {
  var allRenderGeometries = GameObjectRunAPI$Wonderjs.getAllRenderGeometries(sceneGameObject);
  var allRenderBSDFMaterials = GameObjectRunAPI$Wonderjs.getAllRenderBSDFMaterials(sceneGameObject);
  return ListResult$Wonderjs.mergeResults({
              hd: _buildAndSetSceneDescBufferData(device, GameObjectRunAPI$Wonderjs.getAllRenderGameObjects(sceneGameObject), allRenderGeometries, allRenderBSDFMaterials),
              tl: {
                hd: _buildAndSetPointIndexBufferData(device, allRenderGeometries),
                tl: {
                  hd: Result$Wonderjs.succeed(_buildAndSetVertexBufferData(device, allRenderGeometries)),
                  tl: {
                    hd: _buildAndSetIndexBufferData(device, allRenderGeometries),
                    tl: {
                      hd: _buildAndSetBSDFMaterialBufferData(device, allRenderBSDFMaterials),
                      tl: /* [] */0
                    }
                  }
                }
              }
            });
}

function _createAndAddRayTracingBindGroup(device, instanceContainer, param, param$1) {
  var match = param$1[1];
  var match$1 = param$1[0];
  var match$2 = param[4];
  var match$3 = param[3];
  var match$4 = param[2];
  var match$5 = param[1];
  var match$6 = param[0];
  var rtBindGroupLayout = Curry._2(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).device.createBindGroupLayout, {
        entries: [
          {
            binding: 0,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_generation | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "acceleration-container"
          },
          {
            binding: 1,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_generation,
            type: "storage-buffer"
          },
          {
            binding: 2,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_generation,
            type: "uniform-buffer"
          },
          {
            binding: 3,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "storage-buffer"
          },
          {
            binding: 4,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "storage-buffer"
          },
          {
            binding: 5,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "storage-buffer"
          },
          {
            binding: 6,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "storage-buffer"
          },
          {
            binding: 7,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "storage-buffer"
          },
          {
            binding: 8,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "sampler"
          },
          {
            binding: 9,
            visibility: WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_closest_hit | WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).shaderStage.ray_any_hit,
            type: "sampled-texture",
            viewDimension: "2d-array"
          }
        ]
      }, device);
  PathTracingPassCPRepo$Wonderjs.addStaticBindGroupData(0, Curry._2(WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).device.createRayTracingBindGroup, {
            layout: rtBindGroupLayout,
            entries: [
              {
                accelerationContainer: instanceContainer,
                binding: 0,
                offset: 0,
                size: 0
              },
              {
                binding: 1,
                buffer: StorageBufferVO$Wonderjs.value(match$1[0]),
                offset: 0,
                size: match$1[1]
              },
              {
                binding: 2,
                buffer: UniformBufferVO$Wonderjs.value(match[0]),
                offset: 0,
                size: PassCPDoService$Wonderjs.getCommonBufferDataSize(match[1])
              },
              {
                binding: 3,
                buffer: StorageBufferVO$Wonderjs.value(match$6[0]),
                offset: 0,
                size: match$6[1]
              },
              {
                binding: 4,
                buffer: StorageBufferVO$Wonderjs.value(match$5[0]),
                offset: 0,
                size: match$5[1]
              },
              {
                binding: 5,
                buffer: StorageBufferVO$Wonderjs.value(match$4[0]),
                offset: 0,
                size: match$4[1]
              },
              {
                binding: 6,
                buffer: StorageBufferVO$Wonderjs.value(match$3[0]),
                offset: 0,
                size: match$3[1]
              },
              {
                binding: 7,
                buffer: StorageBufferVO$Wonderjs.value(match$2[0]),
                offset: 0,
                size: match$2[1]
              },
              {
                binding: 8,
                sampler: param[5],
                size: 0
              },
              {
                binding: 9,
                textureView: param[6],
                size: 0
              }
            ]
          }, device));
  return rtBindGroupLayout;
}

function _createAndSetPipeline(device, rtBindGroupLayout) {
  return Result$Wonderjs.mapSuccess(Tuple3$Wonderjs.collectOption(PathTracingPassCPRepo$Wonderjs.getShaderBindingTable(undefined), PathTracingPassCPRepo$Wonderjs.getCameraBindGroupLayout(undefined), PathTracingPassCPRepo$Wonderjs.getDirectionLightBindGroupLayout(undefined)), (function (param) {
                return PathTracingPassCPRepo$Wonderjs.setPipeline(Curry._2(WebGPURayTracingDpRunAPI$Wonderjs.unsafeGet(undefined).device.createRayTracingPipeline, {
                                layout: Curry._2(WebGPUCoreDpRunAPI$Wonderjs.unsafeGet(undefined).device.createPipelineLayout, {
                                      bindGroupLayouts: [
                                        rtBindGroupLayout,
                                        param[1],
                                        param[2]
                                      ]
                                    }, device),
                                rayTracingState: {
                                  shaderBindingTable: param[0],
                                  maxRecursionDepth: 1,
                                  maxPayloadSize: (((Math.imul(9, Float32Array.BYTES_PER_ELEMENT) + (Uint32Array.BYTES_PER_ELEMENT << 0) | 0) + (Float32Array.BYTES_PER_ELEMENT << 0) | 0) + (Float32Array.BYTES_PER_ELEMENT << 0) | 0) + Math.imul(3, Float32Array.BYTES_PER_ELEMENT) | 0
                                }
                              }, device));
              }));
}

function exec(param) {
  return Most.just(Result$Wonderjs.bind(Tuple2$Wonderjs.collectOption(WebGPUCPRepo$Wonderjs.getDevice(undefined), WebGPUCPRepo$Wonderjs.getQueue(undefined)), (function (param) {
                    var device = param[0];
                    return Result$Wonderjs.bind(WebGPURayTracingRunAPI$Wonderjs.buildContainers(device, param[1]), (function (instanceContainer) {
                                  return Result$Wonderjs.bind(_buildAndSetAllBufferData(device, SceneRunAPI$Wonderjs.getSceneGameObject(undefined)), (function (param) {
                                                return Result$Wonderjs.bind(Tuple2$Wonderjs.collectOption(PassCPRepo$Wonderjs.getPixelBufferData(undefined), PassCPRepo$Wonderjs.getCommonBufferData(undefined)), (function (passAllBufferData) {
                                                              return Result$Wonderjs.bind(Tuple7$Wonderjs.collectOption(PathTracingPassCPRepo$Wonderjs.getSceneDescBufferData(undefined), PathTracingPassCPRepo$Wonderjs.getPointIndexBufferData(undefined), PathTracingPassCPRepo$Wonderjs.getVertexBufferData(undefined), PathTracingPassCPRepo$Wonderjs.getIndexBufferData(undefined), PathTracingPassCPRepo$Wonderjs.getBSDFMaterialBufferData(undefined), TextureArrayWebGPUCPRepo$Wonderjs.getTextureSampler(undefined), TextureArrayWebGPUCPRepo$Wonderjs.getTextureArrayView(undefined)), (function (pathTracingAllBufferDataAndTextureArrayData) {
                                                                            return _createAndSetPipeline(device, _createAndAddRayTracingBindGroup(device, instanceContainer, pathTracingAllBufferDataAndTextureArrayData, passAllBufferData));
                                                                          }));
                                                            }));
                                              }));
                                }));
                  })));
}

exports.create = create;
exports._findIndex = _findIndex;
exports._buildAndSetSceneDescBufferData = _buildAndSetSceneDescBufferData;
exports._computeVertexCount = _computeVertexCount;
exports._computeFaceCount = _computeFaceCount;
exports._computeFaceOptCount = _computeFaceOptCount;
exports._buildAndSetPointIndexBufferData = _buildAndSetPointIndexBufferData;
exports._computeAllVertexCount = _computeAllVertexCount;
exports._flipY = _flipY;
exports._getVertexBufferStride = _getVertexBufferStride;
exports._createVertexBufferData = _createVertexBufferData;
exports._buildAndSetVertexBufferData = _buildAndSetVertexBufferData;
exports._computeAllFaceCount = _computeAllFaceCount;
exports._createIndexBufferData = _createIndexBufferData;
exports._buildAndSetIndexBufferData = _buildAndSetIndexBufferData;
exports._getMapLayerIndexForNotExist = _getMapLayerIndexForNotExist;
exports._getMapLayerIndex = _getMapLayerIndex;
exports._computeMapScale = _computeMapScale;
exports._getMapImageWrapData = _getMapImageWrapData;
exports._convertBoolToFloat = _convertBoolToFloat;
exports._buildAndSetBSDFMaterialBufferData = _buildAndSetBSDFMaterialBufferData;
exports._buildAndSetAllBufferData = _buildAndSetAllBufferData;
exports._createAndAddRayTracingBindGroup = _createAndAddRayTracingBindGroup;
exports._createAndSetPipeline = _createAndSetPipeline;
exports.exec = exec;
/* most Not a pure module */