Files
metin2-client/extension/src/platform/EterLib/GrpScreen.cpp
T
shenleiandClaude Opus 5.5 070a27b2cb port: P3-d PythonTextTail + textTail module (1:1 40250)
Copy PythonTextTail.cpp/PythonTextTailModule.cpp verbatim, drop the pending
stand-in and the textTail module stub, register initTextTail() after
initChat() and call CPythonTextTail::Initialize() in Create as 40250 does.
Implement CScreen::ProjectPosition/UnprojectPosition (were stubs) with
D3DXVec3Project/Unproject, and ApplicationStringTable_GetString(DWORD) over
UserInterface.rc's English string table. port.login_flow projects the ground
item's name tail in an ALT frame and picks it back by screen position.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:10:41 +09:00

365 lines
8.7 KiB
C++

// Platform skeleton for EterLib/GrpScreen.h (40250 EterLib/GrpScreen.cpp), generated by platform_stub.py.
// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation.
#include "EterLib/StdAfx.h"
#include "EterLib/GrpScreen.h"
#include "EterLib/StateManager.h"
#include "../PlatformStub.h"
#include "UIRenderCommands.h"
#include <algorithm>
// 40250 GrpScreen.cpp:838
CScreen::CScreen()
{
}
CScreen::~CScreen()
{
}
auto CScreen::ClearDepthBuffer() -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::Clear() -> void
{
MT_PLATFORM_STUB();
}
// 40250 GrpScreen.cpp:691. CPythonApplication::Process brackets the frame's render with Begin/End; only
// inside the scene does CStateManager hand transforms to the recording device.
bool CScreen::Begin()
{
assert(ms_lpd3dDevice != NULL);
ResetFaceCount();
if (!STATEMANAGER.BeginScene())
{
Tracenf("BeginScene FAILED\n");
return false;
}
return true;
}
// 40250 GrpScreen.cpp:705
void CScreen::End()
{
STATEMANAGER.EndScene();
}
auto CScreen::Show(HWND) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::Show(RECT *) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::Show(RECT *, HWND) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderLine2d(float sx, float sy, float ex, float ey, float) -> void
{
UIRenderAdd({UIRenderCommand::Line, sx, sy, ex, ey, ms_diffuseColor});
}
auto CScreen::RenderBox2d(float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderBar2d(float sx, float sy, float ex, float ey, float) -> void
{
UIRenderAdd({UIRenderCommand::Bar, sx, sy, ex, ey, ms_diffuseColor});
}
auto CScreen::RenderGradationBar2d(float, float, float, float, DWORD, DWORD, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderCircle2d(float, float, float, float, int) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderCircle3d(float, float, float, float, int) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderLine3d(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderBox3d(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderBar3d(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderBar3d(const D3DXVECTOR3 *) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderGradationBar3d(float, float, float, float, float, float, DWORD, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderLineCube(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderCube(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderCube(float, float, float, float, float, float, D3DXMATRIX) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderTextureBox(float, float, float, float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderBillboard(D3DXVECTOR3 *, D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::DrawMinorGrid(float, float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::DrawGrid(float, float, float, float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderD3DXMesh(LPD3DXMESH, const D3DXMATRIX *, float, float, float, float, D3DFILLMODE) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderSphere(const D3DXMATRIX *, float, float, float, float, D3DFILLMODE) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::RenderCylinder(const D3DXMATRIX *, float, float, float, float, float, D3DFILLMODE) -> void
{
MT_PLATFORM_STUB();
}
// 40250 GrpScreen.cpp
void CScreen::SetColorOperation()
{
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
// 40250 GrpScreen.cpp
void CScreen::SetDiffuseOperation()
{
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
// 40250 GrpScreen.cpp
void CScreen::SetBlendOperation()
{
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
auto CScreen::SetOneColorOperation(D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::SetAddColorOperation(D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::SetDiffuseColor(DWORD color) -> void
{
ms_diffuseColor = color;
}
auto CScreen::SetDiffuseColor(float r, float g, float b, float a) -> void
{
auto channel = [](float value) -> DWORD {
return static_cast<DWORD>(std::clamp(value, 0.0f, 1.0f) * 255.0f + 0.5f);
};
ms_diffuseColor = (channel(a) << 24) | (channel(r) << 16) | (channel(g) << 8) | channel(b);
}
auto CScreen::SetClearColor(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::SetClearDepth(float) -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::SetClearStencil(DWORD) -> void
{
MT_PLATFORM_STUB();
}
// 40250 GrpScreen.cpp:487, verbatim: the pick ray through the cursor.
void CScreen::SetCursorPosition(int x, int y, int hres, int vres)
{
D3DXVECTOR3 v;
v.x = -(((2.0f * x) / hres) - 1) / ms_matProj._11;
v.y = (((2.0f * y) / vres) - 1) / ms_matProj._22;
v.z = 1.0f;
D3DXMATRIX matViewInverse=ms_matInverseView;
//D3DXMatrixInverse(&matViewInverse, NULL, &ms_matView);
ms_vtPickRayDir.x = v.x * matViewInverse._11 +
v.y * matViewInverse._21 +
v.z * matViewInverse._31;
ms_vtPickRayDir.y = v.x * matViewInverse._12 +
v.y * matViewInverse._22 +
v.z * matViewInverse._32;
ms_vtPickRayDir.z = v.x * matViewInverse._13 +
v.y * matViewInverse._23 +
v.z * matViewInverse._33;
ms_vtPickRayOrig.x = matViewInverse._41;
ms_vtPickRayOrig.y = matViewInverse._42;
ms_vtPickRayOrig.z = matViewInverse._43;
ms_Ray.SetStartPoint(ms_vtPickRayOrig);
ms_Ray.SetDirection(-ms_vtPickRayDir, 51200.0f);
}
auto CScreen::GetCursorPosition(float *, float *, float *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CScreen::GetCursorXYPosition(float *, float *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CScreen::GetCursorZPosition(float *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CScreen::GetPickingPosition(float, float *, float *, float *) -> void
{
MT_PLATFORM_STUB();
}
// 40250 GrpScreen.cpp:749-779.
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY)
{
D3DXVECTOR3 Input(x, y, z);
D3DXVECTOR3 Output;
D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);
*pfX = Output.x;
*pfY = Output.y;
}
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
D3DXVECTOR3 Input(x, y, z);
D3DXVECTOR3 Output;
D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);
*pfX = Output.x;
*pfY = Output.y;
*pfZ = Output.z;
}
void CScreen::UnprojectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
D3DXVECTOR3 Input(x, y, z);
D3DXVECTOR3 Output;
D3DXVec3Unproject(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);
*pfX = Output.x;
*pfY = Output.y;
*pfZ = Output.z;
}
auto CScreen::IsLostDevice() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CScreen::RestoreDevice() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CScreen::BuildViewFrustum() -> void
{
MT_PLATFORM_STUB();
}
auto CScreen::Identity() -> void
{
MT_PLATFORM_STUB();
}
decltype(CScreen::ms_diffuseColor) CScreen::ms_diffuseColor{};
decltype(CScreen::ms_clearColor) CScreen::ms_clearColor{};
decltype(CScreen::ms_clearStencil) CScreen::ms_clearStencil{};
decltype(CScreen::ms_clearDepth) CScreen::ms_clearDepth{};
decltype(CScreen::ms_frustum) CScreen::ms_frustum{};