reman3/Rayman_X/cpa/tempgrp/OLG/src/LightMod.cpp

490 lines
17 KiB
C++

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : SpotMod.cpp
//
// Modification classes
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from CPA_Modif
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// Creation date: 11 feb 1997 Author: J Thénoz
///////////////////////////////////////////////////////////////////////////////////////////////////
// Modification date: Author:
//
//
//
//
///////////////////////////////////////////////////////////////////////////////////////////////////
*/
#include "stdafx.h"
#include "acp_base.h"
#include "resource.h"
#include "itf.h"
#include "LightMod.hpp"
#include "LightObj.hpp"
#include "LightDia.hpp"
#include "Inter.hpp"
//------ Modif of RGB
ModifLightRGB::ModifLightRGB (Light* poLight, GEO_tdstColor& stColor, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_RGB,"",pBlock)
{
m_poLight = poLight;
m_stColor = stColor;
GLI_xGetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldColor );
m_bRedo = FALSE;
if (poLight) SetName(CString("Change color of ")+poLight->GetName());
}
void ModifLightRGB::fn_vSetLightRGB ( GEO_tdstColor& stColor )
{
m_stColor = stColor;
m_poLight->fn_vNotifySave ();
GLI_xSetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stColor );
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLightRGB::Do (void)
{
GLI_xSetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stColor );
m_poLight->fn_vNotifySave ();
if (m_bRedo) Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->fn_vSetModify (TRUE);
m_bRedo = TRUE;
return TRUE;
}
BOOL ModifLightRGB::Undo (void)
{
GLI_xSetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldColor );
m_poLight->fn_vNotifySave ();
Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//------ Modif Intensity
ModifLightIntensity::ModifLightIntensity (Light* poLight, float& fIntensity, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_INTENSITY,"",pBlock)
{
m_poLight = poLight;
m_fIntensity = fIntensity;
m_fOldIntensity = m_poLight->fn_fGetIntensity();
m_bRedo = FALSE;
GLI_xGetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stColor );
float fCurrentIntensity = m_poLight->fn_fGetIntensity();
if (fCurrentIntensity>1e-6)
{
m_stColor.xR /= fCurrentIntensity;
m_stColor.xG /= fCurrentIntensity;
m_stColor.xB /= fCurrentIntensity;
}
else
{
m_stColor.xR = 0.f;
m_stColor.xG = 0.f;
m_stColor.xB = 0.f;
}
if (poLight) SetName(CString("Change intensity of ")+poLight->GetName());
}
void ModifLightIntensity::fn_vSetLightIntensity (float& fIntensity)
{
m_fIntensity = fIntensity;
m_poLight->fn_vNotifySave ();
fn_vChangeIntensity (m_fIntensity);
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLightIntensity::Do (void)
{
fn_vChangeIntensity (m_fIntensity);
m_poLight->fn_vNotifySave ();
if (m_bRedo) Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->fn_vSetModify (TRUE);
m_bRedo = TRUE;
return TRUE;
}
BOOL ModifLightIntensity::Undo (void)
{
fn_vChangeIntensity (m_fOldIntensity);
m_poLight->fn_vNotifySave ();
Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->fn_vSetModify (TRUE);
return TRUE;
}
void ModifLightIntensity::fn_vChangeIntensity (float& fIntensity)
{
if (m_poLight->fn_lGetType() == GLI_C_lFogLight)
fIntensity = fIntensity / 10.0f;
// color
GEO_tdstColor stColor;
stColor.xR = m_stColor.xR * fIntensity;
stColor.xG = m_stColor.xG * fIntensity;
stColor.xB = m_stColor.xB * fIntensity;
stColor.xA = m_stColor.xA;
if (m_poLight->fn_lGetType() == GLI_C_lFogLight)
{
float fMax = 1.0f;
if (stColor.xR > fMax)
fMax = stColor.xR;
if (stColor.xG > fMax)
fMax = stColor.xG;
if (stColor.xB > fMax)
fMax = stColor.xB;
stColor.xR = stColor.xR / fMax;
stColor.xG = stColor.xG / fMax;
stColor.xB = stColor.xB / fMax;
}
GLI_xSetLightColor ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &stColor );
// intensity
m_poLight->fn_vSetIntensity (fIntensity);
}
//------ Modif of Near Far
ModifLightNearFar::ModifLightNearFar (Light* poLight, MTH_tdxReal& xNearValue, MTH_tdxReal& xFarValue, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_NEARFAR,"",pBlock)
{
m_poLight = poLight;
m_stNearValue = xNearValue;
m_stFarValue = xFarValue;
m_bRedo = FALSE;
if (poLight) SetName(CString("Change near/far of ")+poLight->GetName());
}
void ModifLightNearFar::fn_vSetLightNearFar ( MTH_tdxReal& xNearValue, MTH_tdxReal& xFarValue )
{
m_stNearValue = xNearValue;
m_stFarValue = xFarValue;
GLI_vSetLightNearFar ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stNearValue, m_stFarValue );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLightNearFar::Do (void)
{
GLI_vGetLightNearFar ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldNearValue, &m_stOldFarValue );
GLI_vSetLightNearFar ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stNearValue, m_stFarValue );
if (m_bRedo) Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_bRedo = TRUE;
return TRUE;
}
BOOL ModifLightNearFar::Undo (void)
{
GLI_vSetLightNearFar ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldNearValue, m_stOldFarValue );
Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//------ Modif of Alpha
ModifLightAlpha::ModifLightAlpha (Light* poLight, MTH_tdxReal& xLittleAlpha, MTH_tdxReal& xBigAlpha, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_ALPHA,"",pBlock)
{
m_poLight = poLight;
m_stLittleAlpha = xLittleAlpha;
m_stBigAlpha = xBigAlpha;
m_bRedo = FALSE;
GLI_vGetLightAlphas ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldLittleAlpha, &m_stOldBigAlpha );
if (poLight) SetName(CString("Modify alpha of ")+poLight->GetName());
}
void ModifLightAlpha::fn_vSetLightAlpha ( MTH_tdxReal& xLittleAlpha, MTH_tdxReal& xBigAlpha )
{
m_stLittleAlpha = xLittleAlpha;
m_stBigAlpha = xBigAlpha;
GLI_vSetLightAlphas ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stLittleAlpha, m_stBigAlpha );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLightAlpha::Do (void)
{
GLI_vSetLightAlphas ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stLittleAlpha, m_stBigAlpha );
if (m_bRedo) Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_bRedo=TRUE;
return TRUE;
}
BOOL ModifLightAlpha::Undo (void)
{
GLI_vSetLightAlphas ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldLittleAlpha, m_stOldBigAlpha );
Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->fn_vSetModify (TRUE);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//----- Modif On/Off
ModifLightOnOff::ModifLightOnOff (Light* poLight, BOOL bState, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_STATE,"",pBlock)
{
m_poLight = poLight;
m_bState = bState;
m_bRedo = FALSE;
if (poLight) SetName(CString("Switch ")+poLight->GetName());
}
void ModifLightOnOff::fn_vSetLightOnOff ( BOOL bState )
{
m_bState = bState;
//ANNECY CT 19/02/98{
GLI_vSetLightPerso( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_bState );
//ENDANNECY CT}
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->GetInterface()->fn_GetDialogList()->fn_vRedrawElement(m_poLight->GetSuperObject(), FALSE);
}
BOOL ModifLightOnOff::Do (void)
{
//ANNECY CT 19/02/98{
GLI_vSetLightPerso( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_bState );
//ENDANNECY CT}
m_poLight->fn_vNotifySave ();
if (m_bRedo) Light::fn_pGetDialog()->fn_vEdit (m_poLight);
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->GetInterface()->fn_GetDialogList()->fn_vRedrawElement(m_poLight->GetSuperObject(), FALSE);
m_bRedo = TRUE;
return TRUE;
}
BOOL ModifLightOnOff::Undo (void)
{
//ANNECY CT 19/02/98{
GLI_vSetLightPerso( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), !m_bState );
//ENDANNECY CT}
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
m_poLight->GetInterface()->fn_GetDialogList()->fn_vRedrawElement(m_poLight->GetSuperObject(), FALSE);
return TRUE;
}
//CHINA WFQ (MT) 16/02/98 {
ModifLight_Intensity_Min_Max::ModifLight_Intensity_Min_Max (Light* poLight, MTH_tdxReal& xIntensity_Min, MTH_tdxReal& xIntensity_Max, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_INTENSITY_MIN_MAX,"",pBlock)
{
m_poLight = poLight;
m_stIntensity_Min = xIntensity_Min;
m_stIntensity_Max = xIntensity_Max;
SetName(CString("Change Intensity Min/Max of ")+poLight->GetSuperObject()->GetName());
}
void ModifLight_Intensity_Min_Max::fn_vSetLight_Intensity_Min_Max ( MTH_tdxReal& xIntensity_Min, MTH_tdxReal& xIntensity_Max )
{
m_stIntensity_Min = xIntensity_Min;
m_stIntensity_Max = xIntensity_Max;
GLI_vSetLight_Intensity_Min_Max ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stIntensity_Min, m_stIntensity_Max );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLight_Intensity_Min_Max::Do (void)
{
GLI_vGetLight_Intensity_Min_Max ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldIntensity_Min, &m_stOldIntensity_Max );
GLI_vSetLight_Intensity_Min_Max ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stIntensity_Min, m_stIntensity_Max );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
BOOL ModifLight_Intensity_Min_Max::Undo (void)
{
GLI_vSetLight_Intensity_Min_Max ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldIntensity_Min, m_stOldIntensity_Max );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//
ModifLight_Inter_Min_Pos::ModifLight_Inter_Min_Pos (Light* poLight, MTH3D_tdstVector xInter_Min_Pos, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_INTER_MIN,"",pBlock)
{
m_poLight = poLight;
m_stInter_Min_Pos = xInter_Min_Pos;
SetName(CString("Change Inter Min of ")+poLight->GetSuperObject()->GetName());
}
void ModifLight_Inter_Min_Pos::fn_vSetLight_Inter_Min_Pos ( MTH3D_tdstVector xInter_Min_Pos )
{
m_stInter_Min_Pos = xInter_Min_Pos;
GLI_vSetLight_Inter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stInter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLight_Inter_Min_Pos::Do (void)
{
GLI_vGetLight_Inter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldInter_Min_Pos );
GLI_vSetLight_Inter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stInter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
BOOL ModifLight_Inter_Min_Pos::Undo (void)
{
GLI_vSetLight_Inter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldInter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//
ModifLight_Inter_Max_Pos::ModifLight_Inter_Max_Pos (Light* poLight, MTH3D_tdstVector xInter_Max_Pos, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_INTER_MAX,"",pBlock)
{
m_poLight = poLight;
m_stInter_Max_Pos = xInter_Max_Pos;
SetName(CString("Change Inter Max of ")+poLight->GetSuperObject()->GetName());
}
void ModifLight_Inter_Max_Pos::fn_vSetLight_Inter_Max_Pos ( MTH3D_tdstVector xInter_Max_Pos )
{
m_stInter_Max_Pos = xInter_Max_Pos;
GLI_vSetLight_Inter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stInter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLight_Inter_Max_Pos::Do (void)
{
GLI_vGetLight_Inter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldInter_Max_Pos );
GLI_vSetLight_Inter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stInter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
BOOL ModifLight_Inter_Max_Pos::Undo (void)
{
GLI_vSetLight_Inter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldInter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//
ModifLight_Exter_Min_Pos::ModifLight_Exter_Min_Pos (Light* poLight, MTH3D_tdstVector xExter_Min_Pos, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_EXTER_MIN,"",pBlock)
{
m_poLight = poLight;
m_stExter_Min_Pos = xExter_Min_Pos;
SetName(CString("Change Exter Min of ")+poLight->GetSuperObject()->GetName());
}
void ModifLight_Exter_Min_Pos::fn_vSetLight_Exter_Min_Pos( MTH3D_tdstVector xExter_Min_Pos )
{
m_stExter_Min_Pos = xExter_Min_Pos;
GLI_vSetLight_Exter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stExter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLight_Exter_Min_Pos::Do (void)
{
GLI_vGetLight_Exter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldExter_Min_Pos );
GLI_vSetLight_Exter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stExter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
BOOL ModifLight_Exter_Min_Pos::Undo (void)
{
GLI_vSetLight_Exter_Min_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldExter_Min_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//
ModifLight_Exter_Max_Pos::ModifLight_Exter_Max_Pos (Light* poLight, MTH3D_tdstVector xExter_Max_Pos, BOOL pBlock) : CPA_Modif (TYPE_CHANGE_EXTER_MAX,"",pBlock)
{
m_poLight = poLight;
m_stExter_Max_Pos = xExter_Max_Pos;
SetName(CString("Change Exter Max of ")+poLight->GetSuperObject()->GetName());
}
void ModifLight_Exter_Max_Pos::fn_vSetLight_Exter_Max_Pos ( MTH3D_tdstVector xExter_Max_Pos )
{
m_stExter_Max_Pos = xExter_Max_Pos;
GLI_vSetLight_Exter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stExter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
BOOL ModifLight_Exter_Max_Pos::Do (void)
{
GLI_vGetLight_Exter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), &m_stOldExter_Max_Pos );
GLI_vSetLight_Exter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stExter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
BOOL ModifLight_Exter_Max_Pos::Undo (void)
{
GLI_vSetLight_Exter_Max_Pos ( (GLI_tdxHandleToLight)m_poLight->GetEngineStruct(), m_stOldExter_Max_Pos );
m_poLight->fn_vNotifySave ();
m_poLight->GetInterface()->fn_vComputeRLI ();
m_poLight->GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
return TRUE;
}
//ENDCHINA WFQ }