This commit is contained in:
GoaLitiuM
2021-05-02 16:15:56 +03:00
parent 6a8d8a969b
commit 515b9f3bde
14 changed files with 78 additions and 359 deletions

1
.gitignore vendored
View File

@@ -14,7 +14,6 @@ Output/*
*/SceneData/*/Lightmaps/*
*/SceneData/*/SkyLights/*
.vscode/
Assets/
Source/obj/
.idea/*
*.DotSettings.user

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,16 +1,16 @@
{
"ID": "0733cc9b40d3d05366be64bbd9b59e21",
"TypeName": "FlaxEngine.SceneAsset",
"EngineBuild": 6217,
"EngineBuild": 6218,
"Data": [
{
"ID": "0733cc9b40d3d05366be64bbd9b59e21",
"TypeName": "FlaxEngine.Scene",
"Lightmaps": [
{
"Lightmap0": "8a601f534f84963a6fbe9ca240c22a84",
"Lightmap1": "061b8e6a40935db6ae11218ee242b093",
"Lightmap2": "5ee4f2594730fff9b6bea69ec16079a9"
"Lightmap0": "00000000000000000000000000000000",
"Lightmap1": "00000000000000000000000000000000",
"Lightmap2": "00000000000000000000000000000000"
}
],
"LightmapSettings": {
@@ -32,10 +32,11 @@
"Transform": {
"Translation": {
"X": -158.97650146484376,
"Y": -12.66842269897461,
"Y": 20.840194702148439,
"Z": 62.08625793457031
}
},
"Mass": 4170.18798828125,
"LinearDamping": 0.0,
"AngularDamping": 0.0,
"Constraints": 56,
@@ -73,6 +74,7 @@
"ID": "fbaa6db24f0a2a9db36bc6a043fc2572",
"TypeName": "FlaxEngine.CapsuleCollider",
"ParentID": "4ef1f38b4569142b55b0ff935525d47a",
"IsActive": false,
"Name": "CapsuleCollider",
"Transform": {
"Orientation": {
@@ -102,6 +104,20 @@
"Z": 32.0
}
},
{
"ID": "f472490345bbfe282aefa2aa027e0138",
"TypeName": "FlaxEngine.MeshCollider",
"ParentID": "4ef1f38b4569142b55b0ff935525d47a",
"Name": "CylinderCollider",
"Transform": {
"Scale": {
"X": 0.3199999928474426,
"Y": 0.8399999737739563,
"Z": 0.3199999928474426
}
},
"CollisionData": "3b2b347d4a3f9510989261acd91b2091"
},
{
"ID": "b5d566374477944e69bdc2b86249883b",
"TypeName": "FlaxEngine.UICanvas",
@@ -147,13 +163,13 @@
"Transform": {
"Translation": {
"X": 0.0,
"Y": 889.0,
"Y": 354.0,
"Z": 0.0
}
},
"Control": "FlaxEngine.GUI.Label",
"Data": {
"Text": "FPS: 4\nrFPS: 120\nCon: NaNms\nDirectX11\nGC memory: 8.171392MB",
"Text": "FPS: 15\nrFPS: 10\nCon: NaNms\nDirectX11\nGC memory: 18.12052MB",
"TextColor": {
"R": 1.0,
"G": 1.0,
@@ -199,7 +215,7 @@
},
"Offsets": {
"Left": 0.0,
"Right": 143.0,
"Right": 158.400009,
"Top": -80.0,
"Bottom": 80.0
},
@@ -782,7 +798,6 @@
"IsActive": false,
"Name": "SkyLight",
"Brightness": 0.3999999761581421,
"BakedProbe": "201afa52451b91c9c05937a87db55343",
"Mode": 0
},
{

Binary file not shown.

Binary file not shown.

View File

@@ -66,78 +66,49 @@ namespace Game
private TraceInfo TracePlayer(Vector3 start, Vector3 end)
{
bool collided = false;
TraceInfo traceInfo = new TraceInfo();
var capsuleCollider = Actor.GetChild<CapsuleCollider>();
var boxCollider = Actor.GetChild<BoxCollider>();
PhysicsColliderActor colliderActor = null;
Vector3 delta = end - start;
float maxDistance = delta.Length;
Vector3 direction = delta.Normalized;
bool collided = false;
var capsuleCollider = Actor.GetChild<CapsuleCollider>();
var boxCollider = Actor.GetChild<BoxCollider>();
var meshCollider = Actor.GetChild<MeshCollider>();
PhysicsColliderActor colliderActor = null;
if (capsuleCollider && capsuleCollider.IsActive)
{
colliderActor = capsuleCollider;
//start.Y -= capsuleCollider.Height / 2;
//start.Y -= capsuleCollider.Radius / 2;
/*collided = Physics.BoxCastAll(start,
new Vector3(capsuleCollider.Radius,
(capsuleCollider.Height + capsuleCollider.Radius) / 2,
capsuleCollider.Radius),
delta.Normalized, out hitInfos, Quaternion.Identity, delta.Length, uint.MaxValue,
false);*/
/*traceInfo.startSolid = Physics.OverlapCapsule(start, capsuleCollider.Radius, capsuleCollider.Height,
out Collider[] results, capsuleCollider.Orientation, uint.MaxValue, false);
if (traceInfo.startSolid)
{
foreach (Collider collider in results)
{
if (collider == colliderActor)
continue;
colliderActor = colliderActor;
}
}
else*/
{
collided = Physics.CapsuleCastAll(start,
capsuleCollider.Radius, capsuleCollider.Height,
direction, out traceInfo.hitInfos, capsuleCollider.Orientation, maxDistance,
uint.MaxValue,
false);
}
collided = Physics.CapsuleCastAll(start,
capsuleCollider.Radius, capsuleCollider.Height,
direction, out traceInfo.hitInfos, capsuleCollider.Orientation, maxDistance,
uint.MaxValue,
false);
}
else if (meshCollider && meshCollider.IsActive)
{
colliderActor = meshCollider;
collided = Physics.ConvexCastAll(start,
meshCollider.CollisionData,
direction, out traceInfo.hitInfos, capsuleCollider.Orientation, maxDistance,
uint.MaxValue,
false);
}
else if (boxCollider && boxCollider.IsActive)
{
colliderActor = boxCollider;
//start.Y += boxCollider.Size.Y / 2;
/*traceInfo.startSolid = Physics.CheckBox(start, boxCollider.OrientedBox.Extents, boxCollider.Orientation,
uint.MaxValue, false);
if (!traceInfo.startSolid)*/
{
collided = Physics.BoxCastAll(start,
boxCollider.OrientedBox.Extents,
direction, out traceInfo.hitInfos, boxCollider.Orientation, maxDistance, uint.MaxValue,
false);
}
collided = Physics.BoxCastAll(start,
boxCollider.OrientedBox.Extents,
direction, out traceInfo.hitInfos, boxCollider.Orientation, maxDistance, uint.MaxValue,
false);
}
if (collided)
{
List<RayCastHit> hitInfosFiltered = new List<RayCastHit>();
RayCastHit closest = new RayCastHit();
RayCastHit furthest = new RayCastHit();
closest.Distance = float.MaxValue;
furthest.Distance = float.MinValue;
foreach (var hitInfo in traceInfo.hitInfos)
{
if (hitInfo.Collider == colliderActor)
@@ -147,53 +118,16 @@ namespace Game
if (hitInfo.Distance < closest.Distance)
closest = hitInfo;
if (hitInfo.Distance > furthest.Distance)
furthest = hitInfo;
}
traceInfo.hitInfos = hitInfosFiltered.ToArray();
//if (!closest.Normal.IsZero)
if (closest.Distance > 0f)
{
//traceInfo.fraction = (closest.Point - start).Length / maxDistance;
//traceInfo.maxFraction = (furthest.Point - start).Length / maxDistance;
/*if (traceLength != 0f)
{
traceInfo.fraction = closest.Distance / traceLength;
traceInfo.maxFraction = furthest.Distance / traceLength;
}
else
{
traceInfo.fraction = 0f;
traceInfo.maxFraction = 0f;
}*/
// convoluted shit incoming...
// trace a ray back from the hitpoints to calculate the actual fraction travelled...
Physics.RayCastAll(closest.Point, -direction, out RayCastHit[] rayHitInfos, maxDistance * 2f,
uint.MaxValue, true);
float altFraction = 0f;
float oldFraction = closest.Distance / maxDistance;
foreach (var hitInfo in rayHitInfos)
{
if (hitInfo.Collider != colliderActor)
continue;
traceInfo.fraction = hitInfo.Distance / maxDistance;
altFraction = (closest.Point - hitInfo.Point).Length / maxDistance;
break;
}
traceInfo.fraction = closest.Distance / maxDistance;
traceInfo.hitNormal = closest.Normal;
traceInfo.hitPosition = closest.Point;
traceInfo.endPosition = start + (direction * traceInfo.fraction);
//traceInfo.maxHitNormal = furthest.Normal;
//traceInfo.hitPosition = furthest.Point;
//traceInfo.maxEndPosition = start + ((end - start).Normalized * traceInfo.maxFraction);
traceInfo.endPosition = start + (delta * traceInfo.fraction);
if (traceInfo.fraction == 0f && maxDistance > 0f)
traceInfo.startSolid = true;
@@ -203,36 +137,11 @@ namespace Game
traceInfo.startSolid = true;
traceInfo.fraction = 0f;
}
/*traceInfo.hitInfos = hitInfosFiltered.ToArray();
float travel = (end - start).Length;
if (travel != 0f)
{
traceInfo.fraction = closest.Distance / travel;
traceInfo.maxFraction = furthest.Distance / travel;
}
else
{
traceInfo.fraction = 0f;
traceInfo.maxFraction = 0f;
}
traceInfo.hitNormal = closest.Normal;
traceInfo.hitPosition = closest.Point;
traceInfo.endPosition = start + ((end - start).Normalized * traceInfo.fraction);
traceInfo.maxHitNormal = furthest.Normal;
//traceInfo.hitPosition = furthest.Point;
traceInfo.maxEndPosition = start + ((end - start).Normalized * traceInfo.maxFraction);
if (traceInfo.fraction == 0f && travel > 0f)
traceInfo.startSolid = true;*/
}
else
{
traceInfo.hitInfos = new RayCastHit[0];
traceInfo.fraction = traceInfo.startSolid ? 0f : 1f;
traceInfo.fraction = 1f;
traceInfo.endPosition = end;
}
@@ -249,6 +158,11 @@ namespace Game
if (capsuleCollider && capsuleCollider.IsActive)
{
Quaternion rotation = capsuleCollider.LocalOrientation * Quaternion.Euler(0f, 90f, 0f);
if (cylinderShape)
{
DebugDraw.DrawWireBox(capsuleCollider.Box, Color.GreenYellow * 0.8f);
}
DebugDraw.DrawWireTube(rigidBody.Position, rotation, capsuleCollider.Radius, capsuleCollider.Height, Color.GreenYellow * 0.8f);
}
else if (boxCollider && boxCollider.IsActive)
@@ -269,49 +183,36 @@ namespace Game
List<Vector3> hitNormals = new List<Vector3>();
// margin in fte: 0.0312 away from the wall
Vector3 traceOffset = Vector3.Zero;
for (int bump = 0; bump < 4; bump++)
{
Vector3 startPos = position;
Vector3 endPos = position + (velocity * timeleft);
float distt = (endPos - startPos).Length;
TraceInfo trace = TracePlayer(startPos + traceOffset, endPos);
TraceInfo trace = TracePlayer(startPos, endPos);
// TODO: handle portals here
float fraction = trace.fraction;
Vector3 hitNormal = trace.hitNormal;
Vector3 hitEndPosition = trace.endPosition;
/*if (bump > 0 && trace.startSolid)
{
fraction = trace.maxFraction;
hitNormal = trace.maxHitNormal;
hitEndPosition = trace.maxEndPosition;
}*/
if (fraction > 0f)
{
position = hitEndPosition;
hitNormals.Clear();
/*if (position.Z > 368f)
{
position = position;
TracePlayer(startPos + traceOffset, endPos);
}*/
}
else if (trace.startSolid)
if (trace.startSolid)
{
velocity = Vector3.Zero;
break;
}
if (fraction > 0f)
{
position = trace.endPosition;
hitNormals.Clear(); // this is present in some forks, not in Q3
}
if (fraction >= 1f)
break;
timeleft -= timeleft * fraction;
timeleft *= 1.0f - fraction;
// this doesn't seem to do anything, we never have any hitNormals stored here
bool hitPreviousNormal = false;
foreach (Vector3 normal in hitNormals)
{
@@ -327,58 +228,9 @@ namespace Game
continue;
hitNormals.Add(hitNormal);
if (hitNormals.Count != 1)
Console.Print("hitNormals: " + hitNormals.Count);
/*
bool stuck = true;
foreach (Vector3 normal in hitNormals)
{
// clip velocity
Vector3 velocityProjected = Vector3.ProjectOnPlane(velocity, normal);
float backoff = Vector3.Dot(velocity, normal) * 1f;
velocity -= normal * backoff;
//velocity = velocityProjected;
bool parallel = true;
foreach (Vector3 otherNormal in hitNormals)
{
if (otherNormal == normal)
continue;
if (Vector3.Dot(velocity, otherNormal) < 0f)
{
parallel = false;
break;
}
}
if (parallel)
{
// moving away from all touched walls
stuck = false;
break;
}
}
if (stuck)
{
if (hitNormals.Count == 2)
{
Vector3 dir = Vector3.Cross(hitNormals[0], hitNormals[1]);
float dist = Vector3.Dot(dir, velocity);
velocity = dist * dir;
}
else
{
velocity = Vector3.Zero;
break;
}
}
else
{
// nudge very slightly away from the wall to avoid getting stuck
//position += trace.hitNormal * 0.01f;
}
*/
int plane;
Vector3 normalMargin = Vector3.Zero;
for (plane = 0; plane < hitNormals.Count; plane++)
@@ -407,6 +259,7 @@ namespace Game
break;
}
// push off slightly away from the walls to not get stuck
position += normalMargin.Normalized * 0.031f;
if (plane == hitNormals.Count)
@@ -414,6 +267,7 @@ namespace Game
if (hitNormals.Count == 2)
{
Vector3 dir = Vector3.Cross(hitNormals[0], hitNormals[1]);
//dir.Normalize();
float dist = Vector3.Dot(dir, velocity);
velocity = dist * dir;
}
@@ -437,156 +291,6 @@ namespace Game
break;
}
}
if (!asdf)
{
/*var finalTrace = TracePlayer(position, position);
if (finalTrace.startSolid)
{
position = originalPosition;
velocity = originalVelocity;
SlideMove(ref position, false, ref velocity, true);
}*/
}
}
private bool SlideMove2(ref Vector3 position, bool stepUp, ref Vector3 velocity)
{
// PM_SlideMove
/*
endpos = pos + velocity
for i=0, i<4, i++
trace(pos, endpos)
if trace.dist >= 1
break;
blocked =
blocked_floor => trace.plane.normal[2] >= MIN_STEP_NORMAL
blocked_step => trace.plane.normal[2] == 0
blocked_other => .
*/
if (velocity.IsZero)
return false;
Vector3 originalVelocity = velocity;
Vector3 startPos = position;
//float distanceLeft = (velocity * Time.DeltaTime).Length;
float timeLeft = Time.DeltaTime;
bool anyCollisions = false;
for (int i = 0; i < 3; i++)
{
Vector3 normal = Vector3.Zero;
//float distance = distanceLeft;
Vector3 direction = velocity.Normalized;
//Vector3 endPos = startPos + (direction * distanceLeft);
Vector3 endPos = startPos + (velocity * timeLeft);
float travel = (endPos - startPos).Length;
//if (endPos == startPos)
// break;
TraceInfo trace = TracePlayer(startPos, endPos);
bool collided = trace.hitInfos.Length > 0;
float fraction = 1.0f;
float distance = 0f;
if (trace.startSolid)
{
velocity = Vector3.Zero;
anyCollisions = true;
break;
}
if (collided)
{
collided = false;
if (trace.hitInfos.Length > 1)
Console.Print("fixme more traces!");
foreach (var hitInfo in trace.hitInfos)
{
//if (hitInfo.Distance < minDistanceFromFloor)
// continue;
//if (hitInfo.Distance > distance)
// Console.Print("hit distance is greater: " + hitInfo.Distance.ToString() + " > " + distance.ToString());
fraction = hitInfo.Distance / travel;
collided = true;
//if (hitInfo.Distance <= distance)
{
normal = hitInfo.Normal;
distance = hitInfo.Distance;
}
break;
//Console.Print("collided " + hitInfo.Distance.ToString());
//break;
}
}
if (collided)
{
// move to contact position, continue from here
startPos += direction * distance; // what if this points to different direction?
//distanceLeft -= distance;
timeLeft *= fraction;
//Console.Print("timeleft: " + timeLeft.ToString() + ", frac:" + fraction.ToString());
//velocity = Vector3.ProjectOnPlane(velocity, normal);
Vector3 velocityProjected = Vector3.ProjectOnPlane(velocity, normal);
float backoff = Vector3.Dot(velocity, normal) * 1f;
velocity -= normal * backoff;
velocity = velocityProjected;
//Console.Print((velocityProjected-velocity).Length.ToString());
// prevents bouncing against the wall
if (velocity.Length > 0f && Vector3.Dot(velocity, originalVelocity) <= 0f)
{
velocity = Vector3.Zero;
//distanceLeft = 0f;
timeLeft = 0f;
}
}
else
{
//distanceLeft = 0f;
timeLeft = 0f;
startPos = endPos;
}
anyCollisions |= collided;
if (timeLeft <= 0f)//if (distanceLeft <= 0f)
break;
}
position = startPos;
return anyCollisions;
}
//Vector3 wishVelocity = Vector3.Zero;
@@ -609,6 +313,8 @@ namespace Game
private bool jumped = false;
private bool cylinderShape = true;
private Vector3 safePosition;
public override void OnFixedUpdate()
@@ -625,9 +331,9 @@ namespace Game
// categorize position
onGround = true;
//TraceInfo traceGround = TracePlayer(rigidBody.Position, rigidBody.Position + Physics.Gravity.Normalized);
TraceInfo traceGround = TracePlayer(rigidBody.Position, rigidBody.Position + Physics.Gravity.Normalized);
/*if (!traceGround.startSolid && traceGround.fraction < 1f &&
if (!traceGround.startSolid && traceGround.fraction < 1f &&
-Vector3.Dot(Physics.Gravity.Normalized, traceGround.hitNormal) < 0.7f)
{
// slope
@@ -642,8 +348,7 @@ namespace Game
(1f - traceGround.fraction) * bounce;
// retrace
traceGround = TracePlayer(rigidBody.Position, rigidBody.Position + point,
false);
traceGround = TracePlayer(rigidBody.Position, rigidBody.Position + point);
}
if (!traceGround.startSolid && (traceGround.fraction >= 1f ||
@@ -657,7 +362,7 @@ namespace Game
onGround = !traceGround.startSolid;
}
if (onGround)
/*if (onGround)
{
// snap to ground
if (!traceGround.startSolid)
@@ -766,7 +471,7 @@ namespace Game
if (!onGround)
{
//currentVelocity += Physics.Gravity * Time.DeltaTime;
currentVelocity += Physics.Gravity * Time.DeltaTime;
//Console.Print("grav");
}
//else