![]() |
LibGame
v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
|
=== Higher level scene/frame stuff ===
The starting point for scenes
SERIALIZING nodes (scene graph, including hierarchy) with LG_Node_NTOS[]
NOTE:
LG_Scene lg_scene_new | ( | int | id, |
LG_Camera * | cam1, | ||
LG_Light | light1, | ||
Rec2Df | landscape_rec, | ||
uint16_t | grid_width, | ||
const char * | euler_ang_rot_order | ||
) |
Create and init a new scene
Can not contain more than NODE_NTOS_MAX_NUM mesh references
LG_Node_NTOS and LG_Scene are defined in lg_scene_graph.h
Generated nodes:
New nodes ids added to the scene should start at or above SCENE_FIRST_OBJ_NODE_ID (id = 3)
id | Scene's id, set to -1 on error |
cam1 | A pointer to a LG_Camera |
light1 | A LG_Light |
landscape_rec | A Rec2Df, should be centered |
grid_width | Grid width, ie number of units along one row or one column, should be even - if odd, we substract one |
euler_ang_rot_order | One of "XYZ", "YXZ", "ZXY", "ZYX", "YZX", "XZY" |
void lg_scene_free | ( | LG_Scene * | scene | ) |
Free scene root, grid, and xyz_arrows nodes
scene | A LG_Scene |
LG_SceneNode* lg_scenenode_new_and_set | ( | int | id, |
LG_SceneNode * | parent_node, | ||
const char * | mesh_file, | ||
LG_LoadMesh_Flags | flags, | ||
vec3_t | transl, | ||
LG_Quat | orientation, | ||
vec3_t | scaling | ||
) |
Helper func to create and set a new LG_SceneNode instance
Create node, add node to scene graph, load node's mesh, and set node's local matrix
Helper macros for less confusion:
Mesh must be freed when done with the scene
id | Node's id |
parent_node | A pointer to a scene graph node |
mesh_file | Relative path to mesh file to load, inside the mesh folder |
flags | Apply to mesh: force_reload, invert_z, normalize_xyz, horiz_center, vert_center, vert_bottom |
transl | Translation/position vec3 |
orientation | Orientation quat |
scaling | Scaling vec3 |
void lg_fill_node_NTOS_from_local_matrix | ( | LG_Node_NTOS * | ntos, |
mat4_t * | local_matrix, | ||
const char * | euler_ang_rot_order, | ||
zboolean | set_quat | ||
) |
Fill a LG_Node_NTOS's TOS (Transl./Orientation/Scaling) from a local matrix
ntos | Pointer to a LG_Node_NTOS |
local_matrix | Pointer to a mat4_t |
euler_ang_rot_order | One of "XYZ", "YXZ", "ZXY", "ZYX", "YZX", "XZY" |
set_quat | Whether to compute quat or leave it un touched |
void lg_fill_node_NTOS_from_scenenode | ( | LG_Node_NTOS * | ntos, |
LG_SceneNode * | node, | ||
const char * | euler_ang_rot_order, | ||
zboolean | set_quat | ||
) |
Fill a LG_Node_NTOS from a LG_SceneNode
ntos | Pointer to a LG_Node_NTOS |
node | Pointer to a LG_SceneNode |
euler_ang_rot_order | One of "XYZ", "YXZ", "ZXY", "ZYX", "YZX", "XZY" |
set_quat | Whether to compute quat or not |
zboolean lg_generate_scene_data_from_scenenodes | ( | LG_Scene * | scene, |
LG_SceneNode * | top_node | ||
) |
Generate LG_Scene serializable data, ie scene's (LG_Node_NTOS) nodes_ntos[NODE_NTOS_MAX_NUM] from a scene graph top node (LG_SceneNode *) by traversing it and calling fill_node_ntos(node, scene) for each node, which generate TOS values from node's local matrix
Will fill an array of LG_Node_NTOS from scene nodes from (serializing hierachical nodes tree)
NOTE: scene->euler_ang_rot_order must have been initialized first with a correct value
scene | Pointer to a LG_Scene |
top_node | The top scene node |
LG_SceneNode* lg_generate_scenenodes_from_scene_data | ( | LG_Scene * | scene, |
LG_SceneNode * | top_node, | ||
LG_LoadMesh_Flags | flags | ||
) |
Generate scene nodes (LG_SceneNode *) from a LG_Scene serializable data and mesh files by parsing scene's (LG_Node_NTOS) nodes_ntos[NODE_NTOS_MAX_NUM]
Will create and set scene nodes from an array of LG_Node_NTOS (deserializing nodes tree)
NTOS stands for (mesh file) Name and (scene node) TOS (Transl/Orientation/Scaling)
Generated scene nodes id should start at or above SCENE_FIRST_OBJ_NODE_ID (id = 3)
You can then add top_node to your scene root node
Example code:
scene | Pointer to a LG_Scene |
top_node | A scene node |
flags | Mesh loading flags |
zboolean lg_set_TRS_matrix_from_node_NTOS_euler | ( | mat4_t * | m_TRS, |
LG_Node_NTOS * | ntos, | ||
const char * | euler_ang_rot_order | ||
) |
Set an existing TRS matrix (Transl/Rotation/Scaling) from a LG_Node_NTOS, using Euler angles (x_oe, y_oe, z_oe) for rotation
m_TRS | Pointer to a mat4_t |
ntos | Pointer to a LG_Node_NTOS |
euler_ang_rot_order | One of "XYZ", "YXZ", "ZXY", "ZYX", "YZX", "XZY" |
void lg_set_NTOS_array_euler_angs_from_quats | ( | LG_Scene * | scene | ) |
Set a scene LG_Node_NTOS array (scene->nodes_ntos[])'s Euler angles from quats
scene | Pointer to a LG_Scene |
void lg_node_NTOS_info | ( | LG_Node_NTOS * | ntos | ) |
Print out LG_Node_NTOS info
ntos | Pointer to a LG_Node_NTOS |
void lg_node_NTOS_info_to_stream | ( | LG_Node_NTOS * | ntos, |
FILE * | s | ||
) |
SendLG_Node_NTOS info to stream (as text)
ntos | Pointer to a LG_Node_NTOS |
s | Stream |
void lg_node_NTOS_array_info | ( | LG_Scene * | scene | ) |
void lg_node_NTOS_array_info_to_stream | ( | LG_Scene * | scene, |
FILE * | s | ||
) |
zboolean lg_scene_load_data_from_assets | ( | LG_Scene * | scene, |
const char * | path | ||
) |
zboolean lg_scene_load_data_from_file | ( | LG_Scene * | scene, |
const char * | path | ||
) |
zboolean lg_scene_save_data_to_file | ( | LG_Scene * | scene, |
const char * | path | ||
) |
zboolean lg_create_wr_scenes_dir | ( | ) |
Create the scene folder (SCENES_DIR) in the APP WRITABLE folder
const char* lg_get_reversed_rot_order | ( | const char * | rot_order | ) |
Return reversed rot order string, ie "XYZ" -> "ZYX"
rot_order | A 3 chars long string, expected to be a valid rot sequence |
zboolean lg_rot_order_is_valid | ( | const char * | rot_order | ) |
Check if rot order string is valid, ie one of "XYZ", "YXZ", "ZXY", "ZYX", "YZX", "XZY"
rot_order | A 3 chars long string |