no step improvements
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
"Data": {
|
"Data": {
|
||||||
"UpdateFPS": 60.0,
|
"UpdateFPS": 60.0,
|
||||||
"PhysicsFPS": 60.0,
|
"PhysicsFPS": 60.0,
|
||||||
"DrawFPS": 0.0,
|
"DrawFPS": 60.0,
|
||||||
"TimeScale": 1.0,
|
"TimeScale": 1.0,
|
||||||
"MaxUpdateDeltaTime": 0.1
|
"MaxUpdateDeltaTime": 0.1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ namespace Game
|
|||||||
private InputEvent onExit = new InputEvent("Exit");
|
private InputEvent onExit = new InputEvent("Exit");
|
||||||
|
|
||||||
private const float collisionMargin = 0.031f * 1.666f;
|
private const float collisionMargin = 0.031f * 1.666f;
|
||||||
|
private const float slopeNormal = 0.7f;
|
||||||
|
|
||||||
Actor rootActor;
|
Actor rootActor;
|
||||||
private RigidBody rigidBody;
|
private RigidBody rigidBody;
|
||||||
@@ -237,31 +238,39 @@ namespace Game
|
|||||||
|
|
||||||
SlideMoveHit slideMoveHit = SlideMove(ref position, ref velocity);
|
SlideMoveHit slideMoveHit = SlideMove(ref position, ref velocity);
|
||||||
if (slideMoveHit == SlideMoveHit.Nothing)
|
if (slideMoveHit == SlideMoveHit.Nothing)
|
||||||
|
{
|
||||||
|
// TODO: step down here
|
||||||
return slideMoveHit;
|
return slideMoveHit;
|
||||||
|
}
|
||||||
|
|
||||||
// hit something, try to step up
|
// hit something, try to step up
|
||||||
if (onGround)
|
if (onGround)
|
||||||
{
|
{
|
||||||
|
Vector3 stepDelta = -Physics.Gravity.Normalized * stepSize;
|
||||||
|
|
||||||
Vector3 slidePosition = position;
|
Vector3 slidePosition = position;
|
||||||
Vector3 slideVelocity = velocity;
|
Vector3 slideVelocity = velocity;
|
||||||
position = originalPosition;
|
position = originalPosition;
|
||||||
velocity = originalVelocity;
|
velocity = originalVelocity;
|
||||||
|
|
||||||
Vector3 stepUp = position + (-Physics.Gravity.Normalized * stepSize);
|
// step up
|
||||||
|
Vector3 stepUp = position + stepDelta;
|
||||||
TraceInfo traceUp = TracePlayer(position, stepUp);
|
TraceInfo traceUp = TracePlayer(position, stepUp);
|
||||||
if (traceUp.fraction > 0f)
|
if (traceUp.fraction > 0f)
|
||||||
position = traceUp.endPosition;
|
position = traceUp.endPosition;
|
||||||
|
|
||||||
|
// try moving from step up position
|
||||||
SlideMoveHit slideMoveStepHit = SlideMove(ref position, ref velocity);
|
SlideMoveHit slideMoveStepHit = SlideMove(ref position, ref velocity);
|
||||||
|
|
||||||
Vector3 stepDown = position + (Physics.Gravity.Normalized * stepSize);
|
// step down
|
||||||
|
Vector3 stepDown = position - stepDelta;
|
||||||
TraceInfo traceDown = TracePlayer(position, stepDown);
|
TraceInfo traceDown = TracePlayer(position, stepDown);
|
||||||
if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < 0.7)
|
if (traceDown.fraction < 1f && -Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal) < slopeNormal)
|
||||||
{
|
{
|
||||||
// can't step down, slide move like normally
|
// can't step down, slide move like normally
|
||||||
Console.Print("no stepping 1, frac: " + traceDown.fraction.ToString() + ", dot: " +
|
Console.Print("no stepping 1, frac: " + traceDown.fraction + ", dot: " +
|
||||||
(-Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal)).ToString() +
|
(-Vector3.Dot(Physics.Gravity.Normalized, traceDown.hitNormal)) +
|
||||||
", norm: " + traceDown.hitNormal.ToString());
|
", norm: " + traceDown.hitNormal);
|
||||||
position = slidePosition;
|
position = slidePosition;
|
||||||
velocity = slideVelocity;
|
velocity = slideVelocity;
|
||||||
return slideMoveHit;
|
return slideMoveHit;
|
||||||
@@ -269,29 +278,31 @@ namespace Game
|
|||||||
else if (traceDown.fraction > 0f)
|
else if (traceDown.fraction > 0f)
|
||||||
position = traceDown.endPosition;
|
position = traceDown.endPosition;
|
||||||
|
|
||||||
|
// add some margin from the ground in order to avoid getting stuck
|
||||||
if (traceDown.fraction < 1f)
|
if (traceDown.fraction < 1f)
|
||||||
position.Y += collisionMargin;
|
position.Y += collisionMargin;
|
||||||
|
|
||||||
|
// ??
|
||||||
var d1 = -Vector3.Dot(Physics.Gravity.Normalized, position);
|
var d1 = -Vector3.Dot(Physics.Gravity.Normalized, position);
|
||||||
var d2 = -Vector3.Dot(Physics.Gravity.Normalized, originalPosition);
|
var d2 = -Vector3.Dot(Physics.Gravity.Normalized, originalPosition);
|
||||||
if (d1 < d2)
|
if (d1 < d2)
|
||||||
{
|
{
|
||||||
// ?
|
Console.Print("no stepping 2, " + d1 + " < " + d2);
|
||||||
Console.Print("no stepping 2, " + d1.ToString() + " < " + d2.ToString());
|
|
||||||
position = slidePosition;
|
position = slidePosition;
|
||||||
velocity = slideVelocity;
|
velocity = slideVelocity;
|
||||||
return slideMoveHit;
|
return slideMoveHit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 stepPosition = position;
|
Vector3 slidePosition2 = slidePosition; //down
|
||||||
Vector3 slidePosition2 = slidePosition;
|
Vector3 stepPosition2 = position; //up
|
||||||
Vector3 stepPosition2 = stepPosition;
|
|
||||||
|
|
||||||
|
// FIXME, negate gravity
|
||||||
slidePosition2.Y = 0f;
|
slidePosition2.Y = 0f;
|
||||||
stepPosition2.Y = 0f;
|
stepPosition2.Y = 0f;
|
||||||
|
|
||||||
// choose which one went furthest away from the original position
|
// take the slide movement results if furthest away from original position
|
||||||
if ((stepPosition2 - originalPosition).Length < (slidePosition2 - originalPosition).Length)
|
//if ((stepPosition2 - originalPosition).Length < (slidePosition2 - originalPosition).Length)
|
||||||
|
if ((slidePosition2 - originalPosition).Length >= (stepPosition2 - originalPosition).Length)
|
||||||
{
|
{
|
||||||
Console.Print("no stepping 3");
|
Console.Print("no stepping 3");
|
||||||
position = slidePosition;
|
position = slidePosition;
|
||||||
@@ -355,7 +366,7 @@ namespace Game
|
|||||||
|
|
||||||
timeleft *= 1.0f - fraction;
|
timeleft *= 1.0f - fraction;
|
||||||
|
|
||||||
if (trace.hitNormal.Y > 0.7)
|
if (trace.hitNormal.Y > slopeNormal)
|
||||||
slideMoveHit |= SlideMoveHit.Floor;
|
slideMoveHit |= SlideMoveHit.Floor;
|
||||||
else if (Math.Abs(trace.hitNormal.Y) < 0.0001f)
|
else if (Math.Abs(trace.hitNormal.Y) < 0.0001f)
|
||||||
slideMoveHit |= SlideMoveHit.Step;
|
slideMoveHit |= SlideMoveHit.Step;
|
||||||
@@ -528,7 +539,7 @@ namespace Game
|
|||||||
TraceInfo traceGround = TracePlayer(position, position + groundDelta);
|
TraceInfo traceGround = TracePlayer(position, position + groundDelta);
|
||||||
|
|
||||||
if (!traceGround.startSolid && traceGround.fraction < 1f &&
|
if (!traceGround.startSolid && traceGround.fraction < 1f &&
|
||||||
-Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < 0.7f)
|
-Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < slopeNormal)
|
||||||
{
|
{
|
||||||
// slope
|
// slope
|
||||||
// clip velocity
|
// clip velocity
|
||||||
@@ -546,7 +557,7 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!traceGround.startSolid && (traceGround.fraction >= 1f ||
|
if (!traceGround.startSolid && (traceGround.fraction >= 1f ||
|
||||||
-Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < 0.7f))
|
-Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < slopeNormal))
|
||||||
{
|
{
|
||||||
// falling or sliding down a slope
|
// falling or sliding down a slope
|
||||||
onGround = false;
|
onGround = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user