FINALLY FIXED REVOLVER CHAMBER

This commit is contained in:
derek
2025-01-20 13:29:56 -06:00
parent 4638c97b84
commit f66b5a81b8
11 changed files with 460 additions and 541 deletions

View File

@@ -4,26 +4,26 @@ render_mode unshaded, blend_mix, depth_draw_never, depth_test_disabled;
/*
AUTHOR: Hannah "EMBYR" Crawford
ENGINE_VERSION: 4.0.3
HOW TO USE:
1. Create a MeshInstance3D node and place it in your scene.
2. Set it's size to 2x2.
3. Enable the "Flip Faces" option.
4. Create a new shader material with this shader.
5. Assign the material to the MeshInstance3D
LIMITATIONS:
Does not work well with TAA enabled.
MOBILE_NOTES:
The mobile renderer does not have access to the normal_roughness texture
so we must rely on techniques to reconstruct this information from the
depth buffer.
If you require support on mobile please uncomment the SUPPORT_MOBILE line
below. I have done my best to match the appearance between the two modes
however, mobile does not take into account smooth-shaded faces.
The high-quality reconstruction method used on mobile is rather heavy on
texture samples. If you would like to use the lower-quality recontruction
method for better performance, please uncomment the NAIVE_NORMAL_RECONSTRUCTION
@@ -58,14 +58,14 @@ varying flat mat4 model_view_matrix;
#endif// !SUPPORT_MOBILE
struct UVNeighbors {
vec2 center;
vec2 center;
vec2 left; vec2 right; vec2 up; vec2 down;
vec2 top_left; vec2 top_right; vec2 bottom_left; vec2 bottom_right;
};
struct NeighborDepthSamples {
float c_d;
float l_d; float r_d; float u_d; float d_d;
float c_d;
float l_d; float r_d; float u_d; float d_d;
float tl_d; float tr_d; float bl_d; float br_d;
};
@@ -124,16 +124,16 @@ float getGrazingAngleModulation(vec3 pixel_normal, vec3 view) {
}
float detectEdgesDepth(NeighborDepthSamples depth_samples, vec3 pixel_normal, vec3 view) {
float n_total =
depth_samples.l_d +
depth_samples.r_d +
depth_samples.u_d +
depth_samples.d_d +
depth_samples.tl_d +
depth_samples.tr_d +
depth_samples.bl_d +
float n_total =
depth_samples.l_d +
depth_samples.r_d +
depth_samples.u_d +
depth_samples.d_d +
depth_samples.tl_d +
depth_samples.tr_d +
depth_samples.bl_d +
depth_samples.br_d;
float t = depth_threshold * getGrazingAngleModulation(pixel_normal, view);
return step(t, n_total - (depth_samples.c_d * 8.0));
}
@@ -159,17 +159,17 @@ vec3 reconstructWorldNormal(sampler2D depth_tex, mat4 model_view, mat4 inv_proj,
float b1 = texture(depth_tex, screen_uv - vec2(0,1) * e).r;
float t1 = texture(depth_tex, screen_uv + vec2(0,1) * e).r;
float t2 = texture(depth_tex, screen_uv + vec2(0,2) * e).r;
float dl = abs(l1 * l2 / (2.0 * l2 - l1) - c0);
float dr = abs(r1 * r2 / (2.0 * r2 - r1) - c0);
float db = abs(b1 * b2 / (2.0 * b2 - b1) - c0);
float dt = abs(t1 * t2 / (2.0 * t2 - t1) - c0);
vec3 ce = reconstructWorldPosition(c0, model_view, inv_proj, screen_uv, world, inv_cam);
vec3 dpdx = (dl<dr) ? ce-reconstructWorldPosition(l1, model_view, inv_proj, screen_uv - vec2(1,0) * e, world, inv_cam) :
vec3 dpdx = (dl<dr) ? ce-reconstructWorldPosition(l1, model_view, inv_proj, screen_uv - vec2(1,0) * e, world, inv_cam) :
-ce+reconstructWorldPosition(r1, model_view, inv_proj, screen_uv + vec2(1,0) * e, world, inv_cam) ;
vec3 dpdy = (db<dt) ? ce-reconstructWorldPosition(b1, model_view, inv_proj, screen_uv - vec2(0,1) * e, world, inv_cam) :
vec3 dpdy = (db<dt) ? ce-reconstructWorldPosition(b1, model_view, inv_proj, screen_uv - vec2(0,1) * e, world, inv_cam) :
-ce+reconstructWorldPosition(t1, model_view, inv_proj, screen_uv + vec2(0,1) * e, world, inv_cam) ;
return normalize(cross(dpdx,dpdy));
@@ -190,19 +190,19 @@ float detectEdgesNormalReconstructed(UVNeighbors uvs, sampler2D depth_tex, mat4
vec3 n_tr = reconstructWorldNormal(depth_tex, model_view, inv_proj, uvs.top_right, world, inv_cam, viewport_size);
vec3 n_bl = reconstructWorldNormal(depth_tex, model_view, inv_proj, uvs.bottom_left, world, inv_cam, viewport_size);
vec3 n_br = reconstructWorldNormal(depth_tex, model_view, inv_proj, uvs.bottom_right, world, inv_cam, viewport_size);
vec3 normalFiniteDifference0 = n_tr - n_bl;
vec3 normalFiniteDifference1 = n_tl - n_br;
vec3 normalFiniteDifference2 = n_l - n_r;
vec3 normalFiniteDifference3 = n_u - n_d;
float edgeNormal = sqrt(
dot(normalFiniteDifference0, normalFiniteDifference0) +
dot(normalFiniteDifference1, normalFiniteDifference1) +
dot(normalFiniteDifference2, normalFiniteDifference2) +
dot(normalFiniteDifference0, normalFiniteDifference0) +
dot(normalFiniteDifference1, normalFiniteDifference1) +
dot(normalFiniteDifference2, normalFiniteDifference2) +
dot(normalFiniteDifference3, normalFiniteDifference3)
) * 0.5;
return smoothstep(normal_threshold - normal_smoothing, normal_threshold + normal_smoothing, edgeNormal);
}
#else
@@ -215,26 +215,26 @@ float detectEdgesNormal(UVNeighbors uvs, sampler2D normTex, vec3 camDirWorld){
vec3 n_tr = texture(normTex, uvs.top_right).xyz;
vec3 n_bl = texture(normTex, uvs.bottom_left).xyz;
vec3 n_br = texture(normTex, uvs.bottom_right).xyz;
vec3 normalFiniteDifference0 = n_tr - n_bl;
vec3 normalFiniteDifference1 = n_tl - n_br;
vec3 normalFiniteDifference2 = n_l - n_r;
vec3 normalFiniteDifference3 = n_u - n_d;
float edgeNormal = sqrt(
dot(normalFiniteDifference0, normalFiniteDifference0) +
dot(normalFiniteDifference1, normalFiniteDifference1) +
dot(normalFiniteDifference2, normalFiniteDifference2) +
dot(normalFiniteDifference0, normalFiniteDifference0) +
dot(normalFiniteDifference1, normalFiniteDifference1) +
dot(normalFiniteDifference2, normalFiniteDifference2) +
dot(normalFiniteDifference3, normalFiniteDifference3)
);
return smoothstep(normal_threshold - normal_smoothing, normal_threshold + normal_smoothing, edgeNormal);
}
#endif//SUPPORT_MOBILE
void vertex() {
POSITION = vec4(VERTEX, 1.0);
#ifdef SUPPORT_MOBILE
model_view_matrix = INV_VIEW_MATRIX * mat4(VIEW_MATRIX[0],VIEW_MATRIX[1],VIEW_MATRIX[2],VIEW_MATRIX[3]);;
#endif
@@ -242,31 +242,31 @@ void vertex() {
void fragment() {
float aspect = float(VIEWPORT_SIZE.y) / float(VIEWPORT_SIZE.x);
UVNeighbors n = getNeighbors(SCREEN_UV, max_thickness, aspect);
NeighborDepthSamples depth_samples = getLinearDepthSamples(n, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
float min_d = getMinimumDepth(depth_samples);
float thickness = clamp(remap(min_d, min_distance, max_distance, max_thickness, min_thickness), min_thickness, max_thickness);
float fade_a = clamp(remap(min_d, min_distance, max_distance, 1.0, 0.0), 0.0, 1.0);
n = getNeighbors(SCREEN_UV, thickness, aspect);
depth_samples = getLinearDepthSamples(n, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
#ifndef SUPPORT_MOBILE
vec3 pixel_normal = texture(NORMR_TEXTURE, SCREEN_UV).xyz;
#else
vec3 pixel_normal = reconstructWorldNormal(DEPTH_TEXTURE, model_view_matrix, INV_PROJECTION_MATRIX, SCREEN_UV, MODEL_MATRIX, INV_VIEW_MATRIX, VIEWPORT_SIZE.xy);
#endif
float depthEdges = detectEdgesDepth(depth_samples, pixel_normal, VIEW);
#ifndef SUPPORT_MOBILE
float normEdges = min(detectEdgesNormal(n, NORMR_TEXTURE, CAMERA_DIRECTION_WORLD), 1.0);
#else
float normEdges = min(detectEdgesNormalReconstructed(n, DEPTH_TEXTURE, model_view_matrix, INV_PROJECTION_MATRIX, SCREEN_UV, MODEL_MATRIX, INV_VIEW_MATRIX, VIEWPORT_SIZE.xy), 1.0);
#endif
ALBEDO.rgb = outlineColor.rgb;
ALPHA = max(depthEdges, normEdges) * outlineColor.a * fade_a;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -702,7 +702,7 @@ audio_empty = NodePath("Audio/Empty")
audio_reload = NodePath("Audio/Reload")
[node name="mac10" parent="." index="0"]
transform = Transform3D(-1.08301e-06, -8.05088e-08, -0.3, -0.0225093, 0.299154, 9.77362e-10, 0.299154, 0.0225093, -1.086e-06, -0.00876398, 0.0748287, -0.0557729)
transform = Transform3D(-1.08301e-06, -8.05084e-08, -0.3, -0.0225093, 0.299154, 9.77767e-10, 0.299154, 0.0225093, -1.086e-06, -0.00876398, 0.0748287, -0.0557729)
cast_shadow = 0
lod_bias = 10.0
mesh = SubResource("ArrayMesh_pcg38")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,86 +0,0 @@
extends RigidBody3D
@export var collision_shape = Node
@export var despawning = false
@export var despawn_time_s = 10
@export_enum("Ammo", "Stamina", "Health", "Money","Weapon") var pickupType: int
@onready var level_control = get_tree().current_scene
@onready var timer: Timer = $Timer
var pickupable = false
var pick_up = false
var rand_amt
var player_follow
var player
# Called when the node enters the scene tree for the first time.
func _ready():
add_to_group("pickup")
add_to_group("spawned")
add_to_group("persist")
#find player
player = level_control.player
rand_amt = randi_range(25,100)
if despawning == true:
timer.wait_time = despawn_time_s
timer.start()
func _physics_process(delta):
if player_follow != null:
if !pick_up:
despawning = false
angular_velocity = lerp(angular_velocity, Vector3(0,0,0), delta)
position = lerp(position, player.item_holder.global_position, 25 * delta)
if abs(position - player.item_holder.global_position) < Vector3(.5,.5,.5):
await get_tree().create_timer(1).timeout
position = lerp(position, player.camera.global_position, .01 * delta)
await get_tree().create_timer(.01).timeout
picked_up()
func picked_up():
player.pickup_sound.pitch_scale = 1 + randf_range(-.3,.3)
player.pickup_sound.play()
Input.start_joy_vibration(0,.1,.1,.1)
match pickupType:
# Ammo
0:
var ammo_add_amount : int = (rand_amt * .01) * player.gun.max_ammo
level_control.ammo_reserve[level_control.current_gun_index] += ammo_add_amount
print("ammo + " +str(ammo_add_amount))
# Stamina
1:
var stamina_add_amount = (rand_amt * .01) * player.MAX_STAMINA
player.remaining_stamina += stamina_add_amount
print("stamina + " +str(stamina_add_amount))
# Health
2:
level_control.health += 1
# Money
3:
level_control.money += rand_amt
queue_free()
func _on_timer_timeout() -> void:
if despawning == true:
collision_shape.disabled = true
await get_tree().create_timer(1).timeout
self.queue_free()
func save():
var save_dict = {
"filename" : get_scene_file_path(),
"parent" : get_parent().get_path(),
"pos_x" : position.x,
"pos_y" : position.y,
"pos_z" : position.z,
"rot_x" : rotation.x,
"rot_y" : rotation.y,
"rot_z" : rotation.z
}
return save_dict

View File

@@ -553,10 +553,11 @@ func aim_down_sights(delta):
camera.fov = lerp(camera.fov,BASE_FOV - float(gun.fov_zoom_amt),(delta * 5)/Engine.time_scale)
gun.position = lerp(gun.position,ADS_POS,delta * 10 / Engine.time_scale)
else:
gun.position = lerp(gun.position, weapon_start_pos,delta * 2)
camera.fov = lerp(camera.fov,BASE_FOV - float(gun.fov_zoom_amt),(delta * 4)/Engine.time_scale)
weapon_holder.rotation = lerp(weapon_holder.rotation,Vector3(0,0,0),(delta * 10)/Engine.time_scale)
gun.position = lerp(gun.position, weapon_start_pos,(delta * 4)/Engine.time_scale)
camera.fov = lerp(camera.fov,BASE_FOV - float(gun.fov_zoom_amt),(delta * 5)/Engine.time_scale)
else:
gun.position = lerp(gun.position, weapon_start_pos,delta * 10)
gun.position = lerp(gun.position, weapon_start_pos,(delta * 100)/Engine.time_scale)
func grab_moveable(body):
holster_gun(true)

View File

@@ -64,6 +64,7 @@ var cycle_count
@onready var level_control = get_tree().current_scene
@onready var ammo_current
var chamber_rot_amt = 0
var casing_array = []
var casing_spawn_array = []
var bullet_array = []
@@ -97,7 +98,9 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
var rot_amount = chamber_rot_amt * delta * 10
chamber.rotate_object_local(Vector3(0,-1,0),deg_to_rad(rot_amount))
chamber_rot_amt -= rot_amount
func reload_finished():
@@ -147,7 +150,7 @@ func fire(delta):
if player.gun_folded == false:
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
else:
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
instance_bullet.bullet_speed = bullet_speed
instance_bullet.bullet_drop = bullet_drop
instance_bullet.bullet_damage = bullet_damage
@@ -159,7 +162,7 @@ func fire(delta):
get_tree().get_root().add_child(instance_bullet)
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,recoil_speed_change)
player.recoil.add_gun_recoil(recoil_amount.x)
chamber.rotate_object_local(Vector3(0,-1,0),deg_to_rad(60))
chamber_rot_amt += 60
Input.start_joy_vibration(0,.5,.9,.2)
func reload():