Source code for subsurface.writer.to_rex.mesh_encoder

from subsurface.writer.to_rex.common import mesh_header_size, \
    write_data_block_header, encode
from subsurface.writer.to_rex.data_struct import RexMesh


__all__ = ['mesh_encode', 'write_mesh_coordinates', 'write_mesh_header']


[docs]def mesh_encode(rex_mesh: RexMesh, data_id: int): material_id = rex_mesh.material_id n_vtx_coord = rex_mesh.n_vtx n_triangles = rex_mesh.n_triangles n_vtx_colors = rex_mesh.n_color surface_name = rex_mesh.name ver_ravel = rex_mesh.ver_ravel tri_ravel = rex_mesh.tri_ravel c_r = rex_mesh.color_ravel # Write Mesh block - header mesh_header_bytes = write_mesh_header( n_vtx_coord / 3, n_triangles / 3, n_vtx_colors=n_vtx_colors / 3, start_vtx_coord=mesh_header_size, start_nor_coord=mesh_header_size + n_vtx_coord * 4, start_tex_coord=mesh_header_size + n_vtx_coord * 4, start_vtx_colors=mesh_header_size + n_vtx_coord * 4, start_triangles=mesh_header_size + ((n_vtx_coord + n_vtx_colors) * 4), name=surface_name, material_id=material_id # self.data_id + surface_df.shape[0] ) # Write Mesh block - Vertex, triangles mesh_block_bytes = write_mesh_coordinates(ver_ravel, tri_ravel, colors=c_r # When using # material we can avoid this ) # Calculate the size of the mesh block mesh_block_size_no_data_block_header = len(mesh_header_bytes) + \ len(mesh_block_bytes) # This is cte 128 # Write data block header for Mesh 1 data_header_bytes = write_data_block_header( size_data=mesh_block_size_no_data_block_header, data_id=data_id, data_type=3, # 3 for mesh version_data=1 # Probably useful for counting # the operation number ) rex_bytes = data_header_bytes + mesh_header_bytes + mesh_block_bytes return rex_bytes
[docs]def write_mesh_coordinates(vertex, triangles, normal=None, texture=None, colors=None): """Block with the coordinates of a mesh. This has to go with a header! Args: vertex (numpy.ndarray[float32]): Array of vertex XYZXYZ... triangles (numpy.ndarray[int32]): This is a list of integers which form one triangle. Please make sure that normal and texture coordinates are inline with the vertex coordinates. One index refers to the same normal and texture position. The triangle orientation is required to be counter-clockwise (CCW) normal (numpy.ndarray): texture (numpy.ndarray): colors (numpy.ndarray): Returns: """ # ver = vertex.ravel() # tri = triangles.ravel() if normal is None: normal = [] if texture is None: texture = [] if colors is None: colors = [] input_ = [(vertex, 'float32'), (normal, 'float32'), (texture, 'float32'), (colors, 'float32'), (triangles, 'uint32')] block_bytes = encode(input_) return block_bytes
[docs]def write_mesh_header(n_vtx_coord, n_triangles, start_vtx_coord, start_nor_coord, start_tex_coord, start_vtx_colors, start_triangles, name, material_id=1, # material_id=9223372036854775807 n_nor_coord=0, n_tex_coord=0, n_vtx_colors=0, lod=1, max_lod=1): """Function to write MESH DATA BLOCK header. The header size is fixed at 128 bytes. Args: n_vtx_coord: number of vertex coordinates n_triangles: number of triangles start_vtx_coord: start vertex coordinate block (relative to mesh block start) start_nor_coord: start vertex normals block (relative to mesh block start) start_tex_coord: start of texture coordinate block (relative to mesh block start) start_vtx_colors: start of colors block (relative to mesh block start) start_triangles: start triangle block for vertices (relative to mesh block start) name (str): Name of the mesh material_id (int): id which refers to the corresponding material block in this file n_nor_coord: number of normal coordinates (can be zero) n_tex_coord: number of texture coordinates (can be zero) n_vtx_colors: number of vertex colors (can be zero) lod (int): level of detail for the given geometry max_lod (int): maximal level of detail for given geometry Returns: bytes: array of bytes """ # Strings are immutable so there is no way to modify them in place str_size = len(name) # Size of the actual name of the mesh rest_name = ' ' * (74 - str_size) # full_name = name + rest_name input_ = [([lod, max_lod], 'uint16'), # Level of detail ([n_vtx_coord, # number of vertex coordinates n_nor_coord, # number of normal coordinates (can be zero) n_tex_coord, # number of texture coordinates (can be zero) n_vtx_colors, # number of vertex colors (can be zero) n_triangles, # number of triangles start_vtx_coord, # start vertex coordinate block (relative to mesh block start) start_nor_coord, # start vertex normals block (relative to mesh block start) start_tex_coord, # start of texture coordinate block (relative to mesh block start) start_vtx_colors, # start of colors block (relative to mesh block start) start_triangles # start triangle block for vertices (relative to mesh block start) ], 'uint32'), (material_id, 'uint64'), # id which refers to the corresponding material block in this file (str_size, 'uint16'), # size of the following string name (full_name, 'bytes')] # name of the mesh (this is user-readable) block_bytes = encode(input_) return block_bytes