DlgLightAnimationEditor.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. /* Copyright (c) 2002-2012 Croteam Ltd.
  2. This program is free software; you can redistribute it and/or modify
  3. it under the terms of version 2 of the GNU General Public License as published by
  4. the Free Software Foundation
  5. This program is distributed in the hope that it will be useful,
  6. but WITHOUT ANY WARRANTY; without even the implied warranty of
  7. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  8. GNU General Public License for more details.
  9. You should have received a copy of the GNU General Public License along
  10. with this program; if not, write to the Free Software Foundation, Inc.,
  11. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
  12. // DlgLightAnimationEditor.cpp : implementation file
  13. //
  14. #include "stdafx.h"
  15. #include "WorldEditor.h"
  16. #include "DlgLightAnimationEditor.h"
  17. #include <Engine/Templates/Stock_CAnimData.h>
  18. #ifdef _DEBUG
  19. #undef new
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CDlgLightAnimationEditor dialog
  26. #define DEFAULT_ANIMATION_FILE "Temp\\DefaultAnimation.ani"
  27. INDEX CDlgLightAnimationEditor::GetSelectedLightAnimation(void)
  28. {
  29. // get curently selected light animation combo member
  30. INDEX iLightAnimation = m_LightAnimationCombo.GetCurSel();
  31. if( iLightAnimation == CB_ERR)
  32. {
  33. return 0;
  34. }
  35. return iLightAnimation;
  36. }
  37. CDlgLightAnimationEditor::CDlgLightAnimationEditor(CWnd* pParent /*=NULL*/)
  38. : CDialog(CDlgLightAnimationEditor::IDD, pParent)
  39. {
  40. //{{AFX_DATA_INIT(CDlgLightAnimationEditor)
  41. m_fLightAnimationSpeed = 0.0f;
  42. m_iAnimationFrames = 0;
  43. m_strLightAnimationName = _T("");
  44. //}}AFX_DATA_INIT
  45. m_bCustomWindowsCreated = FALSE;
  46. m_fnSaveName = CTString("");
  47. // save default animation into temporary directory
  48. CAnimData adDefault;
  49. adDefault.DefaultAnimation();
  50. CTFileName fnDefaultAnimation = CTString( DEFAULT_ANIMATION_FILE);
  51. try {
  52. adDefault.Save_t( fnDefaultAnimation);
  53. } catch( char *pError) {
  54. FatalError( "Unable to save default animation: \"%s\", %s", (CTString&)fnDefaultAnimation, pError);
  55. }
  56. // try to load animation that was last edited
  57. try
  58. {
  59. CTFileName fnLastEditted = CTString( CStringA(theApp.GetProfileString(L"World editor", L"Last edited light animation", CString(DEFAULT_ANIMATION_FILE))));
  60. m_padAnimData = _pAnimStock->Obtain_t( fnLastEditted);
  61. m_fnSaveName = fnLastEditted;
  62. }
  63. catch( char *pError)
  64. {
  65. (void) pError;
  66. // try to load default animation
  67. try
  68. {
  69. m_padAnimData = _pAnimStock->Obtain_t( fnDefaultAnimation);
  70. }
  71. catch( char *pError2)
  72. {
  73. FatalError( "Unable to save and obtain default animation: \"%s\", %s", (CTString&)fnDefaultAnimation, pError2);
  74. }
  75. }
  76. // set animation data
  77. m_wndTestAnimation.m_aoAnimObject.SetData( m_padAnimData);
  78. m_bChanged = FALSE;
  79. }
  80. CDlgLightAnimationEditor::~CDlgLightAnimationEditor()
  81. {
  82. theApp.WriteProfileString(L"World editor", L"Last edited light animation", CString(m_padAnimData->GetName()));
  83. m_wndTestAnimation.m_aoAnimObject.SetData( NULL);
  84. _pAnimStock->Release( m_padAnimData);
  85. }
  86. void CDlgLightAnimationEditor::DoDataExchange(CDataExchange* pDX)
  87. {
  88. CDialog::DoDataExchange(pDX);
  89. // if dialog is receiving data
  90. if( pDX->m_bSaveAndValidate == FALSE)
  91. {
  92. InitializeData();
  93. }
  94. //{{AFX_DATA_MAP(CDlgLightAnimationEditor)
  95. DDX_Control(pDX, IDC_LIGHT_ANIMATION_NAME_COMBO, m_LightAnimationCombo);
  96. DDX_Text(pDX, IDC_CURRENT_FRAME, m_strCurrentFrame);
  97. DDX_SkyFloat(pDX, IDC_LIGHT_ANIMATION_SPEED, m_fLightAnimationSpeed);
  98. DDX_Text(pDX, IDC_LIGHT_ANIMATION_FRAMES, m_iAnimationFrames);
  99. DDV_MinMaxInt(pDX, m_iAnimationFrames, 1, 999);
  100. DDX_Text(pDX, IDC_LIGHT_ANIMATION_NAME, m_strLightAnimationName);
  101. DDV_MaxChars(pDX, m_strLightAnimationName, 30);
  102. //}}AFX_DATA_MAP
  103. // if dialog is giving data
  104. if( pDX->m_bSaveAndValidate != FALSE )
  105. {
  106. StoreData();
  107. }
  108. }
  109. BEGIN_MESSAGE_MAP(CDlgLightAnimationEditor, CDialog)
  110. //{{AFX_MSG_MAP(CDlgLightAnimationEditor)
  111. ON_WM_PAINT()
  112. ON_BN_CLICKED(IDC_DELETE_MARKER, OnDeleteMarker)
  113. ON_EN_CHANGE(IDC_LIGHT_ANIMATION_FRAMES, OnChangeLightAnimationFrames)
  114. ON_CBN_SELCHANGE(IDC_LIGHT_ANIMATION_NAME_COMBO, OnSelchangeLightAnimationNameCombo)
  115. ON_EN_CHANGE(IDC_LIGHT_ANIMATION_SPEED, OnChangeLightAnimationSpeed)
  116. ON_BN_CLICKED(IDC_SCROLL_LEFT, OnScrollLeft)
  117. ON_BN_CLICKED(IDC_SCROLL_RIGHT, OnScrollRight)
  118. ON_BN_CLICKED(IDC_SCROLL_PG_LEFT, OnScrollPgLeft)
  119. ON_BN_CLICKED(IDC_SCROLL_PG_RIGHT, OnScrollPgRight)
  120. ON_BN_CLICKED(ID_DELETE_ANIMATION, OnDeleteAnimation)
  121. ON_BN_CLICKED(ID_ADD_ANIMATION, OnAddAnimation)
  122. ON_EN_CHANGE(IDC_LIGHT_ANIMATION_NAME, OnChangeLightAnimationName)
  123. ON_BN_CLICKED(ID_LOAD_ANIMATION, OnLoadAnimation)
  124. ON_BN_CLICKED(ID_SAVE_ANIMATION, OnSaveAnimation)
  125. ON_BN_CLICKED(ID_SAVE_AS_ANIMATION, OnSaveAsAnimation)
  126. ON_BN_CLICKED(ID_CLOSE, OnButtonClose)
  127. ON_BN_CLICKED(IDCANCEL, OnCancel)
  128. ON_WM_CLOSE()
  129. //}}AFX_MSG_MAP
  130. END_MESSAGE_MAP()
  131. /////////////////////////////////////////////////////////////////////////////
  132. // CDlgLightAnimationEditor message handlers
  133. void CDlgLightAnimationEditor::InitializeData(void)
  134. {
  135. if( !IsWindow( m_LightAnimationCombo.m_hWnd)) return;
  136. // set dialog window title
  137. CTString strTitle = m_padAnimData->GetName();
  138. if( (strTitle == "") || (strTitle ==DEFAULT_ANIMATION_FILE) )
  139. {
  140. strTitle = "<unnamed>";
  141. }
  142. SetWindowText( CString(CTString("Editing animation: ") + strTitle));
  143. // get currently selected light animation combo member
  144. INDEX iLightAnimation = m_LightAnimationCombo.GetCurSel();
  145. if( iLightAnimation != CB_ERR)
  146. {
  147. m_wndTestAnimation.m_aoAnimObject.StartAnim( iLightAnimation);
  148. // obtain information about animation
  149. CAnimInfo aiInfo;
  150. m_padAnimData->GetAnimInfo(iLightAnimation, aiInfo);
  151. // set info into controls
  152. m_fLightAnimationSpeed = aiInfo.ai_SecsPerFrame;
  153. m_iAnimationFrames = aiInfo.ai_NumberOfFrames;
  154. m_strLightAnimationName = aiInfo.ai_AnimName;
  155. // set current frame text
  156. char achrFrame[ 64];
  157. sprintf( achrFrame, "Frame: %d", m_wndAnimationFrames.m_iSelectedFrame);
  158. m_strCurrentFrame = achrFrame;
  159. // redraw frames
  160. if( IsWindow(m_wndAnimationFrames.m_hWnd))
  161. {
  162. // enable/disable delete key-frame button
  163. GetDlgItem(IDC_DELETE_MARKER)->EnableWindow(
  164. m_wndAnimationFrames.IsSelectedFrameKeyFrame() );
  165. m_wndAnimationFrames.Invalidate( FALSE);
  166. }
  167. }
  168. }
  169. void CDlgLightAnimationEditor::StoreData(void)
  170. {
  171. // get curently selected light animation combo member
  172. INDEX iLightAnimation = m_LightAnimationCombo.GetCurSel();
  173. if( iLightAnimation == CB_ERR)
  174. {
  175. return;
  176. }
  177. // and set new name to anim data
  178. m_padAnimData->SetName( iLightAnimation, CTString(CStringA(m_strLightAnimationName)));
  179. //------------ Prepare new array of frames for current animation (key frames changing is
  180. // not applied here but in control LMB down handler)
  181. CAnimData *pAD = m_padAnimData;
  182. // obtain information about animation
  183. CAnimInfo aiInfo;
  184. pAD->GetAnimInfo(iLightAnimation, aiInfo);
  185. // get count of old frames
  186. INDEX ctOldFrames = aiInfo.ai_NumberOfFrames;
  187. // create array for new frames
  188. INDEX *piNewFrames = new INDEX[ m_iAnimationFrames];
  189. // now copy old array over new one but if new one is longer than old one, added
  190. // frames will be filled with last value (RGBA format)
  191. for( INDEX iFrame=0; iFrame<m_iAnimationFrames; iFrame++)
  192. {
  193. // if we are copying old frames
  194. if( iFrame<ctOldFrames)
  195. {
  196. piNewFrames[iFrame]=pAD->GetFrame(iLightAnimation, iFrame);
  197. // if we are adding last frame, delete its key-frame marker
  198. if( (m_iAnimationFrames>ctOldFrames) && (iFrame==(ctOldFrames-1)) && (iFrame != 0) )
  199. {
  200. piNewFrames[iFrame] &= 0xFFFFFF00;
  201. }
  202. }
  203. // if we are adding new frames
  204. else
  205. {
  206. // obtain last frame in old animation
  207. INDEX iLastFrame = pAD->GetFrame(iLightAnimation, ctOldFrames-1);
  208. // clear alpha chanell (we don't want added frames to be key frames)
  209. iLastFrame &= 0xFFFFFF00;
  210. // clone last frame from ole animation as added frames in new animation
  211. piNewFrames[iFrame]=iLastFrame;
  212. }
  213. }
  214. // set alpha to 0xFF to mark key frame for last frame (first and last frames must be keys)
  215. piNewFrames[m_iAnimationFrames-1] |= 0x000000FF;
  216. // set new speed
  217. pAD->SetSpeed( iLightAnimation, m_fLightAnimationSpeed);
  218. // set new frames
  219. pAD->SetFrames( iLightAnimation, m_iAnimationFrames, piNewFrames);
  220. // spread frames
  221. SpreadFrames();
  222. // delete allocated array
  223. delete piNewFrames;
  224. m_bChanged = TRUE;
  225. }
  226. void CDlgLightAnimationEditor::SpreadFrames(void)
  227. {
  228. // get curently selected light animation combo member
  229. INDEX iLightAnimation = m_LightAnimationCombo.GetCurSel();
  230. if( iLightAnimation == CB_ERR)
  231. {
  232. return;
  233. }
  234. // obtain information about animation
  235. CAnimInfo aiInfo;
  236. CAnimData *pAD = m_padAnimData;
  237. pAD->GetAnimInfo(iLightAnimation, aiInfo);
  238. // get count of frames
  239. INDEX ctFrames = aiInfo.ai_NumberOfFrames;
  240. // create array to be copy of current frames array
  241. INDEX *piFrames = new INDEX[ ctFrames];
  242. // now copy old array over new one
  243. for( INDEX iFrame=0; iFrame<m_iAnimationFrames; iFrame++)
  244. {
  245. piFrames[iFrame]=pAD->GetFrame(iLightAnimation, iFrame);
  246. }
  247. // we will start spreading from first frame
  248. INDEX iStart=0;
  249. // now spread frames beetween key-frames
  250. do
  251. {
  252. // find first next key frame
  253. INDEX iKeySearcher=iStart+1;
  254. for( ; iKeySearcher<ctFrames; iKeySearcher++)
  255. {
  256. // is this gradient key frame?
  257. if( (piFrames[iKeySearcher] & 0x000000FF) != 0)
  258. {
  259. // yes it is, stop searching
  260. break;
  261. }
  262. }
  263. // get starting R, G, B values
  264. FLOAT fStartR = (FLOAT) ((piFrames[iStart]>>24) & 0x000000FF);
  265. FLOAT fStartG = (FLOAT) ((piFrames[iStart]>>16) & 0x000000FF);
  266. FLOAT fStartB = (FLOAT) ((piFrames[iStart]>>8 ) & 0x000000FF);
  267. // calculate R, G and B deltas
  268. FLOAT fdR = ( (FLOAT)((piFrames[iKeySearcher]>>24) & 0x000000FF)-
  269. ((piFrames[iStart]>>24) & 0x000000FF) )/(iKeySearcher-iStart);
  270. FLOAT fdG = ( (FLOAT)((piFrames[iKeySearcher]>>16) & 0x000000FF)-
  271. ((piFrames[iStart]>>16) & 0x000000FF) )/(iKeySearcher-iStart);
  272. FLOAT fdB = ( (FLOAT)((piFrames[iKeySearcher]>>8) & 0x000000FF)-
  273. ((piFrames[iStart]>>8) & 0x000000FF) )/(iKeySearcher-iStart);
  274. INDEX iDeltaTimes=1;
  275. // create gradients beetween iStart and iKeySearcher
  276. for( INDEX iGradient=iStart+1; iGradient<iKeySearcher; iGradient++)
  277. {
  278. FLOAT fCurrentR = fStartR+fdR*iDeltaTimes;
  279. FLOAT fCurrentG = fStartG+fdG*iDeltaTimes;
  280. FLOAT fCurrentB = fStartB+fdB*iDeltaTimes;
  281. COLOR colNR = (COLOR) fCurrentR;
  282. COLOR colNG = (COLOR) fCurrentG;
  283. COLOR colNB = (COLOR) fCurrentB;
  284. piFrames[iGradient]= (colNR<<24) | (colNG<<16) | (colNB<<8);
  285. // next delta
  286. iDeltaTimes ++;
  287. }
  288. // next gradient will start at last key frame
  289. iStart = iKeySearcher;
  290. }
  291. while( iStart < ctFrames);
  292. // set new frames
  293. pAD->SetFrames( iLightAnimation, ctFrames, piFrames);
  294. // delete allocated array
  295. delete piFrames;
  296. // redraw frames
  297. if( IsWindow(m_wndAnimationFrames.m_hWnd))
  298. {
  299. m_wndAnimationFrames.Invalidate( FALSE);
  300. }
  301. }
  302. void CDlgLightAnimationEditor::OnPaint()
  303. {
  304. {
  305. CPaintDC dc(this); // device context for painting
  306. }
  307. if( !m_bCustomWindowsCreated)
  308. {
  309. // ---------------- Create custom window that will hold graphical representation of frames
  310. // obtain frames area window
  311. CWnd *pWndFramesArea = GetDlgItem(IDC_FRAMES_AREA);
  312. ASSERT(pWndFramesArea != NULL);
  313. // obtain frames area frame control's rectangle
  314. CRect rectFramesArea;
  315. pWndFramesArea->GetWindowRect(&rectFramesArea);
  316. ScreenToClient(&rectFramesArea);
  317. // create window for area to contain frames
  318. m_wndAnimationFrames.Create( NULL, NULL, WS_BORDER|WS_VISIBLE, rectFramesArea,
  319. this, IDW_ANIMATION_FRAMES);
  320. m_wndAnimationFrames.SetParentDlg( this);
  321. // ---------------- Create custom window that show how light animation looks like
  322. CWnd *pWndTestArea = GetDlgItem(IDC_TEST_AREA);
  323. ASSERT(pWndTestArea != NULL);
  324. CRect rectTestArea;
  325. pWndTestArea->GetWindowRect(&rectTestArea);
  326. ScreenToClient(&rectTestArea);
  327. // create window for for animation testing
  328. m_wndTestAnimation.Create( NULL, NULL, WS_BORDER|WS_VISIBLE, rectTestArea,
  329. this, IDW_ANIMATION_FRAMES);
  330. m_wndTestAnimation.SetParentDlg( this);
  331. // mark that custom windows are created
  332. m_bCustomWindowsCreated = TRUE;
  333. }
  334. }
  335. BOOL CDlgLightAnimationEditor::OnInitDialog()
  336. {
  337. CDialog::OnInitDialog();
  338. // initialize light animation combo
  339. InitLightAnimationCombo();
  340. m_LightAnimationCombo.SetCurSel(0);
  341. // initialize
  342. UpdateData( FALSE);
  343. return TRUE;
  344. }
  345. void CDlgLightAnimationEditor::OnDeleteMarker()
  346. {
  347. // delete selected frame
  348. m_wndAnimationFrames.DeleteSelectedFrame();
  349. }
  350. void CDlgLightAnimationEditor::OnChangeLightAnimationFrames()
  351. {
  352. // store data state from dialog into animation data
  353. if( IsWindow(m_LightAnimationCombo.m_hWnd))
  354. {
  355. // reset starting and selected frames
  356. m_wndAnimationFrames.m_iStartingFrame = 0;
  357. m_wndAnimationFrames.m_iSelectedFrame = 0;
  358. UpdateData( TRUE);
  359. }
  360. }
  361. void CDlgLightAnimationEditor::InitLightAnimationCombo(void)
  362. {
  363. // clear combo box
  364. m_LightAnimationCombo.ResetContent();
  365. // limit animation lenght
  366. m_LightAnimationCombo.LimitText(NAME_SIZE);
  367. // initialize light animations combo box
  368. for(INDEX iAnimation=0;iAnimation<m_padAnimData->GetAnimsCt(); iAnimation++)
  369. {
  370. // obtain information about animation
  371. CAnimInfo aiInfo;
  372. m_padAnimData->GetAnimInfo(iAnimation, aiInfo);
  373. // add animation name
  374. m_LightAnimationCombo.AddString( CString(aiInfo.ai_AnimName));
  375. }
  376. }
  377. void CDlgLightAnimationEditor::OnScrollLeft()
  378. {
  379. m_wndAnimationFrames.ScrollLeft();
  380. }
  381. void CDlgLightAnimationEditor::OnScrollRight()
  382. {
  383. m_wndAnimationFrames.ScrollRight();
  384. }
  385. void CDlgLightAnimationEditor::OnScrollPgLeft()
  386. {
  387. m_wndAnimationFrames.ScrollPgLeft();
  388. }
  389. void CDlgLightAnimationEditor::OnScrollPgRight()
  390. {
  391. m_wndAnimationFrames.ScrollPgRight();
  392. }
  393. void CDlgLightAnimationEditor::OnSelchangeLightAnimationNameCombo()
  394. {
  395. // reset starting and selected frames
  396. m_wndAnimationFrames.m_iStartingFrame = 0;
  397. m_wndAnimationFrames.m_iSelectedFrame = 0;
  398. UpdateData( FALSE);
  399. }
  400. void CDlgLightAnimationEditor::OnChangeLightAnimationSpeed()
  401. {
  402. // store data state from dialog into animation data
  403. if( IsWindow(m_LightAnimationCombo.m_hWnd))
  404. {
  405. UpdateData( TRUE);
  406. }
  407. }
  408. void CDlgLightAnimationEditor::OnDeleteAnimation()
  409. {
  410. // get newly selected animation
  411. INDEX iAnimation = m_LightAnimationCombo.GetCurSel();
  412. m_padAnimData->DeleteAnimation( iAnimation);
  413. InitLightAnimationCombo();
  414. m_LightAnimationCombo.SetCurSel( 0);
  415. UpdateData( FALSE);
  416. }
  417. void CDlgLightAnimationEditor::OnAddAnimation()
  418. {
  419. m_padAnimData->AddAnimation();
  420. // select newly added animation
  421. InitLightAnimationCombo();
  422. m_LightAnimationCombo.SetCurSel(m_padAnimData->GetAnimsCt()-1);
  423. // reset starting and selected frames
  424. m_wndAnimationFrames.m_iStartingFrame = 0;
  425. m_wndAnimationFrames.m_iSelectedFrame = 0;
  426. UpdateData( FALSE);
  427. }
  428. void CDlgLightAnimationEditor::OnChangeLightAnimationName()
  429. {
  430. UpdateData( TRUE);
  431. INDEX iAnimation = m_LightAnimationCombo.GetCurSel();
  432. InitLightAnimationCombo();
  433. m_LightAnimationCombo.SetCurSel( iAnimation);
  434. }
  435. void CDlgLightAnimationEditor::OnLoadAnimation()
  436. {
  437. CTFileName fnAnimation = _EngineGUI.FileRequester(
  438. "Load animation file",
  439. "Animation file (*.ani)\0*.ani\0" FILTER_ALL FILTER_END,
  440. "Animation directory", "");
  441. if( fnAnimation == "") return;
  442. try
  443. {
  444. _pAnimStock->Release( m_padAnimData);
  445. m_padAnimData = _pAnimStock->Obtain_t( fnAnimation);
  446. m_fnSaveName = fnAnimation;
  447. }
  448. catch( char *strError)
  449. {
  450. WarningMessage( strError);
  451. try
  452. {
  453. CTFileName fnDefaultAnimation = CTString( DEFAULT_ANIMATION_FILE);
  454. m_padAnimData = _pAnimStock->Obtain_t( fnDefaultAnimation);
  455. }
  456. catch( char *strError2)
  457. {
  458. FatalError( strError2);
  459. }
  460. }
  461. // initialize light animation combo
  462. InitLightAnimationCombo();
  463. // set animation data
  464. m_wndTestAnimation.m_aoAnimObject.SetData( m_padAnimData);
  465. m_LightAnimationCombo.SetCurSel(0);
  466. UpdateData( FALSE);
  467. }
  468. void CDlgLightAnimationEditor::OnSaveAnimation()
  469. {
  470. if( m_fnSaveName == "")
  471. {
  472. OnSaveAsAnimation();
  473. }
  474. else
  475. {
  476. try
  477. {
  478. CTFileStream strmFile;
  479. strmFile.Create_t( m_fnSaveName);
  480. // write animation from file
  481. m_padAnimData->Write_t( &strmFile);
  482. strmFile.Close();
  483. // refresh animation
  484. CAnimData *pad = _pAnimStock->Obtain_t(m_fnSaveName);
  485. pad->Reload();
  486. _pAnimStock->Release(pad);
  487. }
  488. catch( char *strError)
  489. {
  490. WarningMessage( strError);
  491. }
  492. }
  493. }
  494. void CDlgLightAnimationEditor::OnSaveAsAnimation()
  495. {
  496. CTFileName fnAnimation = _EngineGUI.FileRequester(
  497. "Save animation file",
  498. "Animation file (*.ani)\0*.ani\0" FILTER_ALL FILTER_END,
  499. "Animation directory", "", "", NULL, FALSE);
  500. if( fnAnimation == "") return;
  501. try
  502. {
  503. CTFileStream strmFile;
  504. strmFile.Create_t( fnAnimation);
  505. // write animation into file
  506. m_padAnimData->Write_t( &strmFile);
  507. m_fnSaveName = fnAnimation;
  508. strmFile.Close();
  509. // refresh animation
  510. CAnimData *pad = _pAnimStock->Obtain_t(m_fnSaveName);
  511. pad->Reload();
  512. _pAnimStock->Release(pad);
  513. }
  514. catch( char *strError)
  515. {
  516. WarningMessage( strError);
  517. }
  518. }
  519. void CDlgLightAnimationEditor::OnButtonClose()
  520. {
  521. if( m_bChanged) OnSaveAnimation();
  522. EndDialog( 0);
  523. }
  524. void CDlgLightAnimationEditor::OnCancel()
  525. {
  526. if( m_bChanged) OnSaveAnimation();
  527. EndDialog( 0);
  528. }
  529. void CDlgLightAnimationEditor::OnClose()
  530. {
  531. if( m_bChanged) OnSaveAnimation();
  532. CDialog::OnClose();
  533. }
  534. void CDlgLightAnimationEditor::OnOK()
  535. {
  536. }