Bug fixes and CAutoMapper mouse events

This commit is contained in:
Jack Andersen 2019-01-22 21:52:19 -10:00
parent aeb6a9a147
commit 137968ecc7
38 changed files with 275 additions and 118 deletions

View File

@ -731,8 +731,7 @@ void CNESEmulator::Draw(const zeus::CColor& mulColor, bool filtering) {
if (!EmulatorInst)
return;
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
float widthFac = NESAspect / aspect;
float widthFac = NESAspect / g_Viewport.aspect;
Uniform uniform = {zeus::CMatrix4f{}, mulColor};
uniform.m_matrix[0][0] = widthFac;

View File

@ -480,43 +480,20 @@ void CAutoMapper::ProcessMapRotateInput(const CFinalInput& input, const CStateMa
float down = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapCircleDown, input);
float left = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapCircleLeft, input);
float right = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapCircleRight, input);
int flags = 0x0;
if (up > 0.f)
flags |= 0x2;
if (down > 0.f)
flags |= 0x1;
if (left > 0.f)
flags |= 0x4;
if (right > 0.f)
flags |= 0x8;
switch (flags) {
case 1: // Down
x2e4_lStickPos = 1;
break;
case 2: // Up
x2e4_lStickPos = 5;
break;
case 4: // Left
x2e4_lStickPos = 3;
break;
case 5: // Down-Left
x2e4_lStickPos = 2;
break;
case 6: // Up-Left
x2e4_lStickPos = 4;
break;
case 8: // Right
x2e4_lStickPos = 7;
break;
case 9: // Down-Right
x2e4_lStickPos = 8;
break;
case 10: // Up-Right
x2e4_lStickPos = 6;
break;
default:
break;
bool mouseHeld = false;
if (const auto& kbm = input.GetKBM()) {
if (kbm->m_mouseButtons[int(boo::EMouseButton::Middle)]) {
mouseHeld = true;
if (float(m_mouseDelta.x()) < 0.f)
right += -m_mouseDelta.x();
else if (float(m_mouseDelta.x()) > 0.f)
left += m_mouseDelta.x();
if (float(m_mouseDelta.y()) < 0.f)
up += -m_mouseDelta.y();
else if (float(m_mouseDelta.y()) > 0.f)
down += m_mouseDelta.y();
}
}
float maxMag = up;
@ -537,9 +514,48 @@ void CAutoMapper::ProcessMapRotateInput(const CFinalInput& input, const CStateMa
float dirs[4] = {};
dirs[dirSlot] = maxMag;
if (dirs[0] > 0.f || dirs[1] > 0.f || dirs[2] > 0.f || dirs[3] > 0.f) {
if (dirs[0] > 0.f || dirs[1] > 0.f || dirs[2] > 0.f || dirs[3] > 0.f || mouseHeld) {
int flags = 0x0;
if (up > 0.f)
flags |= 0x2;
if (down > 0.f)
flags |= 0x1;
if (left > 0.f)
flags |= 0x4;
if (right > 0.f)
flags |= 0x8;
switch (flags) {
case 1: // Down
x2e4_lStickPos = 1;
break;
case 2: // Up
x2e4_lStickPos = 5;
break;
case 4: // Left
x2e4_lStickPos = 3;
break;
case 5: // Down-Left
x2e4_lStickPos = 2;
break;
case 6: // Up-Left
x2e4_lStickPos = 4;
break;
case 8: // Right
x2e4_lStickPos = 7;
break;
case 9: // Down-Right
x2e4_lStickPos = 8;
break;
case 10: // Up-Right
x2e4_lStickPos = 6;
break;
default:
break;
}
float deltaFrames = input.DeltaTime() * 60.f;
SetShouldRotatingSoundBePlaying(true);
SetShouldRotatingSoundBePlaying(dirs[0] > 0.f || dirs[1] > 0.f || dirs[2] > 0.f || dirs[3] > 0.f);
zeus::CEulerAngles eulers(xa8_renderStates[0].x8_camOrientation);
zeus::CRelAngle angX(eulers.x());
angX.makeRel();
@ -571,6 +587,7 @@ void CAutoMapper::ProcessMapRotateInput(const CFinalInput& input, const CStateMa
quat.rotateY(0.f);
xa8_renderStates[0].x8_camOrientation = quat;
} else {
x2e4_lStickPos = 0;
SetShouldRotatingSoundBePlaying(false);
}
}
@ -579,6 +596,18 @@ void CAutoMapper::ProcessMapZoomInput(const CFinalInput& input, const CStateMana
bool in = ControlMapper::GetDigitalInput(ControlMapper::ECommands::MapZoomIn, input);
bool out = ControlMapper::GetDigitalInput(ControlMapper::ECommands::MapZoomOut, input);
if (const auto& kbm = input.GetKBM()) {
m_mapScroll += kbm->m_accumScroll - m_lastAccumScroll;
m_lastAccumScroll = kbm->m_accumScroll;
if (m_mapScroll.delta[1] > 0.0) {
in = true;
m_mapScroll.delta[1] = std::max(0.0, m_mapScroll.delta[1] - (15.0 / 60.0));
} else if (m_mapScroll.delta[1] < 0.0) {
out = true;
m_mapScroll.delta[1] = std::min(0.0, m_mapScroll.delta[1] + (15.0 / 60.0));
}
}
EZoomState nextZoomState = EZoomState::None;
switch (x324_zoomState) {
case EZoomState::None:
@ -617,10 +646,7 @@ void CAutoMapper::ProcessMapZoomInput(const CFinalInput& input, const CStateMana
x324_zoomState = EZoomState::Out;
}
if (oldDist == xa8_renderStates[0].x18_camDist)
SetShouldZoomingSoundBePlaying(false);
else
SetShouldZoomingSoundBePlaying(true);
SetShouldZoomingSoundBePlaying(oldDist != xa8_renderStates[0].x18_camDist);
}
void CAutoMapper::ProcessMapPanInput(const CFinalInput& input, const CStateManager& mgr) {
@ -628,8 +654,24 @@ void CAutoMapper::ProcessMapPanInput(const CFinalInput& input, const CStateManag
float back = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapMoveBack, input);
float left = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapMoveLeft, input);
float right = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapMoveRight, input);
bool mouseHeld = false;
if (const auto& kbm = input.GetKBM()) {
if (kbm->m_mouseButtons[int(boo::EMouseButton::Primary)]) {
mouseHeld = true;
if (float(m_mouseDelta.x()) < 0.f)
right += -m_mouseDelta.x();
else if (float(m_mouseDelta.x()) > 0.f)
left += m_mouseDelta.x();
if (float(m_mouseDelta.y()) < 0.f)
forward += -m_mouseDelta.y();
else if (float(m_mouseDelta.y()) > 0.f)
back += m_mouseDelta.y();
}
}
zeus::CTransform camRot = xa8_renderStates[0].x8_camOrientation.toTransform();
if (forward > 0.f || back > 0.f || left > 0.f || right > 0.f) {
if (forward > 0.f || back > 0.f || left > 0.f || right > 0.f || mouseHeld) {
float deltaFrames = 60.f * input.DeltaTime();
float speed = GetFinalMapScreenCameraMoveSpeed();
int flags = 0x0;
@ -674,10 +716,7 @@ void CAutoMapper::ProcessMapPanInput(const CFinalInput& input, const CStateManag
zeus::CVector3f dirVec(right - left, 0.f, forward - back);
zeus::CVector3f deltaVec = camRot * (dirVec * deltaFrames * speed);
zeus::CVector3f newPoint = xa8_renderStates[0].x20_areaPoint + deltaVec;
if (deltaVec.magnitude() > input.DeltaTime())
SetShouldPanningSoundBePlaying(true);
else
SetShouldPanningSoundBePlaying(false);
SetShouldPanningSoundBePlaying(deltaVec.magnitude() > input.DeltaTime());
if (x1bc_state == EAutoMapperState::MapScreen) {
xa8_renderStates[0].x20_areaPoint = x24_world->IGetMapWorld()->ConstrainToWorldVolume(newPoint, camRot.basis[1]);
@ -688,6 +727,7 @@ void CAutoMapper::ProcessMapPanInput(const CFinalInput& input, const CStateManag
xa8_renderStates[0].x20_areaPoint = newPoint;
}
} else {
x2e8_rStickPos = 0;
SetShouldPanningSoundBePlaying(false);
float speed = g_tweakAutoMapper->GetCamPanUnitsPerFrame() * GetBaseMapScreenCameraMoveSpeed();
if (x1bc_state == EAutoMapperState::MapScreen) {
@ -764,11 +804,22 @@ void CAutoMapper::ProcessMapScreenInput(const CFinalInput& input, const CStateMa
if (input.PA() || input.PSpecialKey(boo::ESpecialKey::Enter))
x2f4_aButtonPos = 1;
if (IsInMapperState(EAutoMapperState::MapScreen) || IsInMapperState(EAutoMapperState::MapScreenUniverse)) {
x2e4_lStickPos = 0;
x2e8_rStickPos = 0;
if (IsInPlayerControlState()) {
x2ec_lTriggerPos = 0;
x2f0_rTriggerPos = 0;
if (const auto& kbm = input.GetKBM()) {
zeus::CVector2f mouseCoord = zeus::CVector2f(kbm->m_mouseCoord.norm[0], kbm->m_mouseCoord.norm[1]);
if (!m_lastMouseCoord) {
m_lastMouseCoord.emplace(mouseCoord);
} else {
m_mouseDelta = mouseCoord - *m_lastMouseCoord;
m_lastMouseCoord.emplace(mouseCoord);
m_mouseDelta.x() *= g_Viewport.aspect;
m_mouseDelta *= 100.f;
}
}
ProcessMapRotateInput(input, mgr);
ProcessMapZoomInput(input, mgr);
ProcessMapPanInput(input, mgr);
@ -919,6 +970,12 @@ float CAutoMapper::GetClampedMapScreenCameraDistance(float v) {
return zeus::clamp(g_tweakAutoMapper->GetMinCamDist(), v, g_tweakAutoMapper->GetMaxCamDist());
}
void CAutoMapper::MuteAllLoopedSounds() {
CSfxManager::SfxVolume(x1cc_panningSfx, 0.f);
CSfxManager::SfxVolume(x1d0_rotatingSfx, 0.f);
CSfxManager::SfxVolume(x1d4_zoomingSfx, 0.f);
}
void CAutoMapper::UnmuteAllLoopedSounds() {
CSfxManager::SfxVolume(x1cc_panningSfx, 1.f);
CSfxManager::SfxVolume(x1d0_rotatingSfx, 1.f);
@ -927,7 +984,7 @@ void CAutoMapper::UnmuteAllLoopedSounds() {
void CAutoMapper::ProcessControllerInput(const CFinalInput& input, CStateManager& mgr) {
if (!IsRenderStateInterpolating()) {
if (IsInMapperState(EAutoMapperState::MapScreen) || IsInMapperState(EAutoMapperState::MapScreenUniverse)) {
if (IsInPlayerControlState()) {
if (x32c_loadingDummyWorld)
CheckDummyWorldLoad(mgr);
else if (x1e0_hintSteps.size())
@ -1003,7 +1060,7 @@ void CAutoMapper::ProcessControllerInput(const CFinalInput& input, CStateManager
}
}
if (input.PY()) {
if (input.PY() || input.PKey(' ')) {
CPersistentOptions& sysOpts = g_GameState->SystemOptions();
switch (sysOpts.GetAutoMapperKeyState()) {
case 0:
@ -1110,7 +1167,7 @@ void CAutoMapper::Update(float dt, const CStateManager& mgr) {
x320_bottomPanePos = std::max(0.f, std::min(x320_bottomPanePos, 1.f));
if (x30c_basewidget_leftPane) {
float vpAspectRatio = std::max(1.78f, g_Viewport.x8_width / float(g_Viewport.xc_height));
float vpAspectRatio = std::max(1.78f, g_Viewport.aspect);
x30c_basewidget_leftPane->SetLocalTransform(
zeus::CTransform::Translate(x318_leftPanePos * vpAspectRatio * -9.f, 0.f, 0.f) *
x30c_basewidget_leftPane->GetTransform());

View File

@ -172,6 +172,11 @@ private:
u32 x328_ = 0;
bool x32c_loadingDummyWorld = false;
std::experimental::optional<zeus::CVector2f> m_lastMouseCoord;
zeus::CVector2f m_mouseDelta;
boo::SScrollDelta m_lastAccumScroll;
boo::SScrollDelta m_mapScroll;
template <class T>
static void SetResLockState(T& list, bool lock) {
for (auto& res : list)
@ -215,20 +220,20 @@ public:
CAutoMapper(CStateManager& stateMgr);
bool CheckLoadComplete();
bool CanLeaveMapScreen(const CStateManager&) const;
float GetMapRotationX() const;
float GetMapRotationZ() const;
u32 GetFocusAreaIndex() const;
CAssetId GetCurrWorldAssetId() const;
float GetMapRotationX() const { return xa8_renderStates[0].x1c_camAngle; }
float GetMapRotationZ() const { return xa8_renderStates[0].x8_camOrientation.yaw(); }
TAreaId GetFocusAreaIndex() const { return xa0_curAreaId; }
CAssetId GetCurrWorldAssetId() const { return x24_world->IGetWorldAssetId(); }
void SetCurWorldAssetId(CAssetId mlvlId);
void MuteAllLoopedSounds();
void UnmuteAllLoopedSounds();
void ProcessControllerInput(const CFinalInput&, CStateManager&);
bool IsInPlayerControlState() const;
bool IsInPlayerControlState() const {
return IsInMapperState(EAutoMapperState::MapScreen) || IsInMapperState(EAutoMapperState::MapScreenUniverse);
}
void Update(float dt, const CStateManager& mgr);
void Draw(const CStateManager&, const zeus::CTransform&, float) const;
bool IsInOrTransitioningToMapScreenState() const;
float GetTimeIntoInterpolation() const;
bool IsFullyInMapScreenState() const;
float GetTimeIntoInterpolation() const { return x1c8_interpTime; }
void BeginMapperStateTransition(EAutoMapperState, const CStateManager&);
void CompleteMapperStateTransition(const CStateManager&);
void ResetInterpolationTimer(float);

View File

@ -610,8 +610,7 @@ void CStateManager::ResetViewAfterDraw(const SViewport& backupViewport,
const CGameCamera* cam = x870_cameraManager->GetCurrentCamera(*this);
zeus::CFrustum frustum;
frustum.updatePlanes(backupViewMatrix, zeus::SProjPersp(zeus::degToRad(cam->GetFov()),
g_Viewport.x8_width / float(g_Viewport.xc_height),
frustum.updatePlanes(backupViewMatrix, zeus::SProjPersp(zeus::degToRad(cam->GetFov()), g_Viewport.aspect,
cam->GetNearClipDistance(), cam->GetFarClipDistance()));
g_Renderer->SetClippingPlanes(frustum);

View File

@ -393,6 +393,7 @@ void CGraphics::SetViewportResolution(const zeus::CVector2i& res) {
g_CroppedViewport.x10_height = res.y;
g_Viewport.x10_halfWidth = res.x / 2.f;
g_Viewport.x14_halfHeight = res.y / 2.f;
g_Viewport.aspect = res.x / float(res.y);
if (g_GuiSys)
g_GuiSys->OnViewportResize();
}

View File

@ -103,6 +103,7 @@ struct SViewport {
u32 xc_height;
float x10_halfWidth;
float x14_halfHeight;
float aspect;
};
extern SViewport g_Viewport;

View File

@ -15,11 +15,13 @@ float CLight::CalculateLightRadius() const {
if (x2c_distQ > FLT_EPSILON) {
if (intens <= FLT_EPSILON)
return 0.f;
return std::sqrt(intens / 5.f * intens / 255.f * x2c_distQ);
return std::sqrt(intens / (0.0588235f * x2c_distQ));
}
float nextIntens = 5.f * intens / 255.f;
return intens / std::min(0.2f, nextIntens) * x28_distL;
if (x28_distL > FLT_EPSILON)
return intens / (0.0588235f * x28_distL);
return 0.f;
}
float CLight::GetIntensity() const {

View File

@ -66,8 +66,7 @@ void CColoredQuadFilter::draw(const zeus::CColor& color, const zeus::CRectangle&
}
void CWideScreenFilter::draw(const zeus::CColor& color, float t) {
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
if (aspect < 1.7777f) {
if (g_Viewport.aspect < 1.7777f) {
float targetHeight = g_Viewport.x8_width / 1.7777f;
float delta = (g_Viewport.xc_height - targetHeight) * t / 2.f;
delta /= float(g_Viewport.xc_height);
@ -81,8 +80,7 @@ void CWideScreenFilter::draw(const zeus::CColor& color, float t) {
void CWideScreenFilter::DrawFilter(EFilterShape shape, const zeus::CColor& color, float t) {}
float CWideScreenFilter::SetViewportToMatch(float t) {
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
if (aspect < 1.7777f) {
if (g_Viewport.aspect < 1.7777f) {
float targetHeight = g_Viewport.x8_width / 1.7777f;
float delta = (g_Viewport.xc_height - targetHeight) * t / 2.f;
boo::SWindowRect rect = {};
@ -94,7 +92,7 @@ float CWideScreenFilter::SetViewportToMatch(float t) {
return 1.7777f;
} else {
SetViewportToFull();
return aspect;
return g_Viewport.aspect;
}
}

View File

@ -84,10 +84,10 @@ FOG_STRUCT_GLSL
" float angAtt = lights[i].angAtt[2] * angDot * angDot +\n"
" lights[i].angAtt[1] * angDot +\n"
" lights[i].angAtt[0];\n"
" ret += lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n"
" ret += lights[i].color * angAtt * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n"
" }\n"
" \n"
" return ret;\n"
" return clamp(ret, 0.0, 1.0);\n"
"}\n"sv;
static std::string_view LightingShadowGLSL =

View File

@ -83,7 +83,7 @@ FOG_STRUCT_HLSL
" float angAtt = lights[i].angAtt[2] * angDot * angDot +\n"
" lights[i].angAtt[1] * angDot +\n"
" lights[i].angAtt[0];\n"
" ret += lights[i].color * saturate(angAtt) * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" ret += lights[i].color * angAtt * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" }\n"
" \n"
" return ret;\n"

View File

@ -83,7 +83,7 @@ FOG_STRUCT_METAL
" float angAtt = lu.lights[i].angAtt[2] * angDot * angDot +\n"
" lu.lights[i].angAtt[1] * angDot +\n"
" lu.lights[i].angAtt[0];\n"
" ret += lu.lights[i].color * saturate(angAtt) * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" ret += lu.lights[i].color * angAtt * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" }\n"
" \n"
" return ret;\n"

View File

@ -40,7 +40,6 @@ void CPhazonSuitFilter::drawBlurPasses(float radius, const CTexture* indTex) {
{{1.f, -1.f, 0.f}, {1.f, 0.f}}};
m_blurVbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, blurVerts, sizeof(BlurVert), 4);
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
struct Vert {
zeus::CVector3f pos;
zeus::CVector2f screenUv;
@ -48,8 +47,8 @@ void CPhazonSuitFilter::drawBlurPasses(float radius, const CTexture* indTex) {
zeus::CVector2f maskUv;
} verts[4] = {{{-1.f, 1.f, 0.f}, {0.01f, 0.99f}, {0.f, 4.f}, {0.f, 1.f}},
{{-1.f, -1.f, 0.f}, {0.01f, 0.01f}, {0.f, 0.f}, {0.f, 0.f}},
{{1.f, 1.f, 0.f}, {0.99f, 0.99f}, {aspect * 4.f, 4.f}, {1.f, 1.f}},
{{1.f, -1.f, 0.f}, {0.99f, 0.01f}, {aspect * 4.f, 0.f}, {1.f, 0.f}}};
{{1.f, 1.f, 0.f}, {0.99f, 0.99f}, {g_Viewport.aspect * 4.f, 4.f}, {1.f, 1.f}},
{{1.f, -1.f, 0.f}, {0.99f, 0.01f}, {g_Viewport.aspect * 4.f, 0.f}, {1.f, 0.f}}};
m_vbo = ctx.newStaticBuffer(boo::BufferUse::Vertex, verts, sizeof(Vert), 4);
boo::ObjToken<boo::IGraphicsBuffer> bufs[] = {m_uniBufBlurX.get()};

View File

@ -232,8 +232,6 @@ bool CGuiFrame::ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDraw
m_inMouseDown = false;
m_inCancel = false;
if (m_mouseDownWidget == m_lastMouseOverWidget) {
if (m_mouseUpCb)
m_mouseUpCb(m_mouseDownWidget, false);
if (m_mouseDownWidget) {
if (CGuiTableGroup* p = static_cast<CGuiTableGroup*>(m_mouseDownWidget->GetParent())) {
if (p->GetWidgetTypeID() == FOURCC('TBGP')) {
@ -243,12 +241,21 @@ bool CGuiFrame::ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDraw
}
}
}
if (m_mouseUpCb)
m_mouseUpCb(m_mouseDownWidget, false);
}
}
}
return false;
}
void CGuiFrame::ResetMouseState() {
m_inMouseDown = false;
m_inCancel = false;
m_mouseDownWidget = nullptr;
m_lastMouseOverWidget = nullptr;
}
std::unique_ptr<CGuiFrame> CGuiFrame::CreateFrame(CAssetId frmeId, CGuiSys& sys, CInputStream& in, CSimplePool* sp) {
in.readInt32Big();
int a = in.readInt32Big();

View File

@ -96,6 +96,7 @@ public:
void LoadWidgetsInGame(CInputStream& in, CSimplePool* sp);
void ProcessUserInput(const CFinalInput& input) const;
bool ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms) const;
void ResetMouseState();
CGuiWidgetIdDB& GetWidgetIdDB() { return x18_idDB; }

View File

@ -74,20 +74,19 @@ void CGuiSys::OnViewportResize() {
}
void CGuiSys::ViewportResizeFrame(CGuiFrame* frame) {
float vpAspectRatio = g_Viewport.x8_width / float(g_Viewport.xc_height);
if (frame->m_aspectConstraint > 0.f) {
float hPad, vPad;
if (vpAspectRatio >= frame->m_aspectConstraint) {
hPad = frame->m_aspectConstraint / vpAspectRatio;
if (g_Viewport.aspect >= frame->m_aspectConstraint) {
hPad = frame->m_aspectConstraint / g_Viewport.aspect;
vPad = frame->m_aspectConstraint / 1.38f;
} else {
hPad = 1.f;
vPad = vpAspectRatio / 1.38f;
vPad = g_Viewport.aspect / 1.38f;
}
frame->m_aspectTransform = zeus::CTransform::Scale({hPad, 1.f, vPad});
} else if (frame->m_maxAspect > 0.f) {
if (vpAspectRatio > frame->m_maxAspect)
frame->m_aspectTransform = zeus::CTransform::Scale({frame->m_maxAspect / vpAspectRatio, 1.f, 1.f});
if (g_Viewport.aspect > frame->m_maxAspect)
frame->m_aspectTransform = zeus::CTransform::Scale({frame->m_maxAspect / g_Viewport.aspect, 1.f, 1.f});
else
frame->m_aspectTransform = zeus::CTransform::Identity();
}

View File

@ -72,7 +72,7 @@ void COrbitPointMarker::Draw(const CStateManager& mgr) const {
CGraphics::SetViewPointMatrix(camXf);
zeus::CFrustum frustum = mgr.SetupDrawFrustum(g_Viewport);
frustum.updatePlanes(camXf, zeus::SProjPersp(zeus::degToRad(curCam->GetFov()),
g_Viewport.x8_width / float(g_Viewport.xc_height), 1.f, 100.f));
g_Viewport.aspect, 1.f, 100.f));
g_Renderer->SetClippingPlanes(frustum);
g_Renderer->SetPerspective(curCam->GetFov(), g_Viewport.x8_width, g_Viewport.xc_height,
curCam->GetNearClipDistance(), curCam->GetFarClipDistance());

View File

@ -60,8 +60,7 @@ void CSplashScreen::Draw() const {
color.a() = x18_splashTimeout * 2.f;
zeus::CRectangle rect;
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
rect.size.x() = m_quad.GetTex()->GetWidth() / (480.f * aspect);
rect.size.x() = m_quad.GetTex()->GetWidth() / (480.f * g_Viewport.aspect);
rect.size.y() = m_quad.GetTex()->GetHeight() / 480.f;
rect.position.x() = 0.5f - rect.size.x() / 2.f;
rect.position.y() = 0.5f - rect.size.y() / 2.f;

View File

@ -26,7 +26,7 @@ void CTargetingManager::Draw(const CStateManager& mgr, bool hideLockon) const {
CGraphics::SetViewPointMatrix(camXf);
zeus::CFrustum frustum;
frustum.updatePlanes(camXf, zeus::SProjPersp(zeus::degToRad(curCam->GetFov()),
g_Viewport.x8_width / float(g_Viewport.xc_height), 1.f, 100.f));
g_Viewport.aspect, 1.f, 100.f));
g_Renderer->SetClippingPlanes(frustum);
g_Renderer->SetPerspective(curCam->GetFov(), g_Viewport.x8_width, g_Viewport.xc_height, curCam->GetNearClipDistance(),
curCam->GetFarClipDistance());

View File

@ -1359,7 +1359,7 @@ void CFrontEndUI::SNesEmulatorFrame::Draw(CSaveGameScreen* saveUi) const {
if (x10_remTime <= 0.f)
return;
if (xc_textSupport->GetIsTextSupportFinishedLoading()) {
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height) / 1.33f;
float aspect = g_Viewport.aspect / 1.33f;
CGraphics::SetOrtho(-320.f * aspect, 320.f * aspect, 240.f, -240.f, -4096.f, 4096.f);
CGraphics::SetViewPointMatrix(zeus::CTransform::Identity());
CGraphics::SetModelMatrix(zeus::CTransform::Translate(-220.f, 0.f, -200.f));
@ -1873,14 +1873,13 @@ void CFrontEndUI::Draw() const {
g_Renderer->SetViewportOrtho(false, -4096.f, 4096.f);
/* Correct movie aspect ratio */
float vpAspectRatio = g_Viewport.x8_width / float(g_Viewport.xc_height);
float hPad, vPad;
if (vpAspectRatio >= 1.78f) {
hPad = 1.78f / vpAspectRatio;
if (g_Viewport.aspect >= 1.78f) {
hPad = 1.78f / g_Viewport.aspect;
vPad = 1.78f / 1.33f;
} else {
hPad = 1.f;
vPad = vpAspectRatio / 1.33f;
vPad = g_Viewport.aspect / 1.33f;
}
if (xcc_curMoviePtr && xcc_curMoviePtr->GetIsFullyCached()) {

View File

@ -116,8 +116,17 @@ void CInventoryScreen::ProcessControllerInput(const CFinalInput& input) {
return;
float absViewInterp = std::fabs(viewInterp);
if (input.PY() && x19c_samusDoll->IsLoaded() && (absViewInterp > 0.f || x10_mode != EMode::TextScroll))
if ((input.PY() || ((m_bodyUpClicked || m_bodyClicked) && absViewInterp == 0.f)) &&
x19c_samusDoll->IsLoaded() && (absViewInterp > 0.f || x10_mode != EMode::TextScroll)) {
x19c_samusDoll->BeginViewInterpolate(absViewInterp == 0.f);
if (absViewInterp == 0.f) {
if (const auto& kbm = input.GetKBM()) {
m_lastMouseCoord = zeus::CVector2f(kbm->m_mouseCoord.norm[0], kbm->m_mouseCoord.norm[1]);
m_lastAccumScroll = kbm->m_accumScroll;
m_dollScroll = boo::SScrollDelta();
}
}
}
if (absViewInterp == 1.f) {
if (input.PStart()) {
@ -129,6 +138,8 @@ void CInventoryScreen::ProcessControllerInput(const CFinalInput& input) {
}
if (std::fabs(x19c_samusDoll->GetViewInterpolation()) > 0.f) {
CPauseScreenBase::ResetMouseState();
float motionAmt = input.DeltaTime() * 6.f;
float circleUp = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapCircleUp, input);
float circleDown = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapCircleDown, input);
@ -141,6 +152,48 @@ void CInventoryScreen::ProcessControllerInput(const CFinalInput& input) {
float zoomIn = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapZoomIn, input);
float zoomOut = ControlMapper::GetAnalogInput(ControlMapper::ECommands::MapZoomOut, input);
if (const auto& kbm = input.GetKBM()) {
zeus::CVector2f mouseCoord = zeus::CVector2f(kbm->m_mouseCoord.norm[0], kbm->m_mouseCoord.norm[1]);
zeus::CVector2f mouseDelta = mouseCoord - m_lastMouseCoord;
m_lastMouseCoord = mouseCoord;
mouseDelta.x() *= g_Viewport.aspect;
mouseDelta *= 100.f;
if (kbm->m_mouseButtons[int(boo::EMouseButton::Primary)]) {
if (float(mouseDelta.x()) < 0.f)
moveRight += -mouseDelta.x();
else if (float(mouseDelta.x()) > 0.f)
moveLeft += mouseDelta.x();
if (float(mouseDelta.y()) < 0.f)
moveForward += -mouseDelta.y();
else if (float(mouseDelta.y()) > 0.f)
moveBack += mouseDelta.y();
}
if (kbm->m_mouseButtons[int(boo::EMouseButton::Middle)]) {
if (float(mouseDelta.x()) < 0.f)
circleRight += -mouseDelta.x();
else if (float(mouseDelta.x()) > 0.f)
circleLeft += mouseDelta.x();
if (float(mouseDelta.y()) < 0.f)
circleUp += -mouseDelta.y();
else if (float(mouseDelta.y()) > 0.f)
circleDown += mouseDelta.y();
}
m_dollScroll += kbm->m_accumScroll - m_lastAccumScroll;
m_lastAccumScroll = kbm->m_accumScroll;
if (m_dollScroll.delta[1] > 0.0) {
zoomIn = 1.f;
m_dollScroll.delta[1] = std::max(0.0, m_dollScroll.delta[1] - (15.0 / 60.0));
} else if (m_dollScroll.delta[1] < 0.0) {
if (x19c_samusDoll->IsZoomedOut()) {
x19c_samusDoll->BeginViewInterpolate(false);
return;
}
zoomOut = 1.f;
m_dollScroll.delta[1] = std::min(0.0, m_dollScroll.delta[1] + (15.0 / 60.0));
}
}
zeus::CVector3f moveVec = {(moveRight - moveLeft) * 0.25f * motionAmt, (zoomIn - zoomOut) * 0.5f * motionAmt,
(moveForward - moveBack) * 0.25f * motionAmt};
x19c_samusDoll->SetOffset(moveVec, input.DeltaTime());

View File

@ -19,6 +19,10 @@ class CInventoryScreen : public CPauseScreenBase {
bool x1ac_textLeaveRequested = false;
bool x1ad_textViewing;
zeus::CVector2f m_lastMouseCoord;
boo::SScrollDelta m_lastAccumScroll;
boo::SScrollDelta m_dollScroll;
void UpdateSamusDollPulses();
bool HasLeftInventoryItem(int idx) const;
bool HasRightInventoryItem(int idx) const;

View File

@ -147,13 +147,17 @@ void COptionsScreen::Touch() {
void COptionsScreen::ProcessControllerInput(const CFinalInput& input) {
if (!x19c_quitGame) {
bool leftClicked = m_leftClicked;
bool rightClicked = m_rightClicked;
CPauseScreenBase::ProcessMouseInput(input, 0.f);
CPauseScreenBase::ProcessControllerInput(input);
CGameOptions::TryRestoreDefaults(input, x70_tablegroup_leftlog->GetUserSelection(), x1c_rightSel, false, false);
if (x70_tablegroup_leftlog->GetUserSelection() == 4 && (input.PA() ||
CGameOptions::TryRestoreDefaults(input, x70_tablegroup_leftlog->GetUserSelection(), x1c_rightSel, false,
rightClicked);
if (x70_tablegroup_leftlog->GetUserSelection() == 4 && (input.PA() || leftClicked ||
input.PSpecialKey(boo::ESpecialKey::Enter)))
x19c_quitGame = std::make_unique<CQuitGameScreen>(EQuitType::QuitGame);
} else {
CPauseScreenBase::ResetMouseState();
x19c_quitGame->ProcessUserInput(input);
}
}

View File

@ -223,9 +223,11 @@ void CPauseScreen::ProcessControllerInput(const CStateManager& mgr, const CFinal
}
x38_textpane_l1->TextSupport().SetText(
hecl::Format("&image=%8.8X;", u32(g_tweakPlayerRes->x74_lTrigger[useInput.DLTrigger() || m_lDown].Value())));
hecl::Format("&image=%8.8X;", u32(g_tweakPlayerRes->x74_lTrigger[
ControlMapper::GetDigitalInput(ControlMapper::ECommands::PreviousPauseScreen, useInput) || m_lDown].Value())));
x3c_textpane_r->TextSupport().SetText(
hecl::Format("&image=%8.8X;", u32(g_tweakPlayerRes->x80_rTrigger[useInput.DRTrigger() || m_rDown].Value())));
hecl::Format("&image=%8.8X;", u32(g_tweakPlayerRes->x80_rTrigger[
ControlMapper::GetDigitalInput(ControlMapper::ECommands::NextPauseScreen, useInput) || m_rDown].Value())));
x48_textpane_return->TextSupport().SetText(
hecl::Format("&image=%8.8X;", u32(g_tweakPlayerRes->x8c_startButton[useInput.DStart() || m_returnDown].Value())));
x50_textpane_back->TextSupport().SetText(

View File

@ -329,10 +329,21 @@ bool CPauseScreenBase::ProcessMouseInput(const CFinalInput& input, float yOff) {
m_bodyUpClicked = false;
m_bodyDownClicked = false;
m_bodyClicked = false;
m_leftClicked = false;
m_rightClicked = false;
CGuiWidgetDrawParms parms(1.f, zeus::CVector3f{0.f, 15.f * yOff, 0.f});
return x8_frame.ProcessMouseInput(input, parms);
}
void CPauseScreenBase::ResetMouseState() {
m_bodyUpClicked = false;
m_bodyDownClicked = false;
m_bodyClicked = false;
m_leftClicked = false;
m_rightClicked = false;
x8_frame.ResetMouseState();
}
void CPauseScreenBase::Draw(float mainAlpha, float frameAlpha, float yOff) {
zeus::CColor color = zeus::CColor::skWhite;
color.a() = mainAlpha * x14_alpha;
@ -415,6 +426,7 @@ void CPauseScreenBase::OnWidgetMouseUp(CGuiWidget* widget, bool cancel) {
/* Simulate change to right table if able */
if (ShouldLeftTableAdvance())
ChangeMode(EMode::RightTable, false);
m_leftClicked = true;
}
} else if (widget->GetParent() == x84_tablegroup_rightlog) {
if (m_isLogBook && x10_mode == EMode::TextScroll)
@ -439,6 +451,7 @@ void CPauseScreenBase::OnWidgetMouseUp(CGuiWidget* widget, bool cancel) {
m_playRightTableSfx = true;
/* Simulate change to text scroll if able */
OnRightTableAdvance(nullptr);
m_rightClicked = true;
}
} else if (widget == x174_textpane_body) {
m_bodyClicked = true;

View File

@ -82,6 +82,8 @@ protected:
bool m_bodyUpClicked : 1;
bool m_bodyDownClicked : 1;
bool m_bodyClicked : 1;
bool m_leftClicked : 1;
bool m_rightClicked : 1;
bool m_playRightTableSfx : 1;
};
u32 _dummy = 0;
@ -117,6 +119,7 @@ public:
virtual void Touch() {}
virtual void ProcessControllerInput(const CFinalInput& input);
bool ProcessMouseInput(const CFinalInput& input, float yOff);
void ResetMouseState();
virtual void Draw(float transInterp, float totalAlpha, float yOff);
virtual float GetCameraYBias() const { return 0.f; }
virtual bool VReady() const = 0;

View File

@ -44,9 +44,18 @@ void CQuitGameScreen::FinishedLoading() {
.SetText(g_MainStringTable->GetString(23));
x14_tablegroup_quitgame->SetUserSelection(DefaultSelections[int(x0_type)]);
x14_tablegroup_quitgame->SetWorkersMouseActive(true);
x10_loadedFrame->SetMouseUpCallback(std::bind(&CQuitGameScreen::OnWidgetMouseUp, this,
std::placeholders::_1, std::placeholders::_2));
SetColors();
}
void CQuitGameScreen::OnWidgetMouseUp(CGuiWidget* widget, bool cancel) {
if (!widget || cancel)
return;
DoAdvance(static_cast<CGuiTableGroup*>(widget->GetParent()));
}
void CQuitGameScreen::DoSelectionChange(CGuiTableGroup* caller, int oldSel) {
SetColors();
CSfxManager::SfxStart(SFXui_quit_change, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
@ -83,6 +92,8 @@ void CQuitGameScreen::ProcessUserInput(const CFinalInput& input) {
return;
if (!x10_loadedFrame)
return;
x10_loadedFrame->ProcessMouseInput(input,
CGuiWidgetDrawParms{1.f, zeus::CVector3f{0.f, 0.f, VerticalOffsets[int(x0_type)]}});
x10_loadedFrame->ProcessUserInput(input);
if ((input.PB() || input.PSpecialKey(boo::ESpecialKey::Esc)) && x0_type != EQuitType::ContinueFromLastSave)
x18_action = EQuitAction::No;

View File

@ -9,6 +9,7 @@ struct CFinalInput;
class CGuiFrame;
class CGuiTableGroup;
class CGuiTextPane;
class CGuiWidget;
namespace MP1 {
@ -27,6 +28,7 @@ class CQuitGameScreen {
public:
void FinishedLoading();
void OnWidgetMouseUp(CGuiWidget* widget, bool cancel);
void DoSelectionChange(CGuiTableGroup* caller, int oldSel);
void DoAdvance(CGuiTableGroup* caller);
EQuitAction Update(float dt);

View File

@ -102,6 +102,7 @@ public:
void SetPulseGrapple(bool b) { x270_28_pulseGrapple = b; }
void SetPulseBeam(bool b) { x270_27_pulseBeam = b; }
float GetViewInterpolation() const { return xc4_viewInterp; }
bool IsZoomedOut() const { return xc0_userZoom == -4.f; }
};
} // namespace MP1

View File

@ -1122,8 +1122,7 @@ void CSamusHud::Update(float dt, const CStateManager& mgr, CInGameGuiManager::EH
break;
}
float aspect = g_Viewport.x8_width / float(g_Viewport.xc_height);
float scaleMul = 1.f - zeus::clamp(0.f, (aspect - 1.33f) / (1.77f - 1.33f), 1.f);
float scaleMul = 1.f - zeus::clamp(0.f, (g_Viewport.aspect - 1.33f) / (1.77f - 1.33f), 1.f);
x500_viewportScale.y() = 1.f - scaleMul * morphT * g_tweakGui->GetBallViewportYReduction() * 1.2f;
if (x2b0_ballIntf)
x2b0_ballIntf->SetBallModeFactor(morphT);

View File

@ -54,7 +54,7 @@ s32 CFireFlea::sLightIdx = 0;
CFireFlea::CFireFlea(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
CModelData&& mData, const CActorParameters& actParms, const CPatternedInfo& pInfo, float f1)
: CPatterned(ECharacter::FireFlea, uid, name, EFlavorType::Zero, info, xf, std::move(mData), pInfo,
EMovementType::Flyer, EColliderType::One, EBodyType::NewFlyer, actParms, EKnockBackVariant::Small)
EMovementType::Flyer, EColliderType::One, EBodyType::Flyer, actParms, EKnockBackVariant::Small)
, x56c_(f1)
, xd8c_pathFind(nullptr, 2, pInfo.GetPathfindingIndex(), 1.f, 1.f) {
CMaterialFilter filter = GetMaterialFilter();
@ -145,7 +145,7 @@ zeus::CVector3f CFireFlea::FindSafeRoute(CStateManager& mgr, const zeus::CVector
zeus::CVector3f down = -up;
CRayCastResult res4 = mgr.RayStaticIntersection(GetTranslation(), down, 1.f,
CMaterialFilter::MakeInclude({EMaterialTypes::Solid}));
if (res4.IsValid()) {
if (res4.IsInvalid()) {
return mag * down;
} else {
return -forward;

View File

@ -882,7 +882,7 @@ void CPlayer::TakeDamage(bool significant, const zeus::CVector3f& location, floa
CSfxManager::SfxStop(x770_damageLoopSfx);
x770_damageLoopSfx.reset();
}
x770_damageLoopSfx = CSfxManager::SfxStart(suitDamageSfx, 1.f, 0.f, false, 0x7f, true, kInvalidAreaId);
CSfxManager::SfxStart(suitDamageSfx, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
x788_damageLoopSfxId = suitDamageSfx;
xa2c_damageLoopSfxDelayTicks = 0;
doRumble = true;

View File

@ -138,11 +138,11 @@ CModelFlags CScriptColorModulate::CalculateFlags(const zeus::CColor& col) const
ret.x1_matSetIdx = 0;
ret.x2_flags = x54_26_depthCompare << 0 | x54_27_depthUpdate << 1 | 0x8;
ret.x4_color = col;
} else if (x48_blendMode == EBlendMode::Opaque2) {
} else if (x48_blendMode == EBlendMode::OpaqueAdd) {
ret.x0_blendMode = 2;
ret.x1_matSetIdx = 0;
ret.x2_flags = x54_26_depthCompare << 0 | x54_27_depthUpdate << 1 | 0x8;
ret.x4_color = col;
ret.addColor = col;
} else {
ret.x2_flags = 3;
ret.x4_color = zeus::CColor::skWhite;
@ -182,11 +182,11 @@ CModelFlags CScriptColorModulate::CalculateFlags(const zeus::CColor& col) const
ret.x2_flags = x54_26_depthCompare << 0 | x54_27_depthUpdate << 1;
ret.x4_color = col;
}
} else if (x48_blendMode == EBlendMode::Opaque2) {
} else if (x48_blendMode == EBlendMode::OpaqueAdd) {
ret.x0_blendMode = 2;
ret.x1_matSetIdx = 0;
ret.x2_flags = x54_26_depthCompare << 0 | x54_27_depthUpdate << 1;
ret.x4_color = col;
ret.addColor = col;
} else {
ret.x2_flags = 3;
ret.x4_color = zeus::CColor::skWhite;

View File

@ -12,7 +12,7 @@ public:
Additive,
Additive2,
Opaque,
Opaque2,
OpaqueAdd,
};
enum class EFadeState { A2B, B2A };

View File

@ -262,8 +262,7 @@ void CWorldTransManager::DrawEnabled() {
void CWorldTransManager::DrawDisabled() { m_fadeToBlack.draw(zeus::CColor{0.f, 0.f, 0.f, 0.01f}); }
void CWorldTransManager::DrawText() {
float vpAspectRatio = g_Viewport.x8_width / float(g_Viewport.xc_height);
float width = 448.f * vpAspectRatio;
float width = 448.f * g_Viewport.aspect;
CGraphics::SetOrtho(0.f, width, 448.f, 0.f, -4096.f, 4096.f);
CGraphics::SetViewPointMatrix(zeus::CTransform::Identity());
CGraphics::SetModelMatrix(zeus::CTransform::Translate((width - 640.f) / 2.f, 0.f, 448.f));

View File

@ -210,7 +210,7 @@ static const char* FS =
" float angAtt = lights[i].angAtt[2] * angDot * angDot +\n"
" lights[i].angAtt[1] * angDot +\n"
" lights[i].angAtt[0];\n"
" ret += lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta).xyz, mvNormIn), 0.0, 1.0);\n"
" ret += lights[i].color * angAtt * att * clamp(dot(normalize(-delta).xyz, mvNormIn), 0.0, 1.0);\n"
" }\n"
" \n"
" return ret;\n"

View File

@ -246,7 +246,7 @@ static const char* FS =
" float angAtt = lights[i].angAtt[2] * angDot * angDot +\n"
" lights[i].angAtt[1] * angDot +\n"
" lights[i].angAtt[0];\n"
" ret += lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n"
" ret += lights[i].color * angAtt * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" }\n"
" \n"
" return ret;\n"

View File

@ -230,7 +230,7 @@ static const char* FS =
" float angAtt = lu.lights[i].angAtt[2] * angDot * angDot +\n"
" lu.lights[i].angAtt[1] * angDot +\n"
" lu.lights[i].angAtt[0];\n"
" ret += lu.lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n"
" ret += lu.lights[i].color * angAtt * att * saturate(dot(normalize(-delta), mvNormIn));\n"
" }\n"
" \n"
" return ret;\n"

2
amuse

@ -1 +1 @@
Subproject commit 7719459ac700a88e67192379770cf38a2d84e7c0
Subproject commit d80f1346bb7f2b1849e8512d3b2f024c4e428c76