mirror of https://github.com/AxioDL/metaforce.git
Bug fixes
This commit is contained in:
parent
28d695eea4
commit
b099be63dd
|
@ -26,17 +26,18 @@ zeus::CVector3f CSteeringBehaviors::Seek(const CPhysicsActor& actor,
|
||||||
}
|
}
|
||||||
|
|
||||||
zeus::CVector3f CSteeringBehaviors::Arrival(const CPhysicsActor& actor,
|
zeus::CVector3f CSteeringBehaviors::Arrival(const CPhysicsActor& actor,
|
||||||
const zeus::CVector3f& v0, float f31) const
|
const zeus::CVector3f& dest, float dampingRadius) const
|
||||||
{
|
{
|
||||||
if (!v0.canBeNormalized())
|
zeus::CVector3f posDiff = dest - actor.GetTranslation();
|
||||||
|
if (!posDiff.canBeNormalized())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
if (v0.magSquared() < (f31 * f31))
|
if (posDiff.magSquared() < (dampingRadius * dampingRadius))
|
||||||
f31 = v0.magSquared() / (f31 * f31);
|
dampingRadius = posDiff.magSquared() / (dampingRadius * dampingRadius);
|
||||||
else
|
else
|
||||||
f31 = 1.f;
|
dampingRadius = 1.f;
|
||||||
|
|
||||||
return f31 * v0.normalized();
|
return dampingRadius * posDiff.normalized();
|
||||||
}
|
}
|
||||||
|
|
||||||
zeus::CVector3f CSteeringBehaviors::Pursuit(const CPhysicsActor& actor,
|
zeus::CVector3f CSteeringBehaviors::Pursuit(const CPhysicsActor& actor,
|
||||||
|
@ -69,34 +70,30 @@ zeus::CVector3f CSteeringBehaviors::Alignment(const CPhysicsActor& actor,
|
||||||
if (!list.empty())
|
if (!list.empty())
|
||||||
{
|
{
|
||||||
for (const TUniqueId& id : list)
|
for (const TUniqueId& id : list)
|
||||||
{
|
|
||||||
if (const CActor* act = static_cast<const CActor*>(mgr.GetObjectById(id)))
|
if (const CActor* act = static_cast<const CActor*>(mgr.GetObjectById(id)))
|
||||||
align += act->GetTransform().frontVector();
|
align += act->GetTransform().frontVector();
|
||||||
}
|
|
||||||
|
|
||||||
align *= zeus::CVector3f(1.f / float(list.size()));
|
align *= zeus::CVector3f(1.f / float(list.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
float diff = zeus::CVector3f::getAngleDiff(actor.GetTransform().frontVector(), align);
|
float diff = zeus::CVector3f::getAngleDiff(actor.GetTransform().frontVector(), align);
|
||||||
return align * ( diff / M_PIF);
|
return align * (diff / M_PIF);
|
||||||
}
|
}
|
||||||
|
|
||||||
zeus::CVector3f CSteeringBehaviors::Cohesion(const CPhysicsActor& actor,
|
zeus::CVector3f CSteeringBehaviors::Cohesion(const CPhysicsActor& actor,
|
||||||
rstl::reserved_vector<TUniqueId, 1024>& list, float f1, const CStateManager& mgr) const
|
rstl::reserved_vector<TUniqueId, 1024>& list, float dampingRadius, const CStateManager& mgr) const
|
||||||
{
|
{
|
||||||
zeus::CVector3f cohesion;
|
zeus::CVector3f dest;
|
||||||
if (!list.empty())
|
if (!list.empty())
|
||||||
{
|
{
|
||||||
for (const TUniqueId& id : list)
|
for (const TUniqueId& id : list)
|
||||||
{
|
|
||||||
if (const CActor* act = static_cast<const CActor*>(mgr.GetObjectById(id)))
|
if (const CActor* act = static_cast<const CActor*>(mgr.GetObjectById(id)))
|
||||||
cohesion += act->GetTranslation();
|
dest += act->GetTranslation();
|
||||||
}
|
|
||||||
|
|
||||||
cohesion *= zeus::CVector3f(1.f / float(list.size()));
|
dest *= zeus::CVector3f(1.f / float(list.size()));
|
||||||
return Arrival(actor, cohesion, f1);
|
return Arrival(actor, dest, dampingRadius);
|
||||||
}
|
}
|
||||||
return cohesion;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
zeus::CVector2f CSteeringBehaviors::Flee2D(const CPhysicsActor& actor,
|
zeus::CVector2f CSteeringBehaviors::Flee2D(const CPhysicsActor& actor,
|
||||||
|
@ -164,7 +161,7 @@ bool CSteeringBehaviors::SolveCubic(
|
||||||
float f25 = std::pow(std::fabs(f24 + f30), 0.333333f);
|
float f25 = std::pow(std::fabs(f24 + f30), 0.333333f);
|
||||||
f1 = std::pow(std::fabs(f24 - f30), 0.333333f);
|
f1 = std::pow(std::fabs(f24 - f30), 0.333333f);
|
||||||
f1 = (f24 - f30) > 0.f ? f1 : -f1;
|
f1 = (f24 - f30) > 0.f ? f1 : -f1;
|
||||||
f25 = (f24 - f30) > 0.f ? f25 : -f25;
|
f25 = (f24 + f30) > 0.f ? f25 : -f25;
|
||||||
out.push_back(f25 + f1 - f31);
|
out.push_back(f25 + f1 - f31);
|
||||||
}
|
}
|
||||||
for (float& f : out)
|
for (float& f : out)
|
||||||
|
|
|
@ -14,13 +14,13 @@ class CSteeringBehaviors
|
||||||
public:
|
public:
|
||||||
zeus::CVector3f Flee(const CPhysicsActor& actor, const zeus::CVector3f& v0) const;
|
zeus::CVector3f Flee(const CPhysicsActor& actor, const zeus::CVector3f& v0) const;
|
||||||
zeus::CVector3f Seek(const CPhysicsActor& actor, const zeus::CVector3f& target) const;
|
zeus::CVector3f Seek(const CPhysicsActor& actor, const zeus::CVector3f& target) const;
|
||||||
zeus::CVector3f Arrival(const CPhysicsActor& actor, const zeus::CVector3f& v0, float f1) const;
|
zeus::CVector3f Arrival(const CPhysicsActor& actor, const zeus::CVector3f& dest, float dampingRadius) const;
|
||||||
zeus::CVector3f Pursuit(const CPhysicsActor& actor, const zeus::CVector3f& v0, const zeus::CVector3f& v1) const;
|
zeus::CVector3f Pursuit(const CPhysicsActor& actor, const zeus::CVector3f& v0, const zeus::CVector3f& v1) const;
|
||||||
zeus::CVector3f Separation(const CPhysicsActor& actor, const zeus::CVector3f& pos, float separation) const;
|
zeus::CVector3f Separation(const CPhysicsActor& actor, const zeus::CVector3f& pos, float separation) const;
|
||||||
zeus::CVector3f Alignment(const CPhysicsActor& actor, rstl::reserved_vector<TUniqueId, 1024>& list,
|
zeus::CVector3f Alignment(const CPhysicsActor& actor, rstl::reserved_vector<TUniqueId, 1024>& list,
|
||||||
const CStateManager& mgr) const;
|
const CStateManager& mgr) const;
|
||||||
zeus::CVector3f Cohesion(const CPhysicsActor& actor, rstl::reserved_vector<TUniqueId, 1024>& list,
|
zeus::CVector3f Cohesion(const CPhysicsActor& actor, rstl::reserved_vector<TUniqueId, 1024>& list,
|
||||||
float f1, const CStateManager& mgr) const;
|
float dampingRadius, const CStateManager& mgr) const;
|
||||||
zeus::CVector2f Flee2D(const CPhysicsActor& actor, const zeus::CVector2f& v0) const;
|
zeus::CVector2f Flee2D(const CPhysicsActor& actor, const zeus::CVector2f& v0) const;
|
||||||
zeus::CVector2f Arrival2D(const CPhysicsActor& actor, const zeus::CVector2f& v0, float f1) const;
|
zeus::CVector2f Arrival2D(const CPhysicsActor& actor, const zeus::CVector2f& v0, float f1) const;
|
||||||
static bool SolveQuadratic(float, float, float, float&, float&);
|
static bool SolveQuadratic(float, float, float, float&, float&);
|
||||||
|
|
|
@ -808,7 +808,7 @@ void CBooRenderer::DisablePVS()
|
||||||
xc8_pvs = std::experimental::nullopt;
|
xc8_pvs = std::experimental::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBooRenderer::UpdateAreaUniforms(int areaIdx, bool shadowRender)
|
void CBooRenderer::UpdateAreaUniforms(int areaIdx, bool shadowRender, bool activateLights)
|
||||||
{
|
{
|
||||||
SetupRendererStates();
|
SetupRendererStates();
|
||||||
|
|
||||||
|
@ -839,7 +839,8 @@ void CBooRenderer::UpdateAreaUniforms(int areaIdx, bool shadowRender)
|
||||||
CBooModel* model = *it;
|
CBooModel* model = *it;
|
||||||
if (model->TryLockTextures())
|
if (model->TryLockTextures())
|
||||||
{
|
{
|
||||||
ActivateLightsForModel(&item, *model);
|
if (activateLights)
|
||||||
|
ActivateLightsForModel(&item, *model);
|
||||||
model->UpdateUniformData(flags, nullptr, nullptr, bufIdx);
|
model->UpdateUniformData(flags, nullptr, nullptr, bufIdx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1449,7 +1450,7 @@ int CBooRenderer::DrawOverlappingWorldModelIDs(int alphaVal, const std::vector<u
|
||||||
const zeus::CAABox& aabb) const
|
const zeus::CAABox& aabb) const
|
||||||
{
|
{
|
||||||
SetupRendererStates();
|
SetupRendererStates();
|
||||||
const_cast<CBooRenderer&>(*this).UpdateAreaUniforms(-1);
|
const_cast<CBooRenderer&>(*this).UpdateAreaUniforms(-1, false, false);
|
||||||
|
|
||||||
CModelFlags flags;
|
CModelFlags flags;
|
||||||
flags.m_extendedShader = EExtendedShader::SolidColor; // Do solid color draw
|
flags.m_extendedShader = EExtendedShader::SolidColor; // Do solid color draw
|
||||||
|
|
|
@ -211,7 +211,7 @@ public:
|
||||||
const SShader* shaderSet);
|
const SShader* shaderSet);
|
||||||
void EnablePVS(const CPVSVisSet&, u32);
|
void EnablePVS(const CPVSVisSet&, u32);
|
||||||
void DisablePVS();
|
void DisablePVS();
|
||||||
void UpdateAreaUniforms(int areaIdx, bool shadowRender = false);
|
void UpdateAreaUniforms(int areaIdx, bool shadowRender = false, bool activateLights = true);
|
||||||
void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>*);
|
void RemoveStaticGeometry(const std::vector<CMetroidModelInstance>*);
|
||||||
void DrawAreaGeometry(int areaIdx, int mask, int targetMask);
|
void DrawAreaGeometry(int areaIdx, int mask, int targetMask);
|
||||||
void DrawUnsortedGeometry(int areaIdx, int mask, int targetMask, bool shadowRender = false);
|
void DrawUnsortedGeometry(int areaIdx, int mask, int targetMask, bool shadowRender = false);
|
||||||
|
|
|
@ -446,7 +446,7 @@ void CParasite::UpdatePFDestination(CStateManager& mgr)
|
||||||
void CParasite::DoFlockingBehavior(CStateManager& mgr)
|
void CParasite::DoFlockingBehavior(CStateManager& mgr)
|
||||||
{
|
{
|
||||||
zeus::CVector3f upVec = x34_transform.basis[2];
|
zeus::CVector3f upVec = x34_transform.basis[2];
|
||||||
rstl::reserved_vector<TUniqueId, 1024> _834;
|
rstl::reserved_vector<TUniqueId, 1024> parasiteList;
|
||||||
zeus::CAABox aabb(GetTranslation() - x6e4_parasiteSearchRadius,
|
zeus::CAABox aabb(GetTranslation() - x6e4_parasiteSearchRadius,
|
||||||
GetTranslation() + x6e4_parasiteSearchRadius);
|
GetTranslation() + x6e4_parasiteSearchRadius);
|
||||||
if ((x5d4_thinkCounter % 6) == 0)
|
if ((x5d4_thinkCounter % 6) == 0)
|
||||||
|
@ -462,7 +462,7 @@ void CParasite::DoFlockingBehavior(CStateManager& mgr)
|
||||||
{
|
{
|
||||||
if (parasite != this && parasite->IsAlive())
|
if (parasite != this && parasite->IsAlive())
|
||||||
{
|
{
|
||||||
_834.push_back(parasite->GetUniqueId());
|
parasiteList.push_back(parasite->GetUniqueId());
|
||||||
float distSq = (parasite->GetTranslation() - GetTranslation()).magSquared();
|
float distSq = (parasite->GetTranslation() - GetTranslation()).magSquared();
|
||||||
if (distSq < minDistSq)
|
if (distSq < minDistSq)
|
||||||
{
|
{
|
||||||
|
@ -477,8 +477,8 @@ void CParasite::DoFlockingBehavior(CStateManager& mgr)
|
||||||
x6e8_parasiteSeparationDist) * x604_activeSpeed;
|
x6e8_parasiteSeparationDist) * x604_activeSpeed;
|
||||||
else
|
else
|
||||||
x628_parasiteSeparationMove = zeus::CVector3f::skZero;
|
x628_parasiteSeparationMove = zeus::CVector3f::skZero;
|
||||||
x634_parasiteCohesionMove = x45c_steeringBehaviors.Cohesion(*this, _834, 0.6f, mgr) * x604_activeSpeed;
|
x634_parasiteCohesionMove = x45c_steeringBehaviors.Cohesion(*this, parasiteList, 0.6f, mgr) * x604_activeSpeed;
|
||||||
x640_parasiteAlignmentMove = x45c_steeringBehaviors.Alignment(*this, _834, mgr) * x604_activeSpeed;
|
x640_parasiteAlignmentMove = x45c_steeringBehaviors.Alignment(*this, parasiteList, mgr) * x604_activeSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mgr.GetPlayer().GetTranslation() - GetTranslation()).magSquared() <
|
if ((mgr.GetPlayer().GetTranslation() - GetTranslation()).magSquared() <
|
||||||
|
|
Loading…
Reference in New Issue