A dungeon delver roguelike using Pathfinder 2nd edition rules

Adding occulsion effect, need to fine tune

+71 -10
+6
characters/character.gd
··· 15 15 16 16 enum State {STATE_IDLE, STATE_TARGET, STATE_ROTATE, STATE_MOVE} 17 17 18 + func _ready() -> void: 19 + if model: 20 + model.set_instance_shader_parameter("use_mask", false) 21 + elif model_scene: 22 + model_scene.set_shader_parameter("use_mask", false) 23 + 18 24 func _physics_process(delta: float) -> void: 19 25 if model: 20 26 model.set_instance_shader_parameter("outline", is_selected)
+3
dungeonRoom/dark_grey_toon.tres
··· 22 22 shader_parameter/color_ramp3 = ExtResource("3_uxqct") 23 23 shader_parameter/outline_color = Color(0, 0, 0, 1) 24 24 shader_parameter/outline_factor = 0.0 25 + shader_parameter/mask_factor = 40.0 26 + shader_parameter/player_pos = Vector3(0, 0, 0) 27 + shader_parameter/camera_pos = Vector3(0, 0, 0)
+17
dungeonRoom/dungeonRoom.gd
··· 28 28 29 29 func _ready() -> void: 30 30 updateRoom() 31 + 32 + for part in [$"RoomBase/north_wall", $"RoomBase/south_wall", $"RoomBase/east_wall", $"RoomBase/west_wall", $"RoomBase/ceiling"]: 33 + for col in part.get_children(): 34 + for item in col.get_children(): 35 + var obj: MeshInstance3D = item 36 + obj.set_instance_shader_parameter("use_mask", true) 37 + 38 + for door in [$"EastDoor", $"NorthDoor", $"SouthDoor", $"WestDoor", $"NoEastDoor", $"NoNorthDoor", $"NoSouthDoor", $"NoWestDoor"]: 39 + for item in door.get_children(): 40 + var obj: MeshInstance3D = item 41 + obj.set_instance_shader_parameter("use_mask", true) 42 + 43 + func _process(delta: float) -> void: 44 + var obj: MeshInstance3D = $"RoomBase/floor/floor_a/floor_a1" 45 + var mat: ShaderMaterial = obj.mesh.surface_get_material(0) 46 + mat.set_shader_parameter("player_pos", $"FighterCharacter".global_position) 47 + mat.set_shader_parameter("camera_pos", $"Camera/Path3D/PathFollow3D/SpringArm3D/Camera3D".global_position)
+4
dungeonRoom/grey_toon.tres
··· 22 22 shader_parameter/color_ramp3 = ExtResource("3_rvn3b") 23 23 shader_parameter/outline_color = Color(0, 0, 0, 1) 24 24 shader_parameter/outline_factor = 0.0 25 + shader_parameter/use_mask = true 26 + shader_parameter/mask_factor = 15.0 27 + shader_parameter/player_pos = Vector3(0, 0, 0) 28 + shader_parameter/camera_pos = Vector3(0, 0, 0)
+4
dungeonRoom/iron_toon.tres
··· 22 22 shader_parameter/color_ramp3 = ExtResource("3_bpgg8") 23 23 shader_parameter/outline_color = Color(0, 0, 0, 1) 24 24 shader_parameter/outline_factor = 0.0 25 + shader_parameter/use_mask = true 26 + shader_parameter/mask_factor = 15.0 27 + shader_parameter/player_pos = Vector3(0, 0, 0) 28 + shader_parameter/camera_pos = Vector3(0, 0, 0)
+4
dungeonRoom/red_wood_toon.tres
··· 22 22 shader_parameter/color_ramp3 = ExtResource("3_dso3y") 23 23 shader_parameter/outline_color = Color(0, 0, 0, 1) 24 24 shader_parameter/outline_factor = 0.0 25 + shader_parameter/use_mask = true 26 + shader_parameter/mask_factor = 15.0 27 + shader_parameter/player_pos = Vector3(0, 0, 0) 28 + shader_parameter/camera_pos = Vector3(0, 0, 0)
+4
dungeonRoom/steel_toon.tres
··· 22 22 shader_parameter/color_ramp3 = ExtResource("3_4uitu") 23 23 shader_parameter/outline_color = Color(0, 0, 0, 1) 24 24 shader_parameter/outline_factor = 0.0 25 + shader_parameter/use_mask = true 26 + shader_parameter/mask_factor = 15.0 27 + shader_parameter/player_pos = Vector3(0, 0, 0) 28 + shader_parameter/camera_pos = Vector3(0, 0, 0)
+29 -10
shader/toon.gdshader
··· 23 23 uniform vec4 outline_color : source_color; 24 24 uniform float outline_factor; 25 25 26 - float fresnel(float amount, vec3 normal, vec3 view) 27 - { 28 - return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0 )), amount); 26 + instance uniform bool use_mask; 27 + varying float mask_factor; 28 + uniform vec3 player_pos; 29 + uniform vec3 camera_pos; 30 + varying vec3 world_pos; 31 + 32 + float fresnel(float amount, vec3 normal, vec3 view) { 33 + return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0)), amount); 34 + } 35 + 36 + float mask(vec3 player, vec3 camera, vec3 world, float depth, float factor) { 37 + return clamp(((1.0 - dot(normalize(player - camera), normalize(world - camera)))) / factor, 0.0, 1.0); 29 38 } 30 39 31 40 void vertex() { 32 - UV=UV*uv1_scale.xy+uv1_offset.xy; 41 + UV = UV * uv1_scale.xy + uv1_offset.xy; 42 + world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; 43 + mask_factor = 0.2; 33 44 } 34 45 35 46 void fragment() { 36 47 float basic_fresnel = fresnel(4.0, NORMAL, VIEW); 37 48 38 49 vec2 base_uv = UV; 39 - vec4 albedo_tex = texture(texture_albedo,base_uv); 50 + vec4 albedo_tex = texture(texture_albedo, base_uv); 40 51 ALBEDO = albedo.rgb * albedo_tex.rgb + (basic_fresnel * texture(color_ramp3, vec2(basic_fresnel, 0.0)).rgb * 1.0); 41 - float metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel); 52 + float metallic_tex = dot(texture(texture_metallic, base_uv), metallic_texture_channel); 42 53 METALLIC = metallic_tex * metallic; 43 - vec4 roughness_texture_channel = vec4(0.0,1.0,0.0,0.0); 44 - float roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel); 54 + vec4 roughness_texture_channel = vec4(0.0, 1.0, 0.0, 0.0); 55 + float roughness_tex = dot(texture(texture_roughness, base_uv), roughness_texture_channel); 45 56 ROUGHNESS = roughness_tex * roughness; 46 57 SPECULAR = 0.0; 47 - NORMAL_MAP = texture(texture_normal,base_uv).rgb; 58 + NORMAL_MAP = texture(texture_normal, base_uv).rgb; 48 59 NORMAL_MAP_DEPTH = normal_scale; 49 - 60 + ALPHA_SCISSOR_THRESHOLD = 0.333; 61 + 50 62 if (outline) { 51 63 float angle = dot(NORMAL, VIEW); 52 64 float t = clamp(angle * angle, 0.0, 1.0); 53 65 ALBEDO = mix(vec3(outline_color.r, outline_color.g, outline_color.b) * outline_factor, ALBEDO, t); 66 + } 67 + 68 + if (use_mask) { 69 + float depth = FRAGCOORD.z; 70 + ALPHA = mask(player_pos, camera_pos, world_pos, depth, mask_factor); 71 + } else { 72 + ALPHA = 1.0; 54 73 } 55 74 } 56 75