Lumenarium/src_v2/user_space/incenter_user_space.h

191 lines
4.9 KiB
C

#define INCENTER_METER 1.0f
#define INCENTER_FOOT 0.3048f
#define INCENTER_METERS(count) (count) * INCENTER_METER
#define INCENTER_FEET(count) (count) * INCENTER_FOOT
#define INCENTER_PER_METER(count) INCENTER_METER / (r32)(count)
typedef u32 Incenter_City_Id;
enum {
MONTH_jan,
MONTH_feb,
MONTH_mar,
MONTH_apr,
MONTH_may,
MONTH_jun,
MONTH_jul,
MONTH_aug,
MONTH_sep,
MONTH_oct,
MONTH_nov,
MONTH_dec,
};
typedef u32 Incenter_Month_Id;
typedef struct Incenter_City_Desc Incenter_City_Desc;
struct Incenter_City_Desc
{
Incenter_City_Id id;
r32 lat;
r32 lon;
u32 sacn_universe;
// TODO: Some way to access this cities strip of leds
};
typedef struct Incenter_Data_Row Incenter_Data_Row;
struct Incenter_Data_Row
{
Incenter_City_Id id;
u32 year;
Incenter_Month_Id month;
r64 prop;
};
// TODO(PS): fix this to be the real universe
#define incenter_secondary_city_universe 33
#include "incenter_gen_cities.h"
// Data
#include "../../run_tree/data/incenter_data/c/question_1.h"
#include "../../run_tree/data/incenter_data/c/question_2.h"
#include "../../run_tree/data/incenter_data/c/question_3.h"
#include "../../run_tree/data/incenter_data/c/question_4.h"
#include "../../run_tree/data/incenter_data/c/question_5.h"
#include "../../run_tree/data/incenter_data/c/question_6.h"
#include "../../run_tree/data/incenter_data/c/question_7.h"
#include "../../run_tree/data/incenter_data/c/question_8.h"
#include "../../run_tree/data/incenter_data/c/question_9.h"
#include "../../run_tree/data/incenter_data/c/question_10.h"
#include "../../run_tree/data/incenter_data/c/question_11.h"
#include "../../run_tree/data/incenter_data/c/question_12.h"
#include "../../run_tree/data/incenter_data/c/question_13.h"
#include "../../run_tree/data/incenter_data/c/question_14.h"
#include "../../run_tree/data/incenter_data/c/question_15.h"
#include "../../run_tree/data/incenter_data/c/question_16.h"
#include "../../run_tree/data/incenter_data/c/question_17.h"
#include "../../run_tree/data/incenter_data/c/question_18.h"
#include "../../run_tree/data/incenter_data/c/question_19.h"
#include "../../run_tree/data/incenter_data/c/question_20.h"
#include "../../run_tree/data/incenter_data/c/question_21.h"
typedef struct Incenter_State Incenter_State;
typedef void Incenter_Pattern(Assembly_Pixel_Buffer pixels, Assembly_Strip_Array strips, Incenter_State* state);
typedef u32 Incenter_Scene_Mode;
enum {
Incenter_SceneMode_Intro,
Incenter_SceneMode_Passive,
Incenter_SceneMode_Count,
Incenter_SceneMode_Input,
Incenter_SceneMode_TransitioningOut,
Incenter_SceneMode_TransitioningIn,
};
#define INCENTER_TRANSITION_DURATION 3
#define INCENTER_TRANSITION_SUN_REVEAL_DURATION 2
typedef u8 Incenter_Scene_Kind;
enum {
Incenter_SceneKind_Information,
Incenter_SceneKind_YesOrNo,
Incenter_SceneKind_ThreeOption,
Incenter_SceneKind_SlidingScale,
Incenter_SceneKind_Count,
};
typedef struct Incenter_Scene Incenter_Scene;
struct Incenter_Scene
{
char* name;
Incenter_Pattern* patterns[Incenter_SceneMode_Count];
Incenter_Data_Row* data;
u32 data_len;
Incenter_Scene_Kind kind;
};
// INLH is abbrev for INcenter Live data Header
#define LIVE_DATA_HEADER_MAGIC_NUMBER "INLH"
// INLB is abbrev for INcenter Live data Bucket
#define LIVE_DATA_BUCKET_MAGIC_NUMBER "INLB"
typedef struct Live_Answers_File_Header Live_Answers_File_Header;
struct Live_Answers_File_Header
{
u8 magic[4];
u32 buckets_count;
u32 answers_total_count;
};
typedef struct Live_Answers_File_Bucket Live_Answers_File_Bucket;
struct Live_Answers_File_Bucket
{
u8 magic[4];
// the value this bucket represents.
union {
u32 answer_u32;
r32 answer_r32;
};
// The number of responses that fit within this bucket
u32 count;
};
typedef struct Live_Answers_File Live_Answers_File;
struct Live_Answers_File
{
String path;
Live_Answers_File_Header* header;
Live_Answers_File_Bucket* buckets;
};
struct Incenter_State
{
Incenter_Scene* scenes;
u32 scenes_cap;
u32 scene_at;
u32 scene_next;
Incenter_Scene_Mode scene_mode;
r64 scene_time;
r64 transition_time;
bool running;
Thread_Handle interface_thread;
Socket_Handle interface_socket;
// Ring buffer of interface messages. All
#define INTERFACE_MESSAGES_CAP 8
#define INTERFACE_MESSAGE_SIZE 512
Data interface_messages[INTERFACE_MESSAGES_CAP];
u32 interface_messages_write_next;
u32 interface_messages_read_next;
// User Input
r32 input_pct;
u32 input_option;
b8 input_advance;
};
internal v4
incenter_latlng_to_cartesian(r32 lat, r32 lng, r32 radius)
{
r32 theta = (lat / 180.0f) * r32_pi;
r32 phi = (lng / 180.0f) * r32_pi;
// spherical to cartesian conversion
v4 result = {
radius * sinf(phi) * cosf(theta),
radius * sinf(phi) * sinf(theta),
radius * cosf(phi),
1
};
return result;
}