port: SkyBox verbatim 40250 (native-terrain gate, qualified pure-virtual Destroy)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-30 14:31:07 +09:00
co-authored by Claude Opus 5.5
parent cfae658b6a
commit d73f5ea4bd
3 changed files with 686 additions and 153 deletions
+1
View File
@@ -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"}
+380
View File
@@ -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."
}
}
}
+240 -88
View File
@@ -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()
@@ -88,8 +94,12 @@ 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<CGraphicImage *>(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)
@@ -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.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.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.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,38 +367,50 @@ 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.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.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{};
TPDTVertex aPDTVertex;
aPDTVertex.position = c_pv3QuadPoints[0];
aPDTVertex.texCoord.x = 0.0f;
aPDTVertex.texCoord.y = 1.0f;
@@ -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";
// 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,
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(v,
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,
@@ -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,
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(v,
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,
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(v,
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);
}
}
}
@@ -658,15 +807,16 @@ void CSkyBox::Update()
void CSkyBox::Render()
{
// PORT: the native-terrain gate of MapOutdoorRenderHTP.cpp; the Godot Metin2World adapter draws the sky otherwise.
if (!IsNativeTerrainRenderEnabled())
return;
// 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,11 +828,12 @@ 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);
@@ -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,13 +876,15 @@ 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;
// 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
@@ -738,7 +892,6 @@ void CSkyBox::RenderCloud()
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);
@@ -747,11 +900,11 @@ void CSkyBox::RenderCloud()
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;
@@ -776,7 +929,6 @@ void CSkyBox::RenderCloud()
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);