X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=entity.h;h=7143a4130aaccadaa905fa55eaceebf664785f6a;hb=4c95c9c3e6033cd1360adacef3c80fc4da933715;hp=3215a6933b4aaae70280bed038b12f44dac00d5a;hpb=919d1227839218c57430fe9cab8f74d594c7bd14;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/entity.h b/entity.h index 3215a69..7143a41 100644 --- a/entity.h +++ b/entity.h @@ -10,6 +10,60 @@ typedef struct ent_route_node ent_route_node; typedef struct ent_path_index ent_path_index; typedef struct ent_checkpoint ent_checkpoint; typedef struct ent_route ent_route; +typedef struct ent_water ent_water; +typedef struct ent_audio_clip ent_audio_clip; +typedef struct volume_particles volume_particles; +typedef struct volume_trigger volume_trigger; +typedef struct ent_volume ent_volume; +typedef struct ent_audio ent_audio; +typedef struct ent_marker ent_marker; +typedef struct ent_traffic ent_traffic; +typedef struct ent_font ent_font; +typedef struct ent_font_variant ent_font_variant; +typedef struct ent_glyph ent_glyph; +typedef struct ent_skateshop ent_skateshop; +typedef struct ent_camera ent_camera; +typedef struct ent_swspreview ent_swspreview; +typedef struct ent_worldinfo ent_worldinfo; +typedef struct ent_ccmd ent_ccmd; + +enum entity_alias{ + k_ent_none = 0, + k_ent_gate = 1, + k_ent_spawn = 2, + k_ent_route_node = 3, + k_ent_route = 4, + k_ent_water = 5, + k_ent_volume = 6, + k_ent_audio = 7, + k_ent_marker = 8, + k_ent_font = 9, + k_ent_font_variant= 10, + k_ent_traffic = 11, + k_ent_skateshop = 12, + k_ent_camera = 13, + k_ent_swspreview = 14, + k_ent_menuitem = 15, + k_ent_worldinfo = 16, + k_ent_ccmd = 17 +}; + +static u32 mdl_entity_id_type( u32 entity_id ){ + return (entity_id & 0xffff0000) >> 16; +} + +static u32 mdl_entity_id_id( u32 entity_id ){ + return entity_id & 0x0000ffff; +} + +static u32 mdl_entity_id( u32 type, u32 index ){ + return (type & 0xfffff)<<16 | (index & 0xfffff); +} + +enum entity_function{ + k_ent_function_trigger, + k_ent_function_particle_spawn +}; struct ent_spawn{ mdl_transform transform; @@ -37,14 +91,14 @@ struct ent_light{ enum gate_type{ k_gate_type_unlinked = 0, k_gate_type_teleport = 1, - k_gate_type_nonlocal = 2 + k_gate_type_nonlocal_unlinked = 2, + k_gate_type_nonlocel = 3 }; struct ent_gate{ u32 type, - target; - - /* TODO: World index */ + target, + key; v3f dimensions, co[2]; @@ -58,12 +112,13 @@ struct ent_gate{ u32 timing_version; struct{ - u8 ref_count, ref_total; + u8 ref_count; }; }; double timing_time; u16 routes[4]; /* routes that pass through this gate */ + u8 route_count; }; struct ent_route_node{ @@ -95,11 +150,241 @@ struct ent_route{ v4f colour; /* runtime */ - u32 active_checkpoint; + u16 active_checkpoint, + valid_checkpoints; + float factive; m4x3f board_transform; mdl_submesh sm; - double latest_pass; + double timing_base; +}; + +struct ent_water{ + mdl_transform transform; + float max_dist; + u32 reserved0, reserved1; +}; + +struct ent_audio_clip{ + union{ + mdl_file file; + audio_clip clip; + }; + + float probability; +}; + +struct volume_particles{ + u32 blank, blank2; +}; + +struct volume_trigger{ + u32 event, blank; +}; + +enum volume_subtype{ + k_volume_subtype_trigger, + k_volume_subtype_particle +}; + +struct ent_volume{ + mdl_transform transform; + m4x3f to_world, to_local; + u32 type; + + u32 target; + + union{ + volume_trigger trigger; + volume_particles particles; + }; +}; + +struct ent_audio{ + mdl_transform transform; + u32 flags, + clip_start, + clip_count; + float volume, crossfade; + u32 behaviour, + group, + probability_curve, + max_channels; +}; + +struct ent_marker{ + mdl_transform transform; + u32 pstr_alias; }; +enum skateshop_type{ + k_skateshop_type_boardshop, + k_skateshop_type_charshop, + k_skateshop_type_worldshop +}; + +struct ent_skateshop{ + mdl_transform transform; + u32 type, id_camera; + + union{ + struct{ + u32 id_display, + id_info, + id_rack; + } + boards; + + struct{ + u32 id_display, + id_info; + } + character; + + struct{ + u32 id_display, + id_info; + } + worlds; + }; +}; + +struct ent_swspreview{ + u32 id_camera, id_display, id_display1; +}; + +struct ent_traffic{ + mdl_transform transform; + u32 submesh_start, + submesh_count, + start_node, + node_count; + float speed, + t; + u32 index; /* into the path */ +}; + +struct ent_camera{ + mdl_transform transform; + float fov; +}; + +enum ent_menuitem_type{ + k_ent_menuitem_type_visual = 0, + k_ent_menuitem_type_event_button = 1, + k_ent_menuitem_type_page_button = 2, + k_ent_menuitem_type_toggle = 3, + k_ent_menuitem_type_slider = 4, + k_ent_menuitem_type_page = 5 +}; + +typedef struct ent_menuitem ent_menuitem; +struct ent_menuitem{ + u32 type, groups, + id_links[4]; /* ent_menuitem */ + f32 factive, fvisible; + + mdl_transform transform; + u32 submesh_start, submesh_count; + + union{ u64 _u64; /* force storage for 64bit pointers */ + i32 *pi32; + f32 *pf32; + void *pvoid; + }; + + union{ + struct{ + u32 id_min, /* ent_marker */ + id_max, /* . */ + id_handle, /* ent_menuitem */ + pstr_data; + } + slider; + + struct{ + u32 pstr; + } + button; + + struct{ + u32 id_check, /* ent_menuitem */ + pstr_data; + v3f offset; /* relative to parent */ + } + checkmark; + + struct{ + u32 pstr_name, + id_entrypoint, /* ent_menuitem */ + id_viewpoint; /* ent_camera */ + } + page; + }; +}; + +struct ent_worldinfo{ + u32 pstr_name, pstr_author, pstr_desc; + f32 timezone; +}; + +VG_STATIC ent_marker *ent_find_marker( mdl_context *mdl, + mdl_array_ptr *arr, const char *alias ) +{ + for( u32 i=0; ipstr_alias ), alias ) ){ + return marker; + } + } + + return NULL; +} + +enum channel_behaviour{ + k_channel_behaviour_unlimited = 0, + k_channel_behaviour_discard_if_full = 1, + k_channel_behaviour_crossfade_if_full = 2 +}; + +enum probability_curve{ + k_probability_curve_constant = 0, + k_probability_curve_wildlife_day = 1, + k_probability_curve_wildlife_night = 2 +}; + +struct ent_font{ + u32 alias, + variant_start, + variant_count, + glyph_start, + glyph_count, + glyph_utf32_base; +}; + +struct ent_font_variant{ + u32 name, + material_id; +}; + +struct ent_glyph{ + v2f size; + u32 indice_start, + indice_count; +}; + +struct ent_ccmd{ + u32 pstr_command; +}; + +typedef struct ent_call ent_call; +struct ent_call{ + u32 id, function; + void *data; +}; + +#include "world.h" +VG_STATIC void entity_call( world_instance *world, ent_call *call ); + #endif /* ENTITY_H */