port 2V2-d.2: Granny runtime on libgr2, main character model animates

Implement the Granny SDK 2.11 API the client uses on top of libgr2
(platform/EterGrnLib/GrannyRuntime.cpp, shim granny.h declared from the
SDK header): file sections, type-definition vertex conversion, material
textures by Usage, mesh/bone bindings, deformer, control clock/loop/ease
and weighted SRT sampling. Port EterGrnLib (LODController, Material, Mesh,
Model, ModelInstance*, Motion, Thing, ThingInstance, Util) plus EterLib
GrpObjectInstance/GrpCollisionObject/CollisionData verbatim and drop their
platform skeletons and pending stand-ins; register the gr2 resource
factory; vertex/index buffers are CPU-side until the 2V2-e render adapter.

app.UpdateGame/RenderGame now run 40250's bodies, reaching the
CPythonApplication members through their singletons (the platform has no
app object); CPythonGraphic joins GameSingletons in member order, and
GetMousePosition reads the host cursor.

port.login_flow asserts the main instance's PART_MAIN model has meshes,
its diffuse image loaded and the WAIT motion moves the bones between
frames; offline and live pass, port_gate macos PASS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 19:43:27 +09:00
co-authored by Claude Opus 5.5
parent 5266b00c6e
commit 668f48d6ec
74 changed files with 11404 additions and 2356 deletions
+182
View File
@@ -0,0 +1,182 @@
{
"reference": "EterGrnLib/Model.cpp",
"reference_sha256": "8784ac8445e4fe9bafc223829f95ad7088772aaff59c1f770088de86ed7dd4ba",
"priority": "P4",
"contracts": [],
"functions": {
"CGrannyModel::GetMaterialPalette": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetMaterialPalette"
]
},
"CGrannyModel::GetMeshNodeList": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetMeshNodeList"
]
},
"CGrannyModel::GetMeshPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetMeshPointer"
]
},
"CGrannyModel::CanDeformPNTVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::CanDeformPNTVertices"
]
},
"CGrannyModel::DeformPNTVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::DeformPNTVertices"
]
},
"CGrannyModel::GetRigidVertexCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetRigidVertexCount"
]
},
"CGrannyModel::GetDeformVertexCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetDeformVertexCount"
]
},
"CGrannyModel::GetVertexCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetVertexCount"
]
},
"CGrannyModel::GetMeshCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetMeshCount"
]
},
"CGrannyModel::GetGrannyModelPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetGrannyModelPointer"
]
},
"CGrannyModel::GetD3DIndexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetD3DIndexBuffer"
]
},
"CGrannyModel::GetPNTD3DVertexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetPNTD3DVertexBuffer"
]
},
"CGrannyModel::LockVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::LockVertices"
]
},
"CGrannyModel::UnlockVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::UnlockVertices"
]
},
"CGrannyModel::LoadPNTVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::LoadPNTVertices"
]
},
"CGrannyModel::LoadIndices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::LoadIndices"
]
},
"CGrannyModel::LoadMeshs": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::LoadMeshs"
]
},
"CGrannyModel::CheckMeshIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::CheckMeshIndex"
]
},
"CGrannyModel::AppendMeshNode": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::AppendMeshNode"
]
},
"CGrannyModel::CreateFromGrannyModelPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::CreateFromGrannyModelPointer"
]
},
"CGrannyModel::GetIdxCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::GetIdxCount"
]
},
"CGrannyModel::CreateDeviceObjects": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::CreateDeviceObjects"
]
},
"CGrannyModel::DestroyDeviceObjects": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::DestroyDeviceObjects"
]
},
"CGrannyModel::IsEmpty": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::IsEmpty"
]
},
"CGrannyModel::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::Destroy"
]
},
"CGrannyModel::__LoadVertices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::__LoadVertices"
]
},
"CGrannyModel::Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::Initialize"
]
},
"CGrannyModel::CGrannyModel": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::CGrannyModel"
]
},
"CGrannyModel::~CGrannyModel": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/Model.cpp:CGrannyModel::~CGrannyModel"
]
}
}
}