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 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-28 13:34:03 +09:00
co-authored by Claude Opus 5.5
parent d817bd7cab
commit 91ce13c3cf
4 changed files with 434 additions and 170 deletions
+1
View File
@@ -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"}
@@ -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"
]
}
}
}
@@ -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<DWORD>();
}
auto CGraphicMarkInstance::IsType(DWORD) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CGraphicMarkInstance::SetImageFileName(const char *) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicMarkInstance::GetImageFileName() -> const std::string &
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<const std::string &>();
}
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<bool>();
}
auto CGraphicMarkInstance::GetWidth() -> int
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
}
auto CGraphicMarkInstance::GetHeight() -> int
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
}
auto CGraphicMarkInstance::GetTexturePointer() -> CGraphicTexture *
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<CGraphicTexture *>();
}
auto CGraphicMarkInstance::GetTextureReference() const -> const CGraphicTexture &
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<const CGraphicTexture &>();
}
auto CGraphicMarkInstance::GetGraphicImagePointer() -> CGraphicImage *
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<CGraphicImage *>();
}
auto CGraphicMarkInstance::operator==(const CGraphicMarkInstance &) const -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
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<BOOL>();
}
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<CGraphicMarkInstance *>();
}
auto CGraphicMarkInstance::Delete(CGraphicMarkInstance *) -> void
{
MT_PLATFORM_STUB();
}
decltype(CGraphicMarkInstance::ms_kPool) CGraphicMarkInstance::ms_kPool{};
@@ -0,0 +1,256 @@
#include "StdAfx.h"
#include "GrpMarkInstance.h"
#include "StateManager.h"
#include "ResourceManager.h"
#include "../EterBase/CRC32.h"
CDynamicPool<CGraphicMarkInstance> 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<float>(MARK_WIDTH)*m_fScale;
float fRenderHeight= static_cast<float>(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<CGraphicImage*>(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();
}