/* /////////////////////////////////////////////////////////////////////////////////////////////////// // 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 #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* pList = new CPA_List; // 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* 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 *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* 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* 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 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* 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* 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 *pSelection, BOOL bIsAlone) { BOOL bEntry=FALSE; if (m_bMainDll) { m_bMainDll=FALSE; return FALSE; } m_bMainDll=bIsAlone; CPA_List* 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 *pListObjects, CPA_List *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 *pListObjects, CPA_List *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 *pListObjects, CPA_List *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 *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 *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 *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* 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 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 *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; iGetEditorObject(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 * 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 * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName); if (!p_oListOfLight) return; CPA_List* 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; lNodeGetHeadElement (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 oList; CPA_List * p_oListOfLight = GetInterface()->GetObjectListByType(C_szLightTypeName); if (!p_oListOfLight) return; CPA_List* 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 * 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 * 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* 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* 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()); } }