diff --git a/audit/history.jsonl b/audit/history.jsonl index 2da3c1e7..721b1f8d 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -516,3 +516,4 @@ {"time": "2026-09-23T09:19:19Z", "event": "port_round", "unit": "PORT-PLAN 2V2-b: PhaseGame dispatch + Entergame burst", "ported": ["UserInterface/PythonNetworkStreamPhaseGame.cpp", "UserInterface/PythonNetworkStreamPhaseGameActor.cpp", "UserInterface/PythonNetworkStreamPhaseGameItem.cpp", "UserInterface/PythonNetworkStreamCommand.cpp", "UserInterface/NetworkActorManager.cpp", "UserInterface/PythonChat.cpp", "UserInterface/PythonChatModule.cpp"], "adapted": ["GameSingletons in PythonBoot (CPythonApplication member order, calloc storage) for units still behind platform/pending stand-ins", "platform_stub.py pending: stand-ins generated from undefined symbols", "PlatformStub const char* stand-ins return \"\"", "EterBase TraceErrorObserver test hook"], "divergent": [], "needs_live": ["CreateInstance of every actor fails on the SetRace placeholder (2V2-d)"], "tests": ["port.login_flow: pass (fake server sends the CInputLogin::Entergame order: ADD/ADDITIONAL_INFO/UPDATE, NPC_POSITION, PHASE_GAME, LAND_LIST, TIME, CHANNEL, CHAT notice, PING -> PONG; notice reaches CPythonChat; no Unknown packet header)", "port.login_live: pass against 192.168.21.203 (10 s of the real game phase, connected, no unknown packet)", "script/port_gate.sh macos: PASS"], "todo": ["2V2-c chrmgr/chr modules", "2V2-d SetRace/RaceData", "2V2-e render"]} {"time": "2026-09-23T09:39:22Z", "event": "port_round", "unit": "PORT-PLAN 2V2-c: chrmgr/chr modules + race registration chain", "ported": ["UserInterface/PythonCharacterManagerModule.cpp", "UserInterface/PythonCharacterModule.cpp", "GameLib/RaceData.cpp", "GameLib/RaceDataFile.cpp", "GameLib/RaceManager.cpp", "GameLib/RaceMotionData.cpp", "GameLib/GameType.cpp", "EterLib/AttributeData.cpp", "EterLib/AttributeInstance.cpp", "EterLib/TextFileLoader.cpp", "EterLib/Util.cpp (lines 1-141, 297-end)", "EterLib/Camera.cpp", "UserInterface/CameraProcedure.cpp"], "adapted": ["EterLib/Util.cpp code page / font face stays with the platform font backend", "CRaceManager created in PythonBoot in CPythonApplication member order", "D3DXVec2CCW / D3DXMatrixfDeterminant / D3DXMatrixLookAtRH"], "divergent": [], "needs_live": ["intermittent (about 1 in 11 live runs) unhandled header 7 in the Loading phase, suspected packet-size desync; the test now prints g_iLastPacket and fails; 8 later runs clean"], "tests": ["port.login_flow: pass (chr/chrmgr not stubs, race 0 MODE_GENERAL/NAME_WAIT registered, no unhandled packet header)", "port.login_live: 8/8 pass against 192.168.21.203", "script/port_gate.sh macos: PASS"], "todo": ["2V2-d gr2 loader + CGraphicThing adapter, InstanceBase/ActorInstance stand-ins", "2V2-e render", "Loading-phase header 7 desync"]} {"time": "2026-09-23T10:56:00Z", "event": "port_round", "unit": "PORT-PLAN 2V2-d.1: ActorInstance/InstanceBase closure, main character instance", "ported": ["GameLib/ActorInstance.cpp", "GameLib/ActorInstanceAttach.cpp", "GameLib/ActorInstanceBattle.cpp", "GameLib/ActorInstanceBlend.cpp", "GameLib/ActorInstanceCollisionDetection.cpp", "GameLib/ActorInstanceEvent.cpp", "GameLib/ActorInstanceFly.cpp", "GameLib/ActorInstanceMotion.cpp", "GameLib/ActorInstanceMotionEvent.cpp", "GameLib/ActorInstancePosition.cpp", "GameLib/ActorInstanceRender.cpp", "GameLib/ActorInstanceRotation.cpp", "GameLib/ActorInstanceSync.cpp", "GameLib/ActorInstanceWeaponTrace.cpp", "UserInterface/InstanceBase.cpp", "UserInterface/InstanceBaseBattle.cpp", "UserInterface/InstanceBaseEffect.cpp", "UserInterface/InstanceBaseEvent.cpp", "UserInterface/InstanceBaseMotion.cpp", "UserInterface/InstanceBaseTransform.cpp", "GameLib/GameUtil.cpp", "GameLib/FlyTarget.cpp", "GameLib/PhysicsObject.cpp", "GameLib/GameEventManager.cpp", "GameLib/WeaponTrace.cpp", "GameLib/MapUtil.cpp", "EterLib/lineintersect_utils.cpp"], "adapted": ["Packet.h TPlayerSkill::tNextRead LONG (32-bit time_t on the wire) + static_assert 1531", "MapUtil.cpp include", "CGameEventManager / CPythonSystem created in PythonBoot in CPythonApplication member order", "D3D8Types.h full D3DTA/D3DTEXTUREOP/D3DCMPFUNC/D3DBLEND/D3DCULL"], "divergent": [], "needs_live": [], "tests": ["port.login_flow: pass (main instance exists, race 0, no AdditionalInfo error, SKILL_LEVEL in Loading)", "port.login_live: 8/8 pass against 192.168.21.203, no unhandled packet", "script/port_gate.sh macos: PASS"], "todo": ["2V2-d.2 gr2/mdatr resource factories + CGraphicThing/CGrannyModel/CGrannyMotion/CGraphicThingInstance on libgr2", "2V2-e render"]} +{"time": "2026-09-23T10:36:40Z", "event": "port_round", "unit": "PORT-PLAN 2V2-d.2: Granny runtime on libgr2 + EterGrnLib, main character model animates", "ported": ["EterGrnLib/LODController.cpp", "EterGrnLib/Material.cpp", "EterGrnLib/Mesh.cpp", "EterGrnLib/Model.cpp", "EterGrnLib/ModelInstance.cpp", "EterGrnLib/ModelInstanceCollisionDetection.cpp", "EterGrnLib/ModelInstanceModel.cpp", "EterGrnLib/ModelInstanceMotion.cpp", "EterGrnLib/ModelInstanceRender.cpp", "EterGrnLib/ModelInstanceUpdate.cpp", "EterGrnLib/Motion.cpp", "EterGrnLib/Thing.cpp", "EterGrnLib/ThingInstance.cpp", "EterGrnLib/Util.cpp", "EterLib/GrpObjectInstance.cpp", "EterLib/GrpCollisionObject.cpp", "EterLib/CollisionData.cpp"], "adapted": ["platform/EterGrnLib/GrannyRuntime.cpp: Granny SDK 2.11 API on libgr2 (file sections, type-definition vertex conversion incl. half floats, material texture by Usage, mesh/bone bindings, deformer, control clock/loop/ease, weighted SRT sampling, composite matrices)", "shim/sdk/granny.h declared from the SDK 2.11 header", "CPU vertex/index buffers (platform/EterLib/CpuBuffer.h)", "Resource.cpp gr2 factory", "CPythonApplication::UpdateGame/RenderGame/GetMousePosition through singletons (no app object); CPythonGraphic in GameSingletons; host cursor", "libgr2: skeleton/mesh/anim/fileinfo accessors", "D3D8Types texture-stage enums, D3DXVec4Transform"], "divergent": [], "needs_live": [], "tests": ["port.login_flow: pass (PART_MAIN model has meshes, material 0 diffuse image loaded, WAIT motion changes bone matrices between frames)", "port.login_live: pass against 192.168.21.203", "script/port_gate.sh macos: PASS"], "todo": ["2V2-e Godot render adapter: recognizable standing character offline + live", "mdatr factory with CAttributeData resource"]} diff --git a/audit/port-map/EterGrnLib/LODController.cpp.json b/audit/port-map/EterGrnLib/LODController.cpp.json new file mode 100644 index 00000000..8c33afba --- /dev/null +++ b/audit/port-map/EterGrnLib/LODController.cpp.json @@ -0,0 +1,278 @@ +{ + "reference": "EterGrnLib/LODController.cpp", + "reference_sha256": "0b40088c2b31a3e54c52f8d18f1abd56c08022afc5583b8b50aeb5c2ac3b14af", + "priority": "P4", + "contracts": [], + "functions": { + "__AllocDeformVertexBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:__AllocDeformVertexBuffer" + ] + }, + "__FreeDeformVertexBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:__FreeDeformVertexBuffer" + ] + }, + "__ReserveSharedVertexBuffers": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:__ReserveSharedVertexBuffers" + ] + }, + "GrannyCreateSharedDeformBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:GrannyCreateSharedDeformBuffer" + ] + }, + "GrannyDestroySharedDeformBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:GrannyDestroySharedDeformBuffer" + ] + }, + "CGrannyLODController::SetMinLODMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetMinLODMode" + ] + }, + "CGrannyLODController::SetMaterialImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetMaterialImagePointer" + ] + }, + "CGrannyLODController::SetMaterialData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetMaterialData" + ] + }, + "CGrannyLODController::SetSpecularInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetSpecularInfo" + ] + }, + "CGrannyLODController::CGrannyLODController": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::CGrannyLODController" + ] + }, + "CGrannyLODController::~CGrannyLODController": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::~CGrannyLODController" + ] + }, + "CGrannyLODController::Clear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::Clear" + ] + }, + "CGrannyLODController::AddModel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::AddModel" + ] + }, + "CGrannyLODController::__ReserveSharedDeformableVertexBuffer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::__ReserveSharedDeformableVertexBuffer" + ] + }, + "CGrannyLODController::AttachModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::AttachModelInstance" + ] + }, + "CGrannyLODController::DetachModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::DetachModelInstance" + ] + }, + "CGrannyLODController::SetLODLimits": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetLODLimits" + ] + }, + "CGrannyLODController::SetLODLevel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetLODLevel" + ] + }, + "CGrannyLODController::CreateDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::CreateDeviceObjects" + ] + }, + "CGrannyLODController::DestroyDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::DestroyDeviceObjects" + ] + }, + "CGrannyLODController::RenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::RenderWithOneTexture" + ] + }, + "CGrannyLODController::BlendRenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::BlendRenderWithOneTexture" + ] + }, + "CGrannyLODController::RenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::RenderWithTwoTexture" + ] + }, + "CGrannyLODController::BlendRenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::BlendRenderWithTwoTexture" + ] + }, + "CGrannyLODController::Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::Update" + ] + }, + "CGrannyLODController::UpdateLODLevel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::UpdateLODLevel" + ] + }, + "CGrannyLODController::UpdateTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::UpdateTime" + ] + }, + "CGrannyLODController::SetCurrentModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetCurrentModelInstance" + ] + }, + "CGrannyLODController::RefreshAttachedModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::RefreshAttachedModelInstance" + ] + }, + "CGrannyLODController::UpdateSkeleton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::UpdateSkeleton" + ] + }, + "CGrannyLODController::DeformAll": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::DeformAll" + ] + }, + "CGrannyLODController::DeformNoSkin": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::DeformNoSkin" + ] + }, + "CGrannyLODController::Deform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::Deform" + ] + }, + "CGrannyLODController::RenderToShadowMap": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::RenderToShadowMap" + ] + }, + "CGrannyLODController::RenderShadow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::RenderShadow" + ] + }, + "CGrannyLODController::ReloadTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::ReloadTexture" + ] + }, + "CGrannyLODController::GetBoundBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::GetBoundBox" + ] + }, + "CGrannyLODController::Intersect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::Intersect" + ] + }, + "CGrannyLODController::SetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetLocalTime" + ] + }, + "CGrannyLODController::ResetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::ResetLocalTime" + ] + }, + "CGrannyLODController::SetMotionPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetMotionPointer" + ] + }, + "CGrannyLODController::ChangeMotionPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::ChangeMotionPointer" + ] + }, + "CGrannyLODController::SetMotionAtEnd": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::SetMotionAtEnd" + ] + }, + "CGrannyLODController::isModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::isModelInstance" + ] + }, + "CGrannyLODController::GetModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/LODController.cpp:CGrannyLODController::GetModelInstance" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Material.cpp.json b/audit/port-map/EterGrnLib/Material.cpp.json new file mode 100644 index 00000000..93ae5dfa --- /dev/null +++ b/audit/port-map/EterGrnLib/Material.cpp.json @@ -0,0 +1,224 @@ +{ + "reference": "EterGrnLib/Material.cpp", + "reference_sha256": "8c4069bff6f4f05ca68296fa108d0acea989d64e2d621d7d646d378487b30d5f", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyMaterial::TranslateSpecularMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::TranslateSpecularMatrix" + ] + }, + "CGrannyMaterial::ApplyRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::ApplyRenderState" + ] + }, + "CGrannyMaterial::RestoreRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::RestoreRenderState" + ] + }, + "CGrannyMaterial::Copy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::Copy" + ] + }, + "CGrannyMaterial::CGrannyMaterial": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::CGrannyMaterial" + ] + }, + "CGrannyMaterial::~CGrannyMaterial": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::~CGrannyMaterial" + ] + }, + "CGrannyMaterial::GetType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::GetType" + ] + }, + "CGrannyMaterial::SetImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::SetImagePointer" + ] + }, + "CGrannyMaterial::IsIn": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::IsIn" + ] + }, + "CGrannyMaterial::SetSpecularInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::SetSpecularInfo" + ] + }, + "CGrannyMaterial::IsEqual": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::IsEqual" + ] + }, + "CGrannyMaterial::GetD3DTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::GetD3DTexture" + ] + }, + "CGrannyMaterial::GetImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::GetImagePointer" + ] + }, + "CGrannyMaterial::GetDiffuseTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::GetDiffuseTexture" + ] + }, + "CGrannyMaterial::GetOpacityTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::GetOpacityTexture" + ] + }, + "CGrannyMaterial::__IsSpecularEnable": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__IsSpecularEnable" + ] + }, + "CGrannyMaterial::__GetSpecularPower": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__GetSpecularPower" + ] + }, + "CGrannyMaterial::__GetImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__GetImagePointer" + ] + }, + "CGrannyMaterial::CreateFromGrannyMaterialPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::CreateFromGrannyMaterialPointer" + ] + }, + "CGrannyMaterial::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::Initialize" + ] + }, + "CGrannyMaterial::__ApplyDiffuseRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__ApplyDiffuseRenderState" + ] + }, + "CGrannyMaterial::__RestoreDiffuseRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__RestoreDiffuseRenderState" + ] + }, + "CGrannyMaterial::__ApplySpecularRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__ApplySpecularRenderState" + ] + }, + "CGrannyMaterial::__RestoreSpecularRenderState": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::__RestoreSpecularRenderState" + ] + }, + "CGrannyMaterial::CreateSphereMap": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::CreateSphereMap" + ] + }, + "CGrannyMaterial::DestroySphereMap": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterial::DestroySphereMap" + ] + }, + "CGrannyMaterialPalette::CGrannyMaterialPalette": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::CGrannyMaterialPalette" + ] + }, + "CGrannyMaterialPalette::~CGrannyMaterialPalette": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::~CGrannyMaterialPalette" + ] + }, + "CGrannyMaterialPalette::Copy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::Copy" + ] + }, + "CGrannyMaterialPalette::Clear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::Clear" + ] + }, + "CGrannyMaterialPalette::GetMaterialRef": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::GetMaterialRef" + ] + }, + "CGrannyMaterialPalette::SetMaterialImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::SetMaterialImagePointer" + ] + }, + "CGrannyMaterialPalette::SetMaterialData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::SetMaterialData" + ] + }, + "CGrannyMaterialPalette::SetSpecularInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::SetSpecularInfo" + ] + }, + "CGrannyMaterialPalette::RegisterMaterial": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::RegisterMaterial" + ] + }, + "CGrannyMaterialPalette::GetMaterialCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Material.cpp:CGrannyMaterialPalette::GetMaterialCount" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Mesh.cpp.json b/audit/port-map/EterGrnLib/Mesh.cpp.json new file mode 100644 index 00000000..c88ecf5b --- /dev/null +++ b/audit/port-map/EterGrnLib/Mesh.cpp.json @@ -0,0 +1,140 @@ +{ + "reference": "EterGrnLib/Mesh.cpp", + "reference_sha256": "0bf1df8de3500d61abb7810dc7172d68afe5616984e05c575d6b82af7311ba25", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyMesh::LoadIndices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::LoadIndices" + ] + }, + "CGrannyMesh::LoadPNTVertices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::LoadPNTVertices" + ] + }, + "CGrannyMesh::NEW_LoadVertices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::NEW_LoadVertices" + ] + }, + "CGrannyMesh::DeformPNTVertices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::DeformPNTVertices" + ] + }, + "CGrannyMesh::CanDeformPNTVertices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::CanDeformPNTVertices" + ] + }, + "CGrannyMesh::GetGrannyMeshPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetGrannyMeshPointer" + ] + }, + "CGrannyMesh::GetTriGroupNodeList": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetTriGroupNodeList" + ] + }, + "CGrannyMesh::GetVertexCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetVertexCount" + ] + }, + "CGrannyMesh::GetVertexBasePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetVertexBasePosition" + ] + }, + "CGrannyMesh::GetIndexBasePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetIndexBasePosition" + ] + }, + "CGrannyMesh::GetDefaultBoneIndices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::GetDefaultBoneIndices" + ] + }, + "CGrannyMesh::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::IsEmpty" + ] + }, + "CGrannyMesh::CreateFromGrannyMeshPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::CreateFromGrannyMeshPointer" + ] + }, + "CGrannyMesh::LoadTriGroupNodeList": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::LoadTriGroupNodeList" + ] + }, + "CGrannyMesh::RebuildTriGroupNodeList": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::RebuildTriGroupNodeList" + ] + }, + "CGrannyMesh::LoadMaterials": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::LoadMaterials" + ] + }, + "CGrannyMesh::IsTwoSide": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::IsTwoSide" + ] + }, + "CGrannyMesh::SetPNT2Mesh": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::SetPNT2Mesh" + ] + }, + "CGrannyMesh::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::Destroy" + ] + }, + "CGrannyMesh::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::Initialize" + ] + }, + "CGrannyMesh::CGrannyMesh": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::CGrannyMesh" + ] + }, + "CGrannyMesh::~CGrannyMesh": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Mesh.cpp:CGrannyMesh::~CGrannyMesh" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Model.cpp.json b/audit/port-map/EterGrnLib/Model.cpp.json new file mode 100644 index 00000000..3d682174 --- /dev/null +++ b/audit/port-map/EterGrnLib/Model.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstance.cpp.json b/audit/port-map/EterGrnLib/ModelInstance.cpp.json new file mode 100644 index 00000000..7faedad6 --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstance.cpp.json @@ -0,0 +1,110 @@ +{ + "reference": "EterGrnLib/ModelInstance.cpp", + "reference_sha256": "40703bdb1525e40a739e14ec9d21955555d26127974deffbb61425290c5ad8c6", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyModelInstance::GetModel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::GetModel" + ] + }, + "CGrannyModelInstance::SetMaterialImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::SetMaterialImagePointer" + ] + }, + "CGrannyModelInstance::SetMaterialData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::SetMaterialData" + ] + }, + "CGrannyModelInstance::SetSpecularInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::SetSpecularInfo" + ] + }, + "CGrannyModelInstance::SetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::SetLocalTime" + ] + }, + "CGrannyModelInstance::ResetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::ResetLocalTime" + ] + }, + "CGrannyModelInstance::GetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::GetLocalTime" + ] + }, + "CGrannyModelInstance::SetParentModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::SetParentModelInstance" + ] + }, + "CGrannyModelInstance::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::IsEmpty" + ] + }, + "CGrannyModelInstance::CreateDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::CreateDeviceObjects" + ] + }, + "CGrannyModelInstance::DestroyDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::DestroyDeviceObjects" + ] + }, + "CGrannyModelInstance::__Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::__Initialize" + ] + }, + "CGrannyModelInstance::CGrannyModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::CGrannyModelInstance" + ] + }, + "CGrannyModelInstance::~CGrannyModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::~CGrannyModelInstance" + ] + }, + "CGrannyModelInstance::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::New" + ] + }, + "CGrannyModelInstance::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::Delete" + ] + }, + "CGrannyModelInstance::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstance.cpp:CGrannyModelInstance::DestroySystem" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstanceCollisionDetection.cpp.json b/audit/port-map/EterGrnLib/ModelInstanceCollisionDetection.cpp.json new file mode 100644 index 00000000..87514276 --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstanceCollisionDetection.cpp.json @@ -0,0 +1,32 @@ +{ + "reference": "EterGrnLib/ModelInstanceCollisionDetection.cpp", + "reference_sha256": "3ac1f5d7252505c75f74d8a656290a4a1ab2d8fbd06b806f0801fcc36ec29a66", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyModelInstance::MakeBoundBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp:CGrannyModelInstance::MakeBoundBox" + ] + }, + "CGrannyModelInstance::Intersect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp:CGrannyModelInstance::Intersect" + ] + }, + "CGrannyModelInstance::GetBoundBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp:CGrannyModelInstance::GetBoundBox" + ] + }, + "CGrannyModelInstance::GetMeshMatrixPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp:CGrannyModelInstance::GetMeshMatrixPointer" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstanceModel.cpp.json b/audit/port-map/EterGrnLib/ModelInstanceModel.cpp.json new file mode 100644 index 00000000..53700a2d --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstanceModel.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstanceMotion.cpp.json b/audit/port-map/EterGrnLib/ModelInstanceMotion.cpp.json new file mode 100644 index 00000000..89585bab --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstanceMotion.cpp.json @@ -0,0 +1,38 @@ +{ + "reference": "EterGrnLib/ModelInstanceMotion.cpp", + "reference_sha256": "7c8eb75469222d48c565a98c4f763f94904e70d17b40ec71f3964d4063cb3ef5", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyModelInstance::CopyMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceMotion.cpp:CGrannyModelInstance::CopyMotion" + ] + }, + "CGrannyModelInstance::IsMotionPlaying": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceMotion.cpp:CGrannyModelInstance::IsMotionPlaying" + ] + }, + "CGrannyModelInstance::SetMotionPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceMotion.cpp:CGrannyModelInstance::SetMotionPointer" + ] + }, + "CGrannyModelInstance::ChangeMotionPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceMotion.cpp:CGrannyModelInstance::ChangeMotionPointer" + ] + }, + "CGrannyModelInstance::SetMotionAtEnd": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceMotion.cpp:CGrannyModelInstance::SetMotionAtEnd" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstanceRender.cpp.json b/audit/port-map/EterGrnLib/ModelInstanceRender.cpp.json new file mode 100644 index 00000000..0f13af09 --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstanceRender.cpp.json @@ -0,0 +1,68 @@ +{ + "reference": "EterGrnLib/ModelInstanceRender.cpp", + "reference_sha256": "81f6e60294da68697e6faa620a9b9ef7ac65a16affc5dd2406bbdead7227af9d", + "priority": "P4", + "contracts": [], + "functions": { + "Granny_RenderBoxBones": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:Granny_RenderBoxBones" + ] + }, + "CGrannyModelInstance::DeformNoSkin": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::DeformNoSkin" + ] + }, + "CGrannyModelInstance::RenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderWithOneTexture" + ] + }, + "CGrannyModelInstance::BlendRenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::BlendRenderWithOneTexture" + ] + }, + "CGrannyModelInstance::RenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderWithTwoTexture" + ] + }, + "CGrannyModelInstance::BlendRenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::BlendRenderWithTwoTexture" + ] + }, + "CGrannyModelInstance::RenderWithoutTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderWithoutTexture" + ] + }, + "CGrannyModelInstance::RenderMeshNodeListWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderMeshNodeListWithOneTexture" + ] + }, + "CGrannyModelInstance::RenderMeshNodeListWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderMeshNodeListWithTwoTexture" + ] + }, + "CGrannyModelInstance::RenderMeshNodeListWithoutTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceRender.cpp:CGrannyModelInstance::RenderMeshNodeListWithoutTexture" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ModelInstanceUpdate.cpp.json b/audit/port-map/EterGrnLib/ModelInstanceUpdate.cpp.json new file mode 100644 index 00000000..8604a2d4 --- /dev/null +++ b/audit/port-map/EterGrnLib/ModelInstanceUpdate.cpp.json @@ -0,0 +1,56 @@ +{ + "reference": "EterGrnLib/ModelInstanceUpdate.cpp", + "reference_sha256": "36fbec03601a919bd5842601168df842d23a1553cd60bdba68ae6d2e8d88efd2", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyModelInstance::Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::Update" + ] + }, + "CGrannyModelInstance::UpdateLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::UpdateLocalTime" + ] + }, + "CGrannyModelInstance::UpdateTransform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::UpdateTransform" + ] + }, + "CGrannyModelInstance::Deform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::Deform" + ] + }, + "CGrannyModelInstance::UpdateSkeleton": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::UpdateSkeleton" + ] + }, + "CGrannyModelInstance::UpdateWorldPose": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::UpdateWorldPose" + ] + }, + "CGrannyModelInstance::UpdateWorldMatrices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::UpdateWorldMatrices" + ] + }, + "CGrannyModelInstance::DeformPNTVertices": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp:CGrannyModelInstance::DeformPNTVertices" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Motion.cpp.json b/audit/port-map/EterGrnLib/Motion.cpp.json new file mode 100644 index 00000000..506d527f --- /dev/null +++ b/audit/port-map/EterGrnLib/Motion.cpp.json @@ -0,0 +1,68 @@ +{ + "reference": "EterGrnLib/Motion.cpp", + "reference_sha256": "5aa81e8c5d0b385538e330b4404fc53e3259657d62d5e9cb63c259b391dacd5c", + "priority": "P4", + "contracts": [], + "functions": { + "CGrannyMotion::CGrannyMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::CGrannyMotion" + ] + }, + "CGrannyMotion::~CGrannyMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::~CGrannyMotion" + ] + }, + "CGrannyMotion::IsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::IsEmpty" + ] + }, + "CGrannyMotion::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::Destroy" + ] + }, + "CGrannyMotion::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::Initialize" + ] + }, + "CGrannyMotion::BindGrannyAnimation": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::BindGrannyAnimation" + ] + }, + "CGrannyMotion::GetGrannyAnimationPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::GetGrannyAnimationPointer" + ] + }, + "CGrannyMotion::GetName": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::GetName" + ] + }, + "CGrannyMotion::GetDuration": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::GetDuration" + ] + }, + "CGrannyMotion::GetTextTrack": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Motion.cpp:CGrannyMotion::GetTextTrack" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Thing.cpp.json b/audit/port-map/EterGrnLib/Thing.cpp.json new file mode 100644 index 00000000..0dd34365 --- /dev/null +++ b/audit/port-map/EterGrnLib/Thing.cpp.json @@ -0,0 +1,122 @@ +{ + "reference": "EterGrnLib/Thing.cpp", + "reference_sha256": "c79c81021e95749f2f040a4c4d219563f1df3899e98f9d2bc5da58a61349197a", + "priority": "P4", + "contracts": [], + "functions": { + "CGraphicThing::CGraphicThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::CGraphicThing" + ] + }, + "CGraphicThing::~CGraphicThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::~CGraphicThing" + ] + }, + "CGraphicThing::Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::Initialize" + ] + }, + "CGraphicThing::OnClear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::OnClear" + ] + }, + "CGraphicThing::Type": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::Type" + ] + }, + "CGraphicThing::OnIsEmpty": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::OnIsEmpty" + ] + }, + "CGraphicThing::OnIsType": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::OnIsType" + ] + }, + "CGraphicThing::CreateDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::CreateDeviceObjects" + ] + }, + "CGraphicThing::DestroyDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::DestroyDeviceObjects" + ] + }, + "CGraphicThing::CheckModelIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::CheckModelIndex" + ] + }, + "CGraphicThing::CheckMotionIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::CheckMotionIndex" + ] + }, + "CGraphicThing::GetModelPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::GetModelPointer" + ] + }, + "CGraphicThing::GetMotionPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::GetMotionPointer" + ] + }, + "CGraphicThing::GetModelCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::GetModelCount" + ] + }, + "CGraphicThing::GetMotionCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::GetMotionCount" + ] + }, + "CGraphicThing::OnLoad": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::OnLoad" + ] + }, + "GetModelLocalPath": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:GetModelLocalPath" + ] + }, + "CGraphicThing::LoadModels": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::LoadModels" + ] + }, + "CGraphicThing::LoadMotions": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Thing.cpp:CGraphicThing::LoadMotions" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/ThingInstance.cpp.json b/audit/port-map/EterGrnLib/ThingInstance.cpp.json new file mode 100644 index 00000000..7604c6e2 --- /dev/null +++ b/audit/port-map/EterGrnLib/ThingInstance.cpp.json @@ -0,0 +1,464 @@ +{ + "reference": "EterGrnLib/ThingInstance.cpp", + "reference_sha256": "8f90fd8718ae58c1652e0b169fa77d0d268d7e36aae6aed542ca93d83657fbbe", + "priority": "P4", + "contracts": [], + "functions": { + "CGraphicThingInstance::GetBaseThingPtr": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBaseThingPtr" + ] + }, + "CGraphicThingInstance::LessRenderOrder": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::LessRenderOrder" + ] + }, + "CGraphicThingInstance::CreateSystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CreateSystem" + ] + }, + "CGraphicThingInstance::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::DestroySystem" + ] + }, + "CGraphicThingInstance::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::New" + ] + }, + "CGraphicThingInstance::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::Delete" + ] + }, + "CGraphicThingInstance::SetMotionAtEnd": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetMotionAtEnd" + ] + }, + "CGraphicThingInstance::Picking": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::Picking" + ] + }, + "CGraphicThingInstance::OnUpdateCollisionData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnUpdateCollisionData" + ] + }, + "CGraphicThingInstance::OnUpdateHeighInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnUpdateHeighInstance" + ] + }, + "CGraphicThingInstance::OnGetObjectHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnGetObjectHeight" + ] + }, + "CGraphicThingInstance::BuildBoundingSphere": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::BuildBoundingSphere" + ] + }, + "CGraphicThingInstance::GetBoundingSphere": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBoundingSphere" + ] + }, + "CGraphicThingInstance::BuildBoundingAABB": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::BuildBoundingAABB" + ] + }, + "CGraphicThingInstance::GetBoundingAABB": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBoundingAABB" + ] + }, + "CGraphicThingInstance::CalculateBBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CalculateBBox" + ] + }, + "CGraphicThingInstance::CreateDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CreateDeviceObjects" + ] + }, + "CGraphicThingInstance::DestroyDeviceObjects": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::DestroyDeviceObjects" + ] + }, + "CGraphicThingInstance::CheckModelInstanceIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CheckModelInstanceIndex" + ] + }, + "CGraphicThingInstance::CheckModelThingIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CheckModelThingIndex" + ] + }, + "CGraphicThingInstance::CheckMotionThingIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CheckMotionThingIndex" + ] + }, + "CGraphicThingInstance::GetMotionThingPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetMotionThingPointer" + ] + }, + "CGraphicThingInstance::IsMotionThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::IsMotionThing" + ] + }, + "CGraphicThingInstance::ReserveModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::ReserveModelInstance" + ] + }, + "CGraphicThingInstance::ReserveModelThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::ReserveModelThing" + ] + }, + "CGraphicThingInstance::FindBoneIndex": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::FindBoneIndex" + ] + }, + "CGraphicThingInstance::AttachModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::AttachModelInstance" + ] + }, + "CGraphicThingInstance::DetachModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::DetachModelInstance" + ] + }, + "CGraphicThingInstance::GetBonePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBonePosition" + ] + }, + "CGraphicThingInstance::SetModelInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetModelInstance" + ] + }, + "CGraphicThingInstance::SetMaterialImagePointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetMaterialImagePointer" + ] + }, + "CGraphicThingInstance::SetMaterialData": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetMaterialData" + ] + }, + "CGraphicThingInstance::SetSpecularInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetSpecularInfo" + ] + }, + "CGraphicThingInstance::SetMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetMotion" + ] + }, + "CGraphicThingInstance::ChangeMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::ChangeMotion" + ] + }, + "CGraphicThingInstance::SetEndStopMotion": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::SetEndStopMotion" + ] + }, + "CGraphicThingInstance::RegisterModelThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::RegisterModelThing" + ] + }, + "CGraphicThingInstance::RegisterLODThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::RegisterLODThing" + ] + }, + "CGraphicThingInstance::RegisterMotionThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::RegisterMotionThing" + ] + }, + "CGraphicThingInstance::ResetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::ResetLocalTime" + ] + }, + "CGraphicThingInstance::InsertDelay": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::InsertDelay" + ] + }, + "CGraphicThingInstance::GetLastLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetLastLocalTime" + ] + }, + "CGraphicThingInstance::GetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetLocalTime" + ] + }, + "CGraphicThingInstance::GetSecondElapsed": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetSecondElapsed" + ] + }, + "CGraphicThingInstance::GetAverageSecondElapsed": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetAverageSecondElapsed" + ] + }, + "CGraphicThingInstance::Intersect": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::Intersect" + ] + }, + "CGraphicThingInstance::GetBoundBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBoundBox" + ] + }, + "CGraphicThingInstance::GetBoneMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetBoneMatrix" + ] + }, + "CGraphicThingInstance::GetCompositeBoneMatrix": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetCompositeBoneMatrix" + ] + }, + "CGraphicThingInstance::UpdateTransform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::UpdateTransform" + ] + }, + "CGraphicThingInstance::DeformAll": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::DeformAll" + ] + }, + "CGraphicThingInstance::DeformNoSkin": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::DeformNoSkin" + ] + }, + "CGraphicThingInstance::OnDeform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnDeform" + ] + }, + "CGraphicThingInstance::__SetLocalTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::__SetLocalTime" + ] + }, + "CGraphicThingInstance::UpdateLODLevel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::UpdateLODLevel" + ] + }, + "CGraphicThingInstance::UpdateTime": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::UpdateTime" + ] + }, + "CGraphicThingInstance::OnUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnUpdate" + ] + }, + "CGraphicThingInstance::OnRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnRender" + ] + }, + "CGraphicThingInstance::OnBlendRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnBlendRender" + ] + }, + "CGraphicThingInstance::RenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::RenderWithOneTexture" + ] + }, + "CGraphicThingInstance::BlendRenderWithOneTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::BlendRenderWithOneTexture" + ] + }, + "CGraphicThingInstance::RenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::RenderWithTwoTexture" + ] + }, + "CGraphicThingInstance::BlendRenderWithTwoTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::BlendRenderWithTwoTexture" + ] + }, + "CGraphicThingInstance::OnRenderToShadowMap": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnRenderToShadowMap" + ] + }, + "CGraphicThingInstance::OnRenderShadow": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnRenderShadow" + ] + }, + "CGraphicThingInstance::OnRenderPCBlocker": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnRenderPCBlocker" + ] + }, + "CGraphicThingInstance::GetLODControllerCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetLODControllerCount" + ] + }, + "CGraphicThingInstance::GetLODControllerPointer": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetLODControllerPointer" + ] + }, + "CGraphicThingInstance::GetLODLevel": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetLODLevel" + ] + }, + "CGraphicThingInstance::GetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::GetHeight" + ] + }, + "CGraphicThingInstance::ReloadTexture": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::ReloadTexture" + ] + }, + "CGraphicThingInstance::HaveBlendThing": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::HaveBlendThing" + ] + }, + "CGraphicThingInstance::OnClear": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnClear" + ] + }, + "CGraphicThingInstance::OnInitialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::OnInitialize" + ] + }, + "CGraphicThingInstance::CGraphicThingInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::CGraphicThingInstance" + ] + }, + "CGraphicThingInstance::~CGraphicThingInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/ThingInstance.cpp:CGraphicThingInstance::~CGraphicThingInstance" + ] + } + } +} diff --git a/audit/port-map/EterGrnLib/Util.cpp.json b/audit/port-map/EterGrnLib/Util.cpp.json new file mode 100644 index 00000000..9fb1240e --- /dev/null +++ b/audit/port-map/EterGrnLib/Util.cpp.json @@ -0,0 +1,14 @@ +{ + "reference": "EterGrnLib/Util.cpp", + "reference_sha256": "319c039c8d115ecccd5bee297c9bc092c308f9283f58ab21c460176d37698a87", + "priority": "P4", + "contracts": [], + "functions": { + "GrannyMeshIsDeform": { + "status": "PORTED", + "impl": [ + "extension/src/port/EterGrnLib/Util.cpp:GrannyMeshIsDeform" + ] + } + } +} diff --git a/audit/port-map/EterLib/CollisionData.cpp.json b/audit/port-map/EterLib/CollisionData.cpp.json new file mode 100644 index 00000000..1dc0ff4f --- /dev/null +++ b/audit/port-map/EterLib/CollisionData.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/EterLib/GrpCollisionObject.cpp.json b/audit/port-map/EterLib/GrpCollisionObject.cpp.json new file mode 100644 index 00000000..451457fd --- /dev/null +++ b/audit/port-map/EterLib/GrpCollisionObject.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/EterLib/GrpObjectInstance.cpp.json b/audit/port-map/EterLib/GrpObjectInstance.cpp.json new file mode 100644 index 00000000..3d3edb9e --- /dev/null +++ b/audit/port-map/EterLib/GrpObjectInstance.cpp.json @@ -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" + ] + } + } +} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 366b2479..7b0f13b9 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -422,7 +422,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | 2V2-a | Loading 结束后打开 `game.GameWindow`,发 `CG_ENTERGAME` | 完成:2V0 桩模块的常量与返回值形状改为按 40250 生成(`scripts/stub_constants.py`:常量逐行抄各模块 init 的 `PyModule_Add*Constant` 及其预处理行/枚举/`extern const` 定义,写到 `platform/ScriptLib/GameplayModuleConstants.cpp`;桩函数返回参考函数最后一个 `return` 的 `Py_BuildValue` 格式的零值或 None,而不是一律 `int 0`),`uiSafebox.SetTableSize` 的除零和 `uiTaskBar` 解包失败随之消失,`interfaceModule.MakeInterface` 走完。修正:`UserInterface/StdAfx.h` 按 40250 PCH 顺序先 `Locale.h` 后 `GameType.h`(之前反了,`GameType.h` 里 `ENABLE_NEW_EQUIPMENT_SYSTEM` 分支全被丢掉)。`port.login_flow` 假服在 `CG_CLIENT_VERSION` 后收 `CG_ENTERGAME`(校验序列字节),测试等到 `GameWindow` 显示;`port.login_live` 2026-09-23 对 192.168.21.203 同样走到 `GameWindow`。`GamePhase`/`SetGamePhase` 仍是替身:服务器的 PHASE_GAME 及 Loading 阶段落到 `GamePhase()` 的包会卡住读流 | | 2V2-b | `PythonNetworkStreamPhaseGame*.cpp` 分派闭包:`SetGamePhase`/`GamePhase`,PHASE_GAME 后的 Entergame 包洪流(`GC_TIME`/`GC_CHANNEL`/`GC_CHARACTER_ADD`/`GC_CHAR_ADDITIONAL_INFO`/`GC_CHARACTER_UPDATE`/技能/物品/快捷栏…)读流不断 | 完成:`PythonNetworkStreamPhaseGame`/`PhaseGameActor`/`PhaseGameItem`/`Command`、`NetworkActorManager` 原样移植并在运行时分派(port-map 标 PORTED);`GC_CHAT` 需要的 `PythonChat.cpp`/`PythonChatModule.cpp` 一并原样移植,`GameplayModules.cpp` 的 `chat` 桩删除,`initChat()` 按 40250 顺序在 `initnet()` 前调用。未移植单元的单例在 `PythonBoot` 的 `GameSingletons` 里按 `CPythonApplication` 成员顺序创建(calloc 存储:替身构造函数不初始化标量);替身由 `platform_stub.py pending
<符号...> [--ctor]` 按链接缺失符号生成到 `platform/pending//`,返回 `const char*` 的替身返回 `""`(`RecvGuild` 里 `strcmp(…, CPythonPlayer::GetName())`)。`port.login_flow` 假服按 `CInputLogin::Entergame` 顺序发:Loading 阶段 `CHARACTER_ADD`+`CHAR_ADDITIONAL_INFO`+`CHARACTER_UPDATE`、`NPC_POSITION` → `PHASE_GAME` → `LAND_LIST`、`TIME`、`CHANNEL`、问候 `CHAT` → `PING`,客户端回 `PONG`,公告进 `CPythonChat`,`TraceError` 观察钩子(`EterBase/TraceErrorObserver.h`)断言无 `Unknown packet header`。`port.login_live` 2026-09-23 对 192.168.21.203 读 10 s 真实游戏阶段:连接保持、GameWindow 显示、无未知包;剩下的 SYSERR 只有 `CreateInstance` 失败(2V2-d 的 `SetRace` 占位) | | 2V2-c | `PythonCharacterManager` + `chrmgr`/`chr` 模块:`playerSettingModule` 的种族/动作/特效注册走真实实现 | 完成:`PythonCharacterManagerModule.cpp`/`PythonCharacterModule.cpp` 原样移植,`GameplayModules.cpp` 的 `chr`/`chrmgr` 桩删除,`initchr()`/`initchrmgr()` 按 40250 顺序在 `initChat()` 前调用;注册链需要的 `RaceData`/`RaceDataFile`/`RaceManager`/`RaceMotionData`、`GameType`、`AttributeData`/`AttributeInstance`、`TextFileLoader`、`Util.cpp`(代码页/字体部分留在 platform 字体后端,port-map 标 ADAPTED/N_A)、`Camera`/`CameraProcedure` 原样移植(port-map 标 PORTED),`CRaceManager` 按 `CPythonApplication` 成员顺序在 `PythonBoot` 创建;`D3DXMath` 补 `D3DXVec2CCW`/`D3DXMatrixfDeterminant`/`D3DXMatrixLookAtRH`。`port.login_flow` 断言 `chr`/`chrmgr` 不是桩、种族 0 的 `MODE_GENERAL`/`NAME_WAIT` 动作已注册、Syserr 无“처리되지 않은 패킷 헤더”;`port.login_live` 2026-09-23 对 192.168.21.203 连跑 8 次通过、`script/port_gate.sh macos` PASS,怪物种族实例随真实 `SetRace` 创建。偶发(约 1/11)Loading 阶段报头 7 未处理(疑包长失步),测试现打印 `g_iLastPacket` 并判失败,未再复现 | - | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | 进行中。d.1 完成:`ActorInstance*.cpp`(Attach/Battle/Blend/CollisionDetection/Event/Fly/Motion/MotionEvent/Position/Render/Rotation/Sync/WeaponTrace)、`InstanceBase*.cpp`(Battle/Effect/Event/Motion/Transform)、`GameUtil`、`FlyTarget`、`PhysicsObject`、`GameEventManager`、`WeaponTrace`、`MapUtil`、`lineintersect_utils` 原样移植,`pending/GameLib/{ActorInstance,FlyTarget,PhysicsObject,MapUtil}.cpp`、`pending/UserInterface/InstanceBase.cpp` 替身删除,`ActorInstance.cpp`/`InstanceBase.cpp` 随主角创建进入运行时(port-map 标 PORTED);`CGameEventManager` 与 `CPythonSystem`(最后一个成员)按 `CPythonApplication` 成员顺序在 `PythonBoot` 创建;`D3D8Types.h` 补全 `D3DTA`/`D3DTEXTUREOP`/`D3DCMPFUNC`/`D3DBLEND`/`D3DCULL`。假服 `CHARACTER_ADD` 的 `bType` 改为 `CHAR_TYPE_PC`(6,原 0 使 `RecvCharacterAppendPacket` 不记主角、`CHAR_ADDITIONAL_INFO` 报错)。2V2-c 的偶发 Loading 头 7 根因:`TPlayerSkill::tNextRead` 是 `time_t`,40250 用 `_USE_32BIT_TIME_T`,LP64 下 `TPacketGCSkillLevelNew` 变成 2551 字节(线上 1531),`CInputDB::PlayerLoad` 在 `PointsPacket` 后发的 `SKILL_LEVEL`(76)读多吞掉后续包;`Packet.h` 改 `LONG` 并 `static_assert` 1531,假服 Loading 阶段补发 `SKILL_LEVEL` 回归。`port.login_flow` 断言主角实例存在且种族 0、无 `TPacketGCCharacterAdditionalInfo` 报错;`port.login_live` 2026-09-23 对 192.168.21.203 连跑 8 次通过,剩余 SYSERR 只有 gr2 `NOT SUPPORT FILE`。d.2 下一步:`Resource.cpp` 注册 gr2/mdatr 工厂,`CGraphicThing`/`CGrannyModel`/`CGrannyMotion`/`CGraphicThingInstance` 在 libgr2 上实现 | + | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | 完成。d.1:`ActorInstance*.cpp`(Attach/Battle/Blend/CollisionDetection/Event/Fly/Motion/MotionEvent/Position/Render/Rotation/Sync/WeaponTrace)、`InstanceBase*.cpp`(Battle/Effect/Event/Motion/Transform)、`GameUtil`、`FlyTarget`、`PhysicsObject`、`GameEventManager`、`WeaponTrace`、`MapUtil`、`lineintersect_utils` 原样移植,`pending/GameLib/{ActorInstance,FlyTarget,PhysicsObject,MapUtil}.cpp`、`pending/UserInterface/InstanceBase.cpp` 替身删除,`ActorInstance.cpp`/`InstanceBase.cpp` 随主角创建进入运行时(port-map 标 PORTED);`CGameEventManager` 与 `CPythonSystem`(最后一个成员)按 `CPythonApplication` 成员顺序在 `PythonBoot` 创建;`D3D8Types.h` 补全 `D3DTA`/`D3DTEXTUREOP`/`D3DCMPFUNC`/`D3DBLEND`/`D3DCULL`。假服 `CHARACTER_ADD` 的 `bType` 改为 `CHAR_TYPE_PC`(6,原 0 使 `RecvCharacterAppendPacket` 不记主角、`CHAR_ADDITIONAL_INFO` 报错)。2V2-c 的偶发 Loading 头 7 根因:`TPlayerSkill::tNextRead` 是 `time_t`,40250 用 `_USE_32BIT_TIME_T`,LP64 下 `TPacketGCSkillLevelNew` 变成 2551 字节(线上 1531),`CInputDB::PlayerLoad` 在 `PointsPacket` 后发的 `SKILL_LEVEL`(76)读多吞掉后续包;`Packet.h` 改 `LONG` 并 `static_assert` 1531,假服 Loading 阶段补发 `SKILL_LEVEL` 回归。`port.login_flow` 断言主角实例存在且种族 0、无 `TPacketGCCharacterAdditionalInfo` 报错;`port.login_live` 2026-09-23 对 192.168.21.203 连跑 8 次通过,剩余 SYSERR 只有 gr2 `NOT SUPPORT FILE`。d.2:Granny SDK 2.11 运行时在 libgr2 上实现(`platform/EterGrnLib/GrannyRuntime.cpp`,`shim/sdk/granny.h` 按 SDK 头声明所用类型与函数:文件/段、按类型定义的顶点转换含 half、材质贴图按 Usage 查找、网格绑定、变形器、控制器时钟/循环/缓入缓出、加权 SRT 采样与复合矩阵),`EterGrnLib/*.cpp`(LODController/Material/Mesh/Model/ModelInstance*/Motion/Thing/ThingInstance/Util)与 `EterLib/{GrpObjectInstance,GrpCollisionObject,CollisionData}.cpp` 原样移植,对应 platform 骨架与 pending 替身删除(port-map 标 PORTED);`Resource.cpp` 注册 gr2 工厂(mdatr 等 `CAttributeData` 资源化时再注册);VB/IB 为 CPU 缓冲(`platform/EterLib/CpuBuffer.h`),渲染 adapter 属 2V2-e。`app.UpdateGame`/`RenderGame`(40250 `PythonApplication.cpp:321/168`)接入,成员经单例访问(平台没有 `CPythonApplication` 对象),`CPythonGraphic`(含 `CCullingManager`)按成员顺序进 `GameSingletons`;`GetMousePosition` 读 host 光标。`port.login_flow` 断言主角 PART_MAIN 模型有网格、材质漫反射贴图已加载、WAIT 动作使骨骼矩阵逐帧变化;离线与 `port.login_live`(192.168.21.203)2026-09-23 通过 | | 2V2-e | Godot 显示主角(渲染 adapter),离线 + 真服 smoke:进游戏看到可辨认的静止角色 | TODO | 4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、 `InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径 diff --git a/extension/src/platform/CMakeLists.txt b/extension/src/platform/CMakeLists.txt index d32c0855..72241ba9 100644 --- a/extension/src/platform/CMakeLists.txt +++ b/extension/src/platform/CMakeLists.txt @@ -10,7 +10,7 @@ if(NOT TARGET mtpython) list(FILTER MT_PLATFORM_SOURCES EXCLUDE REGEX "/ScriptLib/") endif() add_library(port_platform STATIC ${MT_PLATFORM_SOURCES}) -target_link_libraries(port_platform PUBLIC port_logic PRIVATE mt3p::freetype) +target_link_libraries(port_platform PUBLIC port_logic PRIVATE mt3p::freetype xrender::libgr2) foreach(src IN LISTS MT_PLATFORM_SOURCES) mt_port_apply_defines(${src}) endforeach() diff --git a/extension/src/platform/EterGrnLib/GrannyRuntime.cpp b/extension/src/platform/EterGrnLib/GrannyRuntime.cpp new file mode 100644 index 00000000..1cc02bdc --- /dev/null +++ b/extension/src/platform/EterGrnLib/GrannyRuntime.cpp @@ -0,0 +1,1306 @@ +// The Granny 2.11 runtime that 40250 EterGrnLib links (granny2.dll), over libgr2. +// +// A granny_file owns the libgr2 gr2::File and the public granny_* structs built from it (SDK field +// names, see port/common/shim/sdk/granny.h). Each struct is the first member of a record that keeps +// its backing arrays, so a granny_mesh* / granny_animation* is also the record pointer. The runtime +// objects follow the SDK semantics EterGrnLib relies on: +// - vertex layouts convert member by member, matched by name (GrannyConvertSingleObject rules), +// - mesh bindings map bone bindings to skeleton bones by name, +// - the deformer skins Position and Normal with the composite (InverseWorld x World) matrices, +// - controls run on the model clock (speed, loop count, ease-in/out Bezier curves, completion), +// - sampling blends the controls' SRTs per bone, fills the rest with the bind pose, and builds +// world = Local x Parent (row vectors, translation in elements 12..14). +#include + +#include "granny.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +using Mat4 = gr2::Mat4; + +bool name_equal(const char* a, const char* b) +{ + if (!a || !b) + return false; + for (; *a && *b; ++a, ++b) + if (std::tolower((unsigned char)*a) != std::tolower((unsigned char)*b)) + return false; + return *a == *b; +} + +Mat4 identity() +{ + return Mat4{1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; +} + +// C = A x B, row-major. +void mul(const float* a, const float* b, float* c) +{ + float r[16]; + for (int i = 0; i < 4; ++i) + for (int j = 0; j < 4; ++j) + r[i * 4 + j] = a[i * 4 + 0] * b[0 * 4 + j] + a[i * 4 + 1] * b[1 * 4 + j] + a[i * 4 + 2] * b[2 * 4 + j] + a[i * 4 + 3] * b[3 * 4 + j]; + std::memcpy(c, r, sizeof r); +} + +// ── Data type definitions ────────────────────────────────────────────────────────────────────── + +int member_unit_size(granny_member_type t) +{ + switch (t) + { + case GrannyReal32Member: + case GrannyInt32Member: + case GrannyUInt32Member: + return 4; + case GrannyInt8Member: + case GrannyUInt8Member: + case GrannyBinormalInt8Member: + case GrannyNormalUInt8Member: + return 1; + case GrannyInt16Member: + case GrannyUInt16Member: + case GrannyBinormalInt16Member: + case GrannyNormalUInt16Member: + case GrannyReal16Member: + return 2; + default: + return 0; // references, strings, transforms: not in the layouts EterGrnLib converts + } +} + +int member_width(const granny_data_type_definition& m) +{ + return m.ArrayWidth > 0 ? m.ArrayWidth : 1; +} + +int member_size(const granny_data_type_definition& m) +{ + return member_unit_size(m.Type) * member_width(m); +} + +float half_to_float(uint16_t h) +{ + const uint32_t sign = (h >> 15) & 1, exp = (h >> 10) & 0x1f, mant = h & 0x3ff; + float v; + if (exp == 0) + v = std::ldexp(float(mant), -24); + else if (exp == 31) + v = mant ? NAN : INFINITY; + else + v = std::ldexp(float(mant | 0x400), int(exp) - 25); + return sign ? -v : v; +} + +uint16_t float_to_half(float f) +{ + uint32_t x; + std::memcpy(&x, &f, 4); + const uint32_t sign = (x >> 16) & 0x8000; + int exp = int((x >> 23) & 0xff) - 127 + 15; + uint32_t mant = x & 0x7fffff; + if (exp <= 0) + return uint16_t(sign); + if (exp >= 31) + return uint16_t(sign | 0x7c00); + return uint16_t(sign | (exp << 10) | (mant >> 13)); +} + +double read_unit(granny_member_type t, const uint8_t* p) +{ + switch (t) + { + case GrannyReal32Member: { float v; std::memcpy(&v, p, 4); return v; } + case GrannyInt32Member: { int32_t v; std::memcpy(&v, p, 4); return v; } + case GrannyUInt32Member: { uint32_t v; std::memcpy(&v, p, 4); return v; } + case GrannyInt8Member: return *(const int8_t*)p; + case GrannyUInt8Member: return *p; + case GrannyBinormalInt8Member: return *(const int8_t*)p / 127.0; + case GrannyNormalUInt8Member: return *p / 255.0; + case GrannyInt16Member: { int16_t v; std::memcpy(&v, p, 2); return v; } + case GrannyUInt16Member: { uint16_t v; std::memcpy(&v, p, 2); return v; } + case GrannyBinormalInt16Member: { int16_t v; std::memcpy(&v, p, 2); return v / 32767.0; } + case GrannyNormalUInt16Member: { uint16_t v; std::memcpy(&v, p, 2); return v / 65535.0; } + case GrannyReal16Member: { uint16_t v; std::memcpy(&v, p, 2); return half_to_float(v); } + default: return 0.0; + } +} + +template +T clamp_round(double v, double lo, double hi) +{ + return T(std::lround(std::min(hi, std::max(lo, v)))); +} + +void write_unit(granny_member_type t, uint8_t* p, double v) +{ + switch (t) + { + case GrannyReal32Member: { float f = float(v); std::memcpy(p, &f, 4); break; } + case GrannyInt32Member: { int32_t i = clamp_round(v, INT32_MIN, INT32_MAX); std::memcpy(p, &i, 4); break; } + case GrannyUInt32Member: { uint32_t i = clamp_round(v, 0, UINT32_MAX); std::memcpy(p, &i, 4); break; } + case GrannyInt8Member: *(int8_t*)p = clamp_round(v, -128, 127); break; + case GrannyUInt8Member: *p = clamp_round(v, 0, 255); break; + case GrannyBinormalInt8Member: *(int8_t*)p = clamp_round(v * 127.0, -127, 127); break; + case GrannyNormalUInt8Member: *p = clamp_round(v * 255.0, 0, 255); break; + case GrannyInt16Member: { int16_t i = clamp_round(v, -32768, 32767); std::memcpy(p, &i, 2); break; } + case GrannyUInt16Member: { uint16_t i = clamp_round(v, 0, 65535); std::memcpy(p, &i, 2); break; } + case GrannyBinormalInt16Member: { int16_t i = clamp_round(v * 32767.0, -32767, 32767); std::memcpy(p, &i, 2); break; } + case GrannyNormalUInt16Member: { uint16_t i = clamp_round(v * 65535.0, 0, 65535); std::memcpy(p, &i, 2); break; } + case GrannyReal16Member: { uint16_t h = float_to_half(float(v)); std::memcpy(p, &h, 2); break; } + default: break; + } +} + +// One source → destination member pairing of a layout conversion (src < 0: zero-fill). +struct MemberCopy +{ + int src_offset = -1; + granny_member_type src_type = GrannyEndMember; + int src_width = 0; + int dst_offset = 0; + granny_member_type dst_type = GrannyEndMember; + int dst_width = 0; +}; + +struct Layout +{ + std::vector members; + std::vector offsets; + int size = 0; + + explicit Layout(const granny_data_type_definition* type) + { + for (const granny_data_type_definition* m = type; m && m->Type != GrannyEndMember; ++m) + { + members.push_back(m); + offsets.push_back(size); + size += member_size(*m); + } + } + + int find(const char* name) const + { + for (size_t i = 0; i < members.size(); ++i) + if (name_equal(members[i]->Name, name)) + return int(i); + return -1; + } +}; + +std::vector plan_conversion(const Layout& src, const Layout& dst) +{ + std::vector plan; + for (size_t d = 0; d < dst.members.size(); ++d) + { + MemberCopy c; + c.dst_offset = dst.offsets[d]; + c.dst_type = dst.members[d]->Type; + c.dst_width = member_width(*dst.members[d]); + const int s = src.find(dst.members[d]->Name); + if (s >= 0) + { + c.src_offset = src.offsets[s]; + c.src_type = src.members[s]->Type; + c.src_width = member_width(*src.members[s]); + } + plan.push_back(c); + } + return plan; +} + +void run_conversion(const std::vector& plan, const uint8_t* src, uint8_t* dst) +{ + for (const MemberCopy& c : plan) + { + const int du = member_unit_size(c.dst_type); + if (c.src_offset >= 0 && c.src_type == c.dst_type && c.src_width == c.dst_width) + { + std::memcpy(dst + c.dst_offset, src + c.src_offset, size_t(du) * c.dst_width); + continue; + } + const int su = member_unit_size(c.src_type); + for (int i = 0; i < c.dst_width; ++i) + { + const double v = (c.src_offset >= 0 && i < c.src_width) ? read_unit(c.src_type, src + c.src_offset + i * su) : 0.0; + write_unit(c.dst_type, dst + c.dst_offset + i * du, v); + } + } +} + +granny_data_type_definition end_member() +{ + granny_data_type_definition d{}; + d.Type = GrannyEndMember; + return d; +} + +// ── File records ─────────────────────────────────────────────────────────────────────────────── + +struct MaterialRec +{ + granny_material pub{}; + std::vector maps; + granny_texture texture{}; + granny_data_type_definition ext_type[2]{}; + int32_t ext_two_sided = 0; +}; + +struct SkeletonRec +{ + granny_skeleton pub{}; + std::vector bones; +}; + +struct MeshRec +{ + granny_mesh pub{}; + const gr2::Mesh* src = nullptr; + granny_vertex_data vertex_data{}; + std::vector vertex_type; + granny_tri_topology topology{}; + std::vector groups; + std::vector indices; + std::vector material_bindings; + std::vector bone_bindings; +}; + +struct ModelRec +{ + granny_model pub{}; + std::vector mesh_bindings; +}; + +struct AnimationRec +{ + granny_animation pub{}; + const gr2::Animation* src = nullptr; + granny_track_group group{}; + granny_track_group* groups[1]{}; + std::vector text_tracks; + std::vector> entries; +}; + +const MeshRec* mesh_rec(const granny_mesh* m) +{ + return reinterpret_cast(m); +} + +const AnimationRec* animation_rec(const granny_animation* a) +{ + return reinterpret_cast(a); +} + +void to_granny(const gr2::Transform& t, granny_transform& out) +{ + out.Flags = t.flags; + std::memcpy(out.Position, t.position, sizeof out.Position); + std::memcpy(out.Orientation, t.orientation, sizeof out.Orientation); + std::memcpy(out.ScaleShear, t.scale_shear, sizeof out.ScaleShear); +} + +gr2::Transform to_gr2(const granny_transform& t) +{ + gr2::Transform out; + out.flags = t.Flags; + std::memcpy(out.position, t.Position, sizeof out.position); + std::memcpy(out.orientation, t.Orientation, sizeof out.orientation); + std::memcpy(out.scale_shear, t.ScaleShear, sizeof out.scale_shear); + return out; +} + +granny_log_callback g_log_callback{}; + +granny_data_type_definition g_pnt332[4] = { + {GrannyReal32Member, GrannyVertexPositionName, nullptr, 3}, + {GrannyReal32Member, GrannyVertexNormalName, nullptr, 3}, + {GrannyReal32Member, GrannyVertexTextureCoordinatesName "0", nullptr, 2}, + {GrannyEndMember}, +}; +} // namespace + +granny_data_type_definition* GrannyPNT332VertexType = g_pnt332; + +struct granny_file +{ + std::optional file; + granny_file_info info{}; + std::vector materials; + std::vector skeletons; + std::vector meshes; + std::vector models; + std::vector animations; + std::vector texture_ptrs; + std::vector material_ptrs; + std::vector skeleton_ptrs; + std::vector mesh_ptrs; + std::vector model_ptrs; + std::vector animation_ptrs; +}; + +namespace +{ +void build_file(granny_file& f) +{ + const gr2::FileInfo& fi = f.file->file_info(); + + f.materials.resize(fi.materials.size()); + for (size_t i = 0; i < fi.materials.size(); ++i) + { + const gr2::Material& src = fi.materials[i]; + MaterialRec& r = f.materials[i]; + r.pub.Name = src.name.c_str(); + if (!src.texture.empty()) + { + r.texture.FromFileName = src.texture.c_str(); + r.pub.Texture = &r.texture; + f.texture_ptrs.push_back(&r.texture); + } + for (const gr2::MaterialMap& m : src.maps) + { + granny_material_map map{}; + map.Usage = m.usage.c_str(); + map.Material = (m.material >= 0 && size_t(m.material) < f.materials.size()) ? &f.materials[m.material].pub : nullptr; + r.maps.push_back(map); + } + r.pub.MapCount = int32_t(r.maps.size()); + r.pub.Maps = r.maps.empty() ? nullptr : r.maps.data(); + if (src.has_two_sided) + { + r.ext_type[0] = {GrannyInt32Member, "Two-sided", nullptr, 0}; + r.ext_type[1] = end_member(); + r.ext_two_sided = src.two_sided; + r.pub.ExtendedData.Type = r.ext_type; + r.pub.ExtendedData.Object = &r.ext_two_sided; + } + f.material_ptrs.push_back(&r.pub); + } + + f.skeletons.resize(fi.skeletons.size()); + for (size_t i = 0; i < fi.skeletons.size(); ++i) + { + const gr2::Skeleton& src = fi.skeletons[i]; + SkeletonRec& r = f.skeletons[i]; + r.bones.resize(src.bones.size()); + for (size_t b = 0; b < src.bones.size(); ++b) + { + granny_bone& bone = r.bones[b]; + bone.Name = src.bones[b].name.c_str(); + bone.ParentIndex = src.bones[b].parent; + to_granny(src.bones[b].local, bone.LocalTransform); + std::memcpy(bone.InverseWorld4x4, src.bones[b].inverse_world.data(), sizeof bone.InverseWorld4x4); + } + r.pub.BoneCount = int32_t(r.bones.size()); + r.pub.Bones = r.bones.empty() ? nullptr : r.bones.data(); + f.skeleton_ptrs.push_back(&r.pub); + } + + f.meshes.resize(fi.meshes.size()); + for (size_t i = 0; i < fi.meshes.size(); ++i) + { + const gr2::Mesh& src = fi.meshes[i]; + MeshRec& r = f.meshes[i]; + r.src = &src; + r.pub.Name = src.name.c_str(); + + for (const gr2::VertexMember& m : src.vertex_members) + r.vertex_type.push_back({granny_member_type(m.type), m.name.c_str(), nullptr, m.array_width}); + r.vertex_type.push_back(end_member()); + r.vertex_data.VertexType = r.vertex_type.data(); + r.vertex_data.VertexCount = src.vertex_stride ? int32_t(src.raw_vertices.size() / src.vertex_stride) : 0; + r.vertex_data.Vertices = const_cast(src.raw_vertices.data()); + r.pub.PrimaryVertexData = &r.vertex_data; + + for (const gr2::TriGroup& g : src.tri_groups) + r.groups.push_back({g.material_index, g.tri_first, g.tri_count}); + r.indices.assign(src.indices.begin(), src.indices.end()); + r.topology.GroupCount = int32_t(r.groups.size()); + r.topology.Groups = r.groups.empty() ? nullptr : r.groups.data(); + r.topology.IndexCount = int32_t(r.indices.size()); + r.topology.Indices = r.indices.empty() ? nullptr : r.indices.data(); + r.pub.PrimaryTopology = &r.topology; + + for (int32_t m : src.material_bindings) + r.material_bindings.push_back({(m >= 0 && size_t(m) < f.materials.size()) ? &f.materials[m].pub : nullptr}); + r.pub.MaterialBindingCount = int32_t(r.material_bindings.size()); + r.pub.MaterialBindings = r.material_bindings.empty() ? nullptr : r.material_bindings.data(); + + r.bone_bindings.resize(src.bone_binding_names.size()); + for (size_t b = 0; b < src.bone_binding_names.size(); ++b) + { + granny_bone_binding& bb = r.bone_bindings[b]; + bb.BoneName = src.bone_binding_names[b].c_str(); + if (b < src.bone_bounds.size()) + { + std::memcpy(bb.OBBMin, src.bone_bounds[b].min, sizeof bb.OBBMin); + std::memcpy(bb.OBBMax, src.bone_bounds[b].max, sizeof bb.OBBMax); + } + } + r.pub.BoneBindingCount = int32_t(r.bone_bindings.size()); + r.pub.BoneBindings = r.bone_bindings.empty() ? nullptr : r.bone_bindings.data(); + f.mesh_ptrs.push_back(&r.pub); + } + + f.models.resize(fi.models.size()); + for (size_t i = 0; i < fi.models.size(); ++i) + { + const gr2::Model& src = fi.models[i]; + ModelRec& r = f.models[i]; + r.pub.Name = src.name.c_str(); + r.pub.Skeleton = (src.skeleton >= 0 && size_t(src.skeleton) < f.skeletons.size()) ? &f.skeletons[src.skeleton].pub : nullptr; + to_granny(src.initial_placement, r.pub.InitialPlacement); + for (int32_t m : src.mesh_bindings) + if (m >= 0 && size_t(m) < f.meshes.size()) + r.mesh_bindings.push_back({&f.meshes[m].pub}); + r.pub.MeshBindingCount = int32_t(r.mesh_bindings.size()); + r.pub.MeshBindings = r.mesh_bindings.empty() ? nullptr : r.mesh_bindings.data(); + f.model_ptrs.push_back(&r.pub); + } + + f.animations.resize(fi.animations.size()); + for (size_t i = 0; i < fi.animations.size(); ++i) + { + const gr2::Animation& src = fi.animations[i]; + AnimationRec& r = f.animations[i]; + r.src = &src; + r.pub.Name = src.name.c_str(); + r.pub.Duration = src.duration; + r.pub.TimeStep = src.time_step; + r.pub.Oversampling = src.oversampling; + r.entries.resize(src.text_tracks.size()); + for (size_t t = 0; t < src.text_tracks.size(); ++t) + { + for (const gr2::TextTrackEntry& e : src.text_tracks[t].entries) + r.entries[t].push_back({e.time_stamp, e.text.c_str()}); + granny_text_track tt{}; + tt.Name = src.text_tracks[t].name.c_str(); + tt.EntryCount = int32_t(r.entries[t].size()); + tt.Entries = r.entries[t].empty() ? nullptr : r.entries[t].data(); + r.text_tracks.push_back(tt); + } + r.group.Name = r.pub.Name; + r.group.TextTrackCount = int32_t(r.text_tracks.size()); + r.group.TextTracks = r.text_tracks.empty() ? nullptr : r.text_tracks.data(); + r.groups[0] = &r.group; + r.pub.TrackGroupCount = std::max(1, src.track_group_count); + r.pub.TrackGroups = r.groups; + f.animation_ptrs.push_back(&r.pub); + } + + granny_file_info& info = f.info; + info.FromFileName = fi.from_file_name.c_str(); + info.TextureCount = int32_t(f.texture_ptrs.size()); + info.Textures = f.texture_ptrs.data(); + info.MaterialCount = int32_t(f.material_ptrs.size()); + info.Materials = f.material_ptrs.data(); + info.SkeletonCount = int32_t(f.skeleton_ptrs.size()); + info.Skeletons = f.skeleton_ptrs.data(); + info.MeshCount = int32_t(f.mesh_ptrs.size()); + info.Meshes = f.mesh_ptrs.data(); + info.ModelCount = int32_t(f.model_ptrs.size()); + info.Models = f.model_ptrs.data(); + info.AnimationCount = int32_t(f.animation_ptrs.size()); + info.Animations = f.animation_ptrs.data(); +} +} // namespace + +// ── Files ────────────────────────────────────────────────────────────────────────────────────── + +granny_file* GrannyReadEntireFileFromMemory(granny_int32x MemorySize, void const* Memory) +{ + if (!Memory || MemorySize <= 0) + return nullptr; + gr2::LoadError err; + auto loaded = gr2::File::load(static_cast(Memory), size_t(MemorySize), &err); + if (!loaded) + { + if (g_log_callback.Function) + { + const std::string msg = err.stage + ": " + err.message; + g_log_callback.Function(GrannyErrorLogMessage, 0, __FILE__, __LINE__, msg.c_str(), g_log_callback.UserData); + } + return nullptr; + } + auto* f = new granny_file; + f->file.emplace(std::move(*loaded)); + build_file(*f); + return f; +} + +granny_file_info* GrannyGetFileInfo(granny_file* File) +{ + return File ? &File->info : nullptr; +} + +void GrannyFreeFile(granny_file* File) +{ + delete File; +} + +// PORT: libgr2 keeps every section it expanded; the data EterGrnLib reads after this call lives +// in the records, so there is nothing to release early. +void GrannyFreeFileSection(granny_file*, granny_int32x) +{ +} + +void GrannySetLogCallback(granny_log_callback const* LogCallback) +{ + g_log_callback = LogCallback ? *LogCallback : granny_log_callback{}; +} + +// ── Data types ───────────────────────────────────────────────────────────────────────────────── + +// PORT: the byte size of the type-definition array including its End entry, counted with the +// 32-byte 32-bit SDK sizeof(granny_data_type_definition) that Model.cpp divides by. +granny_int32x GrannyGetTotalTypeSize(granny_data_type_definition const* TypeDefinition) +{ + if (!TypeDefinition) + return 0; + granny_int32x count = 1; + for (const granny_data_type_definition* m = TypeDefinition; m->Type != GrannyEndMember; ++m) + ++count; + return count * 32; +} + +bool GrannyFindMatchingMember(granny_data_type_definition const* SourceType, void const* SourceObject, + char const* DestMemberName, granny_variant* Result) +{ + if (!SourceType || !Result) + return false; + const Layout layout(SourceType); + const int i = layout.find(DestMemberName); + if (i < 0) + return false; + Result->Type = const_cast(layout.members[i]); + Result->Object = SourceObject ? const_cast(static_cast(SourceObject) + layout.offsets[i]) : nullptr; + return true; +} + +void GrannyConvertSingleObject(granny_data_type_definition const* SourceType, void const* SourceObject, + granny_data_type_definition const* DestType, void* DestObject, granny_conversion_handler*) +{ + if (!SourceType || !SourceObject || !DestType || !DestObject) + return; + run_conversion(plan_conversion(Layout(SourceType), Layout(DestType)), static_cast(SourceObject), + static_cast(DestObject)); +} + +// ── Materials, skeletons, meshes ─────────────────────────────────────────────────────────────── + +granny_texture* GrannyGetMaterialTextureByType(granny_material const* Material, granny_material_texture_type Type) +{ + // The Max exporter's map usage names, matched ignoring case, spaces and hyphens. + static const char* const kUsage[] = {"", "ambientcolor", "diffusecolor", "specularcolor", "selfillumination", "opacity", + "bump", "reflection", "refraction", "displacement"}; + if (!Material || Type <= GrannyUnknownTextureType || Type >= GrannyOnePastLastMaterialTextureType) + return nullptr; + for (int i = 0; i < Material->MapCount; ++i) + { + const granny_material_map& map = Material->Maps[i]; + if (!map.Usage || !map.Material) + continue; + std::string usage; + for (const char* c = map.Usage; *c; ++c) + if (*c != ' ' && *c != '-') + usage += char(std::tolower((unsigned char)*c)); + if (usage == kUsage[Type]) + return map.Material->Texture; + } + return nullptr; +} + +bool GrannyFindBoneByName(granny_skeleton const* Skeleton, char const* BoneName, granny_int32x* BoneIndex) +{ + if (!Skeleton) + return false; + for (int i = 0; i < Skeleton->BoneCount; ++i) + if (name_equal(Skeleton->Bones[i].Name, BoneName)) + { + if (BoneIndex) + *BoneIndex = i; + return true; + } + return false; +} + +bool GrannyMeshIsRigid(granny_mesh const* Mesh) +{ + return !Mesh || mesh_rec(Mesh)->src->rigid; +} + +granny_int32x GrannyGetMeshVertexCount(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryVertexData ? Mesh->PrimaryVertexData->VertexCount : 0; +} + +granny_data_type_definition* GrannyGetMeshVertexType(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryVertexData ? Mesh->PrimaryVertexData->VertexType : nullptr; +} + +void* GrannyGetMeshVertices(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryVertexData ? Mesh->PrimaryVertexData->Vertices : nullptr; +} + +void GrannyCopyMeshVertices(granny_mesh const* Mesh, granny_data_type_definition const* VertexType, void* DestVertices) +{ + if (!Mesh || !Mesh->PrimaryVertexData || !VertexType || !DestVertices) + return; + const granny_vertex_data& vd = *Mesh->PrimaryVertexData; + const Layout src(vd.VertexType), dst(VertexType); + const std::vector plan = plan_conversion(src, dst); + for (int v = 0; v < vd.VertexCount; ++v) + run_conversion(plan, vd.Vertices + size_t(v) * src.size, static_cast(DestVertices) + size_t(v) * dst.size); +} + +granny_int32x GrannyGetMeshIndexCount(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryTopology ? Mesh->PrimaryTopology->IndexCount : 0; +} + +void GrannyCopyMeshIndices(granny_mesh const* Mesh, granny_int32x BytesPerIndex, void* DestIndices) +{ + if (!Mesh || !Mesh->PrimaryTopology || !DestIndices) + return; + const granny_tri_topology& t = *Mesh->PrimaryTopology; + for (int i = 0; i < t.IndexCount; ++i) + { + if (BytesPerIndex == 2) + static_cast(DestIndices)[i] = uint16_t(t.Indices[i]); + else if (BytesPerIndex == 4) + static_cast(DestIndices)[i] = uint32_t(t.Indices[i]); + else + static_cast(DestIndices)[i] = uint8_t(t.Indices[i]); + } +} + +granny_int32x GrannyGetMeshTriangleGroupCount(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryTopology ? Mesh->PrimaryTopology->GroupCount : 0; +} + +granny_tri_material_group* GrannyGetMeshTriangleGroups(granny_mesh const* Mesh) +{ + return Mesh && Mesh->PrimaryTopology ? Mesh->PrimaryTopology->Groups : nullptr; +} + +// ── Mesh binding and deformation ─────────────────────────────────────────────────────────────── + +struct granny_mesh_binding +{ + std::vector to_bone; +}; + +granny_mesh_binding* GrannyNewMeshBinding(granny_mesh const* Mesh, granny_skeleton const* FromSkeleton, granny_skeleton const* ToSkeleton) +{ + if (!Mesh) + return nullptr; + auto* b = new granny_mesh_binding; + for (int i = 0; i < Mesh->BoneBindingCount; ++i) + { + const char* name = Mesh->BoneBindings[i].BoneName; + granny_int32x from = 0, to = 0; + if (GrannyFindBoneByName(FromSkeleton, name, &from) && ToSkeleton && ToSkeleton != FromSkeleton) + name = FromSkeleton->Bones[from].Name; + if (!GrannyFindBoneByName(ToSkeleton, name, &to)) + to = 0; + b->to_bone.push_back(to); + } + return b; +} + +void GrannyFreeMeshBinding(granny_mesh_binding* Binding) +{ + delete Binding; +} + +granny_int32x const* GrannyGetMeshBindingToBoneIndices(granny_mesh_binding const* Binding) +{ + return Binding && !Binding->to_bone.empty() ? Binding->to_bone.data() : nullptr; +} + +struct granny_mesh_deformer +{ + Layout in, out; + std::vector tail; // every output member but Position/Normal + int in_position = -1, in_normal = -1, in_weights = -1, in_indices = -1; + int out_position = -1, out_normal = -1; + granny_deformation_type type; + + granny_mesh_deformer(granny_data_type_definition const* i, granny_data_type_definition const* o, granny_deformation_type t) + : in(i), out(o), type(t) + { + } +}; + +granny_mesh_deformer* GrannyNewMeshDeformer(granny_data_type_definition const* InputVertexLayout, + granny_data_type_definition const* OutputVertexLayout, + granny_deformation_type DeformationType, granny_deformer_tail_flags) +{ + if (!InputVertexLayout || !OutputVertexLayout) + return nullptr; + auto* d = new granny_mesh_deformer(InputVertexLayout, OutputVertexLayout, DeformationType); + d->in_position = d->in.find(GrannyVertexPositionName); + d->in_normal = d->in.find(GrannyVertexNormalName); + d->in_weights = d->in.find(GrannyVertexBoneWeightsName); + d->in_indices = d->in.find(GrannyVertexBoneIndicesName); + d->out_position = d->out.find(GrannyVertexPositionName); + d->out_normal = d->out.find(GrannyVertexNormalName); + if (d->in_position < 0 || d->out_position < 0) + { + delete d; + return nullptr; + } + // PORT: the tail (texture coordinates) is always copied, as the SDK's PNT deformers do, so the + // output needs no separate fill even with GrannyAllowUncopiedTail. + for (const MemberCopy& c : plan_conversion(d->in, d->out)) + if (c.dst_offset != d->out.offsets[d->out_position] && (d->out_normal < 0 || c.dst_offset != d->out.offsets[d->out_normal])) + d->tail.push_back(c); + return d; +} + +void GrannyFreeMeshDeformer(granny_mesh_deformer* Deformer) +{ + delete Deformer; +} + +namespace +{ +void read_vec(const Layout& l, int m, const uint8_t* v, float* out, int n) +{ + const granny_data_type_definition& d = *l.members[m]; + const int u = member_unit_size(d.Type), w = member_width(d); + for (int i = 0; i < n; ++i) + out[i] = i < w ? float(read_unit(d.Type, v + l.offsets[m] + i * u)) : 0.0f; +} + +void write_vec(const Layout& l, int m, uint8_t* v, const float* in, int n) +{ + const granny_data_type_definition& d = *l.members[m]; + const int u = member_unit_size(d.Type), w = member_width(d); + for (int i = 0; i < w; ++i) + write_unit(d.Type, v + l.offsets[m] + i * u, i < n ? in[i] : 0.0f); +} + +// Up to 4 influences from a BoneWeights/BoneIndices member; a single UInt32/Int32 packs 4 bytes. +int read_influences(const Layout& l, int m, const uint8_t* v, float* out, bool weights) +{ + const granny_data_type_definition& d = *l.members[m]; + const uint8_t* p = v + l.offsets[m]; + const int w = member_width(d); + if ((d.Type == GrannyUInt32Member || d.Type == GrannyInt32Member) && w == 1) + { + for (int i = 0; i < 4; ++i) + out[i] = weights ? p[i] / 255.0f : float(p[i]); + return 4; + } + const int n = std::min(w, 4), u = member_unit_size(d.Type); + for (int i = 0; i < n; ++i) + { + double x = read_unit(d.Type, p + i * u); + if (weights && (d.Type == GrannyUInt8Member || d.Type == GrannyInt8Member)) + x /= 255.0; + else if (weights && (d.Type == GrannyUInt16Member || d.Type == GrannyInt16Member)) + x /= 65535.0; + out[i] = float(x); + } + return n; +} +} // namespace + +void GrannyDeformVertices(granny_mesh_deformer const* Deformer, granny_int32x const* MatrixIndices, + granny_real32 const* MatrixBuffer4x4, granny_int32x VertexCount, + void const* SourceVertices, void* DestVertices) +{ + if (!Deformer || !MatrixBuffer4x4 || !SourceVertices || !DestVertices) + return; + const granny_mesh_deformer& d = *Deformer; + const bool normals = d.type != GrannyDeformPosition && d.in_normal >= 0 && d.out_normal >= 0; + for (int v = 0; v < VertexCount; ++v) + { + const uint8_t* src = static_cast(SourceVertices) + size_t(v) * d.in.size; + uint8_t* dst = static_cast(DestVertices) + size_t(v) * d.out.size; + run_conversion(d.tail, src, dst); + + float weights[4] = {1, 0, 0, 0}, indices[4] = {0, 0, 0, 0}; + int wn = 1, in = 1; + if (d.in_weights >= 0) + wn = read_influences(d.in, d.in_weights, src, weights, true); + if (d.in_indices >= 0) + in = read_influences(d.in, d.in_indices, src, indices, false); + const int n = std::min(wn, in); + + float p[3], nrm[3] = {0, 0, 0}, po[3] = {0, 0, 0}, no[3] = {0, 0, 0}; + read_vec(d.in, d.in_position, src, p, 3); + if (normals) + read_vec(d.in, d.in_normal, src, nrm, 3); + for (int k = 0; k < n; ++k) + { + const float w = weights[k]; + if (w == 0.0f) + continue; + const int local = int(indices[k]); + const int bone = MatrixIndices ? MatrixIndices[local] : local; + const float* M = MatrixBuffer4x4 + size_t(bone) * 16; + for (int c = 0; c < 3; ++c) + { + po[c] += w * (p[0] * M[0 + c] + p[1] * M[4 + c] + p[2] * M[8 + c] + M[12 + c]); + no[c] += w * (nrm[0] * M[0 + c] + nrm[1] * M[4 + c] + nrm[2] * M[8 + c]); + } + } + write_vec(d.out, d.out_position, dst, po, 3); + if (normals) + write_vec(d.out, d.out_normal, dst, no, 3); + } +} + +// ── Model instances and controls ─────────────────────────────────────────────────────────────── + +struct granny_model_instance +{ + const granny_model* model = nullptr; + std::vector controls; +}; + +struct granny_control +{ + granny_model_instance* instance = nullptr; + const AnimationRec* animation = nullptr; + std::vector bone_track; // model bone → animation track (-1: none) + bool live = false; + float current_clock = 0.0f; + float local_clock = 0.0f; + float speed = 1.0f; + granny_int32x loop_count = 1; + bool ease_in = false, ease_out = false; + float in_curve[6] = {0, 0, 0, 0, 1, 1}; // start, end, SV, ST, ET, EV + float out_curve[6] = {0, 0, 1, 1, 0, 0}; + bool complete_set = false; + float complete_clock = 0.0f; + bool free_once_unused = false; +}; + +namespace +{ +// Freed controls go back to a pool, never to the heap: EterGrnLib keeps asking about a control +// that the model freed once it completed (the SDK allocator reuses those blocks the same way). +std::vector& control_pool() +{ + static std::vector pool; + return pool; +} + +void release_control(granny_control* c) +{ + if (!c || !c->live) + return; + if (c->instance) + { + auto& v = c->instance->controls; + v.erase(std::remove(v.begin(), v.end(), c), v.end()); + } + c->live = false; + c->instance = nullptr; + control_pool().push_back(c); +} + +bool control_complete(const granny_control* c) +{ + return c->complete_set && c->current_clock >= c->complete_clock; +} + +float bezier(const float* curve, float clock) +{ + const float start = curve[0], end = curve[1]; + if (end <= start) + return clock < start ? curve[2] : curve[5]; + const float t = std::min(1.0f, std::max(0.0f, (clock - start) / (end - start))), s = 1.0f - t; + return s * s * s * curve[2] + 3 * s * s * t * curve[3] + 3 * s * t * t * curve[4] + t * t * t * curve[5]; +} + +float control_weight(const granny_control* c) +{ + if (control_complete(c)) + return 0.0f; + float w = 1.0f; + if (c->ease_in && c->current_clock < c->in_curve[1]) + w *= bezier(c->in_curve, c->current_clock); + if (c->ease_out && c->current_clock > c->out_curve[0]) + w *= bezier(c->out_curve, c->current_clock); + return w; +} + +float control_sample_time(const granny_control* c) +{ + const float dur = c->animation->pub.Duration; + if (dur <= 0.0f) + return 0.0f; + const float t = c->local_clock; + if (c->loop_count == 0) + { + const float m = std::fmod(t, dur); + return m < 0.0f ? m + dur : m; + } + if (t <= 0.0f) + return 0.0f; + if (t >= dur * c->loop_count) + return dur; + return std::fmod(t, dur); +} +} // namespace + +granny_model_instance* GrannyInstantiateModel(granny_model const* Model) +{ + if (!Model) + return nullptr; + auto* inst = new granny_model_instance; + inst->model = Model; + return inst; +} + +void GrannyFreeModelInstance(granny_model_instance* ModelInstance) +{ + if (!ModelInstance) + return; + while (!ModelInstance->controls.empty()) + release_control(ModelInstance->controls.back()); + delete ModelInstance; +} + +granny_skeleton* GrannyGetSourceSkeleton(granny_model_instance const* Model) +{ + return Model ? Model->model->Skeleton : nullptr; +} + +void GrannySetModelClock(granny_model_instance const* ModelInstance, granny_real32 NewClock) +{ + if (!ModelInstance) + return; + for (granny_control* c : ModelInstance->controls) + { + c->local_clock += (NewClock - c->current_clock) * c->speed; + c->current_clock = NewClock; + } +} + +void GrannyFreeCompletedModelControls(granny_model_instance const* ModelInstance) +{ + if (!ModelInstance) + return; + const std::vector controls = ModelInstance->controls; + for (granny_control* c : controls) + if (c->free_once_unused && control_complete(c)) + release_control(c); +} + +// PORT: Metin2 motions carry no root-motion accumulation, so the model matrix passes through. +void GrannyUpdateModelMatrix(granny_model_instance const*, granny_real32, granny_real32 const* ModelMatrix4x4, + granny_real32* DestMatrix4x4, bool) +{ + if (ModelMatrix4x4 && DestMatrix4x4 && ModelMatrix4x4 != DestMatrix4x4) + std::memmove(DestMatrix4x4, ModelMatrix4x4, sizeof(float) * 16); +} + +granny_control* GrannyPlayControlledAnimation(granny_real32 StartTime, granny_animation const* Animation, granny_model_instance* Model) +{ + if (!Animation || !Model) + return nullptr; + granny_control* c; + auto& pool = control_pool(); + if (pool.empty()) + c = new granny_control; + else + { + c = pool.back(); + pool.pop_back(); + *c = granny_control{}; + } + c->instance = Model; + c->animation = animation_rec(Animation); + c->live = true; + c->current_clock = StartTime; + + const granny_skeleton* sk = Model->model->Skeleton; + const auto& tracks = c->animation->src->tracks; + c->bone_track.assign(sk ? sk->BoneCount : 0, -1); + for (int b = 0; b < int(c->bone_track.size()); ++b) + for (size_t t = 0; t < tracks.size(); ++t) + if (name_equal(tracks[t].bone_name.c_str(), sk->Bones[b].Name)) + { + c->bone_track[b] = int(t); + break; + } + Model->controls.push_back(c); + return c; +} + +void GrannyFreeControl(granny_control* Control) +{ + release_control(Control); +} + +void GrannyFreeControlOnceUnused(granny_control* Control) +{ + if (Control) + Control->free_once_unused = true; +} + +bool GrannyFreeControlIfComplete(granny_control* Control) +{ + if (!Control || !Control->live || !control_complete(Control)) + return false; + release_control(Control); + return true; +} + +bool GrannyControlIsComplete(granny_control const* Control) +{ + return Control && control_complete(Control); +} + +void GrannyCompleteControlAt(granny_control* Control, granny_real32 AtSeconds) +{ + if (!Control) + return; + Control->complete_set = true; + Control->complete_clock = AtSeconds; +} + +void GrannySetControlSpeed(granny_control* Control, granny_real32 Speed) +{ + if (Control) + Control->speed = Speed; +} + +granny_real32 GrannyGetControlSpeed(granny_control const* Control) +{ + return Control ? Control->speed : 0.0f; +} + +void GrannySetControlLoopCount(granny_control* Control, granny_int32x LoopCount) +{ + if (Control) + Control->loop_count = LoopCount; +} + +granny_int32x GrannyGetControlLoopCount(granny_control const* Control) +{ + return Control ? Control->loop_count : 0; +} + +void GrannySetControlRawLocalClock(granny_control* Control, granny_real32 LocalClock) +{ + if (Control) + Control->local_clock = LocalClock; +} + +granny_real32 GrannyGetControlRawLocalClock(granny_control* Control) +{ + return Control ? Control->local_clock : 0.0f; +} + +granny_real32 GrannyGetControlLocalDuration(granny_control const* Control) +{ + return Control && Control->animation ? Control->animation->pub.Duration : 0.0f; +} + +void GrannySetControlEaseIn(granny_control* Control, bool EaseIn) +{ + if (Control) + Control->ease_in = EaseIn; +} + +void GrannySetControlEaseOut(granny_control* Control, bool EaseOut) +{ + if (Control) + Control->ease_out = EaseOut; +} + +void GrannySetControlEaseInCurve(granny_control* Control, granny_real32 StartSeconds, granny_real32 EndSeconds, + granny_real32 StartValue, granny_real32 StartTangent, granny_real32 EndTangent, granny_real32 EndValue) +{ + if (!Control) + return; + const float c[6] = {StartSeconds, EndSeconds, StartValue, StartTangent, EndTangent, EndValue}; + std::memcpy(Control->in_curve, c, sizeof c); +} + +void GrannySetControlEaseOutCurve(granny_control* Control, granny_real32 StartSeconds, granny_real32 EndSeconds, + granny_real32 StartValue, granny_real32 StartTangent, granny_real32 EndTangent, granny_real32 EndValue) +{ + if (!Control) + return; + const float c[6] = {StartSeconds, EndSeconds, StartValue, StartTangent, EndTangent, EndValue}; + std::memcpy(Control->out_curve, c, sizeof c); +} + +// ── Poses ────────────────────────────────────────────────────────────────────────────────────── + +struct granny_local_pose +{ + std::vector transforms; + std::vector weights; +}; + +struct granny_world_pose +{ + std::vector world; + std::vector composite; +}; + +granny_local_pose* GrannyNewLocalPose(granny_int32x BoneCount) +{ + auto* p = new granny_local_pose; + p->transforms.resize(std::max(0, BoneCount)); + p->weights.resize(std::max(0, BoneCount)); + return p; +} + +void GrannyFreeLocalPose(granny_local_pose* LocalPose) +{ + delete LocalPose; +} + +granny_world_pose* GrannyNewWorldPose(granny_int32x BoneCount) +{ + auto* p = new granny_world_pose; + p->world.assign(std::max(0, BoneCount), identity()); + p->composite.assign(std::max(0, BoneCount), identity()); + return p; +} + +void GrannyFreeWorldPose(granny_world_pose* WorldPose) +{ + delete WorldPose; +} + +namespace +{ +void accumulate(gr2::Transform& acc, float& total, const gr2::Transform& x, float w) +{ + if (total == 0.0f) + { + acc = gr2::Transform{}; + std::fill(std::begin(acc.position), std::end(acc.position), 0.0f); + std::fill(std::begin(acc.orientation), std::end(acc.orientation), 0.0f); + std::fill(std::begin(acc.scale_shear), std::end(acc.scale_shear), 0.0f); + } + // Keep every quaternion in the hemisphere of the running sum. + float dot = 0.0f; + for (int i = 0; i < 4; ++i) + dot += acc.orientation[i] * x.orientation[i]; + const float qs = dot < 0.0f ? -w : w; + for (int i = 0; i < 3; ++i) + acc.position[i] += w * x.position[i]; + for (int i = 0; i < 4; ++i) + acc.orientation[i] += qs * x.orientation[i]; + for (int i = 0; i < 9; ++i) + acc.scale_shear[i] += w * x.scale_shear[i]; + acc.flags |= x.flags; + total += w; +} + +void normalize(gr2::Transform& t, float total) +{ + if (total <= 0.0f) + { + t = gr2::Transform{}; + return; + } + for (float& v : t.position) + v /= total; + for (float& v : t.scale_shear) + v /= total; + float len = 0.0f; + for (float v : t.orientation) + len += v * v; + len = std::sqrt(len); + if (len > 0.0f) + for (float& v : t.orientation) + v /= len; + else + { + t.orientation[0] = t.orientation[1] = t.orientation[2] = 0.0f; + t.orientation[3] = 1.0f; + } +} +} // namespace + +void GrannySampleModelAnimationsAccelerated(granny_model_instance const* ModelInstance, granny_int32x BoneCount, + granny_real32 const* Offset4x4, granny_local_pose* Scratch, granny_world_pose* Result) +{ + if (!ModelInstance || !Scratch || !Result) + return; + const granny_skeleton* sk = ModelInstance->model->Skeleton; + if (!sk) + return; + const int n = std::min({BoneCount, sk->BoneCount, int(Scratch->transforms.size()), int(Result->world.size())}); + + std::fill(Scratch->weights.begin(), Scratch->weights.begin() + n, 0.0f); + gr2::Transform x; + for (const granny_control* c : ModelInstance->controls) + { + const float w = control_weight(c); + if (w <= 0.0f) + continue; + const float t = control_sample_time(c); + const auto& tracks = c->animation->src->tracks; + for (int b = 0; b < n && b < int(c->bone_track.size()); ++b) + { + if (c->bone_track[b] < 0) + continue; + tracks[c->bone_track[b]].sample(t, x); + accumulate(Scratch->transforms[b], Scratch->weights[b], x, w); + } + } + + // Bones the controls leave under the fill threshold blend in the bind pose. + const float kFillThreshold = 0.2f; + for (int b = 0; b < n; ++b) + { + float& total = Scratch->weights[b]; + if (total < kFillThreshold) + accumulate(Scratch->transforms[b], total, to_gr2(sk->Bones[b].LocalTransform), kFillThreshold - total); + normalize(Scratch->transforms[b], total); + } + + const Mat4 root = identity(); + for (int b = 0; b < n; ++b) + { + const Mat4 local = gr2::compose(Scratch->transforms[b]); + const int parent = sk->Bones[b].ParentIndex; + const float* p = (parent >= 0 && parent < b) ? Result->world[parent].data() : (Offset4x4 ? Offset4x4 : root.data()); + mul(local.data(), p, Result->world[b].data()); + mul(&sk->Bones[b].InverseWorld4x4[0][0], Result->world[b].data(), Result->composite[b].data()); + } +} + +granny_real32* GrannyGetWorldPose4x4(granny_world_pose const* WorldPose, granny_int32x BoneIndex) +{ + if (!WorldPose || BoneIndex < 0 || size_t(BoneIndex) >= WorldPose->world.size()) + return nullptr; + return const_cast(WorldPose->world[BoneIndex].data()); +} + +granny_real32* GrannyGetWorldPoseComposite4x4(granny_world_pose const* WorldPose, granny_int32x BoneIndex) +{ + if (!WorldPose || BoneIndex < 0 || size_t(BoneIndex) >= WorldPose->composite.size()) + return nullptr; + return const_cast(WorldPose->composite[BoneIndex].data()); +} + +granny_matrix_4x4* GrannyGetWorldPoseComposite4x4Array(granny_world_pose const* WorldPose) +{ + if (!WorldPose || WorldPose->composite.empty()) + return nullptr; + return reinterpret_cast(const_cast(WorldPose->composite.data())); +} diff --git a/extension/src/platform/EterGrnLib/LODController.cpp b/extension/src/platform/EterGrnLib/LODController.cpp deleted file mode 100644 index 819bdf44..00000000 --- a/extension/src/platform/EterGrnLib/LODController.cpp +++ /dev/null @@ -1,209 +0,0 @@ -// Platform skeleton for EterGrnLib/LODController.h (40250 EterGrnLib/LODController.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/LODController.h" - -#include "../PlatformStub.h" - -auto CGrannyLODController::SetMinLODMode(bool) -> void -{ - MT_PLATFORM_STUB(); -} - -CGrannyLODController::CGrannyLODController() -{ - MT_PLATFORM_STUB(); -} - -CGrannyLODController::~CGrannyLODController() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::CreateDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::AddModel(CGraphicThing *, int, CGrannyLODController *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::AttachModelInstance(CGrannyLODController *, const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::DetachModelInstance(CGrannyLODController *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetLODLimits(float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetLODLevel(BYTE) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetMaterialImagePointer(const char *, CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetMaterialData(const char *, const SMaterialData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetSpecularInfo(const char *, BOOL, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::RenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::RenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::BlendRenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::BlendRenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::Update(float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::UpdateLODLevel(float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::UpdateTime(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::UpdateSkeleton(const D3DXMATRIX *, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::Deform(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::DeformNoSkin(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::DeformAll(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::RenderToShadowMap() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::RenderShadow() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::ReloadTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::GetBoundBox(D3DXVECTOR3 *, D3DXVECTOR3 *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::Intersect(const D3DXMATRIX *, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyLODController::SetLocalTime(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::ResetLocalTime() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetMotionPointer(const CGrannyMotion *, float, int, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::ChangeMotionPointer(const CGrannyMotion *, int, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::SetMotionAtEnd() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::isModelInstance() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyLODController::GetModelInstance() -> CGrannyModelInstance * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyLODController::SetCurrentModelInstance(CGrannyModelInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::RefreshAttachedModelInstance() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyLODController::__ReserveSharedDeformableVertexBuffer(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} diff --git a/extension/src/platform/EterGrnLib/Material.cpp b/extension/src/platform/EterGrnLib/Material.cpp deleted file mode 100644 index 1fb9767b..00000000 --- a/extension/src/platform/EterGrnLib/Material.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// Platform skeleton for EterGrnLib/Material.h (40250 EterGrnLib/Material.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Material.h" - -#include "../PlatformStub.h" - -auto CGrannyMaterial::CreateSphereMap(UINT, const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::DestroySphereMap() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::TranslateSpecularMatrix(float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -decltype(CGrannyMaterial::ms_matSpecular) CGrannyMaterial::ms_matSpecular{}; - -decltype(CGrannyMaterial::ms_v3SpecularTrans) CGrannyMaterial::ms_v3SpecularTrans{}; - -CGrannyMaterial::CGrannyMaterial() -{ - MT_PLATFORM_STUB(); -} - -CGrannyMaterial::~CGrannyMaterial() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::Copy(CGrannyMaterial &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::IsEqual(granny_material *) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::IsIn(const char *, int *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::SetSpecularInfo(BOOL, float, BYTE) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::ApplyRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::RestoreRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::CreateFromGrannyMaterialPointer(granny_material *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::SetImagePointer(int, CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::GetType() const -> CGrannyMaterial::EType -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::GetImagePointer(int) const -> CGraphicImage * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::GetDiffuseTexture() const -> const CGraphicTexture * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::GetOpacityTexture() const -> const CGraphicTexture * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::GetD3DTexture(int) const -> LPDIRECT3DTEXTURE8 -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::__GetImagePointer(const char *) -> CGraphicImage * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::__IsSpecularEnable() const -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::__GetSpecularPower() const -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterial::__ApplyDiffuseRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::__RestoreDiffuseRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::__ApplySpecularRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterial::__RestoreSpecularRenderState() -> void -{ - MT_PLATFORM_STUB(); -} - -decltype(CGrannyMaterial::ms_akSphereMapInstance) CGrannyMaterial::ms_akSphereMapInstance{}; - -CGrannyMaterialPalette::CGrannyMaterialPalette() -{ - MT_PLATFORM_STUB(); -} - -CGrannyMaterialPalette::~CGrannyMaterialPalette() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::Copy(const CGrannyMaterialPalette &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::RegisterMaterial(granny_material *) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterialPalette::SetMaterialImagePointer(const char *, CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::SetMaterialData(const char *, const SMaterialData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::SetSpecularInfo(const char *, BOOL, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMaterialPalette::GetMaterialRef(DWORD) -> CGrannyMaterial & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMaterialPalette::GetMaterialCount() const -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterGrnLib/Mesh.cpp b/extension/src/platform/EterGrnLib/Mesh.cpp deleted file mode 100644 index ba0a54de..00000000 --- a/extension/src/platform/EterGrnLib/Mesh.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// Platform skeleton for EterGrnLib/Mesh.h (40250 EterGrnLib/Mesh.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Mesh.h" - -#include "../PlatformStub.h" - -CGrannyMesh::CGrannyMesh() -{ - MT_PLATFORM_STUB(); -} - -CGrannyMesh::~CGrannyMesh() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::IsEmpty() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::CreateFromGrannyMeshPointer(granny_skeleton *, granny_mesh *, int, int, CGrannyMaterialPalette &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::LoadIndices(void *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::LoadPNTVertices(void *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::NEW_LoadVertices(void *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::SetPNT2Mesh() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::DeformPNTVertices(void *, D3DXMATRIX *, granny_mesh_binding *) const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::CanDeformPNTVertices() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::IsTwoSide() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetVertexCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetDefaultBoneIndices() const -> int * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetVertexBasePosition() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetIndexBasePosition() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetGrannyMeshPointer() const -> const granny_mesh * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::GetTriGroupNodeList(CGrannyMaterial::EType) const -> const CGrannyMesh::TTriGroupNode * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::RebuildTriGroupNodeList() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::ReloadMaterials() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMesh::LoadMaterials(CGrannyMaterialPalette &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterGrnLib/Model.cpp b/extension/src/platform/EterGrnLib/Model.cpp deleted file mode 100644 index 55aed494..00000000 --- a/extension/src/platform/EterGrnLib/Model.cpp +++ /dev/null @@ -1,178 +0,0 @@ -// Platform skeleton for EterGrnLib/Model.h (40250 EterGrnLib/Model.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Model.h" - -#include "../PlatformStub.h" - -CGrannyModel::CGrannyModel() -{ - MT_PLATFORM_STUB(); -} - -CGrannyModel::~CGrannyModel() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::IsEmpty() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::CreateFromGrannyModelPointer(granny_model *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::GetRigidVertexCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetDeformVertexCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetVertexCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::CanDeformPNTVertices() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::DeformPNTVertices(void *, D3DXMATRIX *, const std::vector &) const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::GetIdxCount() -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetMeshCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetMeshPointer(int) -> CGrannyMesh * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetGrannyModelPointer() -> granny_model * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetMeshPointer(int) const -> const CGrannyMesh * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetPNTD3DVertexBuffer() const -> LPDIRECT3DVERTEXBUFFER8 -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetD3DIndexBuffer() const -> LPDIRECT3DINDEXBUFFER8 -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::GetMeshNodeList(CGrannyMesh::EType, CGrannyMaterial::EType) const -> const CGrannyModel::TMeshNode * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::LockVertices(void **, void **) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::UnlockVertices() const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::GetMaterialPalette() const -> const CGrannyMaterialPalette & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::LoadMeshs() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::LoadPNTVertices() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::LoadIndices() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::CheckMeshIndex(int) const -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModel::AppendMeshNode(CGrannyMesh::EType, CGrannyMaterial::EType, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModel::__LoadVertices() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterGrnLib/ModelInstance.cpp b/extension/src/platform/EterGrnLib/ModelInstance.cpp deleted file mode 100644 index 4764f7c8..00000000 --- a/extension/src/platform/EterGrnLib/ModelInstance.cpp +++ /dev/null @@ -1,379 +0,0 @@ -// Platform skeleton for EterGrnLib/ModelInstance.h (40250 EterGrnLib/ModelInstance.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/ModelInstance.h" - -#include "../PlatformStub.h" - -auto CGrannyModelInstance::DestroySystem() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::New() -> CGrannyModelInstance * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::Delete(CGrannyModelInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -decltype(CGrannyModelInstance::ms_kPool) CGrannyModelInstance::ms_kPool{}; - -CGrannyModelInstance::CGrannyModelInstance() -{ - MT_PLATFORM_STUB(); -} - -CGrannyModelInstance::~CGrannyModelInstance() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::IsEmpty() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::Update(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::UpdateLocalTime(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::UpdateTransform(D3DXMATRIX *, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::UpdateSkeleton(const D3DXMATRIX *, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::DeformNoSkin(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::Deform(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::BlendRenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::BlendRenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderWithoutTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::GetModel() -> CGrannyModel * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::SetMaterialImagePointer(const char *, CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetMaterialData(const char *, const SMaterialData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetSpecularInfo(const char *, BOOL, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetMainModelPointer(CGrannyModel *, CGraphicVertexBuffer *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetLinkedModelPointer(CGrannyModel *, CGraphicVertexBuffer *, CGrannyModelInstance **) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetMotionPointer(const CGrannyMotion *, float, int, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::ChangeMotionPointer(const CGrannyMotion *, int, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetMotionAtEnd() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::IsMotionPlaying() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::CopyMotion(CGrannyModelInstance *, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetLocalTime(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::ResetLocalTime() -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetLocalTime() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetNextTime() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetDeformableVertexCount() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetVertexCount() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetBoneMatrixPointer(int) const -> const float * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetCompositeBoneMatrixPointer(int) const -> const float * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetMeshMatrixPointer(int, const D3DXMATRIX **) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::GetBoneIndexByName(const char *, int *) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance *, const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance *, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::Intersect(const D3DXMATRIX *, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::MakeBoundBox(TBoundBox *, const float *, const float *, const float *, D3DXVECTOR3 *, D3DXVECTOR3 *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::GetBoundBox(D3DXVECTOR3 *, D3DXVECTOR3 *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::ReloadTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__DestroyModelInstance() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__DestroyMeshMatrices() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__DestroyDynamicVertexBuffer() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__CreateModelInstance() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__CreateMeshMatrices() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__CreateDynamicVertexBuffer() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__DestroyWorldPose() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__CreateWorldPose(CGrannyModelInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__CreateMeshBindingVector(CGrannyModelInstance *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::__DestroyMeshBindingVector() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__GetMeshBoneIndices(unsigned int) const -> int * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::__IsDeformableVertexBuffer() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::__SetSharedDeformableVertexBuffer(CGraphicVertexBuffer *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr() -> IDirect3DVertexBuffer8 * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::__GetDeformableVertexBufferRef() -> CGraphicVertexBuffer & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::__GetWorldPosePtr() const -> granny_world_pose * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyModelInstance::UpdateWorldPose() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::UpdateWorldMatrices(const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::DeformPNTVertices(void *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderMeshNodeListWithOneTexture(CGrannyMesh::EType, CGrannyMaterial::EType) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderMeshNodeListWithTwoTexture(CGrannyMesh::EType, CGrannyMaterial::EType) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyModelInstance::RenderMeshNodeListWithoutTexture(CGrannyMesh::EType, CGrannyMaterial::EType) -> void -{ - MT_PLATFORM_STUB(); -} diff --git a/extension/src/platform/EterGrnLib/Motion.cpp b/extension/src/platform/EterGrnLib/Motion.cpp deleted file mode 100644 index 752c9c89..00000000 --- a/extension/src/platform/EterGrnLib/Motion.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Platform skeleton for EterGrnLib/Motion.h (40250 EterGrnLib/Motion.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Motion.h" - -#include "../PlatformStub.h" - -CGrannyMotion::CGrannyMotion() -{ - MT_PLATFORM_STUB(); -} - -CGrannyMotion::~CGrannyMotion() -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMotion::IsEmpty() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMotion::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMotion::BindGrannyAnimation(granny_animation *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMotion::GetGrannyAnimationPointer() const -> granny_animation * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMotion::GetName() const -> const char * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMotion::GetDuration() const -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGrannyMotion::GetTextTrack(const char *, int *, float *) const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGrannyMotion::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} diff --git a/extension/src/platform/EterGrnLib/Thing.cpp b/extension/src/platform/EterGrnLib/Thing.cpp deleted file mode 100644 index 6f4f64ca..00000000 --- a/extension/src/platform/EterGrnLib/Thing.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Platform skeleton for EterGrnLib/Thing.h (40250 EterGrnLib/Thing.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Thing.h" - -#include "../PlatformStub.h" - -auto CGraphicThing::Type() -> CGraphicThing::TType -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -CGraphicThing::CGraphicThing(const char * c_szFileName) : CResource(c_szFileName) // initializers as in 40250 -{ - MT_PLATFORM_STUB(); -} - -CGraphicThing::~CGraphicThing() -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThing::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThing::CheckModelIndex(int) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::GetModelPointer(int) -> CGrannyModel * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::GetModelCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::CheckMotionIndex(int) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::GetMotionPointer(int) -> CGrannyMotion * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::GetMotionCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThing::LoadModels() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::LoadMotions() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::OnLoad(int, const void *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::OnClear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThing::OnIsEmpty() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThing::OnIsType(TType) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterGrnLib/ThingInstance.cpp b/extension/src/platform/EterGrnLib/ThingInstance.cpp deleted file mode 100644 index 0b887c68..00000000 --- a/extension/src/platform/EterGrnLib/ThingInstance.cpp +++ /dev/null @@ -1,440 +0,0 @@ -// Platform skeleton for EterGrnLib/ThingInstance.h (40250 EterGrnLib/ThingInstance.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/ThingInstance.h" - -#include "../PlatformStub.h" - -CGraphicThingInstance::CGraphicThingInstance() -{ - MT_PLATFORM_STUB(); -} - -CGraphicThingInstance::~CGraphicThingInstance() -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::DeformNoSkin() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::UpdateLODLevel() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::UpdateTime() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::DeformAll() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::LessRenderOrder(CGraphicThingInstance *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::Picking(const D3DXVECTOR3 &, const D3DXVECTOR3 &, float &, float &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::OnInitialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::ReserveModelInstance(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::ReserveModelThing(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::CheckModelInstanceIndex(int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::CheckModelThingIndex(int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::CheckMotionThingIndex(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetMotionThingPointer(DWORD, CGraphicThing **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::IsMotionThing() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::RegisterModelThing(int, CGraphicThing *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::RegisterLODThing(int, CGraphicThing *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::RegisterMotionThing(DWORD, CGraphicThing *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::SetModelInstance(int, int, int, int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::SetEndStopMotion() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::SetMotionAtEnd() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::AttachModelInstance(int, const char *, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::AttachModelInstance(int, const char *, CGraphicThingInstance &, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::DetachModelInstance(int, CGraphicThingInstance &, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::FindBoneIndex(int, const char *, int *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetBonePosition(int, int, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::ResetLocalTime() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::InsertDelay(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::SetMaterialImagePointer(UINT, const char *, CGraphicImage *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::SetMaterialData(UINT, const char *, SMaterialData) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::SetSpecularInfo(UINT, const char *, BOOL, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::__SetLocalTime(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::GetLastLocalTime() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetLocalTime() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetSecondElapsed() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetAverageSecondElapsed() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetLODLevel(DWORD) -> BYTE -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetHeight() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::RenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::RenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::BlendRenderWithOneTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::BlendRenderWithTwoTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::GetLODControllerCount() const -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetLODControllerPointer(DWORD) const -> CGrannyLODController * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetLODControllerPointer(DWORD) -> CGrannyLODController * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::ReloadTexture() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::GetBaseThingPtr() -> CGraphicThing * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::SetMotion(DWORD, float, int, float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::ChangeMotion(DWORD, int, float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::Intersect(float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetBoundBox(D3DXVECTOR3 *, D3DXVECTOR3 *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::GetBoundBox(DWORD, D3DXVECTOR3 *, D3DXVECTOR3 *) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetBoneMatrix(DWORD, DWORD, D3DXMATRIX **) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetCompositeBoneMatrix(DWORD, DWORD, D3DXMATRIX **) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::UpdateTransform(D3DXMATRIX *, float, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::ProjectShadow(const CGraphicShadowTexture &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::BuildBoundingSphere() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::BuildBoundingAABB() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::CalculateBBox() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::GetBoundingSphere(D3DXVECTOR3 &, float &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::GetBoundingAABB(D3DXVECTOR3 &, D3DXVECTOR3 &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::OnClear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnDeform() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnUpdate() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnRender() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnBlendRender() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnRenderToShadowMap() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnRenderShadow() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnRenderPCBlocker() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnUpdateCollisionData(const CStaticCollisionDataVector *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnUpdateHeighInstance(CAttributeInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::OnGetObjectHeight(float, float, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::CreateSystem(UINT) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::DestroySystem() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicThingInstance::New() -> CGraphicThingInstance * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicThingInstance::Delete(CGraphicThingInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -decltype(CGraphicThingInstance::ms_kPool) CGraphicThingInstance::ms_kPool{}; - -auto CGraphicThingInstance::HaveBlendThing() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterGrnLib/Util.cpp b/extension/src/platform/EterGrnLib/Util.cpp deleted file mode 100644 index 981cb0e1..00000000 --- a/extension/src/platform/EterGrnLib/Util.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// Platform skeleton for EterGrnLib/Util.h (40250 EterGrnLib/Util.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterGrnLib/StdAfx.h" -#include "EterGrnLib/Util.h" - -#include "../PlatformStub.h" - -auto GrannyMeshIsDeform(granny_mesh *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterLib/CpuBuffer.h b/extension/src/platform/EterLib/CpuBuffer.h new file mode 100644 index 00000000..113697c1 --- /dev/null +++ b/extension/src/platform/EterLib/CpuBuffer.h @@ -0,0 +1,47 @@ +#pragma once +// CPU-memory vertex/index buffers behind the D3D8 buffer handles. 40250 fills its buffers through +// Lock/Unlock (CGrannyModel::__LoadVertices, CGrannyModelInstance deform) and the renderer later reads +// them back, so the platform keeps the bytes in memory instead of creating device objects. +#include "EterLib/StdAfx.h" + +#include +#include + +struct MtCpuVertexBuffer : IDirect3DVertexBuffer8 +{ + std::vector bytes; + DWORD fvf = 0; +}; + +struct MtCpuIndexBuffer : IDirect3DIndexBuffer8 +{ + std::vector bytes; + D3DFORMAT format = D3DFMT_INDEX16; +}; + +// D3DXGetFVFVertexSize. +inline unsigned mt_fvf_vertex_size(DWORD fvf) +{ + unsigned size = 0; + switch (fvf & D3DFVF_POSITION_MASK) + { + case D3DFVF_XYZ: size += 12; break; + case D3DFVF_XYZRHW: size += 16; break; + case D3DFVF_XYZB1: size += 16; break; + case D3DFVF_XYZB2: size += 20; break; + case D3DFVF_XYZB3: size += 24; break; + case D3DFVF_XYZB4: size += 28; break; + case D3DFVF_XYZB5: size += 32; break; + } + if (fvf & D3DFVF_NORMAL) size += 12; + if (fvf & D3DFVF_PSIZE) size += 4; + if (fvf & D3DFVF_DIFFUSE) size += 4; + if (fvf & D3DFVF_SPECULAR) size += 4; + const unsigned texCount = (fvf & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT; + for (unsigned i = 0; i < texCount; ++i) + { + static const unsigned coordSize[4] = { 8, 12, 16, 4 }; + size += coordSize[(fvf >> (16 + i * 2)) & 3]; + } + return size; +} diff --git a/extension/src/platform/EterLib/GrpCollisionObject.cpp b/extension/src/platform/EterLib/GrpCollisionObject.cpp deleted file mode 100644 index 8f6ae87e..00000000 --- a/extension/src/platform/EterLib/GrpCollisionObject.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Platform skeleton for EterLib/GrpCollisionObject.h (40250 EterLib/GrpCollisionObject.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterLib/StdAfx.h" -#include "EterLib/GrpCollisionObject.h" - -#include "../PlatformStub.h" - -CGraphicCollisionObject::CGraphicCollisionObject() -{ - MT_PLATFORM_STUB(); -} - -CGraphicCollisionObject::~CGraphicCollisionObject() -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicCollisionObject::IntersectTriangle(const D3DXVECTOR3 &, const D3DXVECTOR3 &, const D3DXVECTOR3 &, const D3DXVECTOR3 &, const D3DXVECTOR3 &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectBoundBox(const D3DXMATRIX *, const TBoundBox &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectCube(const D3DXMATRIX *, float, float, float, float, float, float, D3DXVECTOR3 &, D3DXVECTOR3 &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectIndexedMesh(const D3DXMATRIX *, const void *, int, int, const void *, int, D3DXVECTOR3 &, D3DXVECTOR3 &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectMesh(const D3DXMATRIX *, const void *, DWORD, DWORD, D3DXVECTOR3 &, D3DXVECTOR3 &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 &, float, const D3DXVECTOR3 &, const D3DXVECTOR3 &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 &, float, float, const D3DXVECTOR3 &, const D3DXVECTOR3 &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 &, float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 &, float, float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterLib/GrpIndexBuffer.cpp b/extension/src/platform/EterLib/GrpIndexBuffer.cpp index fef90784..548ffaea 100644 --- a/extension/src/platform/EterLib/GrpIndexBuffer.cpp +++ b/extension/src/platform/EterLib/GrpIndexBuffer.cpp @@ -1,88 +1,126 @@ -// Platform skeleton for EterLib/GrpIndexBuffer.h (40250 EterLib/GrpIndexBuffer.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. +// 40250 EterLib/GrpIndexBuffer.cpp over CPU memory (CpuBuffer.h). #include "EterLib/StdAfx.h" #include "EterLib/GrpIndexBuffer.h" +#include "EterLib/StateManager.h" -#include "../PlatformStub.h" +#include "CpuBuffer.h" + +namespace { +BYTE* index_bytes(LPDIRECT3DINDEXBUFFER8 buffer) +{ + return static_cast(buffer)->bytes.data(); +} +} + +LPDIRECT3DINDEXBUFFER8 CGraphicIndexBuffer::GetD3DIndexBuffer() const +{ + assert(m_lpd3dIdxBuf!=NULL); + return m_lpd3dIdxBuf; +} + +void CGraphicIndexBuffer::SetIndices(int startIndex) const +{ + STATEMANAGER.SetIndices(m_lpd3dIdxBuf, startIndex); +} + +bool CGraphicIndexBuffer::Lock(void** pretIndices) const +{ + assert(m_lpd3dIdxBuf!=NULL); + + *pretIndices = index_bytes(m_lpd3dIdxBuf); + return true; +} + +void CGraphicIndexBuffer::Unlock() const +{ + assert(m_lpd3dIdxBuf!=NULL); +} + +bool CGraphicIndexBuffer::Lock(void** pretIndices) +{ + assert(m_lpd3dIdxBuf!=NULL); + + *pretIndices = index_bytes(m_lpd3dIdxBuf); + return true; +} + +void CGraphicIndexBuffer::Unlock() +{ + assert(m_lpd3dIdxBuf!=NULL); +} + +bool CGraphicIndexBuffer::Copy(int bufSize, const void* srcIndices) +{ + assert(m_lpd3dIdxBuf!=NULL); + + memcpy(index_bytes(m_lpd3dIdxBuf), srcIndices, bufSize); + return true; +} + +bool CGraphicIndexBuffer::Create(int faceCount, TFace* faces) +{ + int idxCount = faceCount * 3; + m_iidxCount = idxCount; + if (!Create(idxCount, D3DFMT_INDEX16)) + return false; + + WORD* dstIndices = reinterpret_cast(index_bytes(m_lpd3dIdxBuf)); + + for (int i = 0; iindices[0]; + dstIndices[1]=curFace->indices[1]; + dstIndices[2]=curFace->indices[2]; + } + + return true; +} + +bool CGraphicIndexBuffer::CreateDeviceObjects() +{ + MtCpuIndexBuffer* buffer = new MtCpuIndexBuffer; + buffer->bytes.assign(m_dwBufferSize, 0); + buffer->format = m_d3dFmt; + m_lpd3dIdxBuf = buffer; + return true; +} + +void CGraphicIndexBuffer::DestroyDeviceObjects() +{ + delete static_cast(m_lpd3dIdxBuf); + m_lpd3dIdxBuf = NULL; +} + +bool CGraphicIndexBuffer::Create(int idxCount, D3DFORMAT d3dFmt) +{ + Destroy(); + + m_iidxCount = idxCount; + m_dwBufferSize = sizeof(WORD) * idxCount; + m_d3dFmt = d3dFmt; + + return CreateDeviceObjects(); +} + +void CGraphicIndexBuffer::Destroy() +{ + DestroyDeviceObjects(); +} + +void CGraphicIndexBuffer::Initialize() +{ + m_lpd3dIdxBuf=NULL; + m_iidxCount=0; + m_dwBufferSize=0; +} CGraphicIndexBuffer::CGraphicIndexBuffer() { - MT_PLATFORM_STUB(); + Initialize(); } CGraphicIndexBuffer::~CGraphicIndexBuffer() { - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::Create(int, D3DFORMAT) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::Create(int, TFace *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::Copy(int, const void *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::Lock(void **) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::Unlock() const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::Lock(void **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::Unlock() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::SetIndices(int) const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicIndexBuffer::GetD3DIndexBuffer() const -> LPDIRECT3DINDEXBUFFER8 -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicIndexBuffer::Initialize() -> void -{ - MT_PLATFORM_STUB(); + Destroy(); } diff --git a/extension/src/platform/EterLib/GrpObjectInstance.cpp b/extension/src/platform/EterLib/GrpObjectInstance.cpp deleted file mode 100644 index 3dbb2458..00000000 --- a/extension/src/platform/EterLib/GrpObjectInstance.cpp +++ /dev/null @@ -1,270 +0,0 @@ -// Platform skeleton for EterLib/GrpObjectInstance.h (40250 EterLib/GrpObjectInstance.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. -#include "EterLib/StdAfx.h" -#include "EterLib/GrpObjectInstance.h" - -#include "../PlatformStub.h" - -CGraphicObjectInstance::CGraphicObjectInstance() -{ - MT_PLATFORM_STUB(); -} - -CGraphicObjectInstance::~CGraphicObjectInstance() -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::GetPosition() const -> const D3DXVECTOR3 & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetScale() const -> const D3DXVECTOR3 & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetRotation() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetYaw() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetPitch() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetRoll() -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::SetPosition(float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetPosition(const D3DXVECTOR3 &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetScale(float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetRotation(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetRotation(float, float, float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetRotationQuaternion(const D3DXQUATERNION &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::SetRotationMatrix(const D3DXMATRIX &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Update() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Render() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::BlendRender() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::RenderToShadowMap() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::RenderShadow() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::RenderPCBlocker() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Deform() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Transform() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Show() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::Hide() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::isShow() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::isIntersect(const CRay &, float *, float *, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetWTBBoxVertex(const unsigned char &) -> D3DXVECTOR4 & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetTransform() -> D3DXMATRIX & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::SetPortal(DWORD, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::GetPortal(DWORD) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::Initialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::OnInitialize() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::UpdateBoundingSphere() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::RegisterBoundingSphere() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::AddCollision(const CStaticCollisionData *, const D3DXMATRIX *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::ClearCollision() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::CollisionDynamicSphere(const CDynamicSphereInstance &) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::MovementCollisionDynamicSphere(const CDynamicSphereInstance &) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetCollisionMovementAdjust(const CDynamicSphereInstance &) const -> D3DXVECTOR3 -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::UpdateCollisionData(const CStaticCollisionDataVector *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::GetCollisionInstanceCount() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetCollisionInstanceData(DWORD) -> CBaseCollisionInstance * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::SetHeightInstance(CAttributeInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::ClearHeightInstance() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::UpdateHeightInstance(CAttributeInstance *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicObjectInstance::IsObjectHeight() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicObjectInstance::GetObjectHeight(float, float, float *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/EterLib/GrpVertexBuffer.cpp b/extension/src/platform/EterLib/GrpVertexBuffer.cpp index 4e7f33a0..ef09f9ad 100644 --- a/extension/src/platform/EterLib/GrpVertexBuffer.cpp +++ b/extension/src/platform/EterLib/GrpVertexBuffer.cpp @@ -1,114 +1,160 @@ -// Platform skeleton for EterLib/GrpVertexBuffer.h (40250 EterLib/GrpVertexBuffer.cpp), generated by platform_stub.py. -// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation. +// 40250 EterLib/GrpVertexBuffer.cpp over CPU memory (CpuBuffer.h): the device buffer is a byte vector +// that Lock hands out directly, so Granny vertex loading and deform write real data. #include "EterLib/StdAfx.h" #include "EterLib/GrpVertexBuffer.h" +#include "EterLib/StateManager.h" -#include "../PlatformStub.h" +#include "CpuBuffer.h" + +int CGraphicVertexBuffer::GetVertexStride() const +{ + int retSize = mt_fvf_vertex_size(m_dwFVF); + return retSize; +} + +DWORD CGraphicVertexBuffer::GetFlexibleVertexFormat() const +{ + return m_dwFVF; +} + +int CGraphicVertexBuffer::GetVertexCount() const +{ + return m_vtxCount; +} + +void CGraphicVertexBuffer::SetStream(int stride, int layer) const +{ + STATEMANAGER.SetStreamSource(layer, m_lpd3dVB, stride); +} + +bool CGraphicVertexBuffer::LockRange(unsigned count, void** pretVertices) const +{ + if (!m_lpd3dVB) + return false; + + *pretVertices = static_cast(m_lpd3dVB)->bytes.data(); + return true; +} + +bool CGraphicVertexBuffer::Lock(void ** pretVertices) const +{ + if (!m_lpd3dVB) + return false; + + *pretVertices = static_cast(m_lpd3dVB)->bytes.data(); + return true; +} + +bool CGraphicVertexBuffer::Unlock() const +{ + if (!m_lpd3dVB) + return false; + return true; +} + +// Returns true when a buffer exists, as 40250 does. +bool CGraphicVertexBuffer::IsEmpty() const +{ + if (m_lpd3dVB) + return true; + else + return false; +} + +bool CGraphicVertexBuffer::LockDynamic(void** pretVertices) +{ + if (!m_lpd3dVB) + return false; + + *pretVertices = static_cast(m_lpd3dVB)->bytes.data(); + return true; +} + +bool CGraphicVertexBuffer::Lock(void ** pretVertices) +{ + if (!m_lpd3dVB) + return false; + + *pretVertices = static_cast(m_lpd3dVB)->bytes.data(); + return true; +} + +bool CGraphicVertexBuffer::Unlock() +{ + if (!m_lpd3dVB) + return false; + return true; +} + +bool CGraphicVertexBuffer::Copy(int bufSize, const void* srcVertices) +{ + void * dstVertices; + + if (!Lock(&dstVertices)) + return false; + + memcpy(dstVertices, srcVertices, bufSize); + + Unlock(); + return true; +} + +bool CGraphicVertexBuffer::CreateDeviceObjects() +{ + assert(m_lpd3dVB == NULL); + + MtCpuVertexBuffer* buffer = new MtCpuVertexBuffer; + buffer->bytes.assign(m_dwBufferSize, 0); + buffer->fvf = m_dwFVF; + m_lpd3dVB = buffer; + return true; +} + +void CGraphicVertexBuffer::DestroyDeviceObjects() +{ + delete static_cast(m_lpd3dVB); + m_lpd3dVB = NULL; +} + +bool CGraphicVertexBuffer::Create(int vtxCount, DWORD fvf, DWORD usage, D3DPOOL d3dPool) +{ + assert(vtxCount > 0); + + Destroy(); + + m_vtxCount = vtxCount; + m_dwBufferSize = mt_fvf_vertex_size(fvf) * m_vtxCount; + m_d3dPool = d3dPool; + m_dwUsage = usage; + m_dwFVF = fvf; + + if (usage == D3DUSAGE_WRITEONLY || usage == D3DUSAGE_DYNAMIC) + m_dwLockFlag = 0; + else + m_dwLockFlag = D3DLOCK_READONLY; + + return CreateDeviceObjects(); +} + +void CGraphicVertexBuffer::Destroy() +{ + DestroyDeviceObjects(); +} + +void CGraphicVertexBuffer::Initialize() +{ + m_lpd3dVB = NULL; + m_vtxCount = 0; + m_dwBufferSize = 0; + m_dwFVF = 0; +} CGraphicVertexBuffer::CGraphicVertexBuffer() { - MT_PLATFORM_STUB(); + Initialize(); } CGraphicVertexBuffer::~CGraphicVertexBuffer() { - MT_PLATFORM_STUB(); -} - -auto CGraphicVertexBuffer::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicVertexBuffer::Create(int, DWORD, DWORD, D3DPOOL) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::CreateDeviceObjects() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::DestroyDeviceObjects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicVertexBuffer::Copy(int, const void *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::LockRange(unsigned int, void **) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::Lock(void **) const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::Unlock() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::LockDynamic(void **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::Lock(void **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::Unlock() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::SetStream(int, int) const -> void -{ - MT_PLATFORM_STUB(); -} - -auto CGraphicVertexBuffer::GetVertexCount() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::GetVertexStride() const -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::GetFlexibleVertexFormat() const -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::IsEmpty() const -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CGraphicVertexBuffer::Initialize() -> void -{ - MT_PLATFORM_STUB(); + Destroy(); } diff --git a/extension/src/platform/EterLib/HostCursor.h b/extension/src/platform/EterLib/HostCursor.h new file mode 100644 index 00000000..26f2eb58 --- /dev/null +++ b/extension/src/platform/EterLib/HostCursor.h @@ -0,0 +1,4 @@ +#pragma once +// The cursor in client coordinates, as the host (Godot) last pushed it. 40250 CMSWindow::GetMousePosition +// asks Win32 (GetCursorPos + ScreenToClient); here the host is the only source of mouse input. +void MtHostSetCursor(int x, int y); diff --git a/extension/src/platform/EterLib/MSWindow.cpp b/extension/src/platform/EterLib/MSWindow.cpp index 3d4c7a94..bcaf9605 100644 --- a/extension/src/platform/EterLib/MSWindow.cpp +++ b/extension/src/platform/EterLib/MSWindow.cpp @@ -4,6 +4,7 @@ #include "EterLib/MSWindow.h" #include "../PlatformStub.h" +#include "HostCursor.h" CMSWindow::CMSWindow() { @@ -78,9 +79,19 @@ auto CMSWindow::IsActive() -> bool return mt_platform_stub_return(); } -auto CMSWindow::GetMousePosition(POINT *) -> void +namespace { +POINT g_host_cursor = {0, 0}; +} + +void MtHostSetCursor(int x, int y) { - MT_PLATFORM_STUB(); + g_host_cursor.x = x; + g_host_cursor.y = y; +} + +auto CMSWindow::GetMousePosition(POINT * ppt) -> void +{ + *ppt = g_host_cursor; } auto CMSWindow::GetClientRect(RECT *) -> void diff --git a/extension/src/platform/EterPythonLib/PythonGraphic.cpp b/extension/src/platform/EterPythonLib/PythonGraphic.cpp index ff849dd9..5345c614 100644 --- a/extension/src/platform/EterPythonLib/PythonGraphic.cpp +++ b/extension/src/platform/EterPythonLib/PythonGraphic.cpp @@ -12,6 +12,22 @@ #include "../PlatformStub.h" #include "../EterLib/UIRenderCommands.h" +// 40250 PythonGraphic.cpp:611 +CPythonGraphic::CPythonGraphic() +{ + m_lightColor = GetColor(1.0f, 1.0f, 1.0f); + m_darkColor = GetColor(0.0f, 0.0f, 0.0f); + + memset(&m_backupViewport, 0, sizeof(D3DVIEWPORT8)); + + m_fOrthoDepth = 1000.0f; +} + +CPythonGraphic::~CPythonGraphic() +{ + Tracef("Python Graphic Clear\n"); +} + void CPythonGraphic::SetViewport(float x, float y, float width, float height) { UIRenderSetClip(x, y, width, height); } void CPythonGraphic::RestoreViewport() { UIRenderRestoreClip(); } void CPythonGraphic::SetOmniLight() { MT_PLATFORM_STUB(); } diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index c729f463..882fa82c 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -7,6 +7,7 @@ #include "EterPythonLib/StdAfx.h" #include "EterBase/Timer.h" #include "EterLib/Util.h" +#include "../EterLib/HostCursor.h" #include "UserInterface/PythonNetworkStream.h" #include "UserInterface/AccountConnector.h" #include "UserInterface/PythonPlayer.h" @@ -103,6 +104,7 @@ struct GameSingletons CItemManager kItemMgr; CPythonCharacterManager kChrMgr; + CPythonGraphic pyGraphic; // owns CCullingManager (m_CullingManager) CPythonItem pyItem; CPythonShop pyShop; CPythonExchange pyExchange; @@ -220,11 +222,13 @@ void SetUISize(int width, int height) void UIMouseMove(int x, int y) { + MtHostSetCursor(x, y); if (g_window_manager) g_window_manager->RunMouseMove(x, y); } void UIMouseButton(int button, bool pressed, int x, int y) { + MtHostSetCursor(x, y); if (!g_window_manager) return; g_window_manager->RunMouseMove(x, y); switch (button) diff --git a/extension/src/platform/ScriptLib/Resource.cpp b/extension/src/platform/ScriptLib/Resource.cpp index 416b458c..4cde29df 100644 --- a/extension/src/platform/ScriptLib/Resource.cpp +++ b/extension/src/platform/ScriptLib/Resource.cpp @@ -3,12 +3,14 @@ #include "EterLib/GrpImage.h" #include "EterLib/GrpSubImage.h" #include "EterLib/GrpText.h" +#include "EterGrnLib/Thing.h" namespace { CResource* NewUIImage(const char* name) { return new CGraphicImage(name); } CResource* NewUISubImage(const char* name) { return new CGraphicSubImage(name); } // 40250 UserInterface/PythonApplication.cpp NewText: a ":[i].fnt" name is a CGraphicText. CResource* NewText(const char* name) { return new CGraphicText(name); } +CResource* NewThing(const char* name) { return new CGraphicThing(name); } } CPythonResource::CPythonResource() { @@ -16,6 +18,7 @@ CPythonResource::CPythonResource() { m_resManager.RegisterResourceNewFunctionPointer(ext, NewUIImage); m_resManager.RegisterResourceNewFunctionPointer("sub", NewUISubImage); m_resManager.RegisterResourceNewFunctionPointer("fnt", NewText); + m_resManager.RegisterResourceNewFunctionPointer("gr2", NewThing); } CPythonResource::~CPythonResource() { m_resManager.DestroyDeletingList(); } void CPythonResource::Destroy() { m_resManager.DestroyDeletingList(); m_resManager.Destroy(); } diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp index 41c4bf5e..83a693e4 100644 --- a/extension/src/platform/UserInterface/PythonApplication.cpp +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -86,8 +86,107 @@ bool CPythonApplication::Create(PyObject*, const char*, int, int, int) } return true; } -void CPythonApplication::UpdateGame() { MT_PLATFORM_STUB(); } -void CPythonApplication::RenderGame() { MT_PLATFORM_STUB(); } +// 40250 PythonApplication.cpp:105 +void CPythonApplication::GetMousePosition(POINT* ppt) +{ + CMSApplication::GetMousePosition(ppt); +} + +// 40250 PythonApplication.cpp:168, the !PERF_CHECKER_RENDER_GAME branch (the profiling copy below it +// only adds timers). game.GameWindow.OnRender calls it every frame. +// PORT: the members are reached through their singletons (see the note at the top of the file). +void CPythonApplication::RenderGame() +{ + float fAspect=UI::CWindowManager::Instance().GetAspect(); + float fFarClip=CPythonBackground::Instance().GetFarClip(); + + CPythonGraphic::Instance().SetPerspective(30.0f, fAspect, 100.0, fFarClip); + + CCullingManager::Instance().Process(); + + CPythonCharacterManager::Instance().Deform(); + CEffectManager::Instance().Update(); + + CPythonBackground::Instance().RenderCharacterShadowToTexture(); + + CPythonGraphic::Instance().SetGameRenderState(); + CPythonGraphic::Instance().PushState(); + + { + long lx, ly; + UI::CWindowManager::Instance().GetMousePosition(lx, ly); + CPythonGraphic::Instance().SetCursorPosition(lx, ly); + } + + CPythonBackground::Instance().RenderSky(); + + CPythonBackground::Instance().RenderBeforeLensFlare(); + + CPythonBackground::Instance().RenderCloud(); + + CPythonBackground::Instance().BeginEnvironment(); + CPythonBackground::Instance().Render(); + + CPythonBackground::Instance().SetCharacterDirLight(); + CPythonCharacterManager::Instance().Render(); + + CPythonBackground::Instance().SetBackgroundDirLight(); + CPythonBackground::Instance().RenderWater(); + CPythonBackground::Instance().RenderSnow(); + CPythonBackground::Instance().RenderEffect(); + + CPythonBackground::Instance().EndEnvironment(); + + CEffectManager::Instance().Render(); + CPythonItem::Instance().Render(); + CFlyingManager::Instance().Render(); + + CPythonBackground::Instance().BeginEnvironment(); + CPythonBackground::Instance().RenderPCBlocker(); + CPythonBackground::Instance().EndEnvironment(); + + CPythonBackground::Instance().RenderAfterLensFlare(); +} + +// 40250 PythonApplication.cpp:321 without the PERF_CHECKER_RENDER_GAME timers. game.GameWindow.OnUpdate +// calls it every frame. PORT: members through their singletons, as in RenderGame. +void CPythonApplication::UpdateGame() +{ + POINT ptMouse; + GetMousePosition(&ptMouse); + + CGraphicTextInstance::Hyperlink_UpdateMousePos(ptMouse.x, ptMouse.y); + + //!@# Alt+Tab 중 SetTransfor 에서 튕김 현상 해결을 위해 - [levites] + //if (m_isActivateWnd) + { + CScreen s; + float fAspect = UI::CWindowManager::Instance().GetAspect(); + float fFarClip = CPythonBackground::Instance().GetFarClip(); + + s.SetPerspective(30.0f,fAspect, 100.0f, fFarClip); + s.BuildViewFrustum(); + } + + TPixelPosition kPPosMainActor; + CPythonPlayer::Instance().NEW_GetMainActorPosition(&kPPosMainActor); + + CPythonBackground::Instance().Update(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z); + + CGameEventManager::Instance().SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z); + CGameEventManager::Instance().Update(); + + CPythonCharacterManager::Instance().Update(); + CEffectManager::Instance().UpdateSound(); + CFlyingManager::Instance().Update(); + CPythonItem::Instance().Update(ptMouse); + CPythonPlayer::Instance().Update(); + + // NOTE : Update 에서 위치 값이 바뀌므로 다시 얻어 옵니다 - [levites] + // 이 부분 때문에 메인 케릭터의 Sound가 이전 위치에서 플레이 되는 현상이 있었음. + CPythonPlayer::Instance().NEW_GetMainActorPosition(&kPPosMainActor); + SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z); +} // 40250 PythonApplication.cpp:399. Kept in order: timer, network (2V1), input polling (Godot pushes // input instead), camera (2V3), resource GC, mouse/UI update, then the render block's interface pass. @@ -166,7 +265,6 @@ void CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); } BOOL PERF_CHECKER_RENDER_GAME = FALSE; BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE; -D3DXCOLOR g_fSpecularColor; double g_specularSpd = 0; bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; } diff --git a/extension/src/platform/pending/EterLib/CollisionData.cpp b/extension/src/platform/pending/EterLib/CollisionData.cpp deleted file mode 100644 index 90faca5e..00000000 --- a/extension/src/platform/pending/EterLib/CollisionData.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Stand-in for the 40250 logic unit EterLib/CollisionData.cpp, not ported yet: the members the ported units -// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ -// (docs/PORT-PLAN.md). -#include "EterLib/StdAfx.h" -#include "EterLib/CollisionData.h" - -#include "../../PlatformStub.h" - -auto CSphereCollisionInstance::GetAttribute() -> TSphereData & -{ - MT_PLATFORM_STUB(); - return m_attribute; -} - -auto CSphereCollisionInstance::GetAttribute() const -> const TSphereData & { return m_attribute; } -auto CSphereCollisionInstance::Render(D3DFILLMODE) -> void { MT_PLATFORM_STUB(); } -auto CSphereCollisionInstance::OnDestroy() -> void { MT_PLATFORM_STUB(); } -auto CSphereCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance&) const -> bool -{ MT_PLATFORM_STUB(); return false; } -auto CSphereCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance&) const -> bool -{ MT_PLATFORM_STUB(); return false; } -auto CSphereCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance&) const -> D3DXVECTOR3 -{ MT_PLATFORM_STUB(); return D3DXVECTOR3(0, 0, 0); } diff --git a/extension/src/platform/pending/GameLib/MapManager.cpp b/extension/src/platform/pending/GameLib/MapManager.cpp index 8041fa12..2975e43c 100644 --- a/extension/src/platform/pending/GameLib/MapManager.cpp +++ b/extension/src/platform/pending/GameLib/MapManager.cpp @@ -68,3 +68,13 @@ auto CMapManager::isAttrOn(int, int, BYTE) -> bool MT_PLATFORM_STUB(); return mt_platform_stub_return(); } + +auto CMapManager::BeginEnvironment() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CMapManager::EndEnvironment() -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonBackground.cpp b/extension/src/platform/pending/UserInterface/PythonBackground.cpp index 50e8c6ae..37d85840 100644 --- a/extension/src/platform/pending/UserInterface/PythonBackground.cpp +++ b/extension/src/platform/pending/UserInterface/PythonBackground.cpp @@ -94,3 +94,69 @@ auto CPythonBackground::GetPickingPointWithRayOnlyTerrain(const CRay &, D3DXVECT MT_PLATFORM_STUB(); return mt_platform_stub_return(); } + +auto CPythonBackground::GetFarClip() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonBackground::Render() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderAfterLensFlare() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderBeforeLensFlare() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderCharacterShadowToTexture() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderCloud() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderPCBlocker() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderSky() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderSnow() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RenderWater() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::SetBackgroundDirLight() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::SetCharacterDirLight() -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonItem.cpp b/extension/src/platform/pending/UserInterface/PythonItem.cpp index e2fd6def..a2bb16af 100644 --- a/extension/src/platform/pending/UserInterface/PythonItem.cpp +++ b/extension/src/platform/pending/UserInterface/PythonItem.cpp @@ -55,3 +55,13 @@ auto CPythonItem::SetOwnership(DWORD, const char *) -> void { MT_PLATFORM_STUB(); } + +auto CPythonItem::Render() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::Update(const POINT &) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/port/EterGrnLib/LODController.cpp b/extension/src/port/EterGrnLib/LODController.cpp new file mode 100644 index 00000000..7366083c --- /dev/null +++ b/extension/src/port/EterGrnLib/LODController.cpp @@ -0,0 +1,695 @@ +#include "StdAfx.h" +#include "LODController.h" + +static float LODHEIGHT_ACTOR = 500.0f; +static float LODDISTANCE_ACTOR = 5000.0f; +static float LODDISTANCE_BUILDING = 25000.0f; + +static const float c_fNearLodScale = 3.0f; +static const float c_fFarLodScale = 25.0f; +static const float LOD_APPLY_MAX = 2000.0f; +static const float LOD_APPLY_MIN = 500.0f; + +bool ms_isMinLODModeEnable=false; + +enum +{ + SHARED_VB_500 = 0, + SHARED_VB_1000 = 1, + SHARED_VB_1500 = 2, + SHARED_VB_2000 = 3, + SHARED_VB_2500 = 4, + SHARED_VB_3000 = 5, + SHARED_VB_3500 = 6, + SHARED_VB_4000 = 7, + SHARED_VB_NUM = 9, +}; + +static std::vector gs_vbs[SHARED_VB_NUM]; + +static CGraphicVertexBuffer gs_emptyVB; + +#include + +static CGraphicVertexBuffer* __AllocDeformVertexBuffer(unsigned deformableVertexCount) +{ + if (deformableVertexCount == 0) + return &gs_emptyVB; + + unsigned capacity = (((deformableVertexCount-1) / 500) + 1) * 500; + unsigned index = (deformableVertexCount-1) / 500; + if (index < SHARED_VB_NUM) + { + std::vector& vbs = gs_vbs[index]; + if (!vbs.empty()) + { + //TraceError("REUSE %d(%d)", capacity, deformableVertexCount); + + CGraphicVertexBuffer* pkRetVB = vbs.back(); + vbs.pop_back(); + return pkRetVB; + } + } + + + static time_t base = time(NULL); + //TraceError("NEW %8d: %d(%d)", time(NULL) - base, capacity, deformableVertexCount); + + CGraphicVertexBuffer* pkNewVB = new CGraphicVertexBuffer; + + if (!pkNewVB->Create( + capacity, + D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1, + D3DUSAGE_WRITEONLY, + D3DPOOL_MANAGED)) + { + TraceError("NEW_ERROR %8d: %d(%d)", time(NULL) - base, capacity, deformableVertexCount); + } + + return pkNewVB; +} + +void __FreeDeformVertexBuffer(CGraphicVertexBuffer* pkDelVB) +{ + if (pkDelVB) + { + if (pkDelVB == &gs_emptyVB) + return; + + unsigned index = (pkDelVB->GetVertexCount() - 1) / 500; + if (index < SHARED_VB_NUM) + { + gs_vbs[index].push_back(pkDelVB); + } + else + { + pkDelVB->Destroy(); + delete pkDelVB; + } + } +} + +void __ReserveSharedVertexBuffers(unsigned index, unsigned count) +{ + NANOBEGIN + if (index >= SHARED_VB_NUM) + return; + + unsigned capacity = (index + 1) * 500; + + for (unsigned i = 0; i != count; ++i) + { + CGraphicVertexBuffer* pkNewVB = new CGraphicVertexBuffer; + pkNewVB->Create( + capacity, + D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1, + D3DUSAGE_WRITEONLY, + D3DPOOL_MANAGED); + gs_vbs[index].push_back(pkNewVB); + } + NANOEND +} + +void GrannyCreateSharedDeformBuffer() +{ + __ReserveSharedVertexBuffers(SHARED_VB_500, 40); + __ReserveSharedVertexBuffers(SHARED_VB_1000, 20); + __ReserveSharedVertexBuffers(SHARED_VB_1500, 20); + __ReserveSharedVertexBuffers(SHARED_VB_2000, 40); + __ReserveSharedVertexBuffers(SHARED_VB_3000, 20); +} + +void GrannyDestroySharedDeformBuffer() +{ +#ifdef _DEBUG + TraceError("granny_shared_vbs:"); +#endif + for (int i = 0; i != SHARED_VB_NUM; ++i) + { + std::vector& vbs = gs_vbs[i]; +#ifdef _DEBUG + TraceError("\t%d: %d", i, vbs.size()); +#endif + + std::vector::iterator v; + for (v = vbs.begin(); v != vbs.end(); ++v) + { + CGraphicVertexBuffer* pkEachVB = (*v); + pkEachVB->Destroy(); + delete pkEachVB; + } + vbs.clear(); + } + +} + +void CGrannyLODController::SetMinLODMode(bool isEnable) +{ + ms_isMinLODModeEnable=isEnable; +} + +void CGrannyLODController::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage) +{ + std::deque::iterator i; + for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i) + { + CGrannyModelInstance* pkModelInst=(*i); + pkModelInst->SetMaterialImagePointer(c_szImageName, pImage); + } +} + +void CGrannyLODController::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData) +{ + std::deque::iterator i; + for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i) + { + CGrannyModelInstance* pkModelInst=(*i); + pkModelInst->SetMaterialData(c_szImageName, c_rkMaterialData); + } +} + +void CGrannyLODController::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower) +{ + std::deque::iterator i; + for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i) + { + CGrannyModelInstance* pkModelInst=(*i); + pkModelInst->SetSpecularInfo(c_szMtrlName, bEnable, fPower); + } +} + +CGrannyLODController::CGrannyLODController() : + m_pCurrentModelInstance(NULL), + m_bLODLevel(0), + m_pAttachedParentModel(NULL), + m_fLODDistance(0.0f), + m_dwLODAniFPS(CGrannyModelInstance::ANIFPS_MAX), + m_pkSharedDeformableVertexBuffer(NULL) + ///////////////////////////////////////////////////// +{ +} + +CGrannyLODController::~CGrannyLODController() +{ + __FreeDeformVertexBuffer(m_pkSharedDeformableVertexBuffer); + + Clear(); +} + +void CGrannyLODController::Clear() +{ + if (m_pAttachedParentModel) + { + m_pAttachedParentModel->DetachModelInstance(this); + } + + m_pCurrentModelInstance = NULL; + m_pAttachedParentModel = NULL; + + std::for_each(m_que_pkModelInst.begin(), m_que_pkModelInst.end(), CGrannyModelInstance::Delete); + m_que_pkModelInst.clear(); + + std::vector::iterator itor = m_AttachedModelDataVector.begin(); + for (; m_AttachedModelDataVector.end() != itor; ++itor) + { + TAttachingModelData & rData = *itor; + rData.pkLODController->m_pAttachedParentModel = NULL; + } + + m_AttachedModelDataVector.clear(); +} + +void CGrannyLODController::AddModel(CGraphicThing * pThing, int iSrcModel, CGrannyLODController * pSkelLODController) +{ + if (!pThing) + return; + + if (pSkelLODController && pSkelLODController->m_que_pkModelInst.empty()) + { + assert(!"EMPTY SKELETON(CANNON LINK)"); + return; + } + + assert(pThing->GetReferenceCount()>=1); + + pThing->AddReference(); + + if (pThing->GetModelCount() <= iSrcModel) + { + pThing->Release(); + return; + } + CGrannyModel * pModel = pThing->GetModelPointer(iSrcModel); + if (!pModel) + { + pThing->Release(); + return; + } + + CGrannyModelInstance * pModelInstance = CGrannyModelInstance::New(); + + __ReserveSharedDeformableVertexBuffer(pModel->GetDeformVertexCount()); + + if (pSkelLODController) + { + pModelInstance->SetLinkedModelPointer(pModel, m_pkSharedDeformableVertexBuffer, &pSkelLODController->m_pCurrentModelInstance); + } + else + { + pModelInstance->SetLinkedModelPointer(pModel, m_pkSharedDeformableVertexBuffer, NULL); + } + + // END_OF_WORK + + if (!m_pCurrentModelInstance) + { + m_pCurrentModelInstance = pModelInstance; + pModelInstance->DeformNoSkin(&ms_matIdentity); + + D3DXVECTOR3 vtMin, vtMax; + pModelInstance->GetBoundBox(&vtMin, &vtMax); + + float fSize = 0.0f; + fSize = fMAX(fSize, fabs(vtMin.x - vtMax.x)); + fSize = fMAX(fSize, fabs(vtMin.y - vtMax.y)); + fSize = fMAX(fSize, fabs(vtMin.z - vtMax.z)); + + if (fSizeDeformNoSkin(&ms_matIdentity); + } + + pThing->Release(); + + m_que_pkModelInst.push_front(pModelInstance); +} + + + +void CGrannyLODController::__ReserveSharedDeformableVertexBuffer(DWORD deformableVertexCount) +{ + if (m_pkSharedDeformableVertexBuffer && + m_pkSharedDeformableVertexBuffer->GetVertexCount() >= deformableVertexCount) + return; + + __FreeDeformVertexBuffer(m_pkSharedDeformableVertexBuffer); + + m_pkSharedDeformableVertexBuffer = __AllocDeformVertexBuffer(deformableVertexCount); +} + +void CGrannyLODController::AttachModelInstance(CGrannyLODController * pSrcLODController, const char * c_szBoneName) +{ + CGrannyModelInstance * pSrcInstance = pSrcLODController->GetModelInstance(); + if (!pSrcInstance) + return; + + CGrannyModelInstance * pDestInstance = GetModelInstance(); + if (pDestInstance) + { + pSrcInstance->SetParentModelInstance(pDestInstance, c_szBoneName); + } + + if (!pSrcLODController->GetModelInstance()) + return; + + // Link Parent Data + pSrcLODController->m_pAttachedParentModel = this; + + // Link Child Data + std::vector::iterator itor = m_AttachedModelDataVector.begin(); + for (; m_AttachedModelDataVector.end() != itor;) + { + TAttachingModelData & rData = *itor; + if (pSrcLODController == rData.pkLODController) + { + itor = m_AttachedModelDataVector.erase(itor); + } + else + { + ++itor; + } + } + + TAttachingModelData AttachingModelData; + AttachingModelData.pkLODController = pSrcLODController; + AttachingModelData.strBoneName = c_szBoneName; + m_AttachedModelDataVector.push_back(AttachingModelData); +} + +void CGrannyLODController::DetachModelInstance(CGrannyLODController * pSrcLODController) +{ + CGrannyModelInstance * pSrcInstance = pSrcLODController->GetModelInstance(); + if (!pSrcInstance) + return; + + CGrannyModelInstance * pDestInstance = GetModelInstance(); + if (pDestInstance) + { + pSrcInstance->SetParentModelInstance(NULL, 0); + } + +// if (!pSrcLODController->GetModelInstance()) +// return; + + // Unlink Child Data + std::vector::iterator itor = m_AttachedModelDataVector.begin(); + for (; m_AttachedModelDataVector.end() != itor;) + { + TAttachingModelData & rData = *itor; + if (pSrcLODController == rData.pkLODController) + { + itor = m_AttachedModelDataVector.erase(itor); + } + else + { + ++itor; + } + } + + // Unlink Parent Data + pSrcLODController->m_pAttachedParentModel = NULL; +} + +void CGrannyLODController::SetLODLimits(float /*fNearLOD*/, float fFarLOD) +{ + m_fLODDistance = fFarLOD; +} + +void CGrannyLODController::SetLODLevel(BYTE bLodLevel) +{ + assert(m_que_pkModelInst.size() > 0); + + if (m_que_pkModelInst.size() > 0) + m_bLODLevel = (BYTE) MIN(m_que_pkModelInst.size() - 1, bLodLevel); +} + +void CGrannyLODController::CreateDeviceObjects() +{ + std::for_each(m_que_pkModelInst.begin(), + m_que_pkModelInst.end(), + CGrannyModelInstance::FCreateDeviceObjects()); +} + +void CGrannyLODController::DestroyDeviceObjects() +{ + std::for_each(m_que_pkModelInst.begin(), + m_que_pkModelInst.end(), + CGrannyModelInstance::FDestroyDeviceObjects()); +} + +void CGrannyLODController::RenderWithOneTexture() +{ + assert(m_pCurrentModelInstance != NULL); + +//#define CHECK_LOD +#ifdef CHECK_LOD + if (m_que_pkModelInst.size() > 0 && m_pCurrentModelInstance == m_que_pkModelInst[0]) + m_pCurrentModelInstance->RenderWithoutTexture(); + + if (m_que_pkModelInst.size() > 1 && m_pCurrentModelInstance == m_que_pkModelInst[1]) + m_pCurrentModelInstance->RenderWithOneTexture(); + + if (m_que_pkModelInst.size() > 2 && m_pCurrentModelInstance == m_que_pkModelInst[2]) + m_pCurrentModelInstance->RenderWithOneTexture(); + + if (m_que_pkModelInst.size() > 3 && m_pCurrentModelInstance == m_que_pkModelInst[3]) + m_pCurrentModelInstance->RenderWithOneTexture(); + +#else + m_pCurrentModelInstance->RenderWithOneTexture(); +#endif +} + +void CGrannyLODController::BlendRenderWithOneTexture() +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->BlendRenderWithOneTexture(); +} + +void CGrannyLODController::RenderWithTwoTexture() +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->RenderWithTwoTexture(); +} + +void CGrannyLODController::BlendRenderWithTwoTexture() +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->BlendRenderWithTwoTexture(); +} + +void CGrannyLODController::Update(float fElapsedTime, float fDistanceFromCenter, float fDistanceFromCamera) +{ + UpdateLODLevel(fDistanceFromCenter, fDistanceFromCamera); + UpdateTime(fElapsedTime); +} + +void CGrannyLODController::UpdateLODLevel(float fDistanceFromCenter, float fDistanceFromCamera) +{ + if (m_que_pkModelInst.size()<=1) + return; + + assert(m_pCurrentModelInstance != NULL); + + + if (fDistanceFromCenter > LOD_APPLY_MIN) // 중심 LOD 예외 취소 + { + // 카메라부터 멀어질 수록 fLODRate가 작아진다 + // 3개 LOD가 있을때.. 가장 먼게 0, 가까울 수록 숫자가 커진다 + + // 100fps 50fps 33fps 25fps 20fps + // 10ms 20ms 30ms 40ms 50ms + float fLODFactor = fMINMAX(0.0f, (m_fLODDistance-fDistanceFromCamera), m_fLODDistance); + + if (m_fLODDistance>0.0f) + m_dwLODAniFPS = (DWORD) ((CGrannyModelInstance::ANIFPS_MAX - CGrannyModelInstance::ANIFPS_MIN) * fLODFactor / m_fLODDistance + static_cast(CGrannyModelInstance::ANIFPS_MIN)); + else + m_dwLODAniFPS = CGrannyModelInstance::ANIFPS_MIN; + + assert(m_dwLODAniFPS > 0); + m_dwLODAniFPS /= 10; + m_dwLODAniFPS *= 10; + + float fLODStep = m_fLODDistance / m_que_pkModelInst.size(); + BYTE bLODLevel = BYTE(fLODFactor / fLODStep); + + if (m_fLODDistance <= 5000.0f) + { + if (fDistanceFromCamera < 500.0f) + { + bLODLevel = 0; + } + else if (fDistanceFromCamera < 1500.0f) + { + bLODLevel = 1; + } + else if (fDistanceFromCamera < 2500.0f) + { + bLODLevel = 2; + } + else + { + bLODLevel = 3; + } + + bLODLevel = (BYTE) (m_que_pkModelInst.size() - min(bLODLevel, m_que_pkModelInst.size()) - 1); + } + + if (ms_isMinLODModeEnable) + bLODLevel=0; + + SetLODLevel(bLODLevel); + + if (m_pCurrentModelInstance != m_que_pkModelInst[m_bLODLevel]) + { + SetCurrentModelInstance(m_que_pkModelInst[m_bLODLevel]); + } + } + else + { + m_dwLODAniFPS=CGrannyModelInstance::ANIFPS_MAX; + + if (!m_que_pkModelInst.empty()) + { + if (m_pCurrentModelInstance != m_que_pkModelInst.back()) + { + SetCurrentModelInstance(m_que_pkModelInst.back()); + } + } + } +} + +void CGrannyLODController::UpdateTime(float fElapsedTime) +{ + assert(m_pCurrentModelInstance != NULL); + + m_pCurrentModelInstance->Update(m_dwLODAniFPS); + + //DWORD t3=timeGetTime(); + m_pCurrentModelInstance->UpdateLocalTime(fElapsedTime); + + //DWORD t4=timeGetTime(); + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_lod_update.txt", "w"); + + if (t4-t1>3) + { + fprintf(fp, "LOD.Total %d (Time %f)\n", t4-t1, timeGetTime()/1000.0f); + fprintf(fp, "LOD.SMI %d\n", t2-t1); + fprintf(fp, "LOD.UP %d\n", t3-t2); + fprintf(fp, "LOD.UL %d\n", t4-t3); + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + fflush(fp); + } +#endif +} + +void CGrannyLODController::SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance) +{ + // Copy Motion + pgrnModelInstance->CopyMotion(m_pCurrentModelInstance, true); + m_pCurrentModelInstance = pgrnModelInstance; + + // Change children attaching link + RefreshAttachedModelInstance(); + + // Change parent attaching link + if (m_pAttachedParentModel) + { + m_pAttachedParentModel->RefreshAttachedModelInstance(); + } +} + +void CGrannyLODController::RefreshAttachedModelInstance() +{ + if (!m_pCurrentModelInstance) + return; + + for (DWORD i = 0; i < m_AttachedModelDataVector.size(); ++i) + { + TAttachingModelData & rModelData = m_AttachedModelDataVector[i]; + + CGrannyModelInstance * pSrcInstance = rModelData.pkLODController->GetModelInstance(); + if (!pSrcInstance) + { + Tracenf("CGrannyLODController::RefreshAttachedModelInstance : m_AttachedModelDataVector[%d]->pkLODController->GetModelIntance()==NULL", i); + continue; + } + + pSrcInstance->SetParentModelInstance(m_pCurrentModelInstance, rModelData.strBoneName.c_str()); + } +} + +void CGrannyLODController::UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float fElapsedTime) +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->UpdateSkeleton(c_pWorldMatrix, fElapsedTime); +} + +void CGrannyLODController::DeformAll(const D3DXMATRIX * c_pWorldMatrix) +{ + std::deque::iterator i; + for (i=m_que_pkModelInst.begin(); i!=m_que_pkModelInst.end(); ++i) + { + CGrannyModelInstance* pkModelInst=(*i); + pkModelInst->Deform(c_pWorldMatrix); + } +} + +void CGrannyLODController::DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix) +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->DeformNoSkin(c_pWorldMatrix); +} + +void CGrannyLODController::Deform(const D3DXMATRIX * c_pWorldMatrix) +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->Deform(c_pWorldMatrix); +} + +void CGrannyLODController::RenderToShadowMap() +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->RenderWithoutTexture(); +} + +void CGrannyLODController::RenderShadow() +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->RenderWithOneTexture(); +} + +void CGrannyLODController::ReloadTexture() +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->ReloadTexture(); +} + +void CGrannyLODController::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax) +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->GetBoundBox(vtMin, vtMax); +} + +bool CGrannyLODController::Intersect(const D3DXMATRIX * c_pMatrix, float * u, float * v, float * t) +{ + if (!m_pCurrentModelInstance) + return false; + return m_pCurrentModelInstance->Intersect(c_pMatrix, u, v, t); +} + +void CGrannyLODController::SetLocalTime(float fLocalTime) +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->SetLocalTime(fLocalTime); +} + +void CGrannyLODController::ResetLocalTime() +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->ResetLocalTime(); +} + +void CGrannyLODController::SetMotionPointer(const CGrannyMotion * c_pMotion, float fBlendTime, int iLoopCount, float speedRatio) +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->SetMotionPointer(c_pMotion, fBlendTime, iLoopCount, speedRatio); +} + +void CGrannyLODController::ChangeMotionPointer(const CGrannyMotion * c_pMotion, int iLoopCount, float speedRatio) +{ + assert(m_pCurrentModelInstance != NULL); + m_pCurrentModelInstance->ChangeMotionPointer(c_pMotion, iLoopCount, speedRatio); +} + +void CGrannyLODController::SetMotionAtEnd() +{ + if (m_pCurrentModelInstance) + m_pCurrentModelInstance->SetMotionAtEnd(); +} + +BOOL CGrannyLODController::isModelInstance() +{ + if (!m_pCurrentModelInstance) + return FALSE; + + return TRUE; +} + +CGrannyModelInstance * CGrannyLODController::GetModelInstance() +{ + return m_pCurrentModelInstance; +} diff --git a/extension/src/port/EterGrnLib/Material.cpp b/extension/src/port/EterGrnLib/Material.cpp new file mode 100644 index 00000000..91407717 --- /dev/null +++ b/extension/src/port/EterGrnLib/Material.cpp @@ -0,0 +1,560 @@ +#include "StdAfx.h" +#include "Material.h" +#include "Mesh.h" +#include "../EterBase/Filename.h" +#include "../EterLib/ResourceManager.h" +#include "../EterLib/StateManager.h" +#include "../EterLib/GrpScreen.h" + +CGraphicImageInstance CGrannyMaterial::ms_akSphereMapInstance[SPHEREMAP_NUM]; + +D3DXVECTOR3 CGrannyMaterial::ms_v3SpecularTrans(0.0f, 0.0f, 0.0f); +D3DXMATRIX CGrannyMaterial::ms_matSpecular; + +D3DXCOLOR g_fSpecularColor = D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f); + +void CGrannyMaterial::TranslateSpecularMatrix(float fAddX, float fAddY, float fAddZ) +{ + static float SPECULAR_TRANSLATE_MAX = 1000000.0f; + + ms_v3SpecularTrans.x+=fAddX; + ms_v3SpecularTrans.y+=fAddY; + ms_v3SpecularTrans.z+=fAddZ; + + if (ms_v3SpecularTrans.x>=SPECULAR_TRANSLATE_MAX) + ms_v3SpecularTrans.x=0.0f; + + if (ms_v3SpecularTrans.y>=SPECULAR_TRANSLATE_MAX) + ms_v3SpecularTrans.y=0.0f; + + if (ms_v3SpecularTrans.z>=SPECULAR_TRANSLATE_MAX) + ms_v3SpecularTrans.z=0.0f; + + D3DXMatrixTranslation(&ms_matSpecular, + ms_v3SpecularTrans.x, + ms_v3SpecularTrans.y, + ms_v3SpecularTrans.z + ); +} + +void CGrannyMaterial::ApplyRenderState() +{ + assert(m_pfnApplyRenderState!=NULL && "CGrannyMaterial::SaveRenderState"); + (this->*m_pfnApplyRenderState)(); +} + +void CGrannyMaterial::RestoreRenderState() +{ + assert(m_pfnRestoreRenderState!=NULL && "CGrannyMaterial::RestoreRenderState"); + (this->*m_pfnRestoreRenderState)(); +} + +void CGrannyMaterial::Copy(CGrannyMaterial& rkMtrl) +{ + m_pgrnMaterial = rkMtrl.m_pgrnMaterial; + m_roImage[0] = rkMtrl.m_roImage[0]; + m_roImage[1] = rkMtrl.m_roImage[1]; + m_eType = rkMtrl.m_eType; +} + +CGrannyMaterial::CGrannyMaterial() +{ + m_bTwoSideRender = false; + m_dwLastCullRenderStateForTwoSideRendering = D3DCULL_CW; + + Initialize(); +} + +CGrannyMaterial::~CGrannyMaterial() +{ +} + +CGrannyMaterial::EType CGrannyMaterial::GetType() const +{ + return m_eType; +} + +void CGrannyMaterial::SetImagePointer(int iStage, CGraphicImage* pImage) +{ + assert(iStage<2 && "CGrannyMaterial::SetImagePointer"); + m_roImage[iStage]=pImage; +} + +bool CGrannyMaterial::IsIn(const char* c_szImageName, int* piStage) +{ + std::string strImageName = c_szImageName; + CFileNameHelper::StringPath(strImageName); + + granny_texture * pgrnDiffuseTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyDiffuseColorTexture); + if (pgrnDiffuseTexture) + { + std::string strDiffuseFileName = pgrnDiffuseTexture->FromFileName; + CFileNameHelper::StringPath(strDiffuseFileName); + if (strDiffuseFileName == strImageName) + { + *piStage=0; + return true; + } + } + + granny_texture * pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture); + if (pgrnOpacityTexture) + { + std::string strOpacityFileName = pgrnOpacityTexture->FromFileName; + CFileNameHelper::StringPath(strOpacityFileName); + if (strOpacityFileName == strImageName) + { + *piStage=1; + return true; + } + } + + return false; +} + +void CGrannyMaterial::SetSpecularInfo(BOOL bFlag, float fPower, BYTE uSphereMapIndex) +{ + m_fSpecularPower = fPower; + m_bSphereMapIndex = uSphereMapIndex; + m_bSpecularEnable = bFlag; + + if (bFlag) + { + m_pfnApplyRenderState = &CGrannyMaterial::__ApplySpecularRenderState; + m_pfnRestoreRenderState = &CGrannyMaterial::__RestoreSpecularRenderState; + } + else + { + m_pfnApplyRenderState = &CGrannyMaterial::__ApplyDiffuseRenderState; + m_pfnRestoreRenderState = &CGrannyMaterial::__RestoreDiffuseRenderState; + } +} + +bool CGrannyMaterial::IsEqual(granny_material* pgrnMaterial) const +{ + if (m_pgrnMaterial==pgrnMaterial) + return true; + + return false; +} + + +LPDIRECT3DTEXTURE8 CGrannyMaterial::GetD3DTexture(int iStage) const +{ + const CGraphicImage::TRef & ratImage = m_roImage[iStage]; + + if (ratImage.IsNull()) + return NULL; + + CGraphicImage * pImage = ratImage.GetPointer(); + const CGraphicTexture * pTexture = pImage->GetTexturePointer(); + return pTexture->GetD3DTexture(); +} + +CGraphicImage * CGrannyMaterial::GetImagePointer(int iStage) const +{ + const CGraphicImage::TRef & ratImage = m_roImage[iStage]; + + if (ratImage.IsNull()) + return NULL; + + CGraphicImage * pImage = ratImage.GetPointer(); + return pImage; +} + +const CGraphicTexture* CGrannyMaterial::GetDiffuseTexture() const +{ + if (m_roImage[0].IsNull()) + return NULL; + + return m_roImage[0].GetPointer()->GetTexturePointer(); +} + +const CGraphicTexture* CGrannyMaterial::GetOpacityTexture() const +{ + if (m_roImage[1].IsNull()) + return NULL; + + return m_roImage[1].GetPointer()->GetTexturePointer(); +} + +BOOL CGrannyMaterial::__IsSpecularEnable() const +{ + return m_bSpecularEnable; +} + +float CGrannyMaterial::__GetSpecularPower() const +{ + return m_fSpecularPower; +} + +extern const std::string& GetModelLocalPath(); + +CGraphicImage* CGrannyMaterial::__GetImagePointer(const char* fileName) +{ + assert(*fileName != '\0'); + + CResourceManager& rkResMgr = CResourceManager::Instance(); + + // SUPPORT_LOCAL_TEXTURE + int fileName_len = strlen(fileName); + if (fileName_len > 2 && fileName[1] != ':') + { + char localFileName[256]; + const std::string& modelLocalPath = GetModelLocalPath(); + + int localFileName_len = modelLocalPath.length() + 1 + fileName_len; + if (localFileName_len < sizeof(localFileName) - 1) + { + _snprintf(localFileName, sizeof(localFileName), "%s%s", GetModelLocalPath().c_str(), fileName); + CResource* pResource = rkResMgr.GetResourcePointer(localFileName); + return static_cast(pResource); + } + } + // END_OF_SUPPORT_LOCAL_TEXTURE + + + CResource* pResource = rkResMgr.GetResourcePointer(fileName); + return static_cast(pResource); +} + +bool CGrannyMaterial::CreateFromGrannyMaterialPointer(granny_material * pgrnMaterial) +{ + m_pgrnMaterial = pgrnMaterial; + + granny_texture * pgrnDiffuseTexture = NULL; + granny_texture * pgrnOpacityTexture = NULL; + + if (pgrnMaterial) + { + if (pgrnMaterial->MapCount > 1 && !_strnicmp(pgrnMaterial->Name, "Blend", 5)) + { + pgrnDiffuseTexture = GrannyGetMaterialTextureByType(pgrnMaterial->Maps[0].Material, GrannyDiffuseColorTexture); + pgrnOpacityTexture = GrannyGetMaterialTextureByType(pgrnMaterial->Maps[1].Material, GrannyDiffuseColorTexture); + } + else + { + pgrnDiffuseTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyDiffuseColorTexture); + pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture); + } + + // Two-Side 렌더링이 필요한 지 검사 + { + granny_int32 twoSided = 0; + granny_data_type_definition TwoSidedFieldType[] = + { + {GrannyInt32Member, "Two-sided"}, + {GrannyEndMember}, + }; + + granny_variant twoSideResult; + + if (GrannyFindMatchingMember(pgrnMaterial->ExtendedData.Type, pgrnMaterial->ExtendedData.Object, "Two-sided", &twoSideResult) && NULL != twoSideResult.Type) + GrannyConvertSingleObject(twoSideResult.Type, twoSideResult.Object, TwoSidedFieldType, &twoSided, NULL); + + m_bTwoSideRender = 1 == twoSided; + } + } + + if (pgrnDiffuseTexture) + m_roImage[0].SetPointer(__GetImagePointer(pgrnDiffuseTexture->FromFileName)); + + if (pgrnOpacityTexture) + m_roImage[1].SetPointer(__GetImagePointer(pgrnOpacityTexture->FromFileName)); + + // 오퍼시티가 있으면 블렌딩 메쉬 + if (!m_roImage[1].IsNull()) + m_eType = TYPE_BLEND_PNT; + else + m_eType = TYPE_DIFFUSE_PNT; + + return true; +} + +void CGrannyMaterial::Initialize() +{ + m_roImage[0] = NULL; + m_roImage[1] = NULL; + + SetSpecularInfo(FALSE, 0.0f, 0); +} + +void CGrannyMaterial::__ApplyDiffuseRenderState() +{ + STATEMANAGER.SetTexture(0, GetD3DTexture(0)); + + if (m_bTwoSideRender) + { + // -_-렌더링 프로세스가 좀 구려서... Save & Restore 하면 순서때문에 좀 꼬인다. 귀찮으니 Save & Restore 대신 따로 저장해 둠. + m_dwLastCullRenderStateForTwoSideRendering = STATEMANAGER.GetRenderState(D3DRS_CULLMODE); + STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + } +} + +void CGrannyMaterial::__RestoreDiffuseRenderState() +{ + if (m_bTwoSideRender) + { + STATEMANAGER.SetRenderState(D3DRS_CULLMODE, m_dwLastCullRenderStateForTwoSideRendering); + } +} + +void CGrannyMaterial::__ApplySpecularRenderState() +{ + if (TRUE == STATEMANAGER.GetRenderState(D3DRS_ALPHABLENDENABLE)) + { + __ApplyDiffuseRenderState(); + return; + } + + CGraphicTexture* pkTexture=ms_akSphereMapInstance[m_bSphereMapIndex].GetTexturePointer(); + + STATEMANAGER.SetTexture(0, GetD3DTexture(0)); + + if (pkTexture) + STATEMANAGER.SetTexture(1, pkTexture->GetD3DTexture()); + else + STATEMANAGER.SetTexture(1, NULL); + + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(g_fSpecularColor.r, g_fSpecularColor.g, g_fSpecularColor.b, __GetSpecularPower())); + STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + + STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &ms_matSpecular); + STATEMANAGER.SaveTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); + STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); + STATEMANAGER.SaveTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); +} + +void CGrannyMaterial::__RestoreSpecularRenderState() +{ + if (TRUE == STATEMANAGER.GetRenderState(D3DRS_ALPHABLENDENABLE)) + { + __RestoreDiffuseRenderState(); + return; + } + + STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS); + STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSU); + STATEMANAGER.RestoreTextureStageState(1, D3DTSS_ADDRESSV); + + STATEMANAGER.RestoreTextureStageState(1, D3DTSS_TEXCOORDINDEX); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG1); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAARG2); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ALPHAOP); +} + +void CGrannyMaterial::CreateSphereMap(UINT uMapIndex, const char* c_szSphereMapImageFileName) +{ + CResourceManager& rkResMgr = CResourceManager::Instance(); + CGraphicImage * pImage = (CGraphicImage *)rkResMgr.GetResourcePointer(c_szSphereMapImageFileName); + ms_akSphereMapInstance[uMapIndex].SetImagePointer(pImage); +} + +void CGrannyMaterial::DestroySphereMap() +{ + for (UINT uMapIndex=0; uMapIndexIsIn(c_szImageName, &iStage)) + { + CGrannyMaterial* pkNewMtrl=new CGrannyMaterial; + pkNewMtrl->Copy(*roMtrl.GetPointer()); + pkNewMtrl->SetImagePointer(iStage, pImage); + roMtrl=pkNewMtrl; + + return; + } + } +} + +void CGrannyMaterialPalette::SetMaterialData(const char* c_szMtrlName, const SMaterialData& c_rkMaterialData) +{ + if (c_szMtrlName) + { + std::vector::iterator i; + for (i=m_mtrlVector.begin(); i!=m_mtrlVector.end(); ++i) + { + CGrannyMaterial::TRef& roMtrl=*i; + + int iStage; + if (roMtrl->IsIn(c_szMtrlName, &iStage)) + { + CGrannyMaterial* pkNewMtrl=new CGrannyMaterial; + pkNewMtrl->Copy(*roMtrl.GetPointer()); + pkNewMtrl->SetImagePointer(iStage, c_rkMaterialData.pImage); + pkNewMtrl->SetSpecularInfo(c_rkMaterialData.isSpecularEnable, c_rkMaterialData.fSpecularPower, c_rkMaterialData.bSphereMapIndex); + roMtrl=pkNewMtrl; + + return; + } + } + } + else + { + std::vector::iterator i; + for (i=m_mtrlVector.begin(); i!=m_mtrlVector.end(); ++i) + { + CGrannyMaterial::TRef& roMtrl=*i; + roMtrl->SetSpecularInfo(c_rkMaterialData.isSpecularEnable, c_rkMaterialData.fSpecularPower, c_rkMaterialData.bSphereMapIndex); + } + } +} + +void CGrannyMaterialPalette::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower) +{ + DWORD size=m_mtrlVector.size(); + DWORD i; + if (c_szMtrlName) + { + for (i=0; iIsIn(c_szMtrlName, &iStage)) + { + roMtrl->SetSpecularInfo(bEnable, fPower, 0); + return; + } + } + } + else + { + for (i=0; iSetSpecularInfo(bEnable, fPower, 0); + } + } +} + +DWORD CGrannyMaterialPalette::RegisterMaterial(granny_material* pgrnMaterial) +{ + DWORD size=m_mtrlVector.size(); + DWORD i; + for (i=0; iIsEqual(pgrnMaterial)) + return i; + } + + CGrannyMaterial* pkNewMtrl=new CGrannyMaterial; + pkNewMtrl->CreateFromGrannyMaterialPointer(pgrnMaterial); + m_mtrlVector.push_back(pkNewMtrl); + + return size; +} + +DWORD CGrannyMaterialPalette::GetMaterialCount() const +{ + return m_mtrlVector.size(); +} + +/* +void CActorInstance::BeginSpecularRender() +{ + // NOTE - Blending해서 찍는 부분은 Specular를 적용시키지 않는다 - [levites] + STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(1.0f, 1.0f, 1.0f, m_AddColor.r)); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + +// STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); +// STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); +// STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); +// STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); +// +// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + +// D3DXMATRIX texMatrix; +// GetSphereMatrix(&texMatrix); +// STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &texMatrix); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); + + // Type 1 +// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); +// // Type 2 +// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL); +} + +void CActorInstance::EndSpecularRender() +{ +// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); +// STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); +} +*/ diff --git a/extension/src/port/EterGrnLib/Mesh.cpp b/extension/src/port/EterGrnLib/Mesh.cpp new file mode 100644 index 00000000..7ad8ba94 --- /dev/null +++ b/extension/src/port/EterGrnLib/Mesh.cpp @@ -0,0 +1,311 @@ +#include "StdAfx.h" +#include "Mesh.h" +#include "Model.h" +#include "Material.h" + +granny_data_type_definition GrannyPNT3322VertexType[5] = +{ + {GrannyReal32Member, GrannyVertexPositionName, 0, 3}, + {GrannyReal32Member, GrannyVertexNormalName, 0, 3}, + {GrannyReal32Member, GrannyVertexTextureCoordinatesName"0", 0, 2}, + {GrannyReal32Member, GrannyVertexTextureCoordinatesName"1", 0, 2}, + {GrannyEndMember} +}; + +void CGrannyMesh::LoadIndices(void * dstBaseIndices) +{ + const granny_mesh * pgrnMesh = GetGrannyMeshPointer(); + + TIndex * dstIndices = ((TIndex *)dstBaseIndices) + m_idxBasePos; + GrannyCopyMeshIndices(pgrnMesh, sizeof(TIndex), dstIndices); +} + +void CGrannyMesh::LoadPNTVertices(void * dstBaseVertices) +{ + const granny_mesh * pgrnMesh = GetGrannyMeshPointer(); + + if (!GrannyMeshIsRigid(pgrnMesh)) + return; + + TPNTVertex * dstVertices = ((TPNTVertex *)dstBaseVertices) + m_vtxBasePos; + GrannyCopyMeshVertices(pgrnMesh, m_pgrnMeshType, dstVertices); +} + +void CGrannyMesh::NEW_LoadVertices(void * dstBaseVertices) +{ + const granny_mesh * pgrnMesh = GetGrannyMeshPointer(); + + if (!GrannyMeshIsRigid(pgrnMesh)) + return; + + TPNTVertex * dstVertices = ((TPNTVertex *)dstBaseVertices) + m_vtxBasePos; + GrannyCopyMeshVertices(pgrnMesh, m_pgrnMeshType, dstVertices); +} + +void CGrannyMesh::DeformPNTVertices(void * dstBaseVertices, D3DXMATRIX * boneMatrices, granny_mesh_binding* pgrnMeshBinding) const +{ + assert(dstBaseVertices != NULL); + assert(boneMatrices != NULL); + assert(m_pgrnMeshDeformer != NULL); + + const granny_mesh * pgrnMesh = GetGrannyMeshPointer(); + + TPNTVertex * srcVertices = (TPNTVertex *) GrannyGetMeshVertices(pgrnMesh); + TPNTVertex * dstVertices = ((TPNTVertex *) dstBaseVertices) + m_vtxBasePos; + + int vtxCount = GrannyGetMeshVertexCount(pgrnMesh); + + // WORK + int * boneIndices = (int*)GrannyGetMeshBindingToBoneIndices(pgrnMeshBinding); + // END_OF_WORK + + GrannyDeformVertices( + m_pgrnMeshDeformer, + boneIndices, + (float *)boneMatrices, + vtxCount, + srcVertices, + dstVertices); +} + +bool CGrannyMesh::CanDeformPNTVertices() const +{ + return m_canDeformPNTVertex; +} + +const granny_mesh * CGrannyMesh::GetGrannyMeshPointer() const +{ + return m_pgrnMesh; +} + +const CGrannyMesh::TTriGroupNode * CGrannyMesh::GetTriGroupNodeList(CGrannyMaterial::EType eMtrlType) const +{ + return m_triGroupNodeLists[eMtrlType]; +} + +int CGrannyMesh::GetVertexCount() const +{ + assert(m_pgrnMesh!=NULL); + return GrannyGetMeshVertexCount(m_pgrnMesh); +} + +int CGrannyMesh::GetVertexBasePosition() const +{ + return m_vtxBasePos; +} + +int CGrannyMesh::GetIndexBasePosition() const +{ + return m_idxBasePos; +} + +// WORK +int * CGrannyMesh::GetDefaultBoneIndices() const +{ + return (int*)GrannyGetMeshBindingToBoneIndices(m_pgrnMeshBindingTemp); +} +// END_OF_WORK + +bool CGrannyMesh::IsEmpty() const +{ + if (m_pgrnMesh) + return false; + + return true; +} + +bool CGrannyMesh::CreateFromGrannyMeshPointer(granny_skeleton * pgrnSkeleton, granny_mesh * pgrnMesh, int vtxBasePos, int idxBasePos, CGrannyMaterialPalette& rkMtrlPal) +{ + assert(IsEmpty()); + + m_pgrnMesh = pgrnMesh; + m_vtxBasePos = vtxBasePos; + m_idxBasePos = idxBasePos; + + if (m_pgrnMesh->BoneBindingCount < 0) + return true; + + // WORK + m_pgrnMeshBindingTemp = GrannyNewMeshBinding(m_pgrnMesh, pgrnSkeleton, pgrnSkeleton); + // END_OF_WORK + + if (!GrannyMeshIsRigid(m_pgrnMesh)) + { + m_canDeformPNTVertex = true; + + granny_data_type_definition * pgrnInputType = GrannyGetMeshVertexType(m_pgrnMesh); + granny_data_type_definition * pgrnOutputType = m_pgrnMeshType; + + m_pgrnMeshDeformer = GrannyNewMeshDeformer(pgrnInputType, pgrnOutputType, GrannyDeformPositionNormal, GrannyAllowUncopiedTail); + assert(m_pgrnMeshDeformer != NULL && "Cannot create mesh deformer"); + } + + // Two Side Mesh + if (!strncmp(m_pgrnMesh->Name, "2x", 2)) + m_isTwoSide = true; + + if (!LoadMaterials(rkMtrlPal)) + return false; + + if (!LoadTriGroupNodeList(rkMtrlPal)) + return false; + + return true; +} + +bool CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette& rkMtrlPal) +{ + assert(m_pgrnMesh != NULL); + assert(m_triGroupNodes == NULL); + + int mtrlCount = m_pgrnMesh->MaterialBindingCount; + if (mtrlCount <= 0) // 천의 동굴 2층 크래쉬 발생 + return true; + + int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh); + if (GroupNodeCount <= 0) + return true; + + m_triGroupNodes = new TTriGroupNode[GroupNodeCount]; + + const granny_tri_material_group * c_pgrnTriGroups = GrannyGetMeshTriangleGroups(m_pgrnMesh); + + for (int g = 0; g < GroupNodeCount; ++g) + { + const granny_tri_material_group & c_rgrnTriGroup = c_pgrnTriGroups[g]; + TTriGroupNode * pTriGroupNode = m_triGroupNodes + g; + + pTriGroupNode->idxPos = m_idxBasePos + c_rgrnTriGroup.TriFirst * 3; + pTriGroupNode->triCount = c_rgrnTriGroup.TriCount; + + int iMtrl = c_rgrnTriGroup.MaterialIndex; + if (iMtrl < 0 || iMtrl >= mtrlCount) + { + pTriGroupNode->mtrlIndex=0;//m_mtrlIndexVector[iMtrl]; + } + else + { + pTriGroupNode->mtrlIndex=m_mtrlIndexVector[iMtrl]; + } + + const CGrannyMaterial& rkMtrl=rkMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex); + pTriGroupNode->pNextTriGroupNode = m_triGroupNodeLists[rkMtrl.GetType()]; + m_triGroupNodeLists[rkMtrl.GetType()] = pTriGroupNode; + + } + + return true; +} + +void CGrannyMesh::RebuildTriGroupNodeList() +{ + assert(!"CGrannyMesh::RebuildTriGroupNodeList() - \277\326 \270\256\272\364\265\345\270\246 \307\317\264\302\260\241- -?"); + /* + int mtrlCount = m_pgrnMesh->MaterialBindingCount; + int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh); + + if (GroupNodeCount <= 0) + return; + + const granny_tri_material_group * c_pgrnTriGroups = GrannyGetMeshTriangleGroups(m_pgrnMesh); + + for (int g = 0; g < GroupNodeCount; ++g) + { + const granny_tri_material_group& c_rgrnTriGroup = c_pgrnTriGroups[g]; + TTriGroupNode * pTriGroupNode = m_triGroupNodes + g; + + int iMtrl = c_rgrnTriGroup.MaterialIndex; + + if (iMtrl >= 0 && iMtrl < mtrlCount) + { + CGrannyMaterial & rMtrl = m_mtrls[iMtrl]; + + pTriGroupNode->lpd3dTextures[0] = rMtrl.GetD3DTexture(0); + pTriGroupNode->lpd3dTextures[1] = rMtrl.GetD3DTexture(1); + + } + } + */ +} + +bool CGrannyMesh::LoadMaterials(CGrannyMaterialPalette& rkMtrlPal) +{ + assert(m_pgrnMesh != NULL); + + if (m_pgrnMesh->MaterialBindingCount <= 0) + return true; + + int mtrlCount = m_pgrnMesh->MaterialBindingCount; + bool bHaveBlendThing = false; + + for (int m = 0; m < mtrlCount; ++m) + { + granny_material* pgrnMaterial = m_pgrnMesh->MaterialBindings[m].Material; + DWORD mtrlIndex=rkMtrlPal.RegisterMaterial(pgrnMaterial); + m_mtrlIndexVector.push_back(mtrlIndex); + bHaveBlendThing |= rkMtrlPal.GetMaterialRef(mtrlIndex).GetType() == CGrannyMaterial::TYPE_BLEND_PNT; + } + m_bHaveBlendThing = bHaveBlendThing; + + return true; +} + +bool CGrannyMesh::IsTwoSide() const +{ + return m_isTwoSide; +} + +void CGrannyMesh::SetPNT2Mesh() +{ + m_pgrnMeshType = GrannyPNT3322VertexType; +} + +void CGrannyMesh::Destroy() +{ + if (m_triGroupNodes) + delete [] m_triGroupNodes; + + m_mtrlIndexVector.clear(); + + // WORK + if (m_pgrnMeshBindingTemp) + GrannyFreeMeshBinding(m_pgrnMeshBindingTemp); + // END_OF_WORK + + if (m_pgrnMeshDeformer) + GrannyFreeMeshDeformer(m_pgrnMeshDeformer); + + Initialize(); +} + +void CGrannyMesh::Initialize() +{ + for (int r = 0; r < CGrannyMaterial::TYPE_MAX_NUM; ++r) + m_triGroupNodeLists[r] = NULL; + + m_pgrnMeshType = GrannyPNT332VertexType; + m_pgrnMesh = NULL; + // WORK + m_pgrnMeshBindingTemp = NULL; + // END_OF_WORK + m_pgrnMeshDeformer = NULL; + + m_triGroupNodes = NULL; + + m_vtxBasePos = 0; + m_idxBasePos = 0; + + m_canDeformPNTVertex = false; + m_isTwoSide = false; + m_bHaveBlendThing = false; +} + +CGrannyMesh::CGrannyMesh() +{ + Initialize(); +} + +CGrannyMesh::~CGrannyMesh() +{ + Destroy(); +} diff --git a/extension/src/port/EterGrnLib/Model.cpp b/extension/src/port/EterGrnLib/Model.cpp new file mode 100644 index 00000000..a91315b3 --- /dev/null +++ b/extension/src/port/EterGrnLib/Model.cpp @@ -0,0 +1,419 @@ +#include "StdAfx.h" +#include "Model.h" +#include "Mesh.h" + +const CGrannyMaterialPalette& CGrannyModel::GetMaterialPalette() const +{ + return m_kMtrlPal; +} + +const CGrannyModel::TMeshNode* CGrannyModel::GetMeshNodeList(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) const +{ + return m_meshNodeLists[eMeshType][eMtrlType]; +} + +CGrannyMesh * CGrannyModel::GetMeshPointer(int iMesh) +{ + assert(CheckMeshIndex(iMesh)); + assert(m_meshs != NULL); + + return m_meshs + iMesh; +} + +const CGrannyMesh* CGrannyModel::GetMeshPointer(int iMesh) const +{ + assert(CheckMeshIndex(iMesh)); + assert(m_meshs != NULL); + + return m_meshs + iMesh; +} + +bool CGrannyModel::CanDeformPNTVertices() const +{ + return m_canDeformPNVertices; +} + +void CGrannyModel::DeformPNTVertices(void * dstBaseVertices, D3DXMATRIX * boneMatrices, const std::vector& c_rvct_pgrnMeshBinding) const +{ + int meshCount = GetMeshCount(); + + for (int iMesh = 0; iMesh < meshCount; ++iMesh) + { + assert(iMesh < c_rvct_pgrnMeshBinding.size()); + + CGrannyMesh & rMesh = m_meshs[iMesh]; + if (rMesh.CanDeformPNTVertices()) + rMesh.DeformPNTVertices(dstBaseVertices, boneMatrices, c_rvct_pgrnMeshBinding[iMesh]); + } +} + +int CGrannyModel::GetRigidVertexCount() const +{ + return m_rigidVtxCount; +} + +int CGrannyModel::GetDeformVertexCount() const +{ + return m_deformVtxCount; +} + +int CGrannyModel::GetVertexCount() const +{ + return m_vtxCount; +} + +int CGrannyModel::GetMeshCount() const +{ + return m_pgrnModel ? m_pgrnModel->MeshBindingCount : 0; +} + +granny_model* CGrannyModel::GetGrannyModelPointer() +{ + return m_pgrnModel; +} + +LPDIRECT3DINDEXBUFFER8 CGrannyModel::GetD3DIndexBuffer() const +{ + return m_idxBuf.GetD3DIndexBuffer(); +} + +LPDIRECT3DVERTEXBUFFER8 CGrannyModel::GetPNTD3DVertexBuffer() const +{ + return m_pntVtxBuf.GetD3DVertexBuffer(); +} + +bool CGrannyModel::LockVertices(void** indicies, void** vertices) const +{ + if (!m_idxBuf.Lock(indicies)) + return false; + + if (!m_pntVtxBuf.Lock(vertices)) + { + m_idxBuf.Unlock(); + return false; + } + + return true; +} + +void CGrannyModel::UnlockVertices() const +{ + m_idxBuf.Unlock(); + m_pntVtxBuf.Unlock(); +} + +bool CGrannyModel::LoadPNTVertices() +{ + if (m_rigidVtxCount <= 0) + return true; + + assert(m_meshs != NULL); + + if (!m_pntVtxBuf.Create(m_rigidVtxCount, m_dwFvF, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED)) + return false; + + void* vertices; + if (!m_pntVtxBuf.Lock(&vertices)) + return false; + + for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m) + { + CGrannyMesh& rMesh = m_meshs[m]; + rMesh.LoadPNTVertices(vertices); + } + + m_pntVtxBuf.Unlock(); + return true; +} + +bool CGrannyModel::LoadIndices() +{ + //assert(m_idxCount > 0); + if (m_idxCount <= 0) + return true; + + if (!m_idxBuf.Create(m_idxCount, D3DFMT_INDEX16)) + return false; + + void * indices; + + if (!m_idxBuf.Lock((void**)&indices)) + return false; + + for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m) + { + CGrannyMesh& rMesh = m_meshs[m]; + rMesh.LoadIndices(indices); + } + + m_idxBuf.Unlock(); + return true; +} + +bool CGrannyModel::LoadMeshs() +{ + assert(m_meshs == NULL); + assert(m_pgrnModel != NULL); + + if (m_pgrnModel->MeshBindingCount <= 0) // 메쉬가 없는 모델 + return true; + + granny_skeleton * pgrnSkeleton = m_pgrnModel->Skeleton; + + int vtxRigidPos = 0; + int vtxDeformPos = 0; + int vtxPos = 0; + int idxPos = 0; + + int diffusePNTMeshNodeCount = 0; + int blendPNTMeshNodeCount = 0; + int blendPNT2MeshNodeCount = 0; + + int meshCount = GetMeshCount(); + m_meshs = new CGrannyMesh[meshCount]; + + m_dwFvF = 0; + + for (int m = 0; m < meshCount; ++m) + { + CGrannyMesh& rMesh = m_meshs[m]; + granny_mesh* pgrnMesh = m_pgrnModel->MeshBindings[m].Mesh; + + if (GrannyMeshIsRigid(pgrnMesh)) + { + if (!rMesh.CreateFromGrannyMeshPointer(pgrnSkeleton, pgrnMesh, vtxRigidPos, idxPos, m_kMtrlPal)) + return false; + + vtxRigidPos += GrannyGetMeshVertexCount(pgrnMesh); + } + else + { + if (!rMesh.CreateFromGrannyMeshPointer(pgrnSkeleton, pgrnMesh, vtxDeformPos, idxPos, m_kMtrlPal)) + return false; + + vtxDeformPos += GrannyGetMeshVertexCount(pgrnMesh); + m_canDeformPNVertices |= rMesh.CanDeformPNTVertices(); + } + m_bHaveBlendThing |= rMesh.HaveBlendThing(); + + granny_int32x grni32xTypeCount = GrannyGetTotalTypeSize(pgrnMesh->PrimaryVertexData->VertexType) / 32; + int i = 0; + while (i < grni32xTypeCount) + { + if (NULL == pgrnMesh->PrimaryVertexData->VertexType[i].Name || 0 == strlen(pgrnMesh->PrimaryVertexData->VertexType[i].Name)) + { + ++i; + continue; + } + if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexPositionName) ) + m_dwFvF |= D3DFVF_XYZ; + else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexNormalName) ) + m_dwFvF |= D3DFVF_NORMAL; + else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexTextureCoordinatesName"0") ) + m_dwFvF |= D3DFVF_TEX1; + else if ( 0 == strcmp(pgrnMesh->PrimaryVertexData->VertexType[i].Name, GrannyVertexTextureCoordinatesName"1") ) + m_dwFvF |= D3DFVF_TEX2; + ++i; + } + + vtxPos += GrannyGetMeshVertexCount(pgrnMesh); + idxPos += GrannyGetMeshIndexCount(pgrnMesh); + + if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_DIFFUSE_PNT)) + ++diffusePNTMeshNodeCount; + + if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_BLEND_PNT)) + ++blendPNTMeshNodeCount; + } + + m_meshNodeCapacity = diffusePNTMeshNodeCount + blendPNTMeshNodeCount + blendPNT2MeshNodeCount; + m_meshNodes = new TMeshNode[m_meshNodeCapacity]; + + for (int n = 0; n < meshCount; ++n) + { + CGrannyMesh& rMesh = m_meshs[n]; + granny_mesh* pgrnMesh = m_pgrnModel->MeshBindings[n].Mesh; + + CGrannyMesh::EType eMeshType = GrannyMeshIsRigid(pgrnMesh) ? CGrannyMesh::TYPE_RIGID : CGrannyMesh::TYPE_DEFORM; + + if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_DIFFUSE_PNT)) + AppendMeshNode(eMeshType, CGrannyMaterial::TYPE_DIFFUSE_PNT, n); + + if (rMesh.GetTriGroupNodeList(CGrannyMaterial::TYPE_BLEND_PNT)) + AppendMeshNode(eMeshType, CGrannyMaterial::TYPE_BLEND_PNT, n); + } + + // For Dungeon Block + if ((D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1|D3DFVF_TEX2) == m_dwFvF) + { + for (int n = 0; n < meshCount; ++n) + { + CGrannyMesh& rMesh = m_meshs[n]; + rMesh.SetPNT2Mesh(); + } + } + + m_rigidVtxCount = vtxRigidPos; + m_deformVtxCount = vtxDeformPos; + + m_vtxCount = vtxPos; + m_idxCount = idxPos; + return true; +} + +BOOL CGrannyModel::CheckMeshIndex(int iIndex) const +{ + if (iIndex < 0) + return FALSE; + if (iIndex >= m_meshNodeSize) + return FALSE; + + return TRUE; +} + +void CGrannyModel::AppendMeshNode(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType, int iMesh) +{ + assert(m_meshNodeSize < m_meshNodeCapacity); + + TMeshNode& rMeshNode = m_meshNodes[m_meshNodeSize++]; + + rMeshNode.iMesh = iMesh; + rMeshNode.pMesh = m_meshs + iMesh; + rMeshNode.pNextMeshNode = m_meshNodeLists[eMeshType][eMtrlType]; + m_meshNodeLists[eMeshType][eMtrlType] = &rMeshNode; +} + +bool CGrannyModel::CreateFromGrannyModelPointer(granny_model* pgrnModel) +{ + assert(IsEmpty()); + + m_pgrnModel = pgrnModel; + + if (!LoadMeshs()) + return false; + + if (!__LoadVertices()) + return false; + + if (!LoadIndices()) + return false; + + AddReference(); + + return true; +} + +int CGrannyModel::GetIdxCount() +{ + return m_idxCount; +} + +bool CGrannyModel::CreateDeviceObjects() +{ + if (m_rigidVtxCount > 0) + if (!m_pntVtxBuf.CreateDeviceObjects()) + return false; + + if (m_idxCount > 0) + if (!m_idxBuf.CreateDeviceObjects()) + return false; + + int meshCount = GetMeshCount(); + + for (int i = 0; i < meshCount; ++i) + { + CGrannyMesh& rMesh = m_meshs[i]; + rMesh.RebuildTriGroupNodeList(); + } + + return true; +} + +void CGrannyModel::DestroyDeviceObjects() +{ + m_pntVtxBuf.DestroyDeviceObjects(); + m_idxBuf.DestroyDeviceObjects(); +} + +bool CGrannyModel::IsEmpty() const +{ + if (m_pgrnModel) + return false; + + return true; +} + +void CGrannyModel::Destroy() +{ + m_kMtrlPal.Clear(); + + if (m_meshNodes) + delete [] m_meshNodes; + + if (m_meshs) + delete [] m_meshs; + + m_pntVtxBuf.Destroy(); + m_idxBuf.Destroy(); + + Initialize(); +} + +bool CGrannyModel::__LoadVertices() +{ + if (m_rigidVtxCount <= 0) + return true; + + assert(m_meshs != NULL); + +// assert((m_dwFvF & (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)) == m_dwFvF); + +// if (!m_pntVtxBuf.Create(m_rigidVtxCount, D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED)) + if (!m_pntVtxBuf.Create(m_rigidVtxCount, m_dwFvF, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED)) + return false; + + void* vertices; + if (!m_pntVtxBuf.Lock(&vertices)) + return false; + + for (int m = 0; m < m_pgrnModel->MeshBindingCount; ++m) + { + CGrannyMesh& rMesh = m_meshs[m]; + rMesh.NEW_LoadVertices(vertices); + } + + m_pntVtxBuf.Unlock(); + return true; +} + +void CGrannyModel::Initialize() +{ + memset(m_meshNodeLists, 0, sizeof(m_meshNodeLists)); + + m_pgrnModel = NULL; + m_meshs = NULL; + m_meshNodes = NULL; + + m_meshNodeSize = 0; + m_meshNodeCapacity = 0; + + m_rigidVtxCount = 0; + m_deformVtxCount = 0; + m_vtxCount = 0; + m_idxCount = 0; + + m_canDeformPNVertices = false; + + m_dwFvF = 0; + m_bHaveBlendThing = false; +} + +CGrannyModel::CGrannyModel() +{ + Initialize(); +} + +CGrannyModel::~CGrannyModel() +{ + Destroy(); +} diff --git a/extension/src/port/EterGrnLib/ModelInstance.cpp b/extension/src/port/EterGrnLib/ModelInstance.cpp new file mode 100644 index 00000000..da201384 --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstance.cpp @@ -0,0 +1,140 @@ +#include "StdAfx.h" +#include "ModelInstance.h" +#include "Model.h" +#include "../EterLib/ResourceManager.h" + + +CGrannyModel* CGrannyModelInstance::GetModel() +{ + return m_pModel; +} + +void CGrannyModelInstance::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage) +{ + m_kMtrlPal.SetMaterialImagePointer(c_szImageName, pImage); +} + +void CGrannyModelInstance::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData) +{ + m_kMtrlPal.SetMaterialData(c_szImageName, c_rkMaterialData); +} + +void CGrannyModelInstance::SetSpecularInfo(const char* c_szMtrlName, BOOL bEnable, float fPower) +{ + m_kMtrlPal.SetSpecularInfo(c_szMtrlName, bEnable, fPower); +} + +void CGrannyModelInstance::SetLocalTime(float fLocalTime) +{ + m_fLocalTime = fLocalTime; +} + +int CGrannyModelInstance::ResetLocalTime() +{ + m_fLocalTime = 0.0f; + return 0; +} + +float CGrannyModelInstance::GetLocalTime() +{ + return m_fLocalTime; +} + +void CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, const char * c_szBoneName) +{ + int iBoneIndex; + if (!c_pParentModelInstance->GetBoneIndexByName(c_szBoneName, &iBoneIndex)) + return; + + SetParentModelInstance(c_pParentModelInstance, iBoneIndex); +} + +void CGrannyModelInstance::SetParentModelInstance(const CGrannyModelInstance* c_pParentModelInstance, int iBone) +{ + mc_pParentInstance = c_pParentModelInstance; + m_iParentBoneIndex = iBone; +} + +bool CGrannyModelInstance::IsEmpty() +{ + if (m_pModel) + { + // NO_MESH_BUG_FIX + if (!m_meshMatrices) + return true; + // END_OF_NO_MESH_BUG_FIX + return false; + } + + return true; +} + +bool CGrannyModelInstance::CreateDeviceObjects() +{ + __CreateDynamicVertexBuffer(); + + return true; +} + +void CGrannyModelInstance::DestroyDeviceObjects() +{ + __DestroyDynamicVertexBuffer(); +} + +void CGrannyModelInstance::__Initialize() +{ + if (m_pModel) + { + m_pModel->Release(); + } + m_pModel = NULL; + mc_pParentInstance = NULL; + m_iParentBoneIndex = 0; + + m_pgrnModelInstance = NULL; + + // WORK + m_pgrnWorldPoseReal = NULL; + // END_OF_WORK + + // TEST + // m_pgrnWorldPose = NULL; + m_ppkSkeletonInst = NULL; + // END_OF_TEST + + m_meshMatrices = NULL; + m_pgrnCtrl = NULL; + m_pgrnAni = NULL; + + m_dwOldUpdateFrame=0; + +} + +CGrannyModelInstance::CGrannyModelInstance() +{ + m_pModel = NULL; + __Initialize(); +} + +CGrannyModelInstance::~CGrannyModelInstance() +{ + Clear(); +} + +CDynamicPool CGrannyModelInstance::ms_kPool; + +CGrannyModelInstance* CGrannyModelInstance::New() +{ + return ms_kPool.Alloc(); +} + +void CGrannyModelInstance::Delete(CGrannyModelInstance* pkInst) +{ + pkInst->Clear(); + ms_kPool.Free(pkInst); +} + +void CGrannyModelInstance::DestroySystem() +{ + ms_kPool.Destroy(); +} \ No newline at end of file diff --git a/extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp b/extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp new file mode 100644 index 00000000..5d96e293 --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstanceCollisionDetection.cpp @@ -0,0 +1,267 @@ +#include "StdAfx.h" +#include "ModelInstance.h" +#include "Model.h" + +void CGrannyModelInstance::MakeBoundBox(TBoundBox* pBoundBox, + const float* mat, + const float* OBBMin, + const float* OBBMax, + D3DXVECTOR3* vtMin, + D3DXVECTOR3* vtMax) +{ + pBoundBox->sx = OBBMin[0] * mat[0] + OBBMin[1] * mat[4] + OBBMin[2] * mat[8] + mat[12]; + pBoundBox->sy = OBBMin[0] * mat[1] + OBBMin[1] * mat[5] + OBBMin[2] * mat[9] + mat[13]; + pBoundBox->sz = OBBMin[0] * mat[2] + OBBMin[1] * mat[6] + OBBMin[2] * mat[10] + mat[14]; + + pBoundBox->ex = OBBMax[0] * mat[0] + OBBMax[1] * mat[4] + OBBMax[2] * mat[8] + mat[12]; + pBoundBox->ey = OBBMax[0] * mat[1] + OBBMax[1] * mat[5] + OBBMax[2] * mat[9] + mat[13]; + pBoundBox->ez = OBBMax[0] * mat[2] + OBBMax[1] * mat[6] + OBBMax[2] * mat[10] + mat[14]; + + vtMin->x = min(vtMin->x, pBoundBox->sx); + vtMin->x = min(vtMin->x, pBoundBox->ex); + vtMin->y = min(vtMin->y, pBoundBox->sy); + vtMin->y = min(vtMin->y, pBoundBox->ey); + vtMin->z = min(vtMin->z, pBoundBox->sz); + vtMin->z = min(vtMin->z, pBoundBox->ez); + + vtMax->x = max(vtMax->x, pBoundBox->sx); + vtMax->x = max(vtMax->x, pBoundBox->ex); + vtMax->y = max(vtMax->y, pBoundBox->sy); + vtMax->y = max(vtMax->y, pBoundBox->ey); + vtMax->z = max(vtMax->z, pBoundBox->sz); + vtMax->z = max(vtMax->z, pBoundBox->ez); +} + +bool CGrannyModelInstance::Intersect(const D3DXMATRIX * c_pMatrix, + float * /*pu*/, float * /*pv*/, float * pt) +{ + if (!m_pgrnModelInstance) + return false; + + float u, v, t; + bool ret = false; + *pt = 100000000.0f; + + float max = 10000000.0f; + D3DXVECTOR3 vtMin, vtMax; + vtMin.x = vtMin.y = vtMin.z = max; + vtMax.x = vtMax.y = vtMax.z = -max; + + static stl_stack_pool s_boundBoxPool(1024); + s_boundBoxPool.clear(); + + int meshCount = m_pModel->GetMeshCount(); + + for (int m = 0; m < meshCount; ++m) + { + //const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(m); + const granny_mesh * pgrnMesh = m_pModel->GetGrannyModelPointer()->MeshBindings[m].Mesh; + + for (int b = 0; b < pgrnMesh->BoneBindingCount; ++b) + { + const granny_bone_binding& rgrnBoneBinding = pgrnMesh->BoneBindings[b]; + + TBoundBox * pBoundBox = s_boundBoxPool.alloc(); + + // WORK + float * Transform = GrannyGetWorldPose4x4(__GetWorldPosePtr(), __GetMeshBoneIndices(m)[b]); + // END_OF_WORK + + MakeBoundBox(pBoundBox, + Transform, + rgrnBoneBinding.OBBMin, + rgrnBoneBinding.OBBMax, + &vtMin, + &vtMax); + + pBoundBox->meshIndex = m; + pBoundBox->boneIndex = b; + } + } + + if (!IntersectCube(c_pMatrix, + vtMin.x, vtMin.y, vtMin.z, + vtMax.x, vtMax.y, vtMax.z, + ms_vtPickRayOrig, ms_vtPickRayDir, + &u, &v, &t)) + { + return ret; + } + + return true; + +/* + TBoundBox* boundBoxs = s_boundBoxPool.base(); + for (int i = 0; i < s_boundBoxPool.size(); ++i) + { + TBoundBox& rcurBoundBox=boundBoxs[i]; + + if (!IntersectBoundBox(c_pMatrix, rcurBoundBox, &u, &v, &t)) + continue; + + granny_matrix_4x4* pgrnMatCompositeBuffer = GrannyGetWorldPoseComposite4x4Array(m_pgrnWorldPose); + const CGrannyMesh* c_pMesh = m_pModel->GetMeshPointer(rcurBoundBox.meshIndex); + const granny_mesh* c_pgrnMesh = c_pMesh->GetGrannyMeshPointer(); + + if (!GrannyMeshIsRigid(c_pgrnMesh)) + { + //continue; + ret = true; + } + else + { + D3DXMATRIX matMesh; + int* toBoneIndices = c_pMesh->GetBoneIndices(); + D3DXMatrixMultiply(&matMesh, (D3DXMATRIX*) pgrnMatCompositeBuffer[toBoneIndices[0]], c_pMatrix); + + granny_tri_material_group* pgrnTriGroups = GrannyGetMeshTriangleGroups(c_pgrnMesh); + int mtrlCount = c_pMesh->GetGrannyMeshPointer()->MaterialBindingCount; + int vtxCount = GrannyGetMeshVertexCount(c_pgrnMesh); + int groupCount = GrannyGetMeshTriangleGroupCount(c_pgrnMesh); + + TIndex* modelIndices; + TPNTVertex* modelVertices; + + if (m_pModel->LockVertices((void**)&modelIndices, (void**)&modelVertices)) + { + TIndex* meshIndices = modelIndices + c_pMesh->GetIndexBasePosition(); + TPNTVertex* meshVertices = modelVertices + c_pMesh->GetVertexBasePosition(); + + for (int i = 0; i < groupCount; ++i) + { + granny_tri_material_group& rgrnTriGroup = pgrnTriGroups[i]; + + if (rgrnTriGroup.MaterialIndex < 0 || rgrnTriGroup.MaterialIndex >= mtrlCount) + continue; + + if (IntersectMesh(&matMesh, + meshVertices, + sizeof(TPNTVertex), + vtxCount, + meshIndices, + GrannyGetMeshIndexCount(c_pgrnMesh), + ms_vtPickRayOrig, + ms_vtPickRayDir, + &u, &v, &t)) + { + ret = true; + break; + } + } + + m_pModel->UnlockVertices(); + } + } + + if (ret) + { + *pu = u; + *pv = v; + *pt = -t; + + if (c_szModelName) + { + if (!strncmp(c_pgrnMesh->Name, c_szModelName, strlen(c_szModelName))) + return ret; + + ret = false; + continue; + } + + return ret; + } + } + + return (ret); +*/ +} + +#include "../EterBase/Timer.h" + +void CGrannyModelInstance::GetBoundBox(D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax) +{ + if (!m_pgrnModelInstance) + return; + + TBoundBox BoundBox; + + vtMin->x = vtMin->y = vtMin->z = +100000.0f; + vtMax->x = vtMax->y = vtMax->z = -100000.0f; + + int meshCount = m_pModel->GetMeshCount(); + for (int m = 0; m < meshCount; ++m) + { + //const CGrannyMesh* pMesh = m_pModel->GetMeshPointer(m); + const granny_mesh* pgrnMesh = m_pModel->GetGrannyModelPointer()->MeshBindings[m].Mesh; + + // WORK + int* boneIndices = __GetMeshBoneIndices(m); + // END_OF_WORK + for (int b = 0; b < pgrnMesh->BoneBindingCount; ++b) + { + const granny_bone_binding& rgrnBoneBinding = pgrnMesh->BoneBindings[b]; + + MakeBoundBox(&BoundBox, + GrannyGetWorldPose4x4(__GetWorldPosePtr(), boneIndices[b]), + rgrnBoneBinding.OBBMin, rgrnBoneBinding.OBBMax, vtMin, vtMax); + } + } +} + +bool CGrannyModelInstance::GetMeshMatrixPointer(int iMesh, const D3DXMATRIX ** c_ppMatrix) const +{ + if (!m_pgrnModelInstance) + return false; + + int meshCount = m_pModel->GetMeshCount(); + + if (meshCount <= 0) + return false; + + // WORK + //const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(iMesh); + *c_ppMatrix = (D3DXMATRIX *)GrannyGetWorldPose4x4(__GetWorldPosePtr(), __GetMeshBoneIndices(iMesh)[0]); + // END_OF_WORK + + return true; +} + +/* +void CGraphicThingInstance::DrawBoundBox() +{ + if (!mc_pMeshVector) + return; + + if (!m_pgrnWorldPose) + return; + + D3DXVECTOR3 vtMin; + D3DXVECTOR3 vtMax; + + SetDiffuseColor(0.0f, 1.0f, 0.0f); + // 캐릭터 꽉차는 바운딩 박스 + //GetBoundBox(&vtMin, &vtMax); + //DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z); + //const CThing::TMeshVector& rmeshVector=mc_pModel->meshVector; + ms_lpd3dMatStack->LoadMatrix(&m_Matrix); + + for (size_t m=0; msize(); ++m) + { + const CThing::TMesh& rmesh=mc_pMeshVector->at(m); + + for (int b=0; bBoneBindingCount; ++b) + { + granny_bone_binding& rgrnBoneBinding=rmesh.pgrnMesh->BoneBindings[b]; + + int* toBoneIndices=GrannyGetMeshBindingToBoneIndices(rmesh.pgrnMeshBinding); + + D3DXMATRIX* pmat=(D3DXMATRIX*)GrannyGetWorldPose4x4(m_pgrnWorldPose, toBoneIndices[b]); + + D3DXVec3TransformCoord(&vtMin, &D3DXVECTOR3(rgrnBoneBinding.OBBMin), pmat); + D3DXVec3TransformCoord(&vtMax, &D3DXVECTOR3(rgrnBoneBinding.OBBMax), pmat); + + DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z); + } + } +} +*/ diff --git a/extension/src/port/EterGrnLib/ModelInstanceModel.cpp b/extension/src/port/EterGrnLib/ModelInstanceModel.cpp new file mode 100644 index 00000000..aaa9d95e --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstanceModel.cpp @@ -0,0 +1,300 @@ +#include "StdAfx.h" +#include "ModelInstance.h" +#include "Model.h" + +void CGrannyModelInstance::Clear() +{ + m_kMtrlPal.Clear(); + + DestroyDeviceObjects(); + // WORK + __DestroyMeshBindingVector(); + // END_OF_WORK + __DestroyMeshMatrices(); + __DestroyModelInstance(); + __DestroyWorldPose(); + + __Initialize(); +} + +void CGrannyModelInstance::SetMainModelPointer(CGrannyModel* pModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer) +{ + SetLinkedModelPointer(pModel, pkSharedDeformableVertexBuffer, NULL); +} + +void CGrannyModelInstance::SetLinkedModelPointer(CGrannyModel* pkModel, CGraphicVertexBuffer* pkSharedDeformableVertexBuffer, CGrannyModelInstance** ppkSkeletonInst) +{ + Clear(); + + if (m_pModel) + m_pModel->Release(); + + m_pModel = pkModel; + + m_pModel->AddReference(); + + if (pkSharedDeformableVertexBuffer) + __SetSharedDeformableVertexBuffer(pkSharedDeformableVertexBuffer); + else + __CreateDynamicVertexBuffer(); + + __CreateModelInstance(); + + // WORK + if (ppkSkeletonInst && *ppkSkeletonInst) + { + m_ppkSkeletonInst = ppkSkeletonInst; + __CreateWorldPose(*ppkSkeletonInst); + __CreateMeshBindingVector(*ppkSkeletonInst); + } + else + { + __CreateWorldPose(NULL); + __CreateMeshBindingVector(NULL); + } + // END_OF_WORK + + __CreateMeshMatrices(); + + ResetLocalTime(); + + m_kMtrlPal.Copy(pkModel->GetMaterialPalette()); +} + +// WORK +granny_world_pose* CGrannyModelInstance::__GetWorldPosePtr() const +{ + if (m_pgrnWorldPoseReal) + return m_pgrnWorldPoseReal; + + if (m_ppkSkeletonInst && *m_ppkSkeletonInst) + return (*m_ppkSkeletonInst)->m_pgrnWorldPoseReal; + + assert(m_ppkSkeletonInst!=NULL && "__GetWorldPosePtr - NO HAVE SKELETON"); + return NULL; +} + +int* CGrannyModelInstance::__GetMeshBoneIndices(unsigned int iMeshBinding) const +{ + assert(iMeshBindingGetGrannyModelPointer(); + if (!pgrnModel) + return false; + + granny_skeleton* pgrnDstSkeleton = pgrnModel->Skeleton; + if (pkDstModelInst && pkDstModelInst->m_pModel && pkDstModelInst->m_pModel->GetGrannyModelPointer()) + pgrnDstSkeleton = pkDstModelInst->m_pModel->GetGrannyModelPointer()->Skeleton; + + m_vct_pgrnMeshBinding.reserve(pgrnModel->MeshBindingCount); + + granny_int32 iMeshBinding; + for (iMeshBinding = 0; iMeshBinding != pgrnModel->MeshBindingCount; ++iMeshBinding) + m_vct_pgrnMeshBinding.push_back(GrannyNewMeshBinding(pgrnModel->MeshBindings[iMeshBinding].Mesh, pgrnModel->Skeleton, pgrnDstSkeleton)); + + return true; +} + +void CGrannyModelInstance::__DestroyMeshBindingVector() +{ + std::for_each(m_vct_pgrnMeshBinding.begin(), m_vct_pgrnMeshBinding.end(), GrannyFreeMeshBinding); + m_vct_pgrnMeshBinding.clear(); +} + +// END_OF_WORK + + +void CGrannyModelInstance::__CreateWorldPose(CGrannyModelInstance* pkSkeletonInst) +{ + assert(m_pgrnModelInstance != NULL); + assert(m_pgrnWorldPoseReal == NULL); + + // WORK + if (pkSkeletonInst) + return; + // END_OF_WORK + + granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance); + + // WORK + m_pgrnWorldPoseReal = GrannyNewWorldPose(pgrnSkeleton->BoneCount); + // END_OF_WORK +} + +void CGrannyModelInstance::__DestroyWorldPose() +{ + if (!m_pgrnWorldPoseReal) + return; + + GrannyFreeWorldPose(m_pgrnWorldPoseReal); + m_pgrnWorldPoseReal = NULL; +} + +void CGrannyModelInstance::__CreateModelInstance() +{ + assert(m_pModel != NULL); + assert(m_pgrnModelInstance == NULL); + + const granny_model * pgrnModel = m_pModel->GetGrannyModelPointer(); + m_pgrnModelInstance = GrannyInstantiateModel(pgrnModel); +} + +void CGrannyModelInstance::__DestroyModelInstance() +{ + if (!m_pgrnModelInstance) + return; + + GrannyFreeModelInstance(m_pgrnModelInstance); + m_pgrnModelInstance = NULL; +} + +void CGrannyModelInstance::__CreateMeshMatrices() +{ + assert(m_pModel != NULL); + + if (m_pModel->GetMeshCount() <= 0) // 메쉬가 없는 (카메라 같은) 모델도 간혹 있다.. + return; + + int meshCount = m_pModel->GetMeshCount(); + m_meshMatrices = new D3DXMATRIX[meshCount]; +} + +void CGrannyModelInstance::__DestroyMeshMatrices() +{ + if (!m_meshMatrices) + return; + + delete [] m_meshMatrices; + m_meshMatrices = NULL; +} + +DWORD CGrannyModelInstance::GetDeformableVertexCount() +{ + if (!m_pModel) + return 0; + + return m_pModel->GetDeformVertexCount(); +} + +DWORD CGrannyModelInstance::GetVertexCount() +{ + if (!m_pModel) + return 0; + + return m_pModel->GetVertexCount(); +} + +// WORK + +void CGrannyModelInstance::__SetSharedDeformableVertexBuffer(CGraphicVertexBuffer* pkSharedDeformableVertexBuffer) +{ + m_pkSharedDeformableVertexBuffer = pkSharedDeformableVertexBuffer; +} + +bool CGrannyModelInstance::__IsDeformableVertexBuffer() +{ + if (m_pkSharedDeformableVertexBuffer) + return true; + + return m_kLocalDeformableVertexBuffer.IsEmpty(); +} + +IDirect3DVertexBuffer8* CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr() +{ + return __GetDeformableVertexBufferRef().GetD3DVertexBuffer(); +} + +CGraphicVertexBuffer& CGrannyModelInstance::__GetDeformableVertexBufferRef() +{ + if (m_pkSharedDeformableVertexBuffer) + return *m_pkSharedDeformableVertexBuffer; + + return m_kLocalDeformableVertexBuffer; +} + +void CGrannyModelInstance::__CreateDynamicVertexBuffer() +{ + assert(m_pModel != NULL); + assert(m_kLocalDeformableVertexBuffer.IsEmpty()); + + int vtxCount = m_pModel->GetDeformVertexCount(); + + if (0 != vtxCount) + { + if (!m_kLocalDeformableVertexBuffer.Create(vtxCount, + D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1, + //D3DUSAGE_DYNAMIC, D3DPOOL_SYSTEMMEM + + D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED + )) + return; + } +} + +void CGrannyModelInstance::__DestroyDynamicVertexBuffer() +{ + m_kLocalDeformableVertexBuffer.Destroy(); + m_pkSharedDeformableVertexBuffer = NULL; +} + +// END_OF_WORK + +bool CGrannyModelInstance::GetBoneIndexByName(const char * c_szBoneName, int * pBoneIndex) const +{ + assert(m_pgrnModelInstance != NULL); + + granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance); + + if (!GrannyFindBoneByName(pgrnSkeleton, c_szBoneName, pBoneIndex)) + return false; + + return true; +} + +const float * CGrannyModelInstance::GetBoneMatrixPointer(int iBone) const +{ + const float* bones = GrannyGetWorldPose4x4(__GetWorldPosePtr(), iBone); + if (!bones) + { + granny_model* pModel = m_pModel->GetGrannyModelPointer(); + //TraceError("GrannyModelInstance(%s).GetBoneMatrixPointer(boneIndex(%d)).NOT_FOUND_BONE", pModel->Name, iBone); + return NULL; + } + return bones; +} + +const float * CGrannyModelInstance::GetCompositeBoneMatrixPointer(int iBone) const +{ + // NOTE : GrannyGetWorldPose4x4는 스케일 값등이 잘못나올 수 있음.. 그래니가 속도를 위해 + // GrannyGetWorldPose4x4에 모든 matrix 원소를 제 값으로 넣지 않음 + return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone); +} + +void CGrannyModelInstance::ReloadTexture() +{ + assert("\307\366\300\347 \273\347\277\353\307\317\301\366 \276\312\300\275 - CGrannyModelInstance::ReloadTexture()"); +/* + assert(m_pModel != NULL); + const CGrannyMaterialPalette & c_rGrannyMaterialPalette = m_pModel->GetMaterialPalette(); + DWORD dwMaterialCount = c_rGrannyMaterialPalette.GetMaterialCount(); + for (DWORD dwMtrIndex = 0; dwMtrIndex < dwMaterialCount; ++dwMtrIndex) + { + const CGrannyMaterial & c_rGrannyMaterial = c_rGrannyMaterialPalette.GetMaterialRef(dwMtrIndex); + CGraphicImage * pImageStage0 = c_rGrannyMaterial.GetImagePointer(0); + if (pImageStage0) + pImageStage0->Reload(); + CGraphicImage * pImageStage1 = c_rGrannyMaterial.GetImagePointer(1); + if (pImageStage1) + pImageStage1->Reload(); + } +*/ +} \ No newline at end of file diff --git a/extension/src/port/EterGrnLib/ModelInstanceMotion.cpp b/extension/src/port/EterGrnLib/ModelInstanceMotion.cpp new file mode 100644 index 00000000..70adb1cd --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstanceMotion.cpp @@ -0,0 +1,148 @@ +#include "StdAfx.h" +#include "ModelInstance.h" +#include "Model.h" + +void CGrannyModelInstance::CopyMotion(CGrannyModelInstance * pModelInstance, bool bIsFreeSourceControl) +{ + if (!pModelInstance->IsMotionPlaying()) + return; + + if (m_pgrnCtrl) + GrannyFreeControl(m_pgrnCtrl); + + float localTime = GetLocalTime(); + m_pgrnAni = pModelInstance->m_pgrnAni; + m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, m_pgrnModelInstance); + + if (!m_pgrnCtrl) + return; + + GrannySetControlSpeed(m_pgrnCtrl, GrannyGetControlSpeed(pModelInstance->m_pgrnCtrl)); + GrannySetControlLoopCount(m_pgrnCtrl, GrannyGetControlLoopCount(pModelInstance->m_pgrnCtrl)); + + GrannySetControlEaseIn(m_pgrnCtrl, true); + GrannySetControlEaseOut(m_pgrnCtrl, false); + + GrannySetControlRawLocalClock(m_pgrnCtrl, GrannyGetControlRawLocalClock(pModelInstance->m_pgrnCtrl)); + + GrannyFreeControlOnceUnused(m_pgrnCtrl); + + if (bIsFreeSourceControl) + { + GrannyFreeControl(pModelInstance->m_pgrnCtrl); + pModelInstance->m_pgrnCtrl = NULL; + } +} + +bool CGrannyModelInstance::IsMotionPlaying() +{ + if (!m_pgrnCtrl) + return false; + + if (GrannyControlIsComplete(m_pgrnCtrl)) + return false; + + return true; +} + +void CGrannyModelInstance::SetMotionPointer(const CGrannyMotion * pMotion, float blendTime, int loopCount, float speedRatio) +{ + // TEST + if (!m_pgrnWorldPoseReal) + return; + // END_OF_TEST + + granny_model_instance * pgrnModelInstance = m_pgrnModelInstance; + if (!pgrnModelInstance) + return; + + float localTime = GetLocalTime(); + + bool isFirst=false; + if (m_pgrnCtrl) + { + //float durationLeft = GrannyGetControlDurationLeft(m_pgrnCtrl); + //float easeOutTime = (blendTime < durationLeft) ? blendTime : durationLeft; + //float oldCtrlFinishTime = GrannyEaseControlOut(m_pgrnCtrl, blendTime); //easeOutTime); + GrannySetControlEaseOutCurve(m_pgrnCtrl, localTime, localTime + blendTime, 1.0f, 1.0f, 0.0f, 0.0f); + + GrannySetControlEaseIn(m_pgrnCtrl, false); + GrannySetControlEaseOut(m_pgrnCtrl, true); + + //Tracef("easeOut %f\n", easeOutTime); + GrannyCompleteControlAt(m_pgrnCtrl, localTime + blendTime); + //GrannyCompleteControlAt(m_pgrnCtrl, oldCtrlFinishTime); + //GrannyCompleteControlAt(m_pgrnCtrl, localTime); + GrannyFreeControlIfComplete(m_pgrnCtrl); + } + else + { + isFirst=true; + } + + m_pgrnAni = pMotion->GetGrannyAnimationPointer(); + m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance); + if (!m_pgrnCtrl) + return; + + GrannySetControlSpeed(m_pgrnCtrl, speedRatio); + GrannySetControlLoopCount(m_pgrnCtrl, loopCount); + + if (isFirst) + { + GrannySetControlEaseIn(m_pgrnCtrl, false); + GrannySetControlEaseOut(m_pgrnCtrl, false); + } + else + { + GrannySetControlEaseIn(m_pgrnCtrl, true); + GrannySetControlEaseOut(m_pgrnCtrl, false); + if (blendTime > 0.0f) + GrannySetControlEaseInCurve(m_pgrnCtrl, localTime, localTime + blendTime, 0.0f, 0.0f, 1.0f, 1.0f); + } + + //GrannyEaseControlIn(m_pgrnCtrl, blendTime, false); + GrannyFreeControlOnceUnused(m_pgrnCtrl); + //Tracef("easeIn %f\n", blendTime); +} + +void CGrannyModelInstance::ChangeMotionPointer(const CGrannyMotion* pMotion, int loopCount, float speedRatio) +{ + granny_model_instance * pgrnModelInstance = m_pgrnModelInstance; + if (!pgrnModelInstance) + return; + + // 보간 되는 앞부분을 스킵 하기 위해 LocalTime 을 어느 정도 무시한다. - [levites] + float fSkipTime = 0.3f; + float localTime = GetLocalTime() - fSkipTime; + + if (m_pgrnCtrl) + { + GrannySetControlEaseIn(m_pgrnCtrl, false); + GrannySetControlEaseOut(m_pgrnCtrl, false); + GrannyCompleteControlAt(m_pgrnCtrl, localTime); + GrannyFreeControlIfComplete(m_pgrnCtrl); + } + + m_pgrnAni = pMotion->GetGrannyAnimationPointer(); + m_pgrnCtrl = GrannyPlayControlledAnimation(localTime, m_pgrnAni, pgrnModelInstance); + if (!m_pgrnCtrl) + return; + + GrannySetControlSpeed(m_pgrnCtrl, speedRatio); + GrannySetControlLoopCount(m_pgrnCtrl, loopCount); + GrannySetControlEaseIn(m_pgrnCtrl, false); + GrannySetControlEaseOut(m_pgrnCtrl, false); + + GrannyFreeControlOnceUnused(m_pgrnCtrl); +} + +void CGrannyModelInstance::SetMotionAtEnd() +{ + if (!m_pgrnCtrl) + return; + + //Tracef("%f\n", endingTime); + float endingTime = GrannyGetControlLocalDuration(m_pgrnCtrl); + GrannySetControlRawLocalClock(m_pgrnCtrl, endingTime); +} diff --git a/extension/src/port/EterGrnLib/ModelInstanceRender.cpp b/extension/src/port/EterGrnLib/ModelInstanceRender.cpp new file mode 100644 index 00000000..591a462f --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstanceRender.cpp @@ -0,0 +1,407 @@ +#include "StdAfx.h" +#include "../EterLib/StateManager.h" +#include "ModelInstance.h" +#include "Model.h" + +#ifdef _TEST + +#include "../EterLib/GrpScreen.h" + +void Granny_RenderBoxBones(const granny_skeleton* pkGrnSkeleton, const granny_world_pose* pkGrnWorldPose, const D3DXMATRIX& matBase) +{ + D3DXMATRIX matWorld; + CScreen screen; + for (int iBone = 0; iBone != pkGrnSkeleton->BoneCount; ++iBone) + { + const granny_bone& rkGrnBone = pkGrnSkeleton->Bones[iBone]; + const D3DXMATRIX* c_matBone=(const D3DXMATRIX*)GrannyGetWorldPose4x4(pkGrnWorldPose, iBone); + + D3DXMatrixMultiply(&matWorld, c_matBone, &matBase); + + STATEMANAGER.SetTransform(D3DTS_WORLD, &matWorld); + screen.RenderBox3d(-5.0f, -5.0f, -5.0f, 5.0f, 5.0f, 5.0f); + } +} + +#endif + + +void CGrannyModelInstance::DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix) +{ + if (IsEmpty()) + return; + + // DELETED + //m_pgrnWorldPose = m_pgrnWorldPoseReal; + /////////////////////////////// + + UpdateWorldPose(); + UpdateWorldMatrices(c_pWorldMatrix); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +//// Render +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +// With One Texture +void CGrannyModelInstance::RenderWithOneTexture() +{ + // FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites] + if (IsEmpty()) + return; + +#ifdef _TEST + Granny_RenderBoxBones(GrannyGetSourceSkeleton(m_pgrnModelInstance), m_pgrnWorldPose, TEST_matWorld); + if (GetAsyncKeyState('P')) + Tracef("render %x", m_pgrnModelInstance); + return; +#endif + + STATEMANAGER.SetVertexShader(ms_pntVS); + + // WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr(); + // END_OF_WORK + + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } +} + +void CGrannyModelInstance::BlendRenderWithOneTexture() +{ + if (IsEmpty()) + return; + + // WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr(); + // END_OF_WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + + STATEMANAGER.SetVertexShader(ms_pntVS); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT); + } + + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithOneTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT); + } +} + +// With Two Texture +void CGrannyModelInstance::RenderWithTwoTexture() +{ + // FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites] + if (IsEmpty()) + return; + + STATEMANAGER.SetVertexShader(ms_pntVS); + + // WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr(); + // END_OF_WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } +} + +void CGrannyModelInstance::BlendRenderWithTwoTexture() +{ + if (IsEmpty()) + return; + + // WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr(); + // END_OF_WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + + STATEMANAGER.SetVertexShader(ms_pntVS); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT); + } + + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithTwoTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT); + } +} + +void CGrannyModelInstance::RenderWithoutTexture() +{ + if (IsEmpty()) + return; + + STATEMANAGER.SetVertexShader(ms_pntVS); + STATEMANAGER.SetTexture(0, NULL); + STATEMANAGER.SetTexture(1, NULL); + + // WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = __GetDeformableD3DVertexBufferPtr(); + // END_OF_WORK + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT); + } + + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_BLEND_PNT); + } +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +//// Render Mesh List +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// + +// With One Texture +void CGrannyModelInstance::RenderMeshNodeListWithOneTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) +{ + assert(m_pModel != NULL); + + LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer(); + assert(lpd3dIdxBuf != NULL); + + const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType); + + while (pMeshNode) + { + const CGrannyMesh * pMesh = pMeshNode->pMesh; + int vtxMeshBasePos = pMesh->GetVertexBasePosition(); + + STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos); + STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]); + + ///// + const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType); + int vtxCount = pMesh->GetVertexCount(); + while (pTriGroupNode) + { + ms_faceCount += pTriGroupNode->triCount; + + CGrannyMaterial& rkMtrl=m_kMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex); + rkMtrl.ApplyRenderState(); + STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount); + rkMtrl.RestoreRenderState(); + + pTriGroupNode = pTriGroupNode->pNextTriGroupNode; + } + ///// + + pMeshNode = pMeshNode->pNextMeshNode; + } +} + +// With Two Texture +void CGrannyModelInstance::RenderMeshNodeListWithTwoTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) +{ + assert(m_pModel != NULL); + + LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer(); + assert(lpd3dIdxBuf != NULL); + + const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType); + + while (pMeshNode) + { + const CGrannyMesh * pMesh = pMeshNode->pMesh; + int vtxMeshBasePos = pMesh->GetVertexBasePosition(); + + STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos); + STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]); + + ///// + const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType); + int vtxCount = pMesh->GetVertexCount(); + while (pTriGroupNode) + { + ms_faceCount += pTriGroupNode->triCount; + + const CGrannyMaterial& rkMtrl=m_kMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex); + STATEMANAGER.SetTexture(0, rkMtrl.GetD3DTexture(0)); + STATEMANAGER.SetTexture(1, rkMtrl.GetD3DTexture(1)); + STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount); + pTriGroupNode = pTriGroupNode->pNextTriGroupNode; + } + ///// + + pMeshNode = pMeshNode->pNextMeshNode; + } +} + +// Without Texture +void CGrannyModelInstance::RenderMeshNodeListWithoutTexture(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) +{ + assert(m_pModel != NULL); + + LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer(); + assert(lpd3dIdxBuf != NULL); + + const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType); + + while (pMeshNode) + { + const CGrannyMesh * pMesh = pMeshNode->pMesh; + int vtxMeshBasePos = pMesh->GetVertexBasePosition(); + + STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos); + STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]); + + ///// + const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType); + int vtxCount = pMesh->GetVertexCount(); + + while (pTriGroupNode) + { + ms_faceCount += pTriGroupNode->triCount; + STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount); + pTriGroupNode = pTriGroupNode->pNextTriGroupNode; + } + ///// + + pMeshNode = pMeshNode->pNextMeshNode; + } +} + +/* +void CGrannyModelInstance::RenderMeshNodeList(CGrannyMesh::EType eMeshType, CGrannyMaterial::EType eMtrlType) +{ + assert(m_pModel != NULL); + + LPDIRECT3DINDEXBUFFER8 lpd3dIdxBuf = m_pModel->GetD3DIndexBuffer(); + assert(lpd3dIdxBuf != NULL); + + const CGrannyModel::TMeshNode * pMeshNode = m_pModel->GetMeshNodeList(eMeshType, eMtrlType); + + while (pMeshNode) + { + const CGrannyMesh * pMesh = pMeshNode->pMesh; + int vtxMeshBasePos = pMesh->GetVertexBasePosition(); + + STATEMANAGER.SetIndices(lpd3dIdxBuf, vtxMeshBasePos); + STATEMANAGER.SetTransform(D3DTS_WORLD, &m_meshMatrices[pMeshNode->iMesh]); + + ///// + const CGrannyMesh::TTriGroupNode* pTriGroupNode = pMesh->GetTriGroupNodeList(eMtrlType); + int vtxCount = pMesh->GetVertexCount(); + while (pTriGroupNode) + { + ms_faceCount += pTriGroupNode->triCount; + STATEMANAGER.SetTexture(0, pTriGroupNode->lpd3dTextures[0]); + + if (pTriGroupNode->lpd3dTextures[1]) + STATEMANAGER.SetTexture(1, pTriGroupNode->lpd3dTextures[1]); + else + { + STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); + STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); + + STATEMANAGER.SetTexture(1, m_FogInstance.GetTexturePointer()->GetD3DTexture()); + + D3DXMATRIX mat; + memset(&mat, 0, sizeof(D3DXMATRIX)); + mat._31 = -0.001f; + mat._41 = -7.0f; + mat._42 = 0.5f; + STATEMANAGER.SetTransform(D3DTS_TEXTURE1, &mat); + } + + STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, vtxCount, pTriGroupNode->idxPos, pTriGroupNode->triCount); + + if (!pTriGroupNode->lpd3dTextures[1]) + { + STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); + STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + } + + pTriGroupNode = pTriGroupNode->pNextTriGroupNode; + } + ///// + + pMeshNode = pMeshNode->pNextMeshNode; + } +} +void CGrannyModelInstance::RenderToShadowMap() +{ + if (IsEmpty()) + return; + + STATEMANAGER.SetVertexShader(ms_pntVS); + +// LPDIRECT3DVERTEXBUFFER8 lpd3dDynamicPNTVtxBuf = m_dynamicPNTVtxBuf.GetD3DVertexBuffer(); + LPDIRECT3DVERTEXBUFFER8 lpd3dDeformPNTVtxBuf = m_dynamicPNTVtxBuf.GetD3DVertexBuffer(); + LPDIRECT3DVERTEXBUFFER8 lpd3dRigidPNTVtxBuf = m_pModel->GetPNTD3DVertexBuffer(); + +// STATEMANAGER.SaveRenderState(D3DRS_ALPHATESTENABLE, TRUE); +// STATEMANAGER.SaveRenderState(D3DRS_ALPHAREF, 0); +// STATEMANAGER.SaveRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL); +// +// if (lpd3dDynamicPNTVtxBuf) +// { +// STATEMANAGER.SetStreamSource(0, lpd3dDynamicPNTVtxBuf, sizeof(TPNTVertex)); +// RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_BLEND_PNT); +// } +// +// STATEMANAGER.RestoreRenderState(D3DRS_ALPHATESTENABLE); +// STATEMANAGER.RestoreRenderState(D3DRS_ALPHAREF); +// STATEMANAGER.RestoreRenderState(D3DRS_ALPHAFUNC); + + if (lpd3dDeformPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dDeformPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_DEFORM, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } + + if (lpd3dRigidPNTVtxBuf) + { + STATEMANAGER.SetStreamSource(0, lpd3dRigidPNTVtxBuf, sizeof(TPNTVertex)); + RenderMeshNodeListWithoutTexture(CGrannyMesh::TYPE_RIGID, CGrannyMaterial::TYPE_DIFFUSE_PNT); + } +} +*/ diff --git a/extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp b/extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp new file mode 100644 index 00000000..9daf9421 --- /dev/null +++ b/extension/src/port/EterGrnLib/ModelInstanceUpdate.cpp @@ -0,0 +1,208 @@ +#include "StdAfx.h" +#include "../EterBase/Debug.h" +#include "ModelInstance.h" +#include "Model.h" + + +void CGrannyModelInstance::Update(DWORD dwAniFPS) +{ + if (!dwAniFPS) + return; + + const DWORD c_dwCurUpdateFrame = (DWORD) (GetLocalTime() * static_cast(ANIFPS_MAX)); + const DWORD ANIFPS_STEP = ANIFPS_MAX/dwAniFPS; + if (c_dwCurUpdateFrame>ANIFPS_STEP && c_dwCurUpdateFrame/ANIFPS_STEP==m_dwOldUpdateFrame/ANIFPS_STEP) + return; + + m_dwOldUpdateFrame=c_dwCurUpdateFrame; + + GrannyFreeCompletedModelControls(m_pgrnModelInstance); //Black screen fix + + //DWORD t1=timeGetTime(); + GrannySetModelClock(m_pgrnModelInstance, GetLocalTime()); + //DWORD t2=timeGetTime(); + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_grn_setmodelclock.txt", "w"); + + if (t2-t1>3) + { + fprintf(fp, "%f:%x:- GrannySetModelClock(time=%f) = %dms\n", timeGetTime()/1000.0f, this, GetLocalTime(), t2-t1); + fflush(fp); + } + } +#endif + +} + +void CGrannyModelInstance::UpdateLocalTime(float fElapsedTime) +{ + m_fSecondsElapsed = fElapsedTime; + m_fLocalTime += fElapsedTime; +} + +void CGrannyModelInstance::UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed) +{ + if (!m_pgrnModelInstance) + { + TraceError("CGrannyModelIstance::UpdateTransform - m_pgrnModelInstance = NULL"); + return; + } + GrannyUpdateModelMatrix(m_pgrnModelInstance, fSecondsElapsed, (const float *) pMatrix, (float *) pMatrix, false); + //Tracef("%f %f %f",pMatrix->_41,pMatrix->_42,pMatrix->_43); + +} + +void CGrannyModelInstance::Deform(const D3DXMATRIX * c_pWorldMatrix) +{ + if (IsEmpty()) + return; + + // DELETED + //m_pgrnWorldPose = m_pgrnWorldPoseReal; + ///////////////////////////////////////////// + + UpdateWorldPose(); + UpdateWorldMatrices(c_pWorldMatrix); + + if (m_pModel->CanDeformPNTVertices()) + { + // WORK + CGraphicVertexBuffer& rkDeformableVertexBuffer = __GetDeformableVertexBufferRef(); + TPNTVertex* pntVertices; + if (rkDeformableVertexBuffer.LockRange(m_pModel->GetDeformVertexCount(), (void **)&pntVertices)) + { + DeformPNTVertices(pntVertices); + rkDeformableVertexBuffer.Unlock(); + } + else + { + TraceError("GRANNY DEFORM DYNAMIC BUFFER LOCK ERROR"); + } + // END_OF_WORK + } +} + +////////////////////////////////////////////////////// +class CGrannyLocalPose +{ + public: + CGrannyLocalPose() + { + m_pgrnLocalPose = NULL; + m_boneCount = 0; + } + + virtual ~CGrannyLocalPose() + { + if (m_pgrnLocalPose) + GrannyFreeLocalPose(m_pgrnLocalPose); + } + + granny_local_pose * Get(int boneCount) + { + if (m_pgrnLocalPose) + { + if (m_boneCount >= boneCount) + return m_pgrnLocalPose; + + GrannyFreeLocalPose(m_pgrnLocalPose); + } + + m_boneCount = boneCount; + m_pgrnLocalPose = GrannyNewLocalPose(m_boneCount); + return m_pgrnLocalPose; + } + + private: + granny_local_pose * m_pgrnLocalPose; + int m_boneCount; +}; +////////////////////////////////////////////////////// + +void CGrannyModelInstance::UpdateSkeleton(const D3DXMATRIX * c_pWorldMatrix, float /*fLocalTime*/) +{ + // DELETED + //m_pgrnWorldPose = m_pgrnWorldPoseReal; + /////////////////////////////////////////// + UpdateWorldPose(); + UpdateWorldMatrices(c_pWorldMatrix); +} + +void CGrannyModelInstance::UpdateWorldPose() +{ + // WEP = m_iParentBoneIndex != 0 -> UpdateWorldPose(O) + // LOD = UpdateWorldPose(O) + // Hair = UpdateWorldPose(X) + + if (m_ppkSkeletonInst) + if (*m_ppkSkeletonInst!=this) + return; + + static CGrannyLocalPose s_SharedLocalPose; + + granny_skeleton * pgrnSkeleton = GrannyGetSourceSkeleton(m_pgrnModelInstance); + granny_local_pose * pgrnLocalPose = s_SharedLocalPose.Get(pgrnSkeleton->BoneCount); + + const float * pAttachBoneMatrix = (mc_pParentInstance) ? mc_pParentInstance->GetBoneMatrixPointer(m_iParentBoneIndex) : NULL; + + GrannySampleModelAnimationsAccelerated(m_pgrnModelInstance, pgrnSkeleton->BoneCount, pAttachBoneMatrix, pgrnLocalPose, __GetWorldPosePtr()); + /* + GrannySampleModelAnimations(m_pgrnModelInstance, 0, pgrnSkeleton->BoneCount, pgrnLocalPose); + GrannyBuildWorldPose(pgrnSkeleton, 0, pgrnSkeleton->BoneCount, pgrnLocalPose, pAttachBoneMatrix, m_pgrnWorldPose); + */ + GrannyFreeCompletedModelControls(m_pgrnModelInstance); + +} + +void CGrannyModelInstance::UpdateWorldMatrices(const D3DXMATRIX* c_pWorldMatrix) +{ + // NO_MESH_BUG_FIX + if (!m_meshMatrices) + return; + // END_OF_NO_MESH_BUG_FIX + + assert(m_pModel != NULL); + assert(ms_lpd3dMatStack != NULL); + + int meshCount = m_pModel->GetMeshCount(); + + granny_matrix_4x4 * pgrnMatCompositeBuffer = GrannyGetWorldPoseComposite4x4Array(__GetWorldPosePtr()); + D3DXMATRIX * boneMatrices = (D3DXMATRIX *) pgrnMatCompositeBuffer; + + for (int i = 0; i < meshCount; ++i) + { + D3DXMATRIX & rWorldMatrix = m_meshMatrices[i]; + + const CGrannyMesh * pMesh = m_pModel->GetMeshPointer(i); + + // WORK + int * boneIndices = __GetMeshBoneIndices(i); + // END_OF_WORK + + if (pMesh->CanDeformPNTVertices()) + { + rWorldMatrix = *c_pWorldMatrix; + } + else + { + int iBone = *boneIndices; + D3DXMatrixMultiply(&rWorldMatrix, &boneMatrices[iBone], c_pWorldMatrix); + } + } + +#ifdef _TEST + TEST_matWorld = *c_pWorldMatrix; +#endif +} + +void CGrannyModelInstance::DeformPNTVertices(void * pvDest) +{ + assert(m_pModel != NULL); + assert(m_pModel->CanDeformPNTVertices()); + + // WORK + m_pModel->DeformPNTVertices(pvDest, (D3DXMATRIX *) GrannyGetWorldPoseComposite4x4Array(__GetWorldPosePtr()), m_vct_pgrnMeshBinding); + // END_OF_WORK +} diff --git a/extension/src/port/EterGrnLib/Motion.cpp b/extension/src/port/EterGrnLib/Motion.cpp new file mode 100644 index 00000000..02a5f9e1 --- /dev/null +++ b/extension/src/port/EterGrnLib/Motion.cpp @@ -0,0 +1,70 @@ +#include "StdAfx.h" +#include "Motion.h" + +CGrannyMotion::CGrannyMotion() +{ + Initialize(); +} + +CGrannyMotion::~CGrannyMotion() +{ + Destroy(); +} + +bool CGrannyMotion::IsEmpty() +{ + return m_pgrnAni ? false : true; +} + +void CGrannyMotion::Destroy() +{ + Initialize(); +} + +void CGrannyMotion::Initialize() +{ + m_pgrnAni = NULL; +} + +bool CGrannyMotion::BindGrannyAnimation(granny_animation * pgrnAni) +{ + assert(IsEmpty()); + + m_pgrnAni = pgrnAni; + return true; +} + +granny_animation* CGrannyMotion::GetGrannyAnimationPointer() const +{ + return m_pgrnAni; +} + +const char * CGrannyMotion::GetName() const +{ + return m_pgrnAni->Name; +} + +float CGrannyMotion::GetDuration() const +{ + return m_pgrnAni->Duration; +} + +void CGrannyMotion::GetTextTrack(const char * c_szTextTrackName, int * pCount, float * pArray) const +{ + if (m_pgrnAni->TrackGroupCount != 1) + { +// assert(!"CGrannyMotion::GetTextTrack - TrackCount is not 1"); + } + + granny_track_group * pTrack = m_pgrnAni->TrackGroups[0]; + + for (int i = 0; i < pTrack->TextTrackCount; ++i) + { + granny_text_track & rTextTrack = pTrack->TextTracks[i]; + + for (int j = 0; j < rTextTrack.EntryCount; ++j) + if (!_stricmp(c_szTextTrackName, rTextTrack.Entries[j].Text)) + pArray[(*pCount)++] = rTextTrack.Entries[j].TimeStamp; + } +} + diff --git a/extension/src/port/EterGrnLib/Thing.cpp b/extension/src/port/EterGrnLib/Thing.cpp new file mode 100644 index 00000000..506bbacc --- /dev/null +++ b/extension/src/port/EterGrnLib/Thing.cpp @@ -0,0 +1,242 @@ +#include "StdAfx.h" +#include "../EterBase/Debug.h" +#include "Thing.h" +#include "ThingInstance.h" + +CGraphicThing::CGraphicThing(const char* c_szFileName) : CResource(c_szFileName) +{ + Initialize(); +} + +CGraphicThing::~CGraphicThing() +{ + //OnClear(); + Clear(); +} + +void CGraphicThing::Initialize() +{ + m_pgrnFile = NULL; + m_pgrnFileInfo = NULL; + m_pgrnAni = NULL; + + m_models = NULL; + m_motions = NULL; +} + +void CGraphicThing::OnClear() +{ + if (m_motions) + delete [] m_motions; + + if (m_models) + delete [] m_models; + + if (m_pgrnFile) + GrannyFreeFile(m_pgrnFile); + + Initialize(); +} + +CGraphicThing::TType CGraphicThing::Type() +{ + static TType s_type = StringToType("CGraphicThing"); + return s_type; +} + +bool CGraphicThing::OnIsEmpty() const +{ + return m_pgrnFile ? false : true; +} + +bool CGraphicThing::OnIsType(TType type) +{ + if (CGraphicThing::Type() == type) + return true; + + return CResource::OnIsType(type); +} + +bool CGraphicThing::CreateDeviceObjects() +{ + if (!m_pgrnFileInfo) + return true; + + for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m) + { + CGrannyModel & rModel = m_models[m]; + rModel.CreateDeviceObjects(); + } + + return true; +} + +void CGraphicThing::DestroyDeviceObjects() +{ + if (!m_pgrnFileInfo) + return; + + for (int m = 0; m < m_pgrnFileInfo->ModelCount; ++m) + { + CGrannyModel & rModel = m_models[m]; + rModel.DestroyDeviceObjects(); + } +} + +bool CGraphicThing::CheckModelIndex(int iModel) const +{ + if (!m_pgrnFileInfo) + { + Tracef("m_pgrnFileInfo == NULL: %s\n", GetFileName()); + return false; + } + + assert(m_pgrnFileInfo != NULL); + + if (iModel < 0) + return false; + + if (iModel >= m_pgrnFileInfo->ModelCount) + return false; + + return true; +} + +bool CGraphicThing::CheckMotionIndex(int iMotion) const +{ + // Temporary + if (!m_pgrnFileInfo) + return false; + // Temporary + + assert(m_pgrnFileInfo != NULL); + + if (iMotion < 0) + return false; + + if (iMotion >= m_pgrnFileInfo->AnimationCount) + return false; + + return true; +} + +CGrannyModel * CGraphicThing::GetModelPointer(int iModel) +{ + assert(CheckModelIndex(iModel)); + assert(m_models != NULL); + return m_models + iModel; +} + +CGrannyMotion * CGraphicThing::GetMotionPointer(int iMotion) +{ + assert(CheckMotionIndex(iMotion)); + + if (iMotion >= m_pgrnFileInfo->AnimationCount) + return NULL; + + assert(m_motions != NULL); + return (m_motions + iMotion); +} + +int CGraphicThing::GetModelCount() const +{ + if (!m_pgrnFileInfo) + return 0; + + return (m_pgrnFileInfo->ModelCount); +} + +int CGraphicThing::GetMotionCount() const +{ + if (!m_pgrnFileInfo) + return 0; + + return (m_pgrnFileInfo->AnimationCount); +} + +bool CGraphicThing::OnLoad(int iSize, const void * c_pvBuf) +{ + if (!c_pvBuf) + return false; + + m_pgrnFile = GrannyReadEntireFileFromMemory(iSize, (void *) c_pvBuf); + + if (!m_pgrnFile) + return false; + + m_pgrnFileInfo = GrannyGetFileInfo(m_pgrnFile); + + if (!m_pgrnFileInfo) + return false; + + LoadModels(); + LoadMotions(); + return true; +} + +// SUPPORT_LOCAL_TEXTURE +static std::string gs_modelLocalPath; + +const std::string& GetModelLocalPath() +{ + return gs_modelLocalPath; +} +// END_OF_SUPPORT_LOCAL_TEXTURE + +bool CGraphicThing::LoadModels() +{ + assert(m_pgrnFile != NULL); + assert(m_models == NULL); + + if (m_pgrnFileInfo->ModelCount <= 0) + return false; + + // SUPPORT_LOCAL_TEXTURE + const std::string& fileName = GetFileNameString(); + + //char localPath[256] = ""; + if (fileName.length() > 2 && fileName[1] != ':') + { + int sepPos = fileName.rfind('\\'); + gs_modelLocalPath.assign(fileName, 0, sepPos+1); + } + // END_OF_SUPPORT_LOCAL_TEXTURE + + int modelCount = m_pgrnFileInfo->ModelCount; + + m_models = new CGrannyModel[modelCount]; + + for (int m = 0; m < modelCount; ++m) + { + CGrannyModel & rModel = m_models[m]; + granny_model * pgrnModel = m_pgrnFileInfo->Models[m]; + + if (!rModel.CreateFromGrannyModelPointer(pgrnModel)) + return false; + } + + GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidVertexSection); + GrannyFreeFileSection(m_pgrnFile, GrannyStandardRigidIndexSection); + GrannyFreeFileSection(m_pgrnFile, GrannyStandardDeformableIndexSection); + GrannyFreeFileSection(m_pgrnFile, GrannyStandardTextureSection); + return true; +} + +bool CGraphicThing::LoadMotions() +{ + assert(m_pgrnFile != NULL); + assert(m_motions == NULL); + + if (m_pgrnFileInfo->AnimationCount <= 0) + return false; + + int motionCount = m_pgrnFileInfo->AnimationCount; + + m_motions = new CGrannyMotion[motionCount]; + + for (int m = 0; m < motionCount; ++m) + if (!m_motions[m].BindGrannyAnimation(m_pgrnFileInfo->Animations[m])) + return false; + + return true; +} diff --git a/extension/src/port/EterGrnLib/ThingInstance.cpp b/extension/src/port/EterGrnLib/ThingInstance.cpp new file mode 100644 index 00000000..f6b7ec8b --- /dev/null +++ b/extension/src/port/EterGrnLib/ThingInstance.cpp @@ -0,0 +1,967 @@ +#include "StdAfx.h" +#include "../EterBase/Debug.h" +#include "../EterLib/Camera.h" +#include "../EterBase/Timer.h" +#include "ThingInstance.h" +#include "Thing.h" +#include "ModelInstance.h" + +CDynamicPool CGraphicThingInstance::ms_kPool; + +CGraphicThing* CGraphicThingInstance::GetBaseThingPtr() +{ + if (m_modelThingSetVector.empty()) + return NULL; + + TModelThingSet& rkModelThingSet=m_modelThingSetVector[0]; + if (rkModelThingSet.m_pLODThingRefVector.empty()) + return NULL; + + CGraphicThing::TRef* proThing=rkModelThingSet.m_pLODThingRefVector[0]; + if (!proThing) + return NULL; + + CGraphicThing::TRef roThing=*proThing; + return roThing.GetPointer(); +} + +bool CGraphicThingInstance::LessRenderOrder(CGraphicThingInstance* pkThingInst) +{ + return (GetBaseThingPtr()GetBaseThingPtr()); +} + +void CGraphicThingInstance::CreateSystem(UINT uCapacity) +{ + ms_kPool.Create(uCapacity); +} + +void CGraphicThingInstance::DestroySystem() +{ + ms_kPool.Destroy(); +} + +CGraphicThingInstance* CGraphicThingInstance::New() +{ + return ms_kPool.Alloc(); +} + +void CGraphicThingInstance::Delete(CGraphicThingInstance* pkThingInst) +{ + pkThingInst->Clear(); + ms_kPool.Free(pkThingInst); +} + +void CGraphicThingInstance::SetMotionAtEnd() +{ + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), std::mem_fn(&CGrannyLODController::SetMotionAtEnd)); +} + +bool CGraphicThingInstance::Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y) +{ + if (!m_pHeightAttributeInstance) + return false; + return m_pHeightAttributeInstance->Picking(v,dir,out_x,out_y); +} + + +void CGraphicThingInstance::OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector) +{ + assert(pscdVector); + CStaticCollisionDataVector::const_iterator it; + for(it = pscdVector->begin();it!=pscdVector->end();++it) + { + AddCollision(&(*it),&GetTransform()); + } +} + +void CGraphicThingInstance::OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance) +{ + assert(pAttributeInstance); + SetHeightInstance(pAttributeInstance); +} + +bool CGraphicThingInstance::OnGetObjectHeight(float fX, float fY, float * pfHeight) +{ + if (m_pHeightAttributeInstance && m_pHeightAttributeInstance->GetHeight(fX, fY, pfHeight)) + return true; + return false; +} + +void CGraphicThingInstance::BuildBoundingSphere() +{ + D3DXVECTOR3 v3Min, v3Max; + GetBoundBox(0, &v3Min, &v3Max); + m_v3Center = (v3Min + v3Max) * 0.5f; + D3DXVECTOR3 vDelta = (v3Max - v3Min); + + m_fRadius = D3DXVec3Length(&vDelta) * 0.5f + 50.0f; // extra length for attached objects +} + +bool CGraphicThingInstance::GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius) +{ + if (m_fRadius <= 0) + { + BuildBoundingSphere(); + + fRadius = m_fRadius; + v3Center = m_v3Center; + } + else + { + fRadius = m_fRadius; + v3Center = m_v3Center; + } + + D3DXVec3TransformCoord(&v3Center, &v3Center, &GetTransform()); + return true; +} + +void CGraphicThingInstance::BuildBoundingAABB() +{ + D3DXVECTOR3 v3Min, v3Max; + GetBoundBox(0, &v3Min, &v3Max); + m_v3Center = (v3Min + v3Max) * 0.5f; + m_v3Min = v3Min; + m_v3Max = v3Max; +} + +bool CGraphicThingInstance::GetBoundingAABB(D3DXVECTOR3 & v3Min, D3DXVECTOR3 & v3Max) +{ + BuildBoundingAABB(); + + v3Min = m_v3Min; + v3Max = m_v3Max; + + D3DXVec3TransformCoord(&m_v3Center, &m_v3Center, &GetTransform()); + return true; +} + +void CGraphicThingInstance::CalculateBBox() +{ + GetBoundBox(&m_v3BBoxMin, &m_v3BBoxMax); + + m_v4TBBox[0] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f); + m_v4TBBox[1] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f); + m_v4TBBox[2] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f); + m_v4TBBox[3] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f); + m_v4TBBox[4] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f); + m_v4TBBox[5] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f); + m_v4TBBox[6] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f); + m_v4TBBox[7] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f); + + const D3DXMATRIX & c_rmatTransform = GetTransform(); + + for (DWORD i = 0; i < 8; ++i) + { + D3DXVec4Transform(&m_v4TBBox[i], &m_v4TBBox[i], &c_rmatTransform); + if (0 == i) + { + m_v3TBBoxMin.x = m_v4TBBox[i].x; + m_v3TBBoxMin.y = m_v4TBBox[i].y; + m_v3TBBoxMin.z = m_v4TBBox[i].z; + m_v3TBBoxMax.x = m_v4TBBox[i].x; + m_v3TBBoxMax.y = m_v4TBBox[i].y; + m_v3TBBoxMax.z = m_v4TBBox[i].z; + } + else + { + if (m_v3TBBoxMin.x > m_v4TBBox[i].x) + m_v3TBBoxMin.x = m_v4TBBox[i].x; + if (m_v3TBBoxMax.x < m_v4TBBox[i].x) + m_v3TBBoxMax.x = m_v4TBBox[i].x; + if (m_v3TBBoxMin.y > m_v4TBBox[i].y) + m_v3TBBoxMin.y = m_v4TBBox[i].y; + if (m_v3TBBoxMax.y < m_v4TBBox[i].y) + m_v3TBBoxMax.y = m_v4TBBox[i].y; + if (m_v3TBBoxMin.z > m_v4TBBox[i].z) + m_v3TBBoxMin.z = m_v4TBBox[i].z; + if (m_v3TBBoxMax.z < m_v4TBBox[i].z) + m_v3TBBoxMax.z = m_v4TBBox[i].z; + } + } +} + +bool CGraphicThingInstance::CreateDeviceObjects() +{ + CGrannyLODController::FCreateDeviceObjects createDeviceObjects; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), createDeviceObjects); + return true; +} + +void CGraphicThingInstance::DestroyDeviceObjects() +{ + CGrannyLODController::FDestroyDeviceObjects destroyDeviceObjects; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), destroyDeviceObjects); +} + +bool CGraphicThingInstance::CheckModelInstanceIndex(int iModelInstance) +{ + if (iModelInstance < 0) + return false; + + int max = m_LODControllerVector.size(); + + if (iModelInstance >= max) + return false; + + return true; +} + +bool CGraphicThingInstance::CheckModelThingIndex(int iModelThing) +{ + if (iModelThing < 0) + return false; + + int max = m_modelThingSetVector.size(); + + if (iModelThing >= max) + return false; + + return true; +} + +bool CGraphicThingInstance::CheckMotionThingIndex(DWORD dwMotionKey) +{ + std::map::iterator itor = m_roMotionThingMap.find(dwMotionKey); + + if (m_roMotionThingMap.end() == itor) + return false; + + return true; +} + +bool CGraphicThingInstance::GetMotionThingPointer(DWORD dwKey, CGraphicThing ** ppMotion) +{ + if (!CheckMotionThingIndex(dwKey)) + return false; + + *ppMotion = m_roMotionThingMap[dwKey]->GetPointer(); + return true; +} + +bool CGraphicThingInstance::IsMotionThing() +{ + return !m_roMotionThingMap.empty(); +} + +void CGraphicThingInstance::ReserveModelInstance(int iCount) +{ + stl_wipe(m_LODControllerVector); + + for (int i = 0; i < iCount; ++i) + { + CGrannyLODController * pInstance = new CGrannyLODController; + m_LODControllerVector.push_back(pInstance); + } +} + +void CGraphicThingInstance::ReserveModelThing(int iCount) +{ + m_modelThingSetVector.resize(iCount); +} + +bool CGraphicThingInstance::FindBoneIndex(int iModelInstance, const char* c_szBoneName, int* iRetBone) +{ + assert(CheckModelInstanceIndex(iModelInstance)); + + CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelInstance]->GetModelInstance(); + + if (!pModelInstance) + return false; + + return pModelInstance->GetBoneIndexByName(c_szBoneName, iRetBone); +} + +void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, int iSrcModelInstance) +{ + if (!CheckModelInstanceIndex(iSrcModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance); + return; + } + if (!CheckModelInstanceIndex(iDstModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance); + return; + } + + CGrannyLODController * pSrcLODController = m_LODControllerVector[iSrcModelInstance]; + CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance]; + pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName); +} + +void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance) +{ + if (!CheckModelInstanceIndex(iDstModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance); + return; + } + if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance); + return; + } + + CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance]; + CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance]; + pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName); +} + +void CGraphicThingInstance::DetachModelInstance(int iDstModelInstance, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance) +{ + if (!CheckModelInstanceIndex(iDstModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance); + return; + } + if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance)) + { + TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance); + return; + } + + CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance]; + CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance]; + pDstLODController->DetachModelInstance(pSrcLODController); +} + +bool CGraphicThingInstance::GetBonePosition(int iModelIndex, int iBoneIndex, float * pfx, float * pfy, float * pfz) +{ + assert(CheckModelInstanceIndex(iModelIndex)); + + CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelIndex]->GetModelInstance(); + + if (!pModelInstance) + return false; + + const float * pfMatrix = pModelInstance->GetBoneMatrixPointer(iBoneIndex); + + *pfx = pfMatrix[12]; + *pfy = pfMatrix[13]; + *pfz = pfMatrix[14]; + return true; +} +//iSkelInstance 가 있으면 기본 본에 Link(본이 붙는것)시키고, +//없으면 기본 본에 attach(좌표만 가져다 쓰는것) 됩니다. +bool CGraphicThingInstance::SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance) +{ + if (!CheckModelInstanceIndex(iDstModelInstance)) + { + TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel); + return false; + } + if (!CheckModelThingIndex(iSrcModelThing)) + { + TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel); + return false; + } + + CGrannyLODController * pController = m_LODControllerVector[iDstModelInstance]; + if (!pController) + return false; + + // HAIR_LINK + CGrannyLODController * pSkelController = NULL; + if (iSkelInstance != DONTUSEVALUE) + { + if (!CheckModelInstanceIndex(iSkelInstance)) + { + TraceError("CGraphicThingInstance::SetModelInstanceByOtherSkeletonInstance(iSkelInstance=%d, iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iSkelInstance, iDstModelInstance, iSrcModelThing, iSrcModel); + return false; + } + pSkelController = m_LODControllerVector[iSkelInstance]; + if (!pSkelController) + return false; + } + // END_OF_HAIR_LINK + + TModelThingSet & rModelThingSet = m_modelThingSetVector[iSrcModelThing]; + + pController->Clear(); + + + for (DWORD i = 0; i < rModelThingSet.m_pLODThingRefVector.size(); ++i) + { + if (rModelThingSet.m_pLODThingRefVector[i]->IsNull()) + return false; + + pController->AddModel(rModelThingSet.m_pLODThingRefVector[i]->GetPointer(), iSrcModel, pSkelController); + } + return true; +} + +void CGraphicThingInstance::SetMaterialImagePointer(UINT ePart, const char* c_szImageName, CGraphicImage* pImage) +{ + if (ePart>=m_LODControllerVector.size()) + { + TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d)GetFileName()); + + return; + } + + if (!m_LODControllerVector[ePart]) + { + TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d), c_szImageName=%s, pImage=%s) - ePart Data is NULL", + ePart, m_LODControllerVector.size(), c_szImageName, pImage->GetFileName()); + + return; + } + + m_LODControllerVector[ePart]->SetMaterialImagePointer(c_szImageName, pImage); +} + +void CGraphicThingInstance::SetMaterialData(UINT ePart, const char* c_szImageName, SMaterialData kMaterialData) +{ + if (ePart>=m_LODControllerVector.size()) + { + TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)SetMaterialData(c_szImageName, kMaterialData); +} + +void CGraphicThingInstance::SetSpecularInfo(UINT ePart, const char* c_szMtrlName, BOOL bEnable, float fPower) +{ + if (ePart>=m_LODControllerVector.size()) + { + TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)SetSpecularInfo(c_szMtrlName, bEnable, fPower); +} + +bool CGraphicThingInstance::SetMotion(DWORD dwMotionKey, float blendTime, int loopCount, float speedRatio) +{ + if (!CheckMotionThingIndex(dwMotionKey)) + return false; + + std::map::iterator itor = m_roMotionThingMap.find(dwMotionKey); + CGraphicThing::TRef * proMotionThing = itor->second; + CGraphicThing * pMotionThing = proMotionThing->GetPointer(); + + if (!pMotionThing) + return false; + + if (!pMotionThing->CheckMotionIndex(0)) + return false; + + CGrannyLODController::FSetMotionPointer SetMotionPointer; + SetMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0); + SetMotionPointer.m_blendTime = blendTime; + SetMotionPointer.m_loopCount = loopCount; + SetMotionPointer.m_speedRatio = speedRatio; + + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetMotionPointer); + return true; +} + +bool CGraphicThingInstance::ChangeMotion(DWORD dwMotionKey, int loopCount, float speedRatio) +{ + if (!CheckMotionThingIndex(dwMotionKey)) + return false; + + std::map::iterator itor = m_roMotionThingMap.find(dwMotionKey); + CGraphicThing::TRef * proMotionThing = itor->second; + CGraphicThing * pMotionThing = proMotionThing->GetPointer(); + + if (!pMotionThing) + return false; + + if (!pMotionThing->CheckMotionIndex(0)) + return false; + + CGrannyLODController::FChangeMotionPointer ChangeMotionPointer; + ChangeMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0); + ChangeMotionPointer.m_loopCount = loopCount; + ChangeMotionPointer.m_speedRatio = speedRatio; + + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ChangeMotionPointer); + return true; +} + +void CGraphicThingInstance::SetEndStopMotion() +{ + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FEndStopMotionPointer()); +} + +void CGraphicThingInstance::RegisterModelThing(int iModelThing, CGraphicThing * pModelThing) +{ + if (!CheckModelThingIndex(iModelThing)) + { + TraceError("CGraphicThingInstance::RegisterModelThing(iModelThing=%d, pModelThing=%s)\n", iModelThing, pModelThing->GetFileName()); + return; + } + + m_modelThingSetVector[iModelThing].Clear(); + + if (pModelThing) + RegisterLODThing(iModelThing, pModelThing); +} + +void CGraphicThingInstance::RegisterLODThing(int iModelThing, CGraphicThing * pModelThing) +{ + assert(CheckModelThingIndex(iModelThing)); + CGraphicThing::TRef * pModelRef = new CGraphicThing::TRef; + pModelRef->SetPointer(pModelThing); + m_modelThingSetVector[iModelThing].m_pLODThingRefVector.push_back(pModelRef); +} + +void CGraphicThingInstance::RegisterMotionThing(DWORD dwMotionKey, CGraphicThing* pMotionThing) +{ + CGraphicThing::TRef * pMotionRef = new CGraphicThing::TRef; + pMotionRef->SetPointer(pMotionThing); + m_roMotionThingMap.insert(std::map::value_type(dwMotionKey, pMotionRef)); +} + +void CGraphicThingInstance::ResetLocalTime() +{ + //m_clockLast = GrannyGetSystemSeconds(); + m_fLastLocalTime = 0.0f; + m_fLocalTime = 0.0f; + + CGrannyLODController::FResetLocalTime resetLocalTime; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), resetLocalTime); +} + +/* +void CGraphicThingInstance::SetMotionSpeed(float fRate) +{ + m_fMotionTimeSpeed = fRate; +} +*/ +void CGraphicThingInstance::InsertDelay(float fDelay) +{ + m_fDelay = fDelay; +} + +float CGraphicThingInstance::GetLastLocalTime() +{ + return m_fLastLocalTime; +} + +float CGraphicThingInstance::GetLocalTime() +{ + return m_fLocalTime; +} + +float CGraphicThingInstance::GetSecondElapsed() +{ + return m_fSecondElapsed; +} + +float CGraphicThingInstance::GetAverageSecondElapsed() +{ + return m_fAverageSecondElapsed; +} + +bool CGraphicThingInstance::Intersect(float* pu, float* pv, float* pt) +{ + if (!CGraphicObjectInstance::isShow()) + return false; + if (!m_bUpdated) + return false; + + if (m_LODControllerVector.empty()) + { + //TraceError("CGraphicThingInstance::Intersect - m_LODControllerVector is empty"); + return false; + } + + return m_LODControllerVector[0]->Intersect(&GetTransform(), pu, pv, pt); +} + +void CGraphicThingInstance::GetBoundBox(D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax) +{ + vtMin->x = vtMin->y = vtMin->z = 100000.0f; + vtMax->x = vtMax->y = vtMax->z = -100000.0f; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FBoundBox(vtMin, vtMax)); +} + +BOOL CGraphicThingInstance::GetBoundBox(DWORD dwModelInstanceIndex, D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax) +{ + if (!CheckModelInstanceIndex(dwModelInstanceIndex)) + return FALSE; + + vtMin->x = vtMin->y = vtMin->z = 100000.0f; + vtMax->x = vtMax->y = vtMax->z = -100000.0f; + + CGrannyLODController * pController = m_LODControllerVector[dwModelInstanceIndex]; + if (!pController->isModelInstance()) + return FALSE; + + CGrannyModelInstance * pModelInstance = pController->GetModelInstance(); + pModelInstance->GetBoundBox(vtMin, vtMax); + return TRUE; +} + +BOOL CGraphicThingInstance::GetBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix) +{ + if (!CheckModelInstanceIndex(dwModelInstanceIndex)) + return FALSE; + + CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance(); + if (!pModelInstance) + return FALSE; + + *ppMatrix = (D3DXMATRIX *)pModelInstance->GetBoneMatrixPointer(dwBoneIndex); + if (!*ppMatrix) + return FALSE; + + return TRUE; +} + +BOOL CGraphicThingInstance::GetCompositeBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix) +{ + if (!CheckModelInstanceIndex(dwModelInstanceIndex)) + return FALSE; + + CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance(); + if (!pModelInstance) + { + //TraceError("CGraphicThingInstance::GetCompositeBoneMatrix(dwModelInstanceIndex=%d, dwBoneIndex=%d, D3DXMATRIX ** ppMatrix)", dwModelInstanceIndex, dwBoneIndex); + return FALSE; + } + + *ppMatrix = (D3DXMATRIX *)pModelInstance->GetCompositeBoneMatrixPointer(dwBoneIndex); + + return TRUE; +} + +void CGraphicThingInstance::UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed, int iModelInstanceIndex) +{ + //TraceError("%s",GetBaseThingPtr()->GetFileName()); + int nLODCount=m_LODControllerVector.size(); + if (iModelInstanceIndex>=nLODCount) + { + //TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d)", + // fSecondsElapsed, iModelInstanceIndex, nLODCount); + return; + } + + CGrannyLODController* pkLODCtrl=m_LODControllerVector[iModelInstanceIndex]; + if (!pkLODCtrl) + { + //TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - m_LODControllerVector[iModelInstanceIndex] == NULL", + // fSecondsElapsed, iModelInstanceIndex, nLODCount); + return; + } + + CGrannyModelInstance * pModelInstance = pkLODCtrl->GetModelInstance(); + if (!pModelInstance) + { + /* TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - pkLODCtrl->GetModelInstance() == NULL", + fSecondsElapsed, iModelInstanceIndex, nLODCount);*/ + return; + } + + pModelInstance->UpdateTransform(pMatrix, fSecondsElapsed); +} + +void CGraphicThingInstance::DeformAll() +{ + m_bUpdated = true; + + CGrannyLODController::FDeformAll deform; + deform.mc_pWorldMatrix = &m_worldMatrix; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), deform); +} + +void CGraphicThingInstance::DeformNoSkin() +{ + m_bUpdated = true; + + std::vector::iterator i; + for (i=m_LODControllerVector.begin(); i!=m_LODControllerVector.end(); ++i) + { + CGrannyLODController* pkLOD=*i; + if (pkLOD->isModelInstance()) + pkLOD->DeformNoSkin(&m_worldMatrix); + } +} + +void CGraphicThingInstance::OnDeform() +{ + m_bUpdated = true; + + CGrannyLODController::FDeform deform; + deform.mc_pWorldMatrix = &m_worldMatrix; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), deform); +} + +void CGraphicThingInstance::__SetLocalTime(float fLocalTime) +{ + m_fLastLocalTime = m_fLocalTime; + m_fLocalTime = fLocalTime; + + CGrannyLODController::FSetLocalTime SetLocalTime; + SetLocalTime.fLocalTime = fLocalTime; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetLocalTime); +} + +void CGraphicThingInstance::UpdateLODLevel() +{ + CCamera * pcurCamera = CCameraManager::Instance().GetCurrentCamera(); + if (!pcurCamera) + { + TraceError("CGraphicThingInstance::UpdateLODLevel - GetCurrentCamera() == NULL"); + return; + } + + const D3DXVECTOR3 & c_rv3TargetPosition = pcurCamera->GetTarget(); + const D3DXVECTOR3 & c_rv3CameraPosition = pcurCamera->GetEye(); + const D3DXVECTOR3 & c_v3Position = GetPosition(); + + // NOTE : 중심으로부터의 거리 계산에 z값 차이는 사용하지 않는다. - [levites] + CGrannyLODController::FUpdateLODLevel update; + update.fDistanceFromCenter = sqrtf((c_rv3TargetPosition.x - c_v3Position.x) * (c_rv3TargetPosition.x - c_v3Position.x) + + (c_rv3TargetPosition.y - c_v3Position.y) * (c_rv3TargetPosition.y - c_v3Position.y)); + update.fDistanceFromCamera = sqrtf((c_rv3CameraPosition.x - c_v3Position.x) * (c_rv3CameraPosition.x - c_v3Position.x) + + (c_rv3CameraPosition.y - c_v3Position.y) * (c_rv3CameraPosition.y - c_v3Position.y) + + (c_rv3CameraPosition.z - c_v3Position.z) * (c_rv3CameraPosition.z - c_v3Position.z)); + + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update); +} + +void CGraphicThingInstance::UpdateTime() +{ + //granny_system_clock clockNow = GrannyGetSystemSeconds(); + //m_fSecondElapsed = GrannyGetSecondsElapsed(&m_clockLast, &clockNow) * m_fMotionTimeSpeed; + + //DWORD t1=ELTimer_GetMSec(); + + m_fSecondElapsed=CTimer::Instance().GetElapsedSecond(); + + if (m_fDelay > m_fSecondElapsed) + { + m_fDelay -= m_fSecondElapsed; + m_fSecondElapsed = 0.0f; + } + else + { + m_fSecondElapsed -= m_fDelay; + m_fDelay = 0.0f; + } + + m_fLastLocalTime = m_fLocalTime; + m_fLocalTime += m_fSecondElapsed; + m_fAverageSecondElapsed = m_fAverageSecondElapsed + (m_fSecondElapsed - m_fAverageSecondElapsed) / 4.0f; + //m_clockLast = clockNow; + + CGrannyLODController::FUpdateTime update; + update.fElapsedTime = m_fSecondElapsed; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update); +} + +void CGraphicThingInstance::OnUpdate() +{ +#ifdef __PERFORMANCE_CHECKER__ + DWORD t1=timeGetTime(); +#endif + UpdateLODLevel(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t2=timeGetTime(); +#endif + UpdateTime(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t3=timeGetTime(); +#endif + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_thing_onupdate.txt", "w"); + + if (t3-t1>3) + { + fprintf(fp, "GTU.Total %d (Time %f)\n", + t3-t1, ELTimer_GetMSec()/1000.0f); + fprintf(fp, "GTU.CAL %d\n", t2-t1); + fprintf(fp, "GTU.UP %d\n", t3-t2); + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + fflush(fp); + } +#endif +} + +void CGraphicThingInstance::OnRender() +{ + RenderWithOneTexture(); +} + +void CGraphicThingInstance::OnBlendRender() +{ + BlendRenderWithOneTexture(); +} + +void CGraphicThingInstance::RenderWithOneTexture() +{ + //assert(m_bUpdated); + if (!m_bUpdated) + return; + + CGrannyLODController::FRenderWithOneTexture render; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render); +} + +void CGraphicThingInstance::BlendRenderWithOneTexture() +{ + //assert(m_bUpdated); + if (!m_bUpdated) + return; + + CGrannyLODController::FBlendRenderWithOneTexture blendRender; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender); +} + +void CGraphicThingInstance::RenderWithTwoTexture() +{ + //assert(m_bUpdated); + if (!m_bUpdated) + return; + + CGrannyLODController::FRenderWithTwoTexture render; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render); +} + +void CGraphicThingInstance::BlendRenderWithTwoTexture() +{ + //assert(m_bUpdated); + if (!m_bUpdated) + return; + + CGrannyLODController::FRenderWithTwoTexture blendRender; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender); +} + +void CGraphicThingInstance::OnRenderToShadowMap() +{ + if (!m_bUpdated) + return; + + CGrannyLODController::FRenderToShadowMap RenderToShadowMap; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderToShadowMap); +} + +void CGraphicThingInstance::OnRenderShadow() +{ + CGrannyLODController::FRenderShadow RenderShadow; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderShadow); +} + +void CGraphicThingInstance::OnRenderPCBlocker() +{ + CGrannyLODController::FRenderWithOneTexture RenderPCBlocker; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderPCBlocker); +} + +DWORD CGraphicThingInstance::GetLODControllerCount() const +{ + return m_LODControllerVector.size(); +} + +CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex) const +{ + assert(dwModelIndex < m_LODControllerVector.size()); + return m_LODControllerVector[dwModelIndex]; +} + +CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex) +{ + assert(dwModelIndex < m_LODControllerVector.size()); + return m_LODControllerVector[dwModelIndex]; +} + +BYTE CGraphicThingInstance::GetLODLevel(DWORD dwModelInstance) +{ + assert(dwModelInstance < m_LODControllerVector.size()); + return (m_LODControllerVector[dwModelInstance]->GetLODLevel()); +} + +float CGraphicThingInstance::GetHeight() +{ + if (m_LODControllerVector.empty()) + return 0.0f; + + CGrannyModelInstance * pModelInstance = m_LODControllerVector[0]->GetModelInstance(); + if (!pModelInstance) + return 0.0f; + + D3DXVECTOR3 vtMin, vtMax; + pModelInstance->GetBoundBox(&vtMin, &vtMax); + + return fabs(vtMin.z - vtMax.z); +} + +void CGraphicThingInstance::ReloadTexture() +{ + CGrannyLODController::FReloadTexture ReloadTexture; + std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ReloadTexture); +} + +bool CGraphicThingInstance::HaveBlendThing() +{ + for (int i = 0; i < m_LODControllerVector.size(); i++) + { + if (m_LODControllerVector[i]->HaveBlendThing()) + return true; + } + return false; +} + + +void CGraphicThingInstance::OnClear() +{ + stl_wipe(m_LODControllerVector); + stl_wipe_second(m_roMotionThingMap); + + for (DWORD d = 0; d < m_modelThingSetVector.size(); ++d) + m_modelThingSetVector[d].Clear(); +} + +void CGraphicThingInstance::OnInitialize() +{ + m_bUpdated = false; + m_fLastLocalTime = 0.0f; + m_fLocalTime = 0.0f; + m_fDelay = 0.0; + m_fSecondElapsed = 0.0f; + m_fAverageSecondElapsed = 0.03f; + m_fRadius = -1.0f; + m_v3Center = D3DXVECTOR3(0.0f, 0.0f, 0.0f); + + ResetLocalTime(); +} + +CGraphicThingInstance::CGraphicThingInstance() +{ + Initialize(); +} + +CGraphicThingInstance::~CGraphicThingInstance() +{ +} diff --git a/extension/src/port/EterGrnLib/Util.cpp b/extension/src/port/EterGrnLib/Util.cpp new file mode 100644 index 00000000..054579e0 --- /dev/null +++ b/extension/src/port/EterGrnLib/Util.cpp @@ -0,0 +1,55 @@ +#include "StdAfx.h" +#include "Util.h" + +/* +bool GrannyMeshGetTextureAnimation(granny_mesh* pgrnMesh, float* puVelocity, float* pvVelocity) +{ + static granny_data_type_definition s_UVType[] = + { + {GrannyInt32Member, "UV Animation Flag"}, + {GrannyInt32Member, "X Velocity"}, + {GrannyInt32Member, "Y Velocity"}, + {GrannyEndMember} + }; + + typedef struct SUVData + { + granny_int32 UVAnimationFlag; + granny_int32 xVelocity; + granny_int32 yVelocity; + } TUVData; + + TUVData UVData; + + granny_variant& rExtendedData = pgrnMesh->ExtendedData; + GrannyConvertSingleObject(rExtendedData.Type, rExtendedData.Object, s_UVType, &UVData); + + *puVelocity = float(UVData.xVelocity) / 100000.0f; + *pvVelocity = float(UVData.yVelocity) / 100000.0f; + + return UVData.UVAnimationFlag ? true : false; +} +*/ + +/* +bool GrannyMeshIsTextureAnimation(granny_mesh* pgrnMesh) +{ + if (GrannyMeshIsRigid(pgrnMesh)) + { + float xVelocity, yVelocity; + + if (GrannyMeshGetTextureAnimation(pgrnMesh, &xVelocity, &yVelocity)) + return true; + } + + return false; +} +*/ + +bool GrannyMeshIsDeform(granny_mesh* pgrnMesh) +{ + if (GrannyMeshIsRigid(pgrnMesh)) + return false; + + return true; +} diff --git a/extension/src/port/EterLib/CollisionData.cpp b/extension/src/port/EterLib/CollisionData.cpp new file mode 100644 index 00000000..338a3763 --- /dev/null +++ b/extension/src/port/EterLib/CollisionData.cpp @@ -0,0 +1,840 @@ +#include "StdAfx.h" +#include "CollisionData.h" +#include "Pool.h" +#include "GrpScreen.h" +#include "GrpMath.h" +#include "lineintersect_utils.h" +#include "StateManager.h" +const float gc_fReduceMove = 0.5f; + +//const float gc_fSlideMoveSpeed = 5.0f; +/*inline D3DXVECTOR3 FitAtSpecifiedLength(const D3DXVECTOR3 & v3Vector, float length) +{ + D3DXVECTOR3 v; + D3DXVec3Normalize(&v,&v3Vector); + return v*length; +} +*/ +CDynamicPool gs_sci; +CDynamicPool gs_cci; +CDynamicPool gs_pci; +CDynamicPool gs_aci; +CDynamicPool gs_oci; + +void DestroyCollisionInstanceSystem() +{ + gs_sci.Destroy(); + gs_cci.Destroy(); + gs_pci.Destroy(); + gs_aci.Destroy(); + gs_oci.Destroy(); +} + +///////////////////////////////////////////// +// Base +CBaseCollisionInstance * CBaseCollisionInstance::BuildCollisionInstance(const CStaticCollisionData * c_pCollisionData, const D3DXMATRIX * pMat) +{ + switch(c_pCollisionData->dwType) + { + case COLLISION_TYPE_PLANE: + { + CPlaneCollisionInstance * ppci = gs_pci.Alloc(); + D3DXMATRIX matRotation; + D3DXMATRIX matTranslationLocal; + D3DXMatrixRotationQuaternion(&matRotation, &c_pCollisionData->quatRotation); + D3DXMatrixTranslation(&matTranslationLocal, c_pCollisionData->v3Position.x, c_pCollisionData->v3Position.y, c_pCollisionData->v3Position.z); + D3DXMATRIX matTransform = matRotation * matTranslationLocal * *pMat; + + TPlaneData & PlaneData = ppci->GetAttribute(); + D3DXVec3TransformCoord(&PlaneData.v3Position, &c_pCollisionData->v3Position, pMat); + float fHalfWidth = c_pCollisionData->fDimensions[0] / 2.0f; + float fHalfLength = c_pCollisionData->fDimensions[1] / 2.0f; + + PlaneData.v3QuadPosition[0].x = -fHalfWidth; + PlaneData.v3QuadPosition[0].y = -fHalfLength; + PlaneData.v3QuadPosition[0].z = 0.0f; + PlaneData.v3QuadPosition[1].x = +fHalfWidth; + PlaneData.v3QuadPosition[1].y = -fHalfLength; + PlaneData.v3QuadPosition[1].z = 0.0f; + PlaneData.v3QuadPosition[2].x = -fHalfWidth; + PlaneData.v3QuadPosition[2].y = +fHalfLength; + PlaneData.v3QuadPosition[2].z = 0.0f; + PlaneData.v3QuadPosition[3].x = +fHalfWidth; + PlaneData.v3QuadPosition[3].y = +fHalfLength; + PlaneData.v3QuadPosition[3].z = 0.0f; + for (DWORD i = 0; i < 4; ++i) + D3DXVec3TransformCoord(&PlaneData.v3QuadPosition[i], &PlaneData.v3QuadPosition[i], &matTransform); + D3DXVECTOR3 v3Line0 = PlaneData.v3QuadPosition[1] - PlaneData.v3QuadPosition[0]; + D3DXVECTOR3 v3Line1 = PlaneData.v3QuadPosition[2] - PlaneData.v3QuadPosition[0]; + D3DXVECTOR3 v3Line2 = PlaneData.v3QuadPosition[1] - PlaneData.v3QuadPosition[3]; + D3DXVECTOR3 v3Line3 = PlaneData.v3QuadPosition[2] - PlaneData.v3QuadPosition[3]; + D3DXVec3Normalize(&v3Line0, &v3Line0); + D3DXVec3Normalize(&v3Line1, &v3Line1); + D3DXVec3Normalize(&v3Line2, &v3Line2); + D3DXVec3Normalize(&v3Line3, &v3Line3); + D3DXVec3Cross(&PlaneData.v3Normal, &v3Line0, &v3Line1); + D3DXVec3Normalize(&PlaneData.v3Normal, &PlaneData.v3Normal); + + D3DXVec3Cross(&PlaneData.v3InsideVector[0], &PlaneData.v3Normal, &v3Line0 ); + D3DXVec3Cross(&PlaneData.v3InsideVector[1], &v3Line1, &PlaneData.v3Normal); + D3DXVec3Cross(&PlaneData.v3InsideVector[2], &v3Line2, &PlaneData.v3Normal); + D3DXVec3Cross(&PlaneData.v3InsideVector[3], &PlaneData.v3Normal, &v3Line3); + + return ppci; + } + break; + case COLLISION_TYPE_BOX: + assert(false && "COLLISION_TYPE_BOX not implemented"); + break; + case COLLISION_TYPE_AABB: + { + CAABBCollisionInstance * paci = gs_aci.Alloc(); + + D3DXMATRIX matTranslationLocal; + D3DXMatrixTranslation(&matTranslationLocal, c_pCollisionData->v3Position.x, c_pCollisionData->v3Position.y, c_pCollisionData->v3Position.z); + D3DXMATRIX matTransform = *pMat; + + D3DXVECTOR3 v3Pos; + v3Pos.x = matTranslationLocal._41; + v3Pos.y = matTranslationLocal._42; + v3Pos.z = matTranslationLocal._43; + + TAABBData & AABBData = paci->GetAttribute(); + AABBData.v3Min.x = v3Pos.x - c_pCollisionData->fDimensions[0]; + AABBData.v3Min.y = v3Pos.y - c_pCollisionData->fDimensions[1]; + AABBData.v3Min.z = v3Pos.z - c_pCollisionData->fDimensions[2]; + AABBData.v3Max.x = v3Pos.x + c_pCollisionData->fDimensions[0]; + AABBData.v3Max.y = v3Pos.y + c_pCollisionData->fDimensions[1]; + AABBData.v3Max.z = v3Pos.z + c_pCollisionData->fDimensions[2]; + + D3DXVec3TransformCoord(&AABBData.v3Min, &AABBData.v3Min, &matTransform); + D3DXVec3TransformCoord(&AABBData.v3Max, &AABBData.v3Max, &matTransform); + + return paci; + } + break; + case COLLISION_TYPE_OBB: + { + COBBCollisionInstance * poci = gs_oci.Alloc(); + + D3DXMATRIX matTranslationLocal; D3DXMatrixTranslation(&matTranslationLocal, c_pCollisionData->v3Position.x, c_pCollisionData->v3Position.y, c_pCollisionData->v3Position.z); + D3DXMATRIX matRotation; D3DXMatrixRotationQuaternion(&matRotation, &c_pCollisionData->quatRotation); + + D3DXMATRIX matTranslationWorld; D3DXMatrixIdentity(&matTranslationWorld); + matTranslationWorld._41 = pMat->_41; matTranslationWorld._42 = pMat->_42; matTranslationWorld._43 = pMat->_43; matTranslationWorld._44 = pMat->_44; + + D3DXVECTOR3 v3Min, v3Max; + v3Min.x = c_pCollisionData->v3Position.x - c_pCollisionData->fDimensions[0]; + v3Min.y = c_pCollisionData->v3Position.y - c_pCollisionData->fDimensions[1]; + v3Min.z = c_pCollisionData->v3Position.z - c_pCollisionData->fDimensions[2]; + v3Max.x = c_pCollisionData->v3Position.x + c_pCollisionData->fDimensions[0]; + v3Max.y = c_pCollisionData->v3Position.y + c_pCollisionData->fDimensions[1]; + v3Max.z = c_pCollisionData->v3Position.z + c_pCollisionData->fDimensions[2]; + + D3DXVec3TransformCoord(&v3Min, &v3Min, pMat); + D3DXVec3TransformCoord(&v3Max, &v3Max, pMat); + D3DXVECTOR3 v3Position = (v3Min + v3Max) * 0.5f; + + TOBBData & OBBData = poci->GetAttribute(); + OBBData.v3Min.x = v3Position.x - c_pCollisionData->fDimensions[0]; + OBBData.v3Min.y = v3Position.y - c_pCollisionData->fDimensions[1]; + OBBData.v3Min.z = v3Position.z - c_pCollisionData->fDimensions[2]; + OBBData.v3Max.x = v3Position.x + c_pCollisionData->fDimensions[0]; + OBBData.v3Max.y = v3Position.y + c_pCollisionData->fDimensions[1]; + OBBData.v3Max.z = v3Position.z + c_pCollisionData->fDimensions[2]; + + + + D3DXMATRIX matTransform = *pMat; + + D3DXMatrixIdentity(&OBBData.matRot); OBBData.matRot = *pMat; + OBBData.matRot._41 = 0; OBBData.matRot._42 = 0; OBBData.matRot._43 = 0; OBBData.matRot._44 = 1; + + + + + return poci; + } + break; + case COLLISION_TYPE_SPHERE: + { + CSphereCollisionInstance * psci = gs_sci.Alloc(); + + D3DXMATRIX matTranslationLocal; + D3DXMatrixTranslation(&matTranslationLocal, c_pCollisionData->v3Position.x, c_pCollisionData->v3Position.y, c_pCollisionData->v3Position.z); + matTranslationLocal = matTranslationLocal * *pMat; + + TSphereData & SphereData = psci->GetAttribute(); + SphereData.v3Position.x = matTranslationLocal._41; + SphereData.v3Position.y = matTranslationLocal._42; + SphereData.v3Position.z = matTranslationLocal._43; + SphereData.fRadius = c_pCollisionData->fDimensions[0]; + + return psci; + } + break; + case COLLISION_TYPE_CYLINDER: + { + CCylinderCollisionInstance * pcci = gs_cci.Alloc(); + + D3DXMATRIX matTranslationLocal; + D3DXMatrixTranslation(&matTranslationLocal, c_pCollisionData->v3Position.x, c_pCollisionData->v3Position.y, c_pCollisionData->v3Position.z); + matTranslationLocal = matTranslationLocal * *pMat; + + TCylinderData & CylinderData = pcci->GetAttribute(); + CylinderData.fRadius = c_pCollisionData->fDimensions[0]; + CylinderData.fHeight = c_pCollisionData->fDimensions[1]; + CylinderData.v3Position.x = matTranslationLocal._41; + CylinderData.v3Position.y = matTranslationLocal._42; + CylinderData.v3Position.z = matTranslationLocal._43 /*+ CylinderData.fHeight/2.0f*/; + + return pcci; + } + break; + } + assert(false && "NOT_REACHED"); + return 0; +} + +void CBaseCollisionInstance::Destroy() +{ + OnDestroy(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/*------------------------------------------------------Sphere---------------------------------------------------------------*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +TSphereData & CSphereCollisionInstance::GetAttribute() +{ + return m_attribute; +} + +const TSphereData & CSphereCollisionInstance::GetAttribute() const +{ + return m_attribute; +} + +void CSphereCollisionInstance::Render(D3DFILLMODE d3dFillMode) +{ + static CScreen s; + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, 0xffffffff); + s.RenderSphere(NULL, m_attribute.v3Position.x, m_attribute.v3Position.y, m_attribute.v3Position.z, m_attribute.fRadius, d3dFillMode); +} + +void CSphereCollisionInstance::OnDestroy() +{ + gs_sci.Free(this); +} + +bool CSphereCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + if (square_distance_between_linesegment_and_point(s.v3LastPosition,s.v3Position,m_attribute.v3Position) < (m_attribute.fRadius+s.fRadius)*(m_attribute.fRadius+s.fRadius)) + { + // NOTE : 거리가 가까워 졌을때만.. - [levites] + if (GetVector3Distance(s.v3Position, m_attribute.v3Position) < + GetVector3Distance(s.v3LastPosition, m_attribute.v3Position)) + return true; + } + + return false; +} + +bool CSphereCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + //Tracef("OnCollisionDynamicSphere\n"); + + if (square_distance_between_linesegment_and_point(s.v3LastPosition,s.v3Position,m_attribute.v3Position)<(m_attribute.fRadius+s.fRadius)*(m_attribute.fRadius+s.fRadius)) + { + return true; + } + + return false; +} + +D3DXVECTOR3 CSphereCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + const auto _vv__ = (s.v3Position - m_attribute.v3Position); + if (D3DXVec3LengthSq(&_vv__)>=(s.fRadius+m_attribute.fRadius)*(m_attribute.fRadius+s.fRadius)) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + D3DXVECTOR3 c; + const auto _vv__2 = (s.v3Position - s.v3LastPosition); + const auto _vv_s_2 = D3DXVECTOR3(0.0f, 0.0f, 1.0f); + D3DXVec3Cross(&c, &_vv__2, &_vv_s_2); + + float sum = - D3DXVec3Dot(&c,&_vv__); + float mul = (s.fRadius+m_attribute.fRadius)*(s.fRadius+m_attribute.fRadius)-D3DXVec3LengthSq(&_vv__); + + if (sum*sum-4*mul<=0) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + float sq = sqrt(sum*sum-4*mul); + float t1=-sum-sq, t2=-sum+sq; + t1*=0.5f; + t2*=0.5f; + + if (fabs(t1)<=fabs(t2)) + { + return (gc_fReduceMove*t1)*c; + } + else + return (gc_fReduceMove*t2)*c; + + /* + D3DXVECTOR3 p1 = s.v3Position+t1*c; + D3DXVECTOR3 p2 = s.v3Position+t2*c; + + if (D3DXVec3LengthSq(&(p2-s.v3Position))>D3DXVec3LengthSq(&(p1-s.v3Position))) + { + return p1-s.v3Position; + } + else + { + return p2-s.v3Position; + } + */ +} + +///////////////////////////////////////////// +// Plane +TPlaneData & CPlaneCollisionInstance::GetAttribute() +{ + return m_attribute; +} + +const TPlaneData & CPlaneCollisionInstance::GetAttribute() const +{ + return m_attribute; +} + +bool CPlaneCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 v3SpherePosition = s.v3Position - m_attribute.v3Position; + D3DXVECTOR3 v3SphereLastPosition = s.v3LastPosition - m_attribute.v3Position; + + float fPosition1 = D3DXVec3Dot(&m_attribute.v3Normal, &v3SpherePosition); + float fPosition2 = D3DXVec3Dot(&m_attribute.v3Normal, &v3SphereLastPosition); + + if (fPosition1 >0.0f && fPosition2 < 0.0f || fPosition1 <0.0f && fPosition2 >0.0f + || (fPosition1) <= s.fRadius && fPosition1 >= -s.fRadius) + { + D3DXVECTOR3 v3QuadPosition1 = s.v3Position - m_attribute.v3QuadPosition[0]; + D3DXVECTOR3 v3QuadPosition2 = s.v3Position - m_attribute.v3QuadPosition[3]; + + if (D3DXVec3Dot(&v3QuadPosition1, &m_attribute.v3InsideVector[0]) > - s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition1, &m_attribute.v3InsideVector[1]) > -s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[2]) > - s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[3]) > - s.fRadius/*0.0f*/) + { + // NOTE : 거리가 가까워 졌을때만.. - [levites] + const auto _vv__3 = (s.v3Position - m_attribute.v3Position); + const auto _vv__4 = (s.v3LastPosition - m_attribute.v3Position); + if (fabs(D3DXVec3Dot(&_vv__3, &m_attribute.v3Normal)) < + fabs(D3DXVec3Dot(&_vv__4, &m_attribute.v3Normal))) + return true; + } + } + + return false; +} + +bool CPlaneCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + //Tracef("OnCollisionDynamicSphere\n"); + + D3DXVECTOR3 v3SpherePosition = s.v3Position - m_attribute.v3Position; + D3DXVECTOR3 v3SphereLastPosition = s.v3LastPosition - m_attribute.v3Position; + + float fPosition1 = D3DXVec3Dot(&m_attribute.v3Normal, &v3SpherePosition); + float fPosition2 = D3DXVec3Dot(&m_attribute.v3Normal, &v3SphereLastPosition); + + if (fPosition1 >0.0f && fPosition2 < 0.0f || fPosition1 <0.0f && fPosition2 >0.0f + || (fPosition1) <= s.fRadius && fPosition1 >= -s.fRadius) + { + D3DXVECTOR3 v3QuadPosition1 = s.v3Position - m_attribute.v3QuadPosition[0]; + D3DXVECTOR3 v3QuadPosition2 = s.v3Position - m_attribute.v3QuadPosition[3]; + + if (D3DXVec3Dot(&v3QuadPosition1, &m_attribute.v3InsideVector[0]) > - s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition1, &m_attribute.v3InsideVector[1]) > -s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[2]) > - s.fRadius/*0.0f*/) + if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[3]) > - s.fRadius/*0.0f*/) + { + return true; + } + } + + return false; +} + +D3DXVECTOR3 CPlaneCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 advance = s.v3Position-s.v3LastPosition; + + float d = D3DXVec3Dot(&m_attribute.v3Normal, &advance); + if (d>=-0.0001 && d<=0.0001) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + const auto vv = (s.v3Position - m_attribute.v3Position); + float t= - D3DXVec3Dot(&m_attribute.v3Normal, &vv)/d; + + //D3DXVECTOR3 onplane = s.v3Position+t*advance; + + if (D3DXVec3Dot(&m_attribute.v3Normal, &advance)>=0) + { + //return m_attribute.v3Normal*((-s.fRadius+D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))*gc_fReduceMove); + return t*advance -s.fRadius*m_attribute.v3Normal; + } + else + { + //return m_attribute.v3Normal*((s.fRadius+D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))*gc_fReduceMove); + return t*advance +s.fRadius*m_attribute.v3Normal; + } + + + + /*if (D3DXVec3Dot(&m_attribute.v3Normal, &advance)>=0) + { + Tracef("%f %f\n",s.fRadius,-(D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))); + return m_attribute.v3Normal*((-s.fRadius+D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))*gc_fReduceMove); + } + else + { + Tracef("%f %f\n",(s.fRadius),(D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))); + return m_attribute.v3Normal*((s.fRadius+D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position-m_attribute.v3Position)))*gc_fReduceMove); + }*/ + + + /* + D3DXVECTOR3 advance = s.v3Position-s.v3LastPosition; + D3DXVECTOR3 slide(-advance.y,advance.x,advance.z); + slide = m_attribute.v3Normal; + + D3DXVECTOR3 radius_adjust = advance; + D3DXVec3Normalize(&radius_adjust,&radius_adjust); + radius_adjust*=s.fRadius; + + float d = D3DXVec3Dot(&m_attribute.v3Normal, &slide); + if (d>=-0.0001 && d<=0.0001) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + + float t= - D3DXVec3Dot(&m_attribute.v3Normal, &(s.v3Position+radius_adjust-m_attribute.v3Position)) + / d;*/ + + //D3DXVECTOR3 nextposition; + //nextposition = s.v3Position + t*slide; + //Tracef("$T %f",t); + //if (D3DXVec3Dot(&m_attribute.v3Normal, &advance)>=0) + // return (t*slide - m_attribute.v3Normal * s.fRadius)/**gc_fReduceMove*/; + //else + // return (t*slide + m_attribute.v3Normal * s.fRadius)/*gc_fReduceMove*/; + //if (D3DXVec3Dot(&m_attribute.v3Normal, &advance)>=0) + // return (t*slide + m_attribute.v3Normal * D3DXVec3Dot(&m_attribute.v3Normal,&(s.v3LastPosition-m_attribute.v3Position))/** s.fRadius*/)*gc_fReduceMove; + //else + // return (t*slide + m_attribute.v3Normal * D3DXVec3Dot(&m_attribute.v3Normal,&(s.v3LastPosition-m_attribute.v3Position))/*s.fRadius*/)*gc_fReduceMove; + // +} + +void CPlaneCollisionInstance::Render(D3DFILLMODE /*d3dFillMode*/) +{ + static CScreen s; + s.RenderBar3d(m_attribute.v3QuadPosition); +} + +void CPlaneCollisionInstance::OnDestroy() +{ + gs_pci.Free(this); +} + +///////////////////////////////////////////// +// Cylinder +TCylinderData & CCylinderCollisionInstance::GetAttribute() +{ + return m_attribute; +} + +const TCylinderData & CCylinderCollisionInstance::GetAttribute() const +{ + return m_attribute; +} + +bool CCylinderCollisionInstance::CollideCylinderVSDynamicSphere(const TCylinderData & c_rattribute, const CDynamicSphereInstance & s) const +{ + if (s.v3Position.z + s.fRadius < c_rattribute.v3Position.z) + return false; + + if (s.v3Position.z - s.fRadius > c_rattribute.v3Position.z + c_rattribute.fHeight) + return false; + + /*D3DXVECTOR2 v2curDistance(s.v3Position.x - c_rattribute.v3Position.x, s.v3Position.y - c_rattribute.v3Position.y); + float fDistance = D3DXVec2Length(&v2curDistance); + if (fDistance <= s.fRadius + c_rattribute.fRadius) + return true; + */ + + D3DXVECTOR3 oa, ob; + IntersectLineSegments(c_rattribute.v3Position, D3DXVECTOR3(c_rattribute.v3Position.x,c_rattribute.v3Position.y,c_rattribute.v3Position.z+c_rattribute.fHeight), s.v3LastPosition, s.v3Position, oa, ob); + const auto vv = (oa - ob); + return (D3DXVec3LengthSq(&vv)<=(c_rattribute.fRadius+s.fRadius)*(c_rattribute.fRadius+s.fRadius)); +} + +bool CCylinderCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + if (CollideCylinderVSDynamicSphere(m_attribute, s)) + { + // NOTE : 거리가 가까워 졌을때만.. - [levites] + if (GetVector3Distance(s.v3Position, m_attribute.v3Position) < + GetVector3Distance(s.v3LastPosition, m_attribute.v3Position)) + return true; + } + + + // NOTE : 이동 거리가 클 경우 빈틈없이 (원 크기 단위로) 이동하면서 전부 체크 해 본다 - [levites] + D3DXVECTOR3 v3Distance = s.v3Position - s.v3LastPosition; + float fDistance = D3DXVec3Length(&v3Distance); + if (s.fRadius<=0.0001f) + return false; + if (fDistance >= s.fRadius*2.0f) + { + TCylinderData cylinder; + cylinder = m_attribute; + cylinder.v3Position = s.v3LastPosition; + + int iStep = fDistance / s.fRadius*2.0f; + D3DXVECTOR3 v3Step = v3Distance / float(iStep); + + for (int i = 0; i < iStep; ++i) + { + cylinder.v3Position += v3Step; + if (CollideCylinderVSDynamicSphere(cylinder, s)) + return true; + + } + } + + return false; +} + +bool CCylinderCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + //Tracef("OnCollisionDynamicSphere\n"); + + return (CollideCylinderVSDynamicSphere(m_attribute, s)); +} + +D3DXVECTOR3 CCylinderCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 v3Position = m_attribute.v3Position; + v3Position.z = s.v3Position.z; + const auto vv = (s.v3Position - v3Position); + if (D3DXVec3LengthSq(&vv)>=(s.fRadius+m_attribute.fRadius)*(m_attribute.fRadius+s.fRadius)) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + D3DXVECTOR3 c; + D3DXVECTOR3 advance = s.v3Position - s.v3LastPosition; + advance.z = 0; + const auto vssa = D3DXVECTOR3(0.0f, 0.0f, 1.0f); + D3DXVec3Cross(&c, &advance, &vssa); + + const auto svsvs = (s.v3Position - v3Position); + float sum = - D3DXVec3Dot(&c,&svsvs); + float mul = (s.fRadius+m_attribute.fRadius)*(s.fRadius+m_attribute.fRadius)-D3DXVec3LengthSq(&svsvs); + + if (sum*sum-4*mul<=0) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + float sq = sqrt(sum*sum-4*mul); + float t1=-sum-sq, t2=-sum+sq; + t1*=0.5f; + t2*=0.5f; + + + if (fabs(t1)<=fabs(t2)) + { + return (gc_fReduceMove*t1)*c; + } + else + return (gc_fReduceMove*t2)*c; + + /*D3DXVECTOR3 p1 = s.v3Position+t1*c; + D3DXVECTOR3 p2 = s.v3Position+t2*c; + + if (D3DXVec3LengthSq(&(p2-s.v3Position))>D3DXVec3LengthSq(&(p1-s.v3Position))) + { + return p1-s.v3Position; + } + else + { + return p2-s.v3Position; + }*/ +} + +void CCylinderCollisionInstance::Render(D3DFILLMODE d3dFillMode) +{ + static CScreen s; + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, 0xffffffff); + s.RenderCylinder(NULL, m_attribute.v3Position.x, m_attribute.v3Position.y, m_attribute.v3Position.z+m_attribute.fHeight/2, m_attribute.fRadius, m_attribute.fHeight, d3dFillMode); +} + +void CCylinderCollisionInstance::OnDestroy() +{ + gs_cci.Free(this); +} + +///////////////////////////////////////////// +// AABB (Aligned Axis Bounding Box) +TAABBData & CAABBCollisionInstance::GetAttribute() +{ + return m_attribute; +} + +const TAABBData & CAABBCollisionInstance::GetAttribute() const +{ + + return m_attribute; +} + +bool CAABBCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 v; + D3DXVECTOR3 v3center = (m_attribute.v3Min + m_attribute.v3Max) * 0.5f; + + memcpy(&v, &s.v3Position, sizeof(D3DXVECTOR3)); + + if(v.x < m_attribute.v3Min.x) v.x = m_attribute.v3Min.x; + if(v.x > m_attribute.v3Max.x) v.x = m_attribute.v3Max.x; + if(v.y < m_attribute.v3Min.y) v.x = m_attribute.v3Min.y; + if(v.y > m_attribute.v3Max.y) v.x = m_attribute.v3Max.y; + if(v.z < m_attribute.v3Min.z) v.z = m_attribute.v3Min.z; + if(v.z > m_attribute.v3Max.z) v.z = m_attribute.v3Max.z; + + if(GetVector3Distance(v, s.v3Position) <= s.fRadius * s.fRadius) + { + + return true; + } + + + memcpy(&v, &s.v3LastPosition, sizeof(D3DXVECTOR3)); + + if(v.x < m_attribute.v3Min.x) v.x = m_attribute.v3Min.x; + if(v.x > m_attribute.v3Max.x) v.x = m_attribute.v3Max.x; + if(v.y < m_attribute.v3Min.y) v.x = m_attribute.v3Min.y; + if(v.y > m_attribute.v3Max.y) v.x = m_attribute.v3Max.y; + if(v.z < m_attribute.v3Min.z) v.z = m_attribute.v3Min.z; + if(v.z > m_attribute.v3Max.z) v.z = m_attribute.v3Max.z; + + if(GetVector3Distance(v, s.v3LastPosition) <= s.fRadius * s.fRadius) + { + + return true; + } + + return false; +} + +bool CAABBCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 v; + memcpy(&v, &s.v3Position, sizeof(D3DXVECTOR3)); + + if(v.x < m_attribute.v3Min.x) v.x = m_attribute.v3Min.x; + if(v.x > m_attribute.v3Max.x) v.x = m_attribute.v3Max.x; + if(v.y < m_attribute.v3Min.y) v.x = m_attribute.v3Min.y; + if(v.y > m_attribute.v3Max.y) v.x = m_attribute.v3Max.y; + if(v.z < m_attribute.v3Min.z) v.z = m_attribute.v3Min.z; + if(v.z > m_attribute.v3Max.z) v.z = m_attribute.v3Max.z; + + if(v.x > m_attribute.v3Min.x && v.x < m_attribute.v3Max.x && + v.y > m_attribute.v3Min.y && v.y < m_attribute.v3Max.y && + v.z > m_attribute.v3Min.z && v.z < m_attribute.v3Max.z) { return true; } + + if(GetVector3Distance(v, s.v3Position) <= s.fRadius * s.fRadius) { return true; } + + + memcpy(&v, &s.v3LastPosition, sizeof(D3DXVECTOR3)); + + if(v.x < m_attribute.v3Min.x) v.x = m_attribute.v3Min.x; + if(v.x > m_attribute.v3Max.x) v.x = m_attribute.v3Max.x; + if(v.y < m_attribute.v3Min.y) v.x = m_attribute.v3Min.y; + if(v.y > m_attribute.v3Max.y) v.x = m_attribute.v3Max.y; + if(v.z < m_attribute.v3Min.z) v.z = m_attribute.v3Min.z; + if(v.z > m_attribute.v3Max.z) v.z = m_attribute.v3Max.z; + + + + if(v.x > m_attribute.v3Min.x && v.x < m_attribute.v3Max.x && + v.y > m_attribute.v3Min.y && v.y < m_attribute.v3Max.y && + v.z > m_attribute.v3Min.z && v.z < m_attribute.v3Max.z) { return true; } + + if(GetVector3Distance(v, s.v3LastPosition) <= s.fRadius * s.fRadius) { return true; } + + + + return false; +} + +D3DXVECTOR3 CAABBCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + + //Tracef("OnGetCollisionMovementAdjust v3Min.x = %f, v3Max.x = %f\n", m_attribute.v3Min.x, m_attribute.v3Max.x); + /* + float fARadius = D3DXVec3Length(&(m_attribute.v3Min - m_attribute.v3Max)); + if (D3DXVec3LengthSq(&(s.v3Position-(m_attribute.v3Max + m_attribute.v3Min)))>=(s.fRadius+fARadius)*(fARadius+s.fRadius)) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + D3DXVECTOR3 c; + D3DXVec3Cross(&c, &(s.v3Position-s.v3LastPosition), &D3DXVECTOR3(0.0f,0.0f,1.0f) ); + + float sum = - D3DXVec3Dot(&c,&(s.v3Position-(m_attribute.v3Max + m_attribute.v3Min))); + float mul = (s.fRadius+fARadius)*(s.fRadius+fARadius)-D3DXVec3LengthSq(&(s.v3Position-(m_attribute.v3Max + m_attribute.v3Min))); + + if (sum*sum-4*mul<=0) + return D3DXVECTOR3(0.0f,0.0f,0.0f); + float sq = sqrt(sum*sum-4*mul); + float t1=-sum-sq, t2=-sum+sq; + t1*=0.5f; + t2*=0.5f; + + if (fabs(t1)<=fabs(t2)) + { + return (gc_fReduceMove*t1)*c; + } + else + return (gc_fReduceMove*t2)*c; + */ + + D3DXVECTOR3 v3Temp; + if(s.v3Position.x + s.fRadius <= m_attribute.v3Min.x) { v3Temp.x = m_attribute.v3Min.x; } + else if(s.v3Position.x - s.fRadius >= m_attribute.v3Max.x) { v3Temp.x = m_attribute.v3Max.x; } + else if(s.v3Position.x + s.fRadius >= m_attribute.v3Min.x && s.v3Position.x + s.fRadius <= m_attribute.v3Max.x) { v3Temp.x = s.v3Position.x + s.fRadius; } + else { v3Temp.x = s.v3Position.x - s.fRadius; } + + if(s.v3Position.y + s.fRadius <= m_attribute.v3Min.y) { v3Temp.y = m_attribute.v3Min.y; } + else if(s.v3Position.y - s.fRadius >= m_attribute.v3Max.y) { v3Temp.y = m_attribute.v3Max.y; } + else if(s.v3Position.y + s.fRadius >= m_attribute.v3Min.y && s.v3Position.y + s.fRadius <= m_attribute.v3Max.y) { v3Temp.y = s.v3Position.y + s.fRadius; } + else { v3Temp.y = s.v3Position.y - s.fRadius; } + + if(s.v3Position.z + s.fRadius <= m_attribute.v3Min.z) { v3Temp.z = m_attribute.v3Min.z; } + else if(s.v3Position.z - s.fRadius >= m_attribute.v3Max.z) { v3Temp.z = m_attribute.v3Max.z; } + else if(s.v3Position.z + s.fRadius >= m_attribute.v3Min.z && s.v3Position.z + s.fRadius <= m_attribute.v3Max.z) { v3Temp.z = s.v3Position.z + s.fRadius; } + else { v3Temp.z = s.v3Position.z - s.fRadius; } + + + const auto vv = (v3Temp - s.v3Position); + if(D3DXVec3LengthSq(&vv) < s.fRadius * s.fRadius) + return D3DXVECTOR3(.0f, .0f, .0f); + + return D3DXVECTOR3(.0f, .0f, .0f); + +} + +void CAABBCollisionInstance::Render(D3DFILLMODE d3dFillMode) +{ + static CScreen s; + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, 0xffffffff); + s.RenderCube(m_attribute.v3Min.x, m_attribute.v3Min.y, m_attribute.v3Min.z, m_attribute.v3Max.x, m_attribute.v3Max.y, m_attribute.v3Max.z); + return; +} + +void CAABBCollisionInstance::OnDestroy() +{ + gs_aci.Free(this); +} + +///////////////////////////////////////////// +// OBB + +TOBBData & COBBCollisionInstance::GetAttribute() +{ + return m_attribute; +} + +const TOBBData & COBBCollisionInstance::GetAttribute() const +{ + + return m_attribute; +} + +bool COBBCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + D3DXVECTOR3 v3Center = 0.5f * (m_attribute.v3Min + m_attribute.v3Max); + D3DXVECTOR3 v3Sphere = s.v3Position - v3Center; + D3DXVec3TransformCoord(&v3Sphere, &v3Sphere, &m_attribute.matRot); + v3Sphere = v3Sphere + v3Center; + + D3DXVECTOR3 v3Point = v3Sphere; + if(v3Point.x < m_attribute.v3Min.x) { v3Point.x = m_attribute.v3Min.x; } + if(v3Point.x > m_attribute.v3Max.x) { v3Point.x = m_attribute.v3Max.x; } + if(v3Point.y < m_attribute.v3Min.y) { v3Point.y = m_attribute.v3Min.y; } + if(v3Point.y > m_attribute.v3Max.y) { v3Point.y = m_attribute.v3Max.y; } + if(v3Point.z < m_attribute.v3Min.z) { v3Point.z = m_attribute.v3Min.z; } + if(v3Point.z > m_attribute.v3Max.z) { v3Point.z = m_attribute.v3Max.z; } + + if(GetVector3Distance(v3Point, v3Sphere) <= s.fRadius * s.fRadius) { return true; } + + v3Sphere = s.v3LastPosition - v3Center; + D3DXVec3TransformCoord(&v3Sphere, &v3Sphere, &m_attribute.matRot); + v3Sphere = v3Sphere + v3Center; + + v3Point = v3Sphere; + if(v3Point.x < m_attribute.v3Min.x) { v3Point.x = m_attribute.v3Min.x; } + if(v3Point.x > m_attribute.v3Max.x) { v3Point.x = m_attribute.v3Max.x; } + if(v3Point.y < m_attribute.v3Min.y) { v3Point.y = m_attribute.v3Min.y; } + if(v3Point.y > m_attribute.v3Max.y) { v3Point.y = m_attribute.v3Max.y; } + if(v3Point.z < m_attribute.v3Min.z) { v3Point.z = m_attribute.v3Min.z; } + if(v3Point.z > m_attribute.v3Max.z) { v3Point.z = m_attribute.v3Max.z; } + + if(GetVector3Distance(v3Point, v3Sphere) <= s.fRadius * s.fRadius) { return true; } + + return false; +} + +bool COBBCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + + D3DXVECTOR3 v3Center = 0.5f * (m_attribute.v3Min + m_attribute.v3Max); + D3DXVECTOR3 v3Sphere = s.v3Position - v3Center; + D3DXVec3TransformCoord(&v3Sphere, &v3Sphere, &m_attribute.matRot); + v3Sphere = v3Sphere + v3Center; + + D3DXVECTOR3 v3Point = v3Sphere; + if(v3Point.x < m_attribute.v3Min.x) { v3Point.x = m_attribute.v3Min.x; } + if(v3Point.x > m_attribute.v3Max.x) { v3Point.x = m_attribute.v3Max.x; } + if(v3Point.y < m_attribute.v3Min.y) { v3Point.y = m_attribute.v3Min.y; } + if(v3Point.y > m_attribute.v3Max.y) { v3Point.y = m_attribute.v3Max.y; } + if(v3Point.z < m_attribute.v3Min.z) { v3Point.z = m_attribute.v3Min.z; } + if(v3Point.z > m_attribute.v3Max.z) { v3Point.z = m_attribute.v3Max.z; } + + if(GetVector3Distance(v3Point, v3Sphere) <= s.fRadius * s.fRadius) { return true; } + + v3Sphere = s.v3LastPosition - v3Center; + D3DXVec3TransformCoord(&v3Sphere, &v3Sphere, &m_attribute.matRot); + v3Sphere = v3Sphere + v3Center; + + v3Point = v3Sphere; + if(v3Point.x < m_attribute.v3Min.x) { v3Point.x = m_attribute.v3Min.x; } + if(v3Point.x > m_attribute.v3Max.x) { v3Point.x = m_attribute.v3Max.x; } + if(v3Point.y < m_attribute.v3Min.y) { v3Point.y = m_attribute.v3Min.y; } + if(v3Point.y > m_attribute.v3Max.y) { v3Point.y = m_attribute.v3Max.y; } + if(v3Point.z < m_attribute.v3Min.z) { v3Point.z = m_attribute.v3Min.z; } + if(v3Point.z > m_attribute.v3Max.z) { v3Point.z = m_attribute.v3Max.z; } + + if(GetVector3Distance(v3Point, v3Sphere) <= s.fRadius * s.fRadius) { return true; } + + + return false; +} + +D3DXVECTOR3 COBBCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + + return D3DXVECTOR3(.0f, .0f, .0f); + +} + +void COBBCollisionInstance::Render(D3DFILLMODE d3dFillMode) +{ + static CScreen s; + STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, 0xffffffff); + s.RenderCube(m_attribute.v3Min.x, m_attribute.v3Min.y, m_attribute.v3Min.z, m_attribute.v3Max.x, m_attribute.v3Max.y, m_attribute.v3Max.z, m_attribute.matRot); + return; +} + +void COBBCollisionInstance::OnDestroy() +{ + gs_oci.Free(this); +} \ No newline at end of file diff --git a/extension/src/port/EterLib/GrpCollisionObject.cpp b/extension/src/port/EterLib/GrpCollisionObject.cpp new file mode 100644 index 00000000..57ae6374 --- /dev/null +++ b/extension/src/port/EterLib/GrpCollisionObject.cpp @@ -0,0 +1,240 @@ +#include "StdAfx.h" +#include "GrpCollisionObject.h" + +bool CGraphicCollisionObject::IntersectBoundBox(const D3DXMATRIX* c_pmatWorld, const TBoundBox& c_rboundBox, float* pu, float* pv, float* pt) +{ + return IntersectCube(c_pmatWorld, c_rboundBox.sx, c_rboundBox.sy, c_rboundBox.sz, c_rboundBox.ex, c_rboundBox.ey, c_rboundBox.ez, ms_vtPickRayOrig, ms_vtPickRayDir, pu, pv, pt); +} + +bool CGraphicCollisionObject::IntersectCube(const D3DXMATRIX* c_pmatWorld, float sx, float sy, float sz, float ex, float ey, float ez, + D3DXVECTOR3 & RayOriginal, D3DXVECTOR3 & RayDirection, float* pu, float* pv, float* pt) +{ + TPosition posVertices[8]; + + posVertices[0] = TPosition(sx, sy, sz); + posVertices[1] = TPosition(ex, sy, sz); + posVertices[2] = TPosition(sx, ey, sz); + posVertices[3] = TPosition(ex, ey, sz); + posVertices[4] = TPosition(sx, sy, ez); + posVertices[5] = TPosition(ex, sy, ez); + posVertices[6] = TPosition(sx, ey, ez); + posVertices[7] = TPosition(ex, ey, ez); + + static const WORD c_awFillCubeIndices[36] = { + 0, 1, 2, 1, 3, 2, + 2, 0, 6, 0, 4, 6, + 0, 1, 4, 1, 5, 4, + 1, 3, 5, 3, 7, 5, + 3, 2, 7, 2, 6, 7, + 4, 5, 6, 5, 7, 6, + }; + + return IntersectIndexedMesh( + c_pmatWorld, + posVertices, + sizeof(TPosition), + 8, + c_awFillCubeIndices, + 36, + RayOriginal, + RayDirection, + pu, + pv, + pt + ); +} + +const int c_iLimitVertexCount = 1024; + +bool CGraphicCollisionObject::IntersectIndexedMesh(const D3DXMATRIX* c_pmatWorld, const void* vertices, int step, int vtxCount, const void* indices, int idxCount, + D3DXVECTOR3 & RayOriginal, D3DXVECTOR3 & RayDirection, float* pu, float* pv, float* pt) +{ + static D3DXVECTOR3 s_v3PositionArray[c_iLimitVertexCount]; + static DWORD s_dwPositionCount; + + if (vtxCount > c_iLimitVertexCount) + { + Tracef("The vertex count of mesh which is worked collision detection is too much : %d / %d", vtxCount, c_iLimitVertexCount); + return false; + } + + s_dwPositionCount = 0; + + char* pcurVtx = (char*)vertices; + + while (vtxCount--) + { + float* pos = (float*)pcurVtx; + + D3DXVec3TransformCoord(&s_v3PositionArray[s_dwPositionCount++], (D3DXVECTOR3*)pos, c_pmatWorld); + + pcurVtx += step; + } + + WORD* pcurIdx = (WORD*)indices; + + int triCount = idxCount / 3; + while (triCount--) + { + if (IntersectTriangle(RayOriginal, RayDirection, + s_v3PositionArray[pcurIdx[0]], + s_v3PositionArray[pcurIdx[1]], + s_v3PositionArray[pcurIdx[2]], + pu, pv, pt)) + { + return true; + } + + pcurIdx += 3; + } + + return false; +} + +bool CGraphicCollisionObject::IntersectMesh(const D3DXMATRIX * c_pmatWorld, const void * vertices, DWORD dwStep, DWORD dwvtxCount, D3DXVECTOR3 & RayOriginal, D3DXVECTOR3 & RayDirection, float* pu, float* pv, float* pt) +{ + char * pcurVtx = (char *) vertices; + + D3DXVECTOR3 v3Vertex[3]; + + for (DWORD i = 0; i < dwvtxCount; i += 3) + { + D3DXVec3TransformCoord(&v3Vertex[0], (D3DXVECTOR3*)pcurVtx, c_pmatWorld); + pcurVtx += dwStep; + + D3DXVec3TransformCoord(&v3Vertex[1], (D3DXVECTOR3*)pcurVtx, c_pmatWorld); + pcurVtx += dwStep; + + D3DXVec3TransformCoord(&v3Vertex[2], (D3DXVECTOR3*)pcurVtx, c_pmatWorld); + pcurVtx += dwStep; + + if (IntersectTriangle(RayOriginal, RayDirection, + v3Vertex[0], v3Vertex[1], v3Vertex[2], + pu, pv, pt)) + { + return true; + } + } + + return false; +} + +bool CGraphicCollisionObject::IntersectTriangle(const D3DXVECTOR3& c_orig, + const D3DXVECTOR3& c_dir, + const D3DXVECTOR3& c_v0, + const D3DXVECTOR3& c_v1, + const D3DXVECTOR3& c_v2, + float * pu, + float * pv, + float * pt) +{ + D3DXVECTOR3 edge1 = c_v1 - c_v0; + D3DXVECTOR3 edge2 = c_v2 - c_v0; + D3DXVECTOR3 pvec; + D3DXVec3Cross(&pvec, &c_dir, &edge2); + + FLOAT det = D3DXVec3Dot(&edge1, &pvec); + D3DXVECTOR3 tvec; + + if (det > 0) + { + tvec = c_orig - c_v0; + } + else + { + tvec = c_v0 - c_orig; + det = -det; + } + + if (det < 0.0001f) + return false; + + float u, v, t; + u = D3DXVec3Dot(&tvec, &pvec); + if (u < 0.0f || u > det) + return false; + + D3DXVECTOR3 qvec; + D3DXVec3Cross(&qvec, &tvec, &edge1); + + v = D3DXVec3Dot(&c_dir, &qvec); + if (v < 0.0f || u + v > det) + return false; + + t = D3DXVec3Dot(&edge2, &qvec); + FLOAT fInvDet = 1.0f / det; + t *= fInvDet; + u *= fInvDet; + v *= fInvDet; + + D3DXVECTOR3 spot = edge1 * u + edge2 * v; + spot += c_v0; + + *pu = spot.x; + *pv = spot.y; + *pt = t; + + return true; +} + +bool CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection) +{ + D3DXVECTOR3 v3RayOriginal = c_rv3RayOriginal - c_rv3Position; + + float a = D3DXVec3Dot(&c_rv3RayDirection, &c_rv3RayDirection); + float b = 2 * D3DXVec3Dot(&v3RayOriginal, &c_rv3RayDirection); + float c = D3DXVec3Dot(&v3RayOriginal, &v3RayOriginal) - fRadius * fRadius; + + float D = b * b - 4 * a * c; + + if (D >= 0) + return true; + + return false; +} + +bool CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection) +{ + D3DXVECTOR3 v3RayOriginal = c_rv3RayOriginal - c_rv3Position; + + float a = c_rv3RayDirection.x * c_rv3RayDirection.x + c_rv3RayDirection.y * c_rv3RayDirection.y; + float b = 2 * (v3RayOriginal.x * c_rv3RayDirection.x + v3RayOriginal.y * c_rv3RayDirection.y); + float c = v3RayOriginal.x * v3RayOriginal.x + v3RayOriginal.y * v3RayOriginal.y - fRadius*fRadius; + + float D = b * b - 4 * a * c; + if (D > 0) + if (0.0f != a) + { + float tPlus = (-b + sqrtf(D)) / (2 * a); + float tMinus = (-b - sqrtf(D)) / (2 * a); + float fzPlus = v3RayOriginal.z + tPlus * c_rv3RayDirection.z; + float fzMinus = v3RayOriginal.z + tMinus * c_rv3RayDirection.z; + + if (fzPlus > 0.0f && fzPlus <= fHeight) + return true; + if (fzMinus > 0.0f && fzMinus <= fHeight) + return true; + if (fzMinus * fzPlus < 0.0f) + return true; + } + + return false; +} + +bool CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius) +{ + return CGraphicCollisionObject::IntersectSphere(c_rv3Position, fRadius, ms_vtPickRayOrig, ms_vtPickRayDir); +} + +bool CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight) +{ + return CGraphicCollisionObject::IntersectCylinder(c_rv3Position, fRadius, fHeight, ms_vtPickRayOrig, ms_vtPickRayDir); +} + +CGraphicCollisionObject::CGraphicCollisionObject() +{ +} + +CGraphicCollisionObject::~CGraphicCollisionObject() +{ +} \ No newline at end of file diff --git a/extension/src/port/EterLib/GrpObjectInstance.cpp b/extension/src/port/EterLib/GrpObjectInstance.cpp new file mode 100644 index 00000000..c1d5cdf7 --- /dev/null +++ b/extension/src/port/EterLib/GrpObjectInstance.cpp @@ -0,0 +1,441 @@ +#include "StdAfx.h" +#include "GrpObjectInstance.h" +#include "../EterBase/Timer.h" + +void CGraphicObjectInstance::OnInitialize() +{ + ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID)); +} + +void CGraphicObjectInstance::Clear() +{ + if (m_CullingHandle) + { + CCullingManager::Instance().Unregister(m_CullingHandle); + m_CullingHandle = NULL; + } + + ClearHeightInstance(); + + m_isVisible = TRUE; + + m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f; + m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f; + //m_fRotation = 0.0f; + m_fYaw = m_fPitch = m_fRoll = 0.0f; + D3DXMatrixIdentity(&m_worldMatrix); + + ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID)); + + OnClear(); +} + +bool CGraphicObjectInstance::Render() +{ + /* + if (m_CullingHandle) + { + SpherePack * ps = m_CullingHandle->GetParent(); + CScreen s; + s.SetColorOperation(); + //s.SetDiffuseColor(1,isShow()?1:0,0); + //s.RenderCircle2d(m_CullingHandle->GetCenter().x,m_CullingHandle->GetCenter().y,m_CullingHandle->GetCenter().z,m_CullingHandle->GetRadius()); + s.SetDiffuseColor(1,isShow()?1:0,ps->HasSpherePackFlag(SPF_PARTIAL)?1:0); + s.RenderCircle2d(ps->GetCenter().x,ps->GetCenter().y,ps->GetCenter().z,ps->GetRadius()); + } + //*/ + if (!isShow()) + return false; + + OnRender(); + return true; +} + +void CGraphicObjectInstance::BlendRender() +{ + if (!isShow()) + return; + + OnBlendRender(); +} + +void CGraphicObjectInstance::RenderToShadowMap() +{ + if (!isShow()) + return; + + OnRenderToShadowMap(); +} + +void CGraphicObjectInstance::RenderShadow() +{ + if (!isShow()) + return; + + OnRenderShadow(); +} + +void CGraphicObjectInstance::RenderPCBlocker() +{ + if (!isShow()) + return; + + OnRenderPCBlocker(); +} + +void CGraphicObjectInstance::Update() +{ + OnUpdate(); + + UpdateBoundingSphere(); +} + +void CGraphicObjectInstance::Deform() +{ + if (!isShow()) + return; + + OnDeform(); +} + + +void CGraphicObjectInstance::Transform() +{ + m_worldMatrix = m_mRotation; + + m_worldMatrix._41 += m_v3Position.x; + m_worldMatrix._42 += m_v3Position.y; + m_worldMatrix._43 += m_v3Position.z; +} + +const D3DXVECTOR3 & CGraphicObjectInstance::GetPosition() const +{ + return m_v3Position; +} + +const D3DXVECTOR3 & CGraphicObjectInstance::GetScale() const +{ + return m_v3Scale; +} + +float CGraphicObjectInstance::GetRotation() +{ + return GetRoll(); +} + +float CGraphicObjectInstance::GetYaw() +{ + return m_fYaw; +} + +float CGraphicObjectInstance::GetPitch() +{ + return m_fPitch; +} + +float CGraphicObjectInstance::GetRoll() +{ + return m_fRoll; +} + +D3DXMATRIX & CGraphicObjectInstance::GetTransform() +{ + return m_worldMatrix; +} + +void CGraphicObjectInstance::SetRotationQuaternion(const D3DXQUATERNION &q) +{ + D3DXMatrixRotationQuaternion(&m_mRotation, &q); +} + +void CGraphicObjectInstance::SetRotationMatrix(const D3DXMATRIX & m) +{ + m_mRotation = m; +} + +void CGraphicObjectInstance::SetRotation(float fRotation) +{ + m_fYaw = 0; + m_fPitch = 0; + m_fRoll = fRotation; + + D3DXMatrixRotationZ(&m_mRotation, D3DXToRadian(fRotation)); +} + +void CGraphicObjectInstance::SetRotation(float fYaw, float fPitch, float fRoll) +{ + //m_fRotation = fRotation; + m_fYaw = fYaw; + m_fPitch = fPitch; + m_fRoll = fRoll; + + D3DXMatrixRotationYawPitchRoll(&m_mRotation, D3DXToRadian(fYaw), D3DXToRadian(fPitch), D3DXToRadian(fRoll)); +} + +void CGraphicObjectInstance::SetPosition(float x, float y, float z) +{ + m_v3Position.x = x; + m_v3Position.y = y; + m_v3Position.z = z; +} + +void CGraphicObjectInstance::SetPosition(const D3DXVECTOR3 & newposition) +{ + m_v3Position = newposition; +} + +void CGraphicObjectInstance::SetScale(float x, float y, float z) +{ + m_v3Scale.x = x; + m_v3Scale.y = y; + m_v3Scale.z = z; +} + +void CGraphicObjectInstance::Show() +{ + m_isVisible = true; +} + +void CGraphicObjectInstance::Hide() +{ + m_isVisible = false; +} +bool CGraphicObjectInstance::isShow() +{ + return m_isVisible; +} + +// + +////////////////////////////////////////////////////////////////////////// + +D3DXVECTOR4 & CGraphicObjectInstance::GetWTBBoxVertex(const unsigned char & c_rucNumTBBoxVertex) +{ + return m_v4TBBox[c_rucNumTBBoxVertex]; +} + +bool CGraphicObjectInstance::isIntersect(const CRay & c_rRay, float * pu, float * pv, float * pt) +{ + D3DXVECTOR3 v3Start, v3Dir; + float fRayRange; + c_rRay.GetStartPoint(&v3Start); + c_rRay.GetDirection(&v3Dir, &fRayRange); + + TPosition posVertices[8]; + + posVertices[0] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z); + posVertices[1] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z); + posVertices[2] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z); + posVertices[3] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z); + posVertices[4] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z); + posVertices[5] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z); + posVertices[6] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z); + posVertices[7] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z); + + TIndex Indices[36] = {0, 1, 2, 1, 3, 2, + 2, 0, 6, 0, 4, 6, + 0, 1, 4, 1, 5, 4, + 1, 3, 5, 3, 7, 5, + 3, 2, 7, 2, 6, 7, + 4, 5, 6, 5, 7, 6}; + + int triCount = 12; + WORD* pcurIdx = (WORD*)Indices; + + while (triCount--) + { + if (IntersectTriangle(v3Start, v3Dir, + posVertices[pcurIdx[0]], + posVertices[pcurIdx[1]], + posVertices[pcurIdx[2]], + pu, pv, pt)) + { + return true; + } + + pcurIdx += 3; + } + + return false; +} + +CGraphicObjectInstance::CGraphicObjectInstance() +{ + m_CullingHandle = 0; + Initialize(); +} + +void CGraphicObjectInstance::Initialize() +{ + if (m_CullingHandle) + CCullingManager::Instance().Unregister(m_CullingHandle); + m_CullingHandle = 0; + + m_pHeightAttributeInstance = NULL; + + m_isVisible = TRUE; + + m_BlockCamera = false; + + m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f; + m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f; + m_fYaw = m_fPitch = m_fRoll = 0.0f; + + D3DXMatrixIdentity(&m_worldMatrix); + D3DXMatrixIdentity(&m_mRotation); + + OnInitialize(); +} + +CGraphicObjectInstance::~CGraphicObjectInstance() +{ + Initialize(); +} + +void CGraphicObjectInstance::UpdateBoundingSphere() +{ + if (m_CullingHandle) + { + Vector3d center; + float radius; + GetBoundingSphere(center,radius); + if (radius != m_CullingHandle->GetRadius()) + m_CullingHandle->NewPosRadius(center,radius); + else + m_CullingHandle->NewPos(center); + } +} + +void CGraphicObjectInstance::RegisterBoundingSphere() +{ + if (m_CullingHandle) + CCullingManager::Instance().Unregister(m_CullingHandle); + + m_CullingHandle = CCullingManager::Instance().Register(this); +} + +void CGraphicObjectInstance::AddCollision(const CStaticCollisionData * pscd, const D3DXMATRIX* pMat) +{ + m_StaticCollisionInstanceVector.push_back(CBaseCollisionInstance::BuildCollisionInstance(pscd, pMat)); +} + +void CGraphicObjectInstance::ClearCollision() +{ + CCollisionInstanceVector::iterator it; + for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it) + { + (*it)->Destroy(); + } + m_StaticCollisionInstanceVector.clear(); +} + +bool CGraphicObjectInstance::CollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + CCollisionInstanceVector::const_iterator it; + for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it) + { + if ((*it)->CollisionDynamicSphere(s)) + return true; + } + return false; +} + +bool CGraphicObjectInstance::MovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const +{ + CCollisionInstanceVector::const_iterator it; + for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it) + { + if ((*it)->MovementCollisionDynamicSphere(s)) + return true; + } + return false; +} + +D3DXVECTOR3 CGraphicObjectInstance::GetCollisionMovementAdjust(const CDynamicSphereInstance & s) const +{ + CCollisionInstanceVector::const_iterator it; + for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it) + { + if ((*it)->MovementCollisionDynamicSphere(s)) + return (*it)->GetCollisionMovementAdjust(s); + } + + return D3DXVECTOR3(0.0f,0.0f,0.0f); +} + +void CGraphicObjectInstance::UpdateCollisionData(const CStaticCollisionDataVector * pscdVector) +{ + ClearCollision(); + OnUpdateCollisionData(pscdVector); +} + +DWORD CGraphicObjectInstance::GetCollisionInstanceCount() +{ + return m_StaticCollisionInstanceVector.size(); +} + +CBaseCollisionInstance * CGraphicObjectInstance::GetCollisionInstanceData(DWORD dwIndex) +{ + if (dwIndex>m_StaticCollisionInstanceVector.size()) + { + return 0; + } + return m_StaticCollisionInstanceVector[dwIndex]; +} + +////////////////////////////////////////////////////////////////////////// +// Height + +void CGraphicObjectInstance::SetHeightInstance(CAttributeInstance * pAttributeInstance) +{ + m_pHeightAttributeInstance = pAttributeInstance; +} + +void CGraphicObjectInstance::ClearHeightInstance() +{ + m_pHeightAttributeInstance = NULL; +} + +void CGraphicObjectInstance::UpdateHeightInstance(CAttributeInstance * pAttributeInstance) +{ + ClearHeightInstance(); + OnUpdateHeighInstance(pAttributeInstance); +} + +bool CGraphicObjectInstance::IsObjectHeight() +{ + if (m_pHeightAttributeInstance) + return true; + + return false; +} + +bool CGraphicObjectInstance::GetObjectHeight(float fX, float fY, float * pfHeight) +{ + if (!m_pHeightAttributeInstance) + return false; + + return OnGetObjectHeight(fX, fY, pfHeight); +} + +void CGraphicObjectInstance::SetPortal(DWORD dwIndex, int iID) +{ + if (dwIndex >= PORTAL_ID_MAX_NUM) + { + assert(dwIndex < PORTAL_ID_MAX_NUM); + return; + } + + m_abyPortalID[dwIndex] = iID; +} + +int CGraphicObjectInstance::GetPortal(DWORD dwIndex) +{ + if (dwIndex >= PORTAL_ID_MAX_NUM) + { + assert(dwIndex < PORTAL_ID_MAX_NUM); + return 0; + } + + return m_abyPortalID[dwIndex]; +} diff --git a/extension/src/port/common/D3D8Types.h b/extension/src/port/common/D3D8Types.h index 8b5ec816..730028f5 100644 --- a/extension/src/port/common/D3D8Types.h +++ b/extension/src/port/common/D3D8Types.h @@ -302,6 +302,33 @@ typedef enum _D3DTEXTURESTAGESTATETYPE D3DTSS_FORCE_DWORD = 0x7fffffff, } D3DTEXTURESTAGESTATETYPE; +// D3D8 texture coordinate generation, transform flags and addressing (d3d8types.h). +enum : DWORD { + D3DTSS_TCI_PASSTHRU = 0x00000000, + D3DTSS_TCI_CAMERASPACENORMAL = 0x00010000, + D3DTSS_TCI_CAMERASPACEPOSITION = 0x00020000, + D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR = 0x00030000, +}; +typedef enum _D3DTEXTURETRANSFORMFLAGS +{ + D3DTTFF_DISABLE = 0, + D3DTTFF_COUNT1 = 1, + D3DTTFF_COUNT2 = 2, + D3DTTFF_COUNT3 = 3, + D3DTTFF_COUNT4 = 4, + D3DTTFF_PROJECTED = 256, + D3DTTFF_FORCE_DWORD = 0x7fffffff, +} D3DTEXTURETRANSFORMFLAGS; +typedef enum _D3DTEXTUREADDRESS +{ + D3DTADDRESS_WRAP = 1, + D3DTADDRESS_MIRROR = 2, + D3DTADDRESS_CLAMP = 3, + D3DTADDRESS_BORDER = 4, + D3DTADDRESS_MIRRORONCE = 5, + D3DTADDRESS_FORCE_DWORD = 0x7fffffff, +} D3DTEXTUREADDRESS; + // D3D8 texture-stage arguments (d3d8types.h D3DTA_*). enum : DWORD { D3DTA_SELECTMASK = 0x0000000f, @@ -386,6 +413,20 @@ typedef enum _D3DCULL { #define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1) #define D3DTS_WORLD2 D3DTS_WORLDMATRIX(2) #define D3DTS_WORLD3 D3DTS_WORLDMATRIX(3) +#define D3DUSAGE_RENDERTARGET 0x00000001L +#define D3DUSAGE_DEPTHSTENCIL 0x00000002L +#define D3DUSAGE_WRITEONLY 0x00000008L +#define D3DUSAGE_SOFTWAREPROCESSING 0x00000010L +#define D3DUSAGE_DONOTCLIP 0x00000020L +#define D3DUSAGE_POINTS 0x00000040L +#define D3DUSAGE_RTPATCHES 0x00000080L +#define D3DUSAGE_NPATCHES 0x00000100L +#define D3DUSAGE_DYNAMIC 0x00000200L +#define D3DLOCK_READONLY 0x00000010L +#define D3DLOCK_DISCARD 0x00002000L +#define D3DLOCK_NOOVERWRITE 0x00001000L +#define D3DLOCK_NOSYSLOCK 0x00000800L +#define D3DLOCK_NO_DIRTY_UPDATE 0x00008000L #define D3DFVF_RESERVED0 0x001 #define D3DFVF_POSITION_MASK 0x00E #define D3DFVF_XYZ 0x002 diff --git a/extension/src/port/common/D3DXMath.cpp b/extension/src/port/common/D3DXMath.cpp index e5c0a5c1..22943e64 100644 --- a/extension/src/port/common/D3DXMath.cpp +++ b/extension/src/port/common/D3DXMath.cpp @@ -79,6 +79,17 @@ D3DXVECTOR4* D3DXVec3Transform(D3DXVECTOR4* pOut, const D3DXVECTOR3* pV, const D return pOut; } +D3DXVECTOR4* D3DXVec4Transform(D3DXVECTOR4* pOut, const D3DXVECTOR4* pV, const D3DXMATRIX* pM) +{ + D3DXVECTOR4 out; + out.x = pM->m[0][0] * pV->x + pM->m[1][0] * pV->y + pM->m[2][0] * pV->z + pM->m[3][0] * pV->w; + out.y = pM->m[0][1] * pV->x + pM->m[1][1] * pV->y + pM->m[2][1] * pV->z + pM->m[3][1] * pV->w; + out.z = pM->m[0][2] * pV->x + pM->m[1][2] * pV->y + pM->m[2][2] * pV->z + pM->m[3][2] * pV->w; + out.w = pM->m[0][3] * pV->x + pM->m[1][3] * pV->y + pM->m[2][3] * pV->z + pM->m[3][3] * pV->w; + *pOut = out; + return pOut; +} + D3DXVECTOR3* D3DXVec3TransformCoord(D3DXVECTOR3* pOut, const D3DXVECTOR3* pV, const D3DXMATRIX* pM) { const FLOAT norm = pM->m[0][3] * pV->x + pM->m[1][3] * pV->y + pM->m[2][3] * pV->z + pM->m[3][3]; diff --git a/extension/src/port/common/D3DXMath.h b/extension/src/port/common/D3DXMath.h index 21233b0a..04e6c16b 100644 --- a/extension/src/port/common/D3DXMath.h +++ b/extension/src/port/common/D3DXMath.h @@ -335,6 +335,7 @@ D3DXVECTOR3* D3DXVec3Normalize(D3DXVECTOR3* pOut, const D3DXVECTOR3* pV); D3DXVECTOR4* D3DXVec3Transform(D3DXVECTOR4* pOut, const D3DXVECTOR3* pV, const D3DXMATRIX* pM); D3DXVECTOR3* D3DXVec3TransformCoord(D3DXVECTOR3* pOut, const D3DXVECTOR3* pV, const D3DXMATRIX* pM); D3DXVECTOR3* D3DXVec3TransformNormal(D3DXVECTOR3* pOut, const D3DXVECTOR3* pV, const D3DXMATRIX* pM); +D3DXVECTOR4* D3DXVec4Transform(D3DXVECTOR4* pOut, const D3DXVECTOR4* pV, const D3DXMATRIX* pM); // --- D3DXMATRIX --- inline D3DXMATRIX* D3DXMatrixIdentity(D3DXMATRIX* pOut) diff --git a/extension/src/port/common/shim/sdk/granny.h b/extension/src/port/common/shim/sdk/granny.h index f8edbc65..2a4b155c 100644 --- a/extension/src/port/common/shim/sdk/granny.h +++ b/extension/src/port/common/shim/sdk/granny.h @@ -1,7 +1,8 @@ #pragma once -// Shim for RAD Granny 2.11 (40250 extern/include): the scalar types and structs that -// EterGrnLib headers name, with the SDK's layout; every other Granny object is opaque. Loading and -// skinning go through platform/ (backed by libgr2), never through these declarations. +// Shim for RAD Granny 2.11 (40250 extern/include): the scalar types, the public data structs +// EterGrnLib reads (SDK field names and order) and the functions it calls. The file-data structs are +// built from libgr2 and the runtime objects (file, model instance, control, pose, binding, deformer) +// stay opaque; both live in platform/EterGrnLib/GrannyRuntime.cpp. #include typedef uint32_t granny_uint32; @@ -11,10 +12,14 @@ typedef int16_t granny_int16; typedef uint8_t granny_uint8; typedef int8_t granny_int8; typedef float granny_real32; +typedef double granny_real64x; typedef granny_uint32 granny_bool32; +typedef granny_int32 granny_int32x; +typedef granny_uint32 granny_uint32x; typedef uintptr_t granny_uintaddrx; typedef granny_real32 granny_triple[3]; typedef granny_real32 granny_quad[4]; +typedef granny_real32 granny_matrix_4x4[4][4]; typedef enum granny_member_type { @@ -46,6 +51,76 @@ typedef enum granny_member_type Grannymember_type_forceint = 0x7fffffff } granny_member_type; +typedef enum granny_material_texture_type +{ + GrannyUnknownTextureType, + GrannyAmbientColorTexture, + GrannyDiffuseColorTexture, + GrannySpecularColorTexture, + GrannySelfIlluminationTexture, + GrannyOpacityTexture, + GrannyBumpHeightTexture, + GrannyReflectionTexture, + GrannyRefractionTexture, + GrannyDisplacementTexture, + GrannyOnePastLastMaterialTextureType, + Grannymaterial_texture_type_forceint = 0x7fffffff +} granny_material_texture_type; + +typedef enum granny_deformation_type +{ + GrannyDeformPosition = 1, + GrannyDeformPositionNormal, + GrannyDeformPositionNormalTangent, + GrannyDeformPositionNormalTangentBinormal, + Grannydeformation_type_forceint = 0x7fffffff +} granny_deformation_type; + +typedef enum granny_deformer_tail_flags +{ + GrannyDontAllowUncopiedTail, + GrannyAllowUncopiedTail, + GrannyAllowUninitializedDestTail, + Grannydeformer_tail_flags_forceint = 0x7fffffff +} granny_deformer_tail_flags; + +typedef enum granny_standard_section_index +{ + GrannyStandardMainSection = 0, + GrannyStandardRigidVertexSection = 1, + GrannyStandardRigidIndexSection = 2, + GrannyStandardDeformableVertexSection = 3, + GrannyStandardDeformableIndexSection = 4, + GrannyStandardTextureSection = 5, + GrannyStandardDiscardableSection = 6, + GrannyStandardUnloadedSection = 7, + GrannyStandardSectionCount = 8, + Grannystandard_section_index_forceint = 0x7fffffff +} granny_standard_section_index; + +typedef enum granny_log_message_type +{ + GrannyIgnoredLogMessage, + GrannyNoteLogMessage, + GrannyWarningLogMessage, + GrannyErrorLogMessage, + GrannyOnePastLastMessageType, + Grannylog_message_type_forceint = 0x7fffffff +} granny_log_message_type; +typedef granny_int32 granny_log_message_origin; + +#define GrannyVertexPositionName "Position" +#define GrannyVertexNormalName "Normal" +#define GrannyVertexTangentName "Tangent" +#define GrannyVertexBinormalName "Binormal" +#define GrannyVertexTangentBinormalCrossName "TangentBinormalCross" +#define GrannyVertexBoneWeightsName "BoneWeights" +#define GrannyVertexBoneIndicesName "BoneIndices" +#define GrannyVertexDiffuseColorName "DiffuseColor" +#define GrannyVertexSpecularColorName "SpecularColor" +#define GrannyVertexTextureCoordinatesName "TextureCoordinates" +#define GrannyVertexMorphCurvePrefix "VertexMorphCurve" + struct granny_data_type_definition { granny_member_type Type; @@ -57,9 +132,10 @@ struct granny_data_type_definition }; struct granny_animation; +struct granny_bone; struct granny_control; struct granny_file; -struct granny_file_info; +struct granny_local_pose; struct granny_material; struct granny_mesh; struct granny_mesh_binding; @@ -67,4 +143,282 @@ struct granny_mesh_deformer; struct granny_model; struct granny_model_instance; struct granny_skeleton; +struct granny_texture; struct granny_world_pose; +struct granny_conversion_handler; + +struct granny_variant +{ + granny_data_type_definition* Type; + void* Object; +}; + +struct granny_transform +{ + granny_uint32 Flags; + granny_triple Position; + granny_quad Orientation; + granny_triple ScaleShear[3]; +}; + +struct granny_texture +{ + char const* FromFileName; + granny_int32 TextureType; + granny_int32 Width; + granny_int32 Height; + granny_int32 Encoding; + granny_int32 SubFormat; + granny_variant ExtendedData; +}; + +struct granny_material_map +{ + char const* Usage; + granny_material* Material; +}; + +struct granny_material +{ + char const* Name; + granny_int32 MapCount; + granny_material_map* Maps; + granny_texture* Texture; + granny_variant ExtendedData; +}; + +struct granny_bone +{ + char const* Name; + granny_int32 ParentIndex; + granny_transform LocalTransform; + granny_matrix_4x4 InverseWorld4x4; + granny_real32 LODError; + granny_variant ExtendedData; +}; + +struct granny_skeleton +{ + char const* Name; + granny_int32 BoneCount; + granny_bone* Bones; + granny_int32 LODType; + granny_variant ExtendedData; +}; + +struct granny_vertex_data +{ + granny_data_type_definition* VertexType; + granny_int32 VertexCount; + granny_uint8* Vertices; + granny_int32 VertexComponentNameCount; + char const** VertexComponentNames; +}; + +struct granny_tri_material_group +{ + granny_int32 MaterialIndex; + granny_int32 TriFirst; + granny_int32 TriCount; +}; + +struct granny_tri_topology +{ + granny_int32 GroupCount; + granny_tri_material_group* Groups; + granny_int32 IndexCount; + granny_int32* Indices; + granny_int32 Index16Count; + granny_uint16* Indices16; +}; + +struct granny_material_binding +{ + granny_material* Material; +}; + +struct granny_bone_binding +{ + char const* BoneName; + granny_triple OBBMin; + granny_triple OBBMax; + granny_int32 TriangleCount; + granny_int32* TriangleIndices; +}; + +struct granny_mesh +{ + char const* Name; + granny_vertex_data* PrimaryVertexData; + granny_int32 MorphTargetCount; + void* MorphTargets; + granny_tri_topology* PrimaryTopology; + granny_int32 MaterialBindingCount; + granny_material_binding* MaterialBindings; + granny_int32 BoneBindingCount; + granny_bone_binding* BoneBindings; + granny_variant ExtendedData; +}; + +struct granny_model_mesh_binding +{ + granny_mesh* Mesh; +}; + +struct granny_model +{ + char const* Name; + granny_skeleton* Skeleton; + granny_transform InitialPlacement; + granny_int32 MeshBindingCount; + granny_model_mesh_binding* MeshBindings; + granny_variant ExtendedData; +}; + +struct granny_text_track_entry +{ + granny_real32 TimeStamp; + char const* Text; +}; + +struct granny_text_track +{ + char const* Name; + granny_int32 EntryCount; + granny_text_track_entry* Entries; +}; + +struct granny_track_group +{ + char const* Name; + granny_int32 TextTrackCount; + granny_text_track* TextTracks; + granny_transform InitialPlacement; + granny_int32 Flags; + granny_variant ExtendedData; +}; + +struct granny_animation +{ + char const* Name; + granny_real32 Duration; + granny_real32 TimeStep; + granny_real32 Oversampling; + granny_int32 TrackGroupCount; + granny_track_group** TrackGroups; + granny_int32 DefaultLoopCount; + granny_int32 Flags; + granny_variant ExtendedData; +}; + +struct granny_file_info +{ + char const* FromFileName; + granny_int32 TextureCount; + granny_texture** Textures; + granny_int32 MaterialCount; + granny_material** Materials; + granny_int32 SkeletonCount; + granny_skeleton** Skeletons; + granny_int32 MeshCount; + granny_mesh** Meshes; + granny_int32 ModelCount; + granny_model** Models; + granny_int32 AnimationCount; + granny_animation** Animations; + granny_variant ExtendedData; +}; + +struct granny_system_clock +{ + granny_uint32 Data[4]; +}; + +typedef void granny_log_function(granny_log_message_type Type, granny_log_message_origin Origin, + char const* File, granny_int32x Line, char const* Message, void* UserData); +struct granny_log_callback +{ + granny_log_function* Function; + void* UserData; +}; + +extern granny_data_type_definition* GrannyPNT332VertexType; + +// Files +granny_file* GrannyReadEntireFileFromMemory(granny_int32x MemorySize, void const* Memory); +granny_file_info* GrannyGetFileInfo(granny_file* File); +void GrannyFreeFile(granny_file* File); +void GrannyFreeFileSection(granny_file* File, granny_int32x SectionIndex); +void GrannySetLogCallback(granny_log_callback const* LogCallback); + +// Data types +granny_int32x GrannyGetTotalTypeSize(granny_data_type_definition const* TypeDefinition); +bool GrannyFindMatchingMember(granny_data_type_definition const* SourceType, void const* SourceObject, + char const* DestMemberName, granny_variant* Result); +void GrannyConvertSingleObject(granny_data_type_definition const* SourceType, void const* SourceObject, + granny_data_type_definition const* DestType, void* DestObject, + granny_conversion_handler* OverrideHandler); + +// Materials, skeletons, meshes +granny_texture* GrannyGetMaterialTextureByType(granny_material const* Material, granny_material_texture_type Type); +bool GrannyFindBoneByName(granny_skeleton const* Skeleton, char const* BoneName, granny_int32x* BoneIndex); +bool GrannyMeshIsRigid(granny_mesh const* Mesh); +granny_int32x GrannyGetMeshVertexCount(granny_mesh const* Mesh); +granny_data_type_definition* GrannyGetMeshVertexType(granny_mesh const* Mesh); +void* GrannyGetMeshVertices(granny_mesh const* Mesh); +void GrannyCopyMeshVertices(granny_mesh const* Mesh, granny_data_type_definition const* VertexType, void* DestVertices); +granny_int32x GrannyGetMeshIndexCount(granny_mesh const* Mesh); +void GrannyCopyMeshIndices(granny_mesh const* Mesh, granny_int32x BytesPerIndex, void* DestIndices); +granny_int32x GrannyGetMeshTriangleGroupCount(granny_mesh const* Mesh); +granny_tri_material_group* GrannyGetMeshTriangleGroups(granny_mesh const* Mesh); + +// Mesh binding and deformation +granny_mesh_binding* GrannyNewMeshBinding(granny_mesh const* Mesh, granny_skeleton const* FromSkeleton, granny_skeleton const* ToSkeleton); +void GrannyFreeMeshBinding(granny_mesh_binding* Binding); +granny_int32x const* GrannyGetMeshBindingToBoneIndices(granny_mesh_binding const* Binding); +granny_mesh_deformer* GrannyNewMeshDeformer(granny_data_type_definition const* InputVertexLayout, + granny_data_type_definition const* OutputVertexLayout, + granny_deformation_type DeformationType, granny_deformer_tail_flags TailFlag); +void GrannyFreeMeshDeformer(granny_mesh_deformer* Deformer); +void GrannyDeformVertices(granny_mesh_deformer const* Deformer, granny_int32x const* MatrixIndices, + granny_real32 const* MatrixBuffer4x4, granny_int32x VertexCount, + void const* SourceVertices, void* DestVertices); + +// Model instances and controls +granny_model_instance* GrannyInstantiateModel(granny_model const* Model); +void GrannyFreeModelInstance(granny_model_instance* ModelInstance); +granny_skeleton* GrannyGetSourceSkeleton(granny_model_instance const* Model); +void GrannySetModelClock(granny_model_instance const* ModelInstance, granny_real32 NewClock); +void GrannyFreeCompletedModelControls(granny_model_instance const* ModelInstance); +void GrannyUpdateModelMatrix(granny_model_instance const* ModelInstance, granny_real32 SecondsElapsed, + granny_real32 const* ModelMatrix4x4, granny_real32* DestMatrix4x4, bool Inverse); +granny_control* GrannyPlayControlledAnimation(granny_real32 StartTime, granny_animation const* Animation, granny_model_instance* Model); +void GrannyFreeControl(granny_control* Control); +void GrannyFreeControlOnceUnused(granny_control* Control); +bool GrannyFreeControlIfComplete(granny_control* Control); +bool GrannyControlIsComplete(granny_control const* Control); +void GrannyCompleteControlAt(granny_control* Control, granny_real32 AtSeconds); +void GrannySetControlSpeed(granny_control* Control, granny_real32 Speed); +granny_real32 GrannyGetControlSpeed(granny_control const* Control); +void GrannySetControlLoopCount(granny_control* Control, granny_int32x LoopCount); +granny_int32x GrannyGetControlLoopCount(granny_control const* Control); +void GrannySetControlRawLocalClock(granny_control* Control, granny_real32 LocalClock); +granny_real32 GrannyGetControlRawLocalClock(granny_control* Control); +granny_real32 GrannyGetControlLocalDuration(granny_control const* Control); +void GrannySetControlEaseIn(granny_control* Control, bool EaseIn); +void GrannySetControlEaseOut(granny_control* Control, bool EaseOut); +void GrannySetControlEaseInCurve(granny_control* Control, granny_real32 StartSeconds, granny_real32 EndSeconds, + granny_real32 StartValue, granny_real32 StartTangent, granny_real32 EndTangent, granny_real32 EndValue); +void GrannySetControlEaseOutCurve(granny_control* Control, granny_real32 StartSeconds, granny_real32 EndSeconds, + granny_real32 StartValue, granny_real32 StartTangent, granny_real32 EndTangent, granny_real32 EndValue); + +// Poses +granny_local_pose* GrannyNewLocalPose(granny_int32x BoneCount); +void GrannyFreeLocalPose(granny_local_pose* LocalPose); +granny_world_pose* GrannyNewWorldPose(granny_int32x BoneCount); +void GrannyFreeWorldPose(granny_world_pose* WorldPose); +void GrannySampleModelAnimationsAccelerated(granny_model_instance const* ModelInstance, granny_int32x BoneCount, + granny_real32 const* Offset4x4, granny_local_pose* Scratch, granny_world_pose* Result); +granny_real32* GrannyGetWorldPose4x4(granny_world_pose const* WorldPose, granny_int32x BoneIndex); +granny_real32* GrannyGetWorldPoseComposite4x4(granny_world_pose const* WorldPose, granny_int32x BoneIndex); +granny_matrix_4x4* GrannyGetWorldPoseComposite4x4Array(granny_world_pose const* WorldPose); diff --git a/extension/tests/port_login_flow_test.cpp b/extension/tests/port_login_flow_test.cpp index f1c710d5..b5a5c664 100644 --- a/extension/tests/port_login_flow_test.cpp +++ b/extension/tests/port_login_flow_test.cpp @@ -47,6 +47,10 @@ #include "UserInterface/StdAfx.h" #include "UserInterface/PythonCharacterManager.h" #include "UserInterface/InstanceBase.h" +#include "EterGrnLib/StdAfx.h" +#include "EterGrnLib/LODController.h" +#include "EterGrnLib/ModelInstance.h" +#include "EterGrnLib/Model.h" #include "port_login_flow_server.h" #include @@ -315,6 +319,33 @@ int main(int argc, char** argv) CHECK(main_instance != nullptr); CHECK(live || (main_instance && main_instance->GetRace() == 0)); CHECK(count_syserr("TPacketGCCharacterAdditionalInfo") == 0); + // (批次 2V2-d.2) SetRace/SetShape loaded the body .gr2 through the Granny runtime into PART_MAIN, and + // game.GameWindow's OnUpdate/OnRender (app.UpdateGame/RenderGame) play the WAIT motion: the + // sampled bone matrices change between frames. + CGrannyLODController* lod = main_instance ? + main_instance->GetGraphicThingInstanceRef().GetLODControllerPointer(CRaceData::PART_MAIN) : nullptr; + CGrannyModelInstance* model_instance = lod ? lod->GetModelInstance() : nullptr; + CGrannyModel* model = model_instance ? model_instance->GetModel() : nullptr; + CHECK(model && model->GetMeshCount() > 0); + // The material's diffuse map resolved through GrannyGetMaterialTextureByType to a loaded image. + CGrannyMaterialPalette* palette = model ? const_cast(&model->GetMaterialPalette()) : nullptr; + CHECK(palette && palette->GetMaterialCount() > 0 && palette->GetMaterialRef(0).GetImagePointer(0)); + const int bone_count = model ? model->GetGrannyModelPointer()->Skeleton->BoneCount : 0; + CHECK(bone_count > 1); + auto bones = [&] { + std::vector out; + for (int i = 0; i < bone_count; ++i) + { + const float* m = model_instance->GetBoneMatrixPointer(i); + out.insert(out.end(), m, m + 16); + } + return out; + }; + if (bone_count > 1) + { + const std::vector before = bones(); + CHECK(pump_until(3, [&] { return bones() != before; })); + } } if (server) { diff --git a/libgr2/include/gr2/types.h b/libgr2/include/gr2/types.h index c4dea162..738736c5 100644 --- a/libgr2/include/gr2/types.h +++ b/libgr2/include/gr2/types.h @@ -12,6 +12,17 @@ namespace gr2 { using Mat4 = std::array; // 行主序,Granny 原生。坐标约定见 docs/reference/steps/M0-gr2-reader.md「约定」 +// granny_transform(SRT 分量原样;Flags: 1=HasPosition 2=HasOrientation 4=HasScaleShear)。 +// 动画混合要在分量上做(GrannySampleModelAnimations 累加 SRT 再归一),不能在 4x4 上做。 +struct Transform { + uint32_t flags = 0; + float position[3] = {0, 0, 0}; + float orientation[4] = {0, 0, 0, 1}; // x,y,z,w + float scale_shear[9] = {1,0,0, 0,1,0, 0,0,1}; // 行主序 3x3 +}; +// BuildCompositeTransform4x4:上 3x3 = transpose(R3·SS3),平移在 elem 12..14。 +Mat4 compose(const Transform& t); + // ── 骨架 ────────────────────────────────────────────────────────────── struct Bone { std::string name; @@ -19,6 +30,7 @@ struct Bone { Mat4 local_transform{}; // granny_transform SRT → 4x4(组合顺序照 granny_transform.cpp) Mat4 inverse_world{}; // InverseWorld4x4,来自文件 uint32_t lt_flags = 0; // granny_transform.Flags:哪部分非单位 + Transform local; // LocalTransform 的 SRT 分量(local_transform = compose(local)) }; struct Skeleton { @@ -44,6 +56,14 @@ struct TriGroup { int32_t tri_count; }; +// 顶点类型的一个成员(granny_data_type_definition 的平铺子集;type = granny_member_type 序数)。 +struct VertexMember { + std::string name; + int32_t type = 0; + int32_t array_width = 0; // 0 => 1 + uint32_t offset = 0; // 在顶点里的字节偏移(打包) +}; + struct Mesh { struct BoneBounds { float min[3] = {}, max[3] = {}; @@ -63,6 +83,12 @@ struct Mesh { // tri_groups[i].material_index 索引本表。 std::vector material_textures; bool rigid = false; // GrannyMeshIsRigid + std::vector bone_binding_names; // granny_bone_binding.BoneName,与 bone_bounds 平行 + std::vector material_bindings; // granny_mesh.MaterialBindings[i].Material → FileInfo::materials 索引(-1 = 空) + // 原始顶点:文件声明的顶点类型 + 按它打包的字节(Granny 运行时按名字做布局转换用) + std::vector vertex_members; + uint32_t vertex_stride = 0; + std::vector raw_vertices; // vertices.size() * vertex_stride }; // ── 动画 ────────────────────────────────────────────────────────────── @@ -82,6 +108,9 @@ struct Curve { void eval(float t, float* out) const; }; +struct TextTrackEntry { float time_stamp = 0.0f; std::string text; }; +struct TextTrack { std::string name; std::vector entries; }; + struct BoneTrack { std::string bone_name; int32_t bone_index = -1; // 映射到 skeleton(未映射 = -1) @@ -91,11 +120,17 @@ struct BoneTrack { Curve position; // dim 3 Curve orientation; // dim 4(四元数 x,y,z,w) Curve scale_shear; // dim 9(3x3)或 dim 3 + // t 处的 SRT(缺的曲线取单位分量,flags 只标出有曲线的分量)。sample_local 的 4x4 = compose(这个)。 + void sample(float t, Transform& out) const; }; struct Animation { std::string name; float duration = 0.0f; + float time_step = 0.0f; + float oversampling = 1.0f; + int32_t track_group_count = 0; + std::vector text_tracks; // TrackGroups[0].TextTracks std::vector tracks; // t 处每个 track 的局部 4x4(granny_transform 组合语义,行主序)。 // out 按 tracks 顺序;bone_index 见各 track。 @@ -103,9 +138,26 @@ struct Animation { }; // 顶层 granny_material(driven by root Materials[])。name + 解析出的漫反射贴图。 +// root Materials[] 之外、只经 Maps[] / mesh MaterialBindings 可达的子材质追加在后面。 +struct MaterialMap { + std::string usage; // granny_material_map.Usage("Diffuse Color" 等) + int32_t material = -1; // FileInfo::materials 索引 +}; struct Material { std::string name; std::string diffuse_texture; // granny_texture.FromFileName 原样 + std::string texture; // 本材质自己的 Texture.FromFileName(空 = 无 Texture) + std::vector maps; // granny_material.Maps + int32_t two_sided = 0; // ExtendedData 的 Int32 "Two-sided" + bool has_two_sided = false; +}; + +// granny_model:Skeleton + InitialPlacement + MeshBindings。 +struct Model { + std::string name; + int32_t skeleton = -1; // FileInfo::skeletons 索引 + Transform initial_placement; + std::vector mesh_bindings; // FileInfo::meshes 索引(-1 = 未解析) }; // ── FileInfo 汇总(T4)──────────────────────────────────────────────── @@ -115,6 +167,7 @@ struct FileInfo { std::vector meshes; std::vector animations; std::vector materials; + std::vector models; uint32_t material_count = 0; uint32_t texture_count = 0; uint32_t model_count = 0; diff --git a/libgr2/src/gr2_anim.cpp b/libgr2/src/gr2_anim.cpp index 7cf524f6..1f13edec 100644 --- a/libgr2/src/gr2_anim.cpp +++ b/libgr2/src/gr2_anim.cpp @@ -98,11 +98,47 @@ bool File::Impl::extract_animation(Ref anim_obj, Ref anim_type, const Skeleton* out.name = rd_str(member_slot(anim_obj, *m)); if (const TypeMember* m = find_member(ams, "Duration")) out.duration = rd_f32(member_slot(anim_obj, *m)); + if (const TypeMember* m = find_member(ams, "TimeStep")) + out.time_step = rd_f32(member_slot(anim_obj, *m)); + if (const TypeMember* m = find_member(ams, "Oversampling")) + out.oversampling = rd_f32(member_slot(anim_obj, *m)); const TypeMember* mTG = find_member(ams, "TrackGroups"); if (!mTG) return true; auto groups = read_array_of_refs(anim_obj, *mTG); + out.track_group_count = int32_t(groups.size()); const auto& tgms = parse_type(mTG->ref_type); + + // TrackGroups[0].TextTracks: RefToArray text_track{String Name; RefToArray Entries( + // text_track_entry{Real32 TimeStamp; String Text})}(motion event 用) + if (!groups.empty() && groups[0].valid()) + if (const TypeMember* mTx = find_member(tgms, "TextTracks")) { + Ref xb; uint32_t xc = 0, xs = 0; + if (read_ref_to_array(groups[0], *mTx, xb, xc, xs) && xc && xs) { + const auto& xms = parse_type(mTx->ref_type); + const TypeMember* mXN = find_member(xms, "Name"); + const TypeMember* mXE = find_member(xms, "Entries"); + for (uint32_t i = 0; i < xc && i < 4096; ++i) { + Ref x = {xb.section, xb.offset + i * xs}; + TextTrack tt; + if (mXN) tt.name = rd_str(member_slot(x, *mXN)); + Ref eb; uint32_t ec = 0, es = 0; + if (mXE && read_ref_to_array(x, *mXE, eb, ec, es) && ec && es) { + const auto& ems = parse_type(mXE->ref_type); + const TypeMember* mTS = find_member(ems, "TimeStamp"); + const TypeMember* mTT = find_member(ems, "Text"); + for (uint32_t k = 0; k < ec && k < 65536; ++k) { + Ref e = {eb.section, eb.offset + k * es}; + TextTrackEntry te; + if (mTS) te.time_stamp = rd_f32(member_slot(e, *mTS)); + if (mTT) te.text = rd_str(member_slot(e, *mTT)); + tt.entries.push_back(std::move(te)); + } + } + out.text_tracks.push_back(std::move(tt)); + } + } + } const TypeMember* mTT = find_member(tgms, "TransformTracks"); if (!mTT) return true; @@ -225,49 +261,29 @@ void Curve::eval(float t, float* out) const { } } -// t 处每个 track 的局部 4x4(BuildCompositeTransform4x4 语义:C 上 3x3 = transpose(R3*SS3), -// 平移在 elem 12..14)。position 缺省 (0,0,0),orientation 缺省单位四元数,scaleshear 缺省 I。 -void Animation::sample_local(float t, std::vector& out) const { - out.assign(tracks.size(), Mat4{1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}); - for (size_t ti = 0; ti < tracks.size(); ++ti) { - const BoneTrack& tr = tracks[ti]; - float pos[3] = {0, 0, 0}; - float ori[4] = {0, 0, 0, 1}; - float ss[9] = {1,0,0, 0,1,0, 0,0,1}; - if (!tr.position.empty()) tr.position.eval(t, pos); - if (!tr.orientation.empty()) tr.orientation.eval(t, ori); - bool have_ss = false; - if (!tr.scale_shear.empty()) { - if (tr.scale_shear.dim == 9) { tr.scale_shear.eval(t, ss); have_ss = true; } - else if (tr.scale_shear.dim == 3) { - float s[3]; tr.scale_shear.eval(t, s); - ss[0] = s[0]; ss[4] = s[1]; ss[8] = s[2]; have_ss = true; - } +// t 处的 SRT。position 缺省 (0,0,0),orientation 缺省单位四元数,scaleshear 缺省 I。 +void BoneTrack::sample(float t, Transform& out) const { + out = Transform{}; + if (!position.empty()) { position.eval(t, out.position); out.flags |= 0x1; } + if (!orientation.empty()) { orientation.eval(t, out.orientation); out.flags |= 0x2; } + if (!scale_shear.empty()) { + if (scale_shear.dim == 9) { scale_shear.eval(t, out.scale_shear); out.flags |= 0x4; } + else if (scale_shear.dim == 3) { + float s[3]; scale_shear.eval(t, s); + out.scale_shear[0] = s[0]; out.scale_shear[4] = s[1]; out.scale_shear[8] = s[2]; + out.flags |= 0x4; } + } +} - // R3 (行主序) from quat - const float xx = ori[0]*ori[0], yy = ori[1]*ori[1], zz = ori[2]*ori[2]; - const float xy = ori[0]*ori[1], xz = ori[0]*ori[2], yz = ori[1]*ori[2]; - const float wx = ori[3]*ori[0], wy = ori[3]*ori[1], wz = ori[3]*ori[2]; - float r3[9] = { - 1 - 2*(yy+zz), 2*(xy-wz), 2*(xz+wy), - 2*(xy+wz), 1 - 2*(xx+zz), 2*(yz-wx), - 2*(xz-wy), 2*(yz+wx), 1 - 2*(xx+yy) - }; - float u3[9]; - if (have_ss) { - for (int r = 0; r < 3; ++r) - for (int c = 0; c < 3; ++c) - u3[r*3+c] = r3[r*3+0]*ss[0*3+c] + r3[r*3+1]*ss[1*3+c] + r3[r*3+2]*ss[2*3+c]; - } else { - for (int k = 0; k < 9; ++k) u3[k] = r3[k]; - } - Mat4& m = out[ti]; - m = Mat4{}; - m[0] = u3[0]; m[1] = u3[3]; m[2] = u3[6]; m[3] = 0; - m[4] = u3[1]; m[5] = u3[4]; m[6] = u3[7]; m[7] = 0; - m[8] = u3[2]; m[9] = u3[5]; m[10] = u3[8]; m[11] = 0; - m[12] = pos[0]; m[13] = pos[1]; m[14] = pos[2]; m[15] = 1; +// t 处每个 track 的局部 4x4(BuildCompositeTransform4x4 语义:C 上 3x3 = transpose(R3*SS3), +// 平移在 elem 12..14)。 +void Animation::sample_local(float t, std::vector& out) const { + out.resize(tracks.size()); + Transform x; + for (size_t ti = 0; ti < tracks.size(); ++ti) { + tracks[ti].sample(t, x); + out[ti] = compose(x); } } diff --git a/libgr2/src/gr2_fileinfo.cpp b/libgr2/src/gr2_fileinfo.cpp index 5b98232b..47e0f3b5 100644 --- a/libgr2/src/gr2_fileinfo.cpp +++ b/libgr2/src/gr2_fileinfo.cpp @@ -35,18 +35,12 @@ bool File::Impl::build_fileinfo(FileInfo& out, LoadError* err) { out.material_count = count_of("Materials"); out.model_count = count_of("Models"); - // ── 顶层材质表(调试 / 备用查找)──────────────────────────────────── + // ── 材质图:root Materials[] 先入表(索引 = 文件顺序),子材质 / 只经 mesh 可达的追加 ── + mats_out = &out.materials; + mat_refs.clear(); if (const TypeMember* mMa = find_member(rms, "Materials")) { auto refs = read_array_of_refs(root_obj, *mMa); - const auto& mams = parse_type(mMa->ref_type); - const TypeMember* mMN = find_member(mams, "Name"); - for (Ref r : refs) { - if (!r.valid()) continue; - Material mat; - if (mMN) mat.name = rd_str(member_slot(r, *mMN)); - mat.diffuse_texture = material_texture_name(r, mMa->ref_type, 0); - out.materials.push_back(std::move(mat)); - } + for (Ref r : refs) intern_material(r, mMa->ref_type); } // ── 骨架(T5)──────────────────────────────────────────────────── @@ -88,6 +82,7 @@ bool File::Impl::build_fileinfo(FileInfo& out, LoadError* err) { out.skeletons = skels_cache; // ── 网格(T6)──────────────────────────────────────────────────── + std::vector mesh_refs; // 与 out.meshes 平行(model.MeshBindings 关联用) if (const TypeMember* mMe = find_member(rms, "Meshes")) { auto refs = read_array_of_refs(root_obj, *mMe); for (Ref r : refs) { @@ -97,7 +92,45 @@ bool File::Impl::build_fileinfo(FileInfo& out, LoadError* err) { fprintf(stderr, "[gr2] mesh ref (%d,%u) -> %s name=%s verts=%zu idx=%zu\n", r.section, r.offset, ok ? "OK" : "FAIL", me.name.c_str(), me.vertices.size(), me.indices.size()); - if (ok) out.meshes.push_back(std::move(me)); + if (ok) { out.meshes.push_back(std::move(me)); mesh_refs.push_back(r); } + } + } + + // ── 模型:granny_model{String Name; Reference Skeleton; Transform InitialPlacement; + // RefToArray MeshBindings(model_mesh_binding{Reference Mesh}); VariantRef ExtendedData} + if (const TypeMember* mMo = find_member(rms, "Models")) { + auto refs = read_array_of_refs(root_obj, *mMo); + const auto& moms = parse_type(mMo->ref_type); + const TypeMember* mN = find_member(moms, "Name"); + const TypeMember* mSk = find_member(moms, "Skeleton"); + const TypeMember* mIP = find_member(moms, "InitialPlacement"); + const TypeMember* mMB = find_member(moms, "MeshBindings"); + auto same = [](Ref a, Ref b) { return a.section == b.section && a.offset == b.offset; }; + for (Ref r : refs) { + if (!r.valid()) continue; + Model mo; + if (mN) mo.name = rd_str(member_slot(r, *mN)); + if (mSk) { + Ref sref = read_reference(r, *mSk); + for (size_t k = 0; k < skel_refs.size(); ++k) + if (same(skel_refs[k], sref)) { mo.skeleton = int32_t(k); break; } + } + if (mIP) read_transform(member_slot(r, *mIP), mo.initial_placement); + Ref bb; uint32_t bc = 0, bs = 0; + if (mMB && read_ref_to_array(r, *mMB, bb, bc, bs) && bc && bs) { + const auto& bms = parse_type(mMB->ref_type); + const TypeMember* mMesh = find_member(bms, "Mesh"); + for (uint32_t i = 0; i < bc && i < 4096; ++i) { + int32_t idx = -1; + if (mMesh) { + Ref me = read_reference({bb.section, bb.offset + i * bs}, *mMesh); + for (size_t k = 0; k < mesh_refs.size(); ++k) + if (same(mesh_refs[k], me)) { idx = int32_t(k); break; } + } + mo.mesh_bindings.push_back(idx); + } + } + out.models.push_back(std::move(mo)); } } @@ -113,6 +146,7 @@ bool File::Impl::build_fileinfo(FileInfo& out, LoadError* err) { } } + mats_out = nullptr; return true; } diff --git a/libgr2/src/gr2_mesh.cpp b/libgr2/src/gr2_mesh.cpp index 340e2d6b..f02cc82b 100644 --- a/libgr2/src/gr2_mesh.cpp +++ b/libgr2/src/gr2_mesh.cpp @@ -134,6 +134,13 @@ bool File::Impl::extract_mesh(Ref mesh_obj, Ref mesh_type, if ((uint64_t)vdata.offset + (uint64_t)vcount * stride > sections[vdata.section].data.size()) return false; + out.vertex_stride = stride; + for (const auto& m : vfmt) + out.vertex_members.push_back({m.name, m.type, m.array_width, m.offset}); + { + const uint8_t* vb = sections[vdata.section].data.data() + vdata.offset; + out.raw_vertices.assign(vb, vb + size_t(vcount) * stride); + } out.vertices.resize(vcount); for (int32_t i = 0; i < vcount; ++i) { const uint8_t* base = sections[vdata.section].data.data() + vdata.offset + size_t(i) * stride; @@ -220,11 +227,14 @@ bool File::Impl::extract_mesh(Ref mesh_obj, Ref mesh_type, for (uint32_t i = 0; i < mc; ++i) { Ref e = {mb.section, mb.offset + i * ms}; std::string tn; + int32_t mi = -1; if (mMat) { Ref mat = read_reference(e, *mMat); tn = material_texture_name(mat, mMat->ref_type, 0); + mi = intern_material(mat, mMat->ref_type); } out.material_textures.push_back(std::move(tn)); + out.material_bindings.push_back(mi); } } } @@ -269,6 +279,7 @@ bool File::Impl::extract_mesh(Ref mesh_obj, Ref mesh_type, if (dangling == 0) break; } out.bone_bindings = std::move(best); + out.bone_binding_names = std::move(names); } } return true; @@ -310,4 +321,59 @@ std::string File::Impl::material_texture_name(Ref mat_obj, Ref mat_type, int dep return {}; } +// granny_material {String Name; RefToArray Maps(material_map{String Usage; Reference Material}); +// Reference Texture; VariantRef ExtendedData} +int32_t File::Impl::intern_material(Ref mat_obj, Ref mat_type, int depth) { + if (!mats_out || !mat_obj.valid() || !mat_type.valid() || depth > 8) return -1; + for (size_t k = 0; k < mat_refs.size(); ++k) + if (mat_refs[k].section == mat_obj.section && mat_refs[k].offset == mat_obj.offset) + return int32_t(k); + + const int32_t idx = int32_t(mats_out->size()); + mats_out->emplace_back(); + mat_refs.push_back(mat_obj); + + const auto& mms = parse_type(mat_type); + Material mat; + if (const TypeMember* m = find_member(mms, "Name")) mat.name = rd_str(member_slot(mat_obj, *m)); + mat.diffuse_texture = material_texture_name(mat_obj, mat_type, 0); + if (const TypeMember* mTex = find_member(mms, "Texture")) { + Ref tex = read_reference(mat_obj, *mTex); + if (tex.valid()) + if (const TypeMember* mFN = find_member(parse_type(mTex->ref_type), "FromFileName")) + mat.texture = rd_str(member_slot(tex, *mFN)); + } + if (const TypeMember* mE = find_member(mms, "ExtendedData")) + mat.has_two_sided = extended_i32(member_slot(mat_obj, *mE), "Two-sided", mat.two_sided); + if (const TypeMember* mMaps = find_member(mms, "Maps")) { + Ref b; uint32_t c = 0, s = 0; + if (read_ref_to_array(mat_obj, *mMaps, b, c, s) && c && s) { + const auto& mapT = parse_type(mMaps->ref_type); + const TypeMember* mU = find_member(mapT, "Usage"); + const TypeMember* mSub = find_member(mapT, "Material"); + if (!mSub) mSub = find_member(mapT, "Map"); + for (uint32_t i = 0; i < c && i < 64; ++i) { + Ref e = {b.section, b.offset + i * s}; + MaterialMap mm; + if (mU) mm.usage = rd_str(member_slot(e, *mU)); + if (mSub) mm.material = intern_material(read_reference(e, *mSub), mSub->ref_type, depth + 1); + mat.maps.push_back(std::move(mm)); + } + } + } + (*mats_out)[idx] = std::move(mat); + return idx; +} + +// VariantRef 在 32 位文件里 = {ptr Type; ptr Object}。 +bool File::Impl::extended_i32(Ref slot, const char* name, int32_t& out) { + Ref type = follow(slot); + Ref obj = follow({slot.section, slot.offset + 4}); + if (!type.valid() || !obj.valid()) return false; + const TypeMember* m = find_member(parse_type(type), name); + if (!m || (m->type != detail::MT_Int32 && m->type != detail::MT_UInt32)) return false; + out = rd_i32(member_slot(obj, *m)); + return true; +} + } // namespace gr2 diff --git a/libgr2/src/gr2_skeleton.cpp b/libgr2/src/gr2_skeleton.cpp index d64277ec..6cca011c 100644 --- a/libgr2/src/gr2_skeleton.cpp +++ b/libgr2/src/gr2_skeleton.cpp @@ -57,32 +57,43 @@ void m3_mul(const float a[9], const float b[9], float r[9]) { } // namespace // granny_transform (68B: u32 Flags; f32 Position[3]; f32 Orientation[4]; f32 ScaleShear[3][3]) -// → 行主序 4x4,上 3x3 = transpose(U3),平移在 elem 12..14。BuildCompositeTransform4x4 语义。 -void File::Impl::transform_to_composite(Ref tf, Mat4& out, uint32_t& flags) const { +void File::Impl::read_transform(Ref tf, Transform& out) const { + out = Transform{}; const uint8_t* p = at(tf, 68); - out = Mat4{}; - out[0] = out[5] = out[10] = out[15] = 1.0f; - flags = 0; if (!p) return; + std::memcpy(&out.flags, p, 4); + std::memcpy(out.position, p + 4, 12); + std::memcpy(out.orientation, p + 16, 16); + std::memcpy(out.scale_shear, p + 32, 36); +} - auto f32 = [&](size_t off) { float v; std::memcpy(&v, p + off, 4); return v; }; - flags = rd_u32(tf); - float pos[3] = { f32(4), f32(8), f32(12) }; - float ori[4] = { f32(16), f32(20), f32(24), f32(28) }; - float ss[9]; - for (int i = 0; i < 9; ++i) ss[i] = f32(32 + size_t(i) * 4); - +// → 行主序 4x4,上 3x3 = transpose(U3),平移在 elem 12..14。BuildCompositeTransform4x4 语义。 +Mat4 compose(const Transform& t) { float q3[9]; - quat_to_m3(ori, q3); + quat_to_m3(t.orientation, q3); float u3[9]; - if (flags & 0x4 /* HasScaleShear */) m3_mul(q3, ss, u3); + if (t.flags & 0x4 /* HasScaleShear */) m3_mul(q3, t.scale_shear, u3); else std::memcpy(u3, q3, sizeof u3); + Mat4 out{}; // C 的上 3x3 = transpose(U3) out[0] = u3[0]; out[1] = u3[3]; out[2] = u3[6]; out[3] = 0; out[4] = u3[1]; out[5] = u3[4]; out[6] = u3[7]; out[7] = 0; out[8] = u3[2]; out[9] = u3[5]; out[10] = u3[8]; out[11] = 0; - out[12] = pos[0]; out[13] = pos[1]; out[14] = pos[2]; out[15] = 1; + out[12] = t.position[0]; out[13] = t.position[1]; out[14] = t.position[2]; out[15] = 1; + return out; +} + +void File::Impl::transform_to_composite(Ref tf, Mat4& out, uint32_t& flags) const { + Transform t; + read_transform(tf, t); + if (!at(tf, 68)) { + out = Mat4{1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; + flags = 0; + return; + } + out = compose(t); + flags = t.flags; } // skeleton: {String Name; RefToArray Bones(bone[]); int32 LODType; VariantRef ExtendedData} @@ -118,9 +129,9 @@ bool File::Impl::extract_skeleton(Ref skel_obj, Ref skel_type, Skeleton& out) { Bone& bo = out.bones[i]; if (mName) bo.name = rd_str(member_slot(b, *mName)); if (mParent) bo.parent = rd_i32(member_slot(b, *mParent)); - uint32_t flags = 0; - transform_to_composite(member_slot(b, *mLocal), bo.local_transform, flags); - bo.lt_flags = flags; + read_transform(member_slot(b, *mLocal), bo.local); + bo.local_transform = compose(bo.local); + bo.lt_flags = bo.local.flags; const uint8_t* iw = at(member_slot(b, *mInvW), 64); if (iw) for (int k = 0; k < 16; ++k) std::memcpy(&bo.inverse_world[k], iw + k * 4, 4); else bo.inverse_world = Mat4{}; diff --git a/libgr2/src/internal.h b/libgr2/src/internal.h index fe86893f..1d975928 100644 --- a/libgr2/src/internal.h +++ b/libgr2/src/internal.h @@ -125,6 +125,15 @@ struct File::Impl { // granny_transform (68B) → 行主序 4x4(BuildCompositeTransform4x4 语义) void transform_to_composite(Ref tf, Mat4& out, uint32_t& flags) const; + void read_transform(Ref tf, Transform& out) const; // 68B → SRT 分量 + + // granny_material 图:按对象 Ref 去重,缺的追加到 mats_out(子材质 / 只经 mesh 可达的材质)。 + // 返回 FileInfo::materials 索引;无效 / 递归太深 = -1。 + int32_t intern_material(Ref mat_obj, Ref mat_type, int depth = 0); + std::vector* mats_out = nullptr; + std::vector mat_refs; // 与 *mats_out 平行 + // ExtendedData(VariantRef = {type ptr; object ptr})里取名为 name 的 Int32。 + bool extended_i32(Ref variant_slot, const char* name, int32_t& out); std::vector skels_cache; // self-check 复用 std::vector skel_refs; // 与 skels_cache 平行:各 skeleton 对象的 Ref(model 关联用) diff --git a/libgr2/tests/animation.cpp b/libgr2/tests/animation.cpp index 7b110e10..da90efa3 100644 --- a/libgr2/tests/animation.cpp +++ b/libgr2/tests/animation.cpp @@ -2,6 +2,7 @@ #include #include +#include int main() { // ScaleShearCurve uses 9 values per control point. A quadratic span reads @@ -24,5 +25,32 @@ int main() { return 1; } } + + // BoneTrack::sample fills SRT components and flags; sample_local = compose(sample). + gr2::BoneTrack track; + track.position.degree = 1; + track.position.dim = 3; + track.position.knots = {0.0f, 1.0f}; + track.position.controls = {0.0f, 0.0f, 0.0f, 2.0f, 4.0f, 6.0f}; + track.orientation.degree = 0; + track.orientation.dim = 4; + track.orientation.knots = {0.0f}; + track.orientation.controls = {0.0f, 0.0f, 0.70710678f, 0.70710678f}; // 90 deg about Z + gr2::Transform x; + track.sample(0.5f, x); + if (x.flags != 3 || std::fabs(x.position[0] - 1.0f) > 1e-5f || std::fabs(x.position[2] - 3.0f) > 1e-5f) { + std::fprintf(stderr, "BoneTrack::sample flags=%u pos=%f,%f,%f\n", x.flags, x.position[0], x.position[1], x.position[2]); + return 1; + } + gr2::Animation anim; + anim.tracks.push_back(track); + std::vector local; + anim.sample_local(0.5f, local); + const gr2::Mat4 m = gr2::compose(x); + // Row-major composite: row 0 is the rotated X axis (0,1,0); translation in 12..14. + if (local.size() != 1 || local[0] != m || std::fabs(m[1] - 1.0f) > 1e-5f || std::fabs(m[12] - 1.0f) > 1e-5f) { + std::fprintf(stderr, "compose mismatch m[1]=%f m[12]=%f\n", m[1], m[12]); + return 1; + } return 0; }