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,212 @@
{
"reference": "EterLib/CollisionData.cpp",
"reference_sha256": "fab6fd82a68e8b974702d24fd0f6f68be7481f1e08db7627bccd88b656dfc647",
"priority": "P4",
"contracts": [],
"functions": {
"DestroyCollisionInstanceSystem": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:DestroyCollisionInstanceSystem"
]
},
"CBaseCollisionInstance::BuildCollisionInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CBaseCollisionInstance::BuildCollisionInstance"
]
},
"CBaseCollisionInstance::Destroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CBaseCollisionInstance::Destroy"
]
},
"CSphereCollisionInstance::GetAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::GetAttribute"
]
},
"CSphereCollisionInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::Render"
]
},
"CSphereCollisionInstance::OnDestroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnDestroy"
]
},
"CSphereCollisionInstance::OnMovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnMovementCollisionDynamicSphere"
]
},
"CSphereCollisionInstance::OnCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnCollisionDynamicSphere"
]
},
"CSphereCollisionInstance::OnGetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnGetCollisionMovementAdjust"
]
},
"CPlaneCollisionInstance::GetAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::GetAttribute"
]
},
"CPlaneCollisionInstance::OnMovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnMovementCollisionDynamicSphere"
]
},
"CPlaneCollisionInstance::OnCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnCollisionDynamicSphere"
]
},
"CPlaneCollisionInstance::OnGetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnGetCollisionMovementAdjust"
]
},
"CPlaneCollisionInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::Render"
]
},
"CPlaneCollisionInstance::OnDestroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnDestroy"
]
},
"CCylinderCollisionInstance::GetAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::GetAttribute"
]
},
"CCylinderCollisionInstance::CollideCylinderVSDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::CollideCylinderVSDynamicSphere"
]
},
"CCylinderCollisionInstance::OnMovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnMovementCollisionDynamicSphere"
]
},
"CCylinderCollisionInstance::OnCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnCollisionDynamicSphere"
]
},
"CCylinderCollisionInstance::OnGetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnGetCollisionMovementAdjust"
]
},
"CCylinderCollisionInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::Render"
]
},
"CCylinderCollisionInstance::OnDestroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnDestroy"
]
},
"CAABBCollisionInstance::GetAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::GetAttribute"
]
},
"CAABBCollisionInstance::OnMovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnMovementCollisionDynamicSphere"
]
},
"CAABBCollisionInstance::OnCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnCollisionDynamicSphere"
]
},
"CAABBCollisionInstance::OnGetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnGetCollisionMovementAdjust"
]
},
"CAABBCollisionInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::Render"
]
},
"CAABBCollisionInstance::OnDestroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnDestroy"
]
},
"COBBCollisionInstance::GetAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::GetAttribute"
]
},
"COBBCollisionInstance::OnMovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnMovementCollisionDynamicSphere"
]
},
"COBBCollisionInstance::OnCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnCollisionDynamicSphere"
]
},
"COBBCollisionInstance::OnGetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnGetCollisionMovementAdjust"
]
},
"COBBCollisionInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::Render"
]
},
"COBBCollisionInstance::OnDestroy": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnDestroy"
]
}
}
}
@@ -0,0 +1,62 @@
{
"reference": "EterLib/GrpCollisionObject.cpp",
"reference_sha256": "911a796b466fe60910def8d88631b5db5dacbf7709871ae955f8ac3e056fe31b",
"priority": "P4",
"contracts": [],
"functions": {
"CGraphicCollisionObject::IntersectBoundBox": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectBoundBox"
]
},
"CGraphicCollisionObject::IntersectCube": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectCube"
]
},
"CGraphicCollisionObject::IntersectIndexedMesh": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectIndexedMesh"
]
},
"CGraphicCollisionObject::IntersectMesh": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectMesh"
]
},
"CGraphicCollisionObject::IntersectTriangle": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectTriangle"
]
},
"CGraphicCollisionObject::IntersectSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectSphere"
]
},
"CGraphicCollisionObject::IntersectCylinder": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectCylinder"
]
},
"CGraphicCollisionObject::CGraphicCollisionObject": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::CGraphicCollisionObject"
]
},
"CGraphicCollisionObject::~CGraphicCollisionObject": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::~CGraphicCollisionObject"
]
}
}
}
@@ -0,0 +1,290 @@
{
"reference": "EterLib/GrpObjectInstance.cpp",
"reference_sha256": "cae9c29b006be59602b9915796fcdd10f2dd320f6969dd5b9f21d08868f015d8",
"priority": "P4",
"contracts": [],
"functions": {
"CGraphicObjectInstance::OnInitialize": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::OnInitialize"
]
},
"CGraphicObjectInstance::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Clear"
]
},
"CGraphicObjectInstance::Render": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Render"
]
},
"CGraphicObjectInstance::BlendRender": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::BlendRender"
]
},
"CGraphicObjectInstance::RenderToShadowMap": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderToShadowMap"
]
},
"CGraphicObjectInstance::RenderShadow": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderShadow"
]
},
"CGraphicObjectInstance::RenderPCBlocker": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderPCBlocker"
]
},
"CGraphicObjectInstance::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Update"
]
},
"CGraphicObjectInstance::Deform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Deform"
]
},
"CGraphicObjectInstance::Transform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Transform"
]
},
"CGraphicObjectInstance::GetPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPosition"
]
},
"CGraphicObjectInstance::GetScale": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetScale"
]
},
"CGraphicObjectInstance::GetRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetRotation"
]
},
"CGraphicObjectInstance::GetYaw": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetYaw"
]
},
"CGraphicObjectInstance::GetPitch": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPitch"
]
},
"CGraphicObjectInstance::GetRoll": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetRoll"
]
},
"CGraphicObjectInstance::GetTransform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetTransform"
]
},
"CGraphicObjectInstance::SetRotationQuaternion": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotationQuaternion"
]
},
"CGraphicObjectInstance::SetRotationMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotationMatrix"
]
},
"CGraphicObjectInstance::SetRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotation"
]
},
"CGraphicObjectInstance::SetPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetPosition"
]
},
"CGraphicObjectInstance::SetScale": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetScale"
]
},
"CGraphicObjectInstance::Show": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Show"
]
},
"CGraphicObjectInstance::Hide": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Hide"
]
},
"CGraphicObjectInstance::isShow": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::isShow"
]
},
"CGraphicObjectInstance::GetWTBBoxVertex": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetWTBBoxVertex"
]
},
"CGraphicObjectInstance::isIntersect": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::isIntersect"
]
},
"CGraphicObjectInstance::CGraphicObjectInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::CGraphicObjectInstance"
]
},
"CGraphicObjectInstance::Initialize": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Initialize"
]
},
"CGraphicObjectInstance::~CGraphicObjectInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::~CGraphicObjectInstance"
]
},
"CGraphicObjectInstance::UpdateBoundingSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateBoundingSphere"
]
},
"CGraphicObjectInstance::RegisterBoundingSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RegisterBoundingSphere"
]
},
"CGraphicObjectInstance::AddCollision": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::AddCollision"
]
},
"CGraphicObjectInstance::ClearCollision": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::ClearCollision"
]
},
"CGraphicObjectInstance::CollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::CollisionDynamicSphere"
]
},
"CGraphicObjectInstance::MovementCollisionDynamicSphere": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::MovementCollisionDynamicSphere"
]
},
"CGraphicObjectInstance::GetCollisionMovementAdjust": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionMovementAdjust"
]
},
"CGraphicObjectInstance::UpdateCollisionData": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateCollisionData"
]
},
"CGraphicObjectInstance::GetCollisionInstanceCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionInstanceCount"
]
},
"CGraphicObjectInstance::GetCollisionInstanceData": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionInstanceData"
]
},
"CGraphicObjectInstance::SetHeightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetHeightInstance"
]
},
"CGraphicObjectInstance::ClearHeightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::ClearHeightInstance"
]
},
"CGraphicObjectInstance::UpdateHeightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateHeightInstance"
]
},
"CGraphicObjectInstance::IsObjectHeight": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::IsObjectHeight"
]
},
"CGraphicObjectInstance::GetObjectHeight": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetObjectHeight"
]
},
"CGraphicObjectInstance::SetPortal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetPortal"
]
},
"CGraphicObjectInstance::GetPortal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPortal"
]
}
}
}