some shader work and improved mantle feel

This commit is contained in:
2026-01-11 17:09:58 +01:00
parent f2a39316ba
commit 1eb65d1520
13 changed files with 65 additions and 25 deletions

1
.gitignore vendored
View File

@@ -10,6 +10,7 @@
.import/ .import/
/builds /builds
/communication
# Imported translations (automatically generated from CSV files) # Imported translations (automatically generated from CSV files)
*.translation *.translation

View File

@@ -2588,6 +2588,7 @@ shape = SubResource("ConcavePolygonShape3D_wkikw")
[node name="Cube_174" parent="." index="174"] [node name="Cube_174" parent="." index="174"]
material_override = ExtResource("5_2eqlu") material_override = ExtResource("5_2eqlu")
cast_shadow = 2
[node name="Cube_174_col" type="StaticBody3D" parent="Cube_174" index="0"] [node name="Cube_174_col" type="StaticBody3D" parent="Cube_174" index="0"]
collision_layer = 3 collision_layer = 3
@@ -2608,6 +2609,7 @@ shape = SubResource("ConcavePolygonShape3D_4au7w")
[node name="Cube_176" parent="." index="176"] [node name="Cube_176" parent="." index="176"]
material_override = ExtResource("4_7r3kr") material_override = ExtResource("4_7r3kr")
cast_shadow = 2
[node name="Cube_176_col" type="StaticBody3D" parent="Cube_176" index="0"] [node name="Cube_176_col" type="StaticBody3D" parent="Cube_176" index="0"]
collision_layer = 3 collision_layer = 3

View File

@@ -27,7 +27,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_rir86")
shader_parameter/floorNormalMap = ExtResource("3_f1b6h") shader_parameter/floorNormalMap = ExtResource("3_f1b6h")
shader_parameter/floorHeightMap = ExtResource("2_0e3id") shader_parameter/floorHeightMap = ExtResource("2_0e3id")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 0.08 shader_parameter/heightScale = 0.08

View File

@@ -1,10 +0,0 @@
[gd_resource type="VisualShader" format=3 uid="uid://ce18qeqecjf4w"]
[resource]
code = "shader_type spatial;
render_mode blend_mix, depth_draw_opaque, depth_test_default, cull_back, diffuse_lambert, specular_schlick_ggx;
"
nodes/fragment/0/position = Vector2(280, 0)

View File

@@ -185,7 +185,7 @@ void fragment() {
} }
void light() { void light() {
float lambert = dot(NORMAL, LIGHT); float lambert = clamp(dot(NORMAL, LIGHT), 0.0, 1.0);
float halfLambert = pow(lambert*0.5 + 0.5, 2); float halfLambert = pow(lambert*0.5 + 0.5, 5);
DIFFUSE_LIGHT = halfLambert * ATTENUATION * LIGHT_COLOR / PI; DIFFUSE_LIGHT += halfLambert * ATTENUATION * LIGHT_COLOR / PI;
} }

View File

@@ -31,7 +31,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_4vhk1")
shader_parameter/floorNormalMap = ExtResource("3_ytvoj") shader_parameter/floorNormalMap = ExtResource("3_ytvoj")
shader_parameter/floorHeightMap = ExtResource("2_4vhk1") shader_parameter/floorHeightMap = ExtResource("2_4vhk1")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 0.2 shader_parameter/heightScale = 0.2

View File

@@ -27,7 +27,7 @@ shader_parameter/floorRoughnessMap = ExtResource("4_ob11h")
shader_parameter/floorNormalMap = ExtResource("3_ff2cr") shader_parameter/floorNormalMap = ExtResource("3_ff2cr")
shader_parameter/floorHeightMap = ExtResource("2_roy1o") shader_parameter/floorHeightMap = ExtResource("2_roy1o")
shader_parameter/floorUvScale = 0.5 shader_parameter/floorUvScale = 0.5
shader_parameter/enablePom = true shader_parameter/enablePom = false
shader_parameter/heightMinLayers = 8 shader_parameter/heightMinLayers = 8
shader_parameter/heightMaxLayers = 64 shader_parameter/heightMaxLayers = 64
shader_parameter/heightScale = 1.0 shader_parameter/heightScale = 1.0

View File

@@ -567,6 +567,12 @@ use_collision = true
size = Vector3(3, 1, 0.25) size = Vector3(3, 1, 0.25)
material = ExtResource("3_vvhq3") material = ExtResource("3_vvhq3")
[node name="CSGBox3D57" type="CSGBox3D" parent="Greybox/Mantles"]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -13, 3.5, -21.629175)
use_collision = true
size = Vector3(5, 1, 0.25)
material = ExtResource("3_vvhq3")
[node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Mantles"] [node name="CSGBox3D54" type="CSGBox3D" parent="Greybox/Mantles"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, 20.125) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.5, 1, 20.125)
use_collision = true use_collision = true

View File

@@ -102,6 +102,7 @@ player = NodePath("../Player")
pause = ExtResource("10_0ari0") pause = ExtResource("10_0ari0")
[node name="TutorialController" type="Control" parent="."] [node name="TutorialController" type="Control" parent="."]
visible = false
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -374,9 +375,10 @@ shadow_opacity = 0.95
shadow_blur = 2.435 shadow_blur = 2.435
[node name="Player" parent="." node_paths=PackedStringArray("TutorialWeaponTarget") instance=ExtResource("1_2vsi6")] [node name="Player" parent="." node_paths=PackedStringArray("TutorialWeaponTarget") instance=ExtResource("1_2vsi6")]
transform = Transform3D(0.054514527, 0, -0.9985129, 0, 1, 0, 0.9985129, 0, 0.054514527, 0, -132.75, 118) transform = Transform3D(0.054514527, 0, -0.9985129, 0, 1, 0, 0.9985129, 0, 0.054514527, -6, 75.5, -13.5)
collision_layer = 17 collision_layer = 17
TutorialWeaponTarget = NodePath("../PlacedTutorialWeapon/WeaponLocationTarget") TutorialWeaponTarget = NodePath("../PlacedTutorialWeapon/WeaponLocationTarget")
TutorialDone = true
AccelerationAir = 1.5 AccelerationAir = 1.5
[node name="DebugLayer" type="CanvasLayer" parent="."] [node name="DebugLayer" type="CanvasLayer" parent="."]

View File

@@ -66,7 +66,6 @@ WalkSpeed = 7.5
AccelerationAir = 0.8 AccelerationAir = 0.8
DecelerationAir = 0.02 DecelerationAir = 0.02
Weight = 4.0 Weight = 4.0
MantleTime = 0.3
MantlePath = ExtResource("2_6lejt") MantlePath = ExtResource("2_6lejt")
CoyoteTime = 0.3 CoyoteTime = 0.3
InputBufferFrames = 5 InputBufferFrames = 5
@@ -257,10 +256,10 @@ offset_left = 1524.0
offset_top = 1.0 offset_top = 1.0
offset_right = -8.0 offset_right = -8.0
offset_bottom = 1.0 offset_bottom = 1.0
enabled = false
initial_node_to_watch = NodePath("../StateChart") initial_node_to_watch = NodePath("../StateChart")
[node name="UI" type="Control" parent="."] [node name="UI" type="Control" parent="."]
visible = false
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -506,6 +505,12 @@ to = NodePath("../../Grounded")
event = &"grounded" event = &"grounded"
delay_in_seconds = "0.0" delay_in_seconds = "0.0"
[node name="OnMantleOtherSide" type="Node" parent="StateChart/Root/Movement/Mantling"]
script = ExtResource("28_n7qhm")
to = NodePath("../../OnWall/Hugging")
event = &"on_wall"
delay_in_seconds = "0.0"
[node name="Jump" type="Node" parent="StateChart/Root/Movement"] [node name="Jump" type="Node" parent="StateChart/Root/Movement"]
script = ExtResource("26_infe6") script = ExtResource("26_infe6")
initial_state = NodePath("SimpleJump") initial_state = NodePath("SimpleJump")

View File

@@ -801,6 +801,11 @@ public partial class PlayerController : CharacterBody3D
private Transform3D _customMantleStartTransform; private Transform3D _customMantleStartTransform;
private Curve3D _customMantleCurve; private Curve3D _customMantleCurve;
private Vector3 _mantleStartPosition; private Vector3 _mantleStartPosition;
private Vector3 _velocityOnMantleStarted = Vector3.Zero;
private bool _mantleEndedOnOtherSideOfWall = false;
private bool _mantleFoundGround = false;
public void OnMantleStarted() public void OnMantleStarted()
{ {
HeadSystem.OnMantle(); HeadSystem.OnMantle();
@@ -812,16 +817,21 @@ public partial class PlayerController : CharacterBody3D
return; return;
} }
_velocityOnMantleStarted = Velocity;
var transform = _customMantle ? _customMantleStartTransform : MantleSystem.GlobalTransform; var transform = _customMantle ? _customMantleStartTransform : MantleSystem.GlobalTransform;
var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve; var curve = _customMantle ? _customMantleCurve : MantleSystem.MantleCurve;
_mantleEndedOnOtherSideOfWall = _customMantle ? _mantleEndedOnOtherSideOfWall : MantleSystem.EndedOnOtherSideOfWall;
_mantleFoundGround = _customMantle ? _mantleFoundGround : MantleSystem.FoundGround;
GetTree().GetRoot().AddChild(_mantlePath); GetTree().GetRoot().AddChild(_mantlePath);
_mantlePath.Setup(transform, curve); _mantlePath.Setup(transform, curve);
_mantleStartPosition = GlobalPosition; _mantleStartPosition = GlobalPosition;
var curveLength = curve.GetBakedLength();
var tween = GetTree().CreateTween(); var tween = GetTree().CreateTween();
tween.SetTrans(Tween.TransitionType.Linear); tween.SetTrans(Tween.TransitionType.Linear);
tween.SetEase(Tween.EaseType.InOut); tween.SetEase(Tween.EaseType.In);
tween.TweenProperty(_mantlePath.PathFollow, "progress_ratio", 1, MantleTime); tween.TweenProperty(_mantlePath.PathFollow, "progress_ratio", 1, MantleTime*curveLength);
tween.Finished += MantleFinished; tween.Finished += MantleFinished;
} }
@@ -843,13 +853,17 @@ public partial class PlayerController : CharacterBody3D
public void MantleFinished() public void MantleFinished()
{ {
_mantlePath.Teardown(); _mantlePath.Teardown();
// SetVelocity(_finalCurveDirection.Normalized() * _speedOverCurve);
var isThereMovementInput = GetMoveInput().Length() > 0; var isThereMovementInput = GetMoveInput().Length() > 0;
if (isThereMovementInput) if (isThereMovementInput)
{ {
// If there's a movement input on Mantle, we dash in the direction the mantle took place // If there's a movement input on Mantle, we dash in the direction the mantle ended with
var positionDifference = GlobalPosition - _mantleStartPosition; var positionDifference = GlobalPosition - _mantleStartPosition;
var directionHorizontal = new Vector3(positionDifference.X, 0, positionDifference.Z); var directionHorizontal = new Vector3(positionDifference.X, 0, positionDifference.Z);
SimpleDashInDirection(directionHorizontal.Normalized()); // SimpleDashInDirection(directionHorizontal.Normalized());
SetVelocity(directionHorizontal.Normalized() * WalkSpeed);
} }
_customMantle = false; _customMantle = false;
@@ -1124,6 +1138,8 @@ public partial class PlayerController : CharacterBody3D
_customMantle = DashSystem.ShouldMantle; _customMantle = DashSystem.ShouldMantle;
_customMantleCurve = DashSystem.MantleSystem.MantleCurve; _customMantleCurve = DashSystem.MantleSystem.MantleCurve;
_customMantleStartTransform = DashSystem.MantleSystem.GlobalTransform; _customMantleStartTransform = DashSystem.MantleSystem.GlobalTransform;
_mantleEndedOnOtherSideOfWall = DashSystem.MantleSystem.EndedOnOtherSideOfWall;
_mantleFoundGround = DashSystem.MantleSystem.FoundGround;
} }
Tween CreatePositionTween(Vector3 targetLocation, float tweenTime) Tween CreatePositionTween(Vector3 targetLocation, float tweenTime)

View File

@@ -161,5 +161,6 @@ common/physics_interpolation=true
[rendering] [rendering]
textures/vram_compression/import_etc2_astc=true textures/vram_compression/import_etc2_astc=true
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
environment/volumetric_fog/volume_size=256 environment/volumetric_fog/volume_size=256
environment/volumetric_fog/volume_depth=256 environment/volumetric_fog/volume_depth=256

View File

@@ -21,6 +21,8 @@ public partial class MantleSystem: Node3D
public Vector3 FirstMantleProfilePoint { get; private set; } = Vector3.Zero; public Vector3 FirstMantleProfilePoint { get; private set; } = Vector3.Zero;
public bool IsMantlePossible { get; private set; } = false; public bool IsMantlePossible { get; private set; } = false;
public bool EndedOnOtherSideOfWall { get; private set; } = false;
public bool FoundGround { get; private set; } = false;
public const int WallProfileCastCount = 7; public const int WallProfileCastCount = 7;
private ShapeCast3D[] _wallProfileShapecasts = new ShapeCast3D[WallProfileCastCount]; private ShapeCast3D[] _wallProfileShapecasts = new ShapeCast3D[WallProfileCastCount];
@@ -55,6 +57,8 @@ public partial class MantleSystem: Node3D
// Reset state // Reset state
IsMantlePossible = false; IsMantlePossible = false;
EndedOnOtherSideOfWall = false;
FoundGround = false;
if (!isColliding) return; if (!isColliding) return;
// Check if face something wall-like that should be climbable // Check if face something wall-like that should be climbable
@@ -62,6 +66,7 @@ public partial class MantleSystem: Node3D
if (collisionNormal.Y > 0.7f) return; if (collisionNormal.Y > 0.7f) return;
var spaceState = GetWorld3D().DirectSpaceState; var spaceState = GetWorld3D().DirectSpaceState;
MantleCurve = new Curve3D(); MantleCurve = new Curve3D();
MantleCurve.AddPoint(Vector3.Zero); MantleCurve.AddPoint(Vector3.Zero);
var hasFirstProfileHit = false; var hasFirstProfileHit = false;
@@ -76,7 +81,19 @@ public partial class MantleSystem: Node3D
// Got to the other side of the wall, we stop there // Got to the other side of the wall, we stop there
if (!wallProfileShapecast.IsColliding()) if (!wallProfileShapecast.IsColliding())
{ {
// MantleCurve.AddPoint(ToLocal(globalTargetPosition)); /*EndedOnOtherSideOfWall = true;
var origin = globalTargetPosition;
var end = origin + Vector3.Down*0.51f; // We check for the ground a bit below our target
var groundQuery = PhysicsRayQueryParameters3D.Create(origin, end, wallProfileShapecast.CollisionMask);
var groundResult = spaceState.IntersectRay(groundQuery);
if (groundResult.Count > 0)
{
// We found the ground, this is our final location
FoundGround = true;
Vector3 position = (Vector3) groundResult["position"];
MantleCurve.AddPoint(ToLocal(position));
}*/
break; break;
} }