2V2-e.1: 3D draw-command channel — recording D3D8 device, StateManager, GrpBase, camera

EterLib/StateManager.cpp and GrpBase.cpp ported verbatim. CGraphicDevice::Create builds a platform
IDirect3DDevice8 that keeps the device state and records every Draw* call as a Render3DDraw
(vertices decoded by FVF, strips/fans expanded, textures, world/view/proj, blend/depth/light state).
The 40250 camera (__UpdateCamera, SetCenterPosition, ...) and the Process order
(__UpdateCamera -> OnCameraUpdate -> OnUIUpdate -> Begin/SetInterfaceRenderState/OnUIRender/End)
are in place; CScreen Begin/End, CPythonGraphic render states and CCullingManager::Process matrix
updates are verbatim. port.login_flow asserts a textured, lit character draw under the RH
perspective with every vertex on screen; offline and live pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 20:15:54 +09:00
co-authored by Claude Opus 5.5
parent 668f48d6ec
commit 5bfa13c5cc
27 changed files with 3616 additions and 777 deletions
+1
View File
@@ -517,3 +517,4 @@
{"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"]}
{"time": "2026-09-23T11:09:12Z", "event": "port_round", "unit": "PORT-PLAN 2V2-e.1: 3D draw-command channel (recording D3D8 device, StateManager, GrpBase, camera)", "ported": ["EterLib/StateManager.cpp", "EterLib/GrpBase.cpp"], "adapted": ["platform/EterLib/RecordingDevice.cpp: IDirect3DDevice8 that records every Draw* as Render3DDraw (RenderCommands3D.h)", "CGraphicDevice::Create on the recording device, CPU default IB/PDT VBs", "D3DXMath PerspectiveFovRH/OrthoRH/OrthoOffCenterRH + ID3DXMatrixStack", "PythonApplicationCamera.cpp: __UpdateCamera and camera API verbatim, members in a file-static struct", "Process: __UpdateCamera, OnCameraUpdate, Begin/SetInterfaceRenderState/OnUIRender/End", "CScreen Begin/End/Set*Operation, CPythonGraphic Set{Game,Interface}RenderState/PushState/PopState/GetOrthoDepth, CCullingManager::Process view/proj (no frustum culling yet)", "pending CPythonPlayer main-actor functions (no event handler), CMapManager::IsMapReady"], "divergent": [], "needs_live": [], "tests": ["port.login_flow: pass (textured lit triangle draw, RH perspective, all vertices on screen)", "port.login_live: pass against 192.168.21.203", "script/port_gate.sh macos: PASS"], "todo": ["2V2-e.2 Godot consumer of Render3DDraws + offline screenshot", "2V2-e.3 live smoke", "SphereLib frustum culling", "PythonPlayerEventHandler"]}
+296
View File
@@ -0,0 +1,296 @@
{
"reference": "EterLib/GrpBase.cpp",
"reference_sha256": "c0e9ca5417117c5ac4b03436a1e64c9318265c203872b8fd949452cea8d0afa2",
"priority": "P4",
"contracts": [],
"functions": {
"PixelPositionToD3DXVECTOR3": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:PixelPositionToD3DXVECTOR3"
]
},
"D3DXVECTOR3ToPixelPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:D3DXVECTOR3ToPixelPosition"
]
},
"CGraphicBase::IsLowTextureMemory": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::IsLowTextureMemory"
]
},
"CGraphicBase::IsHighTextureMemory": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::IsHighTextureMemory"
]
},
"CGraphicBase::IsFastTNL": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::IsFastTNL"
]
},
"CGraphicBase::IsTLVertexClipping": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::IsTLVertexClipping"
]
},
"CGraphicBase::GetBackBufferSize": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetBackBufferSize"
]
},
"CGraphicBase::SetDefaultIndexBuffer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetDefaultIndexBuffer"
]
},
"CGraphicBase::SetPDTStream": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetPDTStream"
]
},
"CGraphicBase::GetAvailableTextureMemory": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetAvailableTextureMemory"
]
},
"CGraphicBase::GetViewMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetViewMatrix"
]
},
"CGraphicBase::GetIdentityMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetIdentityMatrix"
]
},
"CGraphicBase::SetEyeCamera": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetEyeCamera"
]
},
"CGraphicBase::SetSimpleCamera": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetSimpleCamera"
]
},
"CGraphicBase::SetAroundCamera": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetAroundCamera"
]
},
"CGraphicBase::SetPositionCamera": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetPositionCamera"
]
},
"CGraphicBase::SetOrtho2D": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetOrtho2D"
]
},
"CGraphicBase::SetOrtho3D": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetOrtho3D"
]
},
"CGraphicBase::SetPerspective": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetPerspective"
]
},
"CGraphicBase::UpdateProjMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::UpdateProjMatrix"
]
},
"CGraphicBase::UpdateViewMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::UpdateViewMatrix"
]
},
"CGraphicBase::UpdatePipeLineMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::UpdatePipeLineMatrix"
]
},
"CGraphicBase::SetViewport": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetViewport"
]
},
"CGraphicBase::GetTargetPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetTargetPosition"
]
},
"CGraphicBase::GetCameraPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetCameraPosition"
]
},
"CGraphicBase::GetMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetMatrix"
]
},
"CGraphicBase::GetMatrixPointer": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetMatrixPointer"
]
},
"CGraphicBase::GetSphereMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetSphereMatrix"
]
},
"CGraphicBase::GetFOV": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetFOV"
]
},
"CGraphicBase::PushMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::PushMatrix"
]
},
"CGraphicBase::Scale": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::Scale"
]
},
"CGraphicBase::Rotate": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::Rotate"
]
},
"CGraphicBase::RotateLocal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::RotateLocal"
]
},
"CGraphicBase::MultMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::MultMatrix"
]
},
"CGraphicBase::MultMatrixLocal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::MultMatrixLocal"
]
},
"CGraphicBase::RotateYawPitchRollLocal": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::RotateYawPitchRollLocal"
]
},
"CGraphicBase::Translate": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::Translate"
]
},
"CGraphicBase::LoadMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::LoadMatrix"
]
},
"CGraphicBase::PopMatrix": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::PopMatrix"
]
},
"CGraphicBase::GetColor": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetColor"
]
},
"CGraphicBase::InitScreenEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::InitScreenEffect"
]
},
"CGraphicBase::SetScreenEffectWaving": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetScreenEffectWaving"
]
},
"CGraphicBase::SetScreenEffectFlashing": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::SetScreenEffectFlashing"
]
},
"CGraphicBase::GetFaceCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetFaceCount"
]
},
"CGraphicBase::ResetFaceCount": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::ResetFaceCount"
]
},
"CGraphicBase::GetLastResult": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::GetLastResult"
]
},
"CGraphicBase::CGraphicBase": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::CGraphicBase"
]
},
"CGraphicBase::~CGraphicBase": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/GrpBase.cpp:CGraphicBase::~CGraphicBase"
]
}
}
}
@@ -0,0 +1,332 @@
{
"reference": "EterLib/StateManager.cpp",
"reference_sha256": "97c47e6dc6c3c4d9f4a867dfe41f4ea0586d0db74d91e55c0cf03f28092dd00d",
"priority": "P4",
"contracts": [],
"functions": {
"CStateManager::SetLight": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetLight"
]
},
"CStateManager::GetLight": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetLight"
]
},
"CStateManager::BeginScene": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::BeginScene"
]
},
"CStateManager::EndScene": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::EndScene"
]
},
"CStateManager::CStateManager": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::CStateManager"
]
},
"CStateManager::~CStateManager": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::~CStateManager"
]
},
"CStateManager::SetDevice": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetDevice"
]
},
"CStateManager::SetBestFiltering": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetBestFiltering"
]
},
"CStateManager::Restore": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::Restore"
]
},
"CStateManager::SetDefaultState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetDefaultState"
]
},
"CStateManager::SaveMaterial": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveMaterial"
]
},
"CStateManager::RestoreMaterial": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreMaterial"
]
},
"CStateManager::SetMaterial": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetMaterial"
]
},
"CStateManager::GetMaterial": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetMaterial"
]
},
"CStateManager::GetRenderState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetRenderState"
]
},
"CStateManager::SaveRenderState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveRenderState"
]
},
"CStateManager::RestoreRenderState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreRenderState"
]
},
"CStateManager::SetRenderState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetRenderState"
]
},
"CStateManager::SaveTexture": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveTexture"
]
},
"CStateManager::RestoreTexture": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreTexture"
]
},
"CStateManager::SetTexture": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetTexture"
]
},
"CStateManager::GetTexture": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetTexture"
]
},
"CStateManager::SaveTextureStageState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveTextureStageState"
]
},
"CStateManager::RestoreTextureStageState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreTextureStageState"
]
},
"CStateManager::SetTextureStageState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetTextureStageState"
]
},
"CStateManager::GetTextureStageState": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetTextureStageState"
]
},
"CStateManager::SaveVertexShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveVertexShader"
]
},
"CStateManager::RestoreVertexShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreVertexShader"
]
},
"CStateManager::SetVertexShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetVertexShader"
]
},
"CStateManager::GetVertexShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetVertexShader"
]
},
"CStateManager::SavePixelShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SavePixelShader"
]
},
"CStateManager::RestorePixelShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestorePixelShader"
]
},
"CStateManager::SetPixelShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetPixelShader"
]
},
"CStateManager::GetPixelShader": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetPixelShader"
]
},
"CStateManager::SaveTransform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveTransform"
]
},
"CStateManager::RestoreTransform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreTransform"
]
},
"CStateManager::SetTransform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetTransform"
]
},
"CStateManager::GetTransform": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::GetTransform"
]
},
"CStateManager::SaveVertexShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveVertexShaderConstant"
]
},
"CStateManager::RestoreVertexShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreVertexShaderConstant"
]
},
"CStateManager::SetVertexShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetVertexShaderConstant"
]
},
"CStateManager::SavePixelShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SavePixelShaderConstant"
]
},
"CStateManager::RestorePixelShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestorePixelShaderConstant"
]
},
"CStateManager::SetPixelShaderConstant": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetPixelShaderConstant"
]
},
"CStateManager::SaveStreamSource": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveStreamSource"
]
},
"CStateManager::RestoreStreamSource": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreStreamSource"
]
},
"CStateManager::SetStreamSource": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetStreamSource"
]
},
"CStateManager::SaveIndices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SaveIndices"
]
},
"CStateManager::RestoreIndices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::RestoreIndices"
]
},
"CStateManager::SetIndices": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::SetIndices"
]
},
"CStateManager::DrawPrimitive": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::DrawPrimitive"
]
},
"CStateManager::DrawPrimitiveUP": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::DrawPrimitiveUP"
]
},
"CStateManager::DrawIndexedPrimitive": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::DrawIndexedPrimitive"
]
},
"CStateManager::DrawIndexedPrimitiveUP": {
"status": "PORTED",
"impl": [
"extension/src/port/EterLib/StateManager.cpp:CStateManager::DrawIndexedPrimitiveUP"
]
}
}
}
+1 -1
View File
@@ -423,7 +423,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
| 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: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 |
| 2V2-e | Godot 显示主角(渲染 adapter),离线 + 真服 smoke:进游戏看到可辨认的静止角色 | 进行中。e.1 完成:3D 绘制命令通道。`EterLib/StateManager.cpp`、`EterLib/GrpBase.cpp` 原样移植(platform 骨架删除,port-map 标 PORTED);`CGraphicDevice::Create` 建平台 `IDirect3DDevice8`(`platform/EterLib/RecordingDevice.cpp`:记住 transform/渲染状态/贴图阶段/材质/灯光/FVF/流/索引,按 FVF 解码顶点、展开 strip/fan,每次 Draw* 记成一条 `Render3DDraw`,`RenderCommands3D.h`),默认 IB/PDT VB 为 CPU 缓冲;`D3DXMath` 补 `PerspectiveFovRH`/`OrthoRH`/`OrthoOffCenterRH` 与 `ID3DXMatrixStack`。相机:`PythonApplicationCamera.cpp` 原样移植 `__UpdateCamera`/`SetCamera`/`SetCenterPosition`/`GetCenterPosition` 等(成员放文件内静态结构,平台没有 `CPythonApplication` 对象),`Process` 按 40250 顺序调 `__UpdateCamera`→`OnCameraUpdate`→`OnUIUpdate`→`Begin`/`SetInterfaceRenderState`/`OnUIRender`/`End`;`CScreen::Begin/End/Set*Operation`、`CPythonGraphic::Set{Game,Interface}RenderState/PushState/PopState/GetOrthoDepth`、`CCullingManager::Process` 的 view/proj 更新(视锥剔除等 SphereLib)原样;`pending` 补 `CPythonPlayer::NEW_GetMainActorPosition/NEW_GetMainActorPtr/NEW_FindActorPtr/SetMainCharacterIndex`(事件处理器留待 `PythonPlayerEventHandler`)、`CMapManager::IsMapReady`。`port.login_flow` 断言某帧有贴图、带法线/UV 的三角形绘制,投影为 `SetPerspective` 的 RH 透视(_34=-1),且顶点全部落在屏幕内(相机对准主角);离线与 `port.login_live`(192.168.21.203)2026-09-23 通过。下一步 e.2 Godot 消费端 |
4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、
`InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径
改变位置/朝向、发送与 40250 相同的移动封包,并在离线边界测试和真服 smoke 中通过。接通时删除对应 legacy 玩法逻辑。
@@ -11,12 +11,30 @@ struct MtCpuVertexBuffer : IDirect3DVertexBuffer8
{
std::vector<uint8_t> bytes;
DWORD fvf = 0;
HRESULT Lock(UINT offset, UINT size, BYTE** data, DWORD) override
{
if (size_t(offset) + size > bytes.size())
return E_FAIL;
*data = bytes.data() + offset;
return S_OK;
}
HRESULT Unlock() override { return S_OK; }
};
struct MtCpuIndexBuffer : IDirect3DIndexBuffer8
{
std::vector<uint8_t> bytes;
D3DFORMAT format = D3DFMT_INDEX16;
HRESULT Lock(UINT offset, UINT size, BYTE** data, DWORD) override
{
if (size_t(offset) + size > bytes.size())
return E_FAIL;
*data = bytes.data() + offset;
return S_OK;
}
HRESULT Unlock() override { return S_OK; }
};
// D3DXGetFVFVertexSize.
@@ -40,9 +40,16 @@ auto CCullingManager::Update() -> void
MT_PLATFORM_STUB();
}
auto CCullingManager::Process() -> void
// 40250 CullingManager.cpp:105. RenderGame calls it after SetPerspective; it hands the camera's view and
// the projection to CStateManager for the scene.
// PORT: BuildViewFrustum and m_Factory->FrustumTest follow in 40250; the sphere-pack culling (SphereLib)
// is not ported, so every registered object stays visible.
void CCullingManager::Process()
{
MT_PLATFORM_STUB();
//DWORD time = ELTimer_GetMSec();
//Frustum f;
UpdateViewMatrix();
UpdateProjMatrix();
}
auto CCullingManager::FindRange(const Vector3d &, float) -> void
-378
View File
@@ -1,378 +0,0 @@
// Platform skeleton for EterLib/GrpBase.h (40250 EterLib/GrpBase.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/GrpBase.h"
#include "../PlatformStub.h"
#include <cstring>
#include "UIRenderCommands.h"
auto CGraphicBase::GetAvailableTextureMemory() -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CGraphicBase::GetViewMatrix() -> const D3DXMATRIX &
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<const D3DXMATRIX &>();
}
auto CGraphicBase::GetIdentityMatrix() -> const D3DXMATRIX &
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<const D3DXMATRIX &>();
}
CGraphicBase::CGraphicBase()
{
MT_PLATFORM_STUB();
}
CGraphicBase::~CGraphicBase()
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetSimpleCamera(float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetEyeCamera(float, float, float, float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetAroundCamera(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetPositionCamera(float, float, float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::MoveCamera(float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetTargetPosition(float *, float *, float *) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetCameraPosition(float *, float *, float *) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetOrtho2D(float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetOrtho3D(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetPerspective(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetFOV() -> float
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<float>();
}
auto CGraphicBase::PushMatrix() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::MultMatrix(const D3DXMATRIX *) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::MultMatrixLocal(const D3DXMATRIX *) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::Translate(float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::Rotate(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::RotateLocal(float, float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::RotateYawPitchRollLocal(float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::Scale(float, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::PopMatrix() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::LoadMatrix(const D3DXMATRIX &) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetMatrix(D3DXMATRIX *) const -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetMatrixPointer() const -> const D3DXMATRIX *
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<const D3DXMATRIX *>();
}
auto CGraphicBase::GetSphereMatrix(D3DXMATRIX *, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::InitScreenEffect() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetScreenEffectWaving(float, int) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetScreenEffectFlashing(float, const D3DXCOLOR &) -> void
{
MT_PLATFORM_STUB();
}
// 40250 GrpBase.cpp:458: the bytes B, G, R, A of a little-endian D3DCOLOR.
auto CGraphicBase::GetColor(float r, float g, float b, float a) -> DWORD
{
BYTE argb[4] =
{
(BYTE) (255.0f * b),
(BYTE) (255.0f * g),
(BYTE) (255.0f * r),
(BYTE) (255.0f * a)
};
DWORD color;
std::memcpy(&color, argb, sizeof(color));
return color;
}
auto CGraphicBase::GetFaceCount() -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CGraphicBase::ResetFaceCount() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetLastResult() -> HRESULT
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<HRESULT>();
}
auto CGraphicBase::UpdateProjMatrix() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::UpdateViewMatrix() -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetViewport(DWORD, DWORD, DWORD, DWORD, float, float) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::GetBackBufferSize(UINT *width, UINT *height) -> void
{
UIRenderGetSize(width, height);
}
auto CGraphicBase::IsTLVertexClipping() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CGraphicBase::IsFastTNL() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CGraphicBase::IsLowTextureMemory() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CGraphicBase::IsHighTextureMemory() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CGraphicBase::SetDefaultIndexBuffer(UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CGraphicBase::SetPDTStream(SPDTVertexRaw *, UINT) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CGraphicBase::SetPDTStream(SPDTVertex *, UINT) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
decltype(CGraphicBase::ms_matIdentity) CGraphicBase::ms_matIdentity{};
decltype(CGraphicBase::ms_matView) CGraphicBase::ms_matView{};
decltype(CGraphicBase::ms_matProj) CGraphicBase::ms_matProj{};
decltype(CGraphicBase::ms_matInverseView) CGraphicBase::ms_matInverseView{};
decltype(CGraphicBase::ms_matInverseViewYAxis) CGraphicBase::ms_matInverseViewYAxis{};
decltype(CGraphicBase::ms_matWorld) CGraphicBase::ms_matWorld{};
decltype(CGraphicBase::ms_matWorldView) CGraphicBase::ms_matWorldView{};
auto CGraphicBase::UpdatePipeLineMatrix() -> void
{
MT_PLATFORM_STUB();
}
decltype(CGraphicBase::ms_lpSphereMesh) CGraphicBase::ms_lpSphereMesh{};
decltype(CGraphicBase::ms_lpCylinderMesh) CGraphicBase::ms_lpCylinderMesh{};
decltype(CGraphicBase::ms_hLastResult) CGraphicBase::ms_hLastResult{};
decltype(CGraphicBase::ms_iWidth) CGraphicBase::ms_iWidth{};
decltype(CGraphicBase::ms_iHeight) CGraphicBase::ms_iHeight{};
decltype(CGraphicBase::ms_iD3DAdapterInfo) CGraphicBase::ms_iD3DAdapterInfo{};
decltype(CGraphicBase::ms_iD3DDevInfo) CGraphicBase::ms_iD3DDevInfo{};
decltype(CGraphicBase::ms_iD3DModeInfo) CGraphicBase::ms_iD3DModeInfo{};
decltype(CGraphicBase::ms_kD3DDetector) CGraphicBase::ms_kD3DDetector{};
decltype(CGraphicBase::ms_hWnd) CGraphicBase::ms_hWnd{};
decltype(CGraphicBase::ms_hDC) CGraphicBase::ms_hDC{};
decltype(CGraphicBase::ms_lpd3d) CGraphicBase::ms_lpd3d{};
decltype(CGraphicBase::ms_lpd3dDevice) CGraphicBase::ms_lpd3dDevice{};
decltype(CGraphicBase::ms_lpd3dMatStack) CGraphicBase::ms_lpd3dMatStack{};
decltype(CGraphicBase::ms_Viewport) CGraphicBase::ms_Viewport{};
decltype(CGraphicBase::ms_faceCount) CGraphicBase::ms_faceCount{};
decltype(CGraphicBase::ms_d3dCaps) CGraphicBase::ms_d3dCaps{};
decltype(CGraphicBase::ms_d3dPresentParameter) CGraphicBase::ms_d3dPresentParameter{};
decltype(CGraphicBase::ms_dwD3DBehavior) CGraphicBase::ms_dwD3DBehavior{};
decltype(CGraphicBase::ms_ptVS) CGraphicBase::ms_ptVS{};
decltype(CGraphicBase::ms_pntVS) CGraphicBase::ms_pntVS{};
decltype(CGraphicBase::ms_pnt2VS) CGraphicBase::ms_pnt2VS{};
decltype(CGraphicBase::ms_matScreen0) CGraphicBase::ms_matScreen0{};
decltype(CGraphicBase::ms_matScreen1) CGraphicBase::ms_matScreen1{};
decltype(CGraphicBase::ms_matScreen2) CGraphicBase::ms_matScreen2{};
decltype(CGraphicBase::ms_vtPickRayOrig) CGraphicBase::ms_vtPickRayOrig{};
decltype(CGraphicBase::ms_vtPickRayDir) CGraphicBase::ms_vtPickRayDir{};
decltype(CGraphicBase::ms_fFieldOfView) CGraphicBase::ms_fFieldOfView{};
decltype(CGraphicBase::ms_fAspect) CGraphicBase::ms_fAspect{};
decltype(CGraphicBase::ms_fNearY) CGraphicBase::ms_fNearY{};
decltype(CGraphicBase::ms_fFarY) CGraphicBase::ms_fFarY{};
decltype(CGraphicBase::ms_dwWavingEndTime) CGraphicBase::ms_dwWavingEndTime{};
decltype(CGraphicBase::ms_iWavingPower) CGraphicBase::ms_iWavingPower{};
decltype(CGraphicBase::ms_dwFlashingEndTime) CGraphicBase::ms_dwFlashingEndTime{};
decltype(CGraphicBase::ms_FlashingColor) CGraphicBase::ms_FlashingColor{};
decltype(CGraphicBase::ms_Ray) CGraphicBase::ms_Ray{};
decltype(CGraphicBase::ms_bSupportDXT) CGraphicBase::ms_bSupportDXT{};
decltype(CGraphicBase::ms_isLowTextureMemory) CGraphicBase::ms_isLowTextureMemory{};
decltype(CGraphicBase::ms_isHighTextureMemory) CGraphicBase::ms_isHighTextureMemory{};
decltype(CGraphicBase::ms_alpd3dPDTVB) CGraphicBase::ms_alpd3dPDTVB{};
decltype(CGraphicBase::ms_alpd3dDefIB) CGraphicBase::ms_alpd3dDefIB{};
auto PixelPositionToD3DXVECTOR3(const D3DXVECTOR3 &, D3DXVECTOR3 *) -> void
{
MT_PLATFORM_STUB();
}
auto D3DXVECTOR3ToPixelPosition(const D3DXVECTOR3 &, D3DXVECTOR3 *) -> void
{
MT_PLATFORM_STUB();
}
+235 -39
View File
@@ -1,34 +1,143 @@
// Platform skeleton for EterLib/GrpDevice.h (40250 EterLib/GrpDevice.cpp), generated by platform_stub.py.
// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation.
// 40250 EterLib/GrpDevice.cpp over the platform's recording device (RecordingDevice.h): there is no
// Direct3D object, adapter detection or window; Create makes the device, CStateManager, the matrix
// stack and the default buffers as 40250 does. The remaining MT_PLATFORM_STUB() bodies (device reset,
// web-browser mode, driver warnings) have no platform counterpart yet.
#include "EterLib/StdAfx.h"
#include "EterLib/GrpDevice.h"
#include "EterLib/StateManager.h"
#include "EterBase/Stl.h"
#include "CpuBuffer.h"
#include "RecordingDevice.h"
#include <cstring>
#include "../PlatformStub.h"
bool GRAPHICS_CAPS_CAN_NOT_DRAW_LINE = false;
bool GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW = false;
bool GRAPHICS_CAPS_HALF_SIZE_IMAGE = false;
bool GRAPHICS_CAPS_CAN_NOT_TEXTURE_ADDRESS_BORDER = false;
bool GRAPHICS_CAPS_SOFTWARE_TILING = false;
CGraphicDevice::CGraphicDevice()
: m_uBackBufferCount(0)
{
MT_PLATFORM_STUB();
__Initialize();
}
CGraphicDevice::~CGraphicDevice()
{
MT_PLATFORM_STUB();
Destroy();
}
auto CGraphicDevice::InitBackBufferCount(UINT) -> void
void CGraphicDevice::InitBackBufferCount(UINT uBackBufferCount)
{
MT_PLATFORM_STUB();
m_uBackBufferCount=uBackBufferCount;
}
auto CGraphicDevice::Destroy() -> void
void CGraphicDevice::Destroy()
{
MT_PLATFORM_STUB();
__DestroyPDTVertexBufferList();
__DestroyDefaultIndexBufferList();
// PORT: no DC, vertex shader objects or D3DX meshes; the stream "shaders" are FVF codes.
ms_ptVS = 0;
ms_pntVS = 0;
ms_pnt2VS = 0;
safe_release(ms_lpd3dMatStack);
safe_release(ms_lpd3dDevice);
if (m_pStateManager)
{
delete m_pStateManager;
m_pStateManager = NULL;
}
__Initialize();
}
auto CGraphicDevice::Create(HWND, int, int, bool, int, int) -> int
int CGraphicDevice::Create(HWND hWnd, int iHres, int iVres, bool Windowed, int /*iBit*/, int iReflashRate)
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
int iRet = CREATE_OK;
Destroy();
ms_iWidth = iHres;
ms_iHeight = iVres;
// PORT: in place of Direct3DCreate8, the display-mode detection and CreateDevice: the recording
// device renders through Godot, which supports DXT and has no refresh-rate or T&L failures.
ms_hWnd = hWnd;
ms_lpd3dDevice = MtCreateRecordingDevice(iHres, iVres);
ms_dwD3DBehavior = D3DCREATE_HARDWARE_VERTEXPROCESSING;
ms_d3dPresentParameter.BackBufferWidth = iHres;
ms_d3dPresentParameter.BackBufferHeight = iVres;
ms_d3dPresentParameter.Windowed = Windowed;
if (FAILED((ms_hLastResult = ms_lpd3dDevice->GetDeviceCaps(&ms_d3dCaps))))
{
Tracenf("IDirect3DDevice.GetDeviceCaps - ERROR %d", ms_hLastResult);
return CREATE_GET_DEVICE_CAPS2;
}
ms_lpd3dDevice->GetViewport(&ms_Viewport);
m_pStateManager = new CStateManager(ms_lpd3dDevice);
D3DXCreateMatrixStack(0, &ms_lpd3dMatStack);
ms_lpd3dMatStack->LoadIdentity();
ms_ptVS = CreatePTStreamVertexShader();
ms_pntVS = CreatePNTStreamVertexShader();
ms_pnt2VS = CreatePNT2StreamVertexShader();
D3DXMatrixIdentity(&ms_matIdentity);
D3DXMatrixIdentity(&ms_matView);
D3DXMatrixIdentity(&ms_matProj);
D3DXMatrixIdentity(&ms_matInverseView);
D3DXMatrixIdentity(&ms_matInverseViewYAxis);
D3DXMatrixIdentity(&ms_matScreen0);
D3DXMatrixIdentity(&ms_matScreen1);
D3DXMatrixIdentity(&ms_matScreen2);
ms_matScreen0._11 = 1;
ms_matScreen0._22 = -1;
ms_matScreen1._41 = 1;
ms_matScreen1._42 = 1;
ms_matScreen2._11 = (float) iHres / 2;
ms_matScreen2._22 = (float) iVres / 2;
// PORT: no D3DXCreateSphere/D3DXCreateCylinder (debug collision rendering) and no Clear.
if (!__CreateDefaultIndexBufferList())
return false;
if (!__CreatePDTVertexBufferList())
return false;
DWORD dwTexMemSize = GetAvailableTextureMemory();
if (dwTexMemSize < 64 * 1024 * 1024)
ms_isLowTextureMemory = true;
else
ms_isLowTextureMemory = false;
if (dwTexMemSize > 100 * 1024 * 1024)
ms_isHighTextureMemory = true;
else
ms_isHighTextureMemory = false;
if (ms_d3dCaps.TextureAddressCaps & D3DPTADDRESSCAPS_BORDER)
GRAPHICS_CAPS_CAN_NOT_TEXTURE_ADDRESS_BORDER=false;
else
GRAPHICS_CAPS_CAN_NOT_TEXTURE_ADDRESS_BORDER=true;
// PORT: the SIS/3dfx driver checks have no adapter identifier to test.
return (iRet);
}
auto CGraphicDevice::GetDeviceState() -> EDeviceState
@@ -69,9 +178,23 @@ auto CGraphicDevice::RegisterWarningString(UINT, const char *) -> void
MT_PLATFORM_STUB();
}
auto CGraphicDevice::__Initialize() -> void
void CGraphicDevice::__Initialize()
{
MT_PLATFORM_STUB();
ms_iD3DAdapterInfo=D3DADAPTER_DEFAULT;
ms_iD3DDevInfo=D3DADAPTER_DEFAULT;
ms_iD3DModeInfo=D3DADAPTER_DEFAULT;
ms_lpd3d = NULL;
ms_lpd3dDevice = NULL;
ms_lpd3dMatStack = NULL;
ms_dwWavingEndTime = 0;
ms_dwFlashingEndTime = 0;
m_pStateManager = NULL;
__InitializeDefaultIndexBufferList();
__InitializePDTVertexBufferList();
}
auto CGraphicDevice::__IsInDriverBlackList(D3D_CAdapterInfo &) -> bool
@@ -85,60 +208,133 @@ auto CGraphicDevice::__WarningMessage(HWND, UINT) -> void
MT_PLATFORM_STUB();
}
auto CGraphicDevice::__InitializeDefaultIndexBufferList() -> void
void CGraphicDevice::__InitializeDefaultIndexBufferList()
{
MT_PLATFORM_STUB();
for (UINT i=0; i<DEFAULT_IB_NUM; ++i)
ms_alpd3dDefIB[i]=NULL;
}
auto CGraphicDevice::__DestroyDefaultIndexBufferList() -> void
void CGraphicDevice::__DestroyDefaultIndexBufferList()
{
MT_PLATFORM_STUB();
for (UINT i=0; i<DEFAULT_IB_NUM; ++i)
if (ms_alpd3dDefIB[i])
{
delete ms_alpd3dDefIB[i]; // PORT: CPU buffer, no Release
ms_alpd3dDefIB[i]=NULL;
}
}
auto CGraphicDevice::__CreateDefaultIndexBufferList() -> bool
bool CGraphicDevice::__CreateDefaultIndexBufferList()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
static const WORD c_awLineIndices[2] = { 0, 1, };
static const WORD c_awLineTriIndices[6] = { 0, 1, 0, 2, 1, 2, };
static const WORD c_awLineRectIndices[8] = { 0, 1, 0, 2, 1, 3, 2, 3,};
static const WORD c_awLineCubeIndices[24] = {
0, 1, 0, 2, 1, 3, 2, 3,
0, 4, 1, 5, 2, 6, 3, 7,
4, 5, 4, 6, 5, 7, 6, 7,
};
static const WORD c_awFillTriIndices[3]= { 0, 1, 2, };
static const WORD c_awFillRectIndices[6] = { 0, 2, 1, 2, 3, 1, };
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,
};
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_LINE, 2, c_awLineIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_LINE_TRI, 6, c_awLineTriIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_LINE_RECT, 8, c_awLineRectIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_LINE_CUBE, 24, c_awLineCubeIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_FILL_TRI, 3, c_awFillTriIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_FILL_RECT, 6, c_awFillRectIndices))
return false;
if (!__CreateDefaultIndexBuffer(DEFAULT_IB_FILL_CUBE, 36, c_awFillCubeIndices))
return false;
return true;
}
auto CGraphicDevice::__CreateDefaultIndexBuffer(UINT, UINT, const WORD *) -> bool
bool CGraphicDevice::__CreateDefaultIndexBuffer(UINT eDefIB, UINT uIdxCount, const WORD* c_awIndices)
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
assert(ms_alpd3dDefIB[eDefIB]==NULL);
// PORT: a CPU buffer in place of CreateIndexBuffer (CpuBuffer.h).
MtCpuIndexBuffer* pIB = new MtCpuIndexBuffer;
pIB->bytes.resize(sizeof(WORD)*uIdxCount);
pIB->format = D3DFMT_INDEX16;
ms_alpd3dDefIB[eDefIB] = pIB;
WORD* dstIndices;
if (FAILED(
ms_alpd3dDefIB[eDefIB]->Lock(0, 0, (BYTE**)&dstIndices, 0)
)) return false;
memcpy(dstIndices, c_awIndices, sizeof(WORD)*uIdxCount);
ms_alpd3dDefIB[eDefIB]->Unlock();
return true;
}
auto CGraphicDevice::__InitializePDTVertexBufferList() -> void
void CGraphicDevice::__InitializePDTVertexBufferList()
{
MT_PLATFORM_STUB();
for (UINT i=0; i<PDT_VERTEXBUFFER_NUM; ++i)
ms_alpd3dPDTVB[i]=NULL;
}
auto CGraphicDevice::__DestroyPDTVertexBufferList() -> void
void CGraphicDevice::__DestroyPDTVertexBufferList()
{
MT_PLATFORM_STUB();
for (UINT i=0; i<PDT_VERTEXBUFFER_NUM; ++i)
{
if (ms_alpd3dPDTVB[i])
{
delete ms_alpd3dPDTVB[i]; // PORT: CPU buffer, no Release
ms_alpd3dPDTVB[i]=NULL;
}
}
}
auto CGraphicDevice::__CreatePDTVertexBufferList() -> bool
bool CGraphicDevice::__CreatePDTVertexBufferList()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
for (UINT i=0; i<PDT_VERTEXBUFFER_NUM; ++i)
{
// PORT: a CPU buffer in place of CreateVertexBuffer (CpuBuffer.h).
MtCpuVertexBuffer* pVB = new MtCpuVertexBuffer;
pVB->bytes.resize(sizeof(TPDTVertex)*PDT_VERTEX_NUM);
pVB->fvf = D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1;
ms_alpd3dPDTVB[i] = pVB;
}
return true;
}
auto CGraphicDevice::CreatePTStreamVertexShader() -> DWORD
// PORT: the stream vertex shaders are declarations for the fixed-function pipeline; the recording
// device decodes vertices by FVF, so each returns the FVF matching its declaration. PT keeps its
// texture coordinates in stream 1, which the device does not record: stream 0 is position only.
DWORD CGraphicDevice::CreatePTStreamVertexShader()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
assert(ms_lpd3dDevice != NULL);
return D3DFVF_XYZ;
}
auto CGraphicDevice::CreatePNTStreamVertexShader() -> DWORD
DWORD CGraphicDevice::CreatePNTStreamVertexShader()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
assert(ms_lpd3dDevice != NULL);
return D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1;
}
auto CGraphicDevice::CreatePNT2StreamVertexShader() -> DWORD
DWORD CGraphicDevice::CreatePNT2StreamVertexShader()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
assert(ms_lpd3dDevice != NULL);
return D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX2;
}
auto CGraphicDevice::CreateDoublePNTStreamVertexShader() -> DWORD
@@ -9,6 +9,7 @@
#include <cstring>
#include <map>
#include <mutex>
#include <set>
namespace {
unsigned little16(const unsigned char* data) { return data[0] | (unsigned(data[1]) << 8); }
@@ -100,6 +101,25 @@ MemoryTexture* live_memory_texture(const IDirect3DTexture8* texture)
if (entry.second == texture) return entry.second;
return nullptr;
}
// PORT: the IDirect3DTexture8 behind a file texture (CreateFromMemoryFile). The canvas and the 3D
// renderer decode the file themselves; the handle only carries the pack path so a texture bound
// through STATEMANAGER.SetTexture(stage, GetD3DTexture()) can be named.
struct FileTexture : IDirect3DTexture8
{
std::string name;
};
std::set<const FileTexture*> g_file_textures; // guarded by g_memory_mutex
IDirect3DTexture8* new_file_texture(const std::string& name)
{
auto* file = new FileTexture();
file->name = name;
std::lock_guard<std::mutex> lock(g_memory_mutex);
g_file_textures.insert(file);
return file;
}
}
void UIRenderReleaseMemoryTexture(IDirect3DTexture8* texture)
@@ -108,9 +128,22 @@ void UIRenderReleaseMemoryTexture(IDirect3DTexture8* texture)
if (MemoryTexture* memory = live_memory_texture(texture)) {
g_memory.erase(memory->id);
delete memory;
} else if (g_file_textures.erase(static_cast<const FileTexture*>(texture))) {
delete static_cast<FileTexture*>(texture);
}
}
std::string UIRenderTextureNameFromHandle(const IDirect3DBaseTexture8* handle)
{
if (!handle) return {};
const auto* texture = static_cast<const IDirect3DTexture8*>(handle);
std::lock_guard<std::mutex> lock(g_memory_mutex);
if (const MemoryTexture* memory = live_memory_texture(texture))
return "mem:" + std::to_string(memory->id) + "@" + std::to_string(memory->revision);
const auto* file = static_cast<const FileTexture*>(texture);
return g_file_textures.count(file) ? file->name : std::string();
}
bool UIRenderMemoryTexture(const std::string& name, UIMemoryTexture* out)
{
if (name.compare(0, 4, "mem:") != 0 || !out) return false;
@@ -195,6 +228,11 @@ auto CGraphicImageTexture::CreateFromTexturePointer(const CGraphicTexture *sourc
// 40250 shares the source's D3D texture; the canvas names textures by pack path instead.
if (const auto* image = dynamic_cast<const CGraphicImageTexture*>(source))
m_stFileName = image->m_stFileName;
// PORT: 40250 AddRefs the source's texture; this handle is not reference counted, so the copy gets
// its own named handle.
DestroyDeviceObjects();
if (!m_bEmpty && !m_stFileName.empty())
m_lpd3dTexture = new_file_texture(m_stFileName);
}
auto CGraphicImageTexture::CreateFromDiskFile(const char *, D3DFORMAT, DWORD) -> bool
@@ -223,6 +261,8 @@ auto CGraphicImageTexture::CreateFromMemoryFile(UINT size, const void *bytes, D3
if (!width || !height || width > 16384 || height > 16384) return false;
m_width = static_cast<int>(width); m_height = static_cast<int>(height);
m_bEmpty = false;
DestroyDeviceObjects();
m_lpd3dTexture = new_file_texture(m_stFileName);
return true;
}
+46 -13
View File
@@ -2,19 +2,19 @@
// Every MT_PLATFORM_STUB() body is unimplemented: replace it with the platform implementation.
#include "EterLib/StdAfx.h"
#include "EterLib/GrpScreen.h"
#include "EterLib/StateManager.h"
#include "../PlatformStub.h"
#include "UIRenderCommands.h"
#include <algorithm>
// 40250 GrpScreen.cpp:838
CScreen::CScreen()
{
MT_PLATFORM_STUB();
}
CScreen::~CScreen()
{
MT_PLATFORM_STUB();
}
auto CScreen::ClearDepthBuffer() -> void
@@ -27,15 +27,26 @@ auto CScreen::Clear() -> void
MT_PLATFORM_STUB();
}
auto CScreen::Begin() -> bool
// 40250 GrpScreen.cpp:691. CPythonApplication::Process brackets the frame's render with Begin/End; only
// inside the scene does CStateManager hand transforms to the recording device.
bool CScreen::Begin()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
assert(ms_lpd3dDevice != NULL);
ResetFaceCount();
if (!STATEMANAGER.BeginScene())
{
Tracenf("BeginScene FAILED\n");
return false;
}
return true;
}
auto CScreen::End() -> void
// 40250 GrpScreen.cpp:705
void CScreen::End()
{
MT_PLATFORM_STUB();
STATEMANAGER.EndScene();
}
auto CScreen::Show(HWND) -> void
@@ -158,19 +169,41 @@ auto CScreen::RenderCylinder(const D3DXMATRIX *, float, float, float, float, flo
MT_PLATFORM_STUB();
}
auto CScreen::SetColorOperation() -> void
// 40250 GrpScreen.cpp
void CScreen::SetColorOperation()
{
MT_PLATFORM_STUB();
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
auto CScreen::SetDiffuseOperation() -> void
// 40250 GrpScreen.cpp
void CScreen::SetDiffuseOperation()
{
MT_PLATFORM_STUB();
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
auto CScreen::SetBlendOperation() -> void
// 40250 GrpScreen.cpp
void CScreen::SetBlendOperation()
{
MT_PLATFORM_STUB();
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
}
auto CScreen::SetOneColorOperation(D3DXCOLOR &) -> void
@@ -31,7 +31,7 @@ auto CGraphicTexture::GetD3DTexture() const -> LPDIRECT3DTEXTURE8
return m_lpd3dTexture;
}
// PORT: safe_release(m_lpd3dTexture); the only textures this platform creates are memory textures.
// PORT: safe_release(m_lpd3dTexture); the platform textures are memory textures and file-texture handles.
auto CGraphicTexture::DestroyDeviceObjects() -> void
{
if (m_lpd3dTexture)
@@ -0,0 +1,385 @@
#include "RecordingDevice.h"
#include "RenderCommands3D.h"
#include "UIRenderCommands.h"
#include "CpuBuffer.h"
#include <cstring>
#include <mutex>
namespace {
std::mutex g_draws_mutex;
std::vector<Render3DDraw> g_draws;
struct VertexLayout {
unsigned stride = 0;
bool rhw = false;
int normal = -1, diffuse = -1, uv0 = -1, uv1 = -1;
};
// The element offsets of a fixed-function FVF (D3DXGetFVFVertexSize's order).
VertexLayout fvf_layout(DWORD fvf)
{
VertexLayout layout;
unsigned offset = 0;
switch (fvf & D3DFVF_POSITION_MASK)
{
case D3DFVF_XYZ: offset = 12; break;
case D3DFVF_XYZRHW: offset = 16; layout.rhw = true; break;
case D3DFVF_XYZB1: offset = 16; break;
case D3DFVF_XYZB2: offset = 20; break;
case D3DFVF_XYZB3: offset = 24; break;
case D3DFVF_XYZB4: offset = 28; break;
case D3DFVF_XYZB5: offset = 32; break;
}
if (fvf & D3DFVF_NORMAL) { layout.normal = offset; offset += 12; }
if (fvf & D3DFVF_PSIZE) offset += 4;
if (fvf & D3DFVF_DIFFUSE) { layout.diffuse = offset; offset += 4; }
if (fvf & D3DFVF_SPECULAR) offset += 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 };
if (i == 0) layout.uv0 = offset;
if (i == 1) layout.uv1 = offset;
offset += coordSize[(fvf >> (16 + i * 2)) & 3];
}
layout.stride = offset;
return layout;
}
void copy_color(float out[4], const D3DCOLORVALUE& c)
{
out[0] = c.r; out[1] = c.g; out[2] = c.b; out[3] = c.a;
}
class RecordingDevice final : public IDirect3DDevice8
{
public:
RecordingDevice(int width, int height) : m_width(width), m_height(height)
{
static const float identity[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
for (auto& matrix : m_transforms)
std::memcpy(matrix, identity, sizeof(identity));
std::memset(&m_material, 0, sizeof(m_material));
m_material.Diffuse = { 1, 1, 1, 1 };
std::memset(m_lights, 0, sizeof(m_lights));
}
ULONG AddRef() override { return ++m_refs; }
ULONG Release() override
{
const ULONG refs = --m_refs;
if (!refs)
delete this;
return refs;
}
// PORT: a D3D8 HAL on a T&L card (D3DDEVCAPS_HWTRANSFORMANDLIGHT), 8 lights, 4 texture stages.
HRESULT GetDeviceCaps(D3DCAPS8* caps) override
{
std::memset(caps, 0, sizeof(*caps));
caps->DevCaps = D3DDEVCAPS_HWTRANSFORMANDLIGHT;
caps->MaxActiveLights = 8;
caps->MaxTextureBlendStages = 4;
caps->MaxSimultaneousTextures = 4;
caps->MaxTextureWidth = caps->MaxTextureHeight = 4096;
caps->MaxAnisotropy = 16;
caps->MaxPrimitiveCount = 0xFFFFF;
caps->MaxVertexIndex = 0xFFFFF;
caps->MaxStreams = 8;
caps->MaxStreamStride = 255;
caps->TextureAddressCaps = D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_CLAMP | D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_MIRROR;
return S_OK;
}
HRESULT GetViewport(D3DVIEWPORT8* viewport) override
{
*viewport = { 0, 0, DWORD(m_width), DWORD(m_height), 0.0f, 1.0f };
return S_OK;
}
// PORT: CPU memory has no texture budget; report the 64MB of a mid-range 2004 card.
UINT GetAvailableTextureMem() override { return 64u << 20; }
HRESULT BeginScene() override { return S_OK; }
HRESULT EndScene() override { return S_OK; }
HRESULT SetTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX* matrix) override
{
if (unsigned(state) < kTransforms && matrix)
std::memcpy(m_transforms[state], matrix, sizeof(float) * 16);
return S_OK;
}
HRESULT GetTransform(D3DTRANSFORMSTATETYPE state, D3DMATRIX* matrix) override
{
if (unsigned(state) < kTransforms)
std::memcpy(matrix, m_transforms[state], sizeof(float) * 16);
return S_OK;
}
HRESULT SetMaterial(const D3DMATERIAL8* material) override { m_material = *material; return S_OK; }
HRESULT SetLight(DWORD index, const D3DLIGHT8* light) override
{
if (index < 8)
m_lights[index] = *light;
return S_OK;
}
HRESULT SetRenderState(D3DRENDERSTATETYPE state, DWORD value) override
{
if (unsigned(state) < kRenderStates)
m_renderStates[state] = value;
return S_OK;
}
HRESULT SetTexture(DWORD stage, IDirect3DBaseTexture8* texture) override
{
if (stage < kStages)
m_textures[stage] = texture;
return S_OK;
}
HRESULT SetTextureStageState(DWORD stage, D3DTEXTURESTAGESTATETYPE type, DWORD value) override
{
if (stage < kStages && unsigned(type) < kStageStates)
m_stageStates[stage][type] = value;
return S_OK;
}
// PORT: fixed function only; CGraphicDevice's stream "shaders" are the FVFs they describe.
HRESULT SetVertexShader(DWORD handle) override { m_fvf = handle; return S_OK; }
HRESULT SetPixelShader(DWORD) override { return S_OK; }
HRESULT SetVertexShaderConstant(DWORD, const void*, DWORD) override { return S_OK; }
HRESULT SetPixelShaderConstant(DWORD, const void*, DWORD) override { return S_OK; }
HRESULT SetStreamSource(UINT stream, IDirect3DVertexBuffer8* buffer, UINT stride) override
{
if (stream == 0)
{
m_stream = static_cast<MtCpuVertexBuffer*>(buffer);
m_streamStride = stride;
}
return S_OK;
}
HRESULT SetIndices(IDirect3DIndexBuffer8* indices, UINT baseVertex) override
{
m_indices = static_cast<MtCpuIndexBuffer*>(indices);
m_baseVertex = baseVertex;
return S_OK;
}
HRESULT DrawPrimitive(D3DPRIMITIVETYPE type, UINT startVertex, UINT primitiveCount) override
{
if (!m_stream)
return E_FAIL;
const UINT count = index_count(type, primitiveCount);
std::vector<std::uint32_t> indices(count);
for (UINT i = 0; i < count; ++i)
indices[i] = startVertex + i;
record(type, primitiveCount, m_stream->bytes.data(), m_stream->bytes.size(), m_streamStride, indices);
return S_OK;
}
HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE type, UINT, UINT, UINT startIndex, UINT primitiveCount) override
{
if (!m_stream || !m_indices)
return E_FAIL;
std::vector<std::uint32_t> indices;
if (!read_indices(m_indices->bytes.data(), m_indices->bytes.size(), m_indices->format, startIndex,
index_count(type, primitiveCount), m_baseVertex, &indices))
return E_FAIL;
record(type, primitiveCount, m_stream->bytes.data(), m_stream->bytes.size(), m_streamStride, indices);
return S_OK;
}
HRESULT DrawPrimitiveUP(D3DPRIMITIVETYPE type, UINT primitiveCount, const void* vertices, UINT stride) override
{
const UINT count = index_count(type, primitiveCount);
std::vector<std::uint32_t> indices(count);
for (UINT i = 0; i < count; ++i)
indices[i] = i;
record(type, primitiveCount, static_cast<const uint8_t*>(vertices), size_t(count) * stride, stride, indices);
return S_OK;
}
HRESULT DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE type, UINT minVertex, UINT numVertices, UINT primitiveCount,
const void* indexData, D3DFORMAT indexFormat, const void* vertices, UINT stride) override
{
const UINT count = index_count(type, primitiveCount);
const size_t indexSize = indexFormat == D3DFMT_INDEX32 ? 4 : 2;
std::vector<std::uint32_t> indices;
if (!read_indices(static_cast<const uint8_t*>(indexData), count * indexSize, indexFormat, 0, count, 0, &indices))
return E_FAIL;
record(type, primitiveCount, static_cast<const uint8_t*>(vertices), size_t(minVertex + numVertices) * stride, stride, indices);
return S_OK;
}
private:
static constexpr unsigned kTransforms = 512; // D3DTS_WORLDMATRIX(0..255) = 256..511
static constexpr unsigned kRenderStates = 256;
static constexpr unsigned kStages = 8;
static constexpr unsigned kStageStates = 32;
static UINT index_count(D3DPRIMITIVETYPE type, UINT primitives)
{
switch (type)
{
case D3DPT_POINTLIST: return primitives;
case D3DPT_LINELIST: return primitives * 2;
case D3DPT_LINESTRIP: return primitives + 1;
case D3DPT_TRIANGLELIST: return primitives * 3;
case D3DPT_TRIANGLESTRIP: case D3DPT_TRIANGLEFAN: return primitives + 2;
default: return 0;
}
}
static bool read_indices(const uint8_t* bytes, size_t size, D3DFORMAT format, UINT start, UINT count, UINT base,
std::vector<std::uint32_t>* out)
{
const size_t indexSize = format == D3DFMT_INDEX32 ? 4 : 2;
if ((size_t(start) + count) * indexSize > size)
return false;
out->resize(count);
for (UINT i = 0; i < count; ++i)
{
const uint8_t* p = bytes + (size_t(start) + i) * indexSize;
std::uint32_t index = indexSize == 4 ? (p[0] | (p[1] << 8) | (p[2] << 16) | (std::uint32_t(p[3]) << 24)) : (p[0] | (p[1] << 8));
(*out)[i] = index + base;
}
return true;
}
void record(D3DPRIMITIVETYPE type, UINT primitives, const uint8_t* vertices, size_t vertexBytes, UINT stride,
const std::vector<std::uint32_t>& indices)
{
if (type == D3DPT_POINTLIST || indices.empty() || !vertices)
return;
VertexLayout layout = fvf_layout(m_fvf);
if (!stride)
stride = layout.stride;
if (!stride || stride < (layout.rhw ? 16u : 12u))
return;
// Elements past the stream's stride live in another stream (CreatePTStreamVertexShader).
if (layout.normal + 12 > int(stride)) layout.normal = -1;
if (layout.diffuse + 4 > int(stride)) layout.diffuse = -1;
if (layout.uv0 + 8 > int(stride)) layout.uv0 = -1;
if (layout.uv1 + 8 > int(stride)) layout.uv1 = -1;
Render3DDraw draw;
std::memcpy(draw.world, m_transforms[256], sizeof(draw.world)); // D3DTS_WORLD
std::memcpy(draw.view, m_transforms[D3DTS_VIEW], sizeof(draw.view));
std::memcpy(draw.proj, m_transforms[D3DTS_PROJECTION], sizeof(draw.proj));
draw.texture0 = UIRenderTextureNameFromHandle(m_textures[0]);
draw.texture1 = UIRenderTextureNameFromHandle(m_textures[1]);
draw.pretransformed = layout.rhw;
draw.lines = type == D3DPT_LINELIST || type == D3DPT_LINESTRIP;
// Rebase: copy only the vertices the indices reference.
std::uint32_t lo = indices[0], hi = indices[0];
for (std::uint32_t index : indices)
{
lo = std::min(lo, index);
hi = std::max(hi, index);
}
if ((size_t(hi) + 1) * stride > vertexBytes)
return;
const size_t count = size_t(hi - lo) + 1;
draw.positions.resize(count * 3);
if (layout.rhw) draw.rhw.resize(count);
if (layout.normal >= 0) draw.normals.resize(count * 3);
if (layout.uv0 >= 0) draw.uv0.resize(count * 2);
if (layout.uv1 >= 0) draw.uv1.resize(count * 2);
if (layout.diffuse >= 0) draw.diffuse.resize(count);
for (size_t i = 0; i < count; ++i)
{
const uint8_t* v = vertices + (lo + i) * stride;
std::memcpy(&draw.positions[i * 3], v, 12);
if (layout.rhw) std::memcpy(&draw.rhw[i], v + 12, 4);
if (layout.normal >= 0) std::memcpy(&draw.normals[i * 3], v + layout.normal, 12);
if (layout.uv0 >= 0) std::memcpy(&draw.uv0[i * 2], v + layout.uv0, 8);
if (layout.uv1 >= 0) std::memcpy(&draw.uv1[i * 2], v + layout.uv1, 8);
if (layout.diffuse >= 0) std::memcpy(&draw.diffuse[i], v + layout.diffuse, 4);
}
// Strips and fans become lists; D3D flips the winding of every odd strip triangle.
switch (type)
{
case D3DPT_TRIANGLESTRIP:
for (UINT i = 0; i < primitives; ++i)
{
const std::uint32_t a = indices[i] - lo, b = indices[i + 1] - lo, c = indices[i + 2] - lo;
if (i & 1) draw.indices.insert(draw.indices.end(), { b, a, c });
else draw.indices.insert(draw.indices.end(), { a, b, c });
}
break;
case D3DPT_TRIANGLEFAN:
for (UINT i = 0; i < primitives; ++i)
draw.indices.insert(draw.indices.end(), { indices[0] - lo, indices[i + 1] - lo, indices[i + 2] - lo });
break;
case D3DPT_LINESTRIP:
for (UINT i = 0; i < primitives; ++i)
draw.indices.insert(draw.indices.end(), { indices[i] - lo, indices[i + 1] - lo });
break;
default:
for (std::uint32_t index : indices)
draw.indices.push_back(index - lo);
break;
}
draw.alpha_blend = m_renderStates[D3DRS_ALPHABLENDENABLE];
draw.src_blend = m_renderStates[D3DRS_SRCBLEND];
draw.dest_blend = m_renderStates[D3DRS_DESTBLEND];
draw.alpha_test = m_renderStates[D3DRS_ALPHATESTENABLE];
draw.alpha_ref = m_renderStates[D3DRS_ALPHAREF];
draw.alpha_func = m_renderStates[D3DRS_ALPHAFUNC];
draw.cull_mode = m_renderStates[D3DRS_CULLMODE];
draw.z_enable = m_renderStates[D3DRS_ZENABLE];
draw.z_write = m_renderStates[D3DRS_ZWRITEENABLE];
draw.z_func = m_renderStates[D3DRS_ZFUNC];
draw.lighting = m_renderStates[D3DRS_LIGHTING];
draw.texture_factor = m_renderStates[D3DRS_TEXTUREFACTOR];
draw.fog_enable = m_renderStates[D3DRS_FOGENABLE];
draw.ambient = m_renderStates[D3DRS_AMBIENT];
for (int stage = 0; stage < 2; ++stage)
{
draw.color_op[stage] = m_stageStates[stage][D3DTSS_COLOROP];
draw.color_arg1[stage] = m_stageStates[stage][D3DTSS_COLORARG1];
draw.color_arg2[stage] = m_stageStates[stage][D3DTSS_COLORARG2];
draw.alpha_op[stage] = m_stageStates[stage][D3DTSS_ALPHAOP];
draw.alpha_arg1[stage] = m_stageStates[stage][D3DTSS_ALPHAARG1];
draw.alpha_arg2[stage] = m_stageStates[stage][D3DTSS_ALPHAARG2];
}
copy_color(draw.material_diffuse, m_material.Diffuse);
copy_color(draw.material_ambient, m_material.Ambient);
copy_color(draw.material_emissive, m_material.Emissive);
if (m_lights[0].Type == D3DLIGHT_DIRECTIONAL)
{
draw.light0 = true;
draw.light0_direction[0] = m_lights[0].Direction.x;
draw.light0_direction[1] = m_lights[0].Direction.y;
draw.light0_direction[2] = m_lights[0].Direction.z;
copy_color(draw.light0_diffuse, m_lights[0].Diffuse);
copy_color(draw.light0_ambient, m_lights[0].Ambient);
}
Render3DAdd(std::move(draw));
}
ULONG m_refs = 1;
int m_width, m_height;
float m_transforms[kTransforms][16];
DWORD m_renderStates[kRenderStates] = {};
DWORD m_stageStates[kStages][kStageStates] = {};
IDirect3DBaseTexture8* m_textures[kStages] = {};
D3DMATERIAL8 m_material;
D3DLIGHT8 m_lights[8];
DWORD m_fvf = 0;
MtCpuVertexBuffer* m_stream = nullptr;
UINT m_streamStride = 0;
MtCpuIndexBuffer* m_indices = nullptr;
UINT m_baseVertex = 0;
};
}
IDirect3DDevice8* MtCreateRecordingDevice(int width, int height) { return new RecordingDevice(width, height); }
void Render3DBeginFrame()
{
std::lock_guard<std::mutex> lock(g_draws_mutex);
g_draws.clear();
}
void Render3DAdd(Render3DDraw draw)
{
std::lock_guard<std::mutex> lock(g_draws_mutex);
g_draws.push_back(std::move(draw));
}
const std::vector<Render3DDraw>& Render3DDraws() { return g_draws; }
@@ -0,0 +1,7 @@
#pragma once
// The platform's IDirect3DDevice8: CGraphicDevice::Create hands it to CStateManager, which keeps
// 40250's state caching; the device remembers the state it is given and turns every draw call into a
// Render3DDraw (RenderCommands3D.h) for the Godot renderer.
#include "EterLib/StdAfx.h"
IDirect3DDevice8* MtCreateRecordingDevice(int width, int height);
@@ -0,0 +1,55 @@
#pragma once
#include <cstdint>
#include <string>
#include <vector>
// The 3D draw calls the ported game render (CPythonApplication::RenderGame) issues through
// CStateManager, recorded by the platform's IDirect3DDevice8 (RecordingDevice.cpp) and consumed by
// Godot. Like UIRenderCommands.h this header stays free of D3D and godot-cpp types.
//
// Matrices are D3D8's row-vector layout (translation in elements 12..14), exactly as 40250 set them.
struct Render3DDraw {
float world[16];
float view[16];
float proj[16];
// Stage 0/1 textures, named like UIRenderTextureName: the pack path of a file texture or
// "mem:<id>@<revision>"; empty when the stage has no texture.
std::string texture0;
std::string texture1;
// The referenced vertices, rebased so indices start at 0. normals/uv0/uv1/diffuse are empty when
// the vertex format has no such element. pretransformed: D3DFVF_XYZRHW (screen-space x, y, z, rhw
// in positions + rhw).
bool pretransformed = false;
std::vector<float> positions; // x, y, z
std::vector<float> rhw;
std::vector<float> normals; // x, y, z
std::vector<float> uv0; // u, v
std::vector<float> uv1; // u, v
std::vector<std::uint32_t> diffuse; // 0xAARRGGBB
std::vector<std::uint32_t> indices; // triangle list (strips and fans are expanded), or line list
bool lines = false;
// D3DRS_* / D3DTSS_* values in effect for the draw.
std::uint32_t alpha_blend = 0, src_blend = 0, dest_blend = 0;
std::uint32_t alpha_test = 0, alpha_ref = 0, alpha_func = 0;
std::uint32_t cull_mode = 0, z_enable = 0, z_write = 0, z_func = 0;
std::uint32_t lighting = 0, texture_factor = 0, fog_enable = 0;
std::uint32_t color_op[2] = {}, color_arg1[2] = {}, color_arg2[2] = {};
std::uint32_t alpha_op[2] = {}, alpha_arg1[2] = {}, alpha_arg2[2] = {};
// D3DMATERIAL8 diffuse/ambient/emissive (r, g, b, a) and light 0 when enabled.
float material_diffuse[4] = {1, 1, 1, 1};
float material_ambient[4] = {};
float material_emissive[4] = {};
bool light0 = false;
float light0_direction[3] = {};
float light0_diffuse[4] = {};
float light0_ambient[4] = {};
std::uint32_t ambient = 0; // D3DRS_AMBIENT
};
void Render3DBeginFrame();
void Render3DAdd(Render3DDraw draw);
const std::vector<Render3DDraw>& Render3DDraws();
@@ -1,292 +0,0 @@
// Platform skeleton for EterLib/StateManager.h (40250 EterLib/StateManager.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/StateManager.h"
#include "../PlatformStub.h"
CStateManager::CStateManager(LPDIRECT3DDEVICE8)
{
MT_PLATFORM_STUB();
}
CStateManager::~CStateManager()
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetDefaultState() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::Restore() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::BeginScene() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CStateManager::EndScene() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveMaterial() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveMaterial(const D3DMATERIAL8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreMaterial() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetMaterial(const D3DMATERIAL8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetMaterial(D3DMATERIAL8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetLight(DWORD, const D3DLIGHT8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetLight(DWORD, D3DLIGHT8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveRenderState(D3DRENDERSTATETYPE, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreRenderState(D3DRENDERSTATETYPE) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetRenderState(D3DRENDERSTATETYPE, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetRenderState(D3DRENDERSTATETYPE, DWORD *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveTexture(DWORD, LPDIRECT3DBASETEXTURE8) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreTexture(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetTexture(DWORD, LPDIRECT3DBASETEXTURE8) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetTexture(DWORD, LPDIRECT3DBASETEXTURE8 *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveTextureStageState(DWORD, D3DTEXTURESTAGESTATETYPE, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreTextureStageState(DWORD, D3DTEXTURESTAGESTATETYPE) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetTextureStageState(DWORD, D3DTEXTURESTAGESTATETYPE, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetTextureStageState(DWORD, D3DTEXTURESTAGESTATETYPE, DWORD *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetBestFiltering(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveVertexShader(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreVertexShader() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetVertexShader(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetVertexShader(DWORD *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SavePixelShader(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestorePixelShader() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetPixelShader(DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetPixelShader(DWORD *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveTransform(D3DTRANSFORMSTATETYPE, const D3DMATRIX *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreTransform(D3DTRANSFORMSTATETYPE) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetTransform(D3DTRANSFORMSTATETYPE, const D3DMATRIX *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::GetTransform(D3DTRANSFORMSTATETYPE, D3DMATRIX *) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveVertexShaderConstant(DWORD, const void *, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreVertexShaderConstant(DWORD, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetVertexShaderConstant(DWORD, const void *, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SavePixelShaderConstant(DWORD, const void *, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestorePixelShaderConstant(DWORD, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetPixelShaderConstant(DWORD, const void *, DWORD) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveStreamSource(UINT, LPDIRECT3DVERTEXBUFFER8, UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreStreamSource(UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetStreamSource(UINT, LPDIRECT3DVERTEXBUFFER8, UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SaveIndices(LPDIRECT3DINDEXBUFFER8, UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::RestoreIndices() -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::SetIndices(LPDIRECT3DINDEXBUFFER8, UINT) -> void
{
MT_PLATFORM_STUB();
}
auto CStateManager::DrawPrimitive(D3DPRIMITIVETYPE, UINT, UINT) -> HRESULT
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<HRESULT>();
}
auto CStateManager::DrawPrimitiveUP(D3DPRIMITIVETYPE, UINT, const void *, UINT) -> HRESULT
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<HRESULT>();
}
auto CStateManager::DrawIndexedPrimitive(D3DPRIMITIVETYPE, UINT, UINT, UINT, UINT) -> HRESULT
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<HRESULT>();
}
auto CStateManager::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE, UINT, UINT, UINT, const void *, D3DFORMAT, const void *, UINT) -> HRESULT
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<HRESULT>();
}
auto CStateManager::GetRenderState(D3DRENDERSTATETYPE) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CStateManager::SetDevice(LPDIRECT3DDEVICE8) -> void
{
MT_PLATFORM_STUB();
}
@@ -44,7 +44,11 @@ struct UIMemoryTexture {
};
bool UIRenderMemoryTexture(const std::string& name, UIMemoryTexture* out);
struct IDirect3DTexture8;
struct IDirect3DBaseTexture8;
// Frees the platform texture behind a CGraphicTexture: a memory texture or a file texture's handle.
void UIRenderReleaseMemoryTexture(IDirect3DTexture8* texture);
// The name (as UIRenderTextureName) of the texture a D3D handle belongs to; "" for null or unknown.
std::string UIRenderTextureNameFromHandle(const IDirect3DBaseTexture8* handle);
// A textured quad from 40250's TPDTVertex[4] (TL, TR, BL, BR) positions and texture coordinates.
// PORT: D3D8 puts pixel centres on integers, which is why 40250 subtracts 0.5 from every vertex; the
@@ -8,6 +8,7 @@
// RenderCoolTimeBox:CSlotWindow::OnRender 画技能冷却扇形用的,没有渲染设备时什么都不做。
#include "EterPythonLib/StdAfx.h"
#include "EterPythonLib/PythonGraphic.h"
#include "EterLib/StateManager.h"
#include "../PlatformStub.h"
#include "../EterLib/UIRenderCommands.h"
@@ -37,13 +38,81 @@ void CPythonGraphic::RenderDownButton(float, float, float, float) { MT_PLATFORM_
bool CPythonGraphic::SaveScreenShot(const char*) { MT_PLATFORM_STUB(); return false; }
void CPythonGraphic::SetCursorPosition(int, int) { MT_PLATFORM_STUB(); }
DWORD CPythonGraphic::GetAvailableMemory() { MT_PLATFORM_STUB(); return 0; }
void CPythonGraphic::SetGameRenderState() { MT_PLATFORM_STUB(); }
void CPythonGraphic::SetInterfaceRenderState() { MT_PLATFORM_STUB(); }
void CPythonGraphic::PushState() { MT_PLATFORM_STUB(); }
void CPythonGraphic::PopState() { MT_PLATFORM_STUB(); }
void CPythonGraphic::SetGamma(float) { MT_PLATFORM_STUB(); }
void CPythonGraphic::RenderCoolTimeBox(float fxCenter, float fyCenter, float fRadius, float fTime)
{
MT_PLATFORM_STUB();
}
// 40250 PythonGraphic.cpp:17
float CPythonGraphic::GetOrthoDepth()
{
return m_fOrthoDepth;
}
// 40250 PythonGraphic.cpp:22
void CPythonGraphic::SetInterfaceRenderState()
{
STATEMANAGER.SetTransform(D3DTS_PROJECTION, &ms_matIdentity);
STATEMANAGER.SetTransform(D3DTS_VIEW, &ms_matIdentity);
STATEMANAGER.SetTransform(D3DTS_WORLD, &ms_matIdentity);
STATEMANAGER.SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_NONE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_NONE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE);
STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
STATEMANAGER.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
STATEMANAGER.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
CPythonGraphic::Instance().SetBlendOperation();
CPythonGraphic::Instance().SetOrtho2D(ms_iWidth, ms_iHeight, GetOrthoDepth());
STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
}
// 40250 PythonGraphic.cpp:42
void CPythonGraphic::SetGameRenderState()
{
STATEMANAGER.SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
STATEMANAGER.SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
STATEMANAGER.SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
}
// 40250 PythonGraphic.cpp:387
void CPythonGraphic::PushState()
{
TState curState;
curState.matProj = ms_matProj;
curState.matView = ms_matView;
//STATEMANAGER.SaveTransform(D3DTS_WORLD, &m_SaveWorldMatrix);
m_stateStack.push(curState);
//CCamera::Instance().PushParams();
}
// 40250 PythonGraphic.cpp:399
void CPythonGraphic::PopState()
{
if (m_stateStack.empty())
{
assert(!"PythonGraphic::PopState StateStack is EMPTY");
return;
}
TState & rState = m_stateStack.top();
//STATEMANAGER.RestoreTransform(D3DTS_WORLD);
ms_matProj = rState.matProj;
ms_matView = rState.matView;
UpdatePipeLineMatrix();
m_stateStack.pop();
//CCamera::Instance().PopParams();
}
@@ -10,6 +10,8 @@
#include "EterLib/NetDevice.h"
#include "../PlatformStub.h"
#include "../EterLib/UIRenderCommands.h"
#include "../EterLib/RenderCommands3D.h"
#include "EterLib/GrpDevice.h"
#include "../ScriptLib/PythonBoot.h"
// 2V0-d link surface; 2V0-f adds the application lifecycle (Create/Loop/Process/Exit) that
@@ -53,17 +55,12 @@ void CPythonApplication::SetMinFog(float) { MT_PLATFORM_STUB(); }
// this returns it. PORT: no member to hold it; the timer only advances in Process(), so reading it
// here gives the same value.
float CPythonApplication::GetGlobalTime() { return CTimer::Instance().GetCurrentSecond(); }
// Camera (2V3).
void CPythonApplication::SetEventCamera(const SCameraSetting&) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetDefaultCamera() { MT_PLATFORM_STUB(); }
// In 40250 this stores m_v3CenterPosition for the game view (introselect.py sets it on the character list).
void CPythonApplication::SetCenterPosition(float, float, float) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetFrameSkip(bool) { MT_PLATFORM_STUB(); }
// PORT: 40250 creates the Win32 window, the D3D8 device, cursors, sound, keyboard, the net device,
// fonts and the IME here. The Godot window and its canvas are the device on this platform and they
// already exist when the host starts the script, so the window size is the canvas size
// (PythonBoot::SetUISize) rather than the width/height passed from metin2.cfg. What remains of
// Create belongs to the subsystems that are not ported yet (sound 2V4, net 2V1, game render 2V3).
// fonts and the IME here. The Godot window and its canvas already exist when the host starts the
// script, so the window size is the canvas size (PythonBoot::SetUISize) rather than the width/height
// passed from metin2.cfg, and the graphic device is the recording device (RecordingDevice.h) at that
// size. Cursors, sound, keyboard, fonts and the IME are not created here yet.
bool CPythonApplication::Create(PyObject*, const char*, int, int, int)
{
unsigned width = 0, height = 0;
@@ -76,6 +73,38 @@ bool CPythonApplication::Create(PyObject*, const char*, int, int, int)
return false;
}
// In 40250 m_grpDevice is a member created here (PythonApplication.cpp:909).
static CGraphicDevice s_grpDevice;
int iRet = s_grpDevice.Create(NULL, width, height, true, 32, 0);
switch (iRet)
{
case CGraphicDevice::CREATE_OK:
break;
case CGraphicDevice::CREATE_REFRESHRATE:
break;
case CGraphicDevice::CREATE_GET_DEVICE_CAPS:
PyErr_SetString(PyExc_RuntimeError, "GetDevCaps failed");
TraceError("CreateDevice: GetDevCaps failed");
return false;
case CGraphicDevice::CREATE_GET_DEVICE_CAPS2:
PyErr_SetString(PyExc_RuntimeError, "GetDevCaps2 failed");
TraceError("CreateDevice: GetDevCaps2 failed");
return false;
default:
// PORT: the recording device returns only the cases above; the rest is 40250's fallback.
if (iRet & CGraphicDevice::CREATE_OK)
break;
TraceError("CreateDevice: Unknown Error!");
PyErr_SetString(PyExc_RuntimeError, "UNKNOWN_ERROR");
return false;
}
// In 40250 m_netDevice is a member created here (PythonApplication.cpp:1242).
static CNetworkDevice s_netDevice;
if (!s_netDevice.Create())
@@ -205,15 +234,43 @@ bool CPythonApplication::Process()
// transfer is not ported yet (GuildMarkDownloader.cpp/GuildMarkUploader.cpp).
CAccountConnector::Instance().Process();
//!@# Alt+Tab 중 SetTransfor 에서 튕김 현상 해결을 위해 - [levites]
//if (m_isActivateWnd)
__UpdateCamera();
CResourceManager::Instance().Update();
OnCameraUpdate();
OnUIUpdate();
// PORT: the render block without the lost-device restore, ClearDepthBuffer, Show and the render-time
// statistics (Godot clears and presents the frame). The frame's UI and 3D command lists restart here.
CCullingManager::Instance().Update();
UIRenderBeginFrame();
OnUIRender();
Render3DBeginFrame();
CPythonGraphic& rkGraphic = CPythonGraphic::Instance();
if (rkGraphic.Begin())
{
rkGraphic.SetInterfaceRenderState();
OnUIRender();
rkGraphic.End();
}
return true;
}
// 40250 PythonApplicationEvent.cpp:5
void CPythonApplication::OnCameraUpdate()
{
if ( CPythonBackground::Instance().IsMapReady() )
{
CCamera* pkCameraMgr = CCameraManager::Instance().GetCurrentCamera();
if (pkCameraMgr)
pkCameraMgr->Update();
}
}
// 40250 PythonApplicationEvent.cpp:15-25
void CPythonApplication::OnUIUpdate()
{
@@ -233,30 +290,11 @@ bool CPythonApplication::GetLiarCursorOn() { MT_PLATFORM_STUB(); return false; }
void CPythonApplication::SetCursorMode(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetMouseHandler(PyObject*) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetGlobalCenterPosition(LONG, LONG) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetCamera(float, float, float, float) { MT_PLATFORM_STUB(); }
void CPythonApplication::GetCamera(float* distance, float* pitch, float* rotation, float* height) {
MT_PLATFORM_STUB();
if (distance) *distance = 0;
if (pitch) *pitch = 0;
if (rotation) *rotation = 0;
if (height) *height = 0;
}
void CPythonApplication::RotateCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::PitchCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::ZoomCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::MovieRotateCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::MoviePitchCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::MovieZoomCamera(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::MovieResetCamera() { MT_PLATFORM_STUB(); }
float CPythonApplication::GetRotation() { MT_PLATFORM_STUB(); return 0; }
float CPythonApplication::GetPitch() { MT_PLATFORM_STUB(); return 0; }
void CPythonApplication::SetFPS(int) { MT_PLATFORM_STUB(); }
time_t CPythonApplication::GetServerTime() { MT_PLATFORM_STUB(); return 0; }
time_t CPythonApplication::GetServerTimeStamp() { MT_PLATFORM_STUB(); return 0; }
void CPythonApplication::SetConnectData(const char*, int) { MT_PLATFORM_STUB(); }
void CPythonApplication::GetConnectData(std::string& ip, int& port) { MT_PLATFORM_STUB(); ip.clear(); port = 0; }
void CPythonApplication::EnableSpecialCameraMode() { MT_PLATFORM_STUB(); }
void CPythonApplication::SetCameraSpeed(int) { MT_PLATFORM_STUB(); }
void CPythonApplication::SaveCameraSetting(const char*) { MT_PLATFORM_STUB(); }
bool CPythonApplication::LoadCameraSetting(const char*) { MT_PLATFORM_STUB(); return false; }
void CPythonApplication::SetForceSightRange(int) { MT_PLATFORM_STUB(); }
@@ -0,0 +1,408 @@
// 40250 UserInterface/PythonApplicationCamera.cpp plus the camera members' other functions in
// PythonApplication.cpp (SetCenterPosition, EnableSpecialCameraMode, SetCameraSpeed).
// PORT: there is no CPythonApplication object (see PythonApplication.cpp), so the camera members live
// in s_app below with 40250's names and constructor values, and m_pyGraphic is CPythonGraphic::Instance().
#include "UserInterface/StdAfx.h"
#include "UserInterface/PythonApplication.h"
#include "EterBase/Timer.h"
#include "EterLib/Camera.h"
// 40250 PythonApplication.cpp:28-30
float c_fDefaultCameraRotateSpeed = 1.5f;
float c_fDefaultCameraPitchSpeed = 1.5f;
float c_fDefaultCameraZoomSpeed = 0.05f;
namespace
{
struct ApplicationCamera
{
D3DXVECTOR3 m_v3CenterPosition{0.0f, 0.0f, 0.0f};
CPythonApplication::SCameraSetting m_DefaultCameraSetting;
CPythonApplication::SCameraSetting m_kEventCameraSetting;
int m_iCameraMode = CPythonApplication::CAMERA_MODE_NORMAL;
float m_fBlendCameraStartTime = 0.0f;
float m_fBlendCameraBlendTime = 0.0f;
CPythonApplication::SCameraSetting m_kEndBlendCameraSetting;
float m_fRotationSpeed = 0.0f;
float m_fPitchSpeed = 0.0f;
float m_fZoomSpeed = 0.0f;
float m_fCameraRotateSpeed = c_fDefaultCameraRotateSpeed;
float m_fCameraPitchSpeed = c_fDefaultCameraPitchSpeed;
float m_fCameraZoomSpeed = c_fDefaultCameraZoomSpeed;
CPythonApplication::SCameraPos m_kCmrPos;
CPythonApplication::SCameraSpeed m_kCmrSpd;
BOOL m_isSpecialCameraMode = FALSE;
// The constructor's CCameraManager::Instance().AddCamera(EVENT_CAMERA_NUMBER), on first use.
ApplicationCamera() { CCameraManager::Instance().AddCamera(CPythonApplication::EVENT_CAMERA_NUMBER); }
};
ApplicationCamera& app()
{
static ApplicationCamera s_app;
return s_app;
}
}
float BlendValueByLinear(float fElapsedTime, float fDuration, float fBeginValue, float fEndValue)
{
if (fElapsedTime >= fDuration)
return fEndValue;
return (fEndValue - fBeginValue) * (fElapsedTime / fDuration) + fBeginValue;
}
void CPythonApplication::__UpdateCamera()
{
ApplicationCamera& s_app = app();
//////////////////////
// Camera Setting
CCamera * pMainCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pMainCamera)
return;
if (CAMERA_MODE_BLEND == s_app.m_iCameraMode)
{
float fcurTime = CTimer::Instance().GetCurrentSecond();
float fElapsedTime = fcurTime - s_app.m_fBlendCameraStartTime;
float fxCenter = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.v3CenterPosition.x, s_app.m_kEndBlendCameraSetting.v3CenterPosition.x);
float fyCenter = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.v3CenterPosition.y, s_app.m_kEndBlendCameraSetting.v3CenterPosition.y);
float fzCenter = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.v3CenterPosition.z, s_app.m_kEndBlendCameraSetting.v3CenterPosition.z);
float fDistance = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.fZoom, s_app.m_kEndBlendCameraSetting.fZoom);
float fPitch = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.fPitch, s_app.m_kEndBlendCameraSetting.fPitch);
float fRotation = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.fRotation, s_app.m_kEndBlendCameraSetting.fRotation);
float fUpDir = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.kCmrPos.m_fUpDir, s_app.m_kEndBlendCameraSetting.kCmrPos.m_fUpDir);
float fViewDir = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.kCmrPos.m_fViewDir, s_app.m_kEndBlendCameraSetting.kCmrPos.m_fViewDir);
float fCrossDir = BlendValueByLinear(fElapsedTime, s_app.m_fBlendCameraBlendTime, s_app.m_kEventCameraSetting.kCmrPos.m_fCrossDir, s_app.m_kEndBlendCameraSetting.kCmrPos.m_fCrossDir);
// Temporary. Have to fix that this work in camera class. - [levites]
pMainCamera->Unlock();
CPythonGraphic::Instance().SetPositionCamera(fxCenter, fyCenter, fzCenter, fDistance, fPitch, fRotation);
pMainCamera->MoveVertical(fUpDir);
pMainCamera->MoveFront(fViewDir);
pMainCamera->MoveAlongCross(fCrossDir);
pMainCamera->Lock();
}
else if (CAMERA_MODE_STAND == s_app.m_iCameraMode)
{
float fDistance, fPitch, fRotation, fHeight;
GetCamera(&fDistance, &fPitch, &fRotation, &fHeight);
CPythonGraphic::Instance().SetPositionCamera(s_app.m_kEventCameraSetting.v3CenterPosition.x,
s_app.m_kEventCameraSetting.v3CenterPosition.y,
s_app.m_kEventCameraSetting.v3CenterPosition.z + pMainCamera->GetTargetHeight(),
fDistance, fPitch, fRotation);
}
else if (CAMERA_MODE_NORMAL == s_app.m_iCameraMode)
{
float fDistance, fPitch, fRotation, fHeight;
GetCamera(&fDistance, &fPitch, &fRotation, &fHeight);
CPythonGraphic::Instance().SetPositionCamera(s_app.m_v3CenterPosition.x, s_app.m_v3CenterPosition.y, s_app.m_v3CenterPosition.z + pMainCamera->GetTargetHeight(), fDistance, fPitch, fRotation);
}
if (0.0f != s_app.m_fRotationSpeed)
pMainCamera->Roll(s_app.m_fRotationSpeed);
if (0.0f != s_app.m_fPitchSpeed)
pMainCamera->Pitch(s_app.m_fPitchSpeed);
if (0.0f != s_app.m_fZoomSpeed)
pMainCamera->Zoom(s_app.m_fZoomSpeed);
if (0.0f !=s_app.m_kCmrSpd.m_fViewDir)
s_app.m_kCmrPos.m_fViewDir+=s_app.m_kCmrSpd.m_fViewDir;
if (0.0f !=s_app.m_kCmrSpd.m_fCrossDir)
s_app.m_kCmrPos.m_fCrossDir+=s_app.m_kCmrSpd.m_fCrossDir;
if (0.0f !=s_app.m_kCmrSpd.m_fUpDir)
s_app.m_kCmrPos.m_fUpDir+=s_app.m_kCmrSpd.m_fUpDir;
if (0.0f != s_app.m_kCmrPos.m_fViewDir)
pMainCamera->MoveFront(s_app.m_kCmrPos.m_fViewDir);
if (0.0f != s_app.m_kCmrPos.m_fCrossDir)
pMainCamera->MoveAlongCross(s_app.m_kCmrPos.m_fCrossDir);
if (0.0f != s_app.m_kCmrPos.m_fUpDir)
pMainCamera->MoveVertical(s_app.m_kCmrPos.m_fUpDir);
// PORT: SkipRenderBuffering while dragging and the listener update of m_SoundManager follow here in
// 40250; there is no render buffering and sound is not ported (2V4).
}
void CPythonApplication::SetViewDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
app().m_kCmrSpd.m_fViewDir=fSpeed;
}
void CPythonApplication::SetCrossDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
app().m_kCmrSpd.m_fCrossDir=fSpeed;
}
void CPythonApplication::SetUpDirCameraSpeed(float fSpeed)
{
if (IsLockCurrentCamera())
return;
app().m_kCmrSpd.m_fUpDir=fSpeed;
}
void CPythonApplication::SetCamera(float Distance, float Pitch, float Rotation, float fDestinationHeight)
{
if (IsLockCurrentCamera())
return;
CCamera * pCurrentCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCurrentCamera)
return;
D3DXVECTOR3 v3Target = pCurrentCamera->GetTarget();
CPythonGraphic::Instance().SetPositionCamera(v3Target.x, v3Target.y, v3Target.z, Distance, Pitch, Rotation);
CCamera * pMainCamera = CCameraManager::Instance().GetCurrentCamera();
if (pMainCamera)
pMainCamera->SetTargetHeight(fDestinationHeight);
}
void CPythonApplication::GetCamera(float * Distance, float * Pitch, float * Rotation, float * DestinationHeight)
{
CCamera * pCurrentCamera = CCameraManager::Instance().GetCurrentCamera();
*Distance = pCurrentCamera->GetDistance();
*Pitch = pCurrentCamera->GetPitch();
*Rotation = pCurrentCamera->GetRoll();
*DestinationHeight = pCurrentCamera->GetTarget().z;
}
void CPythonApplication::RotateCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = app().m_fCameraRotateSpeed * float(iDirection);
app().m_fRotationSpeed = fDegree;
}
void CPythonApplication::PitchCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = app().m_fCameraPitchSpeed * float(iDirection);
app().m_fPitchSpeed = fDegree;
}
void CPythonApplication::ZoomCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fRatio = 1.0f + app().m_fCameraZoomSpeed * float(iDirection);
app().m_fZoomSpeed = fRatio;
}
// PORT: in special camera mode 40250 checks GetKeyState(VK_SCROLL) & 1 (Scroll Lock on) to move the
// camera instead; the platform has no Scroll Lock state, so it is always off.
void CPythonApplication::MovieRotateCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = app().m_fCameraRotateSpeed * float(iDirection);
app().m_fRotationSpeed = fDegree;
}
void CPythonApplication::MoviePitchCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fDegree = app().m_fCameraPitchSpeed * float(iDirection);
app().m_fPitchSpeed = fDegree;
}
void CPythonApplication::MovieZoomCamera(int iDirection)
{
if (IsLockCurrentCamera())
return;
float fRatio = 1.0f + app().m_fCameraZoomSpeed * float(iDirection);
app().m_fZoomSpeed = fRatio;
}
void CPythonApplication::MovieResetCamera()
{
if (IsLockCurrentCamera())
return;
ApplicationCamera& s_app = app();
if (s_app.m_isSpecialCameraMode)
{
SetCrossDirCameraSpeed(0.0f);
SetViewDirCameraSpeed(0.0f);
SetUpDirCameraSpeed(0.0f);
s_app.m_kCmrPos.m_fViewDir = 0;
s_app.m_kCmrPos.m_fCrossDir = 0;
s_app.m_kCmrPos.m_fUpDir = 0;
}
}
float CPythonApplication::GetRotation()
{
return CCameraManager::Instance().GetCurrentCamera()->GetRoll();
}
float CPythonApplication::GetPitch()
{
return CCameraManager::Instance().GetCurrentCamera()->GetPitch();
}
bool CPythonApplication::IsLockCurrentCamera()
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return false;
return pCamera->IsLock();
}
void CPythonApplication::SetEventCamera(const SCameraSetting & c_rCameraSetting)
{
ApplicationCamera& s_app = app();
if (CCameraManager::DEFAULT_PERSPECTIVE_CAMERA == CCameraManager::Instance().GetCurrentCameraNum())
{
GetCameraSetting(&s_app.m_DefaultCameraSetting);
}
/////
CCameraManager::Instance().SetCurrentCamera(EVENT_CAMERA_NUMBER);
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return;
SetCameraSetting(c_rCameraSetting);
s_app.m_kEventCameraSetting = c_rCameraSetting;
s_app.m_iCameraMode = CAMERA_MODE_STAND;
}
void CPythonApplication::BlendEventCamera(const SCameraSetting & c_rCameraSetting, float fBlendTime)
{
ApplicationCamera& s_app = app();
s_app.m_iCameraMode = CAMERA_MODE_BLEND;
s_app.m_fBlendCameraStartTime = CTimer::Instance().GetCurrentSecond();
s_app.m_fBlendCameraBlendTime = fBlendTime;
s_app.m_kEndBlendCameraSetting = c_rCameraSetting;
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (pCamera)
pCamera->Lock();
}
void CPythonApplication::SetDefaultCamera()
{
ApplicationCamera& s_app = app();
s_app.m_iCameraMode = CAMERA_MODE_NORMAL;
s_app.m_fBlendCameraStartTime = 0.0f;
s_app.m_fBlendCameraBlendTime = 0.0f;
/////
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (pCamera)
pCamera->Unlock();
if (CCameraManager::DEFAULT_PERSPECTIVE_CAMERA != CCameraManager::Instance().GetCurrentCameraNum())
{
CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_PERSPECTIVE_CAMERA);
SetCameraSetting(s_app.m_DefaultCameraSetting);
}
}
void CPythonApplication::SetCameraSetting(const SCameraSetting & c_rCameraSetting)
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return;
CPythonGraphic::Instance().SetPositionCamera( c_rCameraSetting.v3CenterPosition.x,
c_rCameraSetting.v3CenterPosition.y,
c_rCameraSetting.v3CenterPosition.z,
c_rCameraSetting.fZoom,
c_rCameraSetting.fPitch,
c_rCameraSetting.fRotation);
if (0.0f != c_rCameraSetting.kCmrPos.m_fViewDir)
pCamera->MoveFront(c_rCameraSetting.kCmrPos.m_fViewDir);
if (0.0f != c_rCameraSetting.kCmrPos.m_fCrossDir)
pCamera->MoveAlongCross(c_rCameraSetting.kCmrPos.m_fCrossDir);
if (0.0f != c_rCameraSetting.kCmrPos.m_fUpDir)
pCamera->MoveVertical(c_rCameraSetting.kCmrPos.m_fUpDir);
ApplicationCamera& s_app = app();
s_app.m_kCmrPos.m_fUpDir = 0.0f;
s_app.m_kCmrPos.m_fViewDir = 0.0f;
s_app.m_kCmrPos.m_fCrossDir = 0.0f;
s_app.m_kCmrSpd.m_fUpDir = 0.0f;
s_app.m_kCmrSpd.m_fViewDir = 0.0f;
s_app.m_kCmrSpd.m_fCrossDir = 0.0f;
s_app.m_fZoomSpeed = 0.0f;
s_app.m_fPitchSpeed = 0.0f;
s_app.m_fRotationSpeed = 0.0f;
}
void CPythonApplication::GetCameraSetting(SCameraSetting * pCameraSetting)
{
ApplicationCamera& s_app = app();
pCameraSetting->v3CenterPosition = s_app.m_v3CenterPosition;
pCameraSetting->kCmrPos = s_app.m_kCmrPos;
if (CCameraManager::Instance().GetCurrentCamera())
pCameraSetting->v3CenterPosition.z += CCameraManager::Instance().GetCurrentCamera()->GetTargetHeight();
float fHeight;
GetCamera(&pCameraSetting->fZoom, &pCameraSetting->fPitch, &pCameraSetting->fRotation, &fHeight);
}
// 40250 PythonApplication.cpp:1294
void CPythonApplication::SetCenterPosition(float fx, float fy, float fz)
{
ApplicationCamera& s_app = app();
s_app.m_v3CenterPosition.x = +fx;
s_app.m_v3CenterPosition.y = -fy;
s_app.m_v3CenterPosition.z = +fz;
}
// 40250 PythonApplication.cpp:1301
void CPythonApplication::GetCenterPosition(TPixelPosition * pPixelPosition)
{
ApplicationCamera& s_app = app();
pPixelPosition->x = +s_app.m_v3CenterPosition.x;
pPixelPosition->y = -s_app.m_v3CenterPosition.y;
pPixelPosition->z = +s_app.m_v3CenterPosition.z;
}
// 40250 PythonApplication.cpp:1365
void CPythonApplication::EnableSpecialCameraMode()
{
app().m_isSpecialCameraMode = TRUE;
}
void CPythonApplication::SetCameraSpeed(int iPercentage)
{
ApplicationCamera& s_app = app();
s_app.m_fCameraRotateSpeed = c_fDefaultCameraRotateSpeed * float(iPercentage) / 100.0f;
s_app.m_fCameraPitchSpeed = c_fDefaultCameraPitchSpeed * float(iPercentage) / 100.0f;
s_app.m_fCameraZoomSpeed = c_fDefaultCameraZoomSpeed * float(iPercentage) / 100.0f;
}
@@ -78,3 +78,12 @@ auto CMapManager::EndEnvironment() -> void
{
MT_PLATFORM_STUB();
}
// 40250 MapManager.cpp:144 (CPythonApplication::OnCameraUpdate); m_pkMap stays null until LoadMap is ported.
bool CMapManager::IsMapReady()
{
if (!m_pkMap)
return false;
return m_pkMap->IsReady();
}
@@ -3,6 +3,9 @@
// that ports the unit into port/ (docs/PORT-PLAN.md 2V1).
#include "UserInterface/StdAfx.h"
#include "UserInterface/PythonPlayer.h"
#include "UserInterface/PythonApplication.h"
#include "UserInterface/PythonCharacterManager.h"
#include "UserInterface/InstanceBase.h"
#include "../../PlatformStub.h"
@@ -20,6 +23,9 @@ auto CPythonPlayer::SPlayerStatus::GetPoint(UINT) -> long
CPythonPlayer::CPythonPlayer()
{
MT_PLATFORM_STUB();
// PORT: the one member the stand-in's ported functions read; 40250's constructor reaches it
// through Clear() (PythonPlayer.cpp:1624).
m_dwMainCharacterIndex = 0;
}
CPythonPlayer::~CPythonPlayer()
@@ -63,9 +69,21 @@ auto CPythonPlayer::SetAttackKeyState(bool) -> void
MT_PLATFORM_STUB();
}
auto CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition *) -> void
// 40250 PythonPlayer.cpp:87, verbatim: UpdateGame centres the camera on the main actor.
void CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition* pkPPosActor)
{
MT_PLATFORM_STUB();
TPixelPosition kPPosMainActor;
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
CInstanceBase * pInstance = rkPlayer.NEW_GetMainActorPtr();
if (pInstance)
{
pInstance->NEW_GetPixelPosition(pkPPosActor);
}
else
{
CPythonApplication::Instance().GetCenterPosition(pkPPosActor);
}
}
auto CPythonPlayer::RegisterEffect(DWORD, const char *, bool) -> bool
@@ -194,16 +212,17 @@ auto CPythonPlayer::AlarmHaveToGo() -> void
MT_PLATFORM_STUB();
}
auto CPythonPlayer::NEW_FindActorPtr(DWORD) -> CInstanceBase *
// 40250 PythonPlayer.cpp:127
CInstanceBase* CPythonPlayer::NEW_FindActorPtr(DWORD dwVID)
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<CInstanceBase *>();
CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance();
return rkChrMgr.GetInstancePtr(dwVID);
}
auto CPythonPlayer::NEW_GetMainActorPtr() -> CInstanceBase *
// 40250 PythonPlayer.cpp
CInstanceBase* CPythonPlayer::NEW_GetMainActorPtr()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<CInstanceBase *>();
return NEW_FindActorPtr(m_dwMainCharacterIndex);
}
auto CPythonPlayer::Clear() -> void
@@ -237,15 +256,18 @@ auto CPythonPlayer::SetPlayTime(DWORD) -> void
MT_PLATFORM_STUB();
}
auto CPythonPlayer::SetMainCharacterIndex(int) -> void
// 40250 PythonPlayer.cpp:276
// PORT: the main instance's SetEventHandler(CPythonPlayerEventHandler) is left out; the player event
// handler (PythonPlayerEventHandler.cpp) is not ported.
void CPythonPlayer::SetMainCharacterIndex(int iIndex)
{
MT_PLATFORM_STUB();
m_dwMainCharacterIndex = iIndex;
}
auto CPythonPlayer::GetMainCharacterIndex() -> DWORD
// 40250 PythonPlayer.cpp:288
DWORD CPythonPlayer::GetMainCharacterIndex()
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
return m_dwMainCharacterIndex;
}
auto CPythonPlayer::IsMainCharacterIndex(DWORD) -> bool
+512
View File
@@ -0,0 +1,512 @@
#include "StdAfx.h"
#include "../EterBase/Utils.h"
#include "../EterBase/Timer.h"
#include "GrpBase.h"
#include "Camera.h"
#include "StateManager.h"
void PixelPositionToD3DXVECTOR3(const D3DXVECTOR3& c_rkPPosSrc, D3DXVECTOR3* pv3Dst)
{
pv3Dst->x=+c_rkPPosSrc.x;
pv3Dst->y=-c_rkPPosSrc.y;
pv3Dst->z=+c_rkPPosSrc.z;
}
void D3DXVECTOR3ToPixelPosition(const D3DXVECTOR3& c_rv3Src, D3DXVECTOR3* pv3Dst)
{
pv3Dst->x=+c_rv3Src.x;
pv3Dst->y=-c_rv3Src.y;
pv3Dst->z=+c_rv3Src.z;
}
UINT CGraphicBase::ms_iD3DAdapterInfo=0;
UINT CGraphicBase::ms_iD3DDevInfo=0;
UINT CGraphicBase::ms_iD3DModeInfo=0;
D3D_CDisplayModeAutoDetector CGraphicBase::ms_kD3DDetector;
HWND CGraphicBase::ms_hWnd;
HDC CGraphicBase::ms_hDC;
LPDIRECT3D8 CGraphicBase::ms_lpd3d = NULL;
LPDIRECT3DDEVICE8 CGraphicBase::ms_lpd3dDevice = NULL;
ID3DXMatrixStack * CGraphicBase::ms_lpd3dMatStack = NULL;
D3DPRESENT_PARAMETERS CGraphicBase::ms_d3dPresentParameter;
D3DVIEWPORT8 CGraphicBase::ms_Viewport;
HRESULT CGraphicBase::ms_hLastResult = NULL;
int CGraphicBase::ms_iWidth;
int CGraphicBase::ms_iHeight;
DWORD CGraphicBase::ms_faceCount = 0;
D3DCAPS8 CGraphicBase::ms_d3dCaps;
DWORD CGraphicBase::ms_dwD3DBehavior = 0;
DWORD CGraphicBase::ms_ptVS = 0;
DWORD CGraphicBase::ms_pntVS = 0;
DWORD CGraphicBase::ms_pnt2VS = 0;
D3DXMATRIX CGraphicBase::ms_matIdentity;
D3DXMATRIX CGraphicBase::ms_matView;
D3DXMATRIX CGraphicBase::ms_matProj;
D3DXMATRIX CGraphicBase::ms_matInverseView;
D3DXMATRIX CGraphicBase::ms_matInverseViewYAxis;
D3DXMATRIX CGraphicBase::ms_matWorld;
D3DXMATRIX CGraphicBase::ms_matWorldView;
D3DXMATRIX CGraphicBase::ms_matScreen0;
D3DXMATRIX CGraphicBase::ms_matScreen1;
D3DXMATRIX CGraphicBase::ms_matScreen2;
D3DXVECTOR3 CGraphicBase::ms_vtPickRayOrig;
D3DXVECTOR3 CGraphicBase::ms_vtPickRayDir;
float CGraphicBase::ms_fFieldOfView;
float CGraphicBase::ms_fNearY;
float CGraphicBase::ms_fFarY;
float CGraphicBase::ms_fAspect;
DWORD CGraphicBase::ms_dwWavingEndTime;
int CGraphicBase::ms_iWavingPower;
DWORD CGraphicBase::ms_dwFlashingEndTime;
D3DXCOLOR CGraphicBase::ms_FlashingColor;
// Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요...
CRay CGraphicBase::ms_Ray;
bool CGraphicBase::ms_bSupportDXT = true;
bool CGraphicBase::ms_isLowTextureMemory = false;
bool CGraphicBase::ms_isHighTextureMemory = false;
// 2004.11.18.myevan.DynamicVertexBuffer로 교체
/*
std::vector<TIndex> CGraphicBase::ms_lineIdxVector;
std::vector<TIndex> CGraphicBase::ms_lineTriIdxVector;
std::vector<TIndex> CGraphicBase::ms_lineRectIdxVector;
std::vector<TIndex> CGraphicBase::ms_lineCubeIdxVector;
std::vector<TIndex> CGraphicBase::ms_fillTriIdxVector;
std::vector<TIndex> CGraphicBase::ms_fillRectIdxVector;
std::vector<TIndex> CGraphicBase::ms_fillCubeIdxVector;
*/
LPD3DXMESH CGraphicBase::ms_lpSphereMesh = NULL;
LPD3DXMESH CGraphicBase::ms_lpCylinderMesh = NULL;
LPDIRECT3DVERTEXBUFFER8 CGraphicBase::ms_alpd3dPDTVB[PDT_VERTEXBUFFER_NUM];
LPDIRECT3DINDEXBUFFER8 CGraphicBase::ms_alpd3dDefIB[DEFAULT_IB_NUM];
bool CGraphicBase::IsLowTextureMemory()
{
return ms_isLowTextureMemory;
}
bool CGraphicBase::IsHighTextureMemory()
{
return ms_isHighTextureMemory;
}
bool CGraphicBase::IsFastTNL()
{
if (ms_dwD3DBehavior & D3DCREATE_HARDWARE_VERTEXPROCESSING ||
ms_dwD3DBehavior & D3DCREATE_MIXED_VERTEXPROCESSING)
{
if (ms_d3dCaps.VertexShaderVersion>D3DVS_VERSION(1,0))
return true;
}
return false;
}
bool CGraphicBase::IsTLVertexClipping()
{
if (ms_d3dCaps.PrimitiveMiscCaps & D3DPMISCCAPS_CLIPTLVERTS)
return true;
return false;
}
void CGraphicBase::GetBackBufferSize(UINT* puWidth, UINT* puHeight)
{
*puWidth=ms_d3dPresentParameter.BackBufferWidth;
*puHeight=ms_d3dPresentParameter.BackBufferHeight;
}
void CGraphicBase::SetDefaultIndexBuffer(UINT eDefIB)
{
if (eDefIB>=DEFAULT_IB_NUM)
return;
STATEMANAGER.SetIndices(ms_alpd3dDefIB[eDefIB], 0);
}
bool CGraphicBase::SetPDTStream(SPDTVertex* pVertices, UINT uVtxCount)
{
return SetPDTStream((SPDTVertexRaw*)pVertices, uVtxCount);
}
bool CGraphicBase::SetPDTStream(SPDTVertexRaw* pSrcVertices, UINT uVtxCount)
{
if (!uVtxCount)
return false;
static DWORD s_dwVBPos=0;
if (s_dwVBPos>=PDT_VERTEXBUFFER_NUM)
s_dwVBPos=0;
IDirect3DVertexBuffer8* plpd3dFillRectVB=ms_alpd3dPDTVB[s_dwVBPos];
++s_dwVBPos;
assert(PDT_VERTEX_NUM>=uVtxCount);
if (uVtxCount >= PDT_VERTEX_NUM)
return false;
TPDTVertex* pDstVertices;
if (FAILED(
plpd3dFillRectVB->Lock(0, sizeof(TPDTVertex)*uVtxCount, (BYTE**)&pDstVertices, D3DLOCK_DISCARD)
))
{
STATEMANAGER.SetStreamSource(0, NULL, 0);
return false;
}
memcpy(pDstVertices, pSrcVertices, sizeof(TPDTVertex)*uVtxCount);
plpd3dFillRectVB->Unlock();
STATEMANAGER.SetStreamSource(0, plpd3dFillRectVB, sizeof(TPDTVertex));
return true;
}
DWORD CGraphicBase::GetAvailableTextureMemory()
{
assert(ms_lpd3dDevice!=NULL && "CGraphicBase::GetAvailableTextureMemory - D3DDevice is EMPTY");
static DWORD s_dwNextUpdateTime=0;
static DWORD s_dwTexMemSize=0;//ms_lpd3dDevice->GetAvailableTextureMem();
DWORD dwCurTime=ELTimer_GetMSec();
if (s_dwNextUpdateTime<dwCurTime)
{
s_dwNextUpdateTime=dwCurTime+5000;
s_dwTexMemSize=ms_lpd3dDevice->GetAvailableTextureMem();
}
return s_dwTexMemSize;
}
const D3DXMATRIX& CGraphicBase::GetViewMatrix()
{
return ms_matView;
}
const D3DXMATRIX & CGraphicBase::GetIdentityMatrix()
{
return ms_matIdentity;
}
void CGraphicBase::SetEyeCamera(float xEye, float yEye, float zEye,
float xCenter, float yCenter, float zCenter,
float xUp, float yUp, float zUp)
{
D3DXVECTOR3 vectorEye(xEye, yEye, zEye);
D3DXVECTOR3 vectorCenter(xCenter, yCenter, zCenter);
D3DXVECTOR3 vectorUp(xUp, yUp, zUp);
// CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_PERSPECTIVE_CAMERA);
CCameraManager::Instance().GetCurrentCamera()->SetViewParams(vectorEye, vectorCenter, vectorUp);
UpdateViewMatrix();
}
void CGraphicBase::SetSimpleCamera(float x, float y, float z, float pitch, float roll)
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
D3DXVECTOR3 vectorEye(x, y, z);
pCamera->SetViewParams(D3DXVECTOR3(0.0f, y, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
pCamera->RotateEyeAroundTarget(pitch, roll);
pCamera->Move(vectorEye);
UpdateViewMatrix();
// This is levites's virtual(?) code which you should not trust.
ms_lpd3dDevice->GetTransform(D3DTS_WORLD, &ms_matWorld);
D3DXMatrixMultiply(&ms_matWorldView, &ms_matWorld, &ms_matView);
}
void CGraphicBase::SetAroundCamera(float distance, float pitch, float roll, float lookAtZ)
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
pCamera->SetViewParams(D3DXVECTOR3(0.0f, -distance, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
pCamera->RotateEyeAroundTarget(pitch, roll);
D3DXVECTOR3 v3Target = pCamera->GetTarget();
v3Target.z = lookAtZ;
pCamera->SetTarget(v3Target);
// pCamera->Move(v3Target);
UpdateViewMatrix();
// This is levites's virtual(?) code which you should not trust.
ms_lpd3dDevice->GetTransform(D3DTS_WORLD, &ms_matWorld);
D3DXMatrixMultiply(&ms_matWorldView, &ms_matWorld, &ms_matView);
}
void CGraphicBase::SetPositionCamera(float fx, float fy, float fz, float distance, float pitch, float roll)
{
// I wanna downward this code to the game control level. - [levites]
if (ms_dwWavingEndTime > CTimer::Instance().GetCurrentMillisecond())
{
if (ms_iWavingPower>0)
{
fx += float(rand() % ms_iWavingPower) / 10.0f;
fy += float(rand() % ms_iWavingPower) / 10.0f;
fz += float(rand() % ms_iWavingPower) / 10.0f;
}
}
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
if (!pCamera)
return;
pCamera->SetViewParams(D3DXVECTOR3(0.0f, -distance, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
pitch = fMIN(80.0f, fMAX(-80.0f, pitch) );
// Tracef("SetPosition Camera : %f, %f\n", pitch, roll);
pCamera->RotateEyeAroundTarget(pitch, roll);
pCamera->Move(D3DXVECTOR3(fx, fy, fz));
UpdateViewMatrix();
// This is levites's virtual(?) code which you should not trust.
STATEMANAGER.GetTransform(D3DTS_WORLD, &ms_matWorld);
D3DXMatrixMultiply(&ms_matWorldView, &ms_matWorld, &ms_matView);
}
void CGraphicBase::SetOrtho2D(float hres, float vres, float zres)
{
//CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_ORTHO_CAMERA);
D3DXMatrixOrthoOffCenterRH(&ms_matProj, 0, hres, vres, 0, 0, zres);
//UpdatePipeLineMatrix();
UpdateProjMatrix();
}
void CGraphicBase::SetOrtho3D(float hres, float vres, float zmin, float zmax)
{
//CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_PERSPECTIVE_CAMERA);
D3DXMatrixOrthoRH(&ms_matProj, hres, vres, zmin, zmax);
//UpdatePipeLineMatrix();
UpdateProjMatrix();
}
void CGraphicBase::SetPerspective(float fov, float aspect, float nearz, float farz)
{
ms_fFieldOfView = fov;
//if (ms_d3dPresentParameter.BackBufferWidth>0 && ms_d3dPresentParameter.BackBufferHeight>0)
// ms_fAspect = float(ms_d3dPresentParameter.BackBufferWidth)/float(ms_d3dPresentParameter.BackBufferHeight);
//else
ms_fAspect = aspect;
ms_fNearY = nearz;
ms_fFarY = farz;
//CCameraManager::Instance().SetCurrentCamera(CCameraManager::DEFAULT_PERSPECTIVE_CAMERA);
D3DXMatrixPerspectiveFovRH(&ms_matProj, D3DXToRadian(fov), ms_fAspect, nearz, farz);
//UpdatePipeLineMatrix();
UpdateProjMatrix();
}
void CGraphicBase::UpdateProjMatrix()
{
STATEMANAGER.SetTransform(D3DTS_PROJECTION, &ms_matProj);
}
void CGraphicBase::UpdateViewMatrix()
{
CCamera* pkCamera=CCameraManager::Instance().GetCurrentCamera();
if (!pkCamera)
return;
ms_matView = pkCamera->GetViewMatrix();
STATEMANAGER.SetTransform(D3DTS_VIEW, &ms_matView);
D3DXMatrixInverse(&ms_matInverseView, NULL, &ms_matView);
ms_matInverseViewYAxis._11 = ms_matInverseView._11;
ms_matInverseViewYAxis._12 = ms_matInverseView._12;
ms_matInverseViewYAxis._21 = ms_matInverseView._21;
ms_matInverseViewYAxis._22 = ms_matInverseView._22;
}
void CGraphicBase::UpdatePipeLineMatrix()
{
UpdateProjMatrix();
UpdateViewMatrix();
}
void CGraphicBase::SetViewport(DWORD dwX, DWORD dwY, DWORD dwWidth, DWORD dwHeight, float fMinZ, float fMaxZ)
{
ms_Viewport.X = dwX;
ms_Viewport.Y = dwY;
ms_Viewport.Width = dwWidth;
ms_Viewport.Height = dwHeight;
ms_Viewport.MinZ = fMinZ;
ms_Viewport.MaxZ = fMaxZ;
}
void CGraphicBase::GetTargetPosition(float * px, float * py, float * pz)
{
*px = CCameraManager::Instance().GetCurrentCamera()->GetTarget().x;
*py = CCameraManager::Instance().GetCurrentCamera()->GetTarget().y;
*pz = CCameraManager::Instance().GetCurrentCamera()->GetTarget().z;
}
void CGraphicBase::GetCameraPosition(float * px, float * py, float * pz)
{
*px = CCameraManager::Instance().GetCurrentCamera()->GetEye().x;
*py = CCameraManager::Instance().GetCurrentCamera()->GetEye().y;
*pz = CCameraManager::Instance().GetCurrentCamera()->GetEye().z;
}
void CGraphicBase::GetMatrix(D3DXMATRIX* pRetMatrix) const
{
assert(ms_lpd3dMatStack != NULL);
*pRetMatrix = *ms_lpd3dMatStack->GetTop();
}
const D3DXMATRIX* CGraphicBase::GetMatrixPointer() const
{
assert(ms_lpd3dMatStack!=NULL);
return ms_lpd3dMatStack->GetTop();
}
void CGraphicBase::GetSphereMatrix(D3DXMATRIX * pMatrix, float fValue)
{
D3DXMatrixIdentity(pMatrix);
pMatrix->_11 = fValue * ms_matWorldView._11;
pMatrix->_21 = fValue * ms_matWorldView._21;
pMatrix->_31 = fValue * ms_matWorldView._31;
pMatrix->_41 = fValue;
pMatrix->_12 = -fValue * ms_matWorldView._12;
pMatrix->_22 = -fValue * ms_matWorldView._22;
pMatrix->_32 = -fValue * ms_matWorldView._32;
pMatrix->_42 = -fValue;
}
float CGraphicBase::GetFOV()
{
return ms_fFieldOfView;
}
void CGraphicBase::PushMatrix()
{
ms_lpd3dMatStack->Push();
}
void CGraphicBase::Scale(float x, float y, float z)
{
ms_lpd3dMatStack->Scale(x, y, z);
}
void CGraphicBase::Rotate(float degree, float x, float y, float z)
{
D3DXVECTOR3 vec(x, y, z);
ms_lpd3dMatStack->RotateAxis(&vec, D3DXToRadian(degree));
}
void CGraphicBase::RotateLocal(float degree, float x, float y, float z)
{
D3DXVECTOR3 vec(x, y, z);
ms_lpd3dMatStack->RotateAxisLocal(&vec, D3DXToRadian(degree));
}
void CGraphicBase::MultMatrix( const D3DXMATRIX* pMat)
{
ms_lpd3dMatStack->MultMatrix(pMat);
}
void CGraphicBase::MultMatrixLocal( const D3DXMATRIX* pMat)
{
ms_lpd3dMatStack->MultMatrixLocal(pMat);
}
void CGraphicBase::RotateYawPitchRollLocal(float fYaw, float fPitch, float fRoll)
{
ms_lpd3dMatStack->RotateYawPitchRollLocal(D3DXToRadian(fYaw), D3DXToRadian(fPitch), D3DXToRadian(fRoll));
}
void CGraphicBase::Translate(float x, float y, float z)
{
ms_lpd3dMatStack->Translate(x, y, z);
}
void CGraphicBase::LoadMatrix(const D3DXMATRIX& c_rSrcMatrix)
{
ms_lpd3dMatStack->LoadMatrix(&c_rSrcMatrix);
}
void CGraphicBase::PopMatrix()
{
ms_lpd3dMatStack->Pop();
}
DWORD CGraphicBase::GetColor(float r, float g, float b, float a)
{
BYTE argb[4] =
{
(BYTE) (255.0f * b),
(BYTE) (255.0f * g),
(BYTE) (255.0f * r),
(BYTE) (255.0f * a)
};
return *((DWORD *) argb);
}
void CGraphicBase::InitScreenEffect()
{
ms_dwWavingEndTime = 0;
ms_dwFlashingEndTime = 0;
ms_iWavingPower = 0;
ms_FlashingColor = D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f);
}
void CGraphicBase::SetScreenEffectWaving(float fDuringTime, int iPower)
{
ms_dwWavingEndTime = CTimer::Instance().GetCurrentMillisecond() + long(fDuringTime * 1000.0f);
ms_iWavingPower = iPower;
}
void CGraphicBase::SetScreenEffectFlashing(float fDuringTime, const D3DXCOLOR & c_rColor)
{
ms_dwFlashingEndTime = CTimer::Instance().GetCurrentMillisecond() + long(fDuringTime * 1000.0f);
ms_FlashingColor = c_rColor;
}
DWORD CGraphicBase::GetFaceCount()
{
return ms_faceCount;
}
void CGraphicBase::ResetFaceCount()
{
ms_faceCount = 0;
}
HRESULT CGraphicBase::GetLastResult()
{
return ms_hLastResult;
}
CGraphicBase::CGraphicBase()
{
}
CGraphicBase::~CGraphicBase()
{
}
+769
View File
@@ -0,0 +1,769 @@
#include "StdAfx.h"
#include "StateManager.h"
//#define StateManager_Assert(a) if (!(a)) puts("assert"#a)
#define StateManager_Assert(a) assert(a)
struct SLightData
{
enum
{
LIGHT_NUM = 8,
};
D3DLIGHT8 m_akD3DLight[LIGHT_NUM];
} m_kLightData;
void CStateManager::SetLight(DWORD index, CONST D3DLIGHT8* pLight)
{
assert(index<SLightData::LIGHT_NUM);
m_kLightData.m_akD3DLight[index]=*pLight;
m_lpD3DDev->SetLight(index, pLight);
}
void CStateManager::GetLight(DWORD index, D3DLIGHT8* pLight)
{
assert(index<8);
*pLight=m_kLightData.m_akD3DLight[index];
}
bool CStateManager::BeginScene()
{
m_bScene=true;
D3DXMATRIX m4Proj;
D3DXMATRIX m4View;
D3DXMATRIX m4World;
GetTransform(D3DTS_WORLD, &m4World);
GetTransform(D3DTS_PROJECTION, &m4Proj);
GetTransform(D3DTS_VIEW, &m4View);
SetTransform(D3DTS_WORLD, &m4World);
SetTransform(D3DTS_PROJECTION, &m4Proj);
SetTransform(D3DTS_VIEW, &m4View);
if (FAILED(m_lpD3DDev->BeginScene()))
return false;
return true;
}
void CStateManager::EndScene()
{
m_lpD3DDev->EndScene();
m_bScene=false;
}
CStateManager::CStateManager(LPDIRECT3DDEVICE8 lpDevice) : m_lpD3DDev(NULL)
{
m_bScene = false;
m_dwBestMinFilter = D3DTEXF_LINEAR;
m_dwBestMagFilter = D3DTEXF_LINEAR;
SetDevice(lpDevice);
}
CStateManager::~CStateManager()
{
if (m_lpD3DDev)
{
m_lpD3DDev->Release();
m_lpD3DDev = NULL;
}
}
void CStateManager::SetDevice(LPDIRECT3DDEVICE8 lpDevice)
{
StateManager_Assert(lpDevice);
lpDevice->AddRef();
if (m_lpD3DDev)
{
m_lpD3DDev->Release();
m_lpD3DDev = NULL;
}
m_lpD3DDev = lpDevice;
D3DCAPS8 d3dCaps;
m_lpD3DDev->GetDeviceCaps(&d3dCaps);
if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
else
m_dwBestMagFilter = D3DTEXF_LINEAR;
if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
else
m_dwBestMinFilter = D3DTEXF_LINEAR;
DWORD dwMax = d3dCaps.MaxAnisotropy;
dwMax = dwMax < 4 ? dwMax : 4;
for (int i = 0; i < 8; ++i)
m_lpD3DDev->SetTextureStageState(i, D3DTSS_MAXANISOTROPY, dwMax);
SetDefaultState();
}
void CStateManager::SetBestFiltering(DWORD dwStage)
{
SetTextureStageState(dwStage, D3DTSS_MINFILTER, m_dwBestMinFilter);
SetTextureStageState(dwStage, D3DTSS_MAGFILTER, m_dwBestMagFilter);
SetTextureStageState(dwStage, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
}
void CStateManager::Restore()
{
int i, j;
m_bForce = true;
for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; ++i)
SetRenderState(D3DRENDERSTATETYPE(i), m_CurrentState.m_RenderStates[i]);
for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
for (j = 0; j < STATEMANAGER_MAX_TEXTURESTATES; ++j)
SetTextureStageState(i, D3DTEXTURESTAGESTATETYPE(j), m_CurrentState.m_TextureStates[i][j]);
for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
SetTexture(i, m_CurrentState.m_Textures[i]);
m_bForce = false;
}
void CStateManager::SetDefaultState()
{
m_CurrentState.ResetState();
m_CopyState.ResetState();
m_ChipState.ResetState();
m_bScene = false;
m_bForce = true;
D3DXMATRIX Identity;
D3DXMatrixIdentity(&Identity);
SetTransform(D3DTS_WORLD, &Identity);
SetTransform(D3DTS_VIEW, &Identity);
SetTransform(D3DTS_PROJECTION, &Identity);
D3DMATERIAL8 DefaultMat;
ZeroMemory(&DefaultMat, sizeof(D3DMATERIAL8));
DefaultMat.Diffuse.r = 1.0f;
DefaultMat.Diffuse.g = 1.0f;
DefaultMat.Diffuse.b = 1.0f;
DefaultMat.Diffuse.a = 1.0f;
DefaultMat.Ambient.r = 1.0f;
DefaultMat.Ambient.g = 1.0f;
DefaultMat.Ambient.b = 1.0f;
DefaultMat.Ambient.a = 1.0f;
DefaultMat.Emissive.r = 0.0f;
DefaultMat.Emissive.g = 0.0f;
DefaultMat.Emissive.b = 0.0f;
DefaultMat.Emissive.a = 0.0f;
DefaultMat.Specular.r = 0.0f;
DefaultMat.Specular.g = 0.0f;
DefaultMat.Specular.b = 0.0f;
DefaultMat.Specular.a = 0.0f;
DefaultMat.Power = 0.0f;
SetMaterial(&DefaultMat);
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
SetRenderState(D3DRS_LINEPATTERN, 0xFFFFFFFF);
SetRenderState(D3DRS_LASTPIXEL, FALSE);
SetRenderState(D3DRS_ALPHAREF, 1);
SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
SetRenderState(D3DRS_ZVISIBLE, FALSE);
SetRenderState(D3DRS_FOGSTART, 0);
SetRenderState(D3DRS_FOGEND, 0);
SetRenderState(D3DRS_FOGDENSITY, 0);
SetRenderState(D3DRS_EDGEANTIALIAS, FALSE);
SetRenderState(D3DRS_ZBIAS, 0);
SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
SetRenderState(D3DRS_AMBIENT, 0x00000000);
SetRenderState(D3DRS_LOCALVIEWER, FALSE);
SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);
SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, FALSE);
SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
SetRenderState(D3DRS_COLORWRITEENABLE, 0xFFFFFFFF);
SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
SetRenderState(D3DRS_FOGENABLE, FALSE);
SetRenderState(D3DRS_FOGCOLOR, 0xFF000000);
SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
SetRenderState(D3DRS_ZENABLE, TRUE);
SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
SetRenderState(D3DRS_DITHERENABLE, TRUE);
SetRenderState(D3DRS_STENCILENABLE, FALSE);
SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
SetRenderState(D3DRS_CLIPPING, TRUE);
SetRenderState(D3DRS_LIGHTING, FALSE);
SetRenderState(D3DRS_SPECULARENABLE, FALSE);
SetRenderState(D3DRS_COLORVERTEX, FALSE);
SetRenderState(D3DRS_WRAP0, 0);
SetRenderState(D3DRS_WRAP1, 0);
SetRenderState(D3DRS_WRAP2, 0);
SetRenderState(D3DRS_WRAP3, 0);
SetRenderState(D3DRS_WRAP4, 0);
SetRenderState(D3DRS_WRAP5, 0);
SetRenderState(D3DRS_WRAP6, 0);
SetRenderState(D3DRS_WRAP7, 0);
SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(2, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(2, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(3, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(3, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(3, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(3, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(4, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(4, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(4, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(4, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(4, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(4, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(5, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(5, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(5, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(5, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(5, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(5, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(6, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(6, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(6, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(6, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(6, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(6, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(7, D3DTSS_COLOROP, D3DTOP_DISABLE);
SetTextureStageState(7, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(7, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
SetTextureStageState(7, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
SetTextureStageState(7, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(7, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
SetTextureStageState(2, D3DTSS_TEXCOORDINDEX, 2);
SetTextureStageState(3, D3DTSS_TEXCOORDINDEX, 3);
SetTextureStageState(4, D3DTSS_TEXCOORDINDEX, 4);
SetTextureStageState(5, D3DTSS_TEXCOORDINDEX, 5);
SetTextureStageState(6, D3DTSS_TEXCOORDINDEX, 6);
SetTextureStageState(7, D3DTSS_TEXCOORDINDEX, 7);
SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(2, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(3, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(3, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(4, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(4, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(4, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(5, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(5, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(5, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(6, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(6, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(6, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(7, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
SetTextureStageState(7, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
SetTextureStageState(7, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(4, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(4, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(5, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(5, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(6, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(6, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(7, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
SetTextureStageState(7, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(2, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(3, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(4, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(5, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(6, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTextureStageState(7, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
SetTexture(0, NULL);
SetTexture(1, NULL);
SetTexture(2, NULL);
SetTexture(3, NULL);
SetTexture(4, NULL);
SetTexture(5, NULL);
SetTexture(6, NULL);
SetTexture(7, NULL);
SetPixelShader(0);
SetVertexShader(D3DFVF_XYZ);
D3DXVECTOR4 av4Null[STATEMANAGER_MAX_VCONSTANTS];
memset(av4Null, 0, sizeof(av4Null));
SetVertexShaderConstant(0, av4Null, STATEMANAGER_MAX_VCONSTANTS);
SetPixelShaderConstant(0, av4Null, STATEMANAGER_MAX_PCONSTANTS);
m_bForce = false;
#ifdef _DEBUG
int i, j;
for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; i++)
m_bRenderStateSavingFlag[i] = FALSE;
for (j = 0; j < STATEMANAGER_MAX_TRANSFORMSTATES; j++)
m_bTransformSavingFlag[j] = FALSE;
for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
for (i = 0; i < STATEMANAGER_MAX_TEXTURESTATES; ++i)
m_bTextureStageStateSavingFlag[j][i] = FALSE;
#endif _DEBUG
}
// Material
void CStateManager::SaveMaterial()
{
m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
}
void CStateManager::SaveMaterial(const D3DMATERIAL8 * pMaterial)
{
// Check that we have set this up before, if not, the default is this.
m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
SetMaterial(pMaterial);
}
void CStateManager::RestoreMaterial()
{
SetMaterial(&m_CopyState.m_D3DMaterial);
}
void CStateManager::SetMaterial(const D3DMATERIAL8 * pMaterial)
{
m_lpD3DDev->SetMaterial(pMaterial);
m_CurrentState.m_D3DMaterial = *pMaterial;
}
void CStateManager::GetMaterial(D3DMATERIAL8 * pMaterial)
{
// Set the renderstate and remember it.
*pMaterial = m_CurrentState.m_D3DMaterial;
}
// Renderstates
DWORD CStateManager::GetRenderState(D3DRENDERSTATETYPE Type)
{
return m_CurrentState.m_RenderStates[Type];
}
void CStateManager::SaveRenderState(D3DRENDERSTATETYPE Type, DWORD dwValue)
{
#ifdef _DEBUG
if (m_bRenderStateSavingFlag[Type])
{
Tracef(" CStateManager::SaveRenderState - This render state is already saved [%d, %d]\n", Type, dwValue);
StateManager_Assert(!" This render state is already saved!");
}
m_bRenderStateSavingFlag[Type] = TRUE;
#endif _DEBUG
// Check that we have set this up before, if not, the default is this.
m_CopyState.m_RenderStates[Type] = m_CurrentState.m_RenderStates[Type];
SetRenderState(Type, dwValue);
}
void CStateManager::RestoreRenderState(D3DRENDERSTATETYPE Type)
{
#ifdef _DEBUG
if (!m_bRenderStateSavingFlag[Type])
{
Tracef(" CStateManager::SaveRenderState - This render state was not saved [%d, %d]\n", Type);
StateManager_Assert(!" This render state was not saved!");
}
m_bRenderStateSavingFlag[Type] = FALSE;
#endif _DEBUG
SetRenderState(Type, m_CopyState.m_RenderStates[Type]);
}
void CStateManager::SetRenderState(D3DRENDERSTATETYPE Type, DWORD Value)
{
if (m_CurrentState.m_RenderStates[Type] == Value)
return;
m_lpD3DDev->SetRenderState(Type, Value);
m_CurrentState.m_RenderStates[Type] = Value;
}
void CStateManager::GetRenderState(D3DRENDERSTATETYPE Type, DWORD * pdwValue)
{
*pdwValue = m_CurrentState.m_RenderStates[Type];
}
// Textures
void CStateManager::SaveTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 pTexture)
{
// Check that we have set this up before, if not, the default is this.
m_CopyState.m_Textures[dwStage] = m_CurrentState.m_Textures[dwStage];
SetTexture(dwStage, pTexture);
}
void CStateManager::RestoreTexture(DWORD dwStage)
{
SetTexture(dwStage, m_CopyState.m_Textures[dwStage]);
}
void CStateManager::SetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 pTexture)
{
if (pTexture == m_CurrentState.m_Textures[dwStage])
return;
m_lpD3DDev->SetTexture(dwStage, pTexture);
m_CurrentState.m_Textures[dwStage] = pTexture;
}
void CStateManager::GetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE8 * ppTexture)
{
*ppTexture = m_CurrentState.m_Textures[dwStage];
}
// Texture stage states
void CStateManager::SaveTextureStageState(DWORD dwStage,D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
{
// Check that we have set this up before, if not, the default is this.
#ifdef _DEBUG
if (m_bTextureStageStateSavingFlag[dwStage][Type])
{
Tracef(" CStateManager::SaveTextureStageState - This texture stage state is already saved [%d, %d]\n", dwStage, Type);
StateManager_Assert(!" This texture stage state is already saved!");
}
m_bTextureStageStateSavingFlag[dwStage][Type] = TRUE;
#endif _DEBUG
m_CopyState.m_TextureStates[dwStage][Type] = m_CurrentState.m_TextureStates[dwStage][Type];
SetTextureStageState(dwStage, Type, dwValue);
}
void CStateManager::RestoreTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type)
{
#ifdef _DEBUG
if (!m_bTextureStageStateSavingFlag[dwStage][Type])
{
Tracef(" CStateManager::RestoreTextureStageState - This texture stage state was not saved [%d, %d]\n", dwStage, Type);
StateManager_Assert(!" This texture stage state was not saved!");
}
m_bTextureStageStateSavingFlag[dwStage][Type] = FALSE;
#endif _DEBUG
SetTextureStageState(dwStage, Type, m_CopyState.m_TextureStates[dwStage][Type]);
}
void CStateManager::SetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
{
if (m_CurrentState.m_TextureStates[dwStage][Type] == dwValue)
return;
m_lpD3DDev->SetTextureStageState(dwStage, Type, dwValue);
m_CurrentState.m_TextureStates[dwStage][Type] = dwValue;
}
void CStateManager::GetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD * pdwValue)
{
*pdwValue = m_CurrentState.m_TextureStates[dwStage][Type];
}
// Vertex Shader
void CStateManager::SaveVertexShader(DWORD dwShader)
{
m_CopyState.m_dwVertexShader = m_CurrentState.m_dwVertexShader;
SetVertexShader(dwShader);
}
void CStateManager::RestoreVertexShader()
{
SetVertexShader(m_CopyState.m_dwVertexShader);
}
void CStateManager::SetVertexShader(DWORD dwShader)
{
if (m_CurrentState.m_dwVertexShader == dwShader)
return;
m_lpD3DDev->SetVertexShader(dwShader);
m_CurrentState.m_dwVertexShader = dwShader;
}
void CStateManager::GetVertexShader(DWORD * pdwShader)
{
*pdwShader = m_CurrentState.m_dwVertexShader;
}
// Pixel Shader
void CStateManager::SavePixelShader(DWORD dwShader)
{
m_CopyState.m_dwPixelShader = m_CurrentState.m_dwPixelShader;
SetPixelShader(dwShader);
}
void CStateManager::RestorePixelShader()
{
SetPixelShader(m_CopyState.m_dwPixelShader);
}
void CStateManager::SetPixelShader(DWORD dwShader)
{
if (m_CurrentState.m_dwPixelShader == dwShader)
return;
m_lpD3DDev->SetPixelShader(dwShader);
m_CurrentState.m_dwPixelShader = dwShader;
}
void CStateManager::GetPixelShader(DWORD * pdwShader)
{
*pdwShader = m_CurrentState.m_dwPixelShader;
}
// *** These states are cached, but not protected from multiple sends of the same value.
// Transform
void CStateManager::SaveTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
{
#ifdef _DEBUG
if (m_bTransformSavingFlag[Type])
{
Tracef(" CStateManager::SaveTransform - This transform is already saved [%d]\n", Type);
StateManager_Assert(!" This trasform is already saved!");
}
m_bTransformSavingFlag[Type] = TRUE;
#endif _DEBUG
m_CopyState.m_Matrices[Type] = m_CurrentState.m_Matrices[Type];
SetTransform(Type, (D3DXMATRIX *)pMatrix);
}
void CStateManager::RestoreTransform(D3DTRANSFORMSTATETYPE Type)
{
#ifdef _DEBUG
if (!m_bTransformSavingFlag[Type])
{
Tracef(" CStateManager::RestoreTransform - This transform was not saved [%d]\n", Type);
StateManager_Assert(!" This render state was not saved!");
}
m_bTransformSavingFlag[Type] = FALSE;
#endif _DEBUG
SetTransform(Type, &m_CopyState.m_Matrices[Type]);
}
// Don't cache-check the transform. To much to do
void CStateManager::SetTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
{
if (m_bScene)
{
m_lpD3DDev->SetTransform(Type, pMatrix);
}
else
{
assert(D3DTS_VIEW==Type || D3DTS_PROJECTION==Type || D3DTS_WORLD==Type);
}
m_CurrentState.m_Matrices[Type] = *pMatrix;
}
void CStateManager::GetTransform(D3DTRANSFORMSTATETYPE Type, D3DMATRIX * pMatrix)
{
*pMatrix = m_CurrentState.m_Matrices[Type];
}
// SetVertexShaderConstant
void CStateManager::SaveVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
{
DWORD i;
for (i = 0; i < dwConstantCount; i++)
{
StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
m_CopyState.m_VertexShaderConstants[dwRegister + i] = m_CurrentState.m_VertexShaderConstants[dwRegister + i];
}
SetVertexShaderConstant(dwRegister, pConstantData, dwConstantCount);
}
void CStateManager::RestoreVertexShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
{
SetVertexShaderConstant(dwRegister, &m_CopyState.m_VertexShaderConstants[dwRegister], dwConstantCount);
}
void CStateManager::SetVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
{
m_lpD3DDev->SetVertexShaderConstant(dwRegister, pConstantData, dwConstantCount);
// Set the renderstate and remember it.
for (DWORD i = 0; i < dwConstantCount; i++)
{
StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
m_CurrentState.m_VertexShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
}
}
// SetPixelShaderConstant
void CStateManager::SavePixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
{
DWORD i;
for (i = 0; i < dwConstantCount; i++)
{
StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
m_CopyState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
}
SetPixelShaderConstant(dwRegister, pConstantData, dwConstantCount);
}
void CStateManager::RestorePixelShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
{
SetPixelShaderConstant(dwRegister, &m_CopyState.m_PixelShaderConstants[dwRegister], dwConstantCount);
}
void CStateManager::SetPixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
{
m_lpD3DDev->SetPixelShaderConstant(dwRegister, pConstantData, dwConstantCount);
// Set the renderstate and remember it.
for (DWORD i = 0; i < dwConstantCount; i++)
{
StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
m_CurrentState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
}
}
void CStateManager::SaveStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData,UINT Stride)
{
// Check that we have set this up before, if not, the default is this.
m_CopyState.m_StreamData[StreamNumber] = m_CurrentState.m_StreamData[StreamNumber];
SetStreamSource(StreamNumber, pStreamData, Stride);
}
void CStateManager::RestoreStreamSource(UINT StreamNumber)
{
SetStreamSource(StreamNumber,
m_CopyState.m_StreamData[StreamNumber].m_lpStreamData,
m_CopyState.m_StreamData[StreamNumber].m_Stride);
}
void CStateManager::SetStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER8 pStreamData, UINT Stride)
{
CStreamData kStreamData(pStreamData, Stride);
if (m_CurrentState.m_StreamData[StreamNumber] == kStreamData)
return;
m_lpD3DDev->SetStreamSource(StreamNumber, pStreamData, Stride);
m_CurrentState.m_StreamData[StreamNumber] = kStreamData;
}
void CStateManager::SaveIndices(LPDIRECT3DINDEXBUFFER8 pIndexData, UINT BaseVertexIndex)
{
m_CopyState.m_IndexData = m_CurrentState.m_IndexData;
SetIndices(pIndexData, BaseVertexIndex);
}
void CStateManager::RestoreIndices()
{
SetIndices(m_CopyState.m_IndexData.m_lpIndexData, m_CopyState.m_IndexData.m_BaseVertexIndex);
}
void CStateManager::SetIndices(LPDIRECT3DINDEXBUFFER8 pIndexData, UINT BaseVertexIndex)
{
CIndexData kIndexData(pIndexData, BaseVertexIndex);
if (m_CurrentState.m_IndexData == kIndexData)
return;
m_lpD3DDev->SetIndices(pIndexData, BaseVertexIndex);
m_CurrentState.m_IndexData = kIndexData;
}
HRESULT CStateManager::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)
{
return (m_lpD3DDev->DrawPrimitive(PrimitiveType, StartVertex, PrimitiveCount));
}
HRESULT CStateManager::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride)
{
m_CurrentState.m_StreamData[0] = NULL;
return (m_lpD3DDev->DrawPrimitiveUP(PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride));
}
HRESULT CStateManager::DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT minIndex, UINT NumVertices, UINT startIndex, UINT primCount)
{
return (m_lpD3DDev->DrawIndexedPrimitive(PrimitiveType, minIndex, NumVertices, startIndex, primCount));
}
HRESULT CStateManager::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, CONST void * pIndexData, D3DFORMAT IndexDataFormat, CONST void * pVertexStreamZeroData, UINT VertexStreamZeroStride)
{
m_CurrentState.m_IndexData = NULL;
m_CurrentState.m_StreamData[0] = NULL;
return (m_lpD3DDev->DrawIndexedPrimitiveUP(PrimitiveType, MinVertexIndex, NumVertexIndices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride));
}
+111 -5
View File
@@ -408,6 +408,56 @@ typedef enum _D3DCULL {
D3DCULL_FORCE_DWORD = 0x7fffffff,
} D3DCULL;
typedef enum _D3DTEXTUREFILTERTYPE {
D3DTEXF_NONE = 0,
D3DTEXF_POINT = 1,
D3DTEXF_LINEAR = 2,
D3DTEXF_ANISOTROPIC = 3,
D3DTEXF_FLATCUBIC = 4,
D3DTEXF_GAUSSIANCUBIC = 5,
D3DTEXF_FORCE_DWORD = 0x7fffffff
} D3DTEXTUREFILTERTYPE;
typedef enum _D3DSHADEMODE {
D3DSHADE_FLAT = 1,
D3DSHADE_GOURAUD = 2,
D3DSHADE_PHONG = 3,
D3DSHADE_FORCE_DWORD = 0x7fffffff
} D3DSHADEMODE;
typedef enum _D3DBLENDOP {
D3DBLENDOP_ADD = 1,
D3DBLENDOP_SUBTRACT = 2,
D3DBLENDOP_REVSUBTRACT = 3,
D3DBLENDOP_MIN = 4,
D3DBLENDOP_MAX = 5,
D3DBLENDOP_FORCE_DWORD = 0x7fffffff
} D3DBLENDOP;
typedef enum _D3DFOGMODE {
D3DFOG_NONE = 0,
D3DFOG_EXP = 1,
D3DFOG_EXP2 = 2,
D3DFOG_LINEAR = 3,
D3DFOG_FORCE_DWORD = 0x7fffffff
} D3DFOGMODE;
typedef enum _D3DMATERIALCOLORSOURCE {
D3DMCS_MATERIAL = 0,
D3DMCS_COLOR1 = 1,
D3DMCS_COLOR2 = 2,
D3DMCS_FORCE_DWORD = 0x7fffffff
} D3DMATERIALCOLORSOURCE;
typedef enum _D3DVERTEXBLENDFLAGS {
D3DVBF_DISABLE = 0,
D3DVBF_1WEIGHTS = 1,
D3DVBF_2WEIGHTS = 2,
D3DVBF_3WEIGHTS = 3,
D3DVBF_TWEENING = 255,
D3DVBF_0WEIGHTS = 256
} D3DVERTEXBLENDFLAGS;
#define D3DTS_WORLDMATRIX(index) (D3DTRANSFORMSTATETYPE)(index + 256)
#define D3DTS_WORLD D3DTS_WORLDMATRIX(0)
#define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1)
@@ -593,16 +643,72 @@ typedef struct _D3DCAPS8
float MaxPixelShaderValue;
} D3DCAPS8;
// COM interfaces: no methods here; platform/ owns every instance. The resource hierarchy is kept
// so the implicit upcasts 40250 relies on (texture -> base texture) compile.
#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L
#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L
#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L
#define D3DPTADDRESSCAPS_WRAP 0x00000001L
#define D3DPTADDRESSCAPS_MIRROR 0x00000002L
#define D3DPTADDRESSCAPS_CLAMP 0x00000004L
#define D3DPTADDRESSCAPS_BORDER 0x00000008L
#define D3DADAPTER_DEFAULT 0
#define D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x00000020L
#define D3DCREATE_HARDWARE_VERTEXPROCESSING 0x00000040L
#define D3DCREATE_MIXED_VERTEXPROCESSING 0x00000080L
#define D3DVS_VERSION(_Major, _Minor) (0xFFFE0000 | ((_Major) << 8) | (_Minor))
#define D3DPMISCCAPS_CLIPTLVERTS 0x00000200L
// COM interfaces: platform/ owns every instance. The resource hierarchy is kept so the implicit
// upcasts 40250 relies on (texture -> base texture) compile; of the resources only the buffers carry
// methods (Lock/Unlock, platform/EterLib/CpuBuffer.h).
struct IDirect3D8;
struct IDirect3DDevice8;
struct IDirect3DResource8 {};
struct IDirect3DBaseTexture8 : IDirect3DResource8 {};
struct IDirect3DTexture8 : IDirect3DBaseTexture8 {};
struct IDirect3DSurface8 : IDirect3DResource8 {};
struct IDirect3DVertexBuffer8 : IDirect3DResource8 {};
struct IDirect3DIndexBuffer8 : IDirect3DResource8 {};
struct IDirect3DVertexBuffer8 : IDirect3DResource8
{
virtual ~IDirect3DVertexBuffer8() = default;
virtual HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) = 0;
virtual HRESULT Unlock() = 0;
};
struct IDirect3DIndexBuffer8 : IDirect3DResource8
{
virtual ~IDirect3DIndexBuffer8() = default;
virtual HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) = 0;
virtual HRESULT Unlock() = 0;
};
// The device methods the ported code calls (CStateManager), with D3D8's signatures. The platform
// implements it (platform/EterLib/RecordingDevice.h) as a device that records draw calls.
struct IDirect3DDevice8
{
virtual ~IDirect3DDevice8() = default;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
virtual HRESULT GetDeviceCaps(D3DCAPS8* pCaps) = 0;
virtual HRESULT GetViewport(D3DVIEWPORT8* pViewport) = 0;
virtual UINT GetAvailableTextureMem() = 0;
virtual HRESULT BeginScene() = 0;
virtual HRESULT EndScene() = 0;
virtual HRESULT SetTransform(D3DTRANSFORMSTATETYPE State, const D3DMATRIX* pMatrix) = 0;
virtual HRESULT GetTransform(D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix) = 0;
virtual HRESULT SetMaterial(const D3DMATERIAL8* pMaterial) = 0;
virtual HRESULT SetLight(DWORD Index, const D3DLIGHT8* pLight) = 0;
virtual HRESULT SetRenderState(D3DRENDERSTATETYPE State, DWORD Value) = 0;
virtual HRESULT SetTexture(DWORD Stage, IDirect3DBaseTexture8* pTexture) = 0;
virtual HRESULT SetTextureStageState(DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) = 0;
virtual HRESULT SetVertexShader(DWORD Handle) = 0;
virtual HRESULT SetPixelShader(DWORD Handle) = 0;
virtual HRESULT SetVertexShaderConstant(DWORD Register, const void* pConstantData, DWORD ConstantCount) = 0;
virtual HRESULT SetPixelShaderConstant(DWORD Register, const void* pConstantData, DWORD ConstantCount) = 0;
virtual HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer8* pStreamData, UINT Stride) = 0;
virtual HRESULT SetIndices(IDirect3DIndexBuffer8* pIndexData, UINT BaseVertexIndex) = 0;
virtual HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) = 0;
virtual HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount) = 0;
virtual HRESULT DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) = 0;
virtual HRESULT DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, const void* pIndexData, D3DFORMAT IndexDataFormat, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride) = 0;
};
typedef IDirect3D8* LPDIRECT3D8;
typedef IDirect3DDevice8* LPDIRECT3DDEVICE8;
typedef IDirect3DResource8* LPDIRECT3DRESOURCE8;
+141
View File
@@ -341,3 +341,144 @@ D3DXQUATERNION* D3DXQuaternionRotationYawPitchRoll(D3DXQUATERNION* pOut, FLOAT y
pOut->w = cyaw * cpitch * croll + syaw * spitch * sroll;
return pOut;
}
D3DXMATRIX* D3DXMatrixPerspectiveFovRH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf)
{
const FLOAT yScale = 1.0f / tanf(fovy / 2.0f);
*pOut = D3DXMATRIX(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
pOut->_11 = yScale / aspect;
pOut->_22 = yScale;
pOut->_33 = zf / (zn - zf);
pOut->_34 = -1.0f;
pOut->_43 = zn * zf / (zn - zf);
return pOut;
}
D3DXMATRIX* D3DXMatrixOrthoRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf)
{
D3DXMatrixIdentity(pOut);
pOut->_11 = 2.0f / w;
pOut->_22 = 2.0f / h;
pOut->_33 = 1.0f / (zn - zf);
pOut->_43 = zn / (zn - zf);
return pOut;
}
D3DXMATRIX* D3DXMatrixOrthoOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
{
D3DXMatrixIdentity(pOut);
pOut->_11 = 2.0f / (r - l);
pOut->_22 = 2.0f / (t - b);
pOut->_33 = 1.0f / (zn - zf);
pOut->_41 = (l + r) / (l - r);
pOut->_42 = (t + b) / (b - t);
pOut->_43 = zn / (zn - zf);
return pOut;
}
ID3DXMatrixStack::ID3DXMatrixStack() : m_stack(1)
{
D3DXMatrixIdentity(&m_stack.back());
}
ULONG ID3DXMatrixStack::Release()
{
delete this;
return 0;
}
HRESULT ID3DXMatrixStack::Pop()
{
if (m_stack.size() > 1)
m_stack.pop_back();
return S_OK;
}
HRESULT ID3DXMatrixStack::Push()
{
m_stack.push_back(m_stack.back());
return S_OK;
}
HRESULT ID3DXMatrixStack::LoadIdentity()
{
D3DXMatrixIdentity(&m_stack.back());
return S_OK;
}
HRESULT ID3DXMatrixStack::LoadMatrix(const D3DXMATRIX* pM)
{
m_stack.back() = *pM;
return S_OK;
}
HRESULT ID3DXMatrixStack::MultMatrix(const D3DXMATRIX* pM)
{
D3DXMatrixMultiply(&m_stack.back(), &m_stack.back(), pM);
return S_OK;
}
HRESULT ID3DXMatrixStack::MultMatrixLocal(const D3DXMATRIX* pM)
{
D3DXMatrixMultiply(&m_stack.back(), pM, &m_stack.back());
return S_OK;
}
HRESULT ID3DXMatrixStack::RotateAxis(const D3DXVECTOR3* pV, FLOAT angle)
{
D3DXMATRIX m;
return MultMatrix(D3DXMatrixRotationAxis(&m, pV, angle));
}
HRESULT ID3DXMatrixStack::RotateAxisLocal(const D3DXVECTOR3* pV, FLOAT angle)
{
D3DXMATRIX m;
return MultMatrixLocal(D3DXMatrixRotationAxis(&m, pV, angle));
}
HRESULT ID3DXMatrixStack::RotateYawPitchRoll(FLOAT yaw, FLOAT pitch, FLOAT roll)
{
D3DXMATRIX m;
return MultMatrix(D3DXMatrixRotationYawPitchRoll(&m, yaw, pitch, roll));
}
HRESULT ID3DXMatrixStack::RotateYawPitchRollLocal(FLOAT yaw, FLOAT pitch, FLOAT roll)
{
D3DXMATRIX m;
return MultMatrixLocal(D3DXMatrixRotationYawPitchRoll(&m, yaw, pitch, roll));
}
HRESULT ID3DXMatrixStack::Scale(FLOAT x, FLOAT y, FLOAT z)
{
D3DXMATRIX m;
return MultMatrix(D3DXMatrixScaling(&m, x, y, z));
}
HRESULT ID3DXMatrixStack::ScaleLocal(FLOAT x, FLOAT y, FLOAT z)
{
D3DXMATRIX m;
return MultMatrixLocal(D3DXMatrixScaling(&m, x, y, z));
}
HRESULT ID3DXMatrixStack::Translate(FLOAT x, FLOAT y, FLOAT z)
{
D3DXMATRIX m;
return MultMatrix(D3DXMatrixTranslation(&m, x, y, z));
}
HRESULT ID3DXMatrixStack::TranslateLocal(FLOAT x, FLOAT y, FLOAT z)
{
D3DXMATRIX m;
return MultMatrixLocal(D3DXMatrixTranslation(&m, x, y, z));
}
D3DXMATRIX* ID3DXMatrixStack::GetTop()
{
return &m_stack.back();
}
HRESULT D3DXCreateMatrixStack(DWORD, ID3DXMatrixStack** ppStack)
{
*ppStack = new ID3DXMatrixStack;
return S_OK;
}
+30
View File
@@ -8,6 +8,7 @@
#include "D3D8Types.h"
#include <math.h>
#include <vector>
#define D3DX_PI ((FLOAT)3.141592654f)
#define D3DX_1BYPI ((FLOAT)0.318309886f)
@@ -368,6 +369,9 @@ D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, FLOAT angle);
D3DXMATRIX* D3DXMatrixRotationAxis(D3DXMATRIX* pOut, const D3DXVECTOR3* pV, FLOAT angle);
D3DXMATRIX* D3DXMatrixRotationQuaternion(D3DXMATRIX* pOut, const D3DXQUATERNION* pQ);
D3DXMATRIX* D3DXMatrixRotationYawPitchRoll(D3DXMATRIX* pOut, FLOAT yaw, FLOAT pitch, FLOAT roll);
D3DXMATRIX* D3DXMatrixPerspectiveFovRH(D3DXMATRIX* pOut, FLOAT fovy, FLOAT aspect, FLOAT zn, FLOAT zf);
D3DXMATRIX* D3DXMatrixOrthoRH(D3DXMATRIX* pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf);
D3DXMATRIX* D3DXMatrixOrthoOffCenterRH(D3DXMATRIX* pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf);
// --- D3DXQUATERNION ---
inline D3DXQUATERNION* D3DXQuaternionIdentity(D3DXQUATERNION* pOut)
@@ -386,3 +390,29 @@ inline FLOAT D3DXPlaneDotCoord(const D3DXPLANE* pP, const D3DXVECTOR3* pV)
{
return pP->a * pV->x + pP->b * pV->y + pP->c * pV->z + pP->d;
}
// --- ID3DXMatrixStack --- (the D3DX8 interface, as a plain class: the Local variants pre-multiply)
struct ID3DXMatrixStack
{
ID3DXMatrixStack();
ULONG Release();
HRESULT Pop();
HRESULT Push();
HRESULT LoadIdentity();
HRESULT LoadMatrix(const D3DXMATRIX* pM);
HRESULT MultMatrix(const D3DXMATRIX* pM);
HRESULT MultMatrixLocal(const D3DXMATRIX* pM);
HRESULT RotateAxis(const D3DXVECTOR3* pV, FLOAT angle);
HRESULT RotateAxisLocal(const D3DXVECTOR3* pV, FLOAT angle);
HRESULT RotateYawPitchRoll(FLOAT yaw, FLOAT pitch, FLOAT roll);
HRESULT RotateYawPitchRollLocal(FLOAT yaw, FLOAT pitch, FLOAT roll);
HRESULT Scale(FLOAT x, FLOAT y, FLOAT z);
HRESULT ScaleLocal(FLOAT x, FLOAT y, FLOAT z);
HRESULT Translate(FLOAT x, FLOAT y, FLOAT z);
HRESULT TranslateLocal(FLOAT x, FLOAT y, FLOAT z);
D3DXMATRIX* GetTop();
private:
std::vector<D3DXMATRIX> m_stack;
};
HRESULT D3DXCreateMatrixStack(DWORD Flags, ID3DXMatrixStack** ppStack);
+31
View File
@@ -40,6 +40,7 @@
#include "../src/platform/ScriptLib/PythonHost.h"
#include "../src/platform/UserInterface/UserInterface.h"
#include "../src/platform/EterBase/TraceErrorObserver.h"
#include "../src/platform/EterLib/RenderCommands3D.h"
#include "GameLib/StdAfx.h"
#include "GameLib/RaceManager.h"
#include "GameLib/RaceData.h"
@@ -56,6 +57,7 @@
#include <memory>
#include <chrono>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <functional>
@@ -346,6 +348,35 @@ int main(int argc, char** argv)
const std::vector<float> before = bones();
CHECK(pump_until(3, [&] { return bones() != before; }));
}
// (批次 2V2-e.1) RenderGame drew the character through CStateManager into the recording device:
// a frame holds a textured, lit triangle draw (the PNT vertex format of RenderWithOneTexture)
// under CPythonGraphic::SetPerspective's right-handed projection (_34 = -1), and the camera that
// __UpdateCamera centred on the main actor puts every vertex of it on screen.
auto on_screen = [](const Render3DDraw& d) {
auto mul = [](const float* v, const float* m, float* o) {
for (int c = 0; c < 4; ++c)
o[c] = v[0] * m[c] + v[1] * m[4 + c] + v[2] * m[8 + c] + v[3] * m[12 + c];
};
for (size_t i = 0; i + 2 < d.positions.size(); i += 3)
{
const float local[4] = {d.positions[i], d.positions[i + 1], d.positions[i + 2], 1.0f};
float world[4], view[4], clip[4];
mul(local, d.world, world);
mul(world, d.view, view);
mul(view, d.proj, clip);
if (clip[3] <= 0.0f || std::fabs(clip[0]) > clip[3] || std::fabs(clip[1]) > clip[3])
return false;
}
return true;
};
auto character_draw = [&] {
for (const Render3DDraw& d : Render3DDraws())
if (!d.pretransformed && !d.lines && !d.indices.empty() && !d.texture0.empty() &&
!d.normals.empty() && !d.uv0.empty() && d.proj[11] == -1.0f && on_screen(d))
return true;
return false;
};
CHECK(pump_until(3, character_draw));
}
if (server)
{