X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world.h;h=672ceb71ca35fb85bb8a49b92b24649f1aa058ba;hb=0ca7f5ca2560908de1a03db112df67e52b476107;hp=7611c249a7001558df94a1fdf96d2b19e5097f1e;hpb=34a8df54eb962f3ad2e036355041f5bc5cabe5a0;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world.h b/world.h index 7611c24..672ceb7 100644 --- a/world.h +++ b/world.h @@ -24,6 +24,7 @@ typedef struct world_instance world_instance; #include "shaders/scene_vertex_blend.h" #include "shaders/scene_terrain.h" #include "shaders/scene_depth.h" +#include "shaders/scene_position.h" #include "shaders/model_sky.h" @@ -52,6 +53,8 @@ enum geo_type k_geo_type_water = 2 }; +static const float k_light_cube_size = 8.0f; + struct world_instance { /* This is a small flag we use to changelevel. @@ -78,26 +81,45 @@ struct world_instance /* STD140 */ struct ub_world_lighting { - /* v3f (padded) */ - v4f g_light_colours[3], - g_light_directions[3], - g_ambient_colour; + v4f g_cube_min, + g_cube_inv_range; v4f g_water_plane, g_depth_bounds; + v4f g_daysky_colour; + v4f g_nightsky_colour; + v4f g_sunset_colour; + v4f g_ambient_colour; + v4f g_sunset_ambient; + v4f g_sun_colour; + v4f g_sun_dir; + float g_water_fog; - int g_light_count; + float g_time; + float g_shadow_length; + float g_shadow_spread; + + float g_time_of_day; + float g_day_phase; + float g_sunset_phase; + int g_light_preview; int g_shadow_samples; - v4f g_point_light_positions[32]; - v4f g_point_light_colours[32]; + int g_debug_indices; + int g_debug_complexity; } ub_lighting; GLuint ubo_lighting; int ubo_bind_point; + GLuint tbo_light_entities, + tex_light_entities, + tex_light_cubes; + + v3i light_cubes; + struct framebuffer heightmap; /* @@ -204,8 +226,13 @@ struct world_instance */ struct world_light { - v3f co; - v4f colour; + mdl_node *node; + struct classtype_world_light *inf; + m4x3f inverse_world; + v2f angle_sin_cos; + + /* enabled.. etc? + * TODO: we should order entities in the binary by their type */ } * lights; u32 light_count; @@ -251,9 +278,7 @@ struct world_instance v4f q[2]; v2f dims; - m4x3f to_world, recv_to_world, /* TODO: can probably remove these */ - - transport; + m4x3f to_world, transport; } gate; @@ -501,6 +526,7 @@ VG_STATIC void world_init(void) shader_scene_vertex_blend_register(); shader_scene_terrain_register(); shader_scene_depth_register(); + shader_scene_position_register(); shader_model_sky_register(); @@ -611,6 +637,39 @@ VG_STATIC void world_run_relay( world_instance *world, VG_STATIC void world_update( world_instance *world, v3f pos ) { + /* TEMP!!!!!! */ + static double g_time = 0.0; + g_time += vg.time_delta * (1.0/(k_day_length*60.0)); + + + struct ub_world_lighting *state = &world->ub_lighting; + + state->g_time = g_time; + state->g_debug_indices = k_debug_light_indices; + state->g_light_preview = k_light_preview; + state->g_debug_complexity = k_debug_light_complexity; + + state->g_time_of_day = vg_fractf( g_time ); + state->g_day_phase = cosf( state->g_time_of_day * VG_PIf * 2.0f ); + state->g_sunset_phase= cosf( state->g_time_of_day * VG_PIf * 4.0f + VG_PIf ); + + state->g_day_phase = state->g_day_phase * 0.5f + 0.5f; + state->g_sunset_phase = powf( state->g_sunset_phase * 0.5f + 0.5f, 6.0f ); + + float a = state->g_time_of_day * VG_PIf * 2.0f; + state->g_sun_dir[0] = sinf( a ); + state->g_sun_dir[1] = cosf( a ); + state->g_sun_dir[2] = 0.2f; + v3_normalize( state->g_sun_dir ); + + + + glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting ); + glBufferSubData( GL_UNIFORM_BUFFER, 0, + sizeof(struct ub_world_lighting), &world->ub_lighting ); + /* TEMP!!!!!! */ + + #if 0 if( world.switching_to_new_world ) { @@ -638,10 +697,11 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) } } - world.sky_time += world.sky_rate * vg.time_delta; - world.sky_rate = vg_lerp( world.sky_rate, world.sky_target_rate, - vg.time_delta * 5.0 ); #endif + world_global.sky_time += world_global.sky_rate * vg.time_delta; + world_global.sky_rate = vg_lerp( world_global.sky_rate, + world_global.sky_target_rate, + vg.time_delta * 5.0 ); world_routes_update( world ); #if 0 @@ -712,20 +772,24 @@ VG_STATIC void world_update( world_instance *world, v3f pos ) 0xff00ff00 ); } - for( int i=0; ilight_count; i++ ) + if( k_debug_light_indices ) { - struct world_light *light = &world->lights[i]; + for( int i=0; ilight_count; i++ ) + { + struct world_light *light = &world->lights[i]; + struct classtype_world_light *inf = light->inf; - u32 colour = 0xff000000; - u8 r = light->colour[0] * 255.0f, - g = light->colour[1] * 255.0f, - b = light->colour[2] * 255.0f; + u32 colour = 0xff000000; + u8 r = inf->colour[0] * 255.0f, + g = inf->colour[1] * 255.0f, + b = inf->colour[2] * 255.0f; - colour |= r; - colour |= g << 8; - colour |= b << 16; + colour |= r; + colour |= g << 8; + colour |= b << 16; - vg_line_pt3( light->co, 0.25f, colour ); + vg_line_pt3( light->node->co, 0.25f, colour ); + } } world_global.in_trigger = in_trigger;