diff --git a/audit/history.jsonl b/audit/history.jsonl index 029be66c..753cd562 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -635,3 +635,4 @@ {"date": "2026-09-30", "unit": "EterLib/GrpExpandedImageInstance.cpp", "action": "port", "evidence": "verbatim; draw + blend mode via UIRenderAddImage, SCREEN/COLOR_DODGE blend fixed to INVDESTCOLOR (0x2A); OnIsType recursion avoided; port.grp_resource"} {"date": "2026-09-30", "unit": "EterLib/GrpFontTexture.cpp", "action": "port", "evidence": "40250 bodies over Win32Gdi; HiDPI oversample adaptations noted; port.text"} {"date": "2026-09-30", "unit": "EterLib/GrpTextInstance.cpp", "action": "port", "evidence": "verbatim except Render draw calls -> UIRender commands; port.text, port.app_loop"} +{"date": "2026-09-30", "unit": "EterLib/SkyBox.cpp", "action": "port", "evidence": "verbatim except native-terrain gate on Render/RenderCloud and qualified CSkyObject::Destroy in the destructor; port.login_flow (map teardown), live-client sky screenshot matches previous build"} diff --git a/audit/port-map/EterLib/SkyBox.cpp.json b/audit/port-map/EterLib/SkyBox.cpp.json new file mode 100644 index 00000000..340018c9 --- /dev/null +++ b/audit/port-map/EterLib/SkyBox.cpp.json @@ -0,0 +1,380 @@ +{ + "reference": "EterLib/SkyBox.cpp", + "reference_sha256": "b0864b9009c1a1571b3edce7e967df2a9167e8dcae2e55bd37f2c93ba647b6a4", + "priority": "P4", + "contracts": [], + "functions": { + "CSkyObjectQuad::CSkyObjectQuad": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::CSkyObjectQuad" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::~CSkyObjectQuad": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::~CSkyObjectQuad" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::Clear": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::Clear" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::SetSrcColor": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::SetSrcColor" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::SetTransition": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::SetTransition" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::SetVertex": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::SetVertex" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::StartTransition": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::StartTransition" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::Update": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::Update" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObjectQuad::Render": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObjectQuad::Render" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::CSkyObject": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::CSkyObject" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::~CSkyObject": { + "status": "ADAPTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::~CSkyObject" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ], + "note": "40250: Destroy() in the destructor; Destroy is pure virtual with a body and MSVC binds the call to CSkyObject::Destroy. Port: the call is qualified as CSkyObject::Destroy() because clang dispatches through the vtable (__cxa_pure_virtual abort on map teardown). Invariant: the same (empty) CSkyObject::Destroy body runs." + }, + "CSkyObject::Destroy": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::Destroy" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::Update": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::Update" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::Render": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::Render" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::GenerateTexture": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::GenerateTexture" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::DeleteTexture": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::DeleteTexture" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::StartTransition": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::StartTransition" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::TSkyObjectFace::StartTransition": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::TSkyObjectFace::StartTransition" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::TSkyObjectFace::Update": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::TSkyObjectFace::Update" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyObject::TSkyObjectFace::Render": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyObject::TSkyObjectFace::Render" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::CSkyBox": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::CSkyBox" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::~CSkyBox": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::~CSkyBox" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::Destroy": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::Destroy" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetSkyBoxScale": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetSkyBoxScale" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetGradientLevel": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetGradientLevel" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetFaceTexture": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetFaceTexture" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudTexture": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudTexture" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudScale": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudScale" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudHeight": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudHeight" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudTextureScale": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudTextureScale" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudScrollSpeed": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudScrollSpeed" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::Unload": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::Unload" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetSkyObjectQuadVertical": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetSkyObjectQuadVertical" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetSkyObjectQuadHorizon": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetSkyObjectQuadHorizon" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::Refresh": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::Refresh" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetCloudColor": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetCloudColor" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::SetSkyColor": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::SetSkyColor" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::StartTransition": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::StartTransition" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::Update": { + "status": "PORTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::Update" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ] + }, + "CSkyBox::Render": { + "status": "ADAPTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::Render" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ], + "note": "40250: always draws the six faces. Port: verbatim behind the native-terrain gate (IsNativeTerrainRenderEnabled, as MapOutdoorRenderHTP.cpp); the Godot Metin2World adapter draws the sky otherwise. Invariant: same states, textures and faces on the native path." + }, + "CSkyBox::RenderCloud": { + "status": "ADAPTED", + "impl": [ + "src/platform/EterLib/SkyBox.cpp:CSkyBox::RenderCloud" + ], + "test": [ + "tests/port/port_login_flow_test.cpp" + ], + "note": "40250: always draws the cloud face. Port: verbatim behind the same native-terrain gate as Render. Invariant: same states, texture transform and projection on the native path." + } + } +} diff --git a/src/platform/EterLib/SkyBox.cpp b/src/platform/EterLib/SkyBox.cpp index 45a78d62..0be45ec1 100644 --- a/src/platform/EterLib/SkyBox.cpp +++ b/src/platform/EterLib/SkyBox.cpp @@ -1,14 +1,20 @@ -// Platform implementation of EterLib/SkyBox.cpp (40250 EterLib/SkyBox.cpp). +// 40250 EterLib/SkyBox.cpp, verbatim. #include "EterLib/StdAfx.h" #include "EterLib/SkyBox.h" #include "EterLib/Camera.h" #include "EterLib/StateManager.h" #include "EterLib/ResourceManager.h" + #include "EterBase/Timer.h" #include "RenderCommands3D.h" +////////////////////////////////////////////////////////////////////////// +// CSkyObjectQuad +////////////////////////////////////////////////////////////////////////// + CSkyObjectQuad::CSkyObjectQuad() { + // Index buffer m_Indices[0] = 0; m_Indices[1] = 2; m_Indices[2] = 1; @@ -62,7 +68,7 @@ void CSkyObjectQuad::SetVertex(const unsigned char & c_rucNumVertex, const TPDTV { if (c_rucNumVertex > 3) return; - memcpy(&m_Vertex[m_Indices[c_rucNumVertex]], &c_rPDTVertex, sizeof(TPDTVertex)); + memcpy (&m_Vertex[m_Indices[c_rucNumVertex]], &c_rPDTVertex, sizeof(TPDTVertex)); } void CSkyObjectQuad::StartTransition() @@ -81,15 +87,19 @@ bool CSkyObjectQuad::Update() bResult = m_Helper[uci].Update() || bResult; m_Vertex[m_Indices[uci]].diffuse = m_Helper[uci].GetCurColor(); } - return bResult; + return bResult; } void CSkyObjectQuad::Render() { if (CGraphicBase::SetPDTStream(m_Vertex, 4)) STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + //STATEMANAGER.DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, 4, 2, m_Indices, D3DFMT_INDEX16, &m_Vertex, sizeof(TPDTVertex)); } +////////////////////////////////////////////////////////////////////////// +// CSkyObject +///////////////////////////////////////////////////////////////////////// CSkyObject::CSkyObject() : m_v3Position(0.0f, 0.0f, 0.0f), m_fScaleX(1.0f), @@ -98,22 +108,12 @@ CSkyObject::CSkyObject() : { D3DXMatrixIdentity(&m_matWorld); D3DXMatrixIdentity(&m_matTranslation); - D3DXMatrixIdentity(&m_matWorldCloud); - D3DXMatrixIdentity(&m_matTranslationCloud); D3DXMatrixIdentity(&m_matTextureCloud); m_dwlastTime = CTimer::Instance().GetCurrentMillisecond(); m_fCloudPositionU = 0.0f; m_fCloudPositionV = 0.0f; - m_fCloudScaleX = 1.0f; - m_fCloudScaleY = 1.0f; - m_fCloudHeight = 0.0f; - m_fCloudTextureScaleX = 1.0f; - m_fCloudTextureScaleY = 1.0f; - m_fCloudScrollSpeedU = 0.0f; - m_fCloudScrollSpeedV = 0.0f; - m_ucRenderMode = SKY_RENDER_MODE_DEFAULT; m_bTransitionStarted = false; m_bSkyMatrixUpdated = false; @@ -121,6 +121,9 @@ CSkyObject::CSkyObject() : CSkyObject::~CSkyObject() { + // PORT: Destroy is pure virtual with a body; MSVC binds this call in the destructor to CSkyObject::Destroy, + // clang dispatches through the vtable (__cxa_pure_virtual), so the call is qualified. + CSkyObject::Destroy(); } void CSkyObject::Destroy() @@ -129,10 +132,7 @@ void CSkyObject::Destroy() void CSkyObject::Update() { - CCamera* pCamera = CCameraManager::Instance().GetCurrentCamera(); - if (!pCamera) - return; - D3DXVECTOR3 v3Eye = pCamera->GetEye(); + D3DXVECTOR3 v3Eye = CCameraManager::Instance().GetCurrentCamera()->GetEye(); if (m_v3Position == v3Eye) if (m_bSkyMatrixUpdated == false) @@ -156,22 +156,24 @@ void CSkyObject::Render() { } -void CSkyObject::StartTransition() -{ -} - CGraphicImageInstance * CSkyObject::GenerateTexture(const char * szfilename) { - if (!szfilename || !*szfilename) - return NULL; + assert(szfilename != NULL); + + if (strlen(szfilename) <= 0) + assert(false); CResource * pResource = CResourceManager::Instance().GetResourcePointer(szfilename); - if (!pResource || !pResource->IsType(CGraphicImage::Type())) + + if (!pResource->IsType(CGraphicImage::Type())) + { + assert(false); return NULL; + } CGraphicImageInstance * pImageInstance = CGraphicImageInstance::New(); pImageInstance->SetImagePointer(static_cast(pResource)); - return pImageInstance; + return (pImageInstance); } void CSkyObject::DeleteTexture(CGraphicImageInstance * pImageInstance) @@ -180,6 +182,14 @@ void CSkyObject::DeleteTexture(CGraphicImageInstance * pImageInstance) CGraphicImageInstance::Delete(pImageInstance); } +void CSkyObject::StartTransition() +{ +} + +////////////////////////////////////////////////////////////////////////// +// CSkyObject::TSkyObjectFace +////////////////////////////////////////////////////////////////////////// + void CSkyObject::TSkyObjectFace::StartTransition() { for (unsigned char uci = 0; uci < m_SkyObjectQuadVector.size(); ++uci) @@ -192,8 +202,8 @@ bool CSkyObject::TSkyObjectFace::Update() { bool bResult = false; for (DWORD dwi = 0; dwi < m_SkyObjectQuadVector.size(); ++dwi) - bResult = m_SkyObjectQuadVector[dwi].Update() || bResult; - return bResult; + bResult = m_SkyObjectQuadVector[dwi].Update() || bResult; + return bResult; } void CSkyObject::TSkyObjectFace::Render() @@ -204,6 +214,10 @@ void CSkyObject::TSkyObjectFace::Render() } } +////////////////////////////////////////////////////////////////////////// +// CSkyBox +////////////////////////////////////////////////////////////////////////// + CSkyBox::CSkyBox() { m_ucVirticalGradientLevelUpper = 0; @@ -220,19 +234,6 @@ void CSkyBox::Destroy() Unload(); } -void CSkyBox::Unload() -{ - TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.begin(); - - while (itor != m_GraphicImageInstanceMap.end()) - { - DeleteTexture(itor->second); - ++itor; - } - - m_GraphicImageInstanceMap.clear(); -} - void CSkyBox::SetSkyBoxScale(const D3DXVECTOR3 & c_rv3Scale) { m_fScaleX = c_rv3Scale.x; @@ -249,9 +250,9 @@ void CSkyBox::SetGradientLevel(BYTE byUpper, BYTE byLower) m_ucVirticalGradientLevelLower = byLower; } -void CSkyBox::SetFaceTexture(const char* c_szFileName, int iFaceIndex) +void CSkyBox::SetFaceTexture( const char* c_szFileName, int iFaceIndex ) { - if (iFaceIndex < 0 || iFaceIndex > 5 || !c_szFileName || !*c_szFileName) + if( iFaceIndex < 0 || iFaceIndex > 5 ) return; TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.find(c_szFileName); @@ -264,11 +265,9 @@ void CSkyBox::SetFaceTexture(const char* c_szFileName, int iFaceIndex) m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(c_szFileName, pGraphicImageInstance)); } + void CSkyBox::SetCloudTexture(const char * c_szFileName) { - if (!c_szFileName || !*c_szFileName) - return; - TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.find(c_szFileName); if (m_GraphicImageInstanceMap.end() != itor) return; @@ -276,6 +275,10 @@ void CSkyBox::SetCloudTexture(const char * c_szFileName) m_FaceCloud.m_strfacename = c_szFileName; CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName); m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(m_FaceCloud.m_strfacename, pGraphicImageInstance)); + + // 이거 안쓰는거 같은데요? [cronan] +// CGraphicImage * pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer("D:\\Ymir Work\\special/cloudalpha.tga"); +// m_CloudAlphaImageInstance.SetImagePointer(pImage); } void CSkyBox::SetCloudScale(const D3DXVECTOR2 & c_rv2CloudScale) @@ -306,6 +309,19 @@ void CSkyBox::SetCloudScrollSpeed(const D3DXVECTOR2 & c_rv2CloudScrollSpeed) m_fCloudScrollSpeedV = c_rv2CloudScrollSpeed.y; } +void CSkyBox::Unload() +{ + TGraphicImageInstanceMap::iterator itor = m_GraphicImageInstanceMap.begin(); + + while (itor != m_GraphicImageInstanceMap.end()) + { + DeleteTexture(itor->second); + ++itor; + } + + m_GraphicImageInstanceMap.clear(); +} + void CSkyBox::SetSkyObjectQuadVertical(TSkyObjectQuadVector * pSkyObjectQuadVector, const D3DXVECTOR2 * c_pv2QuadPoints) { TPDTVertex aPDTVertex; @@ -322,27 +338,27 @@ void CSkyBox::SetSkyObjectQuadVertical(TSkyObjectQuadVector * pSkyObjectQuadVect aPDTVertex.position.x = c_pv2QuadPoints[0].x; aPDTVertex.position.y = c_pv2QuadPoints[0].y; - aPDTVertex.position.z = 1.0f - (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper); + aPDTVertex.position.z = 1.0f - (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper); aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; - rSkyObjectQuad.SetVertex(0, aPDTVertex); + aPDTVertex.texCoord.y = (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + rSkyObjectQuad.SetVertex(0 , aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[0].x; aPDTVertex.position.y = c_pv2QuadPoints[0].y; - aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper); + aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper); aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(1, aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[1].x; aPDTVertex.position.y = c_pv2QuadPoints[1].y; - aPDTVertex.position.z = 1.0f - (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper); + aPDTVertex.position.z = 1.0f - (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper); aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(2, aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[1].x; aPDTVertex.position.y = c_pv2QuadPoints[1].y; - aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper); + aPDTVertex.position.z = 1.0f - (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper); aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(3, aPDTVertex); } for (ucY = 0; ucY < m_ucVirticalGradientLevelLower; ++ucY) @@ -351,56 +367,68 @@ void CSkyBox::SetSkyObjectQuadVertical(TSkyObjectQuadVector * pSkyObjectQuadVect aPDTVertex.position.x = c_pv2QuadPoints[0].x; aPDTVertex.position.y = c_pv2QuadPoints[0].y; - aPDTVertex.position.z = -(float)(ucY + 1) / (float)(m_ucVirticalGradientLevelLower); + aPDTVertex.position.z = -(float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelLower); aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(0, aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[0].x; aPDTVertex.position.y = c_pv2QuadPoints[0].y; aPDTVertex.position.z = -(float)(ucY) / (float)(m_ucVirticalGradientLevelLower); aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = 0.5f + (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = 0.5f + (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(1, aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[1].x; aPDTVertex.position.y = c_pv2QuadPoints[1].y; - aPDTVertex.position.z = -(float)(ucY + 1) / (float)(m_ucVirticalGradientLevelLower); + aPDTVertex.position.z = -(float)(ucY + 1) / (float)(m_ucVirticalGradientLevelLower); aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = 0.5f + (float)(ucY + 1)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(2, aPDTVertex); aPDTVertex.position.x = c_pv2QuadPoints[1].x; aPDTVertex.position.y = c_pv2QuadPoints[1].y; - aPDTVertex.position.z = -(float)(ucY) / (float)(m_ucVirticalGradientLevelLower); + aPDTVertex.position.z = -(float)(ucY) / (float)(m_ucVirticalGradientLevelLower); aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = 0.5f + (float)(ucY) / (float)(m_ucVirticalGradientLevelUpper) * 0.5f; + aPDTVertex.texCoord.y = 0.5f + (float)(ucY)/ (float)(m_ucVirticalGradientLevelUpper) * 0.5f; rSkyObjectQuad.SetVertex(3, aPDTVertex); } } +//void CSkyBox::UpdateSkyFaceQuadTransform(D3DXVECTOR3 * c_pv3QuadPoints) +//{ +// for( int i = 0; i < 4; ++i ) +// { +// c_pv3QuadPoints[i].x *= m_fScaleX; +// c_pv3QuadPoints[i].y *= m_fScaleY; +// c_pv3QuadPoints[i].z *= m_fScaleZ; +// +// c_pv3QuadPoints[i] += m_v3Position; +// } +//} + void CSkyBox::SetSkyObjectQuadHorizon(TSkyObjectQuadVector * pSkyObjectQuadVector, const D3DXVECTOR3 * c_pv3QuadPoints) { pSkyObjectQuadVector->clear(); pSkyObjectQuadVector->resize(1); CSkyObjectQuad & rSkyObjectQuad = pSkyObjectQuadVector->at(0); - TPDTVertex aPDTVertex{}; - aPDTVertex.position = c_pv3QuadPoints[0]; - aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = 1.0f; + TPDTVertex aPDTVertex; + aPDTVertex.position = c_pv3QuadPoints[0]; + aPDTVertex.texCoord.x = 0.0f; + aPDTVertex.texCoord.y = 1.0f; rSkyObjectQuad.SetVertex(0, aPDTVertex); - aPDTVertex.position = c_pv3QuadPoints[1]; - aPDTVertex.texCoord.x = 0.0f; - aPDTVertex.texCoord.y = 0.0f; + aPDTVertex.position = c_pv3QuadPoints[1]; + aPDTVertex.texCoord.x = 0.0f; + aPDTVertex.texCoord.y = 0.0f; rSkyObjectQuad.SetVertex(1, aPDTVertex); - aPDTVertex.position = c_pv3QuadPoints[2]; - aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = 1.0f; + aPDTVertex.position = c_pv3QuadPoints[2]; + aPDTVertex.texCoord.x = 1.0f; + aPDTVertex.texCoord.y = 1.0f; rSkyObjectQuad.SetVertex(2, aPDTVertex); - aPDTVertex.position = c_pv3QuadPoints[3]; - aPDTVertex.texCoord.x = 1.0f; - aPDTVertex.texCoord.y = 0.0f; + aPDTVertex.position = c_pv3QuadPoints[3]; + aPDTVertex.texCoord.x = 1.0f; + aPDTVertex.texCoord.y = 0.0f; rSkyObjectQuad.SetVertex(3, aPDTVertex); } @@ -408,33 +436,38 @@ void CSkyBox::Refresh() { D3DXVECTOR3 v3QuadPoints[4]; - if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DEFAULT || m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DIFFUSE) + if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DEFAULT || m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_DIFFUSE ) { if (m_ucVirticalGradientLevelUpper + m_ucVirticalGradientLevelLower <= 0) return; D3DXVECTOR2 v2QuadPoints[2]; + //// Face 0: FRONT v2QuadPoints[0] = D3DXVECTOR2(1.0f, -1.0f); v2QuadPoints[1] = D3DXVECTOR2(-1.0f, -1.0f); SetSkyObjectQuadVertical(&m_Faces[0].m_SkyObjectQuadVector, v2QuadPoints); m_Faces[0].m_strfacename = "front"; + //// Face 1: BACK v2QuadPoints[0] = D3DXVECTOR2(-1.0f, 1.0f); v2QuadPoints[1] = D3DXVECTOR2(1.0f, 1.0f); SetSkyObjectQuadVertical(&m_Faces[1].m_SkyObjectQuadVector, v2QuadPoints); m_Faces[1].m_strfacename = "back"; + //// Face 2: LEFT v2QuadPoints[0] = D3DXVECTOR2(-1.0f, -1.0f); v2QuadPoints[1] = D3DXVECTOR2(-1.0f, 1.0f); SetSkyObjectQuadVertical(&m_Faces[2].m_SkyObjectQuadVector, v2QuadPoints); m_Faces[2].m_strfacename = "left"; + //// Face 3: RIGHT v2QuadPoints[0] = D3DXVECTOR2(1.0f, 1.0f); v2QuadPoints[1] = D3DXVECTOR2(1.0f, -1.0f); SetSkyObjectQuadVertical(&m_Faces[3].m_SkyObjectQuadVector, v2QuadPoints); m_Faces[3].m_strfacename = "right"; + //// Face 4: TOP v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, 1.0f); v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, 1.0f); @@ -442,58 +475,85 @@ void CSkyBox::Refresh() SetSkyObjectQuadHorizon(&m_Faces[4].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[4].m_strfacename = "top"; + //// Face 5: BOTTOM v3QuadPoints[0] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); SetSkyObjectQuadHorizon(&m_Faces[5].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[5].m_strfacename = "bottom"; + } - else if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE) + else if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE ) { + // Face 0: FRONT v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, -1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[0].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[0].m_strfacename = "front"; + //// Face 1: BACK v3QuadPoints[0] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(1.0f, 1.0f, 1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[1].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[1].m_strfacename = "back"; + // Face 2: LEFT v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(1.0f, -1.0f, 1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[2].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[2].m_strfacename = "left"; + // Face 3: RIGHT v3QuadPoints[0] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[3].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[3].m_strfacename = "right"; - v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, 1.0f); + // Face 4: TOP + v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, 1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, 1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[4].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[4].m_strfacename = "top"; + ////// Face 5: BOTTOM v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); + + //UpdateSkyFaceQuadTransform(v3QuadPoints); + SetSkyObjectQuadHorizon(&m_Faces[5].m_SkyObjectQuadVector, v3QuadPoints); m_Faces[5].m_strfacename = "bottom"; } + //// Clouds.. v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, 0.0f); v3QuadPoints[1] = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); v3QuadPoints[2] = D3DXVECTOR3(1.0f, -1.0f, 0.0f); @@ -507,28 +567,56 @@ void CSkyBox::SetCloudColor(const TGradientColor & c_rColor, const TGradientColo for (DWORD dwk = 0; dwk < aFaceCloud.m_SkyObjectQuadVector.size(); ++dwk) { CSkyObjectQuad & aSkyObjectQuad = aFaceCloud.m_SkyObjectQuadVector[dwk]; - for (unsigned char v = 0; v < 4; ++v) - { - aSkyObjectQuad.SetSrcColor(v, - c_rColor.m_FirstColor.r, - c_rColor.m_FirstColor.g, - c_rColor.m_FirstColor.b, - c_rColor.m_FirstColor.a); - aSkyObjectQuad.SetTransition(v, - c_rNextColor.m_FirstColor.r, - c_rNextColor.m_FirstColor.g, - c_rNextColor.m_FirstColor.b, - c_rNextColor.m_FirstColor.a, - dwTransitionTime); - } + + aSkyObjectQuad.SetSrcColor(0, + c_rColor.m_FirstColor.r, + c_rColor.m_FirstColor.g, + c_rColor.m_FirstColor.b, + c_rColor.m_FirstColor.a); + aSkyObjectQuad.SetTransition(0, + c_rNextColor.m_FirstColor.r, + c_rNextColor.m_FirstColor.g, + c_rNextColor.m_FirstColor.b, + c_rNextColor.m_FirstColor.a, + dwTransitionTime); + aSkyObjectQuad.SetSrcColor(1, + c_rColor.m_FirstColor.r, + c_rColor.m_FirstColor.g, + c_rColor.m_FirstColor.b, + c_rColor.m_FirstColor.a); + aSkyObjectQuad.SetTransition(1, + c_rNextColor.m_FirstColor.r, + c_rNextColor.m_FirstColor.g, + c_rNextColor.m_FirstColor.b, + c_rNextColor.m_FirstColor.a, + dwTransitionTime); + aSkyObjectQuad.SetSrcColor(2, + c_rColor.m_FirstColor.r, + c_rColor.m_FirstColor.g, + c_rColor.m_FirstColor.b, + c_rColor.m_FirstColor.a); + aSkyObjectQuad.SetTransition(2, + c_rNextColor.m_FirstColor.r, + c_rNextColor.m_FirstColor.g, + c_rNextColor.m_FirstColor.b, + c_rNextColor.m_FirstColor.a, + dwTransitionTime); + aSkyObjectQuad.SetSrcColor(3, + c_rColor.m_FirstColor.r, + c_rColor.m_FirstColor.g, + c_rColor.m_FirstColor.b, + c_rColor.m_FirstColor.a); + aSkyObjectQuad.SetTransition(3, + c_rNextColor.m_FirstColor.r, + c_rNextColor.m_FirstColor.g, + c_rNextColor.m_FirstColor.b, + c_rNextColor.m_FirstColor.a, + dwTransitionTime); } } void CSkyBox::SetSkyColor(const TVectorGradientColor & c_rColorVector, const TVectorGradientColor & c_rNextColorVector, long lTransitionTime) { - if (c_rColorVector.empty() || c_rNextColorVector.empty()) - return; - unsigned long ulVectorGradientColornum = 0; unsigned long uck; for (unsigned char ucj = 0; ucj < 4; ++ucj) @@ -537,8 +625,6 @@ void CSkyBox::SetSkyColor(const TVectorGradientColor & c_rColorVector, const TVe ulVectorGradientColornum = 0; for (uck = 0; uck < aFace.m_SkyObjectQuadVector.size(); ++uck) { - if (ulVectorGradientColornum >= c_rColorVector.size() || ulVectorGradientColornum >= c_rNextColorVector.size()) - break; CSkyObjectQuad & aSkyObjectQuad = aFace.m_SkyObjectQuadVector[uck]; aSkyObjectQuad.SetSrcColor(0, @@ -546,7 +632,7 @@ void CSkyBox::SetSkyColor(const TVectorGradientColor & c_rColorVector, const TVe c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); - aSkyObjectQuad.SetTransition(0, + aSkyObjectQuad.SetTransition(0, c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, @@ -590,46 +676,109 @@ void CSkyBox::SetSkyColor(const TVectorGradientColor & c_rColorVector, const TVe } } + ///// + TSkyObjectFace & aFaceTop = m_Faces[4]; ulVectorGradientColornum = 0; for (uck = 0; uck < aFaceTop.m_SkyObjectQuadVector.size(); ++uck) { CSkyObjectQuad & aSkyObjectQuad = aFaceTop.m_SkyObjectQuadVector[uck]; - for (unsigned char v = 0; v < 4; ++v) - { - aSkyObjectQuad.SetSrcColor(v, - c_rColorVector[ulVectorGradientColornum].m_FirstColor.r, - c_rColorVector[ulVectorGradientColornum].m_FirstColor.g, - c_rColorVector[ulVectorGradientColornum].m_FirstColor.b, - c_rColorVector[ulVectorGradientColornum].m_FirstColor.a); - aSkyObjectQuad.SetTransition(v, - c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r, - c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g, - c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b, - c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a, - lTransitionTime); - } - } + aSkyObjectQuad.SetSrcColor(0, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.a); + aSkyObjectQuad.SetTransition(0, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(1, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.a); + aSkyObjectQuad.SetTransition(1, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(2, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.a); + aSkyObjectQuad.SetTransition(2, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(3, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rColorVector[ulVectorGradientColornum].m_FirstColor.a); + aSkyObjectQuad.SetTransition(3, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_FirstColor.a, + lTransitionTime); + } TSkyObjectFace & aFaceBottom = m_Faces[5]; ulVectorGradientColornum = c_rColorVector.size() - 1; for (uck = 0; uck < aFaceBottom.m_SkyObjectQuadVector.size(); ++uck) { CSkyObjectQuad & aSkyObjectQuad = aFaceBottom.m_SkyObjectQuadVector[uck]; - for (unsigned char v = 0; v < 4; ++v) - { - aSkyObjectQuad.SetSrcColor(v, - c_rColorVector[ulVectorGradientColornum].m_SecondColor.r, - c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, - c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, - c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); - aSkyObjectQuad.SetTransition(v, - c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, - c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, - c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, - c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a, - lTransitionTime); - } + + aSkyObjectQuad.SetSrcColor(0, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); + aSkyObjectQuad.SetTransition(0, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(1, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); + aSkyObjectQuad.SetTransition(1, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(2, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); + aSkyObjectQuad.SetTransition(2, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a, + lTransitionTime); + aSkyObjectQuad.SetSrcColor(3, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rColorVector[ulVectorGradientColornum].m_SecondColor.a); + aSkyObjectQuad.SetTransition(3, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.r, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.g, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.b, + c_rNextColorVector[ulVectorGradientColornum].m_SecondColor.a, + lTransitionTime); } } @@ -647,26 +796,27 @@ void CSkyBox::Update() if (!m_bTransitionStarted) return; - + bool bResult = false; for (unsigned char uci = 0; uci < 6; ++uci) - bResult = m_Faces[uci].Update() || bResult; - bResult = m_FaceCloud.Update() || bResult; + bResult = m_Faces[uci].Update() || bResult; + bResult = m_FaceCloud.Update() || bResult; m_bTransitionStarted = bResult; } void CSkyBox::Render() { + // PORT: the native-terrain gate of MapOutdoorRenderHTP.cpp; the Godot Metin2World adapter draws the sky otherwise. if (!IsNativeTerrainRenderEnabled()) return; - STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); + // 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리 + STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE); STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); @@ -678,15 +828,16 @@ void CSkyBox::Render() STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - STATEMANAGER.SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); + STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1); STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld); - if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE) + //Render Face + if( m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE ) { STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); - STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); + STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); for (unsigned int i = 0; i < 6; ++i) { @@ -694,23 +845,24 @@ void CSkyBox::Render() if (!pFaceImageInstance) break; - STATEMANAGER.SetTexture(0, pFaceImageInstance->GetTextureReference().GetD3DTexture()); + STATEMANAGER.SetTexture( 0, pFaceImageInstance->GetTextureReference().GetD3DTexture() ); + m_Faces[i].Render(); } + //STATEMANAGER.SetTexture( 0, NULL ); + STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSU); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSV); } else { - STATEMANAGER.SetTexture(0, NULL); for (unsigned int i = 0; i < 6; ++i) { m_Faces[i].Render(); } } - STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE); STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING); STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE); STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE); @@ -724,47 +876,48 @@ void CSkyBox::Render() void CSkyBox::RenderCloud() { + // PORT: the native-terrain gate of MapOutdoorRenderHTP.cpp; the Godot Metin2World adapter draws the sky otherwise. if (!IsNativeTerrainRenderEnabled()) return; CGraphicImageInstance * pCloudGraphicImageInstance = m_GraphicImageInstanceMap[m_FaceCloud.m_strfacename]; - if (!pCloudGraphicImageInstance || pCloudGraphicImageInstance->IsEmpty() || !pCloudGraphicImageInstance->GetTexturePointer()) + if (!pCloudGraphicImageInstance) return; - STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); + // 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리 + STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE); - STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE); + STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE); STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR); - STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE); STATEMANAGER.SaveTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); m_matTextureCloud._31 = m_fCloudPositionU; m_matTextureCloud._32 = m_fCloudPositionV; - + DWORD dwCurTime = CTimer::Instance().GetCurrentMillisecond(); - - m_fCloudPositionU += m_fCloudScrollSpeedU * (float)(dwCurTime - m_dwlastTime) * 0.001f; + + m_fCloudPositionU += m_fCloudScrollSpeedU * (float)( dwCurTime - m_dwlastTime ) * 0.001f; if (m_fCloudPositionU >= 1.0f) m_fCloudPositionU = 0.0f; - - m_fCloudPositionV += m_fCloudScrollSpeedV * (float)(dwCurTime - m_dwlastTime) * 0.001f; + + m_fCloudPositionV += m_fCloudScrollSpeedV * (float)( dwCurTime - m_dwlastTime ) * 0.001f; if (m_fCloudPositionV >= 1.0f) m_fCloudPositionV = 0.0f; - + m_dwlastTime = dwCurTime; - + STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &m_matTextureCloud); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATEINVALPHA_ADDCOLOR); STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - + D3DXMATRIX matProjCloud; D3DXMatrixPerspectiveFovRH(&matProjCloud, D3DX_PI * 0.25f, 1.33333f, 50.0f, 999999.0f); STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorldCloud); @@ -772,11 +925,10 @@ void CSkyBox::RenderCloud() STATEMANAGER.SetTexture(0, pCloudGraphicImageInstance->GetTexturePointer()->GetD3DTexture()); m_FaceCloud.Render(); STATEMANAGER.RestoreTransform(D3DTS_PROJECTION); - + STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0); STATEMANAGER.RestoreTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS); - STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE); STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING); STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE); STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);