From 9b431e5d6c0ada7f5c3173892162689759b79c99 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Fri, 10 Apr 2020 23:12:34 +1000 Subject: [PATCH] Added muzzle mesh to player --- assets/models/muzzle_flash.symbres | Bin 0 -> 26800 bytes assets/shaders/blinn_phong.frag | 2 +- src/common/version.h | 2 +- src/game/entity.h | 4 +++- src/game/player.c | 32 ++++++++++++++++++++++------- src/game/renderer.c | 6 ++++++ todo.txt | 4 ++-- 7 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 assets/models/muzzle_flash.symbres diff --git a/assets/models/muzzle_flash.symbres b/assets/models/muzzle_flash.symbres new file mode 100644 index 0000000000000000000000000000000000000000..19a8c910682a33d75b045a5ee5b156f33fee1b27 GIT binary patch literal 26800 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 Z%;Q#{n4WpvKkJP@>kU_*{C}@E{s+Bmp$h;2 literal 0 HcmV?d00001 diff --git a/assets/shaders/blinn_phong.frag b/assets/shaders/blinn_phong.frag index 960a7bf..e5ddd46 100755 --- a/assets/shaders/blinn_phong.frag +++ b/assets/shaders/blinn_phong.frag @@ -46,7 +46,7 @@ vec3 calc_point_light(in Light light) { diffuse_comp = light.color * diffuse * cos_ang_incidence; vec3 vertex_to_eye = normalize(camera_pos - vertex); - vec3 halfway = normalize(light_direction + vertex_to_eye); + vec3 halfway = normalize(light.direction + vertex_to_eye); float specular_factor = max(0.0, dot(normalized_normal, halfway)); specular_factor = pow(specular_factor, specular_strength); specular_comp = light.color * specular * specular_factor; diff --git a/src/common/version.h b/src/common/version.h index b8134f6..fabb929 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 2 -#define SYMMETRY_VERSION_REVISION 361 +#define SYMMETRY_VERSION_REVISION 362 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/entity.h b/src/game/entity.h index e07ea98..e807f9b 100755 --- a/src/game/entity.h +++ b/src/game/entity.h @@ -65,7 +65,8 @@ enum Entity_Flags EF_SKIP_RENDER = 1 << 5, EF_IGNORE_RAYCAST = 1 << 6, EF_IGNORE_COLLISION = 1 << 7, - EF_ALWAYS_RENDER = 1 << 8 + EF_ALWAYS_RENDER = 1 << 8, + EF_DISABLE_BACKFACE_CULL = 1 << 9 }; enum Pickup_Type @@ -208,6 +209,7 @@ struct Player struct Entity base; struct Static_Mesh* body_mesh; struct Static_Mesh* weapon_mesh; + struct Static_Mesh* muzzle_flash_mesh; struct Camera* camera; struct Sound_Source* weapon_sound; struct Sound_Source* footstep_sound; diff --git a/src/game/player.c b/src/game/player.c index e18d0b8..a77683a 100755 --- a/src/game/player.c +++ b/src/game/player.c @@ -18,6 +18,7 @@ #include "sound_source.h" #include "entity.h" #include "gui_game.h" +#include "texture.h" #include #include @@ -78,6 +79,13 @@ void player_init(struct Player* player, struct Scene* scene) transform_translate(player->weapon_mesh, &translation, TS_LOCAL); transform_rotate(player->weapon_mesh, &UNIT_Y, 90.f, TS_LOCAL); transform_scale(player->weapon_mesh, &(vec3){0.3f, 0.1f, 0.1f}); + + player->muzzle_flash_mesh = scene_static_mesh_create(scene, "Player_Muzzle_Flash_Mesh", player_camera, "muzzle_flash.symbres", MAT_BLINN); + transform_translate(player->muzzle_flash_mesh, &(vec3) {0.f, -0.3f, -2.75f}, TS_LOCAL); + transform_rotate(player->muzzle_flash_mesh, &UNIT_X, 90.f, TS_LOCAL); + player->muzzle_flash_mesh->model.material_params[MMP_DIFFUSE_TEX].val_int = texture_create_from_file("white.tga", TU_DIFFUSE); + player->muzzle_flash_mesh->model.material_params[MMP_DIFFUSE].val_float = 6.f; + vec4_fill(&player->muzzle_flash_mesh->model.material_params[MMP_DIFFUSE_COL].val_vec4, 0.9f, 0.4f, 0.f, 1.f); struct Sound_Source* weapon_sound = scene_sound_source_create(scene, "Player_Weapon_Sound_Source", player, "sounds/bullet_1.wav", ST_WAV, false, false); if(weapon_sound) @@ -98,13 +106,14 @@ void player_init(struct Player* player, struct Scene* scene) log_error("player:init", "Could not add grunt entity to player"); // Mark player camera and mesh as transient for now. We don't need to save them to file since we recreate them here anyway - player->camera->base.flags |= EF_TRANSIENT; - player->footstep_sound->base.flags |= EF_TRANSIENT; - player->grunt_sound->base.flags |= EF_TRANSIENT; - player->body_mesh->base.flags |= EF_TRANSIENT | EF_IGNORE_COLLISION | EF_ALWAYS_RENDER; - player->weapon_mesh->base.flags |= EF_TRANSIENT | EF_IGNORE_COLLISION | EF_ALWAYS_RENDER; - player->weapon_light->base.flags |= EF_TRANSIENT; - player->weapon_sound->base.flags |= EF_TRANSIENT; + player->camera->base.flags |= EF_TRANSIENT; + player->footstep_sound->base.flags |= EF_TRANSIENT; + player->grunt_sound->base.flags |= EF_TRANSIENT; + player->body_mesh->base.flags |= EF_TRANSIENT | EF_IGNORE_COLLISION | EF_ALWAYS_RENDER; + player->weapon_mesh->base.flags |= EF_TRANSIENT | EF_IGNORE_COLLISION | EF_ALWAYS_RENDER; + player->muzzle_flash_mesh->base.flags |= EF_TRANSIENT | EF_IGNORE_COLLISION | EF_ALWAYS_RENDER; + player->weapon_light->base.flags |= EF_TRANSIENT; + player->weapon_sound->base.flags |= EF_TRANSIENT; transform_parent_set(player_camera, player, true); @@ -385,6 +394,7 @@ void player_on_mousebutton_released(const struct Event* event) int intensity = player->weapon_light_intensity_min + rand() % player->weapon_light_intensity_max; player->weapon_light->intensity = intensity; + transform_scale(player->muzzle_flash_mesh, &(vec3){1.f, 1.f, 1.f}); sound_source_play(game_state->sound, player->weapon_sound); } } @@ -427,4 +437,12 @@ void player_update(struct Player* player, float dt) if(player->weapon_light->intensity < 0.f) player->weapon_light->intensity = 0.f; } + + if(player->muzzle_flash_mesh->base.transform.scale.x > 0.f) + { + player->muzzle_flash_mesh->base.transform.scale.x -= player->weapon_light_intensity_decay * dt; + player->muzzle_flash_mesh->base.transform.scale.y -= player->weapon_light_intensity_decay * dt; + player->muzzle_flash_mesh->base.transform.scale.z -= player->weapon_light_intensity_decay * dt; + transform_update_transmat(player->muzzle_flash_mesh); + } } diff --git a/src/game/renderer.c b/src/game/renderer.c index 06fdf58..c1ea582 100755 --- a/src/game/renderer.c +++ b/src/game/renderer.c @@ -93,6 +93,8 @@ void renderer_render(struct Renderer* renderer, struct Scene* scene) active_camera->clear_color.w); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); static mat4 mvp; for(int i = 0; i < MAT_MAX; i++) @@ -229,6 +231,10 @@ void renderer_render(struct Renderer* renderer, struct Scene* scene) } /* Render the geometry */ + if(mesh->base.flags & EF_DISABLE_BACKFACE_CULL) + glDisable(GL_CULL_FACE); + else + glEnable(GL_CULL_FACE); geom_render(mesh->model.geometry_index, GDM_TRIANGLES); for(int k = 0; k < MMP_MAX; k++) diff --git a/todo.txt b/todo.txt index df099f2..009efcf 100644 --- a/todo.txt +++ b/todo.txt @@ -3,7 +3,6 @@ Todo: - Don't save parent entity's transform when saving entity archetype. Only save the transformation values for children - Enemies getting hit by bullets - Add weapon flash, muzzle mesh to turrets - - Add muzzle mesh to player - Save case sensitive file names when scene entity entries - Disbale all player actions when scene cleared dialog or scene restart dialog are active - Memory utils that provide allocation tracking @@ -433,4 +432,5 @@ Done: * Implemented flag for ignoring collisions with certain entities * Background music track per scene specified in scene properties * Fixed bug where child entities' absolute position does not change when parent rotates - * Player weapon mesh and lighting \ No newline at end of file + * Player weapon mesh and lighting + * Added muzzle mesh to player \ No newline at end of file