Kohi Game Engine
kscene.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <core/frame_data.h>
4 #include <core_resource_types.h>
5 #include <defines.h>
6 #include <math/math_types.h>
7 #include <strings/kstring_id.h>
8 
10 #include "systems/kcamera_system.h"
11 #include "systems/kmodel_system.h"
12 #include "systems/light_system.h"
13 #include "utils/kcolour.h"
14 #include "world/world_types.h"
15 
16 struct kscene;
17 struct frame_data;
18 struct ray;
19 struct raycast_result;
20 struct avatar;
21 
22 typedef enum kscene_state {
29 
32  // Only get transparent geometry. Don't set this flag if opaque geometry is needed.
34 
37 
39 
40 typedef enum kscene_flag_bits {
42 #if KOHI_DEBUG
43  KSCENE_FLAG_DEBUG_ENABLED_BIT = 1 << 0,
44  KSCENE_FLAG_DEBUG_GRID_ENABLED_BIT = 1 << 1,
45  KSCENE_FLAG_DEBUG_BVH_ENABLED_BIT = 1 << 2,
46 #endif
48 
49 typedef u32 kscene_flags;
50 
51 typedef void (*PFN_scene_loaded)(struct kscene* scene, void* context);
52 
53 // Creates the scene and kicks off the loading process.
54 KAPI struct kscene* kscene_create(const char* config, PFN_scene_loaded loaded_callback, void* load_context);
55 KAPI void kscene_destroy(struct kscene* scene);
56 
57 KAPI void kscene_on_window_resize(struct kscene* scene, const struct kwindow* window);
58 
59 KAPI b8 kscene_update(struct kscene* scene, struct frame_data* p_frame_data);
60 KAPI b8 kscene_frame_prepare(struct kscene* scene, struct frame_data* p_frame_data, u32 render_mode, kcamera current_camera);
61 
62 KAPI kscene_state kscene_state_get(const struct kscene* scene);
63 
64 KAPI kscene_flags kscene_get_flags(const struct kscene* scene);
65 KAPI b8 kscene_get_flag(const struct kscene* scene, kscene_flag_bits flag);
66 KAPI void kscene_set_flags(struct kscene* scene, kscene_flags flags);
67 KAPI void kscene_set_flag(struct kscene* scene, kscene_flags flag, b8 enabled);
68 
69 KAPI const char* kscene_get_name(const struct kscene* scene);
70 KAPI void kscene_set_name(struct kscene* scene, const char* name);
71 KAPI vec3 kscene_get_fog_colour(const struct kscene* scene);
72 KAPI void kscene_set_fog_colour(struct kscene* scene, colour3 colour);
73 KAPI f32 kscene_get_fog_near(const struct kscene* scene);
74 KAPI void kscene_set_fog_near(struct kscene* scene, f32 near);
75 KAPI f32 kscene_get_fog_far(const struct kscene* scene);
76 KAPI void kscene_set_fog_far(struct kscene* scene, f32 far);
77 
78 KAPI void kscene_set_active_camera(struct kscene* scene, kcamera camera);
79 
80 KAPI void kscene_get_shadow_properties(struct kscene* scene, f32* out_shadow_dist, f32* out_shadow_fade_distance, f32* out_shadow_split_mult, f32* out_shadow_bias);
81 
82 KAPI b8 kscene_raycast(struct kscene* scene, const struct ray* r, struct raycast_result* out_result);
83 
84 KAPI kentity kscene_get_entity_by_name(struct kscene* scene, kname name);
85 
86 KAPI kentity_flags kscene_get_entity_flags(struct kscene* scene, kentity entity);
87 KAPI void kscene_set_entity_flags(struct kscene* scene, kentity entity, kentity_flags flags);
88 KAPI void kscene_set_entity_flag(struct kscene* scene, kentity entity, kentity_flag_bits flag, b8 enabled);
89 KAPI kname kscene_get_entity_name(struct kscene* scene, kentity entity);
90 KAPI void kscene_set_entity_name(struct kscene* scene, kentity entity, kname name);
91 KAPI kentity_type kscene_get_entity_type(struct kscene* scene, kentity entity);
92 KAPI kentity* kscene_get_entity_children(struct kscene* scene, kentity entity, u16* out_count);
93 KAPI kentity kscene_get_entity_parent(struct kscene* scene, kentity entity);
94 KAPI ktransform kscene_get_entity_transform(struct kscene* scene, kentity entity);
95 KAPI extents_3d kscene_get_aabb(struct kscene* scene, kentity entity);
96 
97 KAPI vec3 kscene_get_entity_position(struct kscene* scene, kentity entity);
98 KAPI void kscene_set_entity_position(struct kscene* scene, kentity entity, vec3 position);
99 KAPI quat kscene_get_entity_rotation(struct kscene* scene, kentity entity);
100 KAPI void kscene_set_entity_rotation(struct kscene* scene, kentity entity, quat rotation);
101 KAPI vec3 kscene_get_entity_scale(struct kscene* scene, kentity entity);
102 KAPI void kscene_set_entity_scale(struct kscene* scene, kentity entity, vec3 scale);
103 
104 KAPI void kscene_remove_entity(struct kscene* scene, kentity* entity);
105 
106 KAPI kentity kscene_add_entity(struct kscene* scene, kname name, ktransform transform, kentity parent);
107 
108 typedef void (*PFN_model_loaded)(kentity entity, kmodel_instance inst, void* context);
109 KAPI kentity kscene_add_model_pos_rot_scale(struct kscene* scene, kname name, kentity parent, kname asset_name, kname package_name, vec3 pos, quat rot, vec3 scale);
110 KAPI kentity kscene_add_model(struct kscene* scene, kname name, ktransform transform, kentity parent, kname asset_name, kname package_name, PFN_model_loaded on_loaded_callback, void* load_context);
111 
119 KAPI kentity kscene_add_point_light(struct kscene* scene, kname name, ktransform transform, kentity parent, vec3 colour, f32 linear, f32 quadratic);
120 
121 KAPI kentity kscene_add_spawn_point(struct kscene* scene, kname name, ktransform transform, kentity parent, f32 radius);
122 
124  struct kscene* scene,
125  kname name,
126  ktransform transform,
127  kentity parent,
128  kscene_volume_type type,
129  kcollision_shape shape,
130  u8 hit_shape_tag_count,
131  kstring_id* hit_shape_tags,
132  const char* on_enter_command,
133  const char* on_leave_command,
134  const char* on_tick_command);
135 
137  struct kscene* scene,
138  kname name,
139  ktransform transform,
140  kentity parent,
141  kcollision_shape shape,
142  u8 tag_count,
143  kstring_id* tags);
144 
146  struct kscene* scene,
147  kname name,
148  ktransform transform,
149  kentity parent,
150  f32 size);
151 
153  struct kscene* scene,
154  kname name,
155  ktransform transform,
156  kentity parent,
157  f32 inner_radius,
158  f32 outer_radius,
159  f32 volume,
160  f32 falloff,
161  b8 is_looping,
162  b8 is_streaming,
163  kname asset_name,
164  kname package_name);
165 
166 KAPI kentity kscene_add_spawn_point(struct kscene* scene, kname name, ktransform transform, kentity parent, f32 radius);
167 
168 #if KOHI_DEBUG
169 KAPI void kscene_enable_debug(struct kscene* scene, b8 enabled);
170 KAPI void kscene_enable_debug_grid(struct kscene* scene, b8 enabled);
171 #endif
172 
174 
176 
178 
179 // Gets static mesh render data, organized by material.
181  struct kscene* scene,
182  struct frame_data* p_frame_data,
183  kfrustum* frustum,
185  u16* out_material_count);
186 
188  struct kscene* scene,
189  struct frame_data* p_frame_data,
190  kfrustum* frustum,
192  u16* out_material_count);
193 
194 // Gets terrain chunk render data.
196  struct kscene* scene,
197  struct frame_data* p_frame_data,
198  kfrustum* frustum,
199  u32 flags,
200  u16* out_terrain_count);
201 
202 #if KOHI_DEBUG
203 KAPI kdebug_geometry_render_data* kscene_get_debug_render_data(
204  struct kscene* scene,
205  struct frame_data* p_frame_data,
206  kfrustum* frustum,
207  u32 flags,
208  u16* out_geometry_count);
209 
210 KAPI kdebug_geometry_render_data kscene_get_editor_gizmo_render_data(
211  struct kscene* scene,
212  struct frame_data* p_frame_data,
213  kfrustum* frustum,
214  u32 flags);
215 #endif
216 
218  struct kscene* scene,
219  struct frame_data* p_frame_data,
220  kfrustum* frustum,
221  u32 flags,
222  u16* out_water_plane_count);
223 
225  struct kscene* scene,
226  u32 flags,
227  u16* out_spawn_point_count);
228 
230  struct kscene* scene,
231  struct frame_data* p_frame_data,
232  u32 flags,
233  u16* out_point_light_count);
234 
235 KAPI const char* kscene_serialize(const struct kscene* scene);
236 
237 KAPI void kscene_dump_hierarchy(const struct kscene* scene);
238 
239 typedef struct kscene_hierarchy_node {
244 
245 KAPI kscene_hierarchy_node* kscene_get_hierarchy(const struct kscene* scene, u32* out_count);
u32 ktransform
Definition: core_resource_types.h:6
This file contains global type definitions which are used throughout the entire engine and applicatio...
#define KAPI
Import/export qualifier.
Definition: defines.h:209
unsigned int u32
Unsigned 32-bit integer.
Definition: defines.h:27
_Bool b8
8-bit boolean type
Definition: defines.h:60
float f32
32-bit floating point number
Definition: defines.h:49
unsigned short u16
Unsigned 16-bit integer.
Definition: defines.h:24
unsigned char u8
Unsigned 8-bit integer.
Definition: defines.h:21
u8 kcamera
Definition: kcamera_system.h:28
u64 kname
A kname is a string hash made for quick comparisons versus traditional string comparisons.
Definition: kname.h:36
KAPI kentity kscene_add_volume(struct kscene *scene, kname name, ktransform transform, kentity parent, kscene_volume_type type, kcollision_shape shape, u8 hit_shape_tag_count, kstring_id *hit_shape_tags, const char *on_enter_command, const char *on_leave_command, const char *on_tick_command)
KAPI void kscene_set_active_camera(struct kscene *scene, kcamera camera)
KAPI b8 kscene_raycast(struct kscene *scene, const struct ray *r, struct raycast_result *out_result)
KAPI void kscene_set_flag(struct kscene *scene, kscene_flags flag, b8 enabled)
KAPI kmaterial_render_data * kscene_get_static_model_render_data(struct kscene *scene, struct frame_data *p_frame_data, kfrustum *frustum, kscene_render_data_flag_bits flags, u16 *out_material_count)
KAPI vec3 kscene_get_fog_colour(const struct kscene *scene)
KAPI kentity_flags kscene_get_entity_flags(struct kscene *scene, kentity entity)
struct kscene_hierarchy_node kscene_hierarchy_node
KAPI ktransform kscene_get_entity_transform(struct kscene *scene, kentity entity)
KAPI void kscene_set_entity_flags(struct kscene *scene, kentity entity, kentity_flags flags)
KAPI quat kscene_get_entity_rotation(struct kscene *scene, kentity entity)
KAPI extents_3d kscene_get_aabb(struct kscene *scene, kentity entity)
KAPI kentity kscene_add_audio_emitter(struct kscene *scene, kname name, ktransform transform, kentity parent, f32 inner_radius, f32 outer_radius, f32 volume, f32 falloff, b8 is_looping, b8 is_streaming, kname asset_name, kname package_name)
KAPI kmodel_instance kscene_model_entity_get_instance(struct kscene *scene, kentity entity)
KAPI struct kscene * kscene_create(const char *config, PFN_scene_loaded loaded_callback, void *load_context)
u32 kscene_render_data_flag_bits
Definition: kscene.h:38
KAPI kentity kscene_add_point_light(struct kscene *scene, kname name, ktransform transform, kentity parent, vec3 colour, f32 linear, f32 quadratic)
Creates and adds a new point light entity to the scene.
kscene_flag_bits
Definition: kscene.h:40
@ KSCENE_FLAG_NONE
Definition: kscene.h:41
KAPI kmaterial_render_data * kscene_get_animated_model_render_data(struct kscene *scene, struct frame_data *p_frame_data, kfrustum *frustum, kscene_render_data_flag_bits flags, u16 *out_material_count)
u32 kscene_flags
Definition: kscene.h:49
KAPI kscene_state kscene_state_get(const struct kscene *scene)
KAPI void kscene_set_fog_colour(struct kscene *scene, colour3 colour)
KAPI kentity kscene_add_hit_shape(struct kscene *scene, kname name, ktransform transform, kentity parent, kcollision_shape shape, u8 tag_count, kstring_id *tags)
KAPI hm_terrain_render_data * kscene_get_hm_terrain_render_data(struct kscene *scene, struct frame_data *p_frame_data, kfrustum *frustum, u32 flags, u16 *out_terrain_count)
KAPI const char * kscene_get_name(const struct kscene *scene)
KAPI kentity kscene_get_entity_by_name(struct kscene *scene, kname name)
KAPI void kscene_cleanup_hierarchy(kscene_hierarchy_node *nodes, u32 count)
KAPI kentity_type kscene_get_entity_type(struct kscene *scene, kentity entity)
KAPI kentity * kscene_get_entity_children(struct kscene *scene, kentity entity, u16 *out_count)
KAPI kwater_plane_render_data * kscene_get_water_plane_render_data(struct kscene *scene, struct frame_data *p_frame_data, kfrustum *frustum, u32 flags, u16 *out_water_plane_count)
KAPI void kscene_set_entity_position(struct kscene *scene, kentity entity, vec3 position)
KAPI void kscene_set_entity_flag(struct kscene *scene, kentity entity, kentity_flag_bits flag, b8 enabled)
KAPI void kscene_set_fog_far(struct kscene *scene, f32 far)
KAPI void kscene_set_name(struct kscene *scene, const char *name)
KAPI void kscene_set_flags(struct kscene *scene, kscene_flags flags)
KAPI kdirectional_light_data kscene_get_directional_light_data(struct kscene *scene)
KAPI kentity * kscene_get_spawn_points(struct kscene *scene, u32 flags, u16 *out_spawn_point_count)
KAPI void kscene_destroy(struct kscene *scene)
KAPI kentity kscene_get_entity_parent(struct kscene *scene, kentity entity)
KAPI b8 kscene_frame_prepare(struct kscene *scene, struct frame_data *p_frame_data, u32 render_mode, kcamera current_camera)
KAPI kentity kscene_add_model(struct kscene *scene, kname name, ktransform transform, kentity parent, kname asset_name, kname package_name, PFN_model_loaded on_loaded_callback, void *load_context)
void(* PFN_scene_loaded)(struct kscene *scene, void *context)
Definition: kscene.h:51
void(* PFN_model_loaded)(kentity entity, kmodel_instance inst, void *context)
Definition: kscene.h:108
KAPI f32 kscene_get_fog_far(const struct kscene *scene)
KAPI void kscene_set_entity_scale(struct kscene *scene, kentity entity, vec3 scale)
KAPI kscene_hierarchy_node * kscene_get_hierarchy(const struct kscene *scene, u32 *out_count)
KAPI kscene_flags kscene_get_flags(const struct kscene *scene)
KAPI kentity kscene_add_spawn_point(struct kscene *scene, kname name, ktransform transform, kentity parent, f32 radius)
KAPI void kscene_set_fog_near(struct kscene *scene, f32 near)
KAPI void kscene_get_shadow_properties(struct kscene *scene, f32 *out_shadow_dist, f32 *out_shadow_fade_distance, f32 *out_shadow_split_mult, f32 *out_shadow_bias)
KAPI kentity kscene_add_water_plane(struct kscene *scene, kname name, ktransform transform, kentity parent, f32 size)
KAPI kskybox_render_data kscene_get_skybox_render_data(struct kscene *scene)
KAPI void kscene_on_window_resize(struct kscene *scene, const struct kwindow *window)
KAPI void kscene_set_entity_rotation(struct kscene *scene, kentity entity, quat rotation)
KAPI vec3 kscene_get_entity_position(struct kscene *scene, kentity entity)
KAPI b8 kscene_update(struct kscene *scene, struct frame_data *p_frame_data)
KAPI f32 kscene_get_fog_near(const struct kscene *scene)
KAPI kname kscene_get_entity_name(struct kscene *scene, kentity entity)
KAPI b8 kscene_get_flag(const struct kscene *scene, kscene_flag_bits flag)
kscene_state
Definition: kscene.h:22
@ KSCENE_STATE_UNINITIALIZED
Definition: kscene.h:23
@ KSCENE_STATE_LOADED
Definition: kscene.h:27
@ KSCENE_STATE_LOADING
Definition: kscene.h:25
@ KSCENE_STATE_PRE_LOADED
Definition: kscene.h:26
@ KSCENE_STATE_PARSING_CONFIG
Definition: kscene.h:24
KAPI klight_render_data * kscene_get_all_point_lights(struct kscene *scene, struct frame_data *p_frame_data, u32 flags, u16 *out_point_light_count)
KAPI kentity kscene_add_model_pos_rot_scale(struct kscene *scene, kname name, kentity parent, kname asset_name, kname package_name, vec3 pos, quat rot, vec3 scale)
KAPI void kscene_set_entity_name(struct kscene *scene, kentity entity, kname name)
KAPI void kscene_remove_entity(struct kscene *scene, kentity *entity)
KAPI const char * kscene_serialize(const struct kscene *scene)
KAPI void kscene_dump_hierarchy(const struct kscene *scene)
kscene_render_data_flag
Definition: kscene.h:30
@ KSCENE_RENDER_DATA_FLAG_TRANSPARENT_BIT
Definition: kscene.h:33
@ KSCENE_RENDER_INCLUDE_BVH_DEBUG_BIT
Definition: kscene.h:35
@ KSCENE_RENDER_DATA_FLAG_NONE
Definition: kscene.h:31
KAPI vec3 kscene_get_entity_scale(struct kscene *scene, kentity entity)
KAPI kentity kscene_add_entity(struct kscene *scene, kname name, ktransform transform, kentity parent)
This files contains an implementation of kstring_ids.
u64 kstring_id
A kstring_id is a string hash made for quick comparisons versus traditional string comparisons.
Definition: kstring_id.h:32
This file contains the implementation of the light system, which manages all lighting objects within ...
Contains various math types required for the engine.
Represents the extents of a 3d object.
Definition: math_types.h:401
Engine-level current frame-specific data.
Definition: frame_data.h:15
Definition: kforward_renderer.h:142
Definition: world_types.h:17
Definition: kforward_renderer.h:275
Definition: light_system.h:55
Definition: math_types.h:500
Definition: light_system.h:50
Definition: kforward_renderer.h:125
Definition: kmodel_system.h:148
Definition: kscene.h:239
struct kscene_hierarchy_node * children
Definition: kscene.h:242
u32 child_count
Definition: kscene.h:241
kentity entity
Definition: kscene.h:240
Definition: kforward_renderer.h:89
Definition: kforward_renderer.h:211
Represents a window in the application.
Definition: platform.h:71
Represents a line which starts at an origin and proceed infinitely in the given direction....
Definition: math_types.h:638
Definition: math_types.h:660
A 3-element vector.
Definition: math_types.h:117
A 4-element vector.
Definition: math_types.h:229
u32 kentity_flags
Definition: world_types.h:46
kentity_type
Definition: world_types.h:48
kscene_volume_type
Definition: world_types.h:13
u64 kentity
Definition: world_types.h:35
kentity_flag_bits
Definition: world_types.h:38