2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-09-19 06:29:37 +00:00

Finish CPlayerVisor and CSamusFaceReflection

This commit is contained in:
Jack Andersen 2017-05-30 16:51:38 -10:00
parent 0c5e4efc46
commit 6f84cfcb38
13 changed files with 369 additions and 114 deletions

View File

@ -79,8 +79,11 @@ struct ITweakGui : ITweak
virtual float GetFreeLookFadeTime() const=0; virtual float GetFreeLookFadeTime() const=0;
virtual float GetFreeLookSfxPitchScale() const=0; virtual float GetFreeLookSfxPitchScale() const=0;
virtual bool GetNoAbsoluteFreeLookSfxPitch() const=0; virtual bool GetNoAbsoluteFreeLookSfxPitch() const=0;
virtual float GetFaceReflectionOrthoWidth() const=0;
virtual float GetFaceReflectionOrthoHeight() const=0;
virtual float GetFaceReflectionDistance() const=0; virtual float GetFaceReflectionDistance() const=0;
virtual float GetFaceReflectionHeight() const=0; virtual float GetFaceReflectionHeight() const=0;
virtual float GetFaceReflectionAspect() const=0;
virtual float GetMissileWarningPulseTime() const=0; virtual float GetMissileWarningPulseTime() const=0;
virtual float GetExplosionLightFalloffMultConstant() const=0; virtual float GetExplosionLightFalloffMultConstant() const=0;
virtual float GetExplosionLightFalloffMultLinear() const=0; virtual float GetExplosionLightFalloffMultLinear() const=0;
@ -107,6 +110,7 @@ struct ITweakGui : ITweak
virtual float GetScanWindowActiveWidth() const=0; virtual float GetScanWindowActiveWidth() const=0;
virtual float GetScanWindowActiveHeight() const=0; virtual float GetScanWindowActiveHeight() const=0;
virtual float GetScanWindowMagnification() const=0; virtual float GetScanWindowMagnification() const=0;
virtual float GetScanWindowScanningAspect() const=0;
virtual float GetScanSpeed(int idx) const=0; virtual float GetScanSpeed(int idx) const=0;
virtual float GetXrayBlurScaleLinear() const=0; virtual float GetXrayBlurScaleLinear() const=0;
virtual float GetXrayBlurScaleQuadratic() const=0; virtual float GetXrayBlurScaleQuadratic() const=0;
@ -141,6 +145,9 @@ struct ITweakGui : ITweak
static float FaceReflectionDistanceDebugValueToActualValue(float v) { return 0.015f * v + 0.2f; } static float FaceReflectionDistanceDebugValueToActualValue(float v) { return 0.015f * v + 0.2f; }
static float FaceReflectionHeightDebugValueToActualValue(float v) { return 0.005f * v - 0.05f; } static float FaceReflectionHeightDebugValueToActualValue(float v) { return 0.005f * v - 0.05f; }
static float FaceReflectionAspectDebugValueToActualValue(float v) { return 0.05f * v + 1.f; }
static float FaceReflectionOrthoWidthDebugValueToActualValue(float v) { return 0.007f * v + 0.02f; }
static float FaceReflectionOrthoHeightDebugValueToActualValue(float v) { return 0.007f * v + 0.02f; }
}; };
} }

View File

@ -84,11 +84,11 @@ struct CTweakGui : ITweakGui
Value<bool> x130_noAbsoluteFreeLookSfxPitch; Value<bool> x130_noAbsoluteFreeLookSfxPitch;
Value<float> x134_; Value<float> x134_;
Value<float> x138_; Value<float> x138_;
Value<atUint32> x13c_; Value<atUint32> x13c_faceReflectionOrthoWidth;
Value<atUint32> x140_; Value<atUint32> x140_faceReflectionOrthoHeight;
Value<atUint32> x144_faceReflectionDistance; Value<atUint32> x144_faceReflectionDistance;
Value<atUint32> x148_faceReflectionHeight; Value<atUint32> x148_faceReflectionHeight;
Value<atUint32> x14c_; Value<atUint32> x14c_faceReflectionAspect;
String<-1> x150_; String<-1> x150_;
String<-1> x160_; String<-1> x160_;
String<-1> x170_; String<-1> x170_;
@ -146,7 +146,7 @@ struct CTweakGui : ITweakGui
Value<float> x260_scanWindowActiveW; Value<float> x260_scanWindowActiveW;
Value<float> x264_scanWindowActiveH; Value<float> x264_scanWindowActiveH;
Value<float> x268_scanWindowMagnification; Value<float> x268_scanWindowMagnification;
Value<float> x26c_; Value<float> x26c_scanWindowScanningAspect;
Value<float> x270_scanSidesPositionStart; Value<float> x270_scanSidesPositionStart;
Value<bool> x274_showAutomapperInMorphball; Value<bool> x274_showAutomapperInMorphball;
bool x275_latchArticleText = true; bool x275_latchArticleText = true;
@ -241,8 +241,11 @@ struct CTweakGui : ITweakGui
float GetFreeLookFadeTime() const { return x118_freeLookFadeTime; } float GetFreeLookFadeTime() const { return x118_freeLookFadeTime; }
float GetFreeLookSfxPitchScale() const { return x12c_freeLookSfxPitchScale; } float GetFreeLookSfxPitchScale() const { return x12c_freeLookSfxPitchScale; }
bool GetNoAbsoluteFreeLookSfxPitch() const { return x130_noAbsoluteFreeLookSfxPitch; } bool GetNoAbsoluteFreeLookSfxPitch() const { return x130_noAbsoluteFreeLookSfxPitch; }
float GetFaceReflectionOrthoWidth() const { return x13c_faceReflectionOrthoWidth; }
float GetFaceReflectionOrthoHeight() const { return x140_faceReflectionOrthoHeight; }
float GetFaceReflectionDistance() const { return x144_faceReflectionDistance; } float GetFaceReflectionDistance() const { return x144_faceReflectionDistance; }
float GetFaceReflectionHeight() const { return x148_faceReflectionHeight; } float GetFaceReflectionHeight() const { return x148_faceReflectionHeight; }
float GetFaceReflectionAspect() const { return x14c_faceReflectionAspect; }
float GetMissileWarningPulseTime() const { return x1a0_missileWarningPulseTime; } float GetMissileWarningPulseTime() const { return x1a0_missileWarningPulseTime; }
float GetExplosionLightFalloffMultConstant() const { return x1a4_explosionLightFalloffMultConstant; } float GetExplosionLightFalloffMultConstant() const { return x1a4_explosionLightFalloffMultConstant; }
float GetExplosionLightFalloffMultLinear() const { return x1a8_explosionLightFalloffMultLinear; } float GetExplosionLightFalloffMultLinear() const { return x1a8_explosionLightFalloffMultLinear; }
@ -283,6 +286,7 @@ struct CTweakGui : ITweakGui
float GetScanWindowActiveWidth() const { return x260_scanWindowActiveW; } float GetScanWindowActiveWidth() const { return x260_scanWindowActiveW; }
float GetScanWindowActiveHeight() const { return x264_scanWindowActiveH; } float GetScanWindowActiveHeight() const { return x264_scanWindowActiveH; }
float GetScanWindowMagnification() const { return x268_scanWindowMagnification; } float GetScanWindowMagnification() const { return x268_scanWindowMagnification; }
float GetScanWindowScanningAspect() const { return x26c_scanWindowScanningAspect; }
float GetScanSidesPositionStart() const { return x270_scanSidesPositionStart; } float GetScanSidesPositionStart() const { return x270_scanSidesPositionStart; }
bool GetShowAutomapperInMorphball() const { return x274_showAutomapperInMorphball; } bool GetShowAutomapperInMorphball() const { return x274_showAutomapperInMorphball; }
bool GetLatchArticleText() const { return x275_latchArticleText; } bool GetLatchArticleText() const { return x275_latchArticleText; }

View File

@ -1216,64 +1216,64 @@ void CTweakPlayer::read(athena::io::YAMLDocReader& __dna_docin)
x1a0_ = __dna_docin.readFloat("x1a0_"); x1a0_ = __dna_docin.readFloat("x1a0_");
/* x1a4_ */ /* x1a4_ */
x1a4_ = __dna_docin.readFloat("x1a4_"); x1a4_ = __dna_docin.readFloat("x1a4_");
/* x1a8_ */ /* x1a8_orbitScreenBoxHalfExtentX */
size_t __x1a8_Count; size_t __x1a8_Count;
if (auto v = __dna_docin.enterSubVector("x1a8_", __x1a8_Count)) if (auto v = __dna_docin.enterSubVector("x1a8_orbitScreenBoxHalfExtentX", __x1a8_Count))
{ {
/* x1a8_[0] */ /* x1a8_orbitScreenBoxHalfExtentX[0] */
x1a8_orbitScreenBoxHalfExtentX[0] = __dna_docin.readUint32("x1a8_"); x1a8_orbitScreenBoxHalfExtentX[0] = __dna_docin.readUint32("x1a8_orbitScreenBoxHalfExtentX");
/* x1a8_[1] */ /* x1a8_orbitScreenBoxHalfExtentX[1] */
x1a8_orbitScreenBoxHalfExtentX[1] = __dna_docin.readUint32("x1a8_"); x1a8_orbitScreenBoxHalfExtentX[1] = __dna_docin.readUint32("x1a8_orbitScreenBoxHalfExtentX");
} }
/* x1b0_ */ /* x1b0_orbitScreenBoxHalfExtentY */
size_t __x1b0_Count; size_t __x1b0_Count;
if (auto v = __dna_docin.enterSubVector("x1b0_", __x1b0_Count)) if (auto v = __dna_docin.enterSubVector("x1b0_orbitScreenBoxHalfExtentY", __x1b0_Count))
{ {
/* x1b0_[0] */ /* x1b0_orbitScreenBoxHalfExtentY[0] */
x1b0_orbitScreenBoxHalfExtentY[0] = __dna_docin.readUint32("x1b0_"); x1b0_orbitScreenBoxHalfExtentY[0] = __dna_docin.readUint32("x1b0_orbitScreenBoxHalfExtentY");
/* x1b0_[1] */ /* x1b0_orbitScreenBoxHalfExtentY[1] */
x1b0_orbitScreenBoxHalfExtentY[1] = __dna_docin.readUint32("x1b0_"); x1b0_orbitScreenBoxHalfExtentY[1] = __dna_docin.readUint32("x1b0_orbitScreenBoxHalfExtentY");
} }
/* x1b8_ */ /* x1b8_orbitScreenBoxCenterX */
size_t __x1b8_Count; size_t __x1b8_Count;
if (auto v = __dna_docin.enterSubVector("x1b8_", __x1b8_Count)) if (auto v = __dna_docin.enterSubVector("x1b8_orbitScreenBoxCenterX", __x1b8_Count))
{ {
/* x1b8_[0] */ /* x1b8_orbitScreenBoxCenterX[0] */
x1b8_orbitScreenBoxCenterX[0] = __dna_docin.readUint32("x1b8_"); x1b8_orbitScreenBoxCenterX[0] = __dna_docin.readUint32("x1b8_orbitScreenBoxCenterX");
/* x1b8_[1] */ /* x1b8_orbitScreenBoxCenterX[1] */
x1b8_orbitScreenBoxCenterX[1] = __dna_docin.readUint32("x1b8_"); x1b8_orbitScreenBoxCenterX[1] = __dna_docin.readUint32("x1b8_orbitScreenBoxCenterX");
} }
/* x1c0_ */ /* x1c0_orbitScreenBoxCenterY */
size_t __x1c0_Count; size_t __x1c0_Count;
if (auto v = __dna_docin.enterSubVector("x1c0_", __x1c0_Count)) if (auto v = __dna_docin.enterSubVector("x1c0_orbitScreenBoxCenterY", __x1c0_Count))
{ {
/* x1c0_[0] */ /* x1c0_orbitScreenBoxCenterY[0] */
x1c0_orbitScreenBoxCenterY[0] = __dna_docin.readUint32("x1c0_"); x1c0_orbitScreenBoxCenterY[0] = __dna_docin.readUint32("x1c0_orbitScreenBoxCenterY");
/* x1c0_[1] */ /* x1c0_orbitScreenBoxCenterY[1] */
x1c0_orbitScreenBoxCenterY[1] = __dna_docin.readUint32("x1c0_"); x1c0_orbitScreenBoxCenterY[1] = __dna_docin.readUint32("x1c0_orbitScreenBoxCenterY");
} }
/* x1c8_ */ /* x1c8_enemyScreenBoxCenterX */
size_t __x1c8_Count; size_t __x1c8_Count;
if (auto v = __dna_docin.enterSubVector("x1c8_", __x1c8_Count)) if (auto v = __dna_docin.enterSubVector("x1c8_enemyScreenBoxCenterX", __x1c8_Count))
{ {
/* x1c8_[0] */ /* x1c8_enemyScreenBoxCenterX[0] */
x1c8_enemyScreenBoxCenterX[0] = __dna_docin.readUint32("x1c8_"); x1c8_enemyScreenBoxCenterX[0] = __dna_docin.readUint32("x1c8_enemyScreenBoxCenterX");
/* x1c8_[1] */ /* x1c8_enemyScreenBoxCenterX[1] */
x1c8_enemyScreenBoxCenterX[1] = __dna_docin.readUint32("x1c8_"); x1c8_enemyScreenBoxCenterX[1] = __dna_docin.readUint32("x1c8_enemyScreenBoxCenterX");
} }
/* x1d0_ */ /* x1d0_enemyScreenBoxCenterY */
size_t __x1d0_Count; size_t __x1d0_Count;
if (auto v = __dna_docin.enterSubVector("x1d0_", __x1d0_Count)) if (auto v = __dna_docin.enterSubVector("x1d0_enemyScreenBoxCenterY", __x1d0_Count))
{ {
/* x1d0_[0] */ /* x1d0_enemyScreenBoxCenterY[0] */
x1d0_enemyScreenBoxCenterY[0] = __dna_docin.readUint32("x1d0_"); x1d0_enemyScreenBoxCenterY[0] = __dna_docin.readUint32("x1d0_enemyScreenBoxCenterY");
/* x1d0_[1] */ /* x1d0_enemyScreenBoxCenterY[1] */
x1d0_enemyScreenBoxCenterY[1] = __dna_docin.readUint32("x1d0_"); x1d0_enemyScreenBoxCenterY[1] = __dna_docin.readUint32("x1d0_enemyScreenBoxCenterY");
} }
/* x1d8_ */ /* x1d8_orbitNearX */
x1d8_orbitNearX = __dna_docin.readFloat("x1d8_"); x1d8_orbitNearX = __dna_docin.readFloat("x1d8_orbitNearX");
/* x1dc_ */ /* x1dc_orbitNearZ */
x1dc_orbitNearZ = __dna_docin.readFloat("x1dc_"); x1dc_orbitNearZ = __dna_docin.readFloat("x1dc_orbitNearZ");
/* x1e0_ */ /* x1e0_ */
x1e0_ = __dna_docin.readFloat("x1e0_"); x1e0_ = __dna_docin.readFloat("x1e0_");
/* x1e4_ */ /* x1e4_ */
@ -1308,14 +1308,14 @@ void CTweakPlayer::read(athena::io::YAMLDocReader& __dna_docin)
x218_scanningRange = __dna_docin.readFloat("x218_scanningRange"); x218_scanningRange = __dna_docin.readFloat("x218_scanningRange");
/* x21c_24_ */ /* x21c_24_ */
x21c_24_ = __dna_docin.readBool("x21c_24_"); x21c_24_ = __dna_docin.readBool("x21c_24_");
/* x21c_25_ */ /* x21c_25_scanFreezesGame */
x21c_25_scanFreezesGame = __dna_docin.readBool("x21c_25_"); x21c_25_scanFreezesGame = __dna_docin.readBool("x21c_25_scanFreezesGame");
/* x21c_26_ */ /* x21c_26_ */
x21c_26_ = __dna_docin.readBool("x21c_26_"); x21c_26_ = __dna_docin.readBool("x21c_26_");
/* x220_ */ /* x220_ */
x220_ = __dna_docin.readFloat("x220_"); x220_ = __dna_docin.readFloat("x220_");
/* x224_ */ /* x224_scanningFrameSenseRange */
x224_scanningFrameSenseRange = __dna_docin.readFloat("x224_"); x224_scanningFrameSenseRange = __dna_docin.readFloat("x224_scanningFrameSenseRange");
/* x2a0_ */ /* x2a0_ */
x2a0_ = __dna_docin.readFloat("x2a0_"); x2a0_ = __dna_docin.readFloat("x2a0_");
/* x2a4_ */ /* x2a4_ */
@ -1722,58 +1722,58 @@ void CTweakPlayer::CTweakPlayer::write(athena::io::YAMLDocWriter& __dna_docout)
__dna_docout.writeFloat("x1a0_", x1a0_); __dna_docout.writeFloat("x1a0_", x1a0_);
/* x1a4_ */ /* x1a4_ */
__dna_docout.writeFloat("x1a4_", x1a4_); __dna_docout.writeFloat("x1a4_", x1a4_);
/* x1a8_ */ /* x1a8_orbitScreenBoxHalfExtentX */
if (auto v = __dna_docout.enterSubVector("x1a8_")) if (auto v = __dna_docout.enterSubVector("x1a8_orbitScreenBoxHalfExtentX"))
{ {
/* x1a8_[0] */ /* x1a8_orbitScreenBoxHalfExtentX[0] */
__dna_docout.writeUint32("x1a8_", x1a8_orbitScreenBoxHalfExtentX[0]); __dna_docout.writeUint32("x1a8_orbitScreenBoxHalfExtentX", x1a8_orbitScreenBoxHalfExtentX[0]);
/* x1a8_[1] */ /* x1a8_orbitScreenBoxHalfExtentX[1] */
__dna_docout.writeUint32("x1a8_", x1a8_orbitScreenBoxHalfExtentX[1]); __dna_docout.writeUint32("x1a8_orbitScreenBoxHalfExtentX", x1a8_orbitScreenBoxHalfExtentX[1]);
} }
/* x1b0_ */ /* x1b0_orbitScreenBoxHalfExtentY */
if (auto v = __dna_docout.enterSubVector("x1b0_")) if (auto v = __dna_docout.enterSubVector("x1b0_orbitScreenBoxHalfExtentY"))
{ {
/* x1b0_[0] */ /* x1b0_orbitScreenBoxHalfExtentY[0] */
__dna_docout.writeUint32("x1b0_", x1b0_orbitScreenBoxHalfExtentY[0]); __dna_docout.writeUint32("x1b0_orbitScreenBoxHalfExtentY", x1b0_orbitScreenBoxHalfExtentY[0]);
/* x1b0_[1] */ /* x1b0_orbitScreenBoxHalfExtentY[1] */
__dna_docout.writeUint32("x1b0_", x1b0_orbitScreenBoxHalfExtentY[1]); __dna_docout.writeUint32("x1b0_orbitScreenBoxHalfExtentY", x1b0_orbitScreenBoxHalfExtentY[1]);
} }
/* x1b8_ */ /* x1b8_orbitScreenBoxCenterX */
if (auto v = __dna_docout.enterSubVector("x1b8_")) if (auto v = __dna_docout.enterSubVector("x1b8_orbitScreenBoxCenterX"))
{ {
/* x1b8_[0] */ /* x1b8_orbitScreenBoxCenterX[0] */
__dna_docout.writeUint32("x1b8_", x1b8_orbitScreenBoxCenterX[0]); __dna_docout.writeUint32("x1b8_orbitScreenBoxCenterX", x1b8_orbitScreenBoxCenterX[0]);
/* x1b8_[1] */ /* x1b8_orbitScreenBoxCenterX[1] */
__dna_docout.writeUint32("x1b8_", x1b8_orbitScreenBoxCenterX[1]); __dna_docout.writeUint32("x1b8_orbitScreenBoxCenterX", x1b8_orbitScreenBoxCenterX[1]);
} }
/* x1c0_ */ /* x1c0_orbitScreenBoxCenterY */
if (auto v = __dna_docout.enterSubVector("x1c0_")) if (auto v = __dna_docout.enterSubVector("x1c0_orbitScreenBoxCenterY"))
{ {
/* x1c0_[0] */ /* x1c0_orbitScreenBoxCenterY[0] */
__dna_docout.writeUint32("x1c0_", x1c0_orbitScreenBoxCenterY[0]); __dna_docout.writeUint32("x1c0_orbitScreenBoxCenterY", x1c0_orbitScreenBoxCenterY[0]);
/* x1c0_[1] */ /* x1c0_orbitScreenBoxCenterY[1] */
__dna_docout.writeUint32("x1c0_", x1c0_orbitScreenBoxCenterY[1]); __dna_docout.writeUint32("x1c0_orbitScreenBoxCenterY", x1c0_orbitScreenBoxCenterY[1]);
} }
/* x1c8_ */ /* x1c8_enemyScreenBoxCenterX */
if (auto v = __dna_docout.enterSubVector("x1c8_")) if (auto v = __dna_docout.enterSubVector("x1c8_enemyScreenBoxCenterX"))
{ {
/* x1c8_[0] */ /* x1c8_enemyScreenBoxCenterX[0] */
__dna_docout.writeUint32("x1c8_", x1c8_enemyScreenBoxCenterX[0]); __dna_docout.writeUint32("x1c8_enemyScreenBoxCenterX", x1c8_enemyScreenBoxCenterX[0]);
/* x1c8_[1] */ /* x1c8_enemyScreenBoxCenterX[1] */
__dna_docout.writeUint32("x1c8_", x1c8_enemyScreenBoxCenterX[1]); __dna_docout.writeUint32("x1c8_enemyScreenBoxCenterX", x1c8_enemyScreenBoxCenterX[1]);
} }
/* x1d0_ */ /* x1d0_enemyScreenBoxCenterY */
if (auto v = __dna_docout.enterSubVector("x1d0_")) if (auto v = __dna_docout.enterSubVector("x1d0_enemyScreenBoxCenterY"))
{ {
/* x1d0_[0] */ /* x1d0_enemyScreenBoxCenterY[0] */
__dna_docout.writeUint32("x1d0_", x1d0_enemyScreenBoxCenterY[0]); __dna_docout.writeUint32("x1d0_enemyScreenBoxCenterY", x1d0_enemyScreenBoxCenterY[0]);
/* x1d0_[1] */ /* x1d0_enemyScreenBoxCenterY[1] */
__dna_docout.writeUint32("x1d0_", x1d0_enemyScreenBoxCenterY[1]); __dna_docout.writeUint32("x1d0_enemyScreenBoxCenterY", x1d0_enemyScreenBoxCenterY[1]);
} }
/* x1d8_ */ /* x1d8_ */
__dna_docout.writeFloat("x1d8_", x1d8_orbitNearX); __dna_docout.writeFloat("x1d8_orbitNearX", x1d8_orbitNearX);
/* x1dc_ */ /* x1dc_ */
__dna_docout.writeFloat("x1dc_", x1dc_orbitNearZ); __dna_docout.writeFloat("x1dc_orbitNearZ", x1dc_orbitNearZ);
/* x1e0_ */ /* x1e0_ */
__dna_docout.writeFloat("x1e0_", x1e0_); __dna_docout.writeFloat("x1e0_", x1e0_);
/* x1e4_ */ /* x1e4_ */
@ -1808,14 +1808,14 @@ void CTweakPlayer::CTweakPlayer::write(athena::io::YAMLDocWriter& __dna_docout)
__dna_docout.writeFloat("x218_scanningRange", x218_scanningRange); __dna_docout.writeFloat("x218_scanningRange", x218_scanningRange);
/* x21c_24_ */ /* x21c_24_ */
__dna_docout.writeBool("x21c_24_", x21c_24_); __dna_docout.writeBool("x21c_24_", x21c_24_);
/* x21c_25_ */ /* x21c_25_scanFreezesGame */
__dna_docout.writeBool("x21c_25_", x21c_25_scanFreezesGame); __dna_docout.writeBool("x21c_25_scanFreezesGame", x21c_25_scanFreezesGame);
/* x21c_26_ */ /* x21c_26_ */
__dna_docout.writeBool("x21c_26_", x21c_26_); __dna_docout.writeBool("x21c_26_", x21c_26_);
/* x220_ */ /* x220_ */
__dna_docout.writeFloat("x220_", x220_); __dna_docout.writeFloat("x220_", x220_);
/* x224_ */ /* x224_scanningFrameSenseRange */
__dna_docout.writeFloat("x224_", x224_scanningFrameSenseRange); __dna_docout.writeFloat("x224_scanningFrameSenseRange", x224_scanningFrameSenseRange);
/* x2a0_ */ /* x2a0_ */
__dna_docout.writeFloat("x2a0_", x2a0_); __dna_docout.writeFloat("x2a0_", x2a0_);
/* x2a4_ */ /* x2a4_ */

View File

@ -214,7 +214,7 @@ void CStateManager::UpdateThermalVisor()
CPlayerState::EPlayerVisor visor = x8b8_playerState->GetActiveVisor(*this); CPlayerState::EPlayerVisor visor = x8b8_playerState->GetActiveVisor(*this);
if (visor == CPlayerState::EPlayerVisor::Thermal && x8cc_nextAreaId != kInvalidAreaId) if (visor == CPlayerState::EPlayerVisor::Thermal && x8cc_nextAreaId != kInvalidAreaId)
{ {
std::unique_ptr<CGameArea>& area = x850_world->GetGameAreas()[x8cc_nextAreaId]; CGameArea* area = x850_world->GetArea(x8cc_nextAreaId);
const zeus::CTransform& playerXf = x84c_player->GetTransform(); const zeus::CTransform& playerXf = x84c_player->GetTransform();
zeus::CVector3f playerXYPos(playerXf.origin.x, playerXf.origin.y, 0.f); zeus::CVector3f playerXYPos(playerXf.origin.x, playerXf.origin.y, 0.f);
CGameArea* lastArea = nullptr; CGameArea* lastArea = nullptr;
@ -231,14 +231,14 @@ void CStateManager::UpdateThermalVisor()
TAreaId connAreaId = dock.GetConnectedAreaId(0); TAreaId connAreaId = dock.GetConnectedAreaId(0);
if (connAreaId != kInvalidAreaId) if (connAreaId != kInvalidAreaId)
{ {
std::unique_ptr<CGameArea>& connArea = x850_world->GetGameAreas()[x8cc_nextAreaId]; CGameArea* connArea = x850_world->GetArea(x8cc_nextAreaId);
if (connArea->IsPostConstructed()) if (connArea->IsPostConstructed())
{ {
CGameArea::EOcclusionState occState = connArea->GetPostConstructed()->x10dc_occlusionState; CGameArea::EOcclusionState occState = connArea->GetPostConstructed()->x10dc_occlusionState;
if (occState == CGameArea::EOcclusionState::Visible) if (occState == CGameArea::EOcclusionState::Visible)
{ {
closestDist = dist; closestDist = dist;
lastArea = connArea.get(); lastArea = connArea;
} }
} }
} }

View File

@ -73,6 +73,7 @@ public:
void BuildDynamicLightList(const CStateManager& mgr, const zeus::CAABox& aabb); void BuildDynamicLightList(const CStateManager& mgr, const zeus::CAABox& aabb);
void ActivateLights(CBooModel& model) const; void ActivateLights(CBooModel& model) const;
void SetCastShadows(bool v) { x298_25_castShadows = v; } void SetCastShadows(bool v) { x298_25_castShadows = v; }
void SetFindShadowLight(bool v) { x298_27_findShadowLight = v; }
void SetAmbientColor(const zeus::CColor& color) { x288_ambientColor = color; } void SetAmbientColor(const zeus::CColor& color) { x288_ambientColor = color; }
const zeus::CColor& GetAmbientColor() const { return x288_ambientColor; } const zeus::CColor& GetAmbientColor() const { return x288_ambientColor; }

View File

@ -138,6 +138,8 @@ private:
}; };
std::vector<ModelInstance> m_instances; std::vector<ModelInstance> m_instances;
boo::ITexture* m_txtrOverrides[8] = {};
ModelInstance* PushNewModelInstance(); ModelInstance* PushNewModelInstance();
void DrawAlphaSurfaces(const CModelFlags& flags) const; void DrawAlphaSurfaces(const CModelFlags& flags) const;
void DrawNormalSurfaces(const CModelFlags& flags) const; void DrawNormalSurfaces(const CModelFlags& flags) const;
@ -155,7 +157,7 @@ public:
CBooModel(TToken<CModel>& token, std::vector<CBooSurface>* surfaces, SShader& shader, CBooModel(TToken<CModel>& token, std::vector<CBooSurface>* surfaces, SShader& shader,
boo::IVertexFormat* vtxFmt, boo::IGraphicsBufferS* vbo, boo::IGraphicsBufferS* ibo, boo::IVertexFormat* vtxFmt, boo::IGraphicsBufferS* vbo, boo::IGraphicsBufferS* ibo,
size_t weightVecCount, size_t skinBankCount, const zeus::CAABox& aabb, u8 renderMask, size_t weightVecCount, size_t skinBankCount, const zeus::CAABox& aabb, u8 renderMask,
int numInsts); int numInsts, boo::ITexture* txtrOverrides[8]);
static void MakeTexturesFromMats(const MaterialSet& matSet, static void MakeTexturesFromMats(const MaterialSet& matSet,
std::vector<TCachedToken<CTexture>>& toksOut, std::vector<TCachedToken<CTexture>>& toksOut,
@ -242,7 +244,7 @@ public:
const zeus::CAABox& GetAABB() const {return m_aabb;} const zeus::CAABox& GetAABB() const {return m_aabb;}
CBooModel& GetInstance() {return *x28_modelInst;} CBooModel& GetInstance() {return *x28_modelInst;}
const CBooModel& GetInstance() const {return *x28_modelInst;} const CBooModel& GetInstance() const {return *x28_modelInst;}
std::unique_ptr<CBooModel> MakeNewInstance(int shaderIdx, int subInsts); std::unique_ptr<CBooModel> MakeNewInstance(int shaderIdx, int subInsts, boo::ITexture* txtrOverrides[8] = nullptr);
void UpdateLastFrame() const { const_cast<CModel&>(*this).x38_lastFrame = CGraphics::GetFrameCounter(); } void UpdateLastFrame() const { const_cast<CModel&>(*this).x38_lastFrame = CGraphics::GetFrameCounter(); }
}; };

View File

@ -136,12 +136,16 @@ CBooModel::~CBooModel()
CBooModel::CBooModel(TToken<CModel>& token, std::vector<CBooSurface>* surfaces, SShader& shader, CBooModel::CBooModel(TToken<CModel>& token, std::vector<CBooSurface>* surfaces, SShader& shader,
boo::IVertexFormat* vtxFmt, boo::IGraphicsBufferS* vbo, boo::IGraphicsBufferS* ibo, boo::IVertexFormat* vtxFmt, boo::IGraphicsBufferS* vbo, boo::IGraphicsBufferS* ibo,
size_t weightVecCount, size_t skinBankCount, const zeus::CAABox& aabb, u8 renderMask, size_t weightVecCount, size_t skinBankCount, const zeus::CAABox& aabb, u8 renderMask,
int instCount) int instCount, boo::ITexture* txtrOverrides[8])
: m_model(token), x0_surfaces(surfaces), x4_matSet(&shader.m_matSet), m_matSetIdx(shader.m_matSetIdx), : m_model(token), x0_surfaces(surfaces), x4_matSet(&shader.m_matSet), m_matSetIdx(shader.m_matSetIdx),
m_pipelines(&shader.m_shaders), m_vtxFmt(vtxFmt), x8_vbo(vbo), xc_ibo(ibo), m_weightVecCount(weightVecCount), m_pipelines(&shader.m_shaders), m_vtxFmt(vtxFmt), x8_vbo(vbo), xc_ibo(ibo), m_weightVecCount(weightVecCount),
m_skinBankCount(skinBankCount), x1c_textures(shader.x0_textures), x20_aabb(aabb), m_skinBankCount(skinBankCount), x1c_textures(shader.x0_textures), x20_aabb(aabb),
x40_24_texturesLoaded(false), x40_25_modelVisible(0), x41_mask(renderMask) x40_24_texturesLoaded(false), x40_25_modelVisible(0), x41_mask(renderMask)
{ {
if (txtrOverrides)
for (int i=0 ; i<8 ; ++i)
m_txtrOverrides[i] = txtrOverrides[i];
if (!g_FirstModel) if (!g_FirstModel)
g_FirstModel = this; g_FirstModel = this;
else else
@ -283,8 +287,15 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance()
u32 texCount = 0; u32 texCount = 0;
for (atUint32 idx : mat.textureIdxs) for (atUint32 idx : mat.textureIdxs)
{ {
TCachedToken<CTexture>& tex = x1c_textures[idx]; if (boo::ITexture* overtex = m_txtrOverrides[texCount])
texs[texCount++] = tex.GetObj()->GetBooTexture(); {
texs[texCount++] = overtex;
}
else
{
TCachedToken<CTexture>& tex = x1c_textures[idx];
texs[texCount++] = tex.GetObj()->GetBooTexture();
}
} }
texs[7] = g_Renderer->x220_sphereRamp; texs[7] = g_Renderer->x220_sphereRamp;
@ -924,13 +935,13 @@ static const u8* MemoryFromPartData(const u8*& dataCur, const s32*& secSizeCur)
return ret; return ret;
} }
std::unique_ptr<CBooModel> CModel::MakeNewInstance(int shaderIdx, int subInsts) std::unique_ptr<CBooModel> CModel::MakeNewInstance(int shaderIdx, int subInsts, boo::ITexture* txtrOverrides[8])
{ {
if (shaderIdx >= x18_matSets.size()) if (shaderIdx >= x18_matSets.size())
shaderIdx = 0; shaderIdx = 0;
return std::make_unique<CBooModel>(m_selfToken, &x8_surfaces, x18_matSets[shaderIdx], return std::make_unique<CBooModel>(m_selfToken, &x8_surfaces, x18_matSets[shaderIdx],
m_vtxFmt, m_vbo, m_ibo, m_weightVecCount, m_skinBankCount, m_vtxFmt, m_vbo, m_ibo, m_weightVecCount, m_skinBankCount,
m_aabb, (m_flags & 0x2) != 0, subInsts); m_aabb, (m_flags & 0x2) != 0, subInsts, txtrOverrides);
} }
CModel::CModel(std::unique_ptr<u8[]>&& in, u32 /* dataLen */, IObjectStore* store, CObjectReference* selfRef) CModel::CModel(std::unique_ptr<u8[]>&& in, u32 /* dataLen */, IObjectStore* store, CObjectReference* selfRef)

View File

@ -8,6 +8,7 @@
#include "Camera/CGameCamera.hpp" #include "Camera/CGameCamera.hpp"
#include "Graphics/CBooRenderer.hpp" #include "Graphics/CBooRenderer.hpp"
#include "GuiSys/CCompoundTargetReticle.hpp" #include "GuiSys/CCompoundTargetReticle.hpp"
#include "GuiSys/CTargetingManager.hpp"
namespace urde namespace urde
{ {
@ -357,8 +358,137 @@ void CPlayerVisor::LockUnlockAssets()
void CPlayerVisor::DrawScanEffect(const CStateManager& mgr, const CTargetingManager* tgtMgr) const void CPlayerVisor::DrawScanEffect(const CStateManager& mgr, const CTargetingManager* tgtMgr) const
{ {
DrawScanObjectIndicators(mgr); bool indicatorsDrawn = DrawScanObjectIndicators(mgr);
/* TODO: Finish */ if (tgtMgr && indicatorsDrawn)
{
CGraphics::SetDepthRange(0.12500012f, 0.12500012f);
tgtMgr->Draw(mgr, false);
CGraphics::SetDepthRange(0.015625f, 0.03125f);
}
float transFactor = mgr.GetPlayerState()->GetVisorTransitionFactor();
float scanSidesDuration = g_tweakGui->GetScanSidesDuration();
float scanSidesStart = g_tweakGui->GetScanSidesStartTime();
float t;
if (x34_nextState == EScanWindowState::Scan)
t = 1.f - ((x3c_windowInterpTimer < scanSidesDuration) ? 0.f : (x3c_windowInterpTimer - scanSidesDuration) / scanSidesStart);
else
t = (x3c_windowInterpTimer > scanSidesStart) ? 1.f : x3c_windowInterpTimer / scanSidesStart;
float divisor = (transFactor * ((1.f - t) * x58_scanMagInterp + t * g_tweakGui->GetScanWindowScanningAspect()) + (1.f - transFactor));
float vpW = 169.218f * x48_interpWindowDims.x / divisor;
vpW = zeus::clamp(0.f, vpW, 640.f) * g_Viewport.x8_width / 640.f;
float vpH = 152.218f * x48_interpWindowDims.y / divisor;
vpH = zeus::clamp(0.f, vpH, 448.f) * g_Viewport.xc_height / 448.f;
SClipScreenRect rect;
rect.x4_left = (g_Viewport.x8_width - vpW) / 2.f;
rect.x8_top = (g_Viewport.xc_height - vpH) / 2.f;
rect.xc_width = vpW;
rect.x10_height = vpH;
CGraphics::ResolveSpareTexture(rect);
x64_scanDim.Draw();
g_Renderer->SetViewportOrtho(true, -1.f, 1.f);
zeus::CTransform windowScale = zeus::CTransform::Scale(x48_interpWindowDims.x, 1.f, x48_interpWindowDims.y);
zeus::CTransform seventeenScale = zeus::CTransform::Scale(17.f, 1.f, 17.f);
CGraphics::SetModelMatrix(seventeenScale * windowScale);
if (x108_newScanPane.IsLoaded())
{
if (!m_newScanPaneInst)
{
CPlayerVisor* ncThis = const_cast<CPlayerVisor*>(this);
boo::ITexture* texs[8] = {CGraphics::g_SpareTexture};
ncThis->m_newScanPaneInst = ncThis->x108_newScanPane->MakeNewInstance(0, 1, texs);
ncThis->m_newScanPaneInst->VerifyCurrentShader(0);
}
m_newScanPaneInst->Draw(CModelFlags(5, 0, 3 | 4, zeus::CColor(1.f, transFactor)), nullptr, nullptr);
}
// No cull faces
zeus::CColor frameColor = zeus::CColor::lerp(
g_tweakGuiColors->GetScanFrameInactiveColor(),
g_tweakGuiColors->GetScanFrameActiveColor(),
x54c_frameColorInterp);
frameColor.a = transFactor;
CModelFlags flags(5, 0, 0,
frameColor + g_tweakGuiColors->GetScanFrameImpulseColor() *
zeus::CColor(x550_frameColorImpulseInterp, x550_frameColorImpulseInterp));
zeus::CTransform verticalFlip = zeus::CTransform::Scale(1.f, 1.f, -1.f);
zeus::CTransform horizontalFlip = zeus::CTransform::Scale(-1.f, 1.f, 1.f);
if (xe4_scanFrameCenterTop.IsLoaded())
{
zeus::CTransform modelXf =
seventeenScale * zeus::CTransform::Translate(windowScale * zeus::CVector3f(0.f, 0.f, 4.553f));
CGraphics::SetModelMatrix(modelXf);
xe4_scanFrameCenterTop->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * modelXf);
xe4_scanFrameCenterTop->Draw(flags);
}
if (xd8_scanFrameCenterSide.IsLoaded())
{
zeus::CTransform modelXf =
seventeenScale * zeus::CTransform::Translate(windowScale * zeus::CVector3f(-5.f, 0.f, 0.f));
CGraphics::SetModelMatrix(modelXf);
xd8_scanFrameCenterSide->Draw(flags);
CGraphics::SetModelMatrix(horizontalFlip * modelXf);
xd8_scanFrameCenterSide->Draw(flags);
}
if (xcc_scanFrameCorner.IsLoaded())
{
zeus::CTransform modelXf =
seventeenScale * zeus::CTransform::Translate(windowScale * zeus::CVector3f(-5.f, 0.f, 4.553f));
CGraphics::SetModelMatrix(modelXf);
xcc_scanFrameCorner->Draw(flags);
CGraphics::SetModelMatrix(horizontalFlip * modelXf);
xcc_scanFrameCorner->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * modelXf);
xcc_scanFrameCorner->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * horizontalFlip * modelXf);
xcc_scanFrameCorner->Draw(flags);
}
if (xfc_scanFrameStretchTop.IsLoaded())
{
zeus::CTransform modelXf =
seventeenScale * zeus::CTransform::Translate(-1.f, 0.f, 4.553f * windowScale.basis[2][2]) *
zeus::CTransform::Scale(5.f * windowScale.basis[0][0] - 1.f - 1.884f, 1.f, 1.f);
CGraphics::SetModelMatrix(modelXf);
xfc_scanFrameStretchTop->Draw(flags);
CGraphics::SetModelMatrix(horizontalFlip * modelXf);
xfc_scanFrameStretchTop->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * modelXf);
xfc_scanFrameStretchTop->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * horizontalFlip * modelXf);
xfc_scanFrameStretchTop->Draw(flags);
}
if (xf0_scanFrameStretchSide.IsLoaded())
{
zeus::CTransform modelXf =
seventeenScale * zeus::CTransform::Translate(-5.f * windowScale.basis[0][0], 0.f, 1.f) *
zeus::CTransform::Scale(1.f, 1.f, 4.553f * windowScale.basis[2][2] - 1.f - 1.886f);
CGraphics::SetModelMatrix(modelXf);
xf0_scanFrameStretchSide->Draw(flags);
CGraphics::SetModelMatrix(horizontalFlip * modelXf);
xf0_scanFrameStretchSide->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * modelXf);
xf0_scanFrameStretchSide->Draw(flags);
CGraphics::SetModelMatrix(verticalFlip * horizontalFlip * modelXf);
xf0_scanFrameStretchSide->Draw(flags);
}
// cull faces
} }
void CPlayerVisor::DrawXRayEffect(const CStateManager&) const void CPlayerVisor::DrawXRayEffect(const CStateManager&) const
@ -576,7 +706,21 @@ void CPlayerVisor::Update(float dt, const CStateManager& mgr)
void CPlayerVisor::Draw(const CStateManager& mgr, const CTargetingManager* tgtManager) const void CPlayerVisor::Draw(const CStateManager& mgr, const CTargetingManager* tgtManager) const
{ {
CGraphics::SetAmbientColor(zeus::CColor::skWhite);
CGraphics::DisableAllLights();
switch (mgr.GetPlayerState()->GetActiveVisor(mgr))
{
case CPlayerState::EPlayerVisor::XRay:
DrawXRayEffect(mgr);
break;
case CPlayerState::EPlayerVisor::Thermal:
DrawThermalEffect(mgr);
break;
case CPlayerState::EPlayerVisor::Scan:
DrawScanEffect(mgr, tgtManager);
break;
default: break;
}
} }
void CPlayerVisor::Touch() void CPlayerVisor::Touch()

View File

@ -6,12 +6,12 @@
#include "zeus/CVector2f.hpp" #include "zeus/CVector2f.hpp"
#include "Audio/CSfxManager.hpp" #include "Audio/CSfxManager.hpp"
#include "CPlayerState.hpp" #include "CPlayerState.hpp"
#include "Graphics/CModel.hpp"
namespace urde namespace urde
{ {
class CStateManager; class CStateManager;
class CTargetingManager; class CTargetingManager;
class CModel;
namespace MP1 namespace MP1
{ {
@ -70,6 +70,8 @@ class CPlayerVisor
float x54c_frameColorInterp = 0.f; float x54c_frameColorInterp = 0.f;
float x550_frameColorImpulseInterp = 0.f; float x550_frameColorImpulseInterp = 0.f;
std::unique_ptr<CBooModel> m_newScanPaneInst;
int FindEmptyInactiveScanTarget() const; int FindEmptyInactiveScanTarget() const;
int FindCachedInactiveScanTarget(TUniqueId uid) const; int FindCachedInactiveScanTarget(TUniqueId uid) const;
bool DrawScanObjectIndicators(const CStateManager& mgr) const; bool DrawScanObjectIndicators(const CStateManager& mgr) const;

View File

@ -1,34 +1,118 @@
#include "CSamusFaceReflection.hpp" #include "CSamusFaceReflection.hpp"
#include "GameGlobalObjects.hpp" #include "GameGlobalObjects.hpp"
#include "CStateManager.hpp"
#include "TCastTo.hpp"
#include "Camera/CFirstPersonCamera.hpp"
#include "World/CPlayer.hpp"
#include "World/CWorld.hpp"
namespace urde namespace urde
{ {
namespace MP1 namespace MP1
{ {
static const zeus::CTransform PreXf = zeus::CTransform::Scale(0.3f) * zeus::CTransform::Translate(0.f, 0.5f, 0.f);
CSamusFaceReflection::CSamusFaceReflection(CStateManager& stateMgr) CSamusFaceReflection::CSamusFaceReflection(CStateManager& stateMgr)
: x0_modelData(CAnimRes(g_ResFactory->GetResourceIdByName("ACS_SamusFace")->id, : x0_modelData(CAnimRes(g_ResFactory->GetResourceIdByName("ACS_SamusFace")->id,
0, zeus::CVector3f::skOne, 0, true)), 0, zeus::CVector3f::skOne, 0, true)),
x4c_lights(std::make_unique<CActorLights>(8, zeus::CVector3f::skZero, 4, 4, false, 0, 0, 0.1f)) x4c_lights(std::make_unique<CActorLights>(8, zeus::CVector3f::skZero, 4, 4, false, 0, 0, 0.1f))
{ {
x60_ = zeus::CVector3f::skForward; x60_lookDir = zeus::CVector3f::skForward;
CAnimPlaybackParms parms(0, -1, 1.f, true); CAnimPlaybackParms parms(0, -1, 1.f, true);
x0_modelData.AnimationData()->SetAnimation(parms, false); x0_modelData.AnimationData()->SetAnimation(parms, false);
} }
void CSamusFaceReflection::PreDraw(const CStateManager& stateMgr) void CSamusFaceReflection::PreDraw(const CStateManager& mgr)
{ {
if (x6c_ != 2 && (x4c_lights->GetActiveLightCount() >= 1 || (x6c_ != 0 && x6c_ != 3)))
{
if (!TCastToConstPtr<CFirstPersonCamera>(mgr.GetCameraManager()->GetCurrentCamera(mgr)))
{
x70_hidden = true;
}
else
{
x70_hidden = false;
x0_modelData.AnimationData()->PreRender();
}
}
} }
void CSamusFaceReflection::Draw(const CStateManager& stateMgr) const void CSamusFaceReflection::Draw(const CStateManager& mgr) const
{ {
if (x70_hidden)
return;
if (TCastToConstPtr<CFirstPersonCamera> fpCam = (mgr.GetCameraManager()->GetCurrentCamera(mgr)))
{
zeus::CQuaternion camRot(fpCam->GetTransform().basis);
float dist = ITweakGui::FaceReflectionDistanceDebugValueToActualValue(g_tweakGui->GetFaceReflectionDistance());
float height = ITweakGui::FaceReflectionHeightDebugValueToActualValue(g_tweakGui->GetFaceReflectionHeight());
float aspect = ITweakGui::FaceReflectionAspectDebugValueToActualValue(g_tweakGui->GetFaceReflectionAspect());
float orthoWidth = ITweakGui::FaceReflectionOrthoWidthDebugValueToActualValue(g_tweakGui->GetFaceReflectionOrthoWidth());
float orthoHeight = ITweakGui::FaceReflectionOrthoHeightDebugValueToActualValue(g_tweakGui->GetFaceReflectionOrthoHeight());
zeus::CTransform modelXf =
zeus::CTransform(camRot * x50_lookRot,
fpCam->GetTransform().basis[1] * dist +
fpCam->GetTransform().origin +
fpCam->GetTransform().basis[2] * height) * PreXf;
CGraphics::SetViewPointMatrix(fpCam->GetTransform());
CGraphics::SetOrtho(aspect * -orthoWidth, aspect * orthoWidth,
orthoHeight, -orthoHeight, -10.f, 10.f);
CActorLights* lights = x6c_ == 1 ? nullptr : x4c_lights.get();
if (x6c_ == 3)
{
const_cast<CModelData&>(x0_modelData).Render(mgr, modelXf, lights, CModelFlags(0, 0, 3, zeus::CColor::skWhite));
}
else
{
float transFactor;
if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::Combat)
transFactor = mgr.GetPlayerState()->GetVisorTransitionFactor();
else
transFactor = 0.f;
if (transFactor > 0.f)
{
const_cast<CModelData&>(x0_modelData).Render(mgr, modelXf, nullptr, CModelFlags(7, 0, 3, zeus::CColor::skBlack));
const_cast<CModelData&>(x0_modelData).Render(mgr, modelXf, lights, CModelFlags(7, 0, 1, zeus::CColor(1.f, transFactor)));
}
}
}
} }
void CSamusFaceReflection::Update(float dt, const CStateManager& stateMgr, CRandom16& rand) void CSamusFaceReflection::Update(float dt, const CStateManager& mgr, CRandom16& rand)
{ {
if (TCastToConstPtr<CFirstPersonCamera> fpCam = (mgr.GetCameraManager()->GetCurrentCamera(mgr)))
{
x0_modelData.AdvanceAnimationIgnoreParticles(dt, rand, true);
x4c_lights->SetFindShadowLight(false);
TAreaId areaId = mgr.GetPlayer().GetAreaIdAlways();
if (areaId == kInvalidAreaId)
return;
zeus::CAABox aabb(fpCam->GetTranslation() - 0.125f, fpCam->GetTranslation() + 0.125f);
const CGameArea* area = mgr.GetWorld()->GetAreaAlways(areaId);
x4c_lights->BuildFaceLightList(mgr, *area, aabb);
zeus::CUnitVector3f lookDir(fpCam->GetTransform().basis[1]);
zeus::CUnitVector3f xfLook =
zeus::CQuaternion::lookAt(lookDir, zeus::CVector3f::skForward, 2.f * M_PIF).transform(x60_lookDir);
zeus::CQuaternion xfLook2 = zeus::CQuaternion::lookAt(zeus::CVector3f::skForward, xfLook, 2.f * M_PIF);
xfLook2 *= xfLook2;
zeus::CMatrix3f newXf(xfLook2);
zeus::CMatrix3f prevXf(x50_lookRot);
float lookDot = prevXf[1].dot(newXf[1]);
if (std::fabs(lookDot) > 1.f)
lookDot = lookDot > 0.f ? 1.f : -1.f;
float lookAng = std::acos(lookDot);
x50_lookRot = zeus::CQuaternion::slerp(x50_lookRot, xfLook2,
zeus::clamp(0.f, 18.f * dt * ((lookAng > 0.f) ? 0.5f * dt * g_tweakPlayer->GetHudLagAmount() / lookAng : 0.f), 1.f));
x60_lookDir = lookDir;
}
} }
} }

View File

@ -13,10 +13,10 @@ class CSamusFaceReflection
{ {
CModelData x0_modelData; CModelData x0_modelData;
std::unique_ptr<CActorLights> x4c_lights; std::unique_ptr<CActorLights> x4c_lights;
zeus::CQuaternion x50_; zeus::CQuaternion x50_lookRot;
zeus::CVector3f x60_; zeus::CVector3f x60_lookDir;
u32 x6c_ = 0; u32 x6c_ = 0;
bool x70_ = true; bool x70_hidden = true;
public: public:
CSamusFaceReflection(CStateManager& stateMgr); CSamusFaceReflection(CStateManager& stateMgr);
void PreDraw(const CStateManager& stateMgr); void PreDraw(const CStateManager& stateMgr);

View File

@ -1007,7 +1007,7 @@ void CGameArea::FillInStaticGeometry()
TToken<CModel> nullModel; TToken<CModel> nullModel;
inst.m_instance = std::make_unique<CBooModel> inst.m_instance = std::make_unique<CBooModel>
(nullModel, &inst.m_surfaces, x12c_postConstructed->m_materialSet, vtxFmt, vbo, ibo, (nullModel, &inst.m_surfaces, x12c_postConstructed->m_materialSet, vtxFmt, vbo, ibo,
hmdlMeta.weightCount, hmdlMeta.bankCount, inst.x34_aabb, inst.x0_visorFlags, 1); hmdlMeta.weightCount, hmdlMeta.bankCount, inst.x34_aabb, inst.x0_visorFlags, 1, nullptr);
} }
return true; return true;

View File

@ -167,7 +167,7 @@ public:
CWorld(IObjectStore& objStore, IFactory& resFactory, ResId mlvlId); CWorld(IObjectStore& objStore, IFactory& resFactory, ResId mlvlId);
bool DoesAreaExist(TAreaId area) const; bool DoesAreaExist(TAreaId area) const;
std::vector<std::unique_ptr<CGameArea>>& GetGameAreas() {return x18_areas;} const std::vector<std::unique_ptr<CGameArea>>& GetGameAreas() const { return x18_areas; }
const CMapWorld* GetMapWorld() const { return x28_mapWorld.GetObj(); } const CMapWorld* GetMapWorld() const { return x28_mapWorld.GetObj(); }
u32 GetRelayCount() const { return x2c_relays.size(); } u32 GetRelayCount() const { return x2c_relays.size(); }