LibGame  v0.4.0
The LG Game Engine - Copyright (C) 2024-2025 ETMSoftware
lg_scene_graph.h
1 /*
2  * LibGame - Copyright (C) Emmanuel Thomas-Maurin 2011-2025
3  * All rights reserved
4  */
5 
6 /*
7  * LG_NODE_NTOS AND LG_SCENE ARE USED MAINLY IN LG_SCENE.C
8  * (THIS MAY CREATE A BIT OF CONFUSION)
9  */
10 
11 #ifndef LG_SCENE_GRAPH_H
12 #define LG_SCENE_GRAPH_H
13 
14 #define SCENENODE_NAME_MAX_LEN (64 - 1)
15 #define SCENENODE_CHILD_MAX_NUM 256
16 #define SCENE_GRAPH_MAX_DEPTH 32
17 #define SCENEGRAPH_PRINTOUT_MAX_DEPTH 8
18 
19 #define NODE_NTOS_MAX_NUM 1024
20 
21 typedef enum {
22  ROOT,
23  FIRST_OBJ,
24  MESH,
25  LINES3D,
26  GRID, /* Means lines3d_vb is dynamic */
27  LANDSCAPE, /* = Landscape root */
28  SKYBOX,
29  LIGHT,
30  SHADER_ONLY,
31  UNDEFINED
32 } lg_scenenode_type;
33 
34 typedef struct LG_SceneNode LG_SceneNode;
35 
36 /*
37  * NODE'S LOCAL_MATRIX = NODE'S TRANSFORMATION RELATIVE TO ITS PARENT
38  * NODE'S WORLD_MATRIX = NODE'S TRANSFORMATION RELATIVE TO THE ROOT NODE (WORLD)
39  */
40 struct LG_SceneNode {
41  int32_t id; /* User-defined - SHOULD BE UNIQUE */
42  char name[SCENENODE_NAME_MAX_LEN + 1]; /* User-defined - may be NOT unique */
43  lg_scenenode_type type;
44  LG_SceneNode *parent;
45  LG_SceneNode *child[SCENENODE_CHILD_MAX_NUM];
46  unsigned int n_child;
47  LG_Mesh *mesh;
48  Lines3D_VB lines3d_vb; /* Line set vertex buffer and num of vertices */
49  mat4_t local_matrix0; /* 'Private' member - how to 'hide' this stuff */
50  mat4_t world_matrix0; /* 'Private' member - how to 'hide' this stuff */
51  mat4_t *local_matrix; /* Adjust (TRS) the mesh/lines3d_vb in its local space */
52  mat4_t *world_matrix; /* Put (TRS) the mesh/lines3d_vb in world space */
53  LG_ShaderProg shader_prog;
54  LG_ShaderULocs shader_u_loc; /* Shader uniforms locations */
55  LG_VAO vao; /* Vertex Array Object */
56  LG_Texture *tex_1; /* For textures other than thoses from mesh mtl file */
57 };
58 
59 /*
60  * === Scene node serializable data ===
61  * NTOS stands for (mesh file) Name and (scene node) TOS (Transl/Orientation/Scaling)
62  * Use float for LG_EulerAng
63  */
64 typedef union {
65  struct {
66  /* Name */
67  char name[LG_MESH_NAME_MAX_LEN + 1]; /* OBJ/FBX basename */
68  int32_t id; /* User-defined - SHOULD BE UNIQUE -> always > 0, 0 = top node */
69  int32_t parent_id; /* Set to < 0 if node = top node */
70  /* Transl. */
71  float x_t;
72  float y_t;
73  float z_t;
74  /* Orientation as LG_EulerAng */
75  float x_o;
76  float y_o;
77  float z_o;
78  /* Scaling */
79  float x_s;
80  float y_s;
81  float z_s;
82  /* Rot. order */
83  char rot_order[4];
84  };
85  struct {
86  char name2[LG_MESH_NAME_MAX_LEN + 1];
87  int32_t id2;
88  int32_t parent_id2;
89  float v[9];
90  char rot_order2[4];
91  };
92 } LG_Node_NTOS;
93 
94 /* New nodes/nodes ids added to the scene should start at or above first_obj_node/SCENE_FIRST_OBJ_NODE_ID (id = 3) */
95 enum {
96  SCENE_ROOT_NODE_ID = 0,
97  SCENE_GRID_NODE_ID,
98  SCENE_XYZ_ARROWS_NODE_ID,
99  SCENE_FIRST_OBJ_NODE_ID
100 };
101 
102 typedef struct {
103  /*All serializable data */
104  int32_t id; /* Set to -1 on error */
105  LG_Light light1;
106  Rec2Df landscape_rec;
107  LG_Node_NTOS nodes_ntos[NODE_NTOS_MAX_NUM];
108  int32_t n_node_ntos;
109  /* Not serializable data */
110  LG_Camera *cam1;
111  LG_SceneNode *root;
112  LG_SceneNode *grid;
113  LG_SceneNode *xyz_arrows;
114  LG_SceneNode *first_obj_node;
115 } LG_Scene;
116 
117 LG_SceneNode *lg_scenenode_new(int, const char *, lg_scenenode_type);
118 
120 
122 
124 
125 /* Any good ? */
126 #define lg_scenenode_free2(s_node) {lg_scenenode_free(s_node); s_node = NULL;}
127 
129 
131 
133 
135 
137 
139 
141 
143 
145 
147 
149 
151 
153 
155 
157 
159 
161 
162 const char *lg_scenenode_type_string(int);
163 
164 #endif /* LG_SCENE_GRAPH_H */
LG_Mesh
Definition: lg_mesh.h:85
Rec2Df
Definition: lg_gr_func.h:56
LG_Quat
Definition: lg_quaternions.h:29
LG_ShaderProg
Definition: lg_shader_progs.h:11
lg_scenenode_new
LG_SceneNode * lg_scenenode_new(int id, const char *name, lg_scenenode_type type)
Definition: lg_scene_graph.c:31
LG_ShaderULocs
Definition: lg_shader_progs.h:16
lg_scenenode_remove_and_free_all
void lg_scenenode_remove_and_free_all(LG_SceneNode *node)
Definition: lg_scene_graph.c:214
lg_scenenode_attach_to_camera
void lg_scenenode_attach_to_camera(LG_SceneNode *node, const LG_Camera *cam, vec3_t transl, vec3_t scaling)
Definition: lg_scene_graph.c:485
LG_SceneNode
Definition: lg_scene_graph.h:40
LG_Scene
Definition: lg_scene_graph.h:102
lg_scenenode_find_by_name
LG_SceneNode * lg_scenenode_find_by_name(LG_SceneNode *node, const char *name)
Definition: lg_scene_graph.c:347
lg_scenenode_clone_worldm_l3dvb
int lg_scenenode_clone_worldm_l3dvb(LG_SceneNode *dest_node, LG_SceneNode *src_node)
Definition: lg_scene_graph.c:517
LG_VAO
Definition: lg_vbo.h:52
LG_Light
Definition: lg_light.h:26
lg_scenenode_info2
int lg_scenenode_info2(LG_SceneNode *node)
Definition: lg_scene_graph.c:670
Lines3D_VB
Definition: lg_3d_primitives.h:53
lg_scenenode_remove_child
void lg_scenenode_remove_child(LG_SceneNode *node, LG_SceneNode *child)
Definition: lg_scene_graph.c:116
lg_scenenode_add_child
void lg_scenenode_add_child(LG_SceneNode *node, LG_SceneNode *child)
Definition: lg_scene_graph.c:91
lg_scenenode_reset_local_matrix
void lg_scenenode_reset_local_matrix(LG_SceneNode *node)
Definition: lg_scene_graph.c:364
lg_traverse_scene_graph
void lg_traverse_scene_graph(LG_SceneNode *node, int(*func)(LG_SceneNode *))
Definition: lg_scene_graph.c:257
vec3_t
Definition: math_3d.h:123
lg_scenenode_update_world_matrix_tree
void lg_scenenode_update_world_matrix_tree(LG_SceneNode *node, mat4_t *parent_world_matrix)
Definition: lg_scene_graph.c:426
LG_Camera
Definition: lg_camera.h:22
lg_traverse_printout_scene_graph
void lg_traverse_printout_scene_graph(LG_SceneNode *node, zboolean extra_info)
Definition: lg_scene_graph.c:592
lg_scenenode_update_local_matrix
void lg_scenenode_update_local_matrix(LG_SceneNode *node, vec3_t transl, LG_Quat rot, vec3_t scaling)
Definition: lg_scene_graph.c:408
LG_Node_NTOS
Definition: lg_scene_graph.h:64
lg_scenenode_type_string
const char * lg_scenenode_type_string(int type)
Definition: lg_scene_graph.c:682
lg_scenenode_set_local_matrix
void lg_scenenode_set_local_matrix(LG_SceneNode *node, vec3_t transl, LG_Quat rot, vec3_t scaling)
Definition: lg_scene_graph.c:387
lg_scenenode_info
void lg_scenenode_info(LG_SceneNode *node)
Definition: lg_scene_graph.c:603
lg_scenenode_get_root
LG_SceneNode * lg_scenenode_get_root(LG_SceneNode *node)
Definition: lg_scene_graph.c:167
lg_scenenode_set_world_matrix
void lg_scenenode_set_world_matrix(LG_SceneNode *node, vec3_t transl, LG_Quat rot, vec3_t scaling)
Definition: lg_scene_graph.c:457
lg_scenenode_free
void lg_scenenode_free(LG_SceneNode *node)
Definition: lg_scene_graph.c:152
LG_Texture
Definition: lg_textures.h:45
lg_traverse_scene_graph_2
void lg_traverse_scene_graph_2(LG_SceneNode *node, int(*func)(LG_SceneNode *, LG_Scene *), LG_Scene *scene)
Definition: lg_scene_graph.c:291
lg_scenenode_remove_and_free_leaf
int lg_scenenode_remove_and_free_leaf(LG_SceneNode *node)
Definition: lg_scene_graph.c:187
lg_scenenode_find_by_id
LG_SceneNode * lg_scenenode_find_by_id(LG_SceneNode *node, int id)
Definition: lg_scene_graph.c:330
mat4_t
Definition: math_3d.h:179