Implemented 'select parent' button in editor and added trigger event

dev
Shariq Shah 6 years ago
parent 2ea45b6743
commit 87f478b134
  1. 1
      assets/entities/trigger.symtres
  2. 21
      assets/scenes/scene_1.symtres
  3. 2
      src/common/version.h
  4. 12
      src/game/editor.c
  5. 58
      src/game/entity.c
  6. 1
      src/game/entity.h
  7. 1
      src/game/event.c
  8. 8
      src/game/event.h
  9. 4
      src/game/scene.c
  10. 2
      src/game/scene.h
  11. 11
      src/game/trigger.c
  12. 2
      src/game/trigger.h
  13. 4
      todo.txt

@ -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

@ -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
}

@ -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

@ -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));

@ -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

@ -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);

@ -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";
}

@ -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;
};
};

@ -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
{

@ -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);

@ -7,7 +7,7 @@
#include <assert.h>
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

@ -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);

@ -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
* 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
Loading…
Cancel
Save