From 91ce13c3cf36454c348de0d165801ebbc4fb2ab0 Mon Sep 17 00:00:00 2001 From: shenlei Date: Mon, 28 Sep 2026 13:34:03 +0900 Subject: [PATCH] EterLib: port GrpMarkInstance.cpp verbatim Replace the platform_stub skeleton (every member unimplemented) with the 40250 source, so guild marks in text tails and mark boxes load and draw. Co-Authored-By: Claude Opus 5.5 --- audit/history.jsonl | 1 + .../port-map/EterLib/GrpMarkInstance.cpp.json | 177 ++++++++++++ .../src/platform/EterLib/GrpMarkInstance.cpp | 170 ------------ .../src/port/EterLib/GrpMarkInstance.cpp | 256 ++++++++++++++++++ 4 files changed, 434 insertions(+), 170 deletions(-) create mode 100644 audit/port-map/EterLib/GrpMarkInstance.cpp.json delete mode 100644 extension/src/platform/EterLib/GrpMarkInstance.cpp create mode 100644 extension/src/port/EterLib/GrpMarkInstance.cpp diff --git a/audit/history.jsonl b/audit/history.jsonl index dab38bab..cb83ccec 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -562,3 +562,4 @@ {"date": "2026-09-28T04:02:30+00:00", "unit": "EterLib/LensFlare.cpp + ScreenFilter.cpp + Decal.cpp", "action": "unit C (part 1): platform stubs removed, 40250 sources copied verbatim (GL code is commented out in 40250 too); CMapOutdoor callers were already ported, so lens flare, screen filter and CDecal clipping (TerrainDecal) now run", "evidence": "ctest 35/35 (login_live excluded); fake-server frame 900 vs unit B mean abs diff 0.014/255; flare/filter visuals NEEDS_LIVE"} {"date": "2026-09-28T04:05:55+00:00", "unit": "EterLib/GrpShadowTexture.cpp + character shadow render target (RecordingDevice)", "action": "unit C part 2 / unit D: GrpShadowTexture stub replaced with verbatim 40250 copy (dead in 40250); CPU shadow-target rasterizer kept (flat TFACTOR pass, output-equivalent) and switched to the D3D top-left fill rule; Vulkan offscreen targets not needed since snow blur is hard-disabled in 40250", "evidence": "ctest 35/35 (login_live excluded); fake-server frame 900 vs previous mean abs diff 0.013/255 (frame noise); shadow parity NEEDS_LIVE"} {"date": "2026-09-28T04:31:20+00:00", "unit": "SpeedTreeLib/SpeedTreeWrapper.cpp + SpeedTreeForest.cpp + SpeedTreeForestDirectX8.cpp (+ CSpeedTreeRT stand-in)", "action": "unit E: platform proxy tree renderer deleted; 40250 wrapper/forest/DirectX8 copied verbatim (with SpeedTreeConfig.h, VertexShaders.h); SDK SpeedTreeRT.h public API as shim, closed CSpeedTreeRT reimplemented in platform/SpeedTreeLib/SpeedTreeRT.cpp (procedural geometry kept, DIVERGENT); D3D8 vertex-shader decl tokens, D3D_OK, CreateVertexShader/DeleteVertexShader, ID3DXBuffer/D3DXAssembleShader, MessageBox, __min/__max added to shims", "evidence": "ctest 35/35 (login_live excluded); fake-server frame 900 at spawn vs unit D mean abs diff ~3.2/255 (area-name fade + anim phase, no trees in view); spawn moved next to a tree (temporary) shows trunk/branches/leaf cards drawn by the wrapper; tree visuals NEEDS_LIVE"} +{"date": "2026-09-28T04:34:02+00:00", "unit": "EterLib/GrpMarkInstance.cpp", "action": "unit F: platform_stub skeleton deleted (every member was MT_PLATFORM_STUB), 40250 source copied verbatim; guild marks (PythonTextTail, PythonWindow CMarkBox) now load and draw", "evidence": "ctest 35/35 (login_live excluded); mark rendering NEEDS_LIVE"} diff --git a/audit/port-map/EterLib/GrpMarkInstance.cpp.json b/audit/port-map/EterLib/GrpMarkInstance.cpp.json new file mode 100644 index 00000000..73fa186a --- /dev/null +++ b/audit/port-map/EterLib/GrpMarkInstance.cpp.json @@ -0,0 +1,177 @@ +{ + "reference": "EterLib/GrpMarkInstance.cpp", + "reference_sha256": "fde2ac70258a3314a265be8c473c23967ef555b030ee43272f0415e9e0e11ff3", + "priority": "P4", + "contracts": [], + "functions": { + "CGraphicMarkInstance::SetImageFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetImageFileName" + ] + }, + "CGraphicMarkInstance::GetImageFileName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetImageFileName" + ] + }, + "CGraphicMarkInstance::CreateSystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::CreateSystem" + ] + }, + "CGraphicMarkInstance::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::DestroySystem" + ] + }, + "CGraphicMarkInstance::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::New" + ] + }, + "CGraphicMarkInstance::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Delete" + ] + }, + "CGraphicMarkInstance::Render": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Render" + ] + }, + "CGraphicMarkInstance::OnRender": { + "status": "NEEDS_LIVE", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::OnRender" + ], + "note": "verbatim; guild-mark quads in text tails/guild window need a live guild with an uploaded mark (fake server has no mark image)" + }, + "CGraphicMarkInstance::GetTextureReference": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetTextureReference" + ] + }, + "CGraphicMarkInstance::GetTexturePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetTexturePointer" + ] + }, + "CGraphicMarkInstance::GetGraphicImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetGraphicImagePointer" + ] + }, + "CGraphicMarkInstance::SetScale": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetScale" + ] + }, + "CGraphicMarkInstance::SetIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetIndex" + ] + }, + "CGraphicMarkInstance::GetWidth": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetWidth" + ] + }, + "CGraphicMarkInstance::GetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::GetHeight" + ] + }, + "CGraphicMarkInstance::SetDiffuseColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetDiffuseColor" + ] + }, + "CGraphicMarkInstance::SetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetPosition" + ] + }, + "CGraphicMarkInstance::Load": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Load" + ] + }, + "CGraphicMarkInstance::SetImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::SetImagePointer" + ] + }, + "CGraphicMarkInstance::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::IsEmpty" + ] + }, + "CGraphicMarkInstance::Type": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Type" + ] + }, + "CGraphicMarkInstance::IsType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::IsType" + ] + }, + "CGraphicMarkInstance::OnIsType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::OnIsType" + ] + }, + "CGraphicMarkInstance::OnSetImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::OnSetImagePointer" + ] + }, + "CGraphicMarkInstance::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Initialize" + ] + }, + "CGraphicMarkInstance::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::Destroy" + ] + }, + "CGraphicMarkInstance::CGraphicMarkInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::CGraphicMarkInstance" + ] + }, + "CGraphicMarkInstance::~CGraphicMarkInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterLib/GrpMarkInstance.cpp:CGraphicMarkInstance::~CGraphicMarkInstance" + ] + } + } +} diff --git a/extension/src/platform/EterLib/GrpMarkInstance.cpp b/extension/src/platform/EterLib/GrpMarkInstance.cpp deleted file mode 100644 index 5886f9c6..00000000 --- a/extension/src/platform/EterLib/GrpMarkInstance.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// Platform skeleton for EterLib/GrpMarkInstance.h (40250 EterLib/GrpMarkInstance.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/GrpMarkInstance.h" - -#include "../PlatformStub.h" - -auto CGraphicMarkInstance::Type() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::IsType(DWORD) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::SetImageFileName(const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::GetImageFileName() -> const std::string & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -CGraphicMarkInstance::CGraphicMarkInstance() -{ - MT_PLATFORM_STUB(); -} - -CGraphicMarkInstance::~CGraphicMarkInstance() -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::Render() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::SetDepth(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::SetDiffuseColor(float, float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::SetPosition(float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::SetIndex(UINT) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::SetScale(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::Load() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::IsEmpty() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::GetWidth() -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::GetHeight() -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::GetTexturePointer() -> CGraphicTexture * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::GetTextureReference() const -> const CGraphicTexture & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::GetGraphicImagePointer() -> CGraphicImage * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::operator==(const CGraphicMarkInstance &) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::OnRender() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::OnSetImagePointer() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::OnIsType(DWORD) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::SetImagePointer(CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::CreateSystem(UINT) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::DestroySystem() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicMarkInstance::New() -> CGraphicMarkInstance * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicMarkInstance::Delete(CGraphicMarkInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -decltype(CGraphicMarkInstance::ms_kPool) CGraphicMarkInstance::ms_kPool{}; diff --git a/extension/src/port/EterLib/GrpMarkInstance.cpp b/extension/src/port/EterLib/GrpMarkInstance.cpp new file mode 100644 index 00000000..fa573e2c --- /dev/null +++ b/extension/src/port/EterLib/GrpMarkInstance.cpp @@ -0,0 +1,256 @@ +#include "StdAfx.h" +#include "GrpMarkInstance.h" +#include "StateManager.h" +#include "ResourceManager.h" + +#include "../EterBase/CRC32.h" + +CDynamicPool CGraphicMarkInstance::ms_kPool; + +void CGraphicMarkInstance::SetImageFileName(const char* c_szFileName) +{ + m_stImageFileName = c_szFileName; +} + +const std::string& CGraphicMarkInstance::GetImageFileName() +{ + return m_stImageFileName; +} + +void CGraphicMarkInstance::CreateSystem(UINT uCapacity) +{ + ms_kPool.Create(uCapacity); +} + +void CGraphicMarkInstance::DestroySystem() +{ + ms_kPool.Destroy(); +} + +CGraphicMarkInstance* CGraphicMarkInstance::New() +{ + return ms_kPool.Alloc(); +} + +void CGraphicMarkInstance::Delete(CGraphicMarkInstance* pkImgInst) +{ + pkImgInst->Destroy(); + ms_kPool.Free(pkImgInst); +} + +void CGraphicMarkInstance::Render() +{ + if (IsEmpty()) + return; + + assert(!IsEmpty()); + + OnRender(); +} + +void CGraphicMarkInstance::OnRender() +{ + CGraphicImage * pImage = m_roImage.GetPointer(); + CGraphicTexture * pTexture = pImage->GetTexturePointer(); + + UINT uColCount = pImage->GetWidth() / MARK_WIDTH; + + if (uColCount == 0) + return; + + UINT uCol = m_uIndex % uColCount; + UINT uRow = m_uIndex / uColCount; + + RECT kRect; + kRect.left=uCol*MARK_WIDTH; + kRect.top=uRow*MARK_HEIGHT; + kRect.right=kRect.left+MARK_WIDTH; + kRect.bottom=kRect.top+MARK_HEIGHT; + + float texReverseWidth = 1.0f / float(pTexture->GetWidth()); + float texReverseHeight = 1.0f / float(pTexture->GetHeight()); + float su = kRect.left * texReverseWidth; + float sv = kRect.top * texReverseHeight; + float eu = kRect.right * texReverseWidth; + float ev = kRect.bottom * texReverseHeight; + + float fRenderWidth=static_cast(MARK_WIDTH)*m_fScale; + float fRenderHeight= static_cast(MARK_HEIGHT)*m_fScale; + + TPDTVertex vertices[4]; + vertices[0].position.x = m_v2Position.x-0.5f; + vertices[0].position.y = m_v2Position.y-0.5f; + vertices[0].position.z = 0.0f; + vertices[0].texCoord = TTextureCoordinate(su, sv); + vertices[0].diffuse = m_DiffuseColor; + + vertices[1].position.x = m_v2Position.x + fRenderWidth -0.5f; + vertices[1].position.y = m_v2Position.y-0.5f; + vertices[1].position.z = 0.0f; + vertices[1].texCoord = TTextureCoordinate(eu, sv); + vertices[1].diffuse = m_DiffuseColor; + + vertices[2].position.x = m_v2Position.x-0.5f; + vertices[2].position.y = m_v2Position.y + fRenderHeight -0.5f; + vertices[2].position.z = 0.0f; + vertices[2].texCoord = TTextureCoordinate(su, ev); + vertices[2].diffuse = m_DiffuseColor; + + vertices[3].position.x = m_v2Position.x + fRenderWidth -0.5f; + vertices[3].position.y = m_v2Position.y + fRenderHeight -0.5f; + vertices[3].position.z = 0.0f; + vertices[3].texCoord = TTextureCoordinate(eu, ev); + vertices[3].diffuse = m_DiffuseColor; + + if (CGraphicBase::SetPDTStream(vertices, 4)) + { + CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT); + + STATEMANAGER.SetTexture(0, pTexture->GetD3DTexture()); + STATEMANAGER.SetTexture(1, NULL); + STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1); + STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 4, 0, 2); + //OLD: STATEMANAGER.DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, c_FillRectIndices, D3DFMT_INDEX16, vertices, sizeof(TPDTVertex)); + } +} + +const CGraphicTexture & CGraphicMarkInstance::GetTextureReference() const +{ + return m_roImage->GetTextureReference(); +} + +CGraphicTexture * CGraphicMarkInstance::GetTexturePointer() +{ + return m_roImage->GetTexturePointer(); +} + +CGraphicImage * CGraphicMarkInstance::GetGraphicImagePointer() +{ + return m_roImage.GetPointer(); +} + +void CGraphicMarkInstance::SetScale(float fScale) +{ + m_fScale=fScale; +} + +void CGraphicMarkInstance::SetIndex(UINT uIndex) +{ + m_uIndex=uIndex; +} + +int CGraphicMarkInstance::GetWidth() +{ + if (IsEmpty()) + return 0; + + //return m_roImage->GetWidth(); + return 16; +} + +int CGraphicMarkInstance::GetHeight() +{ + if (IsEmpty()) + return 0; + + //return m_roImage->GetHeight(); + return 12; +} + +void CGraphicMarkInstance::SetDiffuseColor(float fr, float fg, float fb, float fa) +{ + m_DiffuseColor.r = fr; + m_DiffuseColor.g = fg; + m_DiffuseColor.b = fb; + m_DiffuseColor.a = fa; +} + +void CGraphicMarkInstance::SetPosition(float fx, float fy) +{ + m_v2Position.x = fx; + m_v2Position.y = fy; +} + +void CGraphicMarkInstance::Load() +{ + if (GetImageFileName().empty()) + return; + + CResource * pResource = CResourceManager::Instance().GetResourcePointer(GetImageFileName().c_str()); + + if (!pResource) + { + TraceError("CGraphicMarkinstance::Load - [%s] NOT EXIST", GetImageFileName().c_str()); + return; + } + + if (pResource->IsType(CGraphicImage::Type())) + SetImagePointer(static_cast(pResource)); +} + +void CGraphicMarkInstance::SetImagePointer(CGraphicImage * pImage) +{ + m_roImage.SetPointer(pImage); + + OnSetImagePointer(); +} + +bool CGraphicMarkInstance::IsEmpty() const +{ + if (!m_roImage.IsNull() && !m_roImage->IsEmpty()) + return false; + + return true; +} + +bool CGraphicMarkInstance::operator == (const CGraphicMarkInstance & rhs) const +{ + return (m_roImage.GetPointer() == rhs.m_roImage.GetPointer()); +} + +DWORD CGraphicMarkInstance::Type() +{ + static DWORD s_dwType = GetCRC32("CGraphicMarkInstance", strlen("CGraphicMarkInstance")); + return (s_dwType); +} + +BOOL CGraphicMarkInstance::IsType(DWORD dwType) +{ + return OnIsType(dwType); +} + +BOOL CGraphicMarkInstance::OnIsType(DWORD dwType) +{ + if (CGraphicMarkInstance::Type() == dwType) + return TRUE; + + return FALSE; +} + +void CGraphicMarkInstance::OnSetImagePointer() +{ +} + +void CGraphicMarkInstance::Initialize() +{ + m_DiffuseColor.r = m_DiffuseColor.g = m_DiffuseColor.b = m_DiffuseColor.a = 1.0f; + m_v2Position.x = m_v2Position.y = 0.0f; + m_uIndex = 0; + m_fScale = 1.0f; +} + +void CGraphicMarkInstance::Destroy() +{ + m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함. + Initialize(); +} + +CGraphicMarkInstance::CGraphicMarkInstance() +{ + Initialize(); +} + +CGraphicMarkInstance::~CGraphicMarkInstance() +{ + Destroy(); +}