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
@@ -0,0 +1,158 @@
{
"reference": "EterGrnLib/ModelInstanceModel.cpp",
"reference_sha256": "33c0a231e97a833564808c29677fbcdf5b82f0baf0784e657ccbf069931fdddd",
"priority": "P4",
"contracts": [],
"functions": {
"CGrannyModelInstance::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::Clear"
]
},
"CGrannyModelInstance::SetMainModelPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::SetMainModelPointer"
]
},
"CGrannyModelInstance::SetLinkedModelPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::SetLinkedModelPointer"
]
},
"CGrannyModelInstance::__GetWorldPosePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__GetWorldPosePtr"
]
},
"CGrannyModelInstance::__GetMeshBoneIndices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__GetMeshBoneIndices"
]
},
"CGrannyModelInstance::__CreateMeshBindingVector": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__CreateMeshBindingVector"
]
},
"CGrannyModelInstance::__DestroyMeshBindingVector": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__DestroyMeshBindingVector"
]
},
"CGrannyModelInstance::__CreateWorldPose": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__CreateWorldPose"
]
},
"CGrannyModelInstance::__DestroyWorldPose": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__DestroyWorldPose"
]
},
"CGrannyModelInstance::__CreateModelInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__CreateModelInstance"
]
},
"CGrannyModelInstance::__DestroyModelInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__DestroyModelInstance"
]
},
"CGrannyModelInstance::__CreateMeshMatrices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__CreateMeshMatrices"
]
},
"CGrannyModelInstance::__DestroyMeshMatrices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__DestroyMeshMatrices"
]
},
"CGrannyModelInstance::GetDeformableVertexCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::GetDeformableVertexCount"
]
},
"CGrannyModelInstance::GetVertexCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::GetVertexCount"
]
},
"CGrannyModelInstance::__SetSharedDeformableVertexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__SetSharedDeformableVertexBuffer"
]
},
"CGrannyModelInstance::__IsDeformableVertexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__IsDeformableVertexBuffer"
]
},
"CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr"
]
},
"CGrannyModelInstance::__GetDeformableVertexBufferRef": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__GetDeformableVertexBufferRef"
]
},
"CGrannyModelInstance::__CreateDynamicVertexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__CreateDynamicVertexBuffer"
]
},
"CGrannyModelInstance::__DestroyDynamicVertexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::__DestroyDynamicVertexBuffer"
]
},
"CGrannyModelInstance::GetBoneIndexByName": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::GetBoneIndexByName"
]
},
"CGrannyModelInstance::GetBoneMatrixPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::GetBoneMatrixPointer"
]
},
"CGrannyModelInstance::GetCompositeBoneMatrixPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::GetCompositeBoneMatrixPointer"
]
},
"CGrannyModelInstance::ReloadTexture": {
"status": "PORTED",
"impl": [
"extension/src/port/EterGrnLib/ModelInstanceModel.cpp:CGrannyModelInstance::ReloadTexture"
]
}
}
}