DragonNest/Client/EtWorldPainter/TEtWorldLightProp.cpp
2024-12-19 09:48:26 +08:00

644 lines
No EOL
19 KiB
C++
Raw Blame History

#include "StdAfx.h"
#include "TEtWorldLightProp.h"
#include "resource.h"
#include "SundriesFuncEx.h"
#include "AxisRenderObject.h"
#include "RenderBase.h"
#include "TEtWorldSector.h"
#include "TEtWorld.h"
/*
PropertyGridBaseDefine g_LightPropPropertyDefine[] = {
{ "Common", "Position", CUnionValueProperty::Vector3, "World Position", FALSE },
{ "Common", "Rotation", CUnionValueProperty::Vector3, "World Rotation", FALSE },
{ "Common", "Scale", CUnionValueProperty::Vector3, "World Scale", FALSE },
{ "Common", "Cast Shadow", CUnionValueProperty::Boolean, "Cast Shadow", FALSE },
{ "Common", "Receive Shadow", CUnionValueProperty::Boolean, "Receive Shadow", FALSE },
{ "Light", "LightType", CUnionValueProperty::Integer_Combo, "Light Type|Direction|Point|Spot", TRUE },
{ "Light", "Diffuse", CUnionValueProperty::Vector4Color, "Color", TRUE },
{ "Light", "Specular", CUnionValueProperty::Vector4Color, "Color", TRUE },
{ "Light", "Position", CUnionValueProperty::Vector3, "Position", FALSE },
{ "Light", "Direction", CUnionValueProperty::Vector3, "Direction", FALSE },
{ "Light", "Range", CUnionValueProperty::Float, "Range", FALSE },
{ "Light", "Falloff", CUnionValueProperty::Float, "Falloff", FALSE },
{ "Light", "Theta", CUnionValueProperty::Float, "Theta", FALSE },
{ "Light", "Phi", CUnionValueProperty::Float, "Phi", FALSE },
{ "Light", "Cast Shadow", CUnionValueProperty::Boolean, "Cast Shadow", TRUE },
NULL,
};
*/
CTEtWorldLightProp::CTEtWorldLightProp()
{
// Make Direction
m_vDirection[0] = D3DXVECTOR3( 0, 0, -10 );
m_vDirection[1] = D3DXVECTOR3( 0, 0, 10 );
m_vDirection[2] = D3DXVECTOR3( 2, -2, -10 );
m_vDirection[3] = D3DXVECTOR3( 2, 2, -10 );
m_vDirection[4] = D3DXVECTOR3( -2, -2, -10 );
m_vDirection[5] = D3DXVECTOR3( -2, 2, -10 );
m_vDirection[6] = D3DXVECTOR3( 2, -2, -10 );
m_vDirection[7] = D3DXVECTOR3( -2, -2, -10 );
m_vDirection[8] = D3DXVECTOR3( 2, 2, -10 );
m_vDirection[9] = D3DXVECTOR3( -2, 2, -10 );
m_vDirection[10] = D3DXVECTOR3( 2, 2, -10 );
m_vDirection[11] = D3DXVECTOR3( 0, 0, -15 );
m_vDirection[12] = D3DXVECTOR3( 2, -2, -10 );
m_vDirection[13] = D3DXVECTOR3( 0, 0, -15 );
m_vDirection[14] = D3DXVECTOR3( -2, 2, -10 );
m_vDirection[15] = D3DXVECTOR3( 0, 0, -15 );
m_vDirection[16] = D3DXVECTOR3( -2, -2, -10 );
m_vDirection[17] = D3DXVECTOR3( 0, 0, -15 );
}
CTEtWorldLightProp::~CTEtWorldLightProp()
{
FreeObject();
}
bool CTEtWorldLightProp::LoadObject()
{
bool bResult = CTEtWorldProp::LoadObject();
if( bResult == false ) return false;
CreateLight();
return true;
}
bool CTEtWorldLightProp::FreeObject()
{
bool bResult = CTEtWorldProp::FreeObject();
if( bResult == false ) return false;
SAFE_RELEASE_SPTR( m_LightHandle );
return true;
}
void CTEtWorldLightProp::Show( bool bShow )
{
m_bShow = bShow;
if( m_Handle ) m_Handle->ShowObject( bShow );
if( bShow ) CreateLight();
else SAFE_RELEASE_SPTR( m_LightHandle );
}
bool CTEtWorldLightProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale )
{
if( GetPropertyCount() - m_nCustomParamOffset < 10 ) return false;
if( GetProperty(m_nCustomParamOffset)->GetVariableInt() == 0 &&
GetProperty(m_nCustomParamOffset+1)->GetVariableVector4() == EtVector4( 0.f, 0.f, 0.f, 0.f ) &&
GetProperty(m_nCustomParamOffset+2)->GetVariableVector4() == EtVector4( 0.f, 0.f, 0.f, 0.f ) &&
GetProperty(m_nCustomParamOffset+3)->GetVariableVector3() == EtVector3( 0.f, 0.f, 0.f ) &&
GetProperty(m_nCustomParamOffset+4)->GetVariableVector3() == EtVector3( 0.f, 0.f, 0.f ) &&
GetProperty(m_nCustomParamOffset+5)->GetVariableFloat() == 0.f &&
GetProperty(m_nCustomParamOffset+6)->GetVariableFloat() == 0.f &&
GetProperty(m_nCustomParamOffset+7)->GetVariableFloat() == 0.f &&
GetProperty(m_nCustomParamOffset+8)->GetVariableFloat() == 0.f &&
GetProperty(m_nCustomParamOffset+9)->GetVariableBool() == false ) {
SLightInfo Info;
GetProperty(m_nCustomParamOffset)->SetVariable(LT_POINT);
GetProperty(m_nCustomParamOffset+1)->SetVariable((EtVector4)Info.Diffuse);
GetProperty(m_nCustomParamOffset+2)->SetVariable((EtVector4)Info.Specular);
GetProperty(m_nCustomParamOffset+3)->SetVariable((EtVector3)Info.Position);
GetProperty(m_nCustomParamOffset+4)->SetVariable((EtVector3)Info.Direction);
GetProperty(m_nCustomParamOffset+5)->SetVariable(Info.fRange);
GetProperty(m_nCustomParamOffset+6)->SetVariable(Info.fFalloff);
GetProperty(m_nCustomParamOffset+7)->SetVariable( EtToDegree( acos( Info.fTheta) ) );
GetProperty(m_nCustomParamOffset+8)->SetVariable( EtToDegree( acos( Info.fPhi) ) );
}
bool bResult = CTEtWorldProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale );
CreateLight();
return bResult;
}
bool CTEtWorldLightProp::Render( LOCAL_TIME LocalTime )
{
if( !m_Handle ) return false;
EtMatrix mat, matScale, matTemp;
mat = *m_matExWorld;
switch( GetProperty(m_nCustomParamOffset)->GetVariableInt() ) {
case LT_DIRECTIONAL:
{
if( m_bSelect ) DrawDirectionLight();
}
break;
case LT_POINT:
{
MatrixEx Cross;
Cross.m_vPosition = m_matExWorld.m_vPosition;
mat = *Cross;
if( m_bSelect ) DrawPointLight();
}
break;
case LT_SPOT:
{
if( m_bSelect ) DrawSpotLight();
}
break;
}
m_Handle->Update( &mat );
if( m_bSelect ) DrawBoundingBox( mat );
return true;
}
/*
PropertyGridBaseDefine *CTEtWorldLightProp::GetPropertyDefine()
{
return g_LightPropPropertyDefine;
}
*/
void CTEtWorldLightProp::OnSetValue( CUnionValueProperty *pVariable, DWORD dwIndex, CPropertyGridImp *pProperty )
{
SLightInfo Info = GetLightInfo();
bool bEnable = true;
switch( dwIndex ) {
case 1:
if( Info.Type == LT_POINT ) bEnable = false;
break;
case 2:
case 5:
case 6:
bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT:
pVariable->SetVariable( (int)Info.Type );
break;
case PROP_DEFAULT_PROP_COUNT+1:
pVariable->SetVariable( (D3DXVECTOR4)Info.Diffuse );
break;
case PROP_DEFAULT_PROP_COUNT+2:
pVariable->SetVariable( (D3DXVECTOR4)Info.Specular );
break;
case PROP_DEFAULT_PROP_COUNT+3:
if( Info.Type == LT_DIRECTIONAL ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+4:
if( Info.Type == LT_POINT ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+5:
if( Info.Type == LT_DIRECTIONAL ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+6:
if( Info.Type != LT_SPOT ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+7:
if( Info.Type != LT_SPOT ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+8:
if( Info.Type != LT_SPOT ) bEnable = false;
break;
case PROP_DEFAULT_PROP_COUNT+9:
break;
}
pVariable->SetDefaultEnable( bEnable );
// pProperty->SetReadOnly( dwIndex, !bEnable );
CTEtWorldProp::OnSetValue( pVariable, dwIndex, pProperty );
}
void CTEtWorldLightProp::OnChangeValue( CUnionValueProperty *pVariable, DWORD dwIndex, CPropertyGridImp *pProperty )
{
// LightInfoStruct *pStruct = (LightInfoStruct *)m_pAdditionalPropInfo;
SLightInfo Info = GetLightInfo();
bool bEnable = true;
switch( dwIndex ) {
case PROP_DEFAULT_PROP_COUNT:
Info.Type = (LightType)pVariable->GetVariableInt();
switch( Info.Type ) {
case LT_DIRECTIONAL:
pProperty->SetReadOnly( 1, false );
pProperty->SetReadOnly( 2, true );
pProperty->SetReadOnly( 8, true );
pProperty->SetReadOnly( 9, false );
pProperty->SetReadOnly( 10, true );
pProperty->SetReadOnly( 11, true );
pProperty->SetReadOnly( 12, true );
pProperty->SetReadOnly( 13, true );
break;
case LT_POINT:
pProperty->SetReadOnly( 1, true );
pProperty->SetReadOnly( 2, true );
pProperty->SetReadOnly( 8, false );
pProperty->SetReadOnly( 9, true );
pProperty->SetReadOnly( 10, false );
pProperty->SetReadOnly( 11, true );
pProperty->SetReadOnly( 12, true );
pProperty->SetReadOnly( 13, true );
break;
case LT_SPOT:
pProperty->SetReadOnly( 1, false );
pProperty->SetReadOnly( 2, true );
pProperty->SetReadOnly( 8, false );
pProperty->SetReadOnly( 9, false );
pProperty->SetReadOnly( 10, false );
pProperty->SetReadOnly( 11, false );
pProperty->SetReadOnly( 12, false );
pProperty->SetReadOnly( 13, false );
break;
}
CreateLight();
break;
case PROP_DEFAULT_PROP_COUNT+1:
Info.Diffuse = (EtColor)pVariable->GetVariableVector4();
break;
case PROP_DEFAULT_PROP_COUNT+2:
Info.Specular = (EtColor)pVariable->GetVariableVector4();
break;
case PROP_DEFAULT_PROP_COUNT+3:
{
if( Info.Type == LT_DIRECTIONAL ) bEnable = false;
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) break;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
EtVector3 vPos = pVariable->GetVariableVector3();
EtVector3 vOffset = *pSector->GetOffset();
vOffset.x -= ( pSector->GetTileWidthCount() * pSector->GetTileSize() ) / 2.f;
vOffset.z -= ( pSector->GetTileHeightCount() * pSector->GetTileSize() ) / 2.f;
vOffset.y = 0.f;
vPos -= vOffset;
SetPosition( vPos );
UpdateMatrixEx();
}
break;
case PROP_DEFAULT_PROP_COUNT+4:
if( Info.Type == LT_POINT ) bEnable = false;
Info.Direction = pVariable->GetVariableVector3();
m_matExWorld.m_vYAxis = Info.Direction;
m_matExWorld.MakeUpCartesianByZAxis();
break;
case PROP_DEFAULT_PROP_COUNT+5:
if( Info.Type == LT_DIRECTIONAL ) bEnable = false;
Info.fRange = pVariable->GetVariableFloat();
break;
case PROP_DEFAULT_PROP_COUNT+6:
if( Info.Type != LT_SPOT ) bEnable = false;
Info.fFalloff = pVariable->GetVariableFloat();
break;
case PROP_DEFAULT_PROP_COUNT+7:
if( Info.Type != LT_SPOT ) bEnable = false;
// Info.fTheta = cos( EtToRadian( pVariable->GetVariableFloat() ) );
// pVariable->SetVariable( Info.fTheta );
break;
case PROP_DEFAULT_PROP_COUNT+8:
if( Info.Type != LT_SPOT ) bEnable = false;
// Info.fPhi = cos( EtToRadian( pVariable->GetVariableFloat() ) );
// pVariable->SetVariable( Info.fPhi );
break;
case PROP_DEFAULT_PROP_COUNT+9:
Info.bCastShadow = pVariable->GetVariableBool();
break;
}
SetLightInfo( Info );
RefreshLight();
CTEtWorldProp::OnChangeValue( pVariable, dwIndex, pProperty );
CGlobalValue::GetInstance().RefreshRender();
}
void CTEtWorldLightProp::RefreshLight()
{
SLightInfo Info = GetLightInfo();
Info.Diffuse.r *= Info.Diffuse.a;
Info.Diffuse.g *= Info.Diffuse.a;
Info.Diffuse.b *= Info.Diffuse.a;
Info.Specular.r *= Info.Specular.a;
Info.Specular.g *= Info.Specular.a;
Info.Specular.b *= Info.Specular.a;
Info.fTheta = cos( EtToRadian( Info.fTheta ) );
Info.fPhi = cos( EtToRadian( Info.fPhi ) );
m_LightHandle->SetLightInfo( &Info );
}
/*
int CTEtWorldLightProp::GetAdditionalPropInfoSize()
{
return sizeof(LightInfoStruct);
}
void CTEtWorldLightProp::AllocAdditionalPropInfo()
{
m_pAdditionalPropInfo = new LightInfoStruct;
((LightInfoStruct*)m_pAdditionalPropInfo)->Info.Type = LT_POINT;
}
*/
void CTEtWorldLightProp::DrawDirectionLight()
{
EtVector3 vDirection[18];
MatrixEx Cross;
Cross.m_vYAxis = -m_LightHandle->GetLightInfo()->Direction;
Cross.MakeUpCartesianByZAxis();
for( int i=0; i<18; i++ ) {
vDirection[i] = m_vDirection[i] * 100.f;
EtVec3TransformCoord( &vDirection[i], &vDirection[i], Cross );
if( i % 2 == 1 ) {
EternityEngine::DrawLine3D( vDirection[i-1], vDirection[i], 0xFFFFFF00 );
}
}
}
void CTEtWorldLightProp::DrawPointLight()
{
EtVector3 vVec[2];
MatrixEx Cross;
int nDist = 40;
float fAngle = 360 / (float)(nDist-1.f);
SLightInfo *pInfo = m_LightHandle->GetLightInfo();
Cross.m_vPosition = pInfo->Position;
vVec[0] = Cross.m_vPosition + ( Cross.m_vZAxis * pInfo->fRange );
for( int i=0; i<nDist; i++ ) {
Cross.RotateYaw( fAngle );
vVec[1] = Cross.m_vPosition + ( Cross.m_vZAxis * pInfo->fRange );
EternityEngine::DrawLine3D( vVec[0], vVec[1], 0xFFFFFF00 );
vVec[0] = vVec[1];
}
Cross.Identity();
Cross.m_vPosition = pInfo->Position;
vVec[0] = Cross.m_vPosition + ( Cross.m_vZAxis * pInfo->fRange );
for( int i=0; i<nDist; i++ ) {
Cross.RotatePitch( fAngle );
vVec[1] = Cross.m_vPosition + ( Cross.m_vZAxis * pInfo->fRange );
EternityEngine::DrawLine3D( vVec[0], vVec[1], 0xFFFFFF00 );
vVec[0] = vVec[1];
}
Cross.Identity();
Cross.m_vPosition = pInfo->Position;
vVec[0] = Cross.m_vPosition + ( Cross.m_vXAxis * pInfo->fRange );
for( int i=0; i<nDist; i++ ) {
Cross.RotateRoll( fAngle );
vVec[1] = Cross.m_vPosition + ( Cross.m_vXAxis * pInfo->fRange );
EternityEngine::DrawLine3D( vVec[0], vVec[1], 0xFFFFFF00 );
vVec[0] = vVec[1];
}
}
void CTEtWorldLightProp::DrawSpotLight()
{
EtVector3 vVec[2], vVec2[2];
MatrixEx Cross;
SLightInfo Info = GetLightInfo();
float fTheta = Info.fTheta;
float fPhi = Info.fPhi;
// <20>ܰ<EFBFBD>
DrawSpotFunc1( fPhi, &Info, false, 0xFF999900 );
DrawSpotFunc1( -fPhi, &Info, false, 0xFF999900 );
DrawSpotFunc1( fPhi, &Info, true, 0xFF999900 );
DrawSpotFunc1( -fPhi, &Info, true, 0xFF999900 );
// <20><><EFBFBD><EFBFBD>
DrawSpotFunc1( fTheta, &Info, false, 0xFFFFFF00 );
DrawSpotFunc1( -fTheta, &Info, false, 0xFFFFFF00 );
DrawSpotFunc1( fTheta, &Info, true, 0xFFFFFF00 );
DrawSpotFunc1( -fTheta, &Info, true, 0xFFFFFF00 );
// <20>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
int nDist = 30;
float fAngle = 360 / (float)(nDist-1.f);
Cross.m_vPosition = Info.Position + ( Info.Direction * Info.fRange );
Cross.m_vZAxis = Info.Direction;
Cross.MakeUpCartesianByZAxis();
if( EtVec3LengthSq( &Cross.m_vXAxis ) == 0.f ) {
Cross.m_vXAxis = EtVector3( 1.f, 0.f, 0.f );
Cross.MakeUpCartesianByXAxis();
}
float fRangePhi = Info.fRange * tan( EtToRadian( fPhi ) );
float fRangeTheta = Info.fRange * tan( EtToRadian( fTheta ) );
vVec[0] = Cross.m_vPosition + ( Cross.m_vXAxis * fRangePhi );
vVec2[0] = Cross.m_vPosition + ( Cross.m_vXAxis * fRangeTheta );
for( int i=0; i<nDist; i++ ) {
Cross.RotateRoll( fAngle );
vVec[1] = Cross.m_vPosition + ( Cross.m_vXAxis * fRangePhi );
vVec2[1] = Cross.m_vPosition + ( Cross.m_vXAxis * fRangeTheta );
EternityEngine::DrawLine3D( vVec[0], vVec[1], 0xFF999900 );
EternityEngine::DrawLine3D( vVec2[0], vVec2[1], 0xFFFFFF00 );
vVec[0] = vVec[1];
vVec2[0] = vVec2[1];
}
}
void CTEtWorldLightProp::CreateLight()
{
SAFE_RELEASE_SPTR( m_LightHandle );
SLightInfo Info = GetLightInfo();
Info.Position = m_matExWorld.m_vPosition;
switch( Info.Type ) {
case LT_POINT:
Info.Direction = m_matExWorld.m_vZAxis;
break;
case LT_DIRECTIONAL:
case LT_SPOT:
Info.Direction = m_matExWorld.m_vYAxis;
break;
}
SetLightInfo( Info );
Info = GetLightInfo();
Info.Diffuse.r *= Info.Diffuse.a;
Info.Diffuse.g *= Info.Diffuse.a;
Info.Diffuse.b *= Info.Diffuse.a;
Info.Specular.r *= Info.Specular.a;
Info.Specular.g *= Info.Specular.a;
Info.Specular.b *= Info.Specular.a;
m_LightHandle = EternityEngine::CreateLight( &Info );
}
void CTEtWorldLightProp::MoveAxis( int nX, int nY, float fSpeed )
{
SLightInfo Info = GetLightInfo();
bool bUpdateAxis = true;
switch( Info.Type ) {
case LT_DIRECTIONAL:
if( GetAKState( VK_LMENU ) < 0 ) {
bUpdateAxis = false;
}
if( GetAKState( VK_LCONTROL ) < 0 && CAxisRenderObject::m_nSelectAxis == 1 ) {
bUpdateAxis = false;
}
break;
case LT_POINT:
if( GetAKState( VK_LMENU ) < 0 ) {
float fValue = (float)( nX + nY );
Info.fRange += fValue;
bUpdateAxis = false;
}
if( GetAKState( VK_LCONTROL ) < 0 ) {
bUpdateAxis = false;
}
break;
case LT_SPOT:
if( GetAKState( VK_LMENU ) < 0 ) {
switch( CAxisRenderObject::m_nSelectAxis ) {
case 0:
{
float fValue = ( nX * 0.1f ) + ( nY * 0.1f );
float fAngle = Info.fPhi;//EtToDegree( acos( Info.fPhi ) );
fAngle += fValue;
if( fAngle > 180.f ) fAngle = 180.f;
else if( fAngle < Info.fTheta ) fAngle = Info.fTheta;
Info.fPhi = fAngle;//cos( EtToRadian( fAngle ) );
}
break;
case 1:
{
float fValue = (float)( nX + nY );
Info.fRange += fValue;
}
break;
case 2:
{
float fValue = ( nX * 0.1f ) + ( nY * 0.1f );
float fAngle = Info.fTheta;
fAngle += fValue;
if( fAngle > Info.fPhi ) fAngle = Info.fPhi;
else if( fAngle < 0.f ) fAngle = 0.f;
Info.fTheta = fAngle;
}
break;
}
bUpdateAxis = false;
}
if( GetAKState( VK_LCONTROL ) < 0 && CAxisRenderObject::m_nSelectAxis == 1 ) {
bUpdateAxis = false;
}
break;
}
if( bUpdateAxis ) {
CTEtWorldProp::MoveAxis( nX, nY, fSpeed );
}
Info.Position = m_matExWorld.m_vPosition;
switch( Info.Type ) {
case LT_POINT:
Info.Direction = m_matExWorld.m_vZAxis;
break;
case LT_DIRECTIONAL:
case LT_SPOT:
Info.Direction = m_matExWorld.m_vYAxis;
break;
}
m_matExWorld.MakeUpCartesianByZAxis();
SetLightInfo( Info );
RefreshLight();
// m_LightHandle->SetLightInfo( &Info );
}
void CTEtWorldLightProp::DrawSpotFunc1( float fAngle, SLightInfo *pInfo, bool bYawPitch, DWORD dwColor )
{
EtVector3 vVec[2];
MatrixEx Cross;
Cross.m_vZAxis = pInfo->Direction;
Cross.MakeUpCartesianByZAxis();
if( EtVec3LengthSq( &Cross.m_vXAxis ) == 0.f ) {
Cross.m_vXAxis = EtVector3( 1.f, 0.f, 0.f );
Cross.MakeUpCartesianByXAxis();
}
if( bYawPitch == false ) Cross.RotateYaw( fAngle );
else Cross.RotatePitch( fAngle );
float fRange = pInfo->fRange * tan( EtToRadian( abs(fAngle) ) );
vVec[0] = pInfo->Position;
vVec[1] = pInfo->Position + ( Cross.m_vZAxis * sqrtf( (pInfo->fRange*pInfo->fRange) + (fRange*fRange) ) );
EternityEngine::DrawLine3D( vVec[0], vVec[1], dwColor );
}
void CTEtWorldLightProp::UpdateMatrixEx()
{
switch( GetProperty(m_nCustomParamOffset)->GetVariableInt() ) {
case LT_POINT:
m_vRotation = EtVector3( 0.f, 0.f, 0.f );
break;
case LT_DIRECTIONAL:
break;
case LT_SPOT:
break;
}
m_vScale = EtVector3( 0.f, 0.f, 0.f );
CTEtWorldProp::UpdateMatrixEx();
GetProperty(m_nCustomParamOffset+3)->SetVariable( m_matExWorld.m_vPosition );
}
SLightInfo CTEtWorldLightProp::GetLightInfo()
{
SLightInfo Info;
Info.Type = (LightType)GetProperty(m_nCustomParamOffset)->GetVariableInt();
Info.Diffuse = (EtColor)GetProperty(m_nCustomParamOffset+1)->GetVariableVector4();
Info.Specular = (EtColor)GetProperty(m_nCustomParamOffset+2)->GetVariableVector4();
Info.Position = GetProperty(m_nCustomParamOffset+3)->GetVariableVector3();
Info.Direction = GetProperty(m_nCustomParamOffset+4)->GetVariableVector3();
Info.fRange = GetProperty(m_nCustomParamOffset+5)->GetVariableFloat();
Info.fFalloff = GetProperty(m_nCustomParamOffset+6)->GetVariableFloat();
Info.fTheta = GetProperty(m_nCustomParamOffset+7)->GetVariableFloat();
Info.fPhi = GetProperty(m_nCustomParamOffset+8)->GetVariableFloat();
Info.bCastShadow = GetProperty(m_nCustomParamOffset+9)->GetVariableBool();
return Info;
}
void CTEtWorldLightProp::SetLightInfo( SLightInfo Info )
{
GetProperty(m_nCustomParamOffset)->SetVariable( (int)Info.Type );
GetProperty(m_nCustomParamOffset+1)->SetVariable( (EtVector4)Info.Diffuse );
GetProperty(m_nCustomParamOffset+2)->SetVariable( (EtVector4)Info.Specular );
GetProperty(m_nCustomParamOffset+3)->SetVariable( Info.Position );
GetProperty(m_nCustomParamOffset+4)->SetVariable( Info.Direction );
GetProperty(m_nCustomParamOffset+5)->SetVariable( Info.fRange );
GetProperty(m_nCustomParamOffset+6)->SetVariable( Info.fFalloff );
GetProperty(m_nCustomParamOffset+7)->SetVariable( Info.fTheta );
GetProperty(m_nCustomParamOffset+8)->SetVariable( Info.fPhi );
GetProperty(m_nCustomParamOffset+9)->SetVariable( Info.bCastShadow );
}
void CTEtWorldLightProp::ShowProp( bool bShow )
{
m_bShow = bShow;
if( m_Handle ) m_Handle->ShowObject( bShow );
}