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_MESH_NTOS, LG_SCENE, AND LG_SCENEDZ 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 MESH_NTOS_MAX_NUM 256
20 #define MNTOS_ARRAY_INDEX_TO_SCENENODE_ID 1000
21 
22 typedef enum {
23  ROOT,
24  FIRST_OBJ,
25  MESH,
26  LINES3D,
27  GRID, /* Means lines3d_vb is dynamic */
28  LANDSCAPE, /* = Landscape root */
29  SKYBOX,
30  LIGHT,
31  SHADER_ONLY,
32  UNDEFINED
33 } lg_scenenode_type;
34 
35 typedef struct LG_SceneNode LG_SceneNode;
36 
37 struct LG_SceneNode {
38  int id; /* User-defined - not unique */
39  char name[SCENENODE_NAME_MAX_LEN + 1]; /* User-defined - not unique */
40  lg_scenenode_type type;
41  LG_SceneNode *parent;
42  LG_SceneNode *child[SCENENODE_CHILD_MAX_NUM];
43  unsigned int n_child;
44  LG_Mesh *mesh;
45  Lines3D_VB lines3d_vb; /* Line set vertex buffer and num of vertices */
46  mat4_t local_matrix0; /* 'Private' member - how to 'hide' this stuff */
47  mat4_t world_matrix0; /* 'Private' member - how to 'hide' this stuff */
48  mat4_t *local_matrix; /* Adjust (TRS) the mesh/lines3d_vb in its local space */
49  mat4_t *world_matrix; /* Put (TRS) the mesh/lines3d_vb in world space */
50  LG_ShaderProg shader_prog;
51  LG_ShaderULocs shader_u_loc; /* Shader uniforms locations */
52  LG_VAO vao; /* Vertex Array Object */
53  LG_Texture *tex_1; /* For textures other than thoses from mesh mtl file */
54 };
55 
56 /*
57  * NTOS stands for Name and TOS (Transl/Orientation/Scaling)
58  * Use float for LG_EulerAng
59  */
60 typedef union {
61  struct {
62  /* Name */
63  char name[LG_MESH_NAME_MAX_LEN + 1]; /* OBJ/FBX basename */
64  /* Transl. */
65  float x_t;
66  float y_t;
67  float z_t;
68  /* Orientation as LG_EulerAng */
69  float x_o;
70  float y_o;
71  float z_o;
72  /* Scaling */
73  float x_s;
74  float y_s;
75  float z_s;
76  /* Rot. order */
77  char rot_order[4];
78  };
79  struct {
80  char name2[LG_MESH_NAME_MAX_LEN + 1];
81  float v[9];
82  char rot_order2[4];
83  };
84 } LG_Mesh_NTOS;
85 
86 typedef struct {
87  int id; /* Set to -1 on error */
88  LG_Camera *cam1;
89  LG_Light light1;
90  Rec2Df landscape_rec;
91  LG_SceneNode *root;
92  LG_SceneNode *grid;
93  LG_SceneNode *xyz_arrows;
94  LG_Mesh_NTOS meshes_ntos[MESH_NTOS_MAX_NUM];
95  int n_mesh_ntos;
96 } LG_Scene;
97 
98 /* Serialized LG_Scene data - need a more descriptive name */
99 typedef struct {
100  LG_Camera cam;
101  Rec2Df landscape_rec;
102  LG_Mesh_NTOS meshes_ntos[MESH_NTOS_MAX_NUM];
103  int n_mesh_ntos;
104 } LG_SceneDZ;
105 
106 LG_SceneNode *lg_scenenode_new(int, const char *, lg_scenenode_type);
107 
109 
111 
113 
114 /* Any good ? */
115 #define lg_scenenode_free2(s_node) {lg_scenenode_free(s_node); s_node = NULL;}
116 
118 
120 
122 
124 
126 
128 
130 
132 
134 
136 
138 
140 
142 
144 
146 
148 
150 
151 const char *lg_scenenode_type_string(int);
152 
153 #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:37
LG_Scene
Definition: lg_scene_graph.h:86
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_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_SceneDZ
Definition: lg_scene_graph.h:99
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_Mesh_NTOS
Definition: lg_scene_graph.h:60
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