381 lines
14 KiB
C
381 lines
14 KiB
C
|
|
#define SECONDARY_CITY_CAP 50
|
|
u32 secondary_strips_len = 0;
|
|
Assembly_Strip* secondary_city_strips[SECONDARY_CITY_CAP];
|
|
|
|
#include "incenter_scenes.h"
|
|
#include "../user_space/incenter_patterns.c"
|
|
#include "../user_space/incenter_secondary_patterns.c"
|
|
#include "incenter_scenes.c"
|
|
#include "incenter_live_answers.c"
|
|
|
|
////////////////////////////////////////////////
|
|
// INCENTER SCENES
|
|
|
|
internal void
|
|
incenter_scenes_init(Incenter_State* ins, u32 cap, Allocator* a)
|
|
{
|
|
incenter_scene_descs_init();
|
|
ins->scenes = incenter_scene_descs;
|
|
ins->scenes_cap = Incenter_Scene_Count;
|
|
ins->scene_at = Incenter_Scene_AnyoneHome;
|
|
//Incenter_Scene_Question_LostAccessToResources;
|
|
}
|
|
|
|
internal void
|
|
incenter_reset_inputs(Incenter_State* ins)
|
|
{
|
|
// reset bar chart over time
|
|
needs_reset = true;
|
|
year_max = 0;
|
|
month_max = 0;
|
|
year_at = 0;
|
|
month_at = 0;
|
|
month_start_time = 0;
|
|
|
|
// reset inputs
|
|
ins->input_pct = 0.5f;
|
|
ins->input_option = 0;
|
|
ins->input_advance = false;
|
|
}
|
|
|
|
internal void
|
|
incenter_go_to_transitioning_in(Incenter_State* ins)
|
|
{
|
|
if (ins->scene_next != Incenter_Scene_WelcomeHome ||
|
|
ins->scene_at != Incenter_Scene_AnyoneHome) {
|
|
ins->transition_time = 0;
|
|
ins->scene_mode = Incenter_SceneMode_TransitioningIn;
|
|
ins->scene_time = 0;
|
|
} else {
|
|
ins->scene_mode = Incenter_SceneMode_Passive;
|
|
}
|
|
ins->scene_at = ins->scene_next;
|
|
incenter_reset_inputs(ins);
|
|
}
|
|
|
|
internal void
|
|
incenter_scene_go_to(Incenter_State* ins, u32 index)
|
|
{
|
|
ins->transition_time = 0;
|
|
ins->scene_next = index % ins->scenes_cap;
|
|
ins->scene_mode = Incenter_SceneMode_TransitioningOut;
|
|
if (ins->scene_at == Incenter_Scene_WelcomeHome) {
|
|
incenter_go_to_transitioning_in(ins);
|
|
}
|
|
|
|
printf("Switching To: %d:%s\n", ins->scene_next, ins->scenes[ins->scene_next].name);
|
|
}
|
|
|
|
internal void
|
|
incenter_scene_go_to_next(Incenter_State* ins)
|
|
{
|
|
incenter_scene_go_to(ins, ins->scene_at + 1);
|
|
}
|
|
|
|
internal void
|
|
incenter_scene_go_to_prev(Incenter_State* ins)
|
|
{
|
|
incenter_scene_go_to(ins, ins->scene_at - 1);
|
|
}
|
|
|
|
internal void
|
|
incenter_scene_set_mode(Incenter_State* ins, Incenter_Scene_Mode mode)
|
|
{
|
|
ins->scene_mode = mode;
|
|
}
|
|
|
|
internal void
|
|
incenter_scene_render(App_State* state, Incenter_State* ins)
|
|
{
|
|
assert(ins->scene_mode != Incenter_SceneMode_Count);
|
|
Incenter_Pattern* pattern = 0;
|
|
if (ins->scene_mode > Incenter_SceneMode_Count)
|
|
{
|
|
// Update the transition if necessary
|
|
if (ins->transition_time >= INCENTER_TRANSITION_DURATION) {
|
|
if (ins->scene_mode == Incenter_SceneMode_TransitioningOut) {
|
|
incenter_go_to_transitioning_in(ins);
|
|
} else {
|
|
ins->scene_mode = Incenter_SceneMode_Input;
|
|
if (ins->scene_next == Incenter_Scene_WelcomeHome ||
|
|
ins->scene_next == Incenter_Scene_AnyoneHome) {
|
|
ins->scene_mode = Incenter_SceneMode_Passive;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// DRaw the transition
|
|
switch (ins->scene_mode)
|
|
{
|
|
case Incenter_SceneMode_TransitioningOut: pattern = pattern_sun_transition_shrink; break;
|
|
case Incenter_SceneMode_TransitioningIn: pattern = pattern_sun_transition_grow; break;
|
|
case Incenter_SceneMode_Input: pattern = pattern_scene_input; break;
|
|
default: {
|
|
Incenter_Scene scene = ins->scenes[ins->scene_at];
|
|
pattern = scene.patterns[ins->scene_mode];
|
|
} break;
|
|
}
|
|
|
|
Assembly_Array assemblies = state->assemblies;
|
|
if (pattern)
|
|
{
|
|
pattern(assemblies.pixel_buffers[0], assemblies.strip_arrays[0], ins);
|
|
}
|
|
else
|
|
{
|
|
pattern_color(assemblies.pixel_buffers[0], assemblies.strip_arrays[0], 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
#include "incenter_interface_connection.h"
|
|
#include "incenter_interface_connection.c"
|
|
|
|
////////////////////////////////////////////////
|
|
// INCENTER LIFECYCLE
|
|
|
|
internal App_Init_Desc
|
|
incenter_get_init_desc()
|
|
{
|
|
App_Init_Desc result = {};
|
|
result.assembly_cap = 4;
|
|
return result;
|
|
}
|
|
|
|
#define INCENTER_RADIUS INCENTER_FEET(10)
|
|
internal Assembly_Strip*
|
|
incenter_add_secondary_city_strip(Assembly_Array* assemblies, Assembly_Handle ah, u32 universe, u32 count, Incenter_City_Id city)
|
|
{
|
|
Assembly_Strip* s = assembly_add_strip(assemblies, ah, count);
|
|
s->output_kind = OutputData_NetworkSACN;
|
|
s->sacn_universe = universe;
|
|
|
|
Incenter_City_Desc d = city_descs[city];
|
|
v4 city_p = incenter_latlng_to_cartesian(d.lat, d.lon, INCENTER_RADIUS);
|
|
v4 end_p = incenter_latlng_to_cartesian(d.lat, d.lon, INCENTER_RADIUS * 2);
|
|
for (u32 i = 0; i < count; i++)
|
|
{
|
|
v4 p = pm_lerp_v4(city_p, (r32)i / (r32)count, end_p);
|
|
assembly_add_led(assemblies, ah, s, p);
|
|
}
|
|
|
|
secondary_city_strips[secondary_strips_len++] = s;
|
|
return s;
|
|
}
|
|
|
|
internal void
|
|
incenter_init(App_State* state)
|
|
{
|
|
// create user space data
|
|
Incenter_State* ins = allocator_alloc_struct(permanent, Incenter_State);
|
|
state->user_space_data = (u8*)ins;
|
|
|
|
incenter_scenes_init(ins, 8, permanent);
|
|
|
|
// create the sculpture
|
|
u32 lights_per_primary_city = 123;
|
|
u32 primary_city_lights = (city_count + 1) * lights_per_primary_city;
|
|
u32 secondary_city_count = (city_secondary_count - city_secondary_first) + 1;
|
|
u32 secondary_city_lights = secondary_city_count;
|
|
u32 lights_cap = primary_city_lights + 800;
|
|
Assembly_Handle ah = assembly_add(&state->assemblies, lit_str("incenter"), lights_cap, city_count + 50);
|
|
|
|
scratch_get(scratch);
|
|
Allocator* s = scratch.a;
|
|
|
|
v3 start_p = (v3){0, 0, 0};
|
|
|
|
|
|
Assembly_Strip* brc = assembly_add_strip(&state->assemblies, ah, 140);
|
|
brc->output_kind = OutputData_NetworkSACN;
|
|
brc->sacn_universe = city_descs[city_black_rock].sacn_universe;
|
|
// Arctic
|
|
assembly_strip_append_leds(
|
|
&state->assemblies,
|
|
ah,
|
|
brc,
|
|
(v3){0, INCENTER_RADIUS, 0},
|
|
start_p,
|
|
90
|
|
);
|
|
// BRC
|
|
assembly_strip_append_leds(
|
|
&state->assemblies,
|
|
ah,
|
|
brc,
|
|
start_p,
|
|
(v3){0, INCENTER_FEET(-4.5f), 0},
|
|
50
|
|
);
|
|
|
|
// ADDING PRIMARY CITIES
|
|
r32 radius = INCENTER_RADIUS;
|
|
for (u32 i = 1; i < city_count; i++)
|
|
{
|
|
Incenter_City_Desc city = city_descs[i];
|
|
if (city.sacn_universe == 0) {
|
|
printf("skipping %s\n", city_strings[i]);
|
|
continue;
|
|
}
|
|
|
|
v3 end_p = incenter_latlng_to_cartesian(city.lat, city.lon, radius).xyz;
|
|
|
|
Assembly_Strip* strip = assembly_add_strip(&state->assemblies, ah, 123);
|
|
strip->output_kind = OutputData_NetworkSACN;
|
|
strip->sacn_universe = city.sacn_universe;
|
|
|
|
assembly_strip_append_leds(&state->assemblies, ah, strip, end_p, start_p, 88);
|
|
}
|
|
|
|
#define USING_ON_PLAYA_SECONDARY_CITIES 1
|
|
#if USING_ON_PLAYA_SECONDARY_CITIES
|
|
// ADDING SECONDARY CITIES
|
|
{
|
|
for (u32 i = 0; i < SECONDARY_CITY_CAP; i++) secondary_city_strips[i] = 0;
|
|
Assembly_Array* a = &state->assemblies;
|
|
|
|
{ // Australia
|
|
Assembly_Strip* aus_lef = incenter_add_secondary_city_strip(a, ah, 62, 10, city_brisbane);
|
|
Assembly_Strip* aus_rig = incenter_add_secondary_city_strip(a, ah, 64, 8, city_brisbane);
|
|
Assembly_Strip* aus_cen = incenter_add_secondary_city_strip(a, ah, 34, 6, city_brisbane);
|
|
}
|
|
{ // Islands Above Australia
|
|
Assembly_Strip* indonesia1 = incenter_add_secondary_city_strip(a, ah, 44, 9, city_jakarta);
|
|
Assembly_Strip* indonesia2 = incenter_add_secondary_city_strip(a, ah, 36, 9, city_jakarta);
|
|
Assembly_Strip* north_left_asia = incenter_add_secondary_city_strip(a, ah, 54, 6, city_tokyo);
|
|
Assembly_Strip* phillipines = incenter_add_secondary_city_strip(a, ah, 56, 10, city_jakarta);
|
|
}
|
|
{ // East Asia
|
|
// TODO(PS): update primary cities
|
|
Assembly_Strip* cen_china_to_thailand = incenter_add_secondary_city_strip(a, ah, 37, 19, city_jakarta);
|
|
Assembly_Strip* china_coast = incenter_add_secondary_city_strip(a, ah, 38, 29, city_jakarta);
|
|
Assembly_Strip* peninsula_below_china = incenter_add_secondary_city_strip(a, ah, 40, 10, city_jakarta);
|
|
Assembly_Strip* mainland_right_of_japan_north = incenter_add_secondary_city_strip(a, ah, 40, 10, city_tokyo);
|
|
Assembly_Strip* mainland_right_of_japan_south = incenter_add_secondary_city_strip(a, ah, 58, 9, city_tokyo);
|
|
}
|
|
{ // Japan
|
|
Assembly_Strip* japan = incenter_add_secondary_city_strip(a, ah, 60, 10, city_tokyo);
|
|
}
|
|
{
|
|
Assembly_Strip* rig_south_africa = incenter_add_secondary_city_strip(a, ah, 196, 9, city_nairobi);
|
|
Assembly_Strip* georgia = incenter_add_secondary_city_strip(a, ah, 198, 10, city_tokyo); // TODO(PS):
|
|
Assembly_Strip* ethiopia = incenter_add_secondary_city_strip(a, ah, 200, 5, city_addis_ababa);
|
|
Assembly_Strip* turkey = incenter_add_secondary_city_strip(a, ah, 202, 10, city_ankara);
|
|
Assembly_Strip* sudan_egypt = incenter_add_secondary_city_strip(a, ah, 204, 7, city_cairo);
|
|
Assembly_Strip* iran = incenter_add_secondary_city_strip(a, ah, 206, 9, city_tehran);
|
|
Assembly_Strip* west_russia = incenter_add_secondary_city_strip(a, ah, 208, 25, city_kyiv);
|
|
Assembly_Strip* saudi_arabia = incenter_add_secondary_city_strip(a, ah, 212, 4, city_ankara);
|
|
Assembly_Strip* south_africa = incenter_add_secondary_city_strip(a, ah, 214, 25, city_nairobi); // TODO(PS):
|
|
Assembly_Strip* right_india = incenter_add_secondary_city_strip(a, ah, 215, 19, city_mumbai);
|
|
Assembly_Strip* central_russia_right = incenter_add_secondary_city_strip(a, ah, 218, 7, city_kyiv);
|
|
Assembly_Strip* left_africa = incenter_add_secondary_city_strip(a, ah, 220, 7, city_nairobi);
|
|
Assembly_Strip* the_stans = incenter_add_secondary_city_strip(a, ah, 221, 19, city_tehran);
|
|
Assembly_Strip* left_india = incenter_add_secondary_city_strip(a, ah, 222, 40, city_mumbai);
|
|
}
|
|
|
|
{
|
|
Assembly_Strip* italy = incenter_add_secondary_city_strip(a, ah, 162, 9, city_paris);
|
|
Assembly_Strip* nigeria_cameroon = incenter_add_secondary_city_strip(a, ah, 164, 6, city_abuja);
|
|
Assembly_Strip* greece = incenter_add_secondary_city_strip(a, ah, 166, 9, city_belgrade);
|
|
Assembly_Strip* israel = incenter_add_secondary_city_strip(a, ah, 168, 6, city_cairo);
|
|
Assembly_Strip* central_europe = incenter_add_secondary_city_strip(a, ah, 170, 35, city_berlin);
|
|
Assembly_Strip* libya = incenter_add_secondary_city_strip(a, ah, 172, 9, city_tunis);
|
|
Assembly_Strip* peru = incenter_add_secondary_city_strip(a, ah, 182, 9, city_brasilia);
|
|
Assembly_Strip* right_north_africa = incenter_add_secondary_city_strip(a, ah, 184, 13, city_rabat);
|
|
Assembly_Strip* france = incenter_add_secondary_city_strip(a, ah, 188, 5, city_paris);
|
|
Assembly_Strip* uk = incenter_add_secondary_city_strip(a, ah, 190, 6, city_paris);
|
|
Assembly_Strip* scandanavia = incenter_add_secondary_city_strip(a, ah, 192, 5, city_berlin);
|
|
}
|
|
{
|
|
Assembly_Strip* us_east_coast = incenter_add_secondary_city_strip(a, ah, 1, 20, city_washington);
|
|
Assembly_Strip* central_americas = incenter_add_secondary_city_strip(a, ah, 2, 19, city_denver);
|
|
Assembly_Strip* colombia = incenter_add_secondary_city_strip(a, ah, 6, 9, city_bogota);
|
|
Assembly_Strip* missippi_river = incenter_add_secondary_city_strip(a, ah, 12, 9, city_washington);
|
|
Assembly_Strip* chile_south = incenter_add_secondary_city_strip(a, ah, 14, 9, city_la_paz);
|
|
Assembly_Strip* us_west_coast = incenter_add_secondary_city_strip(a, ah, 22, 17, city_san_francisco);
|
|
Assembly_Strip* venezuela = incenter_add_secondary_city_strip(a, ah, 26, 5, city_bogota);
|
|
Assembly_Strip* chile_north = incenter_add_secondary_city_strip(a, ah, 28, 10, city_la_paz);
|
|
Assembly_Strip* left_canada = incenter_add_secondary_city_strip(a, ah, 32, 5, city_san_francisco);
|
|
}
|
|
}
|
|
|
|
#else
|
|
// TODO: This probably isn't how these lights will be hooked up
|
|
Assembly_Strip* secondary_strip = assembly_add_strip(&state->assemblies, ah, secondary_city_lights);
|
|
secondary_strip->output_kind = OutputData_NetworkSACN;
|
|
secondary_strip->sacn_universe = incenter_secondary_city_universe;
|
|
for (u32 i = city_secondary_first; i < city_secondary_count; i++)
|
|
{
|
|
Incenter_City_Desc city = city_descs[i];
|
|
v4 light_p = incenter_latlng_to_cartesian(city.lat, city.lon, radius);
|
|
assembly_add_led(&state->assemblies, ah, secondary_strip, light_p);
|
|
}
|
|
#endif
|
|
|
|
// PATTERN INIT
|
|
pattern_random_fill_prep();
|
|
|
|
r32 rad = 0.05f;
|
|
sculpture_updated(state, 5, rad);
|
|
|
|
|
|
ins->running = true;
|
|
incenter_interface_connection_init(state, ins);
|
|
|
|
printf("Incenter Initialized\n");
|
|
scratch_release(scratch);
|
|
}
|
|
|
|
internal void
|
|
incenter_frame_prepare(App_State* state)
|
|
{
|
|
|
|
}
|
|
|
|
#if defined(PLATFORM_SUPPORTS_EDITOR)
|
|
internal void
|
|
incenter_sculpture_visualizer_ui(App_State* state, Editor* ed)
|
|
{
|
|
UI_Layout layout = *ed->ui.layout;
|
|
layout.mode = UILayout_Columns,
|
|
layout.bounds_min = (v2){0, 0},
|
|
layout.bounds_max.x = 250;
|
|
ui_layout_push(&ed->ui, &layout);
|
|
|
|
Incenter_State* ins = (Incenter_State*)state->user_space_data;
|
|
ui_text_f(&ed->ui, WHITE_V4, "Scene Time: %fs", ins->scene_time);
|
|
ui_text_f(&ed->ui, WHITE_V4, "Scene: %s", ins->scenes[ins->scene_at].name);
|
|
|
|
ui_layout_pop(&ed->ui);
|
|
}
|
|
#endif
|
|
|
|
internal void
|
|
incenter_frame(App_State* state)
|
|
{
|
|
Incenter_State* ins = (Incenter_State*)state->user_space_data;
|
|
Assembly_Array assemblies = state->assemblies;
|
|
|
|
{ // INPUT HANDLING
|
|
Input_State* is = state->input_state;
|
|
if (input_key_went_down(is, KeyCode_LeftArrow)) incenter_scene_go_to_prev(ins);
|
|
if (input_key_went_down(is, KeyCode_RightArrow)) incenter_scene_go_to_next(ins);
|
|
}
|
|
|
|
incenter_interface_connection_frame(state, ins);
|
|
|
|
ins->scene_time += state->target_seconds_per_frame * 0.5f;
|
|
ins->transition_time += state->target_seconds_per_frame;
|
|
incenter_scene_render(state, ins);
|
|
|
|
}
|
|
|
|
internal void
|
|
incenter_cleanup(App_State* state)
|
|
{
|
|
Incenter_State* ins = (Incenter_State*)state->user_space_data;
|
|
ins->running = false;
|
|
os_thread_end(ins->interface_thread);
|
|
incenter_interface_connection_cleanup(ins);
|
|
} |