A 3d fps game made in OpenGL
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Symmetry/src/game/entity.h

283 lines
7.2 KiB

#ifndef ENTITY_H
#define ENTITY_H
#include "../common/linmath.h"
#include "../common/num_types.h"
#include "../system/sound.h"
#include "bounding_volumes.h"
#include "material.h"
#include "../common/limits.h"
struct Entity;
struct Material_Param;
struct Parser_Object;
typedef void (*Trigger_Func)(struct Trigger* trigger);
enum Entity_Type
{
ET_NONE,
ET_DEFAULT,
ET_PLAYER,
ET_ROOT,
ET_CAMERA,
ET_LIGHT,
ET_STATIC_MESH,
ET_SOUND_SOURCE,
ET_ENEMY,
ET_TRIGGER,
ET_DOOR,
ET_MAX
};
enum LightType
{
LT_SPOT = 0,
LT_DIR,
LT_POINT,
LT_INVALID,
LT_MAX
};
enum Camera_Type
{
CAM_EDITOR = 0,
CAM_GAME,
CAM_MAX
};
enum Enemy_Type
{
ENEMY_TURRET = 0,
ENEMY_MAX
};
enum Entity_Flags
{
EF_NONE = 0,
EF_ACTIVE = 1 << 0,
EF_SELECTED_IN_EDITOR = 1 << 1,
EF_MARKED_FOR_DELETION = 1 << 2,
EF_TRANSIENT = 1 << 3, // Do not save the entity when saving the scene. The entity will still be saved if it is individually saved to file
EF_HIDE_IN_EDITOR_SCENE_HIERARCHY = 1 << 4,
EF_SKIP_RENDER = 1 << 5,
EF_IGNORE_RAYCAST = 1 << 6
};
enum Entity_Ray_Mask
{
ERM_NONE = 0,
ERM_DEFAULT = 1 << 0,
ERM_PLAYER = 1 << 1,
ERM_CAMERA = 1 << 2,
ERM_LIGHT = 1 << 3,
ERM_STATIC_MESH = 1 << 4,
ERM_SOUND_SOURCE = 1 << 5,
ERM_ENEMY = 1 << 6,
ERM_TRIGGER = 1 << 7,
ERM_ALL = ERM_DEFAULT | ERM_PLAYER | ERM_CAMERA | ERM_LIGHT | ERM_STATIC_MESH | ERM_SOUND_SOURCE | ERM_ENEMY | ERM_TRIGGER
};
enum Trigger_Mask
{
TRIGM_PLAYER = 1 << 0,
TRIGM_ENEMY = 1 << 1,
TRIGM_ALL = TRIGM_PLAYER | TRIGM_ENEMY
};
enum Door_Key_Mask
{
DOOR_KEY_MASK_NONE = 0,
DOOR_KEY_MASK_RED = 1 << 0,
DOOR_KEY_MASK_GREEN = 1 << 1,
DOOR_KEY_MASK_BLUE = 1 << 2,
DOOR_KEY_MASK_ALL = DOOR_KEY_MASK_RED | DOOR_KEY_MASK_GREEN | DOOR_KEY_MASK_BLUE
};
enum Trigger_Type
{
TRIG_TOGGLE = 0, // Toggled on once and fires event then wont fire event until it is deactivated and activated again
TRIG_CONTINUOUS, // Continuously fire events while the trigger is active
TRIG_ONE_SHOT, // Fire event once when triggered and then get deleted
TRIG_MAX
};
struct Transform
{
vec3 position;
vec3 scale;
quat rotation;
mat4 trans_mat;
bool is_modified;
struct Entity* parent;
struct Entity** children;
};
struct Entity
{
int id;
int type;
int archetype_index;
uchar flags;
char name[MAX_ENTITY_NAME_LEN];
struct Bounding_Box bounding_box;
struct Bounding_Box derived_bounding_box;
struct Transform transform;
};
struct Model
{
int geometry_index;
struct Material* material;
struct Variant material_params[MMP_MAX];
};
struct Sound_Source
{
struct Entity base;
int type;
bool loop;
uint source_instance;
float min_distance;
float max_distance;
float rolloff_factor;
float volume;
int attenuation_type;
struct Sound_Source_Buffer* source_buffer; // Handle to the file from which the sound is loaded and played
};
struct Camera
{
struct Entity base;
mat4 proj_mat;
mat4 view_mat;
mat4 view_proj_mat;
float fov;
float aspect_ratio;
float nearz;
float farz;
float zoom;
bool ortho;
int fbo;
int render_tex;
int depth_tex;
vec4 clear_color;
vec4 frustum[6];
bool resizeable;
};
struct Light
{
struct Entity base;
float outer_angle;
float inner_angle;
float falloff;
float intensity;
vec3 color;
bool cast_shadow;
bool pcf_enabled;
bool valid;
int type;
int radius;
int shadow_map[4];
float depth_bias;
};
struct Static_Mesh
{
struct Entity base;
struct Model model;
};
struct Player
{
struct Entity base;
struct Static_Mesh* mesh;
struct Camera* camera;
struct Sound_Source* weapon_sound;
struct Sound_Source* footstep_sound;
int health;
int key_mask;
float move_speed;
float move_speed_multiplier;
float turn_speed;
float jump_speed;
float gravity;
float min_downward_distance;
float min_forward_distance;
bool grounded;
};
struct Enemy
{
struct Entity base;
int type;
int health;
int damage;
int current_state;
struct Static_Mesh* mesh;
struct Sound_Source* weapon_sound;
struct Sound_Source* ambient_sound;
union
{
struct
{
float turn_speed_default;
float turn_speed_when_targetting;
float turn_speed_current;
float max_yaw;
float target_yaw;
bool yaw_direction_positive;
bool pulsate;
bool scan;
float pulsate_speed_scale;
float pulsate_height;
float attack_cooldown;
float time_elapsed_since_attack;
float time_elapsed_since_alert;
float alert_cooldown;
float vision_range;
vec4 color_default;
vec4 color_alert;
vec4 color_attack;
}Turret;
};
};
struct Trigger
{
struct Entity base;
bool triggered;
int type;
int count;
int trigger_mask;
};
struct Door
{
struct Entity base;
int mask;
int state;
float speed;
float open_position;
float close_position;
struct Static_Mesh* mesh;
struct Sound_Source* sound;
struct Trigger* trigger;
};
void entity_init(struct Entity* entity, const char* name, struct Entity* parent);
void entity_reset(struct Entity* entity, int id);
bool entity_save(struct Entity* entity, const char* filename, int directory_type);
struct Entity* entity_load(const char* filename, int directory_type, bool send_on_scene_load_event);
bool entity_write(struct Entity* entity, struct Parser_Object* object, bool write_transform);
struct Entity* entity_read(struct Parser_Object* object, struct Entity* parent_entity);
const char* entity_type_name_get(struct Entity* entity);
int entity_get_num_children_of_type(struct Entity* entity, int type, struct Entity** in_children, int max_children);
void entity_rename(struct Entity* entity, const char* new_name);
void entity_update_derived_bounding_box(struct Entity* entity);
void entity_bounding_box_reset(struct Entity* entity, bool update_derived);
#endif