port 2V2-d.2: Granny runtime on libgr2, main character model animates
Implement the Granny SDK 2.11 API the client uses on top of libgr2 (platform/EterGrnLib/GrannyRuntime.cpp, shim granny.h declared from the SDK header): file sections, type-definition vertex conversion, material textures by Usage, mesh/bone bindings, deformer, control clock/loop/ease and weighted SRT sampling. Port EterGrnLib (LODController, Material, Mesh, Model, ModelInstance*, Motion, Thing, ThingInstance, Util) plus EterLib GrpObjectInstance/GrpCollisionObject/CollisionData verbatim and drop their platform skeletons and pending stand-ins; register the gr2 resource factory; vertex/index buffers are CPU-side until the 2V2-e render adapter. app.UpdateGame/RenderGame now run 40250's bodies, reaching the CPythonApplication members through their singletons (the platform has no app object); CPythonGraphic joins GameSingletons in member order, and GetMousePosition reads the host cursor. port.login_flow asserts the main instance's PART_MAIN model has meshes, its diffuse image loaded and the WAIT motion moves the bones between frames; offline and live pass, port_gate macos PASS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5266b00c6e
commit
668f48d6ec
@@ -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 <float.h> 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"]}
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
{
|
||||
"reference": "EterLib/CollisionData.cpp",
|
||||
"reference_sha256": "fab6fd82a68e8b974702d24fd0f6f68be7481f1e08db7627bccd88b656dfc647",
|
||||
"priority": "P4",
|
||||
"contracts": [],
|
||||
"functions": {
|
||||
"DestroyCollisionInstanceSystem": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:DestroyCollisionInstanceSystem"
|
||||
]
|
||||
},
|
||||
"CBaseCollisionInstance::BuildCollisionInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CBaseCollisionInstance::BuildCollisionInstance"
|
||||
]
|
||||
},
|
||||
"CBaseCollisionInstance::Destroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CBaseCollisionInstance::Destroy"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::GetAttribute": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::GetAttribute"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::Render"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::OnDestroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnDestroy"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::OnMovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnMovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::OnCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CSphereCollisionInstance::OnGetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CSphereCollisionInstance::OnGetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::GetAttribute": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::GetAttribute"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::OnMovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnMovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::OnCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::OnGetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnGetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::Render"
|
||||
]
|
||||
},
|
||||
"CPlaneCollisionInstance::OnDestroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CPlaneCollisionInstance::OnDestroy"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::GetAttribute": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::GetAttribute"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::CollideCylinderVSDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::CollideCylinderVSDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::OnMovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnMovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::OnCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::OnGetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnGetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::Render"
|
||||
]
|
||||
},
|
||||
"CCylinderCollisionInstance::OnDestroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CCylinderCollisionInstance::OnDestroy"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::GetAttribute": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::GetAttribute"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::OnMovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnMovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::OnCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::OnGetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnGetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::Render"
|
||||
]
|
||||
},
|
||||
"CAABBCollisionInstance::OnDestroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:CAABBCollisionInstance::OnDestroy"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::GetAttribute": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::GetAttribute"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::OnMovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnMovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::OnCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::OnGetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnGetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::Render"
|
||||
]
|
||||
},
|
||||
"COBBCollisionInstance::OnDestroy": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/CollisionData.cpp:COBBCollisionInstance::OnDestroy"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"reference": "EterLib/GrpCollisionObject.cpp",
|
||||
"reference_sha256": "911a796b466fe60910def8d88631b5db5dacbf7709871ae955f8ac3e056fe31b",
|
||||
"priority": "P4",
|
||||
"contracts": [],
|
||||
"functions": {
|
||||
"CGraphicCollisionObject::IntersectBoundBox": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectBoundBox"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectCube": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectCube"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectIndexedMesh": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectIndexedMesh"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectMesh": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectMesh"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectTriangle": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectTriangle"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectSphere"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::IntersectCylinder": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::IntersectCylinder"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::CGraphicCollisionObject": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::CGraphicCollisionObject"
|
||||
]
|
||||
},
|
||||
"CGraphicCollisionObject::~CGraphicCollisionObject": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpCollisionObject.cpp:CGraphicCollisionObject::~CGraphicCollisionObject"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
{
|
||||
"reference": "EterLib/GrpObjectInstance.cpp",
|
||||
"reference_sha256": "cae9c29b006be59602b9915796fcdd10f2dd320f6969dd5b9f21d08868f015d8",
|
||||
"priority": "P4",
|
||||
"contracts": [],
|
||||
"functions": {
|
||||
"CGraphicObjectInstance::OnInitialize": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::OnInitialize"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Clear": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Clear"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Render": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Render"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::BlendRender": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::BlendRender"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::RenderToShadowMap": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderToShadowMap"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::RenderShadow": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderShadow"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::RenderPCBlocker": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RenderPCBlocker"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Update": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Update"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Deform": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Deform"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Transform": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Transform"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetPosition": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPosition"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetScale": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetScale"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetRotation": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetRotation"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetYaw": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetYaw"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetPitch": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPitch"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetRoll": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetRoll"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetTransform": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetTransform"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetRotationQuaternion": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotationQuaternion"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetRotationMatrix": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotationMatrix"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetRotation": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetRotation"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetPosition": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetPosition"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetScale": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetScale"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Show": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Show"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Hide": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Hide"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::isShow": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::isShow"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetWTBBoxVertex": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetWTBBoxVertex"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::isIntersect": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::isIntersect"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::CGraphicObjectInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::CGraphicObjectInstance"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::Initialize": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::Initialize"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::~CGraphicObjectInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::~CGraphicObjectInstance"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::UpdateBoundingSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateBoundingSphere"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::RegisterBoundingSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::RegisterBoundingSphere"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::AddCollision": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::AddCollision"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::ClearCollision": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::ClearCollision"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::CollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::CollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::MovementCollisionDynamicSphere": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::MovementCollisionDynamicSphere"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetCollisionMovementAdjust": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionMovementAdjust"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::UpdateCollisionData": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateCollisionData"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetCollisionInstanceCount": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionInstanceCount"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetCollisionInstanceData": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetCollisionInstanceData"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetHeightInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetHeightInstance"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::ClearHeightInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::ClearHeightInstance"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::UpdateHeightInstance": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::UpdateHeightInstance"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::IsObjectHeight": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::IsObjectHeight"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetObjectHeight": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetObjectHeight"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::SetPortal": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::SetPortal"
|
||||
]
|
||||
},
|
||||
"CGraphicObjectInstance::GetPortal": {
|
||||
"status": "PORTED",
|
||||
"impl": [
|
||||
"extension/src/port/EterLib/GrpObjectInstance.cpp:CGraphicObjectInstance::GetPortal"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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 <header> <符号...> [--ctor]` 按链接缺失符号生成到 `platform/pending/<Lib>/`,返回 `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}` 的实际依赖闭包。验收为输入经过新路径
|
||||
|
||||
@@ -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()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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<bool>();
|
||||
}
|
||||
|
||||
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<BOOL>();
|
||||
}
|
||||
|
||||
auto CGrannyLODController::GetModelInstance() -> CGrannyModelInstance *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyModelInstance *>();
|
||||
}
|
||||
|
||||
auto CGrannyLODController::SetCurrentModelInstance(CGrannyModelInstance *) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyLODController::RefreshAttachedModelInstance() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyLODController::__ReserveSharedDeformableVertexBuffer(DWORD) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::IsIn(const char *, int *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::SetImagePointer(int, CGraphicImage *) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::GetType() const -> CGrannyMaterial::EType
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyMaterial::EType>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::GetImagePointer(int) const -> CGraphicImage *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGraphicImage *>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::GetDiffuseTexture() const -> const CGraphicTexture *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGraphicTexture *>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::GetOpacityTexture() const -> const CGraphicTexture *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGraphicTexture *>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::GetD3DTexture(int) const -> LPDIRECT3DTEXTURE8
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<LPDIRECT3DTEXTURE8>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::__GetImagePointer(const char *) -> CGraphicImage *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGraphicImage *>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::__IsSpecularEnable() const -> BOOL
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BOOL>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterial::__GetSpecularPower() const -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
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<DWORD>();
|
||||
}
|
||||
|
||||
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<CGrannyMaterial &>();
|
||||
}
|
||||
|
||||
auto CGrannyMaterialPalette::GetMaterialCount() const -> DWORD
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<DWORD>();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::CreateFromGrannyMeshPointer(granny_skeleton *, granny_mesh *, int, int, CGrannyMaterialPalette &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::IsTwoSide() const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetVertexCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetDefaultBoneIndices() const -> int *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int *>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetVertexBasePosition() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetIndexBasePosition() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetGrannyMeshPointer() const -> const granny_mesh *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const granny_mesh *>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::GetTriGroupNodeList(CGrannyMaterial::EType) const -> const CGrannyMesh::TTriGroupNode *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGrannyMesh::TTriGroupNode *>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::CreateFromGrannyModelPointer(granny_model *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::CreateDeviceObjects() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetDeformVertexCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetVertexCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::CanDeformPNTVertices() const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::DeformPNTVertices(void *, D3DXMATRIX *, const std::vector<granny_mesh_binding *> &) const -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetIdxCount() -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetMeshCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetMeshPointer(int) -> CGrannyMesh *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyMesh *>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetGrannyModelPointer() -> granny_model *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<granny_model *>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetMeshPointer(int) const -> const CGrannyMesh *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGrannyMesh *>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetPNTD3DVertexBuffer() const -> LPDIRECT3DVERTEXBUFFER8
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<LPDIRECT3DVERTEXBUFFER8>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetD3DIndexBuffer() const -> LPDIRECT3DINDEXBUFFER8
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<LPDIRECT3DINDEXBUFFER8>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetMeshNodeList(CGrannyMesh::EType, CGrannyMaterial::EType) const -> const CGrannyModel::TMeshNode *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGrannyModel::TMeshNode *>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::LockVertices(void **, void **) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::UnlockVertices() const -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModel::GetMaterialPalette() const -> const CGrannyMaterialPalette &
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const CGrannyMaterialPalette &>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::LoadMeshs() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::LoadPNTVertices() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::LoadIndices() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::Initialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModel::CheckMeshIndex(int) const -> BOOL
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BOOL>();
|
||||
}
|
||||
|
||||
auto CGrannyModel::AppendMeshNode(CGrannyMesh::EType, CGrannyMaterial::EType, int) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModel::__LoadVertices() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
@@ -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<CGrannyModelInstance *>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::Clear() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::CreateDeviceObjects() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<CGrannyModel *>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<int>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetLocalTime() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetNextTime() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetDeformableVertexCount() -> DWORD
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<DWORD>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetVertexCount() -> DWORD
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<DWORD>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetBoneMatrixPointer(int) const -> const float *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const float *>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetCompositeBoneMatrixPointer(int) const -> const float *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const float *>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetMeshMatrixPointer(int, const D3DXMATRIX **) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::GetBoneIndexByName(const char *, int *) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__DestroyMeshBindingVector() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__GetMeshBoneIndices(unsigned int) const -> int *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int *>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__IsDeformableVertexBuffer() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__SetSharedDeformableVertexBuffer(CGraphicVertexBuffer *) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__GetDeformableD3DVertexBufferPtr() -> IDirect3DVertexBuffer8 *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<IDirect3DVertexBuffer8 *>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__GetDeformableVertexBufferRef() -> CGraphicVertexBuffer &
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGraphicVertexBuffer &>();
|
||||
}
|
||||
|
||||
auto CGrannyModelInstance::__GetWorldPosePtr() const -> granny_world_pose *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<granny_world_pose *>();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::Destroy() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::BindGrannyAnimation(granny_animation *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::GetGrannyAnimationPointer() const -> granny_animation *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<granny_animation *>();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::GetName() const -> const char *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const char *>();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::GetDuration() const -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::GetTextTrack(const char *, int *, float *) const -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGrannyMotion::Initialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
@@ -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::TType>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::DestroyDeviceObjects() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThing::CheckModelIndex(int) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::GetModelPointer(int) -> CGrannyModel *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyModel *>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::GetModelCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::CheckMotionIndex(int) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::GetMotionPointer(int) -> CGrannyMotion *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyMotion *>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::GetMotionCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::Initialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThing::LoadModels() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::LoadMotions() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::OnLoad(int, const void *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::OnClear() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThing::OnIsEmpty() const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThing::OnIsType(TType) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::Picking(const D3DXVECTOR3 &, const D3DXVECTOR3 &, float &, float &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::OnInitialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::CreateDeviceObjects() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::CheckModelThingIndex(int) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::CheckMotionThingIndex(DWORD) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetMotionThingPointer(DWORD, CGraphicThing **) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::IsMotionThing() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBonePosition(int, int, float *, float *, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<float>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetLocalTime() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetSecondElapsed() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetAverageSecondElapsed() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetLODLevel(DWORD) -> BYTE
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BYTE>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetHeight() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
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<DWORD>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetLODControllerPointer(DWORD) const -> CGrannyLODController *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyLODController *>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetLODControllerPointer(DWORD) -> CGrannyLODController *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGrannyLODController *>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::ReloadTexture() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBaseThingPtr() -> CGraphicThing *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CGraphicThing *>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::SetMotion(DWORD, float, int, float) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::ChangeMotion(DWORD, int, float) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::Intersect(float *, float *, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBoundBox(D3DXVECTOR3 *, D3DXVECTOR3 *) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBoundBox(DWORD, D3DXVECTOR3 *, D3DXVECTOR3 *) -> BOOL
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BOOL>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBoneMatrix(DWORD, DWORD, D3DXMATRIX **) -> BOOL
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BOOL>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetCompositeBoneMatrix(DWORD, DWORD, D3DXMATRIX **) -> BOOL
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<BOOL>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicThingInstance::GetBoundingAABB(D3DXVECTOR3 &, D3DXVECTOR3 &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<CGraphicThingInstance *>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
@@ -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 <cstdint>
|
||||
#include <vector>
|
||||
|
||||
struct MtCpuVertexBuffer : IDirect3DVertexBuffer8
|
||||
{
|
||||
std::vector<uint8_t> bytes;
|
||||
DWORD fvf = 0;
|
||||
};
|
||||
|
||||
struct MtCpuIndexBuffer : IDirect3DIndexBuffer8
|
||||
{
|
||||
std::vector<uint8_t> 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;
|
||||
}
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectBoundBox(const D3DXMATRIX *, const TBoundBox &, float *, float *, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectMesh(const D3DXMATRIX *, const void *, DWORD, DWORD, D3DXVECTOR3 &, D3DXVECTOR3 &, float *, float *, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 &, float, const D3DXVECTOR3 &, const D3DXVECTOR3 &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 &, float, float, const D3DXVECTOR3 &, const D3DXVECTOR3 &) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectSphere(const D3DXVECTOR3 &, float) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicCollisionObject::IntersectCylinder(const D3DXVECTOR3 &, float, float) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
@@ -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<MtCpuIndexBuffer*>(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<WORD*>(index_bytes(m_lpd3dIdxBuf));
|
||||
|
||||
for (int i = 0; i<faceCount; ++i, dstIndices+=3)
|
||||
{
|
||||
TFace * curFace=faces+i;
|
||||
dstIndices[0]=curFace->indices[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<MtCpuIndexBuffer*>(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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Create(int, TFace *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::CreateDeviceObjects() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::DestroyDeviceObjects() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Copy(int, const void *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Lock(void **) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Unlock() const -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Lock(void **) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
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<LPDIRECT3DINDEXBUFFER8>();
|
||||
}
|
||||
|
||||
auto CGraphicIndexBuffer::Initialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
Destroy();
|
||||
}
|
||||
|
||||
@@ -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<const D3DXVECTOR3 &>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetScale() const -> const D3DXVECTOR3 &
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<const D3DXVECTOR3 &>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetRotation() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetYaw() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetPitch() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetRoll() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::isIntersect(const CRay &, float *, float *, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetWTBBoxVertex(const unsigned char &) -> D3DXVECTOR4 &
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<D3DXVECTOR4 &>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetTransform() -> D3DXMATRIX &
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<D3DXMATRIX &>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::SetPortal(DWORD, int) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetPortal(DWORD) -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::MovementCollisionDynamicSphere(const CDynamicSphereInstance &) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetCollisionMovementAdjust(const CDynamicSphereInstance &) const -> D3DXVECTOR3
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<D3DXVECTOR3>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::UpdateCollisionData(const CStaticCollisionDataVector *) -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetCollisionInstanceCount() -> DWORD
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<DWORD>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetCollisionInstanceData(DWORD) -> CBaseCollisionInstance *
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<CBaseCollisionInstance *>();
|
||||
}
|
||||
|
||||
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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicObjectInstance::GetObjectHeight(float, float, float *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
@@ -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<MtCpuVertexBuffer*>(m_lpd3dVB)->bytes.data();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGraphicVertexBuffer::Lock(void ** pretVertices) const
|
||||
{
|
||||
if (!m_lpd3dVB)
|
||||
return false;
|
||||
|
||||
*pretVertices = static_cast<MtCpuVertexBuffer*>(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<MtCpuVertexBuffer*>(m_lpd3dVB)->bytes.data();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGraphicVertexBuffer::Lock(void ** pretVertices)
|
||||
{
|
||||
if (!m_lpd3dVB)
|
||||
return false;
|
||||
|
||||
*pretVertices = static_cast<MtCpuVertexBuffer*>(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<MtCpuVertexBuffer*>(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<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::CreateDeviceObjects() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::DestroyDeviceObjects() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Copy(int, const void *) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::LockRange(unsigned int, void **) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Lock(void **) const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Unlock() const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::LockDynamic(void **) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Lock(void **) -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Unlock() -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::SetStream(int, int) const -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::GetVertexCount() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::GetVertexStride() const -> int
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<int>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::GetFlexibleVertexFormat() const -> DWORD
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<DWORD>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::IsEmpty() const -> bool
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CGraphicVertexBuffer::Initialize() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
Destroy();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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<bool>();
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 "<face>:<size>[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(); }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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); }
|
||||
@@ -68,3 +68,13 @@ auto CMapManager::isAttrOn(int, int, BYTE) -> bool
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CMapManager::BeginEnvironment() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
auto CMapManager::EndEnvironment() -> void
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
}
|
||||
|
||||
@@ -94,3 +94,69 @@ auto CPythonBackground::GetPickingPointWithRayOnlyTerrain(const CRay &, D3DXVECT
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
auto CPythonBackground::GetFarClip() -> float
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<float>();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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<CGraphicVertexBuffer*> gs_vbs[SHARED_VB_NUM];
|
||||
|
||||
static CGraphicVertexBuffer gs_emptyVB;
|
||||
|
||||
#include <time.h>
|
||||
|
||||
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<CGraphicVertexBuffer*>& 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<CGraphicVertexBuffer*>& vbs = gs_vbs[i];
|
||||
#ifdef _DEBUG
|
||||
TraceError("\t%d: %d", i, vbs.size());
|
||||
#endif
|
||||
|
||||
std::vector<CGraphicVertexBuffer*>::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<CGrannyModelInstance *>::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<CGrannyModelInstance *>::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<CGrannyModelInstance *>::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<TAttachingModelData>::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 (fSize<LODHEIGHT_ACTOR)
|
||||
SetLODLimits(0.0f, LODDISTANCE_ACTOR);
|
||||
else
|
||||
//
|
||||
SetLODLimits(0.0f, LODDISTANCE_BUILDING);
|
||||
}
|
||||
else
|
||||
{
|
||||
// FIXME : CModelInstance::m_pgrnWorldPose를 Update에서 사용하는데,
|
||||
// Deform을 하지 않으면 NULL 입니다. 구조가 조금 바뀌어야 할지도.. - [levites]
|
||||
pModelInstance->DeformNoSkin(&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<TAttachingModelData>::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<TAttachingModelData>::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<float>(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<CGrannyModelInstance *>::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;
|
||||
}
|
||||
@@ -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<CGraphicImage*>(pResource);
|
||||
}
|
||||
}
|
||||
// END_OF_SUPPORT_LOCAL_TEXTURE
|
||||
|
||||
|
||||
CResource* pResource = rkResMgr.GetResourcePointer(fileName);
|
||||
return static_cast<CGraphicImage*>(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; uMapIndex<SPHEREMAP_NUM; ++uMapIndex)
|
||||
ms_akSphereMapInstance[uMapIndex].Destroy();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CGrannyMaterialPalette::CGrannyMaterialPalette()
|
||||
{
|
||||
}
|
||||
|
||||
CGrannyMaterialPalette::~CGrannyMaterialPalette()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
|
||||
void CGrannyMaterialPalette::Copy(const CGrannyMaterialPalette& rkMtrlPalSrc)
|
||||
{
|
||||
m_mtrlVector=rkMtrlPalSrc.m_mtrlVector;
|
||||
}
|
||||
|
||||
void CGrannyMaterialPalette::Clear()
|
||||
{
|
||||
m_mtrlVector.clear();
|
||||
}
|
||||
|
||||
CGrannyMaterial& CGrannyMaterialPalette::GetMaterialRef(DWORD mtrlIndex)
|
||||
{
|
||||
assert(mtrlIndex<m_mtrlVector.size());
|
||||
return *m_mtrlVector[mtrlIndex].GetPointer();
|
||||
}
|
||||
|
||||
void CGrannyMaterialPalette::SetMaterialImagePointer(const char* c_szImageName, CGraphicImage* pImage)
|
||||
{
|
||||
DWORD size=m_mtrlVector.size();
|
||||
DWORD i;
|
||||
for (i=0; i<size; ++i)
|
||||
{
|
||||
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
|
||||
|
||||
int iStage;
|
||||
if (roMtrl->IsIn(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<CGrannyMaterial::TRef>::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<CGrannyMaterial::TRef>::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; i<size; ++i)
|
||||
{
|
||||
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
|
||||
|
||||
int iStage;
|
||||
if (roMtrl->IsIn(c_szMtrlName, &iStage))
|
||||
{
|
||||
roMtrl->SetSpecularInfo(bEnable, fPower, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i=0; i<size; ++i)
|
||||
{
|
||||
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
|
||||
roMtrl->SetSpecularInfo(bEnable, fPower, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DWORD CGrannyMaterialPalette::RegisterMaterial(granny_material* pgrnMaterial)
|
||||
{
|
||||
DWORD size=m_mtrlVector.size();
|
||||
DWORD i;
|
||||
for (i=0; i<size; ++i)
|
||||
{
|
||||
CGrannyMaterial::TRef& roMtrl=m_mtrlVector[i];
|
||||
if (roMtrl->IsEqual(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);
|
||||
}
|
||||
*/
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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<granny_mesh_binding*>& 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();
|
||||
}
|
||||
@@ -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> 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();
|
||||
}
|
||||
@@ -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<TBoundBox> 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; m<mc_pMeshVector->size(); ++m)
|
||||
{
|
||||
const CThing::TMesh& rmesh=mc_pMeshVector->at(m);
|
||||
|
||||
for (int b=0; b<rmesh.pgrnMesh->BoneBindingCount; ++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);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -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(iMeshBinding<m_vct_pgrnMeshBinding.size());
|
||||
return (int*)GrannyGetMeshBindingToBoneIndices(m_vct_pgrnMeshBinding[iMeshBinding]);
|
||||
}
|
||||
|
||||
bool CGrannyModelInstance::__CreateMeshBindingVector(CGrannyModelInstance* pkDstModelInst)
|
||||
{
|
||||
assert(m_vct_pgrnMeshBinding.empty());
|
||||
|
||||
if (!m_pModel)
|
||||
return false;
|
||||
|
||||
granny_model* pgrnModel = m_pModel->GetGrannyModelPointer();
|
||||
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();
|
||||
}
|
||||
*/
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -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<float>(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
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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> 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()<pkThingInst->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<DWORD, CGraphicThing::TRef *>::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)<uPartCount(%d), c_szImageName=%s, pImage=%s) - ePart OUT OF RANGE",
|
||||
ePart, m_LODControllerVector.size(), c_szImageName, pImage->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)<uPartCount(%d)) - ePart OUT OF RANGE",
|
||||
ePart, m_LODControllerVector.size());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_LODControllerVector[ePart])
|
||||
{
|
||||
TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)) - ePart Data is NULL",
|
||||
ePart, m_LODControllerVector.size());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
m_LODControllerVector[ePart]->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)<uPartCount(%d)) - ePart OUT OF RANGE",
|
||||
ePart, m_LODControllerVector.size());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!m_LODControllerVector[ePart])
|
||||
{
|
||||
TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)) - ePart Data is NULL",
|
||||
ePart, m_LODControllerVector.size());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
m_LODControllerVector[ePart]->SetSpecularInfo(c_szMtrlName, bEnable, fPower);
|
||||
}
|
||||
|
||||
bool CGraphicThingInstance::SetMotion(DWORD dwMotionKey, float blendTime, int loopCount, float speedRatio)
|
||||
{
|
||||
if (!CheckMotionThingIndex(dwMotionKey))
|
||||
return false;
|
||||
|
||||
std::map<DWORD, CGraphicThing::TRef *>::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<DWORD, CGraphicThing::TRef *>::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<DWORD, CGraphicThing::TRef *>::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<CGrannyLODController*>::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()
|
||||
{
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<CSphereCollisionInstance> gs_sci;
|
||||
CDynamicPool<CCylinderCollisionInstance> gs_cci;
|
||||
CDynamicPool<CPlaneCollisionInstance> gs_pci;
|
||||
CDynamicPool<CAABBCollisionInstance> gs_aci;
|
||||
CDynamicPool<COBBCollisionInstance> 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);
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#pragma once
|
||||
// Shim for RAD Granny 2.11 <granny.h> (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 <granny.h> (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 <stdint.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -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 <memory>
|
||||
@@ -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<CGrannyMaterialPalette*>(&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<float> 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<float> before = bones();
|
||||
CHECK(pump_until(3, [&] { return bones() != before; }));
|
||||
}
|
||||
}
|
||||
if (server)
|
||||
{
|
||||
|
||||
@@ -12,6 +12,17 @@ namespace gr2 {
|
||||
|
||||
using Mat4 = std::array<float, 16>; // 行主序,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<std::string> material_textures;
|
||||
bool rigid = false; // GrannyMeshIsRigid
|
||||
std::vector<std::string> bone_binding_names; // granny_bone_binding.BoneName,与 bone_bounds 平行
|
||||
std::vector<int32_t> material_bindings; // granny_mesh.MaterialBindings[i].Material → FileInfo::materials 索引(-1 = 空)
|
||||
// 原始顶点:文件声明的顶点类型 + 按它打包的字节(Granny 运行时按名字做布局转换用)
|
||||
std::vector<VertexMember> vertex_members;
|
||||
uint32_t vertex_stride = 0;
|
||||
std::vector<uint8_t> 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<TextTrackEntry> 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<TextTrack> text_tracks; // TrackGroups[0].TextTracks
|
||||
std::vector<BoneTrack> 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<MaterialMap> 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<int32_t> mesh_bindings; // FileInfo::meshes 索引(-1 = 未解析)
|
||||
};
|
||||
|
||||
// ── FileInfo 汇总(T4)────────────────────────────────────────────────
|
||||
@@ -115,6 +167,7 @@ struct FileInfo {
|
||||
std::vector<Mesh> meshes;
|
||||
std::vector<Animation> animations;
|
||||
std::vector<Material> materials;
|
||||
std::vector<Model> models;
|
||||
uint32_t material_count = 0;
|
||||
uint32_t texture_count = 0;
|
||||
uint32_t model_count = 0;
|
||||
|
||||
+57
-41
@@ -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<Mat4>& 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<Mat4>& 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+45
-11
@@ -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<Ref> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+29
-18
@@ -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{};
|
||||
|
||||
@@ -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<Material>* mats_out = nullptr;
|
||||
std::vector<Ref> 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<Skeleton> skels_cache; // self-check 复用
|
||||
std::vector<Ref> skel_refs; // 与 skels_cache 平行:各 skeleton 对象的 Ref(model 关联用)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
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<gr2::Mat4> 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user