262 lines
No EOL
9.2 KiB
C++
262 lines
No EOL
9.2 KiB
C++
#include "StdAfx.h"
|
|
#include "EnviLightDirection.h"
|
|
#include "RenderBase.h"
|
|
#include "InputReceiver.h"
|
|
#include "GlobalValue.h"
|
|
#include "SundriesFuncEx.h"
|
|
#include "resource.h"
|
|
#include "MainFrm.h"
|
|
#include "PaneDefine.h"
|
|
#include "UserMessage.h"
|
|
#include "EnviLightPaneView.h"
|
|
|
|
PropertyGridBaseDefine g_PropertyDefineDirection[] = {
|
|
{ "Setting", "Diffuse", CUnionValueProperty::Vector4Color, "Diffuse Color", TRUE },
|
|
{ "Setting", "Specular", CUnionValueProperty::Vector4Color, "Specular Color", TRUE },
|
|
{ "Setting", "Direction", CUnionValueProperty::Vector3, "Direction!", TRUE },
|
|
{ "Setting", "Cast Shadow", CUnionValueProperty::Boolean, "Shadow", TRUE },
|
|
{ "Effect", "Enable Lens Flare", CUnionValueProperty::Boolean, "Enable LensFlare Effect", TRUE },
|
|
{ "Effect", "Sun Texture", CUnionValueProperty::String_FileOpen, "Sun Texture|Direct Draw Surface File|*.dds", TRUE },
|
|
{ "Effect", "LensFlare Texture", CUnionValueProperty::String_FileOpen, "LensFlare Texture|Direct Draw Surface File|*.dds", TRUE },
|
|
{ "Effect", "Sun Radius", CUnionValueProperty::Float, "Sun Radius|0.f|.5f|0.0001f", TRUE },
|
|
{ "Effect", "LensFlare Radius", CUnionValueProperty::Float, "LensFlare Radius|0.f|2.0f|0.0001f", TRUE },
|
|
{ "Effect", "X Axis Revision Angle", CUnionValueProperty::Float, "Revision X Axis Angle|-180.f|180.0f|0.0001f", TRUE },
|
|
{ "Effect", "Y Axis Revision Angle", CUnionValueProperty::Float, "Revision X Axis Angle|-180.f|180.0f|0.0001f", TRUE },
|
|
NULL,
|
|
};
|
|
|
|
EtVector3 CEnviLightDirection::s_vDirection[18];
|
|
int CEnviLightDirection::s_nRefCount = 0;
|
|
|
|
|
|
CEnviLightDirection::CEnviLightDirection( CEnviElement *pElement )
|
|
: CEnviLightBase( pElement )
|
|
{
|
|
m_nMouseFlag = 0;
|
|
|
|
if( s_nRefCount == 0 ) {
|
|
// Make Direction
|
|
s_vDirection[0] = D3DXVECTOR3( 0, 0, -10 );
|
|
s_vDirection[1] = D3DXVECTOR3( 0, 0, 10 );
|
|
s_vDirection[2] = D3DXVECTOR3( 2, -2, -10 );
|
|
s_vDirection[3] = D3DXVECTOR3( 2, 2, -10 );
|
|
s_vDirection[4] = D3DXVECTOR3( -2, -2, -10 );
|
|
s_vDirection[5] = D3DXVECTOR3( -2, 2, -10 );
|
|
s_vDirection[6] = D3DXVECTOR3( 2, -2, -10 );
|
|
s_vDirection[7] = D3DXVECTOR3( -2, -2, -10 );
|
|
s_vDirection[8] = D3DXVECTOR3( 2, 2, -10 );
|
|
s_vDirection[9] = D3DXVECTOR3( -2, 2, -10 );
|
|
s_vDirection[10] = D3DXVECTOR3( 2, 2, -10 );
|
|
s_vDirection[11] = D3DXVECTOR3( 0, 0, -15 );
|
|
s_vDirection[12] = D3DXVECTOR3( 2, -2, -10 );
|
|
s_vDirection[13] = D3DXVECTOR3( 0, 0, -15 );
|
|
s_vDirection[14] = D3DXVECTOR3( -2, 2, -10 );
|
|
s_vDirection[15] = D3DXVECTOR3( 0, 0, -15 );
|
|
s_vDirection[16] = D3DXVECTOR3( -2, -2, -10 );
|
|
s_vDirection[17] = D3DXVECTOR3( 0, 0, -15 );
|
|
s_nRefCount++;
|
|
}
|
|
}
|
|
|
|
CEnviLightDirection::~CEnviLightDirection()
|
|
{
|
|
s_nRefCount--;
|
|
}
|
|
|
|
void CEnviLightDirection::OnSetValue( CUnionValueProperty *pVariable, DWORD dwIndex )
|
|
{
|
|
CWnd *pWnd = GetPaneWnd( ENVI_PANE );
|
|
CEnviLightPaneView *pLightPane = ((CEnviPaneView*)pWnd)->GetLightView();
|
|
switch( dwIndex ) {
|
|
case 0:
|
|
pVariable->SetVariable( (D3DXVECTOR4)m_pElementPtr->pInfo->Diffuse );
|
|
break;
|
|
case 1:
|
|
pVariable->SetVariable( (D3DXVECTOR4)m_pElementPtr->pInfo->Specular );
|
|
break;
|
|
case 2:
|
|
pVariable->SetVariable( m_pElementPtr->pInfo->Direction );
|
|
break;
|
|
case 3:
|
|
pVariable->SetVariable( m_pElementPtr->pInfo->bCastShadow );
|
|
break;
|
|
case 4:
|
|
pVariable->SetVariable( m_pElementPtr->bEnable );
|
|
break;
|
|
case 5:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( (CHAR*)m_pElementPtr->szSunTexture.c_str() );
|
|
break;
|
|
case 6:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( (CHAR*)m_pElementPtr->szLensFlareTexture.c_str() );
|
|
break;
|
|
case 7:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( m_pElementPtr->fSunScale );
|
|
break;
|
|
case 8:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( m_pElementPtr->fLensScale );
|
|
break;
|
|
case 9:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( m_pElementPtr->fRevisionXAxisAngle );
|
|
break;
|
|
case 10:
|
|
pVariable->SetDefaultEnable( m_pElementPtr->bEnable );
|
|
pVariable->SetVariable( m_pElementPtr->fRevisionYAxisAngle );
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CEnviLightDirection::OnChangeValue( CUnionValueProperty *pVariable, DWORD dwIndex )
|
|
{
|
|
CWnd *pWnd = GetPaneWnd( ENVI_PANE );
|
|
CEnviLightPaneView *pLightPane = ((CEnviPaneView*)pWnd)->GetLightView();
|
|
switch( dwIndex ) {
|
|
case 0:
|
|
m_pElementPtr->pInfo->Diffuse = (EtColor)pVariable->GetVariableVector4();
|
|
break;
|
|
case 1:
|
|
m_pElementPtr->pInfo->Specular = (EtColor)pVariable->GetVariableVector4();
|
|
break;
|
|
case 2:
|
|
m_pElementPtr->pInfo->Direction = (EtVector3)pVariable->GetVariableVector3();
|
|
if( m_pElementPtr->bEnable ) {
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
}
|
|
break;
|
|
case 3:
|
|
m_pElementPtr->pInfo->bCastShadow = pVariable->GetVariableBool();
|
|
break;
|
|
case 4:
|
|
m_pElementPtr->bEnable = pVariable->GetVariableBool();
|
|
pLightPane->SetReadOnly( 5, !m_pElementPtr->bEnable );
|
|
pLightPane->SetReadOnly( 6, !m_pElementPtr->bEnable );
|
|
pLightPane->SetReadOnly( 7, !m_pElementPtr->bEnable );
|
|
pLightPane->SetReadOnly( 8, !m_pElementPtr->bEnable );
|
|
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, true );
|
|
break;
|
|
case 5:
|
|
{
|
|
char szTemp[256] = { 0, };
|
|
CString szStr = pVariable->GetVariableString();
|
|
if( !szStr.IsEmpty() )
|
|
_GetFullFileName( szTemp, _countof(szTemp), pVariable->GetVariableString() );
|
|
|
|
m_pElementPtr->szSunTexture = szTemp;
|
|
if( !szStr.IsEmpty() ) {
|
|
CEnviPaneView *pParent = (CEnviPaneView *)GetPaneWnd( ENVI_PANE );
|
|
pParent->CopyAccompanimentFile( pVariable->GetVariableString() );
|
|
}
|
|
|
|
pVariable->SetVariable( szTemp );
|
|
pLightPane->UpdateItem();
|
|
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
}
|
|
break;
|
|
case 6:
|
|
{
|
|
char szTemp[256] = { 0, };
|
|
CString szStr = pVariable->GetVariableString();
|
|
if( !szStr.IsEmpty() )
|
|
_GetFullFileName( szTemp, _countof(szTemp), pVariable->GetVariableString() );
|
|
|
|
m_pElementPtr->szLensFlareTexture = szTemp;
|
|
if( !szStr.IsEmpty() ) {
|
|
CEnviPaneView *pParent = (CEnviPaneView *)GetPaneWnd( ENVI_PANE );
|
|
pParent->CopyAccompanimentFile( pVariable->GetVariableString() );
|
|
}
|
|
|
|
pVariable->SetVariable( szTemp );
|
|
pLightPane->UpdateItem();
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
}
|
|
break;
|
|
case 7:
|
|
m_pElementPtr->fSunScale = pVariable->GetVariableFloat();
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
break;
|
|
case 8:
|
|
m_pElementPtr->fLensScale = pVariable->GetVariableFloat();
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
break;
|
|
case 9:
|
|
m_pElementPtr->fRevisionXAxisAngle = pVariable->GetVariableFloat();
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
break;
|
|
case 10:
|
|
m_pElementPtr->fRevisionYAxisAngle = pVariable->GetVariableFloat();
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool CEnviLightDirection::OnInputReceive( int nReceiverState, LOCAL_TIME LocalTime, CInputReceiver *pReceiver )
|
|
{
|
|
if( GetAKState( VK_LCONTROL ) >= 0 ) return true;
|
|
|
|
if( nReceiverState & CInputReceiver::IR_MOUSE_MOVE ) {
|
|
if( m_nMouseFlag & LB_DOWN ) {
|
|
m_matExWorld.RotateYAxis( pReceiver->GetMouseVariation().x / 2.f );
|
|
m_matExWorld.RotatePitch( pReceiver->GetMouseVariation().y / 2.f );
|
|
|
|
m_pElementPtr->pInfo->Direction = m_matExWorld.m_vZAxis;
|
|
static CUnionValueProperty Variable( CUnionValueProperty::Vector3 );
|
|
Variable.SetVariable(m_pElementPtr->pInfo->Direction);
|
|
|
|
CWnd *pWnd = GetPaneWnd( ENVI_PANE );
|
|
if( pWnd ) pWnd->SendMessage( UM_PROPERTY_PANE_SET_MODIFY, 2, (LPARAM)&Variable );
|
|
|
|
CRenderBase::GetInstance().InitializeEnviLight( m_pElement, false );
|
|
CRenderBase::GetInstance().InitializeEnviLensFlare( m_pElement, false );
|
|
}
|
|
}
|
|
if( nReceiverState & CInputReceiver::IR_MOUSE_LB_DOWN ) {
|
|
if( IsInMouseRect( CGlobalValue::GetInstance().m_pParentView ) ) {
|
|
m_nMouseFlag |= LB_DOWN;
|
|
|
|
m_matExWorld.Identity();
|
|
m_matExWorld.m_vZAxis = m_pElementPtr->pInfo->Direction;
|
|
m_matExWorld.MakeUpCartesianByZAxis();
|
|
}
|
|
}
|
|
if( nReceiverState & CInputReceiver::IR_MOUSE_LB_UP ) {
|
|
m_nMouseFlag &= ~LB_DOWN;
|
|
}
|
|
CGlobalValue::GetInstance().RefreshRender();
|
|
return false;
|
|
}
|
|
|
|
PropertyGridBaseDefine *CEnviLightDirection::GetPropertyDefine()
|
|
{
|
|
return g_PropertyDefineDirection;
|
|
}
|
|
|
|
void CEnviLightDirection::OnCustomDraw()
|
|
{
|
|
float fDistance = EtVec3Length( &CRenderBase::GetInstance().GetLastUpdateCamera()->m_vPosition );
|
|
float fScale = fDistance / 10.f;
|
|
|
|
EtVector3 vDirection[18];
|
|
MatrixEx Cross;
|
|
Cross.m_vZAxis = -m_pElementPtr->pInfo->Direction;
|
|
Cross.MakeUpCartesianByZAxis();
|
|
|
|
for( int i=0; i<18; i++ ) {
|
|
vDirection[i] = s_vDirection[i] * fScale;
|
|
EtVec3TransformCoord( &vDirection[i], &vDirection[i], Cross );
|
|
if( i % 2 == 1 ) {
|
|
EternityEngine::DrawLine3D( vDirection[i-1], vDirection[i], 0xFFFFFF00 );
|
|
}
|
|
}
|
|
} |