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"
]
}
}
}