123
This commit is contained in:
226
Editor/TerrainLighting.h
Normal file
226
Editor/TerrainLighting.h
Normal file
@@ -0,0 +1,226 @@
|
||||
#if !defined(AFX_TERRAINLIGHTING_H__4CAA5295_2647_42FD_8334_359F55EBA4F8__INCLUDED_)
|
||||
#define AFX_TERRAINLIGHTING_H__4CAA5295_2647_42FD_8334_359F55EBA4F8__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
// TerrainLighting.h : header file
|
||||
//
|
||||
|
||||
#include "TerrainTexGen.h"
|
||||
#include "afxcmn.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CTerrainLighting dialog
|
||||
|
||||
enum eLightAlgorithm // correstpond to the radio buttons in the lighting dialog
|
||||
{
|
||||
eHemisphere = 0,
|
||||
eDP3 = 1,
|
||||
ePrecise = 2,
|
||||
};
|
||||
|
||||
struct LightingSettings
|
||||
{
|
||||
uint iAmbient; // Ambient level of lighting.
|
||||
DWORD dwSunColor; // Color of the sun
|
||||
DWORD dwSkyColor; // Color of the sky
|
||||
eLightAlgorithm eAlgo; // Algorithm to use for the lighting calculations
|
||||
bool bTerrainShadows; // Calculate shadows from hills (default false)
|
||||
bool bObjectShadows; // Calculate shadows from objects (default true)
|
||||
bool bLighting; // Calculate lighting (default true)
|
||||
int iSunRotation; // Rotation of the sun (default 0) 0..360
|
||||
int iSunHeight; // Height of the sun (default 25) 0..100
|
||||
int iShadowIntensity; // Intensity of the shadows
|
||||
int iShadowBlur; // bluriness (no unit) 0=non..100=strong
|
||||
float sunMultiplier; // Multiplier of sun color.
|
||||
int iHemiSamplQuality; // 0=no sampling (=ambient, might be brighter), 1=low (faster) .. 10=highest(slow)
|
||||
|
||||
//! constructor
|
||||
LightingSettings()
|
||||
{
|
||||
iAmbient = 0;
|
||||
dwSkyColor = 0x00aa4040;
|
||||
dwSunColor = 0x00FFFFFF;
|
||||
eAlgo = ePrecise;
|
||||
bTerrainShadows = true;
|
||||
bObjectShadows = true;
|
||||
bLighting = true;
|
||||
iSunRotation = 0;
|
||||
iSunHeight = 10;
|
||||
iShadowIntensity = 50;
|
||||
iShadowBlur=1;
|
||||
sunMultiplier = 1;
|
||||
iHemiSamplQuality=5;
|
||||
}
|
||||
|
||||
Vec3 GetSunVector() const
|
||||
{
|
||||
Vec3 v;
|
||||
|
||||
v.z = - ((float)iSunHeight / 100.0f);
|
||||
|
||||
float r=sqrtf(1.0f-v.z*v.z);
|
||||
|
||||
v.x = sinf(iSunRotation * gf_DEGTORAD)*r;
|
||||
v.y = cosf(iSunRotation * gf_DEGTORAD)*r;
|
||||
|
||||
// Normalize the light vector
|
||||
return GetNormalized(v);
|
||||
}
|
||||
|
||||
void Serialize( XmlNodeRef &node,bool bLoading )
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Load or restore the layer settings from an XML
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
if (bLoading)
|
||||
{
|
||||
XmlNodeRef light = node->findChild( "Lighting" );
|
||||
if (!light)
|
||||
return;
|
||||
|
||||
int algo = 0;
|
||||
light->getAttr( "Ambient",iAmbient );
|
||||
light->getAttr( "SkyColor",dwSkyColor );
|
||||
light->getAttr( "SunColor",dwSunColor );
|
||||
light->getAttr( "SunRotation",iSunRotation );
|
||||
light->getAttr( "SunHeight",iSunHeight );
|
||||
light->getAttr( "Algorithm",algo );
|
||||
light->getAttr( "Lighting",bLighting );
|
||||
light->getAttr( "Shadows",bTerrainShadows );
|
||||
light->getAttr( "ObjShadows",bObjectShadows );
|
||||
light->getAttr( "ShadowIntensity",iShadowIntensity );
|
||||
light->getAttr( "SunMultiplier",sunMultiplier );
|
||||
light->getAttr( "HemiSamplQuality",iHemiSamplQuality );
|
||||
light->getAttr( "ShadowBlur",iShadowBlur );
|
||||
|
||||
switch(algo)
|
||||
{
|
||||
case 0: eAlgo = eHemisphere;break;
|
||||
case 1: eAlgo = eDP3;break;
|
||||
case 2: eAlgo = ePrecise;break; // legacy - for backward compatibility
|
||||
case 3: eAlgo = ePrecise;break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int algo = 0;
|
||||
|
||||
switch(eAlgo)
|
||||
{
|
||||
case eHemisphere: algo = 0;break;
|
||||
case eDP3: algo = 1;break;
|
||||
// 2 // don't use 2
|
||||
case ePrecise: algo = 3;break;
|
||||
}
|
||||
|
||||
|
||||
// Storing
|
||||
XmlNodeRef light = node->newChild( "Lighting" );
|
||||
light->setAttr( "Ambient",iAmbient );
|
||||
light->setAttr( "SkyColor",dwSkyColor );
|
||||
light->setAttr( "SunColor",dwSunColor );
|
||||
light->setAttr( "SunRotation",iSunRotation );
|
||||
light->setAttr( "SunHeight",iSunHeight );
|
||||
light->setAttr( "Algorithm",algo );
|
||||
light->setAttr( "Lighting",bLighting );
|
||||
light->setAttr( "Shadows",bTerrainShadows );
|
||||
light->setAttr( "ObjShadows",bObjectShadows );
|
||||
light->setAttr( "ShadowIntensity",iShadowIntensity );
|
||||
light->setAttr( "SunMultiplier",sunMultiplier );
|
||||
light->setAttr( "HemiSamplQuality",iHemiSamplQuality );
|
||||
light->setAttr( "ShadowBlur",iShadowBlur );
|
||||
|
||||
Vec3 sunVector = GetSunVector();
|
||||
//std::swap(sunVector.x,sunVector.y);
|
||||
// Swap X/Y.
|
||||
light->setAttr( "SunVector",sunVector );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class CTerrainLighting : public CDialog
|
||||
{
|
||||
// Construction
|
||||
public:
|
||||
CTerrainLighting(CWnd* pParent = NULL); // standard constructor
|
||||
~CTerrainLighting();
|
||||
|
||||
// Dialog Data
|
||||
//{{AFX_DATA(CTerrainLighting)
|
||||
enum { IDD = IDD_LIGHTING };
|
||||
int m_sldAmbient;
|
||||
int m_optLightingAlgo;
|
||||
int m_sldSunDirection;
|
||||
int m_sldSunHeight;
|
||||
BOOL m_bTerrainShadows;
|
||||
BOOL m_bObjectShadows;
|
||||
BOOL m_bTextured;
|
||||
int m_sldShadowIntensity;
|
||||
int m_sldShadowBlur; // in degrees 0..100
|
||||
int m_sldSkyQuality;
|
||||
//}}AFX_DATA
|
||||
|
||||
|
||||
// Overrides
|
||||
// ClassWizard generated virtual function overrides
|
||||
//{{AFX_VIRTUAL(CTerrainLighting)
|
||||
public:
|
||||
virtual BOOL DestroyWindow();
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
//}}AFX_VIRTUAL
|
||||
|
||||
// Implementation
|
||||
protected:
|
||||
CBitmap m_bmpLightmap;
|
||||
CDC m_dcLightmap;
|
||||
CTerrainTexGen m_texGen;
|
||||
CImage m_lightmap;
|
||||
|
||||
virtual void OnOK();
|
||||
virtual void OnCancel();
|
||||
|
||||
bool m_bDraggingSunDirection;
|
||||
|
||||
// Generated message map functions
|
||||
//{{AFX_MSG(CTerrainLighting)
|
||||
afx_msg void OnPaint();
|
||||
afx_msg void OnGenerate();
|
||||
virtual BOOL OnInitDialog();
|
||||
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
|
||||
afx_msg void OnTerrainShadows();
|
||||
afx_msg void OnObjectShadows();
|
||||
afx_msg void OnFileExport();
|
||||
afx_msg void OnFileImport();
|
||||
afx_msg void OnSkyFog();
|
||||
afx_msg void OnViewWithTexturing();
|
||||
afx_msg void OnSunColor();
|
||||
afx_msg void OnSkyColor();
|
||||
afx_msg void OnHemisphere();
|
||||
afx_msg void OnDp3();
|
||||
afx_msg void OnSunMultiplier();
|
||||
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
|
||||
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
|
||||
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
|
||||
afx_msg void OnBnClickedTextured();
|
||||
//}}AFX_MSG
|
||||
DECLARE_MESSAGE_MAP()
|
||||
|
||||
private:
|
||||
void UpdateControls();
|
||||
|
||||
// Permanently allocated for better speed
|
||||
float *m_pHeightmapData;
|
||||
|
||||
CNumberCtrl m_sunMult;
|
||||
LightingSettings m_originalLightSettings;
|
||||
public:
|
||||
afx_msg void OnBnClickedPreciselighting2();
|
||||
};
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_TERRAINLIGHTING_H__4CAA5295_2647_42FD_8334_359F55EBA4F8__INCLUDED_)
|
||||
Reference in New Issue
Block a user