3424 lines
110 KiB
C++
3424 lines
110 KiB
C++
/*
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description : Inter.cpp
|
|
//
|
|
// Interface DLL class.
|
|
// This class is implement the DLL class.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// inherit from CPA_ObjectDLLBase
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// 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 "ogd.h"
|
|
#include "dpt.h"
|
|
#include "incsct.h"
|
|
#include "incgam.h"
|
|
|
|
#include "LightDia.hpp"
|
|
#include "RliDia.hpp"
|
|
#include "Inter.hpp"
|
|
#include "LightObj.hpp"
|
|
#include "EdLight.h"
|
|
#include "po.h"
|
|
#include "ipo.h"
|
|
#include "isi.h"
|
|
#include "x:\cpa\main\inc\_editid.h"
|
|
#include <direct.h>
|
|
#include "ray.h"
|
|
#include "tut.h"
|
|
|
|
// infos
|
|
static CString g_csOLGName = "Light";
|
|
static CString g_csOLGAuthor = "Jacques Thénoz";
|
|
static CString g_csOLGVersion = "V 4.0.4 01/04/99";
|
|
static CString g_csOLGFrenchHelpFile = "Lumiere.hlp";
|
|
static CString g_csOLGEnglishHelpFile = "";
|
|
|
|
BOOL g_bTipFirstTime = TRUE;
|
|
|
|
//----------------------------------------------------------------------
|
|
// submenu commands
|
|
#define c_Light_Submenu_Activate 1939
|
|
#define c_Light_SubMenu_Compute_RLI 1945
|
|
#define c_Light_SubMenu_Save_Preference 1914
|
|
#define c_Light_SubMenu_UpDate_Light 1918
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// popup menu command
|
|
#define c_Light_Popup_On 1234
|
|
#define c_Light_Popup_Off 1235
|
|
#define c_Light_Popup_Goto 1236
|
|
#define c_Light_Popup_Exit 1237
|
|
#define c_light_Popup_Update 1238
|
|
#define c_light_Popup_RealTime_On 1239
|
|
#define c_light_Popup_RealTime_Off 1240
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// Definition of lists names
|
|
static CString csHierarchyList = "Hierarchy";
|
|
static CString csCurrentList = "Current model";
|
|
static CString csLightList = "Light";
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
//---- provisoire
|
|
#define HIE_M_p_stGetSuperObject(_hSprObj) (_hSprObj)
|
|
#define HIE_M_xGetSuperObjectMember(_hSprObj,_member) ((_hSprObj)->_member)
|
|
#define HIE_M_vSetSuperObjectMember(_hSprObj,_member,_value) {(_hSprObj)->_member=(_value);}
|
|
//---- fin provisoire
|
|
|
|
|
|
//----------- Keyboard mapping
|
|
//CPA2 Corneliu Babiuc 26-05-98
|
|
//#define KA_LIGHT_NEAR 1
|
|
//#define KA_LIGHT_FAR 2
|
|
//#define KA_LIGHT_FREE_MOVE 3
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
#define KA_LIGHT_ORIENT 5
|
|
//CPA2 Corneliu Babiuc 26-05-98
|
|
#define KA_LIGHT_SWITCH 6
|
|
#define KA_REAL_TIME 7
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
#define KA_CONTROL 10
|
|
|
|
tdstKeyboardActionDef Light_Interface::ms_a_stLightKeys [] =
|
|
{
|
|
//CPA2 Corneliu Babiuc 26-05-98
|
|
// { "Near", KA_LIGHT_NEAR},
|
|
// { "Far", KA_LIGHT_FAR },
|
|
// { "Free move", KA_LIGHT_FREE_MOVE },
|
|
//END CPA2 Corneliu Babiuc 26-05-98
|
|
{ "Orient light", KA_LIGHT_ORIENT },
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
{ "Active light", KA_LIGHT_SWITCH },
|
|
{ "Real time", KA_REAL_TIME },
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
{ "Ctrl", KA_CONTROL },
|
|
{ NULL, 0 }
|
|
};
|
|
//-------------
|
|
BOOL g_bKeyUsed = FALSE;
|
|
|
|
// the DLL global definition
|
|
tdstDLLIdentity g_stLightIdentity;
|
|
|
|
#define C_szLightIniFile "Light\\Light.ini"
|
|
|
|
CString g_csPreviousList;
|
|
BOOL g_bEditorMode = FALSE;
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// CONSTRUCTOR.
|
|
// You must put here all your DLL interface definitions.
|
|
//--------------------------------------------------------------------------------
|
|
Light_Interface::Light_Interface(void)
|
|
{
|
|
// ************************** private internal
|
|
m_p_stDLLIdentity = &g_stLightIdentity;
|
|
|
|
// Does your DLL can output in main game view ?
|
|
m_stBaseDLLDefinition.bCanOutputIn3DView = TRUE;
|
|
|
|
// Does your DLL can be refresh by engine ?
|
|
m_stBaseDLLDefinition.bCanBeRefreshedByEngine = TRUE;
|
|
|
|
m_bDialogOnScreen=FALSE;
|
|
m_o_ModifRadiusLight=NULL;
|
|
m_poRClicLight=NULL;
|
|
m_poLight=NULL;
|
|
m_bMainDll=FALSE;
|
|
m_bExistSaveFile=FALSE;
|
|
m_bFirstBeforeEditor=TRUE;
|
|
m_bLoadLight=FALSE;
|
|
m_bSaveRLI=FALSE;
|
|
m_bNotifyIPO=FALSE;
|
|
m_bSkipOnModifDelete=FALSE;
|
|
m_bOrientLight=FALSE;
|
|
m_ListDeleteLightBeforeEngine.RemoveAll ();
|
|
m_bModifyAll=FALSE;
|
|
m_oModifSectorList.RemoveAll ();
|
|
//ROMTEAM SelectMode (Ionut Grozea 25/02/98)
|
|
m_bSelectModeIsLight = 0;
|
|
//ENDROMTEAM SelectMode (Ionut Grozea)
|
|
//ROMTEAM RealLights (Ionut Grozea 05/03/98)
|
|
m_ListDeleteLight.RemoveAll ();
|
|
m_bEditOnlyRealLights = FALSE;
|
|
//ENDROMTEAM RealLights (Ionut Grozea)
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
m_bIs2ColorMode = TRUE;
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
//--- help menu
|
|
SetEditorInfo(g_csOLGName, g_csOLGAuthor, g_csOLGVersion, g_csOLGFrenchHelpFile, g_csOLGEnglishHelpFile);
|
|
|
|
|
|
//--- mapping keyboard
|
|
m_poKeyboard = new CPA_KeyActionConfiguration (CString("objects\\Light\\Light.ini"), ms_a_stLightKeys );
|
|
m_poKeyboard->mfn_vSetObjectName ( CString ("Light Editor") );
|
|
}
|
|
|
|
Light_Interface::~Light_Interface(void)
|
|
{
|
|
delete m_poKeyboard;
|
|
m_poKeyboard=NULL;
|
|
}
|
|
|
|
|
|
|
|
void Light_Interface::fn_vJustAfterRegistered (void)
|
|
{
|
|
//----------------------------------------- declare the type name
|
|
CString apszName[] = { "Light", "LightCursor" };
|
|
fn_vRegisterObjectsType(apszName,2);
|
|
|
|
//----- static init of objects
|
|
Light::fn_vInitObject ();
|
|
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vConstruct(void)
|
|
{
|
|
//------------------------ .ini file
|
|
int iDim;
|
|
char szDimension[256];
|
|
CString csFileName = M_GetMainApp()->m_csEditorDataPath + "Objects\\" + C_szLightIniFile;
|
|
|
|
|
|
//-------------------------------------------------------- splitters
|
|
m_p_oSplitFrameLight = new CSplitFrame();
|
|
m_p_oSplitFrameLight->CreateBase( "Edition", 1, 2, GetInterface()->GetMainWorld() );
|
|
m_p_oSplitFrameLight->CreateSplitter( C_cVerticalSplitter, 2);
|
|
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle( m_p_stDLLIdentity->hModule );
|
|
|
|
|
|
GetPrivateProfileString ("Preference", "Light Edit Dimension", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
|
|
m_p_oSplitFrameLight->CreateView(1, RUNTIME_CLASS(DiaLight), "no light to edit", iDim>0 ? iDim : 450 );
|
|
m_p_oSplitFrameLight->mfn_vEnableCaption (FALSE);
|
|
m_p_oSplitFrameLight->m_stWinTop.cLinkSame=FRM_C_MoveRight;
|
|
|
|
GetPrivateProfileString ("Preference", "Light Left Frame Width", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
m_p_oSplitFrameLight->m_iInitWidth = iDim>0 ? iDim : 185;
|
|
|
|
// set the pointer dialog of the Light dialog
|
|
Light::fn_vSetDialog ((DiaLight*) m_p_oSplitFrameLight->m_fn_p_oGetPane(1), this);
|
|
|
|
AfxSetResourceHandle( hOldInst );
|
|
|
|
//----------------------------------------------------- Lists
|
|
m_p_oDialogList = new CPA_DialogList();
|
|
m_p_oDialogList->fn_vInitDialog ( this, m_p_oSplitFrameLight );
|
|
m_p_oDialogList->SetPermanentHeaders (FALSE);
|
|
TUT_M_vGetTutDll ();
|
|
TUT_M_vRegisterDialogList (m_p_oDialogList, "OLG_List", "", "OLG_ComboSelect", "");
|
|
|
|
GetPrivateProfileString ("Preference", "Light DialogList Dimension", "0", szDimension, 256, (char*)(LPCSTR)csFileName);
|
|
iDim = atoi(szDimension);
|
|
|
|
m_p_oSplitFrameLight->SetPaneView(0, m_p_oDialogList, "Lists", iDim>0 ? iDim : 160);
|
|
|
|
|
|
// icons for list
|
|
m_oIconList.Create(20, 20, ILC_MASK, 0, 19);
|
|
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPHERICAL_LIGHT_ICON))); /*0*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPOT_LIGHT_ICON))); /*1*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLEL_LIGHT_ICON))); /*2*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_AMBIENT_LIGHT_ICON))); /*3*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLELBOX_LIGHT_ICON))); /*4*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_Z_LIGHT_ICON))); /*5*/
|
|
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPHERICAL_LIGHT_BLUE_ICON))); /*6*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPOT_LIGHT_BLUE_ICON))); /*7*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLEL_LIGHT_BLUE_ICON))); /*8*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_AMBIENT_LIGHT_BLUE_ICON))); /*9*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLELBOX_LIGHT_BLUE_ICON))); /*10*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_Z_LIGHT_BLUE_ICON))); /*11*/
|
|
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPHERICAL_IMPORT_LIGHT_ICON))); /*12*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_SPOT_IMPORT_LIGHT_ICON))); /*13*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLEL_IMPORT_LIGHT_ICON))); /*14*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_AMBIENT_IMPORT_LIGHT_ICON))); /*15*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_PARALLELBOX_IMPORT_LIGHT_ICON)));/*16*/
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_Z_IMPORT_LIGHT_ICON))); /*17*/
|
|
|
|
m_oIconList.Add(LoadIcon(GetDLLIdentity()->hModule, MAKEINTRESOURCE(IDI_FOG_ICON))); /*18*/
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// LISTS
|
|
//--------------------------------------------------------------------
|
|
|
|
// init the lists in the dialog
|
|
void Light_Interface::GetListsForDialog ( CPA_DialogList * pDialog )
|
|
{
|
|
// CPA_List<CPA_SuperObject>* pList = new CPA_List<CPA_SuperObject>;
|
|
// pList->RemoveAll ();
|
|
|
|
// construct the lists
|
|
pDialog->fn_vAddANewTree ( csHierarchyList, ((DEV_MultiDevice3D*)(GetInterface()->GetMultiDevice3D()))->GetWorld()->GetRoot());
|
|
// pDialog->fn_vAddANewList ( csCurrentList, GetInterface()->GetSortedListByType("All Types"));
|
|
pDialog->fn_vAddANewList ( csLightList, GetInterface()->GetSortedListByType ("Light"), NULL, &m_oIconList,E_lo_Alpha, TRUE, C_lDrawState | C_lDrawName, TRUE );
|
|
|
|
// Begin Silviu Simen List by Sector and type
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
CPA_SuperObject * p_sector;
|
|
POSITION pos;
|
|
|
|
ASSERT (poList);
|
|
for (p_sector = poList -> GetHeadElement(pos); p_sector;
|
|
p_sector = poList -> GetNextElement(pos) )
|
|
{
|
|
m_p_oDialogList->fn_vAddANewList(p_sector -> GetName() + "(Position)", M_GetMainWorld()->m_stListObjectsInSectors.GetListOfSectorByType(p_sector,HIE_C_ulEDT_Light), NULL, &m_oIconList,E_lo_Alpha, TRUE, C_lDrawState | C_lDrawName, TRUE );
|
|
m_p_oDialogList->fn_vAddANewList(p_sector -> GetName() + "(Effect)", fn_pGetListBySector(p_sector), NULL, &m_oIconList,E_lo_Alpha, TRUE, C_lDrawState | C_lDrawName, TRUE );
|
|
};
|
|
// End Silviu Simen List by Sector and type
|
|
}
|
|
|
|
// get the list of lights affecting the sector
|
|
CPA_BaseObjectList * Light_Interface::fn_pGetListBySector (CPA_SuperObject *pSector)
|
|
{
|
|
Light_ListBySector *pList;
|
|
POSITION pos;
|
|
|
|
for (pList = m_stListBySector.GetHeadElement(pos); pList; pList = m_stListBySector.GetNextElement(pos))
|
|
{
|
|
if (pList->GetSector() == pSector)
|
|
return pList->GetList();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
BOOL Light_Interface::fn_bTestFunction (CString csCurrentType, CString csTestName, CPA_BaseObject *pElem)
|
|
{
|
|
CPA_SuperObject *pEdObj;
|
|
if (csCurrentType==csCurrentList)
|
|
{
|
|
pEdObj = (CPA_SuperObject *) pElem;
|
|
if ((GetInterface()->GetCurrentModel())&&(pEdObj->GetModelName()==GetInterface()->GetCurrentModel()->m_csName))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL Light_Interface::fn_bOnSelChangeHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, CPA_BaseObject *pSelectedParent)
|
|
{
|
|
if (!pSelectedObject) return FALSE;
|
|
CPA_SuperObject* pSuperObject = (CPA_SuperObject*)pSelectedObject;
|
|
|
|
switch (pSuperObject->GetObjectType())
|
|
{
|
|
case HIE_C_ulEDT_Light :
|
|
if (m_o_ModifRadiusLight!=(Light*)pSuperObject->GetObject())
|
|
{
|
|
if (m_o_ModifRadiusLight) m_o_ModifRadiusLight->fn_vUnSelect ();
|
|
m_o_ModifRadiusLight = NULL;
|
|
}
|
|
GetInterface()->fn_vCancelCurrentSelection (FALSE);
|
|
fn_vEdit ((Light*)pSuperObject->GetObject());
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL Light_Interface::fn_bOnDblClkHierarchyTree (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, CPA_BaseObject *pSelectedParent)
|
|
{
|
|
if (!pSelectedObject) return FALSE;
|
|
// ?
|
|
CPA_SuperObject* pSuperObject = (CPA_SuperObject*)pSelectedObject;
|
|
if (pSuperObject) GetInterface()->fn_bSelectObject (pSuperObject, TRUE);
|
|
return FALSE;
|
|
}
|
|
|
|
// we select something in the list
|
|
BOOL Light_Interface::fn_bOnSelChangeListObjects (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject, BOOL bUnselect)
|
|
{
|
|
if (!pSelectedObject) return FALSE;
|
|
CPA_SuperObject* pSuperObject = (CPA_SuperObject*)pSelectedObject;
|
|
|
|
switch (pSuperObject->GetObjectType())
|
|
{
|
|
case HIE_C_ulEDT_Light :
|
|
if (m_o_ModifRadiusLight!=(Light*)pSuperObject->GetObject())
|
|
{
|
|
if (m_o_ModifRadiusLight) m_o_ModifRadiusLight->fn_vUnSelect ();
|
|
m_o_ModifRadiusLight = NULL;
|
|
}
|
|
GetInterface()->fn_vCancelCurrentSelection (FALSE);
|
|
if( bUnselect )
|
|
fn_vEdit (NULL,FALSE);
|
|
else
|
|
fn_vEdit ((Light*)pSuperObject->GetObject(),FALSE);
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL Light_Interface::fn_bOnDblClkListObjects (CPA_DialogList *pDialog, CString csTypeName, CPA_BaseObject *pSelectedObject)
|
|
{
|
|
if (!pSelectedObject) return FALSE;
|
|
CPA_SuperObject* pSuperObject = (CPA_SuperObject*)pSelectedObject;
|
|
if (pSuperObject) GetInterface()->fn_bSelectObject (pSuperObject, TRUE);
|
|
return FALSE;
|
|
}
|
|
|
|
tdeTypeAnswer Light_Interface::fn_bAcceptSelect (CPA_SuperObject *pEdObj, ACP_tdxIndex xIndex, HIE_tdstPickInfo *pPicking, tdeStatus eStatus)
|
|
{
|
|
if (eStatus!=C_AsConcernedDLL) return CPA_ObjectDLLBase::fn_bAcceptSelect (pEdObj, xIndex, pPicking, eStatus);
|
|
if (pEdObj->GetObjectType()==HIE_C_ulEDT_Light) return C_Accept;
|
|
return C_Refuse;
|
|
}
|
|
|
|
|
|
CPA_BaseObject* Light_Interface::GetDialogSelection (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDrawMode)
|
|
{
|
|
if (csTypeName!=csHierarchyList)
|
|
{
|
|
Light* poLight = Light::fn_pGetDialog()->fn_pGetEditLight();
|
|
if (!poLight) return NULL;
|
|
return poLight->GetSuperObject();
|
|
}
|
|
return CPA_ObjectDLLBase::GetDialogSelection ( pDialog, csTypeName, eDrawMode );
|
|
}
|
|
|
|
|
|
//---- icon management
|
|
int Light_Interface::GetStateForListItem (CPA_DialogList *pDialog, CString csListName, CPA_BaseObject *pObject)
|
|
{
|
|
if (csListName!=csHierarchyList )
|
|
{
|
|
Light* poLight = (Light*) ((CPA_SuperObject*)pObject)->GetObject();
|
|
|
|
if (poLight->fn_bIs3DsMaxLight())
|
|
{
|
|
switch (poLight->fn_lGetType())
|
|
{
|
|
case GLI_C_lSphericalLight: return 12;
|
|
case GLI_C_lHotSpotLight : return 13;
|
|
case GLI_C_lParallelLight : return 14;
|
|
case GLI_C_lAmbientLight : return 15;
|
|
case GLI_C_lParallelLight_With_Limit : return 16;
|
|
default /*case GLI_C_lZ_Light*/: return 17;
|
|
case GLI_C_lFogLight : return 18;
|
|
}
|
|
}
|
|
else if (poLight->fn_bGetOnOff())
|
|
{
|
|
switch (poLight->fn_lGetType())
|
|
{
|
|
case GLI_C_lSphericalLight: return 0;
|
|
case GLI_C_lHotSpotLight : return 1;
|
|
case GLI_C_lParallelLight : return 2;
|
|
case GLI_C_lAmbientLight : return 3;
|
|
case GLI_C_lParallelLight_With_Limit : return 4;
|
|
default /*case GLI_C_lZ_Light*/: return 5;
|
|
case GLI_C_lFogLight : return 18;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (poLight->fn_lGetType())
|
|
{
|
|
case GLI_C_lSphericalLight: return 6;
|
|
case GLI_C_lHotSpotLight : return 7;
|
|
case GLI_C_lParallelLight : return 8;
|
|
case GLI_C_lAmbientLight : return 9;
|
|
case GLI_C_lParallelLight_With_Limit : return 10;
|
|
default /*case GLI_C_lZ_Light*/: return 11;
|
|
case GLI_C_lFogLight : return 18;
|
|
}
|
|
}
|
|
|
|
}
|
|
return CPA_ObjectDLLBase::GetStateForListItem (pDialog, csListName, pObject);
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// CURRENT DLL
|
|
//----------------------------------------------------------------------
|
|
tdePermission Light_Interface::fn_eAcceptNewEditor (CPA_EditorBase *pNewDll)
|
|
{
|
|
if ( pNewDll->fn_bIsCurrentEditor () ) return C_Allow;
|
|
else
|
|
{
|
|
// Dialog will be delete by the hierarchy editor, so we unset the flag before
|
|
m_bDialogOnScreen = FALSE;
|
|
return C_CloseBefore;
|
|
}
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vOnActivateEditor (CPA_List<CPA_BaseObject> *pParams, BOOL bBackActivated)
|
|
{
|
|
if (!m_bDialogOnScreen)
|
|
{ // Set the Dialog on the screen
|
|
// call the init lists functions
|
|
m_p_oDialogList->fn_vInitAllLists ();
|
|
m_p_oDialogList->fn_vReinitDialog ();
|
|
|
|
// activate the frames of the editor
|
|
HWND WindowWithFocus = GetFocus ();
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
g_oFrameGest.mfn_vActivateWindow (m_p_oSplitFrameLight);
|
|
g_oFrameGest.mfn_vActivateWindow ( GetInterface()->GetModelFrame() );
|
|
|
|
SetFocus (WindowWithFocus);
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
m_p_oDialogList->SetCurrentType ( csLightList );
|
|
m_p_oDialogList->SetDefaultButtonState ( FALSE );
|
|
//ROMTEAM SelectMode (Ionut Grozea 25/02/98)
|
|
m_bPreviousLinkMode = GetInterface()->GetLinkMode();
|
|
GetInterface()->SetLinkMode(FALSE);
|
|
m_csLastSelectionType = GetInterface()->GetSelectMode();
|
|
GetInterface()->SetSelectMode("Light");
|
|
m_bSelectModeIsLight = 1;
|
|
//ENDROMTEAM SelectMode (Ionut Grozea)
|
|
//ANNECY Shaitan Correction 03/02/98 {
|
|
g_csPreviousList = GetInterface()->GetDialogInsert()->fn_csGetCurrentListModel();
|
|
GetInterface()->GetDialogInsert()->fn_vSetCurrentListModel("Light");
|
|
//ENDANNECY Shaitan Correction }
|
|
|
|
// set the enter editor ( WP or way )
|
|
m_bDialogOnScreen=TRUE;
|
|
}
|
|
|
|
// edit pParam
|
|
if (pParams)
|
|
{
|
|
CPA_BaseObject* p_oEditSuperLight = fn_pSelectLightParam ( pParams );
|
|
if (p_oEditSuperLight) fn_vEdit ( (Light*) ((CPA_SuperObject*)p_oEditSuperLight)->GetObject() );
|
|
}
|
|
else
|
|
{
|
|
CPA_SuperObject *pSelectedObject = M_GetWorld()->GetSingleSelection();
|
|
if (pSelectedObject && (pSelectedObject->GetObject()->GetDataType()==HIE_C_ulEDT_Light))
|
|
fn_vEdit ( (Light*) ((CPA_SuperObject*)pSelectedObject)->GetObject() );
|
|
}
|
|
|
|
// display Tip of the Day
|
|
GetInterface()->fn_vDisplayTipOfDay("Lights", "OLG", g_bTipFirstTime);
|
|
g_bTipFirstTime = FALSE;
|
|
}
|
|
|
|
void Light_Interface::fn_vOnCloseEditor (void)
|
|
{
|
|
// desactivate the frames
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
|
|
g_oFrameGest.mfn_vDisactivateWindow (m_p_oSplitFrameLight);
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
m_bDialogOnScreen=FALSE;
|
|
//ROMTEAM SelectMode (Ionut Grozea 25/02/98)
|
|
GetInterface()->SetSelectMode(m_csLastSelectionType);
|
|
GetInterface()->SetLinkMode(m_bPreviousLinkMode );
|
|
m_bSelectModeIsLight = 0;
|
|
//ENDROMTEAM SelectMode (Ionut Grozea)
|
|
GetInterface()->GetDialogInsert()->fn_vSetCurrentListModel(g_csPreviousList);
|
|
|
|
// unselect lights
|
|
if (m_o_ModifRadiusLight)
|
|
{
|
|
m_o_ModifRadiusLight->fn_vUnSelect ();
|
|
m_o_ModifRadiusLight=NULL;
|
|
}
|
|
}
|
|
|
|
|
|
CString Light_Interface::fn_csGetSaveFileName (void)
|
|
{
|
|
char szLevelName [256];
|
|
fn_zsGetActualLevelFilename (szLevelName, "lgt");
|
|
CString csLevelName = szLevelName;
|
|
return csLevelName;
|
|
}
|
|
|
|
void Light_Interface::fn_vLevelHasChanged (void)
|
|
{
|
|
fn_vExistSaveFile ();
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vBeforeSaveAll (void)
|
|
{
|
|
if (m_bSaveRLI)
|
|
{
|
|
// notification to save RLI file
|
|
fn_vSaveRLIModifyIPO ();
|
|
|
|
if (m_bNotifyIPO)
|
|
{
|
|
CPA_BaseObjectList* poListOfIPO = GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szInstanciatedPhysicalObjectTypeName);
|
|
Position xPos;
|
|
CPA_BaseObject* poBaseObject;
|
|
for (poBaseObject = poListOfIPO->GetHeadElement(xPos); poBaseObject; poBaseObject = poListOfIPO->GetNextElement(xPos) )
|
|
//ANNECY Shaitan Correction (31/03/98) {
|
|
{
|
|
if (((CPA_SaveObject*)poBaseObject)->GetCurrentNotification() != SCR_EA_Ntfy_DeleteSection)
|
|
((CPA_SaveObject*)poBaseObject)->fn_vNotifySave ();
|
|
}
|
|
//ENDANNECY Shaitan Correction (31/03/98) }
|
|
m_bNotifyIPO=FALSE;
|
|
}
|
|
|
|
m_bSaveRLI=FALSE;
|
|
}
|
|
}
|
|
|
|
void Light_Interface::fn_vAfterSaveAll (void)
|
|
{
|
|
fn_vExistSaveFile ();
|
|
Light::fn_vSetNotifyHeader (FALSE);
|
|
Light::fn_vUpdateSectorSection ();
|
|
}
|
|
|
|
void Light_Interface::fn_vBeforeEngine (void)
|
|
{
|
|
// validate modifs of the dialogs
|
|
m_bRunEngine = TRUE;
|
|
|
|
// delete all lights super - object in hierarchy
|
|
m_ListDeleteLightBeforeEngine.RemoveAll ();
|
|
m_ListOfParentDeleteLightBeforeEngine.RemoveAll ();
|
|
|
|
|
|
if (m_o_ModifRadiusLight)
|
|
{
|
|
m_o_ModifRadiusLight->fn_vUnSelect ();
|
|
m_o_ModifRadiusLight=NULL;
|
|
}
|
|
|
|
CPA_BaseObjectList* poList = m_poLight->GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szLightTypeName);
|
|
Position xPos;
|
|
CPA_BaseObject* poBaseObject;
|
|
|
|
for (poBaseObject = poList->GetHeadElement(xPos); poBaseObject; poBaseObject = poList->GetNextElement(xPos) )
|
|
{
|
|
CPA_SuperObject* poSuperObjectParent = ((Light*)poBaseObject)->GetSuperObject();
|
|
CPA_SuperObject* poSuperObject = (CPA_SuperObject*) poSuperObjectParent->GetHeadElement ();
|
|
|
|
if( poSuperObject )
|
|
{
|
|
m_ListDeleteLightBeforeEngine.AddTail ( poSuperObject );
|
|
m_ListOfParentDeleteLightBeforeEngine.AddTail ( poSuperObjectParent );
|
|
GetInterface()->fn_bDeleteObjectInHierarchy ( poSuperObject, FALSE, FALSE, FALSE, FALSE );
|
|
}
|
|
}
|
|
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
if (!fn_bIsCurrentEditor()) return;
|
|
|
|
g_oFrameGest.mfn_vDisactivateWindow (m_p_oSplitFrameLight);
|
|
m_bDialogOnScreen=FALSE;
|
|
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vBeforeEditor (void)
|
|
{
|
|
m_bRunEngine = FALSE;
|
|
|
|
if (m_bFirstBeforeEditor)
|
|
{
|
|
fn_vGiveProgressInfo ("Loading static lights ...", -1);
|
|
m_bStopDraw=FALSE;
|
|
fn_vExistSaveFile ();
|
|
fn_vLoadStaticLight ();
|
|
|
|
m_bFirstBeforeEditor=FALSE;
|
|
fn_vGiveProgressInfo ("Loading static lights", 100);
|
|
|
|
// init list of section sector in light objects
|
|
Light::fn_vInitListOfSectionObject ();
|
|
fn_vInitListOfLightSectionSector ();
|
|
|
|
fn_vCreate3DSMaxLights ();
|
|
|
|
fn_vDeleteInvalideLight ();
|
|
|
|
// create list by sector
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
CPA_SuperObject * p_sector;
|
|
POSITION pos;
|
|
|
|
ASSERT (poList);
|
|
for (p_sector = poList -> GetHeadElement(pos); p_sector;
|
|
p_sector = poList -> GetNextElement(pos) )
|
|
{
|
|
m_stListBySector.AddTail(new Light_ListBySector(p_sector));
|
|
}
|
|
|
|
// update list by sector
|
|
fn_vUpdateListsBySector();
|
|
|
|
//ANNECY Shaitan Correction 03/03/98 {
|
|
// m_bNotifyIPO=TRUE;
|
|
m_bNotifyIPO=FALSE;
|
|
|
|
|
|
CPA_BaseObjectList* poListOfIPO = GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szInstanciatedPhysicalObjectTypeName);
|
|
if (poListOfIPO)
|
|
{
|
|
if (poListOfIPO->GetCount()>0)
|
|
{
|
|
// CPA_BaseObject* poBaseObject = poListOfIPO->GetHead();
|
|
// if (poBaseObject)
|
|
CPA_BaseObject* poBaseObject;
|
|
Position pos = poListOfIPO->GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
poBaseObject = poListOfIPO->GetNext(pos);
|
|
IPO_tdxHandleToInstanciatedPhysicalObject hIPO = (IPO_tdxHandleToInstanciatedPhysicalObject)(poBaseObject->GetData());
|
|
// if (IPO_fn_hGetRadiosity(hIPO)) m_bNotifyIPO=FALSE;
|
|
if (!IPO_fn_hGetRadiosity(hIPO)) m_bNotifyIPO=TRUE;
|
|
}
|
|
}
|
|
}
|
|
//ENDANNECY Shaitan Correction }
|
|
|
|
/*
|
|
CPA_List<CPA_SuperObject>* poListOfSuperIPO = GetInterface()->GetObjectListByType (C_szInstanciatedPhysicalObjectTypeName);
|
|
if (poListOfSuperIPO)
|
|
{
|
|
if (poListOfSuperIPO->GetCount()>0)
|
|
{
|
|
CPA_SuperObject* poSuperObject = poListOfSuperIPO->GetHead();
|
|
if (poSuperObject)
|
|
{
|
|
IPO_tdxHandleToInstanciatedPhysicalObject hIPO = (IPO_tdxHandleToInstanciatedPhysicalObject)(poSuperObject->GetObject()->GetData());
|
|
if (IPO_fn_hGetRadiosity(hIPO)) m_bNotifyIPO=FALSE;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
if (m_bNotifyIPO)
|
|
{
|
|
m_bModifyAll=TRUE; // compute the whole rli file
|
|
fn_vComputeRLI (); // m_bNotifyIPO is used here as a flag
|
|
}
|
|
}
|
|
|
|
// add lights super objects in hierarchy
|
|
POSITION xPosLight, xPosParent;
|
|
CPA_SuperObject* poSuperObject;
|
|
CPA_SuperObject* poParent;
|
|
|
|
for (
|
|
poSuperObject=m_ListDeleteLightBeforeEngine.GetHeadElement(xPosLight),
|
|
poParent=m_ListOfParentDeleteLightBeforeEngine.GetHeadElement(xPosParent);
|
|
poSuperObject;
|
|
poSuperObject=m_ListDeleteLightBeforeEngine.GetNextElement(xPosLight) ,
|
|
poParent=m_ListOfParentDeleteLightBeforeEngine.GetNextElement(xPosParent)
|
|
)
|
|
GetInterface()->fn_bInsertObjectInHierarchy (poSuperObject, poParent, FALSE, FALSE, FALSE );
|
|
|
|
if (m_ListDeleteLightBeforeEngine.GetCount()||m_bNotifyIPO) GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
|
|
if (!fn_bIsCurrentEditor())
|
|
return;
|
|
|
|
m_p_oDialogList->fn_vInitAllLists ();
|
|
m_p_oDialogList->fn_vReinitDialog ();
|
|
|
|
// activate the frames of the editor
|
|
HWND WindowWithFocus = GetFocus ();
|
|
g_oFrameGest.mfn_vSetRefresh(FALSE);
|
|
g_oFrameGest.mfn_vActivateWindow (m_p_oSplitFrameLight);
|
|
g_oFrameGest.mfn_vActivateWindow ( GetInterface()->GetModelFrame() );
|
|
SetFocus (WindowWithFocus);
|
|
g_oFrameGest.mfn_vSetRefresh(TRUE);
|
|
m_p_oDialogList->SetCurrentType ( csLightList );
|
|
m_p_oDialogList->SetDefaultButtonState ( FALSE );
|
|
|
|
g_csPreviousList = GetInterface()->GetDialogInsert()->fn_csGetCurrentListModel();
|
|
GetInterface()->GetDialogInsert()->fn_vSetCurrentListModel("Light");
|
|
|
|
// set the enter editor ( WP or way )
|
|
m_bDialogOnScreen=TRUE;
|
|
m_bRunEngine=FALSE;
|
|
|
|
|
|
|
|
}
|
|
|
|
void Light_Interface::fn_vLoadStaticLight (void)
|
|
{
|
|
// we are going to build all the editor objects
|
|
CPA_List <CPA_BaseObject> oList;
|
|
m_ListOfInvalideLight.RemoveAll ();
|
|
|
|
// stop prefix
|
|
BOOL bLoadingWorld = GetInterface()->fn_bIsLoadingWorld();
|
|
GetInterface ()->SetLoadingWorld (TRUE);
|
|
|
|
// load .lgt
|
|
char szCompleteLevelsFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char* pszLevelsFileName;
|
|
fn_zsGetActualLevelFilename ( szCompleteLevelsFileName, c_Light_File_extension );
|
|
pszLevelsFileName = szCompleteLevelsFileName + strlen(fn_szGetLevelsDataPath()) + 1;
|
|
|
|
// engine load
|
|
if (SCR_fn_c_RdL0_IsSectionExists (szCompleteLevelsFileName))
|
|
SCR_fnp_st_RdL0_AnalyseSection (pszLevelsFileName,SCR_CDF_uw_Anl_Normal);
|
|
|
|
// create all editor objects
|
|
SCR_tdst_Link_Table* pLinkTable = LGT_fn_p_stGetLightLinkTable ();
|
|
unsigned int uiPos;
|
|
SCR_tdst_Link_Value *pLinkValue;
|
|
|
|
uiPos = 0;
|
|
SCR_M_DyAr_GetNextElement
|
|
(
|
|
SCR_tdst_Link_Value,
|
|
uiPos,
|
|
pLinkValue,
|
|
SCR_M_st_Link_GetDynamicArray(pLinkTable)
|
|
)
|
|
while (pLinkValue)
|
|
{
|
|
if (SCR_M_e_Link_GetState(pLinkValue) != SCR_ELS_Link_NotInitialized)
|
|
{
|
|
GLI_tdxHandleToLight hStaticLight = (GLI_tdxHandleToLight) SCR_M_ul_Link_GetValue (pLinkValue);
|
|
CPA_SuperObject* poSuperLight = fn_pCreateNewLightFromEngineHandle ( hStaticLight );
|
|
if (poSuperLight)
|
|
{
|
|
// search position of superobject
|
|
MTH3D_tdstVector stVertex;
|
|
( (Light*)(poSuperLight->GetObject()) )->fn_vSetEngineMatrix(FALSE);
|
|
GEO_tdxHandleToMatrix hAbsoluteObjectMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (poSuperLight->GetStruct());
|
|
POS_fn_vGetTranslationVector( hAbsoluteObjectMatrix , &stVertex ) ;
|
|
CPA_SuperObject* poSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos (&stVertex);
|
|
|
|
if (poSector)
|
|
{
|
|
// insert in hierarchy
|
|
m_bLoadLight=TRUE;
|
|
//ANNECY Shaitan EmptySectors 25/02/98
|
|
// if (poSector->GetHeadElement()) GetInterface()->fn_bInsertObjectInHierarchy (poSuperLight, (CPA_SuperObject*)(poSector->GetHeadElement()), FALSE, FALSE, FALSE );
|
|
// else m_ListOfInvalideLight.AddTail ( (Light*)(poSuperLight->GetObject()) );
|
|
GetInterface()->fn_bInsertObjectInHierarchy (poSuperLight, poSector, FALSE, FALSE, FALSE );
|
|
//ENDANNECY Shaitan EmptySectors
|
|
m_bLoadLight=FALSE;
|
|
}
|
|
else
|
|
m_ListOfInvalideLight.AddTail ( (Light*)(poSuperLight->GetObject()) );
|
|
}
|
|
}
|
|
uiPos++;
|
|
SCR_M_DyAr_GetNextElement
|
|
(
|
|
SCR_tdst_Link_Value,
|
|
uiPos,
|
|
pLinkValue,
|
|
SCR_M_st_Link_GetDynamicArray(pLinkTable)
|
|
)
|
|
}
|
|
|
|
|
|
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
if (poList->IsEmpty()) return;
|
|
|
|
POSITION xSuperObjectPos;
|
|
CPA_SuperObject* poSuperObject;
|
|
|
|
// loop on the sectors super object
|
|
for ( poSuperObject=poList->GetHeadElement(xSuperObjectPos); poSuperObject; poSuperObject=poList->GetNextElement(xSuperObjectPos) )
|
|
{
|
|
HIE_tdxHandleToSuperObject hSector;
|
|
hSector = (HIE_tdxHandleToSuperObject)(poSuperObject->GetStruct());
|
|
|
|
// loop on the engine lights of each sector
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
|
|
|
|
long i;
|
|
SECT_M_ForEachStaticLightsListInSector (hSector,hStaticLightsElement,i)
|
|
{
|
|
GLI_tdxHandleToLight hStaticLight;
|
|
CString csSectionName;
|
|
|
|
hStaticLight = SECT_GetStaticLightsInList ( hStaticLightsElement );
|
|
// The editor object exist or not ?
|
|
CPA_BaseObject * pEdObj = GetInterface()->GetMainWorld()->fn_p_oFindObjectWithEngine (hStaticLight, C_szLightTypeName);
|
|
|
|
ASSERT (pEdObj);
|
|
|
|
Light* poLight = (Light*)pEdObj;
|
|
poLight->fn_vAddSector (poSuperObject);
|
|
}
|
|
}
|
|
|
|
Light::fn_pGetDialog()->fn_vEdit (NULL);
|
|
|
|
// delete unused light sections
|
|
CPA_BaseObjectList* poListOfLight = GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szLightTypeName);
|
|
Position xPosDeleteLight;
|
|
CPA_BaseObject* poBaseObject;
|
|
BOOL bNotReferenced=FALSE;
|
|
CString csMessage = "Some lights don't affect any sector : ";
|
|
|
|
for ( poBaseObject = poListOfLight->GetHeadElement(xPosDeleteLight); poBaseObject; poBaseObject = poListOfLight->GetNextElement(xPosDeleteLight) )
|
|
{
|
|
if ( !((Light*)poBaseObject)->fn_bReferenced() )
|
|
{
|
|
bNotReferenced=TRUE;
|
|
csMessage += "\n ";
|
|
csMessage += poBaseObject->GetName();
|
|
}
|
|
}
|
|
|
|
if (bNotReferenced)
|
|
MessageBox ( AfxGetMainWnd()->m_hWnd, csMessage, "Light editor Warning", MB_OK|MB_ICONWARNING );
|
|
|
|
|
|
// can prefix
|
|
GetInterface ()->SetLoadingWorld (bLoadingWorld);
|
|
|
|
// That's all Folks
|
|
}
|
|
|
|
|
|
// create lights from 3DSMax file -> .lg2
|
|
void Light_Interface::fn_vCreate3DSMaxLights (void)
|
|
{
|
|
char szCompleteLevelsFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char* pszLevelsFileName;
|
|
BOOL bLoadingWorld = GetInterface()->fn_bIsLoadingWorld();
|
|
GetInterface ()->SetLoadingWorld (TRUE);
|
|
|
|
fn_zsGetActualLevelFilename ( szCompleteLevelsFileName, c_Light_3DsMax_File_extension );
|
|
pszLevelsFileName = szCompleteLevelsFileName + strlen(fn_szGetLevelsDataPath()) + 1;
|
|
|
|
|
|
if (SCR_fn_c_RdL0_IsSectionExists (szCompleteLevelsFileName))
|
|
SCR_fnp_st_RdL0_AnalyseSection (pszLevelsFileName,SCR_CDF_uw_Anl_ForceAnalyse);
|
|
|
|
SCR_tdst_Link_Table* pLinkTable = LGT_fn_p_stGetLightLinkTable ();
|
|
|
|
unsigned int uiPos;
|
|
SCR_tdst_Link_Value *pLinkValue;
|
|
|
|
// Get first element of array
|
|
uiPos = 0;
|
|
SCR_M_DyAr_GetNextElement
|
|
(
|
|
SCR_tdst_Link_Value,
|
|
uiPos,
|
|
pLinkValue,
|
|
SCR_M_st_Link_GetDynamicArray(pLinkTable)
|
|
)
|
|
while (pLinkValue)
|
|
{
|
|
if (SCR_M_e_Link_GetState(pLinkValue) != SCR_ELS_Link_NotInitialized)
|
|
{
|
|
CString csSectionName = SCR_M_p_sz_Link_GetKey(pLinkValue);
|
|
GLI_tdxHandleToLight hStaticLight = (GLI_tdxHandleToLight) SCR_M_ul_Link_GetValue (pLinkValue);
|
|
|
|
char szFileName [SCR_CV_ui_Cfg_MaxLenName];
|
|
char szActionName [SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName [SCR_CV_ui_Cfg_MaxLenName];
|
|
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
|
|
long lLenghtFileName;
|
|
//ROMTEAM BlendRLI (Ionut Grozea 24/02/98)
|
|
long lightIsPaint = 0;
|
|
long lightIsAlpha = 0;
|
|
//ENDROMTEAM BlendRLI (Ionut Grozea)
|
|
|
|
char* pExtFile = NULL;
|
|
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName);
|
|
|
|
// file extension
|
|
lLenghtFileName = strlen(szFileName);
|
|
pExtFile = szFileName + lLenghtFileName - 3;
|
|
|
|
// 3DSMax extension ?
|
|
if (!strcmp (pExtFile,c_Light_3DsMax_File_extension))
|
|
{
|
|
//ROMTEAM BlendRLI (Ionut Grozea 24/02/98)
|
|
long lLenghtLightName = strlen(szName);
|
|
char *p_szPaint, *p_szAlpha;
|
|
|
|
p_szPaint = strstr(szName, "_paint");
|
|
p_szAlpha = strstr(szName, "_alpha");
|
|
|
|
if (p_szPaint)
|
|
{
|
|
lightIsPaint = 1;
|
|
strcpy(p_szPaint, "\0");
|
|
}
|
|
if (p_szAlpha)
|
|
{
|
|
lightIsAlpha = 1;
|
|
strcpy(p_szAlpha, "\0");
|
|
}
|
|
/*
|
|
char szExtensionName [SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
strcpy(szExtensionName , szName+lLenghtLightName-5);
|
|
|
|
if (!strncmp(szExtensionName , "Paint" , 5))
|
|
{
|
|
strcpy(szName+lLenghtLightName-6,"\0");
|
|
lightIsPaint = 1;
|
|
if (!strncmp(szExtensionName , "Alpha" , 5))
|
|
{
|
|
strcpy(szName+lLenghtLightName-6,"\0");
|
|
lightIsAlpha = 1;
|
|
}
|
|
|
|
}
|
|
if (!strncmp(szExtensionName , "Alpha" , 5))
|
|
{
|
|
strcpy(szName+lLenghtLightName-6,"\0");
|
|
lightIsAlpha = 1;
|
|
|
|
if (!strncmp(szExtensionName , "Paint" , 5))
|
|
{
|
|
strcpy(szName+lLenghtLightName-6,"\0");
|
|
lightIsPaint = 1;
|
|
}
|
|
|
|
}
|
|
*/
|
|
//ENDROMTEAM BlendRLI (Ionut Grozea)
|
|
strcpy ( szFileName + lLenghtFileName - 3, c_Light_File_extension );
|
|
SCR_fn_v_RdL0_ComputeSectionName ( szSectionName, szFileName, szActionName, szName);
|
|
|
|
// engine light already in .lgt ?
|
|
strcpy ( ((char*)(LPCSTR) csSectionName) + csSectionName.GetLength() - 3, c_Light_File_extension );
|
|
SCR_tdst_Link_Value* pValue = SCR_fnp_st_Link_SearchKey (pLinkTable, szSectionName);
|
|
|
|
if (!pValue)
|
|
{
|
|
// light was not found in .lgt
|
|
|
|
// search position of superobject
|
|
MTH3D_tdstVector stVertex;
|
|
POS_tdstCompletePosition stAbsoluteMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix(&stAbsoluteMatrix);
|
|
|
|
if ( GLI_lGetLightType (hStaticLight) == GLI_C_lAmbientLight )
|
|
{
|
|
CPA_List<CPA_SuperObject>* poList = m_poLight->GetInterface()->GetInterface()->GetObjectListByType (/*C_szSectorTypeName*/C_szInstanciatedPhysicalObjectTypeName);
|
|
if (poList)
|
|
{
|
|
CPA_SuperObject* poSuperSector = (CPA_SuperObject*)(poList->GetHead()->GetHead());
|
|
if (poSuperSector)
|
|
{
|
|
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix ( poSuperSector->GetStruct() );
|
|
POS_fn_vGetTranslationVector( hAbsoluteMatrix , &stVertex );
|
|
POS_fn_vSetTranslationVector( &stAbsoluteMatrix , &stVertex );
|
|
GLI_xSetLightMatrix ( hStaticLight , &stAbsoluteMatrix );
|
|
}
|
|
}
|
|
}
|
|
|
|
GLI_xGetLightMatrix ( hStaticLight , &stAbsoluteMatrix );
|
|
POS_fn_vGetTranslationVector( &stAbsoluteMatrix , &stVertex ) ;
|
|
CPA_SuperObject* poSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos (&stVertex);
|
|
|
|
if (poSector)
|
|
{
|
|
// change link table
|
|
strcpy ( SCR_M_p_sz_Link_GetKey (pLinkValue), szSectionName);
|
|
|
|
CPA_SuperObject* poSuperLight = fn_pCreateNewLightFromEngineHandle ( hStaticLight );
|
|
Light* poLight = (Light*)(poSuperLight->GetObject());
|
|
|
|
//ROMTEAM BlendRLI (Ionut Grozea 24/02/98)
|
|
if (lightIsPaint)
|
|
poLight->fn_vSetTypePaint();
|
|
//ENDROMTEAM BlendRLI (Ionut Grozea)
|
|
|
|
// set sector to the light
|
|
poLight->fn_vAddSector (poSector);
|
|
poLight->fn_vSetEngineMatrix(FALSE);
|
|
poLight->Set3DsMaxLight (TRUE);
|
|
|
|
// force saving section in .lgt
|
|
poLight->SetExistingSection (FALSE);
|
|
poLight->GetMatrixSection()->SetExistingSection (FALSE);
|
|
poLight->fn_vNotifySave();
|
|
//ROMTEAM BlendRLI (Ionut Grozea 24/02/98)
|
|
if (lightIsAlpha)
|
|
poLight->fn_vSetLightForAlpha();
|
|
//ENDROMTEAM BlendRLI (Ionut Grozea)
|
|
|
|
// insert in hierarchy
|
|
m_bLoadLight=TRUE;
|
|
//ANNECY Shaitan EmptySectors 25/02/98
|
|
// GetInterface()->fn_bInsertObjectInHierarchy (poSuperLight, (CPA_SuperObject*)(poSector->GetHeadElement()), FALSE, FALSE, FALSE);
|
|
GetInterface()->fn_bInsertObjectInHierarchy (poSuperLight, poSector, FALSE, FALSE, FALSE);
|
|
//ENDANNECY Shaitan EmptySectors
|
|
m_bLoadLight=FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// set flag icon
|
|
GLI_tdxHandleToLight hEngineLight = (GLI_tdxHandleToLight) SCR_M_ul_Link_GetValue (pValue);
|
|
CPA_BaseObject* poBaseObject = GetInterface()->GetMainWorld()->fn_p_oFindObjectWithEngine (hEngineLight, C_szLightTypeName);
|
|
( (Light*)poBaseObject )->Set3DsMaxLight (TRUE);
|
|
}
|
|
}
|
|
}
|
|
// Get next element
|
|
uiPos++;
|
|
SCR_M_DyAr_GetNextElement
|
|
(
|
|
SCR_tdst_Link_Value,
|
|
uiPos,
|
|
pLinkValue,
|
|
SCR_M_st_Link_GetDynamicArray(pLinkTable)
|
|
)
|
|
}
|
|
|
|
GetInterface ()->SetLoadingWorld (bLoadingWorld);
|
|
|
|
}
|
|
|
|
// init the list of section sector used by each light
|
|
void Light_Interface::fn_vInitListOfLightSectionSector (void)
|
|
{
|
|
Position xPos;
|
|
CPA_BaseObject* poBaseObject;
|
|
CPA_BaseObjectList* poListOfLight = GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szLightTypeName);
|
|
|
|
for (poBaseObject=poListOfLight->GetHeadElement(xPos); poBaseObject; poBaseObject=poListOfLight->GetNextElement(xPos) )
|
|
{
|
|
Light* poLight = (Light*) poBaseObject;
|
|
poLight->fn_vUpDateSectorSection ();
|
|
}
|
|
}
|
|
|
|
// delete inavalide light sections
|
|
void Light_Interface::fn_vDeleteInvalideLight (void)
|
|
{
|
|
POSITION xPos;
|
|
Light* poLight;
|
|
|
|
for (poLight = m_ListOfInvalideLight.GetHeadElement(xPos); xPos; m_ListOfInvalideLight.GetNextElement(xPos) )
|
|
poLight->fn_vNotifyUnSave ();
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// Pop-up menu
|
|
//----------------------------------------------------------------------
|
|
BOOL Light_Interface::fn_bDefinePopupMenu(EDT_PopUpMenu *pPopup, CPA_List<CPA_SuperObject> *pSelection, BOOL bIsAlone)
|
|
{
|
|
BOOL bEntry=FALSE;
|
|
|
|
|
|
if (m_bMainDll)
|
|
{
|
|
m_bMainDll=FALSE;
|
|
return FALSE;
|
|
}
|
|
m_bMainDll=bIsAlone;
|
|
|
|
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetSelectedObjects (this);
|
|
|
|
if (!poList->GetCount()) m_poRClicLight=NULL;
|
|
else m_poRClicLight = (Light*)(poList->GetHead()->GetObject());
|
|
|
|
if (m_poRClicLight)
|
|
{
|
|
if (m_poRClicLight->fn_bGetOnOff())
|
|
{
|
|
char szMes [100];
|
|
sprintf ( szMes, "Realtime light %s off", m_poRClicLight->GetName().GetBuffer(100) );
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
strcat( szMes, "\t");
|
|
strcat( szMes, (char *)(LPCSTR)m_poKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Real Time")));
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
pPopup->AddAnEntry(this, szMes, c_Light_Popup_Off);
|
|
}
|
|
else
|
|
{
|
|
char szMes [100];
|
|
sprintf ( szMes, "Realtime light %s on", m_poRClicLight->GetName().GetBuffer(100) );
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
strcat( szMes, "\t");
|
|
strcat( szMes, (char *)(LPCSTR)m_poKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Real Time")));
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
pPopup->AddAnEntry(this, szMes, c_Light_Popup_On);
|
|
}
|
|
bEntry=TRUE;
|
|
|
|
|
|
if (m_poRClicLight->fn_bIsLightOn())
|
|
{
|
|
char szMes [100];
|
|
sprintf ( szMes, "Switch off light %s", m_poRClicLight->GetName().GetBuffer(100) );
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
strcat( szMes, "\t");
|
|
strcat( szMes, (char *)(LPCSTR)m_poKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Light Switch")));
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
pPopup->AddAnEntry(this, szMes, c_light_Popup_RealTime_Off);
|
|
}
|
|
else
|
|
{
|
|
char szMes [100];
|
|
sprintf ( szMes, "Switch on light %s", m_poRClicLight->GetName().GetBuffer(100) );
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
strcat( szMes, "\t");
|
|
strcat( szMes, (char *)(LPCSTR)m_poKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Light Switch")));
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
pPopup->AddAnEntry(this, szMes, c_light_Popup_RealTime_On);
|
|
}
|
|
bEntry=TRUE;
|
|
|
|
|
|
if (fn_bIsCurrentEditor() & m_poRClicLight->fn_bIs3DsMaxLight())
|
|
{
|
|
char szMes [100];
|
|
sprintf ( szMes, "Update light %s", m_poRClicLight->GetName().GetBuffer(100) );
|
|
pPopup->AddAnEntry(this, szMes, c_light_Popup_Update);
|
|
bEntry=TRUE;
|
|
}
|
|
}
|
|
|
|
if (fn_bIsCurrentEditor() & bIsAlone)
|
|
{
|
|
pPopup->AddAnEntry(this, "Exit Light editor", c_Light_Popup_Exit);
|
|
bEntry=TRUE;
|
|
}
|
|
|
|
|
|
|
|
return bEntry;
|
|
}
|
|
|
|
void Light_Interface::_OnPopUpMenuCommand(UINT m_IDCmdMsg)
|
|
{
|
|
switch (m_IDCmdMsg)
|
|
{
|
|
case c_Light_Popup_Off:
|
|
m_poRClicLight->fn_vSetOnOff (FALSE);
|
|
Light::fn_pGetDialog()->fn_vSetOnOff (m_poRClicLight);
|
|
|
|
break;
|
|
case c_Light_Popup_On:
|
|
m_poRClicLight->fn_vSetOnOff (TRUE);
|
|
Light::fn_pGetDialog()->fn_vSetOnOff (m_poRClicLight);
|
|
break;
|
|
|
|
case c_Light_Popup_Exit:
|
|
GetMainWorld ( ) -> fn_bCloseEditor ( this );
|
|
break;
|
|
|
|
case c_light_Popup_Update:
|
|
m_poRClicLight->fn_vUpdateLight();
|
|
break;
|
|
|
|
case c_light_Popup_RealTime_Off:
|
|
fn_vSwitchOnLight ( m_poRClicLight, FALSE );
|
|
break;
|
|
|
|
case c_light_Popup_RealTime_On:
|
|
fn_vSwitchOnLight ( m_poRClicLight, TRUE );
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
m_poRClicLight=NULL;
|
|
m_bMainDll=FALSE;
|
|
}
|
|
|
|
|
|
ACP_tdxHandleOfObject Light_Interface::fn_hGetBoundingVolume (CPA_BaseObject *_pObj)
|
|
{
|
|
CPA_ObjectDLLBase * pGeomDll = GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName);
|
|
CPA_SuperObject* poGeomSuperObject = (CPA_SuperObject*) ((Light*) _pObj)->GetSuperObject()->GetHeadElement();
|
|
return pGeomDll->fn_hGetBoundingVolume (poGeomSuperObject->GetObject());
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// Keyboard events
|
|
//----------------------------------------------------------------------
|
|
BOOL Light_Interface::fn_bOnKeyDownInDialog (CPA_DialogList *pDialog, CString csTypeName, tdeListDrawMode eDraw, CPA_BaseObject *pSelectedObject, UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if (nChar==VK_DELETE)
|
|
{
|
|
// delete only SUPER OBJECT
|
|
if (pSelectedObject->GetType()!=C_szSuperObjectTypeName) return FALSE;
|
|
|
|
CPA_SuperObject* poSuperObject = (CPA_SuperObject*) pSelectedObject;
|
|
|
|
// only waypoint & way
|
|
if ( poSuperObject->GetObjectType()==HIE_C_ulEDT_Light )
|
|
{
|
|
GetInterface()->fn_bDeleteObjectInHierarchy ( poSuperObject );
|
|
return TRUE;
|
|
}
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// Mouse events
|
|
//----------------------------------------------------------------------
|
|
BOOL Light_Interface::_OnLButtonDown (UINT i, tdstMousePos *pMouse, ACP_tdxIndex xIndex, HIE_tdstPickInfo *pInfo)
|
|
{
|
|
CPA_SuperObject *psoSuperObject, *psoClicked;
|
|
ACP_tdxIndex xFndIndex;
|
|
|
|
fn_vClearStatus ();
|
|
|
|
if (m_bOrientLight) return FALSE;
|
|
|
|
|
|
if (!xIndex)
|
|
{
|
|
m_poLight=NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
// light ?
|
|
psoSuperObject = fn_pExplorePicking (xIndex, pInfo, HIE_C_ulEDT_Light, &xFndIndex);
|
|
// to avoid near / far
|
|
if (m_o_ModifRadiusLight && m_o_ModifRadiusLight->GetSuperObject() == psoSuperObject)
|
|
{
|
|
psoClicked = GetInterface()->GetEditorObject(pInfo[xFndIndex].hSprObject);
|
|
if (psoClicked != m_o_ModifRadiusLight->GetSuperObject()->GetSuperObjectFirstChild())
|
|
{
|
|
psoSuperObject = fn_pExplorePicking (xIndex - xFndIndex - 1, &pInfo[xFndIndex+1], HIE_C_ulEDT_Light);
|
|
if (!psoSuperObject)
|
|
psoSuperObject = m_o_ModifRadiusLight->GetSuperObject();
|
|
}
|
|
}
|
|
|
|
|
|
if (psoSuperObject)
|
|
{
|
|
fn_vEdit ((Light*)(psoSuperObject->GetObject()));
|
|
return FALSE;
|
|
}
|
|
|
|
if (i==(MK_CONTROL|MK_LBUTTON) && !g_bKeyUsed)
|
|
{
|
|
psoSuperObject=fn_pExplorePicking (xIndex, pInfo, HIE_C_ulSector);
|
|
if (psoSuperObject)
|
|
{
|
|
if (Light::fn_pGetDialog()->fn_pGetEditLight()) Light::fn_pGetDialog()->fn_vClicSector ( psoSuperObject->GetObject() );
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// we don't clic on a light
|
|
if (m_o_ModifRadiusLight)
|
|
{
|
|
m_o_ModifRadiusLight->fn_vUnSelect ();
|
|
m_o_ModifRadiusLight=NULL;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL Light_Interface::_OnRButtonDown (UINT i, tdstMousePos *, ACP_tdxIndex xIndex, HIE_tdstPickInfo *pInfo)
|
|
{
|
|
CPA_SuperObject* psoSuperObject=NULL;
|
|
|
|
psoSuperObject=fn_pExplorePicking (xIndex, pInfo, HIE_C_ulEDT_Light);
|
|
// light ?
|
|
if (psoSuperObject)
|
|
{
|
|
m_poRClicLight = (Light*)(psoSuperObject->GetObject());
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL Light_Interface::_OnLButtonUp (UINT, tdstMousePos *p_stPos)
|
|
{
|
|
if (m_poLight)
|
|
{
|
|
m_poLight=NULL;
|
|
fn_vSetCursor (IDC_POINTER);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// MODELS
|
|
//----------------------------------------------------------------------
|
|
void Light_Interface::fn_vInitListByType(CPA_World *pWorld)
|
|
{
|
|
pWorld->fn_vAddANewListByType ("Light", this);
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vInitListsOfModels (void)
|
|
{
|
|
//---- Light model
|
|
GetInterface()->fn_bAddANewModelList("Light", this);
|
|
|
|
EDT_Model* pNewModelSpot = new EDT_Model ( this, "Light", csSpotModelName, "objects\\light\\spot.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelSpot, "Light", this);
|
|
|
|
EDT_Model* pNewModelSpherical = new EDT_Model ( this, "Light", csSphericalModelName, "objects\\light\\sphere.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelSpherical, "Light", this);
|
|
|
|
EDT_Model* pNewModelParallel = new EDT_Model ( this, "Light", csParallelModelName, "objects\\light\\parallel.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelParallel, "Light", this);
|
|
|
|
EDT_Model* pNewModelAmbient = new EDT_Model ( this, "Light", csAmbientModelName, "objects\\light\\ambient.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelAmbient, "Light", this);
|
|
//CHINA WFQ (MT) 16/02/98 {
|
|
EDT_Model* pNewModelParallelBox = new EDT_Model ( this, "Light", csParallelBoxModelName, "objects\\light\\parabox.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelParallelBox, "Light", this);
|
|
//ENDCHINA WFQ }
|
|
//ROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
EDT_Model* pNewModelZ_Light = new EDT_Model ( this, "Light", csZModelName, "objects\\light\\z_light.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelZ_Light, "Light", this);
|
|
//ENDROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
|
|
|
|
//ANNECY jt {
|
|
EDT_Model* pNewModelFog = new EDT_Model ( this, "Light", csFogModelName, "objects\\light\\fog.bmp", GetInterface() );
|
|
GetInterface()-> fn_bAddANewModel (pNewModelFog, "Light", this);
|
|
//ENDANNECY jt }
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vBuildNewEditorInstance (CPA_SuperObject *pEditorInstance, HIE_tdxHandleToSuperObject hEngineInstance)
|
|
{
|
|
SCR_tdst_Link_Value *pLinkValue;
|
|
Light *poEdLight;
|
|
CString csSectionName;
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
|
|
GLI_tdxHandleToLight hEngine = (GLI_tdxHandleToLight) HIE_fn_hGetSuperObjectObject(hEngineInstance);
|
|
|
|
// Link table
|
|
SCR_tdst_Link_Table * pLinkTable = LGT_fn_p_stGetLightLinkTable();
|
|
|
|
// Link value
|
|
pLinkValue = SCR_fnp_st_Link_SearchValue(pLinkTable, (unsigned long) hEngine);
|
|
|
|
if ((pLinkValue)&&(SCR_M_e_Link_GetState(pLinkValue) == SCR_ELS_Link_Initialized))
|
|
csSectionName = SCR_M_p_sz_Link_GetKey(pLinkValue);
|
|
|
|
// get parameters and create object
|
|
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName);
|
|
poEdLight = new Light( GetMainWorld(), this, hEngine, szName, szFileName, szActionName );
|
|
pEditorInstance->SetObject(poEdLight);
|
|
}
|
|
|
|
|
|
CPA_SuperObject* Light_Interface::GetNewInstance (CString csTypeName, CString csModelName, CPA_SuperObject *pParent)
|
|
{
|
|
char szLevelFileName [256];
|
|
fn_zsGetActualLevelFilename (szLevelFileName,"lgt");
|
|
long lSizePath = strlen ( fn_szGetLevelsDataPath() );
|
|
CString csLevelName = szLevelFileName+lSizePath+1;
|
|
|
|
if (csTypeName==C_szLightTypeName )
|
|
{
|
|
|
|
if (csModelName==csSpotModelName)
|
|
{
|
|
//---------------------- Spot
|
|
fn_vSetTypeLight (GLI_C_lHotSpotLight);
|
|
|
|
CPA_SuperObject* psoSpot = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType );
|
|
|
|
Light* poSpot = new Light (GetInterface()->GetMainWorld(),this, csLevelName);
|
|
|
|
// init objet
|
|
poSpot->SetSuperObject (psoSpot);
|
|
psoSpot->SetObject(poSpot);
|
|
psoSpot->SetModelName (csSpotModelName);
|
|
psoSpot->SetTypeSO (C_Static);
|
|
|
|
|
|
//---------------------------------- Spot
|
|
CPA_SuperObject* spoGraphicSpot = fn_pGetNewSpotGraphicObject ();
|
|
|
|
spoGraphicSpot->SetEditProtected (TRUE);
|
|
spoGraphicSpot->SetSuperObjectOwner (psoSpot);
|
|
psoSpot->AddTail (spoGraphicSpot);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(psoSpot->GetStruct(), GLI_C_lAllIsEnable);
|
|
|
|
// inversion Z -> -Z
|
|
GEO_tdxHandleToMatrix hLocalMatrix = HIE_fn_hGetSuperObjectMatrix ( psoSpot->GetStruct() );
|
|
// MTH3D_tdstVector stI, stY, stK;
|
|
/*
|
|
POS_fn_vGetRotationMatrix( hLocalMatrix ,
|
|
&stI, &stY, &stK );
|
|
|
|
MTH3D_M_vMulScalarVector(&stK,-1,&stK);
|
|
MTH3D_M_vMulScalarVector(&stY,-1,&stY);
|
|
|
|
POS_fn_vSetRotationMatrix( hLocalMatrix ,
|
|
&stI, &stY, &stK );
|
|
*/
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poSpot->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poSpot->GetEngineStruct(), FALSE);
|
|
|
|
return psoSpot;
|
|
}
|
|
|
|
else if (csModelName==csSphericalModelName)
|
|
{
|
|
//---------------------- Spherical
|
|
fn_vSetTypeLight (GLI_C_lSphericalLight);
|
|
|
|
CPA_SuperObject* psoSpherical = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poSpherical = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poSpherical->SetSuperObject (psoSpherical);
|
|
psoSpherical->SetObject(poSpherical);
|
|
psoSpherical->SetModelName (csSphericalModelName);
|
|
psoSpherical->SetTypeSO (C_Static);
|
|
|
|
//---------------------------------- Spherical
|
|
CPA_SuperObject* spoGraphicSpherical = fn_pGetNewSphericalGraphicObject ();
|
|
spoGraphicSpherical->SetEditProtected (TRUE);
|
|
spoGraphicSpherical->SetSuperObjectOwner (psoSpherical);
|
|
psoSpherical->AddTail (spoGraphicSpherical);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(psoSpherical->GetStruct(), GLI_C_lAllIsEnable);
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poSpherical->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poSpherical->GetEngineStruct(), FALSE);
|
|
|
|
return psoSpherical;
|
|
}
|
|
|
|
else if (csModelName==csParallelModelName)
|
|
{
|
|
//---------------------- Parallel
|
|
fn_vSetTypeLight (GLI_C_lParallelLight);
|
|
|
|
CPA_SuperObject* psoParallel = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poParallel = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poParallel->SetSuperObject (psoParallel);
|
|
psoParallel->SetObject(poParallel);
|
|
psoParallel->SetModelName (csParallelModelName);
|
|
psoParallel->SetTypeSO (C_Static);
|
|
|
|
//---------------------------------- Parallel
|
|
CPA_SuperObject* spoGraphicParallel = fn_pGetNewParallelGraphicObject ();
|
|
spoGraphicParallel->SetEditProtected (TRUE);
|
|
spoGraphicParallel->SetSuperObjectOwner (psoParallel);
|
|
psoParallel->AddTail (spoGraphicParallel);
|
|
|
|
// inversion Z -> -Z
|
|
GEO_tdxHandleToMatrix hLocalMatrix = HIE_fn_hGetSuperObjectMatrix ( psoParallel->GetStruct() );
|
|
MTH3D_tdstVector stI, stY, stK;
|
|
|
|
POS_fn_vGetRotationMatrix( hLocalMatrix ,
|
|
&stI, &stY, &stK );
|
|
|
|
MTH3D_M_vMulScalarVector(&stK,MTH_C_MinusONE,&stK);
|
|
MTH3D_M_vMulScalarVector(&stY,MTH_C_MinusONE,&stY);
|
|
|
|
POS_fn_vSetRotationMatrix( hLocalMatrix ,
|
|
&stI, &stY, &stK );
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poParallel->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poParallel->GetEngineStruct(), FALSE);
|
|
|
|
return psoParallel;
|
|
}
|
|
|
|
else if (csModelName==csAmbientModelName)
|
|
{
|
|
//---------------------- Ambient
|
|
fn_vSetTypeLight (GLI_C_lAmbientLight);
|
|
|
|
CPA_SuperObject* psoAmbient = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poAmbient = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poAmbient->SetSuperObject (psoAmbient);
|
|
psoAmbient->SetObject(poAmbient);
|
|
psoAmbient->SetModelName (csAmbientModelName);
|
|
psoAmbient->SetTypeSO (C_Static);
|
|
|
|
CPA_SuperObject* spoGraphicAmbient = fn_pGetNewAmbientGraphicObject ();
|
|
spoGraphicAmbient->SetEditProtected (TRUE);
|
|
spoGraphicAmbient->SetSuperObjectOwner (psoAmbient);
|
|
psoAmbient->AddTail (spoGraphicAmbient);
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poAmbient->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poAmbient->GetEngineStruct(), FALSE);
|
|
|
|
return psoAmbient;
|
|
|
|
}
|
|
//CHINA WFQ (MT) 16/02/98 {
|
|
else if (csModelName==csParallelBoxModelName)
|
|
{
|
|
|
|
//---------------------- ParallelBox
|
|
fn_vSetTypeLight (GLI_C_lParallelLight_With_Limit);
|
|
|
|
CPA_SuperObject* psoParallelBox = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poParallelBox = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poParallelBox->SetSuperObject (psoParallelBox);
|
|
psoParallelBox->SetObject(poParallelBox);
|
|
psoParallelBox->SetModelName (csParallelBoxModelName);
|
|
psoParallelBox->SetTypeSO (C_Static);
|
|
|
|
//---------------------------------- ParallelBox
|
|
CPA_SuperObject* spoGraphicParallelBox = fn_pGetNewParallelBoxGraphicObject ();
|
|
spoGraphicParallelBox->SetEditProtected (TRUE);
|
|
spoGraphicParallelBox->SetSuperObjectOwner (psoParallelBox);
|
|
psoParallelBox->AddTail (spoGraphicParallelBox);
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poParallelBox->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poParallelBox->GetEngineStruct(), FALSE);
|
|
|
|
return psoParallelBox;
|
|
}
|
|
//ENDCHINA WFQ }
|
|
//ROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
else if (csModelName==csZModelName)
|
|
{
|
|
|
|
//---------------------- ZModel
|
|
// fn_vSetTypeLight (GLI_C_lZ_Light);
|
|
|
|
CPA_SuperObject* psoZModel = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poZModel = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poZModel->SetSuperObject (psoZModel);
|
|
psoZModel->SetObject(poZModel);
|
|
psoZModel->SetModelName (csZModelName);
|
|
psoZModel->SetTypeSO (C_Static);
|
|
|
|
//---------------------------------- ZModel
|
|
CPA_SuperObject* spoGraphicZModel = fn_pGetNewZGraphicObject ();
|
|
spoGraphicZModel->SetEditProtected (TRUE);
|
|
spoGraphicZModel->SetSuperObjectOwner (psoZModel);
|
|
psoZModel->AddTail (spoGraphicZModel);
|
|
|
|
// update for alpha
|
|
GLI_vSetAlphaLightFlag((GLI_tdxHandleToLight)poZModel->GetEngineStruct(),2);
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poZModel->GetEngineStruct(), FALSE);
|
|
|
|
return psoZModel;
|
|
}
|
|
|
|
//ENDROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
|
|
|
|
//ANNECY jt {
|
|
else if (csModelName==csFogModelName)
|
|
{
|
|
GLI_tdxHandleToLight hLight;
|
|
//---------------------- Fog
|
|
fn_vSetTypeLight (GLI_C_lFogLight);
|
|
|
|
CPA_SuperObject* psoFog = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_NoType);
|
|
Light* poFog = new Light (GetInterface()->GetMainWorld(),this,csLevelName);
|
|
|
|
// init objet
|
|
poFog->SetSuperObject (psoFog);
|
|
psoFog->SetObject(poFog);
|
|
psoFog->SetModelName (csFogModelName);
|
|
psoFog->SetTypeSO (C_Static);
|
|
|
|
CPA_SuperObject* spoGraphicFog = fn_pGetNewFogGraphicObject ();
|
|
spoGraphicFog->SetEditProtected (TRUE);
|
|
spoGraphicFog->SetSuperObjectOwner (psoFog);
|
|
psoFog->AddTail (spoGraphicFog);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(psoFog->GetStruct(), GLI_C_lAllIsEnable);
|
|
|
|
hLight = (GLI_tdxHandleToLight) (psoFog->GetObject()->GetData());
|
|
GLI_fn_vFogSetNear(hLight, MTH_C_ZERO);
|
|
GLI_fn_vFogSetFar(hLight, 15.f);
|
|
GLI_fn_vFogSetInfinite(hLight, 50000.f);
|
|
GLI_fn_vFogSetBlendNear(hLight, MTH_C_ZERO);
|
|
GLI_fn_vFogSetBlendFar(hLight, 150.f);
|
|
|
|
GLI_vSetLightPerso((GLI_tdxHandleToLight)poFog->GetEngineStruct(), FALSE);
|
|
|
|
return psoFog;
|
|
}
|
|
//ENDANNECY jt }
|
|
|
|
else return NULL;
|
|
}
|
|
|
|
else return NULL;
|
|
}
|
|
|
|
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pCreateNewLightFromEngineHandle ( GLI_tdxHandleToLight hStaticLight )
|
|
{
|
|
CString csSectionName;
|
|
char* pszShortFileName;
|
|
char szFileName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szActionName[SCR_CV_ui_Cfg_MaxLenName];
|
|
char szName[SCR_CV_ui_Cfg_MaxLenName];
|
|
CPA_SuperObject* poSuperObject;
|
|
CPA_SuperObject* poGraphic;
|
|
Light* poLight;
|
|
long lType = GLI_lGetLightType (hStaticLight);
|
|
|
|
|
|
|
|
// Link table
|
|
SCR_tdst_Link_Table* pLinkTable = LGT_fn_p_stGetLightLinkTable();
|
|
|
|
// Link value
|
|
SCR_tdst_Link_Value* pLinkValue = SCR_fnp_st_Link_SearchValue(pLinkTable, (unsigned long) hStaticLight);
|
|
|
|
if ((pLinkValue)&&(SCR_M_e_Link_GetState(pLinkValue) == SCR_ELS_Link_Initialized))
|
|
csSectionName = SCR_M_p_sz_Link_GetKey(pLinkValue);
|
|
|
|
// get parameters and create object
|
|
SCR_fn_v_RdL0_SplitSectionName((char*)(LPCSTR) csSectionName, szFileName, szActionName, szName);
|
|
|
|
|
|
long lSizePath = strlen ( fn_szGetLevelsDataPath() );
|
|
pszShortFileName = szFileName + lSizePath + 1;
|
|
|
|
poSuperObject = GetInterface()->GetNewSuperObject (E_ss_NoSave, C_NoType);
|
|
|
|
// object construction
|
|
switch (lType)
|
|
{
|
|
case GLI_C_lParallelLight :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lParallelLight);
|
|
poSuperObject->SetModelName (csParallelModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewParallelGraphicObject (hStaticLight);
|
|
} break;
|
|
|
|
case GLI_C_lSphericalLight :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lSphericalLight);
|
|
poSuperObject->SetModelName (csSphericalModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewSphericalGraphicObject (hStaticLight);
|
|
} break;
|
|
|
|
case GLI_C_lHotSpotLight :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lHotSpotLight);
|
|
poSuperObject->SetModelName (csSpotModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewSpotGraphicObject (hStaticLight);
|
|
} break;
|
|
//CHINA WFQ (MT) 16/02/98 {
|
|
case GLI_C_lParallelLight_With_Limit :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lParallelLight_With_Limit);
|
|
poSuperObject->SetModelName (csParallelBoxModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewParallelBoxGraphicObject ();
|
|
} break;
|
|
//ENDCHINA WFQ }
|
|
//ROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
/*
|
|
case GLI_C_lZ_Light :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lZ_Light);
|
|
poSuperObject->SetModelName (csZModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewZGraphicObject();
|
|
} break;
|
|
*/
|
|
//ENDROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
|
|
case GLI_C_lAmbientLight :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lAmbientLight);
|
|
poSuperObject->SetModelName (csAmbientModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewAmbientGraphicObject (hStaticLight);
|
|
} break;
|
|
//ANNECY jt {
|
|
case GLI_C_lFogLight :
|
|
{
|
|
fn_vSetTypeLight (GLI_C_lFogLight);
|
|
poSuperObject->SetModelName (csFogModelName);
|
|
poLight = new Light( GetMainWorld(), this, hStaticLight, szName, pszShortFileName, szActionName);
|
|
poGraphic = fn_pGetNewFogGraphicObject (hStaticLight);
|
|
} break;
|
|
//ENDANNECY jt }
|
|
|
|
}
|
|
|
|
// common assignation
|
|
// init objet
|
|
poLight->SetSuperObject (poSuperObject);
|
|
poSuperObject->SetObject(poLight);
|
|
poSuperObject->SetTypeSO (C_Static);
|
|
|
|
// init graphic object
|
|
poGraphic->SetEditProtected (TRUE);
|
|
poGraphic->SetSuperObjectOwner (poSuperObject);
|
|
poSuperObject->AddTail (poGraphic);
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), GLI_C_lAllIsEnable);
|
|
|
|
|
|
// set matrix to super object
|
|
GLI_tdxHandleToLight hLight = (GLI_tdxHandleToLight)(poLight->GetEngineStruct ());
|
|
GEO_tdxHandleToMatrix hMatrix = HIE_fn_hGetSuperObjectMatrix ( poLight->GetSuperObject()->GetStruct() );
|
|
GLI_xGetLightMatrix ( hLight, hMatrix ) ;
|
|
|
|
return poSuperObject;
|
|
}
|
|
|
|
|
|
//------ Copy-paste
|
|
CPA_BaseObject * Light_Interface::Duplicate (CPA_BaseObject *pObject, CPA_SuperObject *pNewSuperObject)
|
|
{
|
|
Light* poLight = new Light (*((Light*)pObject));
|
|
poLight->fn_vNotifySave ();
|
|
|
|
// init objet
|
|
poLight->SetSuperObject (pNewSuperObject);
|
|
pNewSuperObject->SetObject(poLight);
|
|
pNewSuperObject->SetTypeSO (C_Static);
|
|
|
|
return poLight;
|
|
}
|
|
|
|
CPA_SuperObject* Light_Interface::GetCopyOfProtectedChild (CPA_SuperObject *pInitialChild, CPA_SuperObject *pNewOwner)
|
|
{
|
|
// construct new child
|
|
CPA_SuperObject* poNewChild = GetInterface ()->GetCopyOfSuperObject (pInitialChild);
|
|
CPA_BaseObject * poNewObject = pInitialChild->GetObjectDLL()->Duplicate(pInitialChild->GetObject(), poNewChild);
|
|
pInitialChild->SetObject(poNewObject);
|
|
|
|
// update parameters
|
|
CPA_SuperObject* poInitialOwner = pInitialChild->GetSuperObjectOwner();
|
|
Light * poInitialLight = (Light *) poInitialOwner->GetObject();
|
|
Light * poNewLight = (Light *) pNewOwner->GetObject();
|
|
|
|
if (pInitialChild == poInitialLight->m_poNearSuperObject)
|
|
{
|
|
poNewLight->m_poNearSuperObject = poNewChild;
|
|
poNewLight->m_bSelect = TRUE;
|
|
}
|
|
if (pInitialChild == poInitialLight->m_poFarSuperObject)
|
|
{
|
|
poNewLight->m_poFarSuperObject = poNewChild;
|
|
poNewLight->m_bSelect = TRUE;
|
|
}
|
|
if (pInitialChild == poInitialLight->m_poInterSuperObject)
|
|
{
|
|
poNewLight->m_poInterSuperObject = poNewChild;
|
|
poNewLight->m_bSelect = TRUE;
|
|
}
|
|
if (pInitialChild == poInitialLight->m_poExterSuperObject)
|
|
{
|
|
poNewLight->m_poExterSuperObject = poNewChild;
|
|
poNewLight->m_bSelect = TRUE;
|
|
}
|
|
|
|
return poNewChild;
|
|
}
|
|
|
|
CPA_SuperObject* Light_Interface::GetParentForInsertion (CString csTypeName, CString csModelName, tdstPosition *p_stPosition)
|
|
{
|
|
//ANNECY Shaitan Correction 03/03/98 {
|
|
if (!p_stPosition->xIndex)
|
|
return NULL;
|
|
//ENDANNECY Shaitan Correction }
|
|
|
|
if ( (csModelName=="Spherical")||(csModelName=="Spot")||(csModelName=="Parallel") )
|
|
{
|
|
CPA_SuperObject* poSuperObject;
|
|
poSuperObject = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos (&(p_stPosition->stPos.stPos3D));
|
|
//ANNECY Shaitan EmptySectors 25/02/98
|
|
// if (!poSuperObject) return NULL;
|
|
// return (CPA_SuperObject*)(poSuperObject->GetHeadElement ());
|
|
return poSuperObject;
|
|
//ENDANNECY Shaitan EmptySectors
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
tdeTypeSO Light_Interface::GetTypeInstance (CString csTypeName, CString csModelName)
|
|
{
|
|
return C_Static;
|
|
}
|
|
|
|
//ANNECY Shaitan EmptySectors 25/02/98
|
|
tdeSaveStatus Light_Interface::GetStatusInstance (CString csTypeName, CString csModelName)
|
|
{
|
|
return E_ss_NoSave;
|
|
}
|
|
//ENDANNECY Shaitan EmptySectors
|
|
|
|
EDT_Model* Light_Interface::fn_pstLoadNewDescriptor (void)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
|
|
CPA_BaseObject* Light_Interface::GetNewObject (CString csObjectFile, CString csObjectName, FILE *p_fFile, CPA_MainWorld *p_oMainWorld)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Orientation
|
|
//-------------------------------------------------------------------
|
|
BOOL Light_Interface::fn_bAcceptOrientInstance (CPA_SuperObject *pEdObj)
|
|
{
|
|
if (pEdObj->GetObjectType()==HIE_C_ulEDT_Light)
|
|
{
|
|
Light* poLight = (Light*) (pEdObj->GetObject());
|
|
if( poLight->fn_lGetType()==GLI_C_lHotSpotLight || poLight->fn_lGetType()==GLI_C_lParallelLight )
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL Light_Interface::fn_bOnClickOrientPosition (CPA_SuperObject *pEdObj, tdstPosition *pOrientPosition)
|
|
{
|
|
unsigned long ulFlags;
|
|
|
|
ASSERT(pEdObj->GetObjectType()==HIE_C_ulEDT_Light);
|
|
|
|
Light* poLight = (Light*) (pEdObj->GetObject());
|
|
|
|
ASSERT( poLight->fn_lGetType()==GLI_C_lHotSpotLight || poLight->fn_lGetType()==GLI_C_lParallelLight );
|
|
|
|
if( fn_bIsCurrentEditor() ) fn_vEdit( poLight );
|
|
ulFlags = HIE_fn_SO_ulGetFlags(pEdObj->GetStruct());
|
|
ulFlags |= HIE_C_Flag_ulNotPickable;
|
|
HIE_fn_SO_vSetFlags(pEdObj->GetStruct(), ulFlags);
|
|
m_bOrientLight=TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL Light_Interface::fn_bOnOrientingObject (CPA_SuperObject *pEdObj, tdstPosition *pOrientPosition)
|
|
{
|
|
if (!m_bOrientLight) return FALSE;
|
|
Light* poLight = (Light*) (pEdObj->GetObject());
|
|
MTH3D_tdstVector v = pOrientPosition->stPos.stPos3D;
|
|
poLight->fn_vOrientLight ( &v );
|
|
fn_vComputeRLI ();
|
|
poLight->fn_vSetModify (TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL Light_Interface::fn_bOnEndOrientObject (CPA_SuperObject *pEdObj, tdstPosition *pOrientPosition)
|
|
{
|
|
unsigned long ulFlags;
|
|
|
|
if (!m_bOrientLight) return FALSE;
|
|
GetInterface()->fn_vAddSelectedObject (pEdObj);
|
|
m_bOrientLight=FALSE;
|
|
ulFlags = HIE_fn_SO_ulGetFlags(pEdObj->GetStruct());
|
|
ulFlags &= ~HIE_C_Flag_ulNotPickable;
|
|
HIE_fn_SO_vSetFlags(pEdObj->GetStruct(), ulFlags);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
// MENU
|
|
//-------------------------------------------------------------------
|
|
|
|
//**************************************************************************************
|
|
//Begin Mircea Dunka 31 Aug 1998 - DialogBar interface
|
|
void Light_Interface::fn_vDefineDlgBarBtnIcon (tde_DlgBarCategory wCategory, tds_DlgBarBtn *_pDlgBarBtn)
|
|
{
|
|
if(wCategory == C_DlgBarCategoryEditor)
|
|
{
|
|
_pDlgBarBtn->hIcon = ::LoadIcon((HINSTANCE)(GetDLLIdentity()->hModule), MAKEINTRESOURCE(IDI_OLG_DLGBAR_ICON));
|
|
|
|
CString oCst;
|
|
oCst = "Light";
|
|
if( (M_GetMainApp()) && (M_GetMainApp()->mp_oAppKeyboard) )
|
|
{
|
|
oCst += " (";
|
|
oCst += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Light Editor"));
|
|
oCst += ")";
|
|
}
|
|
strcpy(_pDlgBarBtn->szToolTip, (char*)(LPCTSTR)oCst);
|
|
_pDlgBarBtn->uID = (UINT)this;
|
|
}
|
|
}
|
|
//end Mircea Dunka 31 Aug 1998
|
|
|
|
|
|
//----------------------- SubMenu
|
|
BOOL Light_Interface::fn_bDefineSubMenu(EDT_SubMenu *_p_oEDTSubMenu)
|
|
{
|
|
|
|
if (_p_oEDTSubMenu->GetSubMenuType() == C_SubMenuEditor)
|
|
{
|
|
CString csEntry = "Light";
|
|
csEntry += "\t";
|
|
csEntry += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Activate Light Editor"));
|
|
|
|
_p_oEDTSubMenu->AddAnEntry(this, (char*)(LPCTSTR)csEntry, c_Light_Submenu_Activate, fn_bIsCurrentEditor());
|
|
return TRUE;
|
|
}
|
|
|
|
else if (_p_oEDTSubMenu->GetSubMenuType() == C_SubMenuSpecific && fn_bIsCurrentEditor())
|
|
{
|
|
// RLI
|
|
_p_oEDTSubMenu->AddAnEntry(this, "Compute RLI", c_Light_SubMenu_Compute_RLI);
|
|
|
|
if (fn_bIs3DsMaxLight()) _p_oEDTSubMenu->AddAnEntry(this, "Update 3DsMax light", c_Light_SubMenu_UpDate_Light);
|
|
_p_oEDTSubMenu->AddASeparator();
|
|
_p_oEDTSubMenu->AddAnEntry(this, "Save Dialogs Dimensions", c_Light_SubMenu_Save_Preference, FALSE, TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void Light_Interface::_OnSubMenuCommand(EDT_SubMenu *_p_oEDTSubMenu,UINT uiMsgID)
|
|
{
|
|
if (_p_oEDTSubMenu->GetSubMenuType()==C_SubMenuEditor)
|
|
{
|
|
|
|
switch ( uiMsgID )
|
|
{
|
|
case c_Light_Submenu_Activate:
|
|
if (fn_bIsCurrentEditor())
|
|
GetMainWorld ( ) -> fn_bCloseEditor ( this );
|
|
else
|
|
GetMainWorld ( ) -> fn_bActivateEditor (this, NULL );
|
|
break;
|
|
}
|
|
}
|
|
|
|
else if (_p_oEDTSubMenu->GetSubMenuType()==C_SubMenuSpecific)
|
|
{
|
|
switch (uiMsgID)
|
|
{
|
|
case c_Light_SubMenu_Compute_RLI :
|
|
m_bModifyAll=TRUE;
|
|
fn_vComputeRLI ();
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
m_bNotifyIPO=TRUE;
|
|
break;
|
|
case c_Light_SubMenu_UpDate_Light :
|
|
fn_vUpDateAllLight ();
|
|
break;
|
|
case c_Light_SubMenu_Save_Preference:
|
|
fn_vSaveDialogsPreferences ();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// MOVES
|
|
//-------------------------------------------------------------------
|
|
void Light_Interface::fn_vOnBeginMove (CPA_List<CPA_SuperObject> *pListObjects, CPA_List<CPA_SuperObject> *pListConcerned, tdeStatus eStatus)
|
|
{
|
|
CPA_SuperObject* poSuperObject;
|
|
POSITION xPos;
|
|
|
|
if (eStatus!=C_AsConcernedDLL) return;
|
|
m_ListMovingLight.RemoveAll ();
|
|
|
|
for
|
|
(
|
|
poSuperObject=pListConcerned->GetHeadElement(xPos);
|
|
poSuperObject;
|
|
poSuperObject=pListConcerned->GetNextElement(xPos)
|
|
)
|
|
if (poSuperObject->GetObjectType()==HIE_C_ulEDT_Light)
|
|
m_ListMovingLight.AddTail ((Light*)(poSuperObject->GetObject()));
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vOnMoving (CPA_List<CPA_SuperObject> *pListObjects, CPA_List<CPA_SuperObject> *pListConcerned, tdeStatus eStatus)
|
|
{
|
|
Light* poLight;
|
|
POSITION xPos;
|
|
|
|
for
|
|
(
|
|
poLight=m_ListMovingLight.GetHeadElement(xPos);
|
|
poLight;
|
|
poLight=m_ListMovingLight.GetNextElement(xPos)
|
|
)
|
|
poLight->fn_vSetEngineMatrix (FALSE);
|
|
fn_vComputeRLI ();
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vOnModifMove (CPA_List<EDT_SavePos> *pListObjects, CPA_List<EDT_SaveGlobalPos> *pListConcerned, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
POSITION xPos;
|
|
EDT_SavePos* pstSavePos;
|
|
|
|
// if move is cancel, no need to recompute affected sectors
|
|
if (eType==C_EDTCancel) return;
|
|
|
|
for
|
|
(
|
|
pstSavePos = pListObjects->GetHeadElement(xPos);
|
|
pstSavePos;
|
|
pstSavePos = pListObjects->GetNextElement(xPos)
|
|
)
|
|
if (pstSavePos->m_pObject->GetObjectType()==HIE_C_ulEDT_Light)
|
|
{
|
|
|
|
fn_vComputeRLI ();
|
|
((Light*)(pstSavePos->m_pObject->GetObject()))->fn_vSetModify (TRUE);
|
|
((Light*)(pstSavePos->m_pObject->GetObject()))->fn_vSetEngineMatrix (FALSE);
|
|
((Light*)(pstSavePos->m_pObject->GetObject()))->fn_vNotifySave();
|
|
|
|
// if we change of sector -> compute the affected sectors
|
|
MTH3D_tdstVector stVertex;
|
|
POS_fn_vGetTranslationVector( pstSavePos->m_hInitialMatrix, &stVertex );
|
|
CPA_SuperObject* poInitialSuperSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos (&stVertex);
|
|
|
|
POS_fn_vGetTranslationVector( pstSavePos->m_hFinalMatrix, &stVertex );
|
|
CPA_SuperObject* poFinalSuperSector = GetInterface()->GetSpecificInterface()->GetCurrentSectorFromPos (&stVertex);
|
|
|
|
if (poInitialSuperSector!=poFinalSuperSector)
|
|
{
|
|
((Light*)(pstSavePos->m_pObject->GetObject()))->fn_vComputeSector ();
|
|
Light::fn_pGetDialog()->fn_vRefreshDialog ();
|
|
}
|
|
}
|
|
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
// Begin Silviu Simen List by Sector and type
|
|
m_p_oDialogList->fn_vUpdateSelection(E_lrm_ReinitList);
|
|
// End Silviu Simen List by Sector and type
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// OnModif
|
|
//-------------------------------------------------------------------
|
|
void Light_Interface::fn_vOnModifDelete (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
if (eStatus!=C_AsConcernedDLL) return;
|
|
if (m_bSkipOnModifDelete) return;
|
|
|
|
BOOL bRefreshLight=FALSE;
|
|
|
|
fn_vRefreshHierarchyList ();
|
|
|
|
POSITION xPos;
|
|
EDT_SaveParents* pstSaveParent;
|
|
|
|
for
|
|
(
|
|
pstSaveParent = pListObjects->GetHeadElement(xPos);
|
|
pstSaveParent;
|
|
pstSaveParent = pListObjects->GetNextElement(xPos)
|
|
)
|
|
if (pstSaveParent->m_pChild->GetObjectType()==HIE_C_ulEDT_Light)
|
|
{
|
|
|
|
if (eType==C_EDTUndo) ((Light*)(pstSaveParent->m_pChild->GetObject()))->fn_vNotifyRestore ();
|
|
else ((Light*)(pstSaveParent->m_pChild->GetObject()))->fn_vNotifyUnSave ();
|
|
|
|
if (eType==C_EDTUndo) fn_vEdit ((Light*)(pstSaveParent->m_pChild->GetObject()));
|
|
else if ( Light::fn_pGetDialog()->fn_pGetEditLight()== (Light*)(pstSaveParent->m_pChild->GetObject()) )
|
|
Light::fn_pGetDialog()->fn_vEdit (NULL);
|
|
|
|
if (eType==C_EDTUndo) ((Light*)(pstSaveParent->m_pChild->GetObject()))->fn_bValidate ();
|
|
else ((Light*)(pstSaveParent->m_pChild->GetObject()))->fn_bUnValidate ();
|
|
|
|
fn_vRefreshLight ( (Light*)(pstSaveParent->m_pChild->GetObject()), eType!=C_EDTUndo );
|
|
}
|
|
}
|
|
|
|
void Light_Interface::fn_vOnModifParent (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
// check if lights are concerned
|
|
if (eStatus!=C_AsConcernedDLL)
|
|
return;
|
|
|
|
POSITION xPos;
|
|
EDT_SaveParents* pstSaveParent;
|
|
|
|
// check if other objects are concerned
|
|
for (pstSaveParent = pListObjects->GetHeadElement(xPos); pstSaveParent;
|
|
pstSaveParent = pListObjects->GetNextElement(xPos))
|
|
{
|
|
if (pstSaveParent->m_pChild->GetObjectType()!=HIE_C_ulEDT_Light)
|
|
return;
|
|
}
|
|
|
|
// if only lights are concerned, cancel the parent coloration
|
|
GetInterface()->fn_vSetLocalColor(M_GetWorld()->GetRoot(), E_lm_ShowNormal);
|
|
// check if other objects are concerned
|
|
for (pstSaveParent = pListObjects->GetHeadElement(xPos); pstSaveParent;
|
|
pstSaveParent = pListObjects->GetNextElement(xPos))
|
|
{
|
|
GetInterface()->fn_vSetLocalColor(pstSaveParent->m_pChild, E_lm_ShowSelected);
|
|
}
|
|
}
|
|
|
|
void Light_Interface::fn_vOnModifInsert (CPA_SuperObject *pEdObj, CPA_SuperObject *pParent, tdstPosition *p_stPosition, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
if (pEdObj->GetObjectType()!=HIE_C_ulEDT_Light) return;
|
|
if (eStatus!=C_AsConcernedDLL) return;
|
|
|
|
fn_vRefreshHierarchyList ();
|
|
|
|
|
|
if (eType==C_EDTUndo)
|
|
{
|
|
Light* poLight = (Light*) pEdObj->GetObject();
|
|
poLight->fn_vNotifyUnSave ();
|
|
if ( Light::fn_pGetDialog()->fn_pGetEditLight()== poLight ) Light::fn_pGetDialog()->fn_vEdit (NULL);
|
|
poLight->fn_bUnValidate ();
|
|
fn_vRefreshLight (poLight, TRUE);
|
|
return;
|
|
}
|
|
|
|
if (fn_bGetColorMode())
|
|
((Light*)(pEdObj->GetObject()))->Set2Colors();
|
|
else
|
|
((Light*)(pEdObj->GetObject()))->SetMultiColor();
|
|
|
|
if (eType==C_EDTRedo)
|
|
{
|
|
((Light*) (pEdObj->GetObject()))->fn_vNotifyRestore ();
|
|
}
|
|
|
|
// rotate the local axis to make Oz toward the floor
|
|
GEO_tdxHandleToMatrix hMatrix = HIE_fn_hGetSuperObjectMatrix ( (HIE_tdxHandleToSuperObject)(pEdObj->GetStruct()) );
|
|
((Light*)(pEdObj->GetObject()))->fn_vSetEngineMatrix(FALSE);
|
|
|
|
|
|
// search position of superobject
|
|
if (p_stPosition)
|
|
{
|
|
MTH3D_tdstVector stVertex = p_stPosition->stPos.stPos3D;
|
|
((Light*)(pEdObj->GetObject()))->fn_vComputeSector ( &stVertex );
|
|
}
|
|
|
|
if (!m_bLoadLight)
|
|
{
|
|
fn_vRefreshLight ((Light*)(pEdObj->GetObject()));
|
|
|
|
// refresh the dialog
|
|
if (pEdObj->GetRealTypeName()==C_szLightTypeName )
|
|
{
|
|
// we don't want to clean warning status line
|
|
BOOL bCleanStatus = m_bClearStatus;
|
|
m_bClearStatus = FALSE;
|
|
|
|
fn_vEdit ( (Light*)(pEdObj->GetObject()) );
|
|
|
|
m_bClearStatus = bCleanStatus;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vOnModifCopy (CPA_List<EDT_SaveParents> *pListObjects, tdeTypeModif eType, tdeStatus eStatus)
|
|
{
|
|
EDT_SaveParents *pElem;
|
|
POSITION pos;
|
|
|
|
if (eStatus!=C_AsConcernedDLL) return;
|
|
|
|
fn_vRefreshHierarchyList ();
|
|
|
|
|
|
// notify all elements in list
|
|
for (pElem = pListObjects->GetHeadElement(pos); pElem; pElem = pListObjects->GetNextElement(pos))
|
|
{
|
|
// check type
|
|
if (pElem->m_pChild->GetObjectType() == HIE_C_ulEDT_Light)
|
|
{
|
|
Light* poLight = (Light*) pElem->m_pChild->GetObject();
|
|
// to update selection
|
|
poLight->fn_vUnSelect(FALSE);
|
|
// update section
|
|
if (eType==C_EDTDo)
|
|
{
|
|
poLight->fn_vNotifySave();
|
|
fn_vRefreshLight (poLight);
|
|
}
|
|
else if (eType==C_EDTRedo)
|
|
{
|
|
poLight->fn_vNotifyRestore();
|
|
fn_vRefreshLight (poLight);
|
|
}
|
|
else
|
|
{
|
|
poLight->fn_vNotifyUnSave();
|
|
if (Light::fn_pGetDialog()->fn_pGetEditLight()== poLight)
|
|
Light::fn_pGetDialog()->fn_vEdit (NULL);
|
|
poLight->fn_bUnValidate ();
|
|
fn_vRefreshLight (poLight, TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
long Light_Interface::OnQueryAction (CPA_EditorBase* poEditorBase, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (wParam)
|
|
{
|
|
case C_uiQueryComputeRli:
|
|
m_bModifyAll=TRUE;
|
|
fn_vComputeRLI ();
|
|
m_bNotifyIPO=TRUE;
|
|
break;
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
//---------------- Edition
|
|
void Light_Interface::fn_vEdit (Light* poLight, BOOL bSelectInList)
|
|
{
|
|
if ( m_o_ModifRadiusLight!=poLight )
|
|
{
|
|
if (m_o_ModifRadiusLight) m_o_ModifRadiusLight->fn_vUnSelect (FALSE);
|
|
if (fn_bIsCurrentEditor())
|
|
{
|
|
m_o_ModifRadiusLight = poLight;
|
|
if (m_o_ModifRadiusLight) m_o_ModifRadiusLight->fn_vSelect ();
|
|
GetInterface()->fn_vCancelCurrentSelection (FALSE);
|
|
if (m_o_ModifRadiusLight) GetInterface()->fn_vAddSelectedObject (m_o_ModifRadiusLight->GetSuperObject(),FALSE);
|
|
}
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
//Light::fn_pGetDialog()->fn_vEdit (poLight);
|
|
Light::fn_pGetDialog()->fn_vEdit ( poLight );
|
|
if (bSelectInList) m_p_oDialogList->fn_vUpdateSelection (E_lrm_ChangeSelection);
|
|
//ROMTEAM SelectMode (Ionut Grozea 25/02/98)
|
|
if(m_bSelectModeIsLight==1)
|
|
GetInterface()->SetSelectMode("Light");
|
|
//ENDROMTEAM SelectMode (Ionut Grozea)
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vSetRLIDrawMask (BOOL bOnlyRLI )
|
|
{
|
|
CPA_List<CPA_SuperObject>* poListOfSector = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
|
|
POSITION xSuperObjectPos;
|
|
CPA_SuperObject* poSuperObject;
|
|
|
|
for ( poSuperObject=poListOfSector->GetHeadElement(xSuperObjectPos); poSuperObject; poSuperObject=poListOfSector->GetNextElement(xSuperObjectPos) )
|
|
|
|
|
|
{
|
|
long lDrawMask = HIE_fn_lGetSuperObjectDrawMask (poSuperObject->GetStruct());
|
|
|
|
if (bOnlyRLI)
|
|
{
|
|
lDrawMask |= GLI_C_lIsUseStaticLights;
|
|
lDrawMask |= GLI_C_lIsUseRLI;
|
|
}
|
|
else
|
|
{
|
|
lDrawMask &= ~GLI_C_lIsUseRLI;
|
|
lDrawMask &= ~GLI_C_lIsUseStaticLights;
|
|
}
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), lDrawMask);
|
|
}
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// Dialogs preference
|
|
//--------------------------------------------------------------------
|
|
void Light_Interface::fn_vSaveDialogsPreferences (void)
|
|
{
|
|
CString csFileName;
|
|
CString csDimension;
|
|
BOOL bRes = TRUE;
|
|
|
|
csFileName = M_GetMainApp()->m_csEditorDataPath + "Objects\\" + C_szLightIniFile;
|
|
|
|
// left frame width
|
|
csDimension.Format("%ld", m_p_oSplitFrameLight->m_oCurPos.right - m_p_oSplitFrameLight->m_oCurPos.left);
|
|
bRes &= WritePrivateProfileString ("Preference", "Light Left Frame Width", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
// dialogs dimensions
|
|
csDimension.Format("%ld", m_p_oSplitFrameLight->GetPaneSize(0));
|
|
bRes &= WritePrivateProfileString ("Preference", "Light DialogList Dimension", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
csDimension.Format("%ld", m_p_oSplitFrameLight->GetPaneSize(1));
|
|
bRes &= WritePrivateProfileString ("Preference", "Light Edit Dimension", (char*)(LPCSTR)csDimension, (char*)(LPCSTR)csFileName);
|
|
|
|
// message
|
|
if (!bRes)
|
|
M_GetMainWnd()->UpdateStatus("Light Editor cannot save your preferences. Light.ini may have a ReadOnly status ?", C_STATUSPANE_INFOS, C_STATUS_WARNING);
|
|
else
|
|
M_GetMainWnd()->UpdateStatus("Preferences saved", C_STATUSPANE_INFOS, C_STATUS_NORMAL);
|
|
}
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// RLI
|
|
//--------------------------------------------------------------------
|
|
void Light_Interface::fn_vComputeRLI (BOOL bSave)
|
|
{
|
|
// for engine mode
|
|
if (m_bRunEngine)
|
|
return;
|
|
|
|
fn_vSetDisplayFlag(edmDisplayModeUseRLI,1);
|
|
fn_vSetDisplayFlag(edmDisplayModeUseStaticLight,0);
|
|
RAY_vComputeAllSector (GetInterface()->GetSpecificInterface()->GetStaticRoot()->GetStruct());
|
|
if(bSave) m_bSaveRLI=TRUE;
|
|
|
|
}
|
|
|
|
|
|
//----------------- Tools
|
|
// compute all the absolute matrix from World to given super-object
|
|
void Light_Interface::fn_vComputeAbsoluteMatrix (CPA_SuperObject* psoWP)
|
|
{
|
|
CPA_List<CPA_SuperObject> ListObject;
|
|
POSITION xPos;
|
|
CPA_SuperObject* psObj;
|
|
POS_tdstCompletePosition stIdentityMatrix;
|
|
GEO_tdxHandleToMatrix hFatherMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix ( &stIdentityMatrix );
|
|
hFatherMatrix = &stIdentityMatrix;
|
|
ListObject.RemoveAll ();
|
|
|
|
// list of the tree from object to world
|
|
for ( psObj=psoWP; psObj; psObj=(CPA_SuperObject*)psObj->GetParent() )
|
|
ListObject.AddTail ( psObj );
|
|
|
|
// we go from world to object and compute all the absolute matrix
|
|
for ( psObj=ListObject.GetTailElement(xPos); psObj; psObj=ListObject.GetPrevElement(xPos) )
|
|
{
|
|
if (psObj->GetStruct())
|
|
{
|
|
GEO_tdxHandleToMatrix hAbsoluteMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (psObj->GetStruct());
|
|
GEO_tdxHandleToMatrix hRelativeMatrix = HIE_fn_hGetSuperObjectMatrix (psObj->GetStruct());
|
|
|
|
POS_fn_vMulMatrixMatrix
|
|
(
|
|
hAbsoluteMatrix,
|
|
hFatherMatrix,
|
|
hRelativeMatrix
|
|
);
|
|
hFatherMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (psObj->GetStruct());
|
|
}
|
|
}
|
|
|
|
// clean the list
|
|
ListObject.RemoveAll ();
|
|
}
|
|
|
|
void Light_Interface::fn_vComputeNewRelativeMatrix(HIE_tdxHandleToSuperObject _hSprObj)
|
|
{
|
|
GEO_tdxHandleToMatrix hMatrix;
|
|
POS_tdstCompletePosition LocalMatrix;
|
|
hMatrix=&LocalMatrix;
|
|
|
|
POS_fn_vSetIdentityMatrix(hMatrix);
|
|
POS_fn_vInvertMatrix(hMatrix, HIE_M_xGetSuperObjectMember(HIE_fn_hGetSuperObjectFather(_hSprObj),hGlobalMatrix));
|
|
POS_fn_vMulMatrixMatrix(HIE_M_xGetSuperObjectMember(_hSprObj, hLocalMatrix), hMatrix, HIE_M_xGetSuperObjectMember(_hSprObj, hGlobalMatrix));
|
|
}
|
|
|
|
void Light_Interface::fn_vComputeInsertMatrix (CPA_SuperObject* poInsertSuperObject, CPA_SuperObject* poParentSuperObject )
|
|
{
|
|
POS_tdstCompletePosition * pParentGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (poParentSuperObject->GetStruct());
|
|
POS_tdstCompletePosition * pInsertGlobalMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (poInsertSuperObject->GetStruct());
|
|
|
|
*pInsertGlobalMatrix = *pParentGlobalMatrix;
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Graphics Models
|
|
//--------------------------------------------------------------------
|
|
//CHINA WFQ (MT) 16/02/98 {
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewBoxGraphicObject (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
// fn_vAllocSuperObjectMatrix (poSuperObject);
|
|
Geometry3D* poBoxObject = new Geometry3D (GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 2, 1);
|
|
|
|
MTH3D_tdstVector stPoint [] = {{ 0, 0., 0.},{ 1., 1., 1.}};
|
|
|
|
poBoxObject->fn_vSetListOfPoints(2, stPoint);
|
|
|
|
ACP_tdxHandleOfElement hElement = poBoxObject->fn_hCreateElementAlignedBox(1);
|
|
poBoxObject->fn_eSetAlignedBox ( hElement, 0, 0, 1);
|
|
poBoxObject->fn_vEndCreation();
|
|
|
|
poSuperObject->SetObject (poBoxObject);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement ^ (GLI_C_lIsNotDrawCollideInformationLight) );
|
|
|
|
return poSuperObject;
|
|
}
|
|
//ENDCHINA WFQ }
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewSpotGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
//ROMTEAM WorldEditor (Ionut 21/11/97)
|
|
ITBox3D* poSpotObject = new ITBox3D( GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName) , 0.25f);
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement(), 1., 1., 1. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 0., 0., 1. );
|
|
//ENDROMTEAM WorldEditor (Ionut)
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
poSpotObject->fn_vEndCreation();
|
|
|
|
poSuperObject->SetObject (poSpotObject);
|
|
return poSuperObject;
|
|
|
|
}
|
|
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewAmbientGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
//ROMTEAM WorldEditor (Ionut 21/11/97)
|
|
Oktaedron3D* poAmbientObject = new Oktaedron3D(TRUE , GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 13, 1 );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poAmbientObject, poAmbientObject->GetEngineHandle (), 1., 1., 1. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poAmbientObject, poAmbientObject->GetEngineHandle () , 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poAmbientObject, poAmbientObject->GetEngineHandle () , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poAmbientObject, poAmbientObject->GetEngineHandle () , 0., 0., 1. );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
//ENDROMTEAM WorldEditor (Ionut)
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
poAmbientObject->fn_vEndCreation();
|
|
poSuperObject->SetObject (poAmbientObject);
|
|
return poSuperObject;
|
|
|
|
}
|
|
|
|
//CHINA WFQ (MT) 16/02/98 {
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewParallelBoxGraphicObject (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
// fn_vAllocSuperObjectMatrix (poSuperObject);
|
|
Geometry3D* poParallelBoxObject = new Geometry3D (GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 16, 1);
|
|
|
|
MTH3D_tdstVector a16_stPoint [16];
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint, 0.05f, 0.05f, 0.4f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+1, -0.05f,0.05f,0.4f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+2, -0.05f,-0.05f,0.4f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+3, 0.05f,-0.05f,0.4f);
|
|
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+4, 0.05f,0.05f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+5, -0.05f,0.05f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+6, -0.05f,-0.05f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+7, 0.05f,-0.05f,0.2f);
|
|
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+8, 0.075f,0.075f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+9, -0.075f,0.075f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+10, -0.075f,-0.075f,0.2f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+11, 0.075f,-0.075f,0.2f);
|
|
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+12, 0.075f,0.075f,0.0f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+13, -0.075f,0.075f,0.0f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+14, -0.075f,-0.075f,0.0f);
|
|
MTH3D_M_vSetVectorElements ( a16_stPoint+15, 0.075f,-0.075f,0.0f);
|
|
|
|
for ( int i=0; i<16; i++ )
|
|
{
|
|
MTH3D_M_vMulScalarVector(a16_stPoint+i,2.f,a16_stPoint+i);
|
|
}
|
|
|
|
poParallelBoxObject->fn_vSetListOfPoints(16, a16_stPoint);
|
|
ACP_tdxHandleOfElement hElement = poParallelBoxObject->fn_hCreateElementIndexedTriangle(22,0);
|
|
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 0, 0, 1, 3 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 1, 1, 2, 3 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 2, 4, 5, 1 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 3, 1, 0, 4 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 4, 1, 5, 6 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 5, 1, 6, 2 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 6, 3 ,2, 6 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 7, 6, 7, 3 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 8, 0, 3, 7 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 9, 7, 4, 0 );
|
|
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 10,8, 9, 11 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 11,9, 10, 11 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 12,12, 13, 9 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 13,9, 8, 12);
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 14,9, 13, 14 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 15,9, 14, 10 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 16,11 ,10, 14 );
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 17,14, 15, 11);
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 18,8, 11,15);
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 19,15,12,8);
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 20,12,15,14);
|
|
poParallelBoxObject->fn_eSetIndexedTriangle ( hElement, 21,14,13,12 );
|
|
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poParallelBoxObject, hElement, 1., 1., 1. );
|
|
else
|
|
fn_vInitGameMaterial ( poParallelBoxObject, hElement, 1., 1., 0. );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
|
|
poParallelBoxObject->fn_vEndCreation();
|
|
|
|
poSuperObject->SetObject (poParallelBoxObject);
|
|
|
|
return poSuperObject;
|
|
}
|
|
//ENDCHINA WFQ }
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewSphericalGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
//ROMTEAM WorldEditor (Ionut 21/11/97)
|
|
ITSphere3D* poSpotObject = new ITSphere3D ( GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName) , 0.25f,10/*radius*/);
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 1., 1., 1. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poSpotObject, poSpotObject->GetHElement() , 0., 0., 1. );
|
|
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
//ENDROMTEAM WorldEditor (Ionut)
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), GLI_C_lAllIsEnable );
|
|
poSpotObject->fn_vEndCreation();
|
|
poSuperObject->SetObject (poSpotObject);
|
|
return poSuperObject;
|
|
}
|
|
//ROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewZGraphicObject (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
DoubleArrow3D* poDoubleArrow3DObject = new DoubleArrow3D(TRUE , GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName));
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poDoubleArrow3DObject, poDoubleArrow3DObject->GetEngineHandle (), 1., 1., 1. );
|
|
else
|
|
fn_vInitGameMaterial ( poDoubleArrow3DObject, poDoubleArrow3DObject->GetEngineHandle (), 1., 1., 0. );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
poDoubleArrow3DObject->fn_vEndCreation();
|
|
poSuperObject->SetObject (poDoubleArrow3DObject);
|
|
return poSuperObject;
|
|
|
|
}
|
|
//ENDROMTEAM Z_Light Ionut Grozea 01-05-1998
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewFogGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
ITSphere3D* poFogObject = new ITSphere3D ( GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName) , 0.25f,10/*radius*/);
|
|
fn_vInitGameMaterial ( poFogObject, poFogObject->GetHElement() , 1., 1., 1. );
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poFogObject, poFogObject->GetHElement(), 1., 1., 1. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poFogObject, poFogObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poFogObject, poFogObject->GetHElement() , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poFogObject, poFogObject->GetHElement() , 0., 0., 1. );
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), GLI_C_lAllIsEnable );
|
|
poFogObject->fn_vEndCreation();
|
|
poSuperObject->SetObject (poFogObject);
|
|
return poSuperObject;
|
|
}
|
|
|
|
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewConeGraphicObject (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
Geometry3D* poConeObject = new Geometry3D (GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 2, 1);
|
|
MTH3D_tdstVector stPoint [] = {{ 5, 1., 1.},{ 0., 0., 0.}};
|
|
|
|
poConeObject->fn_vSetListOfPoints(2, stPoint);
|
|
|
|
ACP_tdxHandleOfElement hElement = poConeObject->fn_hCreateElementCone(1);
|
|
poConeObject->fn_eSetCone( hElement, 0, 0, 1, 10.);
|
|
poConeObject->fn_vEndCreation();
|
|
|
|
poSuperObject->SetObject (poConeObject);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement ^ (GLI_C_lIsNotDrawCollideInformationLight) );
|
|
|
|
return poSuperObject;
|
|
}
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewSphereGraphicObject (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
Geometry3D* poSphereObject = new Geometry3D (GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 1, 1 );
|
|
|
|
MTH3D_tdstVector stPoint = { 0., 0., 0.};
|
|
poSphereObject->fn_vSetListOfPoints(1, &stPoint);
|
|
poSphereObject->fn_eSetIndexedSphere( poSphereObject->fn_hCreateElementSpheres(1), 0, 0, 0.01f);
|
|
poSphereObject->fn_vEndCreation();
|
|
|
|
poSuperObject->SetObject (poSphereObject);
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement ^ (GLI_C_lIsNotDrawCollideInformationLight) );
|
|
|
|
return poSuperObject;
|
|
}
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewParallelGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
//ROMTEAM WorldEditor (Ionut 21/11/97)
|
|
Arrow3D* poParallelObject = new Arrow3D(TRUE , GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName));
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poParallelObject, poParallelObject->GetEngineHandle (), 1., 1., 1. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poParallelObject, poParallelObject->GetEngineHandle () , 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poParallelObject, poParallelObject->GetEngineHandle () , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poParallelObject, poParallelObject->GetEngineHandle () , 0., 0., 1. );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
//ENDROMTEAM WorldEditor (Ionut)
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
poParallelObject->fn_vEndCreation();
|
|
poSuperObject->SetObject (poParallelObject);
|
|
return poSuperObject;
|
|
|
|
|
|
}
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pGetNewCursorGraphicObject (GLI_tdstLight_ *p_stLight)
|
|
{
|
|
CPA_SuperObject* poSuperObject = GetInterface()->GetNewSuperObject ( E_ss_NoSave, C_Protected );
|
|
poSuperObject->SetTypeSO (C_Protected);
|
|
Geometry3D* poCursorObject = new Geometry3D (GetInterface()->GetMainWorld()->GetObjectDLLWithName (C_szDLLGeometryName), 8, 1 );
|
|
|
|
MTH3D_tdstVector a8_stPoint [8];
|
|
|
|
for (int iCounter=0; iCounter<8; iCounter++)
|
|
MTH3D_M_vSetVectorElements ( a8_stPoint+iCounter, 0.0, 0.0, 0.0 );
|
|
|
|
poCursorObject->fn_vSetListOfPoints(8, a8_stPoint);
|
|
|
|
ACP_tdxHandleOfElement hElement = poCursorObject->fn_hCreateElementIndexedTriangle(12,0);
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 0, 0, 1, 3 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 1, 1, 2, 3 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 2, 4, 5, 1 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 3, 1, 0, 4);
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 4, 1, 5, 6 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 5, 1, 6, 2 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 6, 3, 2, 6 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 7, 6, 7, 3 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 8, 0, 3, 7 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 9, 7, 4, 0 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 10, 4, 7, 5 );
|
|
poCursorObject->fn_eSetIndexedTriangle ( hElement, 11, 6, 5, 7 );
|
|
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
if(!fn_bGetColorMode())
|
|
fn_vInitGameMaterial ( poCursorObject, hElement, 1., 1., 0. );
|
|
else
|
|
if (p_stLight==NULL)
|
|
fn_vInitGameMaterial ( poCursorObject, hElement, 1., 1., 0. );
|
|
else
|
|
if (GLI_ucGetObjectLighted(p_stLight)& GLI_C_LightPerso)
|
|
fn_vInitGameMaterial ( poCursorObject, hElement , 1., 1., 0. );
|
|
else
|
|
fn_vInitGameMaterial ( poCursorObject, hElement , 0., 0., 1. );
|
|
//ROMTEAM color lights Ionut Grozea 10-08-1998
|
|
poCursorObject->fn_vEndCreation();
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(poSuperObject->GetStruct(), C_lGouraudElement + GLI_C_lHasNotSinusEffect);
|
|
|
|
poSuperObject->SetObject (poCursorObject);
|
|
|
|
return poSuperObject;
|
|
}
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Tools
|
|
//--------------------------------------------------------------------
|
|
CPA_BaseObject* Light_Interface::fn_pSelectLightParam ( CPA_List<CPA_BaseObject> *pParams )
|
|
{
|
|
POSITION xPos;
|
|
CPA_BaseObject* p_oSuperObject=NULL;
|
|
for
|
|
(
|
|
p_oSuperObject = pParams->GetHeadElement ( xPos );
|
|
p_oSuperObject;
|
|
p_oSuperObject = pParams->GetNextElement ( xPos )
|
|
)
|
|
if (((CPA_SuperObject*)p_oSuperObject)->GetObject()->GetDataType()==HIE_C_ulEDT_Light) return p_oSuperObject;
|
|
|
|
// we don't find something interresting
|
|
return NULL;
|
|
}
|
|
|
|
void Light_Interface::fn_vPick ( ACP_tdxIndex* pxNbPicked, HIE_aDEF_stTabOfPickInfo& ra_stPickInfo, tdstMousePos *p_stPos)
|
|
{
|
|
*pxNbPicked = HIE_xIsSuperObjectPick
|
|
(
|
|
GLI_C_ModePickingFace,
|
|
GetInterface()->GetMultiDevice()->GetFocusDevice()->GetViewPort()->m_hDisplayDevice,
|
|
GetInterface()->GetMultiDevice()->GetFocusDevice()->GetViewPort()->m_hDisplayViewport,
|
|
&(p_stPos->stPos2D),
|
|
GetInterface()->GetMultiDevice3D()->GetEngineWorld(),
|
|
ra_stPickInfo
|
|
);
|
|
}
|
|
|
|
|
|
CPA_SuperObject* Light_Interface::fn_pExplorePicking (ACP_tdxIndex xIndex, HIE_tdstPickInfo *p_stObject, long lTypeObject, ACP_tdxIndex* pxFindIndex )
|
|
{
|
|
//ROMTEAM selection Ionut Grozea 14-08-1998
|
|
for (ACP_tdxIndex i=0; i<xIndex; i++)
|
|
{
|
|
CPA_SuperObject* pChild = GetInterface()->GetEditorObject(p_stObject[i].hSprObject);
|
|
while (pChild)
|
|
{
|
|
if (pChild && pChild->GetObjectType()==lTypeObject)
|
|
{
|
|
if (pxFindIndex) *pxFindIndex = i;
|
|
return pChild;
|
|
}
|
|
pChild = (CPA_SuperObject*)pChild->GetParent();
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
//ENDROMTEAM selection Ionut Grozea 14-08-1998
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vRefreshHierarchyList (void)
|
|
{
|
|
m_p_oDialogList->fn_vUpdateSelection (E_lrm_ReinitList);
|
|
}
|
|
|
|
void Light_Interface::fn_vMakeLightArray ( long* lNbLight, GLI_tdxHandleToLight* d_hLight )
|
|
{
|
|
POSITION xPos;
|
|
CPA_SuperObject* poSuperObject;
|
|
long lCounter=0;
|
|
|
|
CPA_List<CPA_SuperObject> * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName);
|
|
|
|
if (p_oListOfLight)
|
|
{
|
|
*lNbLight = p_oListOfLight->GetCount ();
|
|
|
|
for
|
|
(
|
|
poSuperObject=p_oListOfLight->GetHeadElement (xPos), lCounter=0;
|
|
poSuperObject;
|
|
poSuperObject=p_oListOfLight->GetNextElement (xPos), lCounter++
|
|
)
|
|
d_hLight[lCounter]= (GLI_tdxHandleToLight)(poSuperObject->GetObject()->GetData());
|
|
}
|
|
else
|
|
*lNbLight=0;
|
|
|
|
}
|
|
|
|
void Light_Interface::fn_vRefreshLight (Light* poLight, BOOL bDelete, BOOL bDraw )
|
|
{
|
|
// refresh the light in engine mode
|
|
if (poLight)
|
|
{
|
|
fn_vRefreshGameLight (poLight, bDelete);
|
|
poLight->fn_vSetModify (TRUE);
|
|
}
|
|
else fn_vRefreshGameLight ();
|
|
|
|
if (bDraw) GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
void Light_Interface::fn_vRefreshGameLight (void)
|
|
{
|
|
//For each sector:
|
|
CPA_List<CPA_SuperObject> * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName);
|
|
if (!p_oListOfLight) return;
|
|
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
|
|
POSITION xSuperObjectPos;
|
|
CPA_SuperObject* poSuperObject;
|
|
|
|
SECT_tdxHandleOfElementLstStaticLights d_DeleteArray [65535];
|
|
|
|
for ( poSuperObject=poList->GetHeadElement(xSuperObjectPos); xSuperObjectPos; poSuperObject=poList->GetNextElement(xSuperObjectPos) )
|
|
{
|
|
HIE_tdxHandleToSuperObject hSector;
|
|
|
|
hSector = (HIE_tdxHandleToSuperObject)(poSuperObject->GetStruct());
|
|
|
|
// remove all the statics lights in the sector
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
|
|
long i;
|
|
|
|
SECT_M_ForEachStaticLightsListInSector(hSector,hStaticLightsElement,i)
|
|
{
|
|
d_DeleteArray[i]=hStaticLightsElement;
|
|
}
|
|
//destructs nodes
|
|
long lNode;
|
|
for (lNode=0; lNode<i; lNode++)
|
|
SECT_fn_vDestructStaticLightsListNode(d_DeleteArray[lNode]);
|
|
}
|
|
|
|
|
|
// Add other lights
|
|
POSITION xLightPos;
|
|
CPA_SuperObject* poSuperLight;
|
|
for
|
|
(
|
|
poSuperLight=p_oListOfLight->GetHeadElement (xLightPos);
|
|
xLightPos;
|
|
poSuperLight=p_oListOfLight->GetNextElement (xLightPos)
|
|
)
|
|
{
|
|
POSITION xSectPos;
|
|
CPA_SuperObject* poSector;
|
|
HIE_tdxHandleToSuperObject hSector;
|
|
Light* poLight = (Light*)(poSuperLight->GetObject());
|
|
|
|
for ( poSector=poLight->fn_pGetSectorList()->GetHeadElement(xSectPos); xSectPos; poSector=poLight->fn_pGetSectorList()->GetNextElement(xSectPos) )
|
|
{
|
|
hSector = (HIE_tdxHandleToSuperObject)(poSector->GetStruct());
|
|
|
|
GLI_tdxHandleToLight hStaticLight;
|
|
hStaticLight = (GLI_tdxHandleToLight)(poLight->GetStruct());
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement = SECT_fn_hCreateElementLstStaticLights ();
|
|
SECT_fn_vSetHandleOfLightsInStaticLightsList
|
|
(
|
|
hStaticLightsElement,
|
|
hStaticLight
|
|
);
|
|
SECT_fn_vAddTailStaticLightsListNode(hSector,hStaticLightsElement);
|
|
}
|
|
}
|
|
|
|
|
|
fn_vComputeRLI ();
|
|
|
|
// update list by sector
|
|
fn_vUpdateListsBySector();
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vRefreshGameLight (Light* poLight, BOOL bDelete, BOOL bSaveRLI)
|
|
{
|
|
//For each sector:
|
|
CPA_List<CPA_BaseObject> oList;
|
|
CPA_List<CPA_SuperObject> * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName);
|
|
if (!p_oListOfLight) return;
|
|
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
|
|
if (poList->GetCount()==0) return;
|
|
|
|
POSITION xSuperObjectPos;
|
|
CPA_SuperObject* poSuperObject;
|
|
|
|
for ( poSuperObject=poList->GetHeadElement(xSuperObjectPos); xSuperObjectPos; poSuperObject=poList->GetNextElement(xSuperObjectPos) )
|
|
{
|
|
HIE_tdxHandleToSuperObject hSector;
|
|
hSector = (HIE_tdxHandleToSuperObject)(poSuperObject->GetStruct());
|
|
|
|
// remove the static light in the sector
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
|
|
SECT_tdxHandleOfElementLstStaticLights hDeleteStaticLightsElement=NULL;
|
|
long i;
|
|
|
|
SECT_M_ForEachStaticLightsListInSector(hSector,hStaticLightsElement,i)
|
|
{
|
|
GLI_tdxHandleToLight hStaticLight = SECT_GetStaticLightsInList ( hStaticLightsElement );
|
|
if (hStaticLight==poLight->GetStruct()) hDeleteStaticLightsElement=hStaticLightsElement;
|
|
}
|
|
|
|
if (hDeleteStaticLightsElement) SECT_fn_vDestructStaticLightsListNode (hDeleteStaticLightsElement);
|
|
}
|
|
|
|
POSITION xSectPos;
|
|
CPA_SuperObject* poSector;
|
|
HIE_tdxHandleToSuperObject hSector;
|
|
|
|
|
|
if (!bDelete)
|
|
{
|
|
for ( poSector=poLight->fn_pGetSectorList()->GetHeadElement(xSectPos); xSectPos; poSector=poLight->fn_pGetSectorList()->GetNextElement(xSectPos) )
|
|
{
|
|
hSector = (HIE_tdxHandleToSuperObject)(poSector->GetStruct());
|
|
|
|
GLI_tdxHandleToLight hStaticLight;
|
|
hStaticLight = (GLI_tdxHandleToLight)(poLight->GetStruct());
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement = SECT_fn_hCreateElementLstStaticLights ();
|
|
SECT_fn_vSetHandleOfLightsInStaticLightsList
|
|
(
|
|
hStaticLightsElement,
|
|
hStaticLight
|
|
);
|
|
SECT_fn_vAddTailStaticLightsListNode(hSector,hStaticLightsElement);
|
|
}
|
|
}
|
|
|
|
fn_vComputeRLI (bSaveRLI);
|
|
|
|
// update list by sector
|
|
fn_vUpdateListsBySector();
|
|
}
|
|
|
|
// this function is call only when lights are switch On/Off in editor
|
|
void Light_Interface::fn_vSwitchOnLight ( Light* poLight, BOOL bOn )
|
|
{
|
|
poLight->fn_vSetLightOn (bOn);
|
|
poLight->fn_vNotifySave();
|
|
if (Light::fn_pGetDialog()) Light::fn_pGetDialog()->fn_vInitOnOff();
|
|
fn_vRefreshGameLight (poLight,!bOn,FALSE);
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
|
|
void Light_Interface::fn_vSetCursor ( UINT i )
|
|
{
|
|
HINSTANCE hOldInst = AfxGetResourceHandle();
|
|
AfxSetResourceHandle( m_p_stDLLIdentity->hModule );
|
|
|
|
// change cursor
|
|
SetCursor (AfxGetApp()->LoadCursor (i));
|
|
|
|
AfxSetResourceHandle( hOldInst );
|
|
}
|
|
|
|
void Light_Interface::fn_vExistSaveFile (void)
|
|
{
|
|
CString csPath = fn_csGetSaveFileName ();
|
|
FILE* pFile;
|
|
|
|
pFile = fopen (csPath.GetBuffer(128), "r" );
|
|
|
|
if ( pFile )
|
|
{
|
|
m_bExistSaveFile=TRUE;
|
|
fclose (pFile);
|
|
}
|
|
else m_bExistSaveFile=FALSE;
|
|
}
|
|
|
|
void Light_Interface::fn_vInitGameMaterial ( Geometry3D* poGeomObject, ACP_tdxHandleOfElement hElement, float fR, float fG, float fB )
|
|
{
|
|
GMT_tdxHandleToGameMaterial hGameMaterial = GMT_fn_hCreateGameMaterial();
|
|
ACP_tdxHandleOfMaterial hMaterial;
|
|
GLI_xCreateMaterial ( &hMaterial ) ;
|
|
GMT_fn_vSetVisualMaterial (hGameMaterial, hMaterial);
|
|
GEO_tdstColor stColor;
|
|
stColor.xR = fR;
|
|
stColor.xG = fG;
|
|
stColor.xB = fB;
|
|
stColor.xA = 1.f;
|
|
GLI_xSetMaterialAmbientCoef ( hMaterial, &stColor );
|
|
GLI_xSetMaterialType ( hMaterial, C_lGouraudElement );
|
|
poGeomObject->fn_vSetEngineGameMaterial (hElement, 0, hGameMaterial );
|
|
}
|
|
|
|
void Light_Interface::fn_vGiveProgressInfo(CString csMessage, signed char cPercentage, BOOL _bNoHighlight /*= TRUE*/)
|
|
{
|
|
CString csTrueMessage;
|
|
if ( cPercentage == -1 )
|
|
csTrueMessage = csMessage;
|
|
else if ( cPercentage == 100 )
|
|
csTrueMessage.Format("%s >>> done", csMessage);
|
|
else
|
|
csTrueMessage.Format("%s >>> %i %% completed", csMessage, cPercentage);
|
|
|
|
M_GetMainWnd()->UpdateStatus(
|
|
(char *)LPCTSTR(csTrueMessage),
|
|
C_STATUSPANE_INFOS,
|
|
((cPercentage != 100) || _bNoHighlight) ? C_STATUS_NORMAL : C_STATUS_WARNING
|
|
);
|
|
}
|
|
|
|
void Light_Interface::fn_vUpDateAllLight (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject;
|
|
POSITION xPos;
|
|
CPA_List<CPA_SuperObject> * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName);
|
|
|
|
for (poSuperObject=p_oListOfLight->GetHeadElement(xPos); poSuperObject; poSuperObject=p_oListOfLight->GetNextElement(xPos) )
|
|
{
|
|
Light* poLight = (Light*)poSuperObject->GetObject();
|
|
if (poLight->fn_bIs3DsMaxLight())
|
|
{
|
|
poLight->fn_vUpdateLight(FALSE,FALSE);
|
|
poLight->fn_vSetModify (TRUE);
|
|
}
|
|
}
|
|
|
|
// compute RLI
|
|
fn_vComputeRLI ();
|
|
|
|
// update screen
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
}
|
|
|
|
BOOL Light_Interface::fn_bIs3DsMaxLight (void)
|
|
{
|
|
CPA_SuperObject* poSuperObject;
|
|
POSITION xPos;
|
|
CPA_List<CPA_SuperObject> * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName);
|
|
|
|
for (poSuperObject=p_oListOfLight->GetHeadElement(xPos); poSuperObject; poSuperObject=p_oListOfLight->GetNextElement(xPos) )
|
|
{
|
|
Light* poLight = (Light*)poSuperObject->GetObject();
|
|
if (poLight->fn_bIs3DsMaxLight()) return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void Light_Interface::fn_vSaveRLIModifyIPO (void)
|
|
{
|
|
// get list of editor sector
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetObjectListByType (C_szSectorTypeName);
|
|
|
|
// get light list
|
|
CPA_BaseObjectList* poListOfLight = GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szLightTypeName);
|
|
CPA_BaseObject* poBaseObject;
|
|
Position xLightPos;
|
|
|
|
if (poList->IsEmpty()) return;
|
|
|
|
// we modify all lights
|
|
if (m_bModifyAll)
|
|
{
|
|
ISI_fn_vSaveISIFromIPOFromHierarchie (GetInterface()->GetSpecificInterface()->GetStaticRoot()->GetStruct());
|
|
m_bModifyAll=FALSE;
|
|
}
|
|
else
|
|
{
|
|
// for each sector
|
|
CPA_SuperObject* poSuperObject;
|
|
POSITION xSectorPos;
|
|
|
|
for ( poSuperObject=poList->GetHeadElement(xSectorPos); poSuperObject; poSuperObject=poList->GetNextElement(xSectorPos) )
|
|
{
|
|
BOOL bSaveRLI=FALSE; // save RLI flag
|
|
|
|
if (poListOfLight)
|
|
{
|
|
// sector is in modif list
|
|
if (m_oModifSectorList.Find(poSuperObject)) bSaveRLI=TRUE;
|
|
else
|
|
{
|
|
// for each light
|
|
for ( poBaseObject=poListOfLight->GetHeadElement(xLightPos); poBaseObject && !bSaveRLI; poBaseObject=poListOfLight->GetNextElement(xLightPos) )
|
|
{
|
|
// The sector is affected by a modify light
|
|
Light* poLight = (Light*) poBaseObject;
|
|
|
|
if (poLight->fn_bIsModify())
|
|
bSaveRLI = poLight->fn_bIsAffectedSector (poSuperObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
// save RLI of sector now
|
|
if(bSaveRLI) ISI_fn_vSaveISIFromIPOFromHierarchie (poSuperObject->GetStruct());
|
|
}
|
|
}
|
|
|
|
// clear flags
|
|
if (poListOfLight)
|
|
for ( poBaseObject=poListOfLight->GetHeadElement(xLightPos); poBaseObject; poBaseObject=poListOfLight->GetNextElement(xLightPos) )
|
|
{
|
|
Light* poLight = (Light*) poBaseObject;
|
|
poLight->fn_vSetModify (FALSE);
|
|
}
|
|
// empty modif sectior list
|
|
m_oModifSectorList.RemoveAll ();
|
|
}
|
|
|
|
void Light_Interface::fn_vClearStatus (void)
|
|
{
|
|
if (m_bClearStatus)
|
|
M_GetMainWnd()->UpdateStatus( "", C_STATUSPANE_INFOS, C_STATUS_NORMAL );
|
|
m_bClearStatus = FALSE;
|
|
}
|
|
|
|
|
|
|
|
//ROMTEAM RealLights (Ionut Grozea 05/03/98)
|
|
|
|
void Light_Interface::RefreshOnlyRealLights()
|
|
{
|
|
|
|
m_ListDeleteLight.RemoveAll ();
|
|
m_ListOfParentDeleteLight.RemoveAll ();
|
|
|
|
|
|
CPA_BaseObjectList* poList = m_poLight->GetInterface()->GetMainWorld()->fn_p_oGetOriginalObjectList (C_szLightTypeName);
|
|
Position xPos;
|
|
CPA_BaseObject* poBaseObject;
|
|
|
|
for (poBaseObject = poList->GetHeadElement(xPos); poBaseObject; poBaseObject = poList->GetNextElement(xPos) )
|
|
{
|
|
CPA_SuperObject* poSuperObjectParent = ((Light*)poBaseObject)->GetSuperObject();
|
|
CPA_SuperObject* poSuperObject = (CPA_SuperObject*) poSuperObjectParent->GetHead ();
|
|
|
|
if(!((Light*)poBaseObject) ->fn_bGetOnOff ())
|
|
{
|
|
m_ListDeleteLight.AddTail ( poSuperObject );
|
|
m_ListOfParentDeleteLight.AddTail ( poSuperObjectParent );
|
|
GetInterface()->fn_bDeleteObjectInHierarchy ( poSuperObject);
|
|
m_p_oDialogList->GetListFromName( csLightList )->GetSortedList()->fn_bRemoveObject(poSuperObjectParent);
|
|
}
|
|
}
|
|
GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
fn_vRefreshHierarchyList ();
|
|
fn_vRefreshGameLight ();
|
|
m_p_oDialogList->SetCurrentType ( csLightList );
|
|
}
|
|
//ENDROMTEAM RealLights (Ionut Grozea)
|
|
|
|
//ROMTEAM RealLights (Ionut Grozea 05/03/98)
|
|
|
|
void Light_Interface::fn_vRefreshAllLights()
|
|
{
|
|
POSITION xPosLight, xPosParent;
|
|
CPA_SuperObject* poSuperObject;
|
|
CPA_SuperObject* poParent;
|
|
|
|
for (
|
|
poSuperObject=m_ListDeleteLight.GetHeadElement(xPosLight),
|
|
poParent=m_ListOfParentDeleteLight.GetHeadElement(xPosParent);
|
|
poSuperObject;
|
|
poSuperObject=m_ListDeleteLight.GetNextElement(xPosLight) ,
|
|
poParent=m_ListOfParentDeleteLight.GetNextElement(xPosParent)
|
|
)
|
|
{
|
|
GetInterface()->fn_bInsertObjectInHierarchy (poSuperObject, poParent , FALSE, FALSE, FALSE );
|
|
m_p_oDialogList->GetListFromName( csLightList )->GetSortedList()->fn_bAddObject(poParent);
|
|
}
|
|
|
|
|
|
m_ListDeleteLight.RemoveAll ();
|
|
m_ListOfParentDeleteLight.RemoveAll ();
|
|
|
|
|
|
if (m_ListDeleteLightBeforeEngine.GetCount()||m_bNotifyIPO) GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
|
|
|
|
m_p_oDialogList->SetCurrentType ( csLightList );
|
|
|
|
}
|
|
//ENDROMTEAM RealLights (Ionut Grozea)
|
|
|
|
// Shaitan Scale {
|
|
CPA_SuperObject * Light_Interface::GetVisualSuperObject (CPA_SuperObject *pInstance)
|
|
{
|
|
return pInstance->GetSuperObjectFirstChild();
|
|
}
|
|
//End Shaitan Scale }
|
|
|
|
//CPA2 Corneliu Babiuc 21-05-98
|
|
//*******************************************************************************/
|
|
// Keyboard
|
|
BOOL Light_Interface::_OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
//get the first selected lights
|
|
CPA_List<CPA_SuperObject>* poList = GetInterface()->GetSelectedObjects (this);
|
|
|
|
if (!poList->GetCount()) m_poRClicLight=NULL;
|
|
else m_poRClicLight = (Light*)(poList->GetHead()->GetObject());
|
|
|
|
switch (m_poKeyboard->mfn_uwKeyToAction(nChar))
|
|
{
|
|
case KA_LIGHT_SWITCH:
|
|
if (m_poRClicLight)
|
|
{
|
|
if (m_poRClicLight->fn_bIsLightOn())
|
|
{
|
|
_OnPopUpMenuCommand( c_light_Popup_RealTime_Off );
|
|
}
|
|
else
|
|
{
|
|
_OnPopUpMenuCommand( c_light_Popup_RealTime_On );
|
|
}
|
|
}
|
|
return TRUE;
|
|
case KA_REAL_TIME:
|
|
if (m_poRClicLight)
|
|
{
|
|
if (m_poRClicLight->fn_bGetOnOff())
|
|
{
|
|
_OnPopUpMenuCommand( c_Light_Popup_Off );
|
|
}
|
|
else
|
|
{
|
|
_OnPopUpMenuCommand( c_Light_Popup_On );
|
|
}
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if ((nFlags & VK_CONTROL) && (m_poKeyboard->mfn_uwKeyToAction(nChar) != KA_CONTROL))
|
|
g_bKeyUsed = TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL Light_Interface::_OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
if ((nFlags & VK_CONTROL) && (m_poKeyboard->mfn_uwKeyToAction(nChar) != KA_CONTROL))
|
|
g_bKeyUsed = FALSE;
|
|
|
|
return FALSE;
|
|
}
|
|
//END CPA2 Corneliu Babiuc 21-05-98
|
|
|
|
void Light_Interface::fn_vUpdateListsBySector (void)
|
|
{
|
|
Light_ListBySector *pList;
|
|
POSITION pos;
|
|
|
|
for (pList = m_stListBySector.GetHeadElement(pos); pList; pList = m_stListBySector.GetNextElement(pos))
|
|
{
|
|
pList->fn_vUpdateList();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// LISTS
|
|
//--------------------------------------------------------------------
|
|
Light_ListBySector::Light_ListBySector (CPA_SuperObject *pSector)
|
|
{
|
|
m_pSector = pSector;
|
|
// init list of lights
|
|
fn_vUpdateList();
|
|
}
|
|
|
|
Light_ListBySector::~Light_ListBySector (void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void Light_ListBySector::fn_vUpdateList (void)
|
|
{
|
|
HIE_tdxHandleToSuperObject hSector = (HIE_tdxHandleToSuperObject)(m_pSector->GetStruct());
|
|
|
|
// get the static lights in the sector
|
|
SECT_tdxHandleOfElementLstStaticLights hStaticLightsElement;
|
|
SECT_tdxHandleOfElementLstStaticLights hDeleteStaticLightsElement=NULL;
|
|
long i;
|
|
|
|
// empty the list
|
|
m_stList.DeleteAllElements();
|
|
|
|
SECT_M_ForEachStaticLightsListInSector(hSector,hStaticLightsElement,i)
|
|
{
|
|
GLI_tdxHandleToLight hStaticLight = SECT_GetStaticLightsInList(hStaticLightsElement);
|
|
CPA_BaseObject *p_oLight = m_pSector->GetEditor()->GetInterface()->GetMainWorld()->fn_p_oFindObjectWithEngine (hStaticLight, C_szLightTypeName);
|
|
if (p_oLight)
|
|
m_stList.fn_bAddObject(((Light *)p_oLight)->GetSuperObject());
|
|
}
|
|
}
|
|
|
|
|