Fix: update check brush.

This commit is contained in:
Tungdv
2025-12-16 17:32:16 +07:00
parent 2087f4f069
commit df792f0560
+63 -96
View File
@@ -101,34 +101,44 @@ namespace BrewMonster
pEnvTrc.fFraction = 100.0f;
pEnvTrc.bStartSolid = false;
pEnvTrc.dwClsFlag = 0;
Vector3 vStart = EC_Utility.ToVector3(pEnvTrc.vStart);
Vector3 vExt = EC_Utility.ToVector3(pEnvTrc.vExt);
Vector3 vDelta = EC_Utility.ToVector3(pEnvTrc.vDelta);
Vector3 vTerStart = EC_Utility.ToVector3(pEnvTrc.vTerStart);
Vector3 dir = Vector3.zero;
if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_BRUSH) == CDR_EVN.CDR_BRUSH)
{
BrushTraceInfo bruInfo = new BrushTraceInfo();
bruInfo.Init(pEnvTrc.vStart, pEnvTrc.vDelta, pEnvTrc.vExt);
if (AABBCollideWithBrush(ref bruInfo))
dir = vStart + vDelta;
if (Physics.BoxCast(vStart, vExt, dir, out RaycastHit hit, Quaternion.identity, vDelta.magnitude, 1 << 7))
{
pEnvTrc.fFraction = bruInfo.fFraction;
pEnvTrc.vHitNormal = bruInfo.ClipPlane.GetNormal();
pEnvTrc.bStartSolid = bruInfo.bStartSolid;
pEnvTrc.fFraction = (hit.distance - vExt.x) / vDelta.magnitude;
pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hit.normal);
pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH;
}
else
{
pEnvTrc.fFraction = 1f;
}
}
if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_TERRAIN) == CDR_EVN.CDR_TERRAIN)
{
float fFraction = 0f;
A3DVECTOR3 vTerNormal = new A3DVECTOR3();
bool bStart = false;
if (CollideWithTerrain(pEnvTrc.vTerStart, pEnvTrc.vDelta, ref fFraction, ref vTerNormal, ref bStart)
&& (fFraction < pEnvTrc.fFraction))
float fFractionTerrain = 0f;
dir = vDelta;
if (Physics.Raycast(vTerStart, dir.normalized, out RaycastHit hit, vDelta.magnitude, 1<<6))
{
//assert(fFraction >= 0.0f);
//pEnvTrc.fFraction = a_Max(0.0f, fFraction - 1E-4f);
pEnvTrc.fFraction = fFraction;
pEnvTrc.vHitNormal = vTerNormal;
pEnvTrc.bStartSolid = bStart;
fFractionTerrain = (hit.distance) / vDelta.magnitude;
pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hit.normal);
pEnvTrc.dwClsFlag = CDR_EVN.CDR_TERRAIN;
}
else
{
fFractionTerrain = 1f;
}
if(fFractionTerrain < pEnvTrc.fFraction)
{
pEnvTrc.fFraction = fFractionTerrain;
}
}
if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_WATER) == CDR_EVN.CDR_WATER)
@@ -156,46 +166,6 @@ namespace BrewMonster
return (pEnvTrc.fFraction < 1.0f + 1E-4f);
}
// == Thay CollideWithEnv (C++) bằng BoxCast ==
//static bool CollideWithEnv_BoxCast(Vector3 vStart, Vector3 vDelta, Vector3 vExt,
// LayerMask mask,
// out RaycastHit hit, out float fFraction, out Vector3 vHitNormal, out bool bStartSolid,
// float skin = 0.01f)
//{
// hit = default;
// vHitNormal = Vector3.up;
// bStartSolid = false;
// fFraction = 0.0f;
// float dist = vDelta.magnitude;
// if (dist <= 1e-6f) return false;
// var hasHit = Physics.Raycast(vStart, vDelta,out hit, dist, mask);
// if (hasHit)
// {
// bStartSolid = true;
// fFraction = (t - 5E-4f) / vDelta.Normalize();
// return true;
// }
// // start-in-solid
// var overlapped = Physics.OverlapBox(vStart, vExt - Vector3.one * skin, Quaternion.identity, mask, QueryTriggerInteraction.Ignore);
// if (overlapped != null && overlapped.Length > 0)
// {
// bStartSolid = true;
// return true;
// }
// // sweep AABB
// Vector3 dir = vDelta / Mathf.Max(dist, 1e-6f);
// if (Physics.BoxCast(vStart, vExt - Vector3.one * skin, dir, out hit, Quaternion.identity, dist, mask, QueryTriggerInteraction.Ignore))
// {
// fFraction = Mathf.Clamp01(hit.distance / Mathf.Max(dist, 1e-6f));
// vHitNormal = hit.normal;
// return true;
// }
// return false;
//}
// == Thay RetrieveSupportPlane (C++) bằng Raycast xuống ==
static bool DoGroundProbe(Vector3 vStart, Vector3 vExt, float fDeltaY, LayerMask mask,
out Vector3 vEnd, out Vector3 vHitNormal, out bool bSupport,
@@ -280,6 +250,10 @@ namespace BrewMonster
int nTry = 0;
LayerMask mask = UsedMask_Ground();
env_trace_t trcInfo = new env_trace_t();
trcInfo.dwCheckFlag = CDR_EVN.CDR_TERRAIN | CDR_EVN.CDR_BRUSH;
trcInfo.vExt = CDRInfo.vExtent;
while (nTry < 1)
{
vDelta = vVelocity * fTime;
@@ -290,22 +264,20 @@ namespace BrewMonster
//bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask,
// out RaycastHit hit, out float fFraction, out Vector3 hitNormal, out bool bStartSolid);
Vector3 posFoot = vStart - Vector3.up * vExt.y;
//if (Physics.BoxCast(vStart, vExt, (vStart + Vector3.down).normalized, out RaycastHit hit1, Quaternion.identity, vExt.y, mask))
//{
// if (hit1.point.y > posFoot.y)
// {
// Debug.LogError("hit.point.y > posFoot.y");
// posFoot.y = hit1.point.y;
// }
//}
if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out RaycastHit hit1, vExt.y, mask))
if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out RaycastHit hit, vExt.y, mask))
{
if (hit1.point.y > posFoot.y)
if (hit.point.y > posFoot.y)
{
posFoot.y = hit1.point.y;
posFoot.y = hit.point.y;
}
}
bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out RaycastHit hit, fDeltaDist, mask);
//bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out hit, fDeltaDist, mask);
trcInfo.vStart = CDRInfo.vCenter;
trcInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta);
trcInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot);
//trcInfo.vTerStart.y -= vExt.y; //foot
bool bClear = !CollideWithEnv(ref trcInfo);
nTry++;
if (bClear)
{
@@ -314,17 +286,10 @@ namespace BrewMonster
CDRInfo.fMoveDist += fDeltaDist;
break;
}
//if (trcInfo.bStartSolid)
//{
// CDRInfo.fMoveDist = 0f;
// if (CDRInfo.vTPNormal.y < CDRInfo.fSlopeThresh) CDRInfo.vTPNormal = Vector3.up;
// return;
//}
vStart = hit.point + Vector3.up * vExt.y;
//vStart = hit.point + Vector3.up * vExt.y;
vStart = vDelta * trcInfo.fFraction + Vector3.up * vExt.y;
vFinalPos = vStart;
//CDRInfo.fMoveDist += (fDeltaDist * fFraction);
//fTime -= fTime * fFraction;
//vNormal = hitNormal;
// Step-up (giữ tinh thần bản gốc)
if (!bFreeFall && !bTryPull && !bJump)
@@ -332,36 +297,38 @@ namespace BrewMonster
//float skin = 0.01f;
posFoot = vStart - Vector3.up * vExt.y + Vector3.up * CDRInfo.fStepHeight;
Vector3 vStartUp = new Vector3(0f, CDRInfo.fStepHeight, 0f);
//if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out hit1, vExt.y, mask))
//{
// if (hit1.point.y > posFoot.y)
// {
// Debug.LogError("hit.point.y > posFoot.y");
// posFoot.y = hit1.point.y + CDRInfo.fStepHeight;
// }
//}
bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask);
//bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask);
env_trace_t tmpInfo = new env_trace_t();
tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart);
tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f);
tmpInfo.vExt = CDRInfo.vExtent;
//@note : need check terrain?? By Kuiwu[8/10/2005]
tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN;
tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot);
bPull = !CollideWithEnv(ref tmpInfo);
if (bPull)
{
vStart += Vector3.up * CDRInfo.fStepHeight;
posFoot = vStart - Vector3.up * vExt.y;
//Vector3 vDelta2 = vVelocity;
bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask);
//bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask);
tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart);
tmpInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta);
tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot);
bool bMove = !CollideWithEnv(ref tmpInfo);
if (!bMove)
{
//vDelta2 *= frac2;
vFinalPos = hit.point + Vector3.up * vExt.y;
vFinalPos = vDelta * tmpInfo.fFraction + Vector3.up * vExt.y;
}
else
{
Debug.DrawLine(vFinalPos, vFinalPos + vDelta, Color.red, 10f);
vFinalPos += vDelta;
}
//if (vDelta2.sqrMagnitude < (vExt.x * vExt.x * 4f))
//{
// vStart -= Vector3.up * CDRInfo.fStepHeight;
// bPull = false;
//}
}
bTryPull = true;
}