Kohi Game Engine
kmaterial_renderer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <core_render_types.h>
4 #include <math/math_types.h>
5 
8 #include "utils/kcolour.h"
9 
10 #define KMATERIAL_UBO_MAX_VIEWS 16
11 #define KMATERIAL_UBO_MAX_PROJECTIONS 4
12 #define KMATERIAL_UBO_MAX_SHADOW_CASCADES 4
13 
14 #define KRENDERBUFFER_NAME_MATERIALS_GLOBAL "Kohi.StorageBuffer.MaterialsGlobal"
15 
20 typedef struct klight_shader_data {
21  // Directional light: .rgb = colour, .w = ignored - Point lights: .rgb = colour, .a = linear
23  // Directional Light: .xyz = direction, .w = ignored - Point lights: .xyz = position, .w = quadratic
26 
27 typedef struct base_material_shader_data {
33 
34  // Base set of flags for the material. Copied to the material instance when created.
36  // Texture use flags
40 
43 
46 
49 
50  // Added to UV coords of vertex data. Overridden by instance data.
53  // Multiplied against uv coords of vertex data. Overridden by instance data.
57 
58 // LEFTOFF: Integrate the above into a "global material SSBO" and use with the
59 // renderer. Then combine all material types into a single shader. Then use that
60 // shader, with this SSBO, to render.
61 // Note that the vertex shader for animated/skinned meshes will have to differ though.
62 //
63 
64 typedef struct kmaterial_settings_ubo {
65  mat4 views[KMATERIAL_UBO_MAX_VIEWS]; // indexed by immediate.view_index
66  mat4 projections[KMATERIAL_UBO_MAX_PROJECTIONS]; // indexed by immediate.projection_index
68  vec4 view_positions[KMATERIAL_UBO_MAX_VIEWS]; // indexed by immediate.view_index
69  // Light space for shadow mapping. Per cascade
70  vec4 cascade_splits; // 16 bytes
71 
76 
77  // Shadow settings
82 
83  // Fog settings
86  vec3 padding; // TODO: available
89 
90 typedef enum kmaterial_data_index {
94 
95 typedef enum kmaterial_data_index2 {
99 
101  // bytes 0-15
106 
107  // bytes 16-31
108  // Index into the global point lights array. Up to 16 indices as u8s packed into 2 uints.
111  // Index into global irradiance cubemap texture array
113 
114  // bytes 32-47
116 
117  // bytes 48-63
118  u32 dir_light_index; // probably zero
119  f32 tiling; // only used for water materials
120  f32 wave_strength; // only used for water materials
121  f32 wave_speed; // only used for water materials
122 
123  // bytes 64-79
127  // 80-128 available
129 
131 typedef struct kmaterial_renderer {
132  // Global storage buffer used for rendering materials.
134 
138 
139  // Pointer to use for material texture inputs _not_ using a texture map (because something has to be bound).
144  // Pointer to a default cubemap to fall back on if no IBL cubemaps are present.
149 
152  // FIXME: implement this
154 
155  // Keep a pointer to various system states for quick access.
156  struct renderer_system_state* renderer;
157  struct texture_system_state* texture_system;
158  struct kmaterial_system_state* material_state;
159 
161 
162  // Renderer state settings.
164 
165  // Runtime package name pre-hashed and kept here for convenience.
167 
170 
171 KAPI b8 kmaterial_renderer_initialize(kmaterial_renderer* out_state, u32 max_material_count, u32 max_material_instance_count);
173 
175 
178 
179 // Sets material_data->group_id;
182 
184 
186 
187 // Updates and binds base material.
190 
191 // Updates material instance immediates using the provided data.
u16 ktexture
Represents a texture to be used for rendering purposes, stored on the GPU (VRAM)
Definition: core_render_types.h:299
u16 kmaterial
Definition: core_render_types.h:399
u16 kshader
Definition: core_render_types.h:176
#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 char u8
Unsigned 8-bit integer.
Definition: defines.h:21
KAPI b8 kmaterial_renderer_initialize(kmaterial_renderer *out_state, u32 max_material_count, u32 max_material_instance_count)
struct base_material_shader_data base_material_shader_data
kmaterial_data_index2
Definition: kmaterial_renderer.h:95
@ KMATERIAL_DATA_INDEX2_ANIMATION
Definition: kmaterial_renderer.h:96
@ KMATERIAL_DATA_INDEX2_BASE_MATERIAL
Definition: kmaterial_renderer.h:97
struct klight_shader_data klight_shader_data
KAPI void kmaterial_renderer_set_irradiance_cubemap_textures(kmaterial_renderer *state, u8 count, ktexture *irradiance_cubemap_textures)
KAPI void kmaterial_renderer_register_base(kmaterial_renderer *state, kmaterial_data *material_data)
struct kmaterial_renderer kmaterial_renderer
State for the material renderer.
KAPI void kmaterial_renderer_unregister_base(kmaterial_renderer *state, kmaterial_data *material_data)
#define KMATERIAL_UBO_MAX_SHADOW_CASCADES
Definition: kmaterial_renderer.h:12
KAPI void kmaterial_renderer_bind_base(kmaterial_renderer *state, kmaterial base)
KAPI void kmaterial_renderer_update(kmaterial_renderer *state)
KAPI void kmaterial_renderer_apply_immediates(kmaterial_renderer *state, kmaterial_instance instance, const kmaterial_render_immediate_data *immediates)
kmaterial_data_index
Definition: kmaterial_renderer.h:90
@ KMATERIAL_DATA_INDEX_VIEW
Definition: kmaterial_renderer.h:91
@ KMATERIAL_DATA_INDEX_PROJECTION
Definition: kmaterial_renderer.h:92
#define KMATERIAL_UBO_MAX_VIEWS
Definition: kmaterial_renderer.h:10
KAPI void kmaterial_renderer_set_fog_near_far(kmaterial_renderer *state, f32 near, f32 far)
KAPI void kmaterial_renderer_shutdown(kmaterial_renderer *state)
KAPI void kmaterial_renderer_set_fog_colour(kmaterial_renderer *state, colour3 colour)
KAPI void kmaterial_renderer_set_animated(kmaterial_renderer *state, b8 is_animated)
struct kmaterial_render_immediate_data kmaterial_render_immediate_data
struct kmaterial_settings_ubo kmaterial_settings_ubo
KAPI void kmaterial_renderer_apply_globals(kmaterial_renderer *state)
#define KMATERIAL_UBO_MAX_PROJECTIONS
Definition: kmaterial_renderer.h:11
The material system is responsible for managing materials in the engine, including reference counting...
#define KMATERIAL_MAX_IRRADIANCE_CUBEMAP_COUNT
Definition: kmaterial_system.h:24
u64 kname
A kname is a string hash made for quick comparisons versus traditional string comparisons.
Definition: kname.h:36
Contains various math types required for the engine.
u16 krenderbuffer
Definition: renderer_types.h:175
Definition: kmaterial_renderer.h:27
f32 metallic
Definition: kmaterial_renderer.h:45
vec3 uv_scale
Definition: kmaterial_renderer.h:54
vec3 uv_offset
Definition: kmaterial_renderer.h:51
u32 material_type
Definition: kmaterial_renderer.h:39
vec3 mra
Definition: kmaterial_renderer.h:47
vec4 base_colour
Definition: kmaterial_renderer.h:41
f32 ao
Definition: kmaterial_renderer.h:52
u32 ao_texture_channel
Definition: kmaterial_renderer.h:30
vec3 normal
Definition: kmaterial_renderer.h:44
u32 tex_flags
Definition: kmaterial_renderer.h:37
u32 flags
Definition: kmaterial_renderer.h:35
u32 lighting_model
The material lighting model.
Definition: kmaterial_renderer.h:32
f32 roughness
Definition: kmaterial_renderer.h:48
f32 emissive_texture_intensity
Definition: kmaterial_renderer.h:55
u32 roughness_texture_channel
Definition: kmaterial_renderer.h:29
vec4 emissive
Definition: kmaterial_renderer.h:42
f32 refraction_scale
Definition: kmaterial_renderer.h:38
u32 metallic_texture_channel
Definition: kmaterial_renderer.h:28
Definition: kmaterial_renderer.h:20
vec4 position
Definition: kmaterial_renderer.h:24
vec4 colour
Definition: kmaterial_renderer.h:22
Definition: kmaterial_system.h:124
A material instance, which contains handles to both the base material as well as the instance itself....
Definition: core_render_types.h:409
Definition: kmaterial_renderer.h:100
u32 animation_index
Definition: kmaterial_renderer.h:104
vec2 padding
Definition: kmaterial_renderer.h:126
f32 wave_speed
Definition: kmaterial_renderer.h:121
u32 num_p_lights
Definition: kmaterial_renderer.h:110
u32 transform_index
Definition: kmaterial_renderer.h:124
vec4 clipping_plane
Definition: kmaterial_renderer.h:115
u32 irradiance_cubemap_index
Definition: kmaterial_renderer.h:112
u32 view_index
Definition: kmaterial_renderer.h:102
u32 projection_index
Definition: kmaterial_renderer.h:103
uvec2 packed_point_light_indices
Definition: kmaterial_renderer.h:109
f32 tiling
Definition: kmaterial_renderer.h:119
u32 dir_light_index
Definition: kmaterial_renderer.h:118
f32 wave_strength
Definition: kmaterial_renderer.h:120
u32 base_material_index
Definition: kmaterial_renderer.h:105
u32 geo_type
Definition: kmaterial_renderer.h:125
State for the material renderer.
Definition: kmaterial_renderer.h:131
ktexture default_base_colour_texture
Definition: kmaterial_renderer.h:141
kshader material_blended_shader
Definition: kmaterial_renderer.h:153
krenderbuffer material_global_ssbo
Definition: kmaterial_renderer.h:133
struct texture_system_state * texture_system
Definition: kmaterial_renderer.h:157
u32 max_material_count
Definition: kmaterial_renderer.h:160
ktexture default_spec_texture
Definition: kmaterial_renderer.h:142
ktexture default_mra_texture
Definition: kmaterial_renderer.h:146
struct renderer_system_state * renderer
Definition: kmaterial_renderer.h:156
u32 material_standard_skinned_shader_bs_0_instance_id
Definition: kmaterial_renderer.h:151
kshader material_standard_skinned_shader
Definition: kmaterial_renderer.h:150
ktexture default_ibl_cubemap
Definition: kmaterial_renderer.h:145
struct kmaterial_system_state * material_state
Definition: kmaterial_renderer.h:158
ktexture ibl_cubemap_textures[KMATERIAL_MAX_IRRADIANCE_CUBEMAP_COUNT]
Definition: kmaterial_renderer.h:137
kname runtime_package_name
Definition: kmaterial_renderer.h:166
kmaterial_settings_ubo settings
Definition: kmaterial_renderer.h:163
u8 ibl_cubemap_texture_count
Definition: kmaterial_renderer.h:136
b8 current_uses_animated
Definition: kmaterial_renderer.h:168
ktexture shadow_map_texture
Definition: kmaterial_renderer.h:135
ktexture default_water_dudv_texture
Definition: kmaterial_renderer.h:148
ktexture default_normal_texture
Definition: kmaterial_renderer.h:143
ktexture default_water_normal_texture
Definition: kmaterial_renderer.h:147
ktexture default_texture
Definition: kmaterial_renderer.h:140
Definition: kmaterial_renderer.h:64
vec4 view_positions[KMATERIAL_UBO_MAX_VIEWS]
Definition: kmaterial_renderer.h:68
mat4 directional_light_spaces[KMATERIAL_UBO_MAX_SHADOW_CASCADES]
Definition: kmaterial_renderer.h:67
f32 shadow_distance
Definition: kmaterial_renderer.h:79
f32 delta_time
Definition: kmaterial_renderer.h:72
colour3 fog_colour
Definition: kmaterial_renderer.h:84
u32 use_pcf
Definition: kmaterial_renderer.h:75
vec4 cascade_splits
Definition: kmaterial_renderer.h:70
f32 game_time
Definition: kmaterial_renderer.h:73
f32 fog_end
Definition: kmaterial_renderer.h:87
f32 fog_start
Definition: kmaterial_renderer.h:85
u32 render_mode
Definition: kmaterial_renderer.h:74
f32 shadow_fade_distance
Definition: kmaterial_renderer.h:80
f32 shadow_bias
Definition: kmaterial_renderer.h:78
f32 shadow_split_mult
Definition: kmaterial_renderer.h:81
mat4 projections[KMATERIAL_UBO_MAX_PROJECTIONS]
Definition: kmaterial_renderer.h:66
mat4 views[KMATERIAL_UBO_MAX_VIEWS]
Definition: kmaterial_renderer.h:65
vec3 padding
Definition: kmaterial_renderer.h:86
a 4x4 matrix, typically used to represent object transformations.
Definition: math_types.h:383
A 2-element vector of unsigned ints.
Definition: math_types.h:61
A 2-element vector.
Definition: math_types.h:31
A 3-element vector.
Definition: math_types.h:117
A 4-element vector.
Definition: math_types.h:229