/* * O-Voxel Convertion API * * Copyright (C) 2025, Jianfeng XIANG * All rights reserved. * * Licensed under The MIT License [see LICENSE for details] * * Written by Jianfeng XIANG */ #pragma once #include /** * Extract flexible dual grid from a triangle mesh. * * @param vertices: Tensor of shape (N, 3) containing vertex positions. * @param faces: Tensor of shape (M, 3) containing triangle vertex indices. * @param voxel_size: Tensor of shape (3,) containing the voxel size in each dimension. * @param grid_range: Tensor of shape (2, 3) containing the minimum and maximum coordinates of the grid range. * @param face_weight: Weight for the face edges in the QEM computation. * @param boundary_weight: Weight for the boundary edges in the QEM computation. * @param regularization_weight: Regularization factor to apply to the QEM matrices. * @param timing: Boolean flag to indicate whether to print timing information. * * @return a tuple ((x, y, z), vertices, intersected, faces) containing the remeshed vertices and the corresponding voxel grid. */ std::tuple mesh_to_flexible_dual_grid_cpu( const torch::Tensor& vertices, const torch::Tensor& faces, const torch::Tensor& voxel_size, const torch::Tensor& grid_range, float face_weight, float boundary_weight, float regularization_weight, bool timing ); /** * Voxelizes a triangle mesh with PBR materials * * @param voxel_size [3] tensor containing the size of a voxel * @param grid_range [6] tensor containing the size of the grid * @param vertices [N_tri, 3, 3] array containing the triangle vertices * @param normals [N_tri, 3, 3] array containing the triangle vertex normals * @param uvs [N_tri, 3, 2] tensor containing the texture coordinates * @param materialIds [N_tri] tensor containing the material ids * @param baseColorFactor list of [3] tensor containing the base color factor * @param baseColorTexture list of [H, W, 3] tensor containing the base color texture * @param baseColorTextureFilter list of int indicating the base color texture filter (0: NEAREST, 1: LINEAR) * @param baseColorTextureWrap list of int indicating the base color texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param metallicFactor list of float containing the metallic factor * @param metallicTexture list of [H, W] tensor containing the metallic texture * @param metallicTextureFilter list of int indicating the metallic texture filter (0: NEAREST, 1: LINEAR) * @param metallicTextureWrap list of int indicating the metallic texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param roughnessFactor list of float containing the roughness factor * @param roughnessTexture list of [H, W] tensor containing the roughness texture * @param roughnessTextureFilter list of int indicating the roughness texture filter (0: NEAREST, 1: LINEAR) * @param roughnessTextureWrap list of int indicating the roughness texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param emissiveFactor list of [3] tensor containing the emissive factor * @param emissiveTexture list of [H, W, 3] tensor containing the emissive texture * @param emissiveTextureFilter list of int indicating the emissive texture filter (0: NEAREST, 1: LINEAR) * @param emissiveTextureWrap list of int indicating the emissive texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param alphaMode list of int indicating the alpha mode (0: OPAQUE, 1: MASK, 2: BLEND) * @param alphaCutoff list of float containing the alpha cutoff * @param alphaFactor list of float containing the alpha factor * @param alphaTexture list of [H, W] tensor containing the alpha texture * @param alphaTextureFilter list of int indicating the alpha texture filter (0: NEAREST, 1: LINEAR) * @param alphaTextureWrap list of int indicating the alpha texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param normalTexture list of [H, W, 3] tensor containing the normal texture * @param normalTextureFilter list of int indicating the normal texture filter (0: NEAREST, 1: LINEAR) * @param normalTextureWrap list of int indicating the normal texture wrap (0: REPEAT, 1: CLAMP_TO_EDGE, 2: MIRRORED_REPEAT) * @param mipLevelOffset float indicating the mip level offset for texture mipmap * * @return tuple containing: * - coords: tensor of shape [N, 3] containing the voxel coordinates * - out_baseColor: tensor of shape [N, 3] containing the base color of each voxel * - out_metallic: tensor of shape [N, 1] containing the metallic of each voxel * - out_roughness: tensor of shape [N, 1] containing the roughness of each voxel * - out_emissive: tensor of shape [N, 3] containing the emissive of each voxel * - out_alpha: tensor of shape [N, 1] containing the alpha of each voxel * - out_normal: tensor of shape [N, 3] containing the normal of each voxel */ std::tuple textured_mesh_to_volumetric_attr_cpu( const torch::Tensor& voxel_size, const torch::Tensor& grid_range, const torch::Tensor& vertices, const torch::Tensor& normals, const torch::Tensor& uvs, const torch::Tensor& materialIds, const std::vector& baseColorFactor, const std::vector& baseColorTexture, const std::vector& baseColorTextureFilter, const std::vector& baseColorTextureWrap, const std::vector& metallicFactor, const std::vector& metallicTexture, const std::vector& metallicTextureFilter, const std::vector& metallicTextureWrap, const std::vector& roughnessFactor, const std::vector& roughnessTexture, const std::vector& roughnessTextureFilter, const std::vector& roughnessTextureWrap, const std::vector& emissiveFactor, const std::vector& emissiveTexture, const std::vector& emissiveTextureFilter, const std::vector& emissiveTextureWrap, const std::vector& alphaMode, const std::vector& alphaCutoff, const std::vector& alphaFactor, const std::vector& alphaTexture, const std::vector& alphaTextureFilter, const std::vector& alphaTextureWrap, const std::vector& normalTexture, const std::vector& normalTextureFilter, const std::vector& normalTextureWrap, const float mipLevelOffset, const bool timing );