From 87f478b1348f94b7e7806158fe23d6f9449ebdc7 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Fri, 7 Feb 2020 17:33:05 +1100 Subject: [PATCH] Implemented 'select parent' button in editor and added trigger event --- assets/entities/trigger.symtres | 1 - assets/scenes/scene_1.symtres | 21 ++++-------- src/common/version.h | 2 +- src/game/editor.c | 12 +++++++ src/game/entity.c | 58 +-------------------------------- src/game/entity.h | 1 - src/game/event.c | 1 + src/game/event.h | 8 +++++ src/game/scene.c | 4 +-- src/game/scene.h | 2 +- src/game/trigger.c | 11 ++++--- src/game/trigger.h | 2 +- todo.txt | 4 +-- 13 files changed, 41 insertions(+), 86 deletions(-) diff --git a/assets/entities/trigger.symtres b/assets/entities/trigger.symtres index 46355c2..bca589f 100644 --- a/assets/entities/trigger.symtres +++ b/assets/entities/trigger.symtres @@ -4,7 +4,6 @@ Entity scale : 1.000 1.000 1.000 rotation : 0.000 0.000 0.000 1.000 trigger_mask : 1 - trigger_event : -1 active : true position : 0.000 0.000 0.000 bouding_box_min : -0.500 -0.500 -0.500 diff --git a/assets/scenes/scene_1.symtres b/assets/scenes/scene_1.symtres index 12d4fca..3a4caa0 100755 --- a/assets/scenes/scene_1.symtres +++ b/assets/scenes/scene_1.symtres @@ -16,9 +16,9 @@ Player { type : 2 scale : 1.000 1.000 1.000 - rotation : 0.000 -0.892 0.000 0.452 + rotation : 0.000 0.953 0.000 -0.304 active : true - position : -56.360 2.292 -37.583 + position : -33.850 2.459 -24.439 bouding_box_min : -1.500 -1.500 -1.000 name : Player bouding_box_max : 1.500 1.500 1.000 @@ -83,16 +83,16 @@ Scene_Entity_Entry { scale : 49.800 5.000 1.000 rotation : 0.000 0.000 0.000 1.000 - position : -60.000 3.000 2.000 + position : -59.000 3.000 2.000 filename : cube_uv name : Cube } Scene_Entity_Entry { - scale : 65.000 5.000 1.000 + scale : 65.000 5.000 2.000 rotation : 0.000 0.000 0.000 1.000 - position : 15.000 3.000 -30.000 + position : 17.000 3.000 -30.000 filename : cube_uv name : Cube } @@ -145,18 +145,9 @@ Scene_Entity_Entry Scene_Entity_Entry { scale : 1.000 1.000 1.000 - rotation : 0.000 0.000 0.000 1.000 + rotation : 0.000 -0.000 0.000 1.000 position : 5.000 3.000 6.000 filename : turret name : Turret } -Scene_Entity_Entry -{ - scale : 1.000 1.000 1.000 - rotation : 0.000 0.000 0.000 1.000 - position : -25.000 2.000 -18.000 - filename : Trigger - name : Trigger -} - diff --git a/src/common/version.h b/src/common/version.h index 4fe5053..b64d2ea 100755 --- a/src/common/version.h +++ b/src/common/version.h @@ -4,7 +4,7 @@ /* Auto generated version file. DO NOT MODIFY */ #define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MINOR 1 -#define SYMMETRY_VERSION_REVISION 330 +#define SYMMETRY_VERSION_REVISION 331 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/editor.c b/src/game/editor.c index d5408d2..636894b 100755 --- a/src/game/editor.c +++ b/src/game/editor.c @@ -1848,6 +1848,18 @@ void editor_window_property_inspector(struct nk_context* context, struct Editor* nk_edit_unfocus(context); } + if(parent_ent != &scene->root_entity) + { + nk_layout_row_dynamic(context, row_height, 1); + if(nk_button_label(context, "Select Parent")) + { + editor_entity_select(editor, parent_ent); + nk_end(context); + return; + } + + } + nk_layout_row_dynamic(context, row_height, 2); nk_label(context, "Children", NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE); nk_labelf(context, NK_TEXT_ALIGN_LEFT | NK_TEXT_ALIGN_MIDDLE, "%d", array_len(entity->transform.children)); diff --git a/src/game/entity.c b/src/game/entity.c index 3404267..96531cf 100755 --- a/src/game/entity.c +++ b/src/game/entity.c @@ -116,60 +116,6 @@ bool entity_write(struct Entity* entity, struct Parser_Object* object, bool writ hashmap_int_set(entity_data, "type", entity->type); hashmap_bool_set(entity_data, "active", entity->flags & EF_ACTIVE ? true : false); - //if(entity->has_collision) - //{ - // if(entity->collision.rigidbody) - // hashmap_bool_set(entity_data, "has_rigidbody", true); - // else - // hashmap_bool_set(entity_data, "has_rigidbody", false); - - // int shape_type = platform->physics.cs_type_get(entity->collision.collision_shape); - // hashmap_int_set(entity_data, "collision_shape_type", shape_type); - // switch(shape_type) - // { - // case CST_BOX: - // { - // float x, y, z; - // x = y = z = 0.f; - // platform->physics.cs_box_params_get(entity->collision.collision_shape, &x, &y, &z); - // hashmap_float_set(entity_data, "collision_shape_x", x); - // hashmap_float_set(entity_data, "collision_shape_y", y); - // hashmap_float_set(entity_data, "collision_shape_z", z); - // } - // break; - // case CST_SPHERE: - // { - // float radius = 0.f; - // platform->physics.cs_sphere_radius_get(entity->collision.collision_shape); - // hashmap_float_set(entity_data, "collision_shape_radius", radius); - // } - // break; - // case CST_CAPSULE: - // { - // float length = 0.f, radius = 0.f; - // platform->physics.cs_capsule_params_get(entity->collision.collision_shape, &radius, &length); - // hashmap_float_set(entity_data, "collision_shape_length", length); - // hashmap_float_set(entity_data, "collision_shape_radius", radius); - // } - // break; - // case CST_PLANE: - // { - // float a, b, c, d; - // platform->physics.cs_plane_params_get(entity->collision.collision_shape, &a, &b, &c, &d); - // hashmap_float_set(entity_data, "collision_shape_a", a); - // hashmap_float_set(entity_data, "collision_shape_b", b); - // hashmap_float_set(entity_data, "collision_shape_c", c); - // hashmap_float_set(entity_data, "collision_shape_d", d); - // } - // break; - // default: break; - // } - - //} - - //struct Entity* parent = entity_get_parent(entity->id); - //hashmap_str_set(entity_data, "parent", parent ? parent->name : "NONE"); - /* Transform */ hashmap_vec3_set(entity_data, "position", &entity->transform.position); hashmap_vec3_set(entity_data, "scale", &entity->transform.scale); @@ -276,7 +222,6 @@ bool entity_write(struct Entity* entity, struct Parser_Object* object, bool writ struct Trigger* trigger = (struct Trigger*)entity; hashmap_int_set(entity_data, "trigger_type", trigger->type); hashmap_int_set(entity_data, "trigger_mask", trigger->trigger_mask); - hashmap_int_set(entity_data, "trigger_event", trigger->trigger_event); } break; }; @@ -524,8 +469,7 @@ struct Entity* entity_read(struct Parser_Object* object, struct Entity* parent_e { int type = hashmap_value_exists(object->data, "trigger_type") ? hashmap_int_get(object->data, "trigger_type") : TRIG_TOGGLE; int mask = hashmap_value_exists(object->data, "trigger_mask") ? hashmap_int_get(object->data, "trigger_mask") : TRIGM_ALL; - int trigger_event = hashmap_value_exists(object->data, "trigger_event") ? hashmap_int_get(object->data, "trigger_event") : -1; - struct Trigger* trigger = scene_trigger_create(scene, name, parent_entity, type, trigger_event, mask); + struct Trigger* trigger = scene_trigger_create(scene, name, parent_entity, type, mask); if(!trigger) return new_entity; else diff --git a/src/game/entity.h b/src/game/entity.h index bf11c6d..c4bbb62 100755 --- a/src/game/entity.h +++ b/src/game/entity.h @@ -251,7 +251,6 @@ struct Trigger int type; int count; int trigger_mask; - int trigger_event; // Event to fire when triggered }; void entity_init(struct Entity* entity, const char* name, struct Entity* parent); diff --git a/src/game/event.c b/src/game/event.c index 615290c..14ede6e 100644 --- a/src/game/event.c +++ b/src/game/event.c @@ -324,6 +324,7 @@ const char* event_name_get(int event_type) case EVT_WINDOW_RESIZED: return "Window Resized"; case EVT_TEXT_INPUT: return "Text Input"; case EVT_SCENE_LOADED: return "Scene Loaded"; + case EVT_TRIGGER: return "Trigger Activated"; case EVT_MAX: return "Max Number of Events"; default: return "Invalid event_type"; } diff --git a/src/game/event.h b/src/game/event.h index 089d7fb..1ed0aff 100755 --- a/src/game/event.h +++ b/src/game/event.h @@ -6,6 +6,7 @@ #include "../common/limits.h" struct Entity; +struct Trigger; typedef void (*Event_Handler) (const struct Event* event); typedef void (*Event_Handler_Object) (const struct Event* event, void* subscriber); @@ -23,6 +24,7 @@ enum Event_Types EVT_WINDOW_RESIZED, EVT_TEXT_INPUT, EVT_SCENE_LOADED, + EVT_TRIGGER, EVT_MAX }; @@ -83,6 +85,11 @@ struct Scene_Loaded_Event char filename[MAX_FILENAME_LEN]; }; +struct Trigger_Event +{ + struct Trigger* sender; +}; + struct Event { int type; @@ -95,6 +102,7 @@ struct Event struct Text_Input_Event text_input; struct Window_Resized_Event window_resize; struct Scene_Loaded_Event scene_load; + struct Trigger_Event trigger; }; }; diff --git a/src/game/scene.c b/src/game/scene.c index c1b22e6..43e0b26 100755 --- a/src/game/scene.c +++ b/src/game/scene.c @@ -743,7 +743,7 @@ struct Enemy* scene_enemy_create(struct Scene* scene, const char* name, struct E return new_enemy; } -struct Trigger* scene_trigger_create(struct Scene* scene, const char* name, struct Entity* parent, int type, int trigger_event, int mask) +struct Trigger* scene_trigger_create(struct Scene* scene, const char* name, struct Entity* parent, int type, int mask) { assert(scene); struct Trigger* new_trigger = NULL; @@ -760,7 +760,7 @@ struct Trigger* scene_trigger_create(struct Scene* scene, const char* name, stru if(new_trigger) { entity_init(&new_trigger->base, name, parent ? parent : &scene->root_entity); - trigger_init(new_trigger, type, trigger_event, mask); + trigger_init(new_trigger, type, mask); } else { diff --git a/src/game/scene.h b/src/game/scene.h index 62b970b..512ccf3 100755 --- a/src/game/scene.h +++ b/src/game/scene.h @@ -44,7 +44,7 @@ struct Camera* scene_camera_create(struct Scene* scene, const char* name, struct Static_Mesh* scene_static_mesh_create(struct Scene* scene, const char* name, struct Entity* parent, const char* geometry_name, int material_type); struct Sound_Source* scene_sound_source_create(struct Scene* scene, const char* name, struct Entity* parent, const char* filename, int type, bool loop, bool play); struct Enemy* scene_enemy_create(struct Scene* scene, const char* name, struct Entity* parent, int type); -struct Trigger* scene_trigger_create(struct Scene* scene, const char* name, struct Entity* parent, int type, int trigger_event, int mask); +struct Trigger* scene_trigger_create(struct Scene* scene, const char* name, struct Entity* parent, int type, int mask); void scene_entity_base_remove(struct Scene* scene, struct Entity* entity); void scene_light_remove(struct Scene* scene, struct Light* light); diff --git a/src/game/trigger.c b/src/game/trigger.c index 1c3f99b..753f275 100644 --- a/src/game/trigger.c +++ b/src/game/trigger.c @@ -7,7 +7,7 @@ #include -void trigger_init(struct Trigger* trigger, int type, int trigger_event, int trigger_mask) +void trigger_init(struct Trigger* trigger, int type, int trigger_mask) { assert(type < TRIG_MAX); @@ -15,7 +15,6 @@ void trigger_init(struct Trigger* trigger, int type, int trigger_event, int trig trigger->count = 0; trigger->triggered = false; trigger->type = type; - trigger->trigger_event = trigger_event; trigger->trigger_mask = trigger_mask; } @@ -63,7 +62,6 @@ void trigger_update_physics(struct Trigger* trigger, struct Scene* scene, float fire_event = true; trigger->triggered = true; trigger->count++; - scene_trigger_remove(scene, trigger); } break; case TRIG_TOGGLE: @@ -94,12 +92,15 @@ void trigger_update_physics(struct Trigger* trigger, struct Scene* scene, float if(fire_event) log_message("event triggered!"); - if(fire_event && trigger->trigger_event != -1) + if(fire_event) { struct Event_Manager* event_manager = game_state_get()->event_manager; struct Event* trigger_event = event_manager_create_new_event(event_manager); - trigger_event->type = trigger->trigger_event; + trigger_event->type = EVT_TRIGGER; + trigger_event->trigger.sender = trigger; event_manager_send_event(event_manager, trigger_event); + if(trigger->type == TRIG_ONE_SHOT) + scene_trigger_remove(scene, trigger); } } else diff --git a/src/game/trigger.h b/src/game/trigger.h index 79f2ff4..9f6b734 100644 --- a/src/game/trigger.h +++ b/src/game/trigger.h @@ -3,7 +3,7 @@ struct Trigger; -void trigger_init(struct Trigger* trigger, int type, int trigger_event, int trigger_mask); +void trigger_init(struct Trigger* trigger, int type, int trigger_mask); void trigger_reset(struct Trigger* trigger); void trigger_update_physics(struct Trigger* trigger, struct Scene* scene, float fixed_dt); diff --git a/todo.txt b/todo.txt index b8676e5..5bf6a4c 100644 --- a/todo.txt +++ b/todo.txt @@ -3,7 +3,6 @@ Todo: - Implement separate property window for player related variables that can be shown in the editor similar to renderer settings etc - Implement game gui either with a separate nuklear context or as part of existing context - Property inspector in editor should only show/apply local transformation values and world transformation values should be shown as non-editabale values - - Add "Select Parent" button to property inspector - Fix rotate gizmo's origin not being set to the selected entity - Player shooting - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded @@ -403,4 +402,5 @@ Done: * Add another ambient sound_source entity as child to enemy entity * Add all sound source properties to propery inspector * Implement Triggers - * Fix crash where if entity selected in editor is deleted in game mode and then returning to editor mode causes a crash \ No newline at end of file + * Fix crash where if entity selected in editor is deleted in game mode and then returning to editor mode causes a crash + * Add "Select Parent" button to property inspector \ No newline at end of file