diff --git a/assets/models/muzzle_flash.symbres b/assets/models/muzzle_flash.symbres new file mode 100644 index 0000000..19a8c91 Binary files /dev/null and b/assets/models/muzzle_flash.symbres differ 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