port EterLib LensFlare/ScreenFilter/Decal verbatim (unit C part 1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-28 13:02:40 +09:00
co-authored by Claude Opus 5.5
parent 96ea03d0a0
commit 5be37b6363
10 changed files with 1172 additions and 192 deletions
+1
View File
@@ -559,3 +559,4 @@
{"date": "2026-09-28T01:35:06+00:00", "unit": "GameLib/MapOutdoorRenderHTP.cpp", "action": "match 40250 lighting state in terrain splat passes: unlit base textures, temporary lit shadow pass, white fog color only for shadow pass", "evidence": "reference MapOutdoorRenderHTP.cpp non-WORLD_EDITOR branch; native fake-server scene rerun pending"}
{"date": "2026-09-28T03:54:13+00:00", "unit": "EterLib/GrpScreen.cpp + native D3D8 fixed-function emulation (RecordingDevice / native_render)", "action": "unit A: D3D8 texcoord generation + D3DTS_TEXTUREn in shader (CPU uv baking removed), 8-light D3D lighting (no attenuation clamp, spot theta/2 phi/2, emissive source, NORMALIZENORMALS, inverse-transpose normals), 8-bit alpha test, clears in draw order, dynamic D3D viewport + MinZ/MaxZ, black back-buffer clear, white default diffuse, alpha blend mirrors colour factors; removed sphere-map and multiplicative-shadow hacks; CScreen ms_clearDepth/ms_diffuseColor initialisers fixed to 40250 values; capture v8; --screenshot-out readback", "evidence": "ctest 35/35 (login_live excluded); mt_native_render fake-server 240/900-frame screenshots vs baseline: game frame mean abs diff 0.55/255, char select model now placed by introselect.py grp.SetViewport(270/w,...); Windows reference frame pending (NEEDS_LIVE)"}
{"date": "2026-09-28T03:59:30+00:00", "unit": "EterLib/GrpLightManager.cpp", "action": "unit B: platform stub removed, 40250 GrpLightManager.cpp copied verbatim into port/ (port_copy.py); CPythonApplication::Create now calls m_LightManager.Initialize() (40250 :1263) so light IDs start at skip index 1; 40250 never calls FlushLight/RestoreLight, so no device-light change", "evidence": "ctest 35/35 (login_live excluded); fake-server frame 900 vs baseline mean abs diff 0.21/255"}
{"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"}
+56
View File
@@ -0,0 +1,56 @@
{
"reference": "EterLib/Decal.cpp",
"reference_sha256": "eb168acde9da2224ef64d6dee14ccc675ee0e633e8d843f2d02ad905d016391a",
"priority": "P4",
"contracts": [],
"functions": {
"CDecal::CDecal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::CDecal"
]
},
"CDecal::~CDecal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::~CDecal"
]
},
"CDecal::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::Clear"
]
},
"CDecal::ClipMesh": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::ClipMesh"
]
},
"CDecal::AddPolygon": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::AddPolygon"
]
},
"CDecal::ClipPolygon": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::ClipPolygon"
]
},
"CDecal::ClipPolygonAgainstPlane": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::ClipPolygonAgainstPlane"
]
},
"CDecal::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/Decal.cpp:CDecal::Render"
]
}
}
}
+132
View File
@@ -0,0 +1,132 @@
{
"reference": "EterLib/LensFlare.cpp",
"reference_sha256": "844534f423925fd0250f49f86898da5b02e55882bcca9e972ccba5cabb310cae",
"priority": "P4",
"contracts": [],
"functions": {
"CLensFlare::CLensFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::CLensFlare"
]
},
"CLensFlare::~CLensFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::~CLensFlare"
]
},
"CLensFlare::Interpolate": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::Interpolate"
]
},
"CLensFlare::Compute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::Compute"
]
},
"CLensFlare::DrawBeforeFlare": {
"status": "NEEDS_LIVE",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::DrawBeforeFlare"
],
"note": "verbatim; on-screen result needs the Windows reference frame"
},
"CLensFlare::DrawAfterFlare": {
"status": "NEEDS_LIVE",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::DrawAfterFlare"
],
"note": "verbatim; on-screen result needs the Windows reference frame"
},
"CLensFlare::SetMainFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::SetMainFlare"
]
},
"CLensFlare::DrawFlare": {
"status": "NEEDS_LIVE",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::DrawFlare"
],
"note": "verbatim; on-screen result needs the Windows reference frame"
},
"CLensFlare::CharacterizeFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::CharacterizeFlare"
]
},
"CLensFlare::Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::Initialize"
]
},
"CLensFlare::SetFlareLocation": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::SetFlareLocation"
]
},
"CLensFlare::SetBrightnesses": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::SetBrightnesses"
]
},
"CLensFlare::ReadControlPixels": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::ReadControlPixels"
]
},
"CLensFlare::AdjustBrightness": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::AdjustBrightness"
]
},
"CLensFlare::ReadDepthPixels": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::ReadDepthPixels"
],
"note": "body is commented out in 40250; kept empty"
},
"CLensFlare::ClampBrightness": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CLensFlare::ClampBrightness"
]
},
"CFlare::CFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CFlare::CFlare"
]
},
"CFlare::~CFlare": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CFlare::~CFlare"
]
},
"CFlare::Init": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CFlare::Init"
]
},
"CFlare::Draw": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/LensFlare.cpp:CFlare::Draw"
]
}
}
}
@@ -0,0 +1,45 @@
{
"reference": "EterLib/ScreenFilter.cpp",
"reference_sha256": "9a1faf7801b9848d9757a7cbe61903f025e6c7217ed37b2de5208ae97950a289",
"priority": "P4",
"contracts": [],
"functions": {
"CScreenFilter::Render": {
"status": "NEEDS_LIVE",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::Render"
],
"note": "verbatim full-screen blend quad; on-screen result needs the Windows reference frame"
},
"CScreenFilter::SetEnable": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::SetEnable"
]
},
"CScreenFilter::SetBlendType": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::SetBlendType"
]
},
"CScreenFilter::SetColor": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::SetColor"
]
},
"CScreenFilter::CScreenFilter": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::CScreenFilter"
]
},
"CScreenFilter::~CScreenFilter": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/ScreenFilter.cpp:CScreenFilter::~CScreenFilter"
]
}
}
}