LibGame v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
Loading...
Searching...
No Matches
lg_mesh.c File Reference

Functions

LG_Meshlg_mesh_load (const char *relative_path, LG_LoadMesh_Flags flags)
 
LG_Meshlg_mesh_load_easy (const char *relative_path, zboolean force_reload_objs, LG_LoadMesh_Flags flags1)
 
LG_Meshlg_mesh_new_from_objfile (const char *relative_path, zboolean invert_z, zboolean normalize_xyz, zboolean horiz_center, zboolean vert_center, zboolean vert_bottom)
 
LG_Meshlg_mesh_new_from_fbxfile (const char *relative_path, zboolean invert_z, zboolean normalize_xyz, zboolean horiz_center, zboolean vert_center, zboolean vert_bottom)
 
void lg_mesh_free (LG_Mesh *mesh)
 
int lg_bmesh_save_to_file (const char *full_path, LG_Mesh *mesh)
 
int lg_bmesh_load_from_file (const char *full_path, LG_Mesh **mesh)
 
int lg_mesh_reload_mats (LG_Mesh *mesh)
 
void lg_serialize_LG_Material_64_to_32 (Serializable_LG_Material *s_mat, LG_Material *mat)
 
void lg_unserialize_LG_Material_32_to_64 (LG_Material *mat, Serializable_LG_Material *s_mat)
 
void lg_serialize_LG_Mesh_64_to_32 (Serializable_LG_Mesh *s_mesh, LG_Mesh *mesh)
 
void lg_unserialize_LG_Mesh_32_to_64 (LG_Mesh *mesh, Serializable_LG_Mesh *s_mesh)
 
LG_LoadMesh_Flags lg_loadmesh_flags (zboolean save_to_assets, zboolean invert_z, zboolean normalize_xyz, zboolean horiz_center, zboolean vert_center, zboolean vert_bottom)
 
void lg_mesh_info (LG_Mesh *mesh)
 
char * lg_replace_file_extension (const char *path, const char *new_ext)
 

Detailed Description

This module deals with meshes, ie data that will feed VBOs and IBOs for fast and efficient drawing.

You can/should only use this func to load meshes:

LG_Mesh *lg_mesh_load(const char *relative_path, LG_LoadMesh_Flags flags)
// LG_Mesh struct is defined in lg_mesh.h
// relative_path = relative path of mesh file, with extension OBJ or FBX or BMESH, expected to be in predefined locations
// Mesh loading flags
typedef struct {
zboolean save_to_assets; // Save to assets as BMESH, otherwise to cache - on Android, should always be set to FALSE as you can't write to assets
zboolean invert_z; // Invert z spatial coord - should be set to TRUE if mesh uses RH coords sys, FALSE if mesh uses LH coords sys
zboolean normalize_xyz;
zboolean horiz_center;
zboolean vert_center; // Center mesh vertically, if vert_bottom is not set
zboolean vert_bottom; // Set mesh origin vertically at bottom, override vert_center
LG_Mesh * lg_mesh_load(const char *relative_path, LG_LoadMesh_Flags flags)
Definition lg_mesh.c:72
Definition lg_mesh.h:118
Definition lg_mesh.h:84

and you can/should only use this func when done with a mesh:

void lg_mesh_free(LG_Mesh *mesh)
Definition lg_mesh.c:252

and just ignore the details.

(Use everything here only if you know what you're doing).

NEW CONVENTIONS FOR PATHS / FILE NAMES AS FUNC ARGS:

- full_path -> absolute path, include file name
- relative_path -> relative path, include file name = sub_dir1/sub_dir2/.../file_name
- file_name -> basename only, always with extension

Function Documentation

◆ lg_mesh_load()

LG_Mesh * lg_mesh_load ( const char *  relative_path,
LG_LoadMesh_Flags  flags 
)

Load OBJ or FBX or BMESH mesh file

=== THIS IS THE NEW ENTRY POINT FOR LOADING MESHES (OBJ, FBX, BMESH) AND THE ONLY FUNC YOU NEED TO CALL ===

  • Valid extensions are OBJ, FBX, and BMESH
  • Expected to be in predefined locations

If OBJ or FBX file successfully loaded, then successfully saved as BMESH, will set mesh name ext as BMESH

WARNING: FBX support is not complete yet

Parameters
relative_pathRelative path of mesh file, with extension OBJ or FBX or BMESH, expected to be in predefined locations
flagsApply to mesh: save_to_assets, invert_z, normalize_xyz, horiz_center, vert_center, vert_bottom
Returns
Pointer to LG_Mesh if OK, NULL on error

◆ lg_mesh_load_easy()

LG_Mesh * lg_mesh_load_easy ( const char *  relative_path,
zboolean  force_reload_objs,
LG_LoadMesh_Flags  flags1 
)

Helper func which will call lg_mesh_load()

If force_reload_objs is set to TRUE, look only for OBJ or FBX files - if found, parse them and save them as BMESH files

Otherwise, look first for BMESH files - if not found, look for OBJ or FBX files - if found, parse them and save them as BMESH files

Example use:

LG_LoadMesh_Flags flags1 = lg_loadmesh_flags(SAVE_TO_ASSETS, FALSE, NORMALIZE_XYZ, HORIZ_CENTER, FALSE, VERT_BOTTOM);
zboolean force_reload_objs = TRUE; // Easier than deleting all files in assets/meshes/bmesh/
LG_Mesh *cottage_mesh = lg_mesh_load_easy("cottage.bmesh", force_reload_objs, flags1);
if (cottage_mesh == NULL) exit(-1);
LG_Mesh *cottage3_mesh = lg_mesh_load_easy("cottage3.bmesh", force_reload_objs, flags1);
if (cottage3_mesh == NULL) exit(-1);
LG_Mesh *tree2_mesh = lg_mesh_load_easy("tree2.bmesh", force_reload_objs, flags1);
if (tree2_mesh == NULL) exit(-1);
LG_Mesh *old_house2_mesh = lg_mesh_load_easy("old_house2.bmesh", force_reload_objs, flags1);
if (old_house2_mesh == NULL) exit(-1);
LG_Mesh *windmill1_mesh = lg_mesh_load_easy("windmill1.bmesh", force_reload_objs, flags1);
if (windmill1_mesh == NULL) exit(-1);
LG_Mesh * lg_mesh_load_easy(const char *relative_path, zboolean force_reload_objs, LG_LoadMesh_Flags flags1)
Definition lg_mesh.c:154
LG_LoadMesh_Flags lg_loadmesh_flags(zboolean save_to_assets, zboolean invert_z, zboolean normalize_xyz, zboolean horiz_center, zboolean vert_center, zboolean vert_bottom)
Definition lg_mesh.c:589
Parameters
relative_pathRelative path of mesh file (extension is not checked), expected to be in predefined locations
force_reload_objsSetting force_reload_objs to TRUE is easier than deleting all files in assets/meshes/bmesh/
flagsLG_LoadMesh_Flags You can use LG_LoadMesh_Flags flags1 = lg_loadmesh_flags(zboolean save_to_assets, zboolean invert_z, zboolean normalize_xyz, zboolean horiz_center, zboolean vert_center, zboolean vert_bottom) and these macros, which are all set to TRUE: SAVE_TO_ASSETS, INVERT_Z, NORMALIZE_XYZ, VERT_CENTER, VERT_BOTTOM
Returns
Pointer to LG_Mesh if OK, NULL on error

◆ lg_mesh_new_from_objfile()

LG_Mesh * lg_mesh_new_from_objfile ( const char *  relative_path,
zboolean  invert_z,
zboolean  normalize_xyz,
zboolean  horiz_center,
zboolean  vert_center,
zboolean  vert_bottom 
)

Create mesh from OBJ file.

Read data from WAVEFRONT OBJ files: vertex/index values for v (coords), vt (texture coords), vn (normals), f (triangular faces), mtllib, usemtl (materials/textures stuff), plus newmtl, and map_K* (in MTL files).

Other data is ignored so far.

=== WARNING: MESHES MUST BE PURE-TRIANGULAR ===

Will create a Vertex_uv_n VBO (see lg_vertex.h).

NO-OP on Android as BMESH files should be used instead

Using MeshLab filters:
remeshing, simplification and reconstruction
turn into a pure-triangle mesh
Also:
normals, curvatures and orientation
transform: translate, center, set origin
-> center on layer bbox
normals, curvatures and orientation
transform: scale, normalize
-> scale to unit bbox
Parameters
relative_pathRelative path of OBJ file (with extension OBJ), expected to be in OBJ_DIR predefined location
invert_zInvert z spatial coord - should be set to TRUE if mesh uses RH coords sys, FALSE if mesh uses LH coords sys
normalize_xyzNormalize spatial coords
horiz_centerCenter mesh horizontally
vert_centerCenter mesh vertically, if vert_bottom is not set
vert_bottomSet mesh origin vertically at bottom, override vert_center
Returns
A new LG_Mesh instance if OK, NULL on error

◆ lg_mesh_new_from_fbxfile()

LG_Mesh * lg_mesh_new_from_fbxfile ( const char *  relative_path,
zboolean  invert_z,
zboolean  normalize_xyz,
zboolean  horiz_center,
zboolean  vert_center,
zboolean  vert_bottom 
)

Create mesh from FBX file.

Parameters
relative_pathRelative path of FBX file (with extension OBJ), expected to be in FBX_DIR predefined location
invert_zInvert z spatial coord - should be set to TRUE if mesh uses RH coords sys, FALSE if mesh uses LH coords sys
normalize_xyzNormalize spatial coords
horiz_centerCenter mesh horizontally
vert_centerCenter mesh vertically, if vert_bottom is not set
vert_bottomSet mesh origin vertically at bottom, override vert_center
Returns
A new LG_Mesh instance if OK, NULL on error

◆ lg_mesh_free()

void lg_mesh_free ( LG_Mesh mesh)

Free mesh.

Parameters
mesh

◆ lg_bmesh_save_to_file()

int lg_bmesh_save_to_file ( const char *  full_path,
LG_Mesh mesh 
)

Save mesh in BINARY MESH (.bmesh) format. Don't add suffix BINARY_MESH_EXT, as it's done automagically.

BINARY MESH (.bmesh) file format
================================
- VBO data block - aligned to 4 bytes boundaries
-> starting at header_size
- IBO data block - aligned to 4 bytes boundaries
-> starting at header_size + lg_align_up_to_next_4_bytes_boundary((void *)(uint64_t)mesh->vbo_size)
void * lg_align_up_to_next_4_bytes_boundary(void *addr)
Definition lg_misc.c:229
Definition lg_mesh.h:164
Parameters
full_pathBMESH file full path
meshPointer to a LG_Mesh
Returns
LG_OK if OK, error code otherwise

◆ lg_bmesh_load_from_file()

int lg_bmesh_load_from_file ( const char *  full_path,
LG_Mesh **  mesh 
)

Load mesh from BINARY MESH (.bmesh) file. Don't add suffix BINARY_MESH_EXT, as it's done automagically.

BINARY MESH (.bmesh) file format
================================
- VBO data block - aligned to 4 bytes boundaries
-> starting at header_size
- IBO data block - aligned to 4 bytes boundaries
-> starting at header_size + lg_align_up_to_next_4_bytes_boundary((void *)(uint64_t)mesh->vbo_size)
Parameters
full_pathBMESH file full path
meshPointer to an array of pointers to LG_Mesh
Returns
LG_OK if OK, error code otherwise

◆ lg_mesh_reload_mats()

int lg_mesh_reload_mats ( LG_Mesh mesh)

Reload materials textures correctly, when mesh is not loaded from OBJ file.

Parameters
meshPointer to a LG_Mesh
Returns
LG_OK if OK, error code otherwise

◆ lg_serialize_LG_Material_64_to_32()

void lg_serialize_LG_Material_64_to_32 ( Serializable_LG_Material s_mat,
LG_Material mat 
)

Serialize a LG_Material instance

Parameters
s_matPointer to a Serializable_LG_Material
matPointer to a Serializable_LG_Material

◆ lg_unserialize_LG_Material_32_to_64()

void lg_unserialize_LG_Material_32_to_64 ( LG_Material mat,
Serializable_LG_Material s_mat 
)

Unserialize a LG_Material instance

Parameters
matPointer to a Serializable_LG_Material
s_matPointer to a Serializable_LG_Material

◆ lg_serialize_LG_Mesh_64_to_32()

void lg_serialize_LG_Mesh_64_to_32 ( Serializable_LG_Mesh s_mesh,
LG_Mesh mesh 
)

Serialize a LG_Mesh instance

Parameters
s_meshPointer to a Serializable_LG_Mesh
meshPointer to a LG_Mesh

◆ lg_unserialize_LG_Mesh_32_to_64()

void lg_unserialize_LG_Mesh_32_to_64 ( LG_Mesh mesh,
Serializable_LG_Mesh s_mesh 
)

Unserialize a LG_Mesh instance

Parameters
meshPointer to a LG_Mesh
s_meshPointer to a Serializable_LG_Mesh

◆ lg_loadmesh_flags()

LG_LoadMesh_Flags lg_loadmesh_flags ( zboolean  save_to_assets,
zboolean  invert_z,
zboolean  normalize_xyz,
zboolean  horiz_center,
zboolean  vert_center,
zboolean  vert_bottom 
)

Mesh loading flags.

See lg_mesh_load().

You can use these helper, which are all set to TRUE:

  • SAVE_TO_ASSETS
  • INVERT_Z
  • NORMALIZE_XYZ
  • VERT_CENTER
  • VERT_BOTTOM
Parameters
save_to_assetsSave to assets as BMESH, otherwise to cache - on Android, should always be set to FALSE as you can't write to assets
invert_zInvert z spatial coord - should be set to TRUE if mesh uses RH coords sys, FALSE if mesh uses LH coords sys
normalize_xyz
horiz_center
vert_centerCenter mesh vertically, if vert_bottom is not set
vert_bottomSet mesh origin vertically at bottom, override vert_center
Returns
A LG_LoadMesh_Flags

◆ lg_mesh_info()

void lg_mesh_info ( LG_Mesh mesh)

Print out LG_Mesh info.

Parameters
mesh

◆ lg_replace_file_extension()

char * lg_replace_file_extension ( const char *  path,
const char *  new_ext 
)

Replace file extension with another extension, ie 'bla_bla/hello.old_ext' -> 'bla_bla/hello.new_ext'

Extension must not include leading dot

Remove trailing dot if new_ext is empty string

Returned new path must be freed after use (dynamically allocated)

lg_replace_file_extension('hello.vbo', 'blob') = 'hello.blob'
lg_replace_file_extension('bla_bla_1/bla_bla_2.vbo', 'blob') = 'bla_bla_1/bla_bla_2.blob'
lg_replace_file_extension('bla_bla_1/bla_bla_2.v', 'z') = 'bla_bla_1/bla_bla_2.z'
lg_replace_file_extension('hello1.hello2.vbo', 'blob') = 'hello1.hello2.blob'
lg_replace_file_extension('v.1', '2') = 'v.2'
lg_replace_file_extension('v1', '2') = 'v1.2'
lg_replace_file_extension('bla_bla_1/bla_bla_1', '2') = 'bla_bla_1/bla_bla_1.2'
lg_replace_file_extension('.1', '2') = '.2'
lg_replace_file_extension('vbo.1', '') = 'vbo'
lg_replace_file_extension('v.1', '') = 'v'
lg_replace_file_extension('1.', '2') = '1.2'
char * lg_replace_file_extension(const char *path, const char *new_ext)
Definition lg_mesh.c:703
Parameters
path
new_ext
Returns
New path with swapped extension