root / trunk / win / Moddlg.cpp

Revision 681, 25.1 kB (checked in by leo, 19 months ago)

Added separate world and parent positions to objects.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// ModDlg.cpp: implementation of the CModifyDialog class.
2//
3//////////////////////////////////////////////////////////////////////
4
5#include "lc_global.h"
6#include "leocad.h" 
7#include "ModDlg.h" 
8#include "tools.h"
9
10#include "project.h"
11#include "globals.h"
12#include "defines.h"
13#include "lc_object.h"
14#include "lc_piece.h"
15#include "lc_camera.h"
16#include "lc_light.h"
17#include "lc_application.h"
18
19#ifdef _DEBUG 
20#undef THIS_FILE 
21static char THIS_FILE[]=__FILE__;
22#define new DEBUG_NEW
23#endif 
24
25/////////////////////////////////////////////////////////////////////////////
26// CModifyDialogBar
27
28CModifyDialogBar::CModifyDialogBar()
29{
30    m_dwSCBStyle |= SCBS_SHOWEDGES;
31}
32
33CModifyDialogBar::~CModifyDialogBar()
34{
35}
36
37
38BEGIN_MESSAGE_MAP(CModifyDialogBar, CSizingControlBarG)
39    //{{AFX_MSG_MAP(CModifyDialogBar)
40    ON_WM_CREATE()
41    ON_WM_SIZE()
42    //}}AFX_MSG_MAP
43END_MESSAGE_MAP()
44
45
46/////////////////////////////////////////////////////////////////////////////
47// CModifyDialogBar message handlers
48
49int CModifyDialogBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
50{
51    if (CSizingControlBarG::OnCreate(lpCreateStruct) == -1)
52        return -1;
53
54    SetSCBStyle(GetSCBStyle() | SCBS_SIZECHILD);
55
56    m_ModifyDlg.Create(CModifyDialog::IDD, this);
57    m_ModifyDlg.OnInitDialogBar();
58
59    return 0;
60}
61
62CSize CModifyDialogBar::CalcDynamicLayout(int nLength, DWORD dwMode)
63{
64    // Update minimum size.
65    CRect rc;
66
67    m_ModifyDlg.GetDlgItem(IDC_MODIFY_CHILD)->GetWindowRect(&rc);
68    ScreenToClient(&rc);
69
70    int Width = rc.Width() + rc.left * 2 + 4;
71
72    if (dwMode & (LM_LENGTHY | LM_VERTDOCK))
73    {
74        if (m_ModifyDlg.m_RollUp.m_PageHeight >= nLength - rc.top - 10)
75            Width += RC_SCROLLBARWIDTH;
76    }
77    else
78    {
79        m_ModifyDlg.m_RollUp.GetWindowRect(&rc);
80        ScreenToClient(&rc);
81
82        if (m_ModifyDlg.m_RollUp.m_PageHeight >= rc.Height())
83            Width += RC_SCROLLBARWIDTH;
84    }
85
86    m_szMinFloat.cx = Width + 4;
87
88    return CSizingControlBarG::CalcDynamicLayout(nLength, dwMode);
89}
90
91CSize CModifyDialogBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
92{
93    // Update minimum size.
94    CRect rc;
95
96    m_ModifyDlg.GetDlgItem(IDC_MODIFY_CHILD)->GetWindowRect(&rc);
97    ScreenToClient(&rc);
98
99    int Width = rc.Width() + rc.left * 2 + 14;
100
101    if (!bHorz)
102    {
103        m_ModifyDlg.m_RollUp.GetWindowRect(&rc);
104        ScreenToClient(&rc);
105
106        if (m_ModifyDlg.m_RollUp.m_PageHeight >= rc.Height())
107            Width += RC_SCROLLBARWIDTH;
108    }
109
110    m_szMinHorz.cx = m_szMinVert.cx = Width;
111
112    return CSizingControlBarG::CalcFixedLayout(bStretch, bHorz);
113}
114
115void CModifyDialogBar::OnSize(UINT nType, int cx, int cy)
116{
117    CSizingControlBarG::OnSize(nType, cx, cy);
118}
119
120//////////////////////////////////////////////////////////////////////
121// Construction/Destruction
122//////////////////////////////////////////////////////////////////////
123
124IMPLEMENT_DYNAMIC(CModifyDialog, CDialog)
125
126BEGIN_MESSAGE_MAP(CModifyDialog, CDialog)
127    //{{AFX_MSG_MAP(CModifyDialog)
128    ON_BN_CLICKED(IDC_MODDLG_PIECE, OnModdlgPiece)
129    ON_CBN_SELENDOK(IDC_MODDLG_LIST, OnSelendokModdlgList)
130    ON_CBN_DROPDOWN(IDC_MODDLG_LIST, OnDropdownModdlgList)
131    ON_BN_CLICKED(IDC_MODDLG_APPLY, OnModdlgApply)
132    ON_WM_SHOWWINDOW()
133    ON_WM_SIZE()
134    //}}AFX_MSG_MAP
135    ON_COMMAND_RANGE(ID_MODDLG_PIECES, ID_MODDLG_LIGHTS, OnMenuClick)
136END_MESSAGE_MAP()
137
138CModifyDialog::CModifyDialog(CWnd* pParent)
139{
140    m_pObject = NULL;
141    m_CurrentType = -1;
142
143    //{{AFX_DATA_INIT(CModifyDialog)
144    m_strName = _T("");
145    //}}AFX_DATA_INIT
146}
147
148CModifyDialog::~CModifyDialog()
149{
150}
151
152BOOL CModifyDialog::OnInitDialogBar()
153{
154    m_RollUp.Create(WS_VISIBLE|WS_CHILD, CRect(4,4,187,362), this, 2);
155
156    m_PieceDlg.Create(CModifyPieceDlg::IDD, &m_RollUp);
157    m_CameraDlg.Create(CModifyCameraDlg::IDD, &m_RollUp);
158    m_LightDlg.Create(CModifyLightDlg::IDD, &m_RollUp);
159
160    PositionChildren();
161
162    // Support for the MFC DDX model
163    UpdateData(FALSE);
164
165    m_ctlCombo.LimitText(80);
166    UpdateControls(LC_OBJECT_PIECE);
167
168    return TRUE;
169}
170
171void CModifyDialog::DoDataExchange(CDataExchange* pDX)
172{
173    //Derived Classes Overide this function
174    ASSERT(pDX);
175
176    CDialog::DoDataExchange(pDX);
177    //{{AFX_DATA_MAP(CModifyDialog)
178    DDX_Control(pDX, IDC_MODDLG_LIST, m_ctlCombo);
179    DDX_Text(pDX, IDC_MODDLG_LIST, m_strName);
180    DDV_MaxChars(pDX, m_strName, 80);
181    //}}AFX_DATA_MAP
182}
183
184void CModifyDialog::OnUpdateCmdUI(CFrameWnd * pTarget, BOOL /*bDisableIfNoHndler*/)
185{
186    UpdateDialogControls(pTarget, FALSE);
187}
188
189void CModifyDialog::UpdateInfo(lcObject* pObject)
190{
191    if ((GetStyle() & WS_VISIBLE) == 0)
192        return;
193
194    if (pObject == NULL)
195        pObject = lcGetActiveProject()->GetFocusObject();
196
197    m_pObject = pObject;
198
199    if (m_pObject == NULL)
200    {
201        /*
202        m_fPosX = m_fPosY = m_fPosZ = 0.0f;
203        m_fRotX = m_fRotY = m_fRotZ = 0.0f;
204        m_fUpX = m_fUpY = m_fUpZ = 0.0f;
205        UpdateData(FALSE);
206        */
207        return;
208    }
209    else
210    {
211        UpdateControls(m_pObject->GetType());
212    }
213
214    switch (m_CurrentType)
215    {
216        case LC_OBJECT_PIECE:
217        {
218            m_PieceDlg.UpdateInfo((lcPiece*)m_pObject);
219            m_ctlCombo.SetWindowText(m_pObject->m_Name);
220        } break;
221
222        case LC_OBJECT_CAMERA:
223        case LC_OBJECT_CAMERA_TARGET:
224        {
225            lcCamera* Camera;
226
227            if (m_CurrentType == LC_OBJECT_CAMERA)
228                Camera = (lcCamera*)m_pObject;
229            else
230                Camera = (lcCamera*)m_pObject->m_Parent;
231
232            m_CameraDlg.UpdateInfo(Camera);
233            m_ctlCombo.SetWindowText(m_pObject->m_Name);
234        } break;
235
236        case LC_OBJECT_LIGHT:
237        case LC_OBJECT_LIGHT_TARGET:
238        {
239            lcLight* Light;
240
241            if (m_CurrentType == LC_OBJECT_LIGHT)
242                Light = (lcLight*)m_pObject;
243            else
244                Light = (lcLight*)m_pObject->m_Parent;
245
246            m_LightDlg.UpdateInfo(Light);
247            m_ctlCombo.SetWindowText(m_pObject->m_Name);
248        } break;
249    }
250}
251
252void CModifyDialog::OnModdlgPiece()
253{
254    CMenu menu;
255    CMenu* pPopup;
256    RECT rc;
257    ::GetWindowRect(::GetDlgItem(m_hWnd, IDC_MODDLG_PIECE), &rc);
258    menu.LoadMenu(IDR_POPUPS);
259    pPopup = menu.GetSubMenu(5);
260    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rc.right, rc.top, this);
261}
262
263void CModifyDialog::OnShowWindow(BOOL bShow, UINT nStatus)
264{
265    CDialog::OnShowWindow(bShow, nStatus);
266
267    if (bShow)
268        PositionChildren();
269}
270
271void CModifyDialog::OnMove(int x, int y)
272{
273    CDialog::OnMove(x, y);
274
275    // Avoid calling before window creation.
276    if (IsWindowVisible())
277        PositionChildren();
278}
279
280void CModifyDialog::OnSize(UINT nType, int cx, int cy)
281{
282    PositionChildren();
283}
284
285void CModifyDialog::PositionChildren()
286{
287    CRect StaticRect, ClientRect;
288
289    if (!IsWindow(m_PieceDlg.m_hWnd))
290        return;
291
292    GetDlgItem(IDC_MODIFY_CHILD)->GetWindowRect(&StaticRect);
293    GetClientRect(&ClientRect);
294
295    // Recompute coordinates relative to parent window.
296    ScreenToClient(&StaticRect);
297
298    m_RollUp.MoveWindow(StaticRect.left-1, StaticRect.top, ClientRect.Width() - (StaticRect.left-1) * 2, ClientRect.Height() - StaticRect.top, TRUE);
299
300    m_ctlCombo.GetWindowRect(&StaticRect);
301    ScreenToClient(&StaticRect);
302    m_ctlCombo.MoveWindow(StaticRect.left, StaticRect.top, ClientRect.Width() - StaticRect.left - 4, StaticRect.Height(), TRUE);
303}
304
305
306void CModifyDialog::UpdateControls(int Type)
307{
308    if (m_CurrentType == Type)
309        return;
310
311    DeleteObject((HBITMAP)SendDlgItemMessage(IDC_MODDLG_PIECE, BM_GETIMAGE, IMAGE_BITMAP, 0));
312
313    UINT id = IDB_PIECE;
314    if (Type == LC_OBJECT_CAMERA || Type == LC_OBJECT_CAMERA_TARGET)
315        id = IDB_CAMERA;
316    if (Type == LC_OBJECT_LIGHT || Type == LC_OBJECT_LIGHT_TARGET)
317        id = IDB_LIGHT;
318    SendDlgItemMessage(IDC_MODDLG_PIECE, BM_SETIMAGE, IMAGE_BITMAP,
319                       (LPARAM)LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(id)));
320
321    m_ctlCombo.SetWindowText("");
322
323    m_RollUp.RemoveAllPages();
324
325    switch (Type)
326    {
327    case LC_OBJECT_PIECE:
328        m_RollUp.InsertPage("", &m_PieceDlg, FALSE);
329        break;
330
331    case LC_OBJECT_CAMERA:
332    case LC_OBJECT_CAMERA_TARGET:
333        m_RollUp.InsertPage("", &m_CameraDlg, FALSE);
334        break;
335
336    case LC_OBJECT_LIGHT:
337    case LC_OBJECT_LIGHT_TARGET:
338        m_RollUp.InsertPage("", &m_LightDlg, FALSE);
339        break;
340    }
341
342    m_RollUp.ExpandAllPages();
343
344    m_CurrentType = Type;
345}
346
347void CModifyDialog::OnMenuClick(UINT nID)
348{
349    m_pObject = NULL;
350    switch (nID - ID_MODDLG_PIECES)
351    {
352    case 0: UpdateControls(LC_OBJECT_PIECE); break;
353    case 1: UpdateControls(LC_OBJECT_CAMERA); break;
354    case 2: UpdateControls(LC_OBJECT_LIGHT); break;
355    }
356}
357
358void CModifyDialog::OnSelendokModdlgList()
359{
360    lcObject* NewObject = (lcObject*)m_ctlCombo.GetItemDataPtr(m_ctlCombo.GetCurSel());
361    if ((NewObject != m_pObject) && (NewObject != (lcObject*)-1))
362        UpdateInfo(NewObject);
363}
364
365void CModifyDialog::OnModdlgApply()
366{
367    if (m_pObject == NULL)
368        return;
369
370    UpdateData(TRUE);
371
372    switch (m_CurrentType)
373    {
374        case LC_OBJECT_PIECE:
375            m_PieceDlg.Apply((lcPiece*)m_pObject);
376            break;
377
378        case LC_OBJECT_CAMERA:
379        case LC_OBJECT_CAMERA_TARGET:
380            m_CameraDlg.Apply((lcCamera*)m_pObject);
381            break;
382
383        case LC_OBJECT_LIGHT:
384        case LC_OBJECT_LIGHT_TARGET:
385            m_LightDlg.Apply((lcLight*)m_pObject);
386            break;
387    }
388}
389
390void CModifyDialog::OnDropdownModdlgList()
391{
392    m_ctlCombo.ResetContent();
393
394    switch (m_CurrentType)
395    {
396        case LC_OBJECT_PIECE:
397        {
398            for (lcObject* pPiece = lcGetActiveProject()->GetActiveModel()->m_Pieces; pPiece; pPiece = pPiece->m_Next)
399            {
400                int i = m_ctlCombo.AddString(pPiece->m_Name);
401                m_ctlCombo.SetItemDataPtr(i, pPiece);
402            }
403
404            if (m_pObject)
405                m_ctlCombo.SelectString(-1, m_pObject->m_Name);
406        } break;
407
408        case LC_OBJECT_CAMERA:
409        case LC_OBJECT_CAMERA_TARGET:
410        {
411            for (lcObject* pCamera = lcGetActiveProject()->GetActiveModel()->m_Cameras; pCamera; pCamera = pCamera->m_Next)
412            {
413                int i = m_ctlCombo.AddString(pCamera->m_Name);
414                m_ctlCombo.SetItemDataPtr(i, pCamera);
415            }
416
417            if (m_pObject)
418                m_ctlCombo.SelectString(-1, m_pObject->m_Name);
419        } break;
420
421        case LC_OBJECT_LIGHT:
422        case LC_OBJECT_LIGHT_TARGET:
423        {
424            for (lcObject* Light = lcGetActiveProject()->GetActiveModel()->m_Lights; Light; Light = Light->m_Next)
425            {
426                int i = m_ctlCombo.AddString(Light->m_Name);
427                m_ctlCombo.SetItemDataPtr(i, Light);
428            }
429
430            if (m_pObject)
431                m_ctlCombo.SelectString(-1, m_pObject->m_Name);
432        } break;
433    }
434}
435
436#include <locale.h>
437static void DDX_Text_Float(CDataExchange* pDX, int nIDC, float& value)
438{
439    pDX->PrepareEditCtrl(nIDC);
440    HWND hWndCtrl;
441    pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
442    TCHAR szBuffer[400];
443    if (pDX->m_bSaveAndValidate)
444    {
445        ::GetWindowText(hWndCtrl, szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0]));
446        double d = 0;
447        if (_stscanf(szBuffer, _T("%lf"), &d) != 1)
448        {
449//          AfxMessageBox(AFX_IDP_PARSE_REAL);
450//          pDX->Fail();            // throws exception
451        }
452        value = (float)d;
453    }
454    else
455    {
456        _stprintf(szBuffer, _T("%.2f"), value);
457        int nNewLen = lstrlen(szBuffer);
458
459        lconv* lc = localeconv();
460
461        // crop zeros
462        TCHAR* dot = strrchr(szBuffer, lc->decimal_point[0]);
463        if (dot)
464        {
465            TCHAR* ch = &szBuffer[nNewLen-1];
466
467            while (ch >= dot)
468            {
469                if (*ch != '0' && *ch != lc->decimal_point[0])
470                    break;
471
472                *ch-- = 0;
473                nNewLen--;
474            }
475        }
476
477        TCHAR szOld[256];
478        // fast check to see if text really changes (reduces flash in controls)
479        if (nNewLen > sizeof(szOld)/sizeof(szOld[0]) ||
480            ::GetWindowText(hWndCtrl, szOld, sizeof(szOld)/sizeof(szOld[0])) != nNewLen ||
481            lstrcmp(szOld, szBuffer) != 0)
482        {
483            // change it
484            ::SetWindowText(hWndCtrl, szBuffer);
485        }
486    }
487}
488
489// CModifyPieceDlg dialog
490IMPLEMENT_DYNAMIC(CModifyPieceDlg, CDialog)
491
492CModifyPieceDlg::CModifyPieceDlg(CWnd* pParent /*=NULL*/)
493    : CDialog(CModifyPieceDlg::IDD, pParent)
494{
495    m_PosX = 0.0f;
496    m_PosY = 0.0f;
497    m_PosZ = 0.0f;
498    m_RotX = 0.0f;
499    m_RotY = 0.0f;
500    m_RotZ = 0.0f;
501    m_Hidden = false;
502    m_From = 0;
503    m_To = 0;
504}
505
506CModifyPieceDlg::~CModifyPieceDlg()
507{
508}
509
510void CModifyPieceDlg::DoDataExchange(CDataExchange* pDX)
511{
512    CDialog::DoDataExchange(pDX);
513
514    //{{AFX_DATA_MAP(CModifyDialog)
515    DDX_Text_Float(pDX, IDC_MODDLG_POSX, m_PosX);
516    DDX_Text_Float(pDX, IDC_MODDLG_POSY, m_PosY);
517    DDX_Text_Float(pDX, IDC_MODDLG_POSZ, m_PosZ);
518    DDX_Text_Float(pDX, IDC_MODDLG_ROTX, m_RotX);
519    DDX_Text_Float(pDX, IDC_MODDLG_ROTY, m_RotY);
520    DDX_Text_Float(pDX, IDC_MODDLG_ROTZ, m_RotZ);
521    DDX_Check(pDX, IDC_MODDLG_HIDDEN, m_Hidden);
522    DDX_Text(pDX, IDC_MODDLG_FROM, m_From);
523    DDX_Text(pDX, IDC_MODDLG_TO, m_To);
524    DDX_Control(pDX, IDC_MODDLG_COLOR, m_Color);
525    //}}AFX_DATA_MAP
526}
527
528
529BEGIN_MESSAGE_MAP(CModifyPieceDlg, CDialog)
530    //{{AFX_MSG_MAP(CModifyPieceDlg)
531    ON_EN_KILLFOCUS(IDC_MODDLG_POSX, OnDataChange)
532    ON_EN_KILLFOCUS(IDC_MODDLG_POSY, OnDataChange)
533    ON_EN_KILLFOCUS(IDC_MODDLG_POSZ, OnDataChange)
534    ON_EN_KILLFOCUS(IDC_MODDLG_ROTX, OnDataChange)
535    ON_EN_KILLFOCUS(IDC_MODDLG_ROTY, OnDataChange)
536    ON_EN_KILLFOCUS(IDC_MODDLG_ROTZ, OnDataChange)
537    ON_EN_KILLFOCUS(IDC_MODDLG_FROM, OnDataChange)
538    ON_EN_KILLFOCUS(IDC_MODDLG_TO, OnDataChange)
539    ON_BN_CLICKED(IDC_MODDLG_HIDDEN, OnDataChange)
540    ON_MESSAGE_VOID(CPN_SELENDOK, OnDataChange)
541    //}}AFX_MSG_MAP
542END_MESSAGE_MAP()
543
544
545// CModifyPieceDlg message handlers
546void CModifyPieceDlg::OnOK()
547{
548    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
549}
550
551void CModifyPieceDlg::OnCancel()
552{
553}
554
555void CModifyPieceDlg::OnDataChange()
556{
557    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
558}
559
560void CModifyPieceDlg::UpdateInfo(lcPiece* piece)
561{
562    if (piece == NULL)
563    {
564        m_PosX = m_PosY = m_PosZ = 0.0f;
565        m_RotX = m_RotY = m_RotZ = 0.0f;
566        m_From = m_To = 0;
567        m_Hidden = false;
568        m_Color.SetColorIndex(0);
569    }
570    else
571    {
572        // Position.
573        Vector3 Pos = piece->m_ParentPosition;
574        lcGetActiveProject()->ConvertToUserUnits(Pos);
575
576        m_PosX = Pos[0];
577        m_PosY = Pos[1];
578        m_PosZ = Pos[2];
579
580        // Rotation.
581        Vector3 Rot = MatrixToEulerAngles(piece->m_ModelWorld) * LC_RTOD;
582
583        m_RotX = Rot[0];
584        m_RotY = Rot[1];
585        m_RotZ = Rot[2];
586
587        // Steps.
588        m_From = piece->m_TimeShow;
589        m_To = piece->m_TimeHide;
590
591        m_Hidden = piece->IsHidden();
592        m_Color.SetColorIndex(piece->m_Color);
593    }
594
595    UpdateData(FALSE);
596}
597
598void CModifyPieceDlg::Apply(lcPiece* piece)
599{
600    UpdateData(TRUE);
601
602    LC_PIECE_MODIFY mod;
603
604    mod.piece = piece;
605    mod.Position = Vector3(m_PosX, m_PosY, m_PosZ);
606    lcGetActiveProject()->ConvertFromUserUnits(mod.Position);
607    mod.Rotation = Vector3(m_RotX, m_RotY, m_RotZ);
608    mod.from = m_From;
609    mod.to = m_To;
610    mod.hidden = (m_Hidden != FALSE);
611    mod.color = m_Color.GetColorIndex();
612    strcpy(mod.name, ((CModifyDialog*)GetParent()->GetParent())->m_strName);
613
614    lcGetActiveProject()->HandleNotify(LC_PIECE_MODIFIED, (unsigned long)&mod);
615}
616
617// CModifyCameraDlg dialog
618IMPLEMENT_DYNAMIC(CModifyCameraDlg, CDialog)
619
620CModifyCameraDlg::CModifyCameraDlg(CWnd* pParent /*=NULL*/)
621    : CDialog(CModifyCameraDlg::IDD, pParent)
622{
623    m_PosX = 0.0f;
624    m_PosY = 0.0f;
625    m_PosZ = 0.0f;
626    m_TargetX = 0.0f;
627    m_TargetY = 0.0f;
628    m_TargetZ = 0.0f;
629    m_Roll = 0.0f;
630    m_FOV = 0.0f;
631    m_Clip = false;
632    m_Near = 0.0f;
633    m_Far = 0.0f;
634    m_Ortho = false;
635    m_Cone = false;
636    m_Hidden = false;
637}
638
639CModifyCameraDlg::~CModifyCameraDlg()
640{
641}
642
643void CModifyCameraDlg::DoDataExchange(CDataExchange* pDX)
644{
645    CDialog::DoDataExchange(pDX);
646
647    //{{AFX_DATA_MAP(CModifyDialog)
648    DDX_Text_Float(pDX, IDC_MODDLG_POSX, m_PosX);
649    DDX_Text_Float(pDX, IDC_MODDLG_POSY, m_PosY);
650    DDX_Text_Float(pDX, IDC_MODDLG_POSZ, m_PosZ);
651    DDX_Text_Float(pDX, IDC_MODDLG_TARGETX, m_TargetX);
652    DDX_Text_Float(pDX, IDC_MODDLG_TARGETY, m_TargetY);
653    DDX_Text_Float(pDX, IDC_MODDLG_TARGETZ, m_TargetZ);
654    DDX_Text_Float(pDX, IDC_MODDLG_ROLL, m_Roll);
655    DDX_Text_Float(pDX, IDC_MODDLG_FOV, m_FOV);
656    DDX_Check(pDX, IDC_MODDLG_CLIP, m_Clip);
657    DDX_Text(pDX, IDC_MODDLG_NEAR, m_Near);
658    DDX_Text(pDX, IDC_MODDLG_FAR, m_Far);
659    DDX_Check(pDX, IDC_MODDLG_ORTHO, m_Ortho);
660    DDX_Check(pDX, IDC_MODDLG_CONE, m_Cone);
661    DDX_Check(pDX, IDC_MODDLG_HIDDEN, m_Hidden);
662    //}}AFX_DATA_MAP
663}
664
665BEGIN_MESSAGE_MAP(CModifyCameraDlg, CDialog)
666    //{{AFX_MSG_MAP(CModifyPieceDlg)
667    ON_EN_KILLFOCUS(IDC_MODDLG_POSX, OnDataChange)
668    ON_EN_KILLFOCUS(IDC_MODDLG_POSY, OnDataChange)
669    ON_EN_KILLFOCUS(IDC_MODDLG_POSZ, OnDataChange)
670    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETX, OnDataChange)
671    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETY, OnDataChange)
672    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETZ, OnDataChange)
673    ON_EN_KILLFOCUS(IDC_MODDLG_ROLL, OnDataChange)
674    ON_EN_KILLFOCUS(IDC_MODDLG_FOV, OnDataChange)
675    ON_BN_CLICKED(IDC_MODDLG_CLIP, OnDataChange)
676    ON_EN_KILLFOCUS(IDC_MODDLG_NEAR, OnDataChange)
677    ON_EN_KILLFOCUS(IDC_MODDLG_FAR, OnDataChange)
678    ON_BN_CLICKED(IDC_MODDLG_ORTHO, OnDataChange)
679    ON_BN_CLICKED(IDC_MODDLG_CONE, OnDataChange)
680    ON_BN_CLICKED(IDC_MODDLG_HIDDEN, OnDataChange)
681    //}}AFX_MSG_MAP
682END_MESSAGE_MAP()
683
684
685// CModifyCameraDlg message handlers
686void CModifyCameraDlg::OnOK()
687{
688    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
689}
690
691void CModifyCameraDlg::OnCancel()
692{
693}
694
695void CModifyCameraDlg::OnDataChange()
696{
697    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
698}
699
700void CModifyCameraDlg::UpdateInfo(lcCamera* camera)
701{
702    if (camera == NULL)
703    {
704        m_PosX = 0.0f;
705        m_PosY = 0.0f;
706        m_PosZ = 0.0f;
707        m_TargetX = 0.0f;
708        m_TargetY = 0.0f;
709        m_TargetZ = 0.0f;
710        m_Roll = 0.0f;
711        m_FOV = 0.0f;
712        m_Near = 0.0f;
713        m_Far = 0.0f;
714        m_Ortho = false;
715        m_Hidden = false;
716    }
717    else
718    {
719        Vector3 tmp;
720
721        tmp = camera->m_ParentPosition;
722        lcGetActiveProject()->ConvertToUserUnits(tmp);
723        m_PosX = tmp[0];
724        m_PosY = tmp[1];
725        m_PosZ = tmp[2];
726
727        // TODO: disable target controls for free cameras.
728        if (camera->m_Children)
729        {
730            tmp = camera->m_Children->m_ParentPosition;
731            lcGetActiveProject()->ConvertToUserUnits(tmp);
732            m_TargetX = tmp[0];
733            m_TargetY = tmp[1];
734            m_TargetZ = tmp[2];
735        }
736        else
737        {
738            m_TargetX = 0.0f;
739            m_TargetY = 0.0f;
740            m_TargetZ = 0.0f;
741        }
742
743        m_Roll = camera->m_Roll * LC_RTOD;
744        m_FOV = camera->m_FOV;
745        m_Clip = camera->IsFlagged(LC_CAMERA_AUTO_CLIP);
746        m_Near = camera->m_NearDist;
747        m_Far = camera->m_FarDist;
748        m_Ortho = camera->IsOrtho();
749        m_Hidden = camera->IsHidden();
750    }
751
752    UpdateData(FALSE);
753}
754
755void CModifyCameraDlg::Apply(lcCamera* camera)
756{
757    UpdateData(TRUE);
758
759    LC_CAMERA_MODIFY mod;
760
761    mod.camera = camera;
762    mod.Eye = Vector3(m_PosX, m_PosY, m_PosZ);
763    lcGetActiveProject()->ConvertFromUserUnits(mod.Eye);
764    mod.Target = Vector3(m_TargetX, m_TargetY, m_TargetZ);
765    lcGetActiveProject()->ConvertFromUserUnits(mod.Target);
766    mod.Roll = m_Roll * LC_DTOR;
767    mod.fovy = m_FOV;
768    mod.znear = m_Near;
769    mod.zfar = m_Far;
770    mod.ortho = (m_Ortho != FALSE);
771    mod.cone = (m_Cone != FALSE);
772    mod.hidden = (m_Hidden != FALSE);
773    mod.clip = (m_Clip != FALSE);
774    strcpy(mod.name, ((CModifyDialog*)GetParent()->GetParent())->m_strName);
775
776    lcGetActiveProject()->HandleNotify(LC_CAMERA_MODIFIED, (unsigned long)&mod);
777}
778
779// CModifyLightDlg dialog
780IMPLEMENT_DYNAMIC(CModifyLightDlg, CDialog)
781
782CModifyLightDlg::CModifyLightDlg(CWnd* pParent /*=NULL*/)
783    : CDialog(CModifyLightDlg::IDD, pParent)
784{
785    m_PosX = 0.0f;
786    m_PosY = 0.0f;
787    m_PosZ = 0.0f;
788    m_TargetX = 0.0f;
789    m_TargetY = 0.0f;
790    m_TargetZ = 0.0f;
791    m_AmbientColor = Vector3(0, 0, 0);
792    m_DiffuseColor = Vector3(0, 0, 0);
793    m_SpecularColor = Vector3(0, 0, 0);
794    m_Constant = 0.0f;
795    m_Linear = 0.0f;
796    m_Quadratic = 0.0f;
797    m_Exponent = 0.0f;
798    m_Cutoff = 0.0f;
799    m_Hidden = false;
800}
801
802CModifyLightDlg::~CModifyLightDlg()
803{
804}
805
806void CModifyLightDlg::DoDataExchange(CDataExchange* pDX)
807{
808    CDialog::DoDataExchange(pDX);
809
810    //{{AFX_DATA_MAP(CModifyDialog)
811    DDX_Text_Float(pDX, IDC_MODDLG_POSX, m_PosX);
812    DDX_Text_Float(pDX, IDC_MODDLG_POSY, m_PosY);
813    DDX_Text_Float(pDX, IDC_MODDLG_POSZ, m_PosZ);
814    DDX_Text_Float(pDX, IDC_MODDLG_TARGETX, m_TargetX);
815    DDX_Text_Float(pDX, IDC_MODDLG_TARGETY, m_TargetY);
816    DDX_Text_Float(pDX, IDC_MODDLG_TARGETZ, m_TargetZ);
817    DDX_Control(pDX, IDC_MODDLG_AMBIENT, m_Ambient);
818    DDX_Control(pDX, IDC_MODDLG_DIFFUSE, m_Diffuse);
819    DDX_Control(pDX, IDC_MODDLG_SPECULAR, m_Specular);
820    DDX_Text_Float(pDX, IDC_MODDLG_CONSTANT, m_Constant);
821    DDX_Text_Float(pDX, IDC_MODDLG_LINEAR, m_Linear);
822    DDX_Text_Float(pDX, IDC_MODDLG_QUADRATIC, m_Quadratic);
823    DDX_Text_Float(pDX, IDC_MODDLG_CUTOFF, m_Cutoff);
824    DDX_Text_Float(pDX, IDC_MODDLG_EXPONENT, m_Exponent);
825    DDX_Check(pDX, IDC_MODDLG_HIDDEN, m_Hidden);
826    //}}AFX_DATA_MAP
827
828    if (!pDX->m_bSaveAndValidate)
829    {
830        COLORREF Ambient = RGB(m_AmbientColor[0]*255, m_AmbientColor[1]*255, m_AmbientColor[2]*255);
831        DeleteObject(m_Ambient.SetBitmap(CreateColorBitmap(20, 10, Ambient)));
832
833        COLORREF Diffuse = RGB(m_DiffuseColor[0]*255, m_DiffuseColor[1]*255, m_DiffuseColor[2]*255);
834        DeleteObject(m_Diffuse.SetBitmap(CreateColorBitmap(20, 10, Diffuse)));
835
836        COLORREF Specular = RGB(m_SpecularColor[0]*255, m_SpecularColor[1]*255, m_SpecularColor[2]*255);
837        DeleteObject(m_Specular.SetBitmap(CreateColorBitmap(20, 10, Specular)));
838    }
839}
840
841
842BEGIN_MESSAGE_MAP(CModifyLightDlg, CDialog)
843    ON_EN_KILLFOCUS(IDC_MODDLG_POSX, OnDataChange)
844    ON_EN_KILLFOCUS(IDC_MODDLG_POSY, OnDataChange)
845    ON_EN_KILLFOCUS(IDC_MODDLG_POSZ, OnDataChange)
846    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETX, OnDataChange)
847    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETY, OnDataChange)
848    ON_EN_KILLFOCUS(IDC_MODDLG_TARGETZ, OnDataChange)
849    ON_BN_CLICKED(IDC_MODDLG_AMBIENT, OnAmbient)
850    ON_BN_CLICKED(IDC_MODDLG_DIFFUSE, OnDiffuse)
851    ON_BN_CLICKED(IDC_MODDLG_SPECULAR, OnSpecular)
852    ON_EN_KILLFOCUS(IDC_MODDLG_CONSTANT, OnDataChange)
853    ON_EN_KILLFOCUS(IDC_MODDLG_LINEAR, OnDataChange)
854    ON_EN_KILLFOCUS(IDC_MODDLG_QUADRATIC, OnDataChange)
855    ON_EN_KILLFOCUS(IDC_MODDLG_CUTOFF, OnDataChange)
856    ON_EN_KILLFOCUS(IDC_MODDLG_EXPONENT, OnDataChange)
857    ON_BN_CLICKED(IDC_MODDLG_HIDDEN, OnDataChange)
858END_MESSAGE_MAP()
859
860
861// CModifyLightDlg message handlers
862void CModifyLightDlg::OnOK()
863{
864    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
865}
866
867void CModifyLightDlg::OnCancel()
868{
869}
870
871void CModifyLightDlg::OnDataChange()
872{
873    ((CModifyDialog*)GetParent()->GetParent())->PostMessage(WM_COMMAND, IDC_MODDLG_APPLY);
874}
875
876void CModifyLightDlg::OnAmbient()
877{
878    COLORREF Color = RGB(m_AmbientColor[0]*255, m_AmbientColor[1]*255, m_AmbientColor[2]*255);
879    CColorDialog dlg(Color);
880    if (dlg.DoModal() == IDOK)
881    {
882        Color = dlg.GetColor();
883        m_AmbientColor = Vector3(GetRValue(Color), GetGValue(Color), GetBValue(Color)) / 255.0f;
884        DeleteObject(m_Ambient.SetBitmap(CreateColorBitmap(20, 10, Color)));
885        OnDataChange();
886    }
887}
888
889void CModifyLightDlg::OnDiffuse()
890{
891    COLORREF Color = RGB(m_DiffuseColor[0]*255, m_DiffuseColor[1]*255, m_DiffuseColor[2]*255);
892    CColorDialog dlg(Color);
893    if (dlg.DoModal() == IDOK)
894    {
895        Color = dlg.GetColor();
896        m_DiffuseColor = Vector3(GetRValue(Color), GetGValue(Color), GetBValue(Color)) / 255.0f;
897        DeleteObject(m_Diffuse.SetBitmap(CreateColorBitmap(20, 10, Color)));
898        OnDataChange();
899    }
900}
901
902void CModifyLightDlg::OnSpecular()
903{
904    COLORREF Color = RGB(m_SpecularColor[0]*255, m_SpecularColor[1]*255, m_SpecularColor[2]*255);
905    CColorDialog dlg(Color);
906    if (dlg.DoModal() == IDOK)
907    {
908        Color = dlg.GetColor();
909        m_SpecularColor = Vector3(GetRValue(Color), GetGValue(Color), GetBValue(Color)) / 255.0f;
910        DeleteObject(m_Specular.SetBitmap(CreateColorBitmap(20, 10, Color)));
911        OnDataChange();
912    }
913}
914
915void CModifyLightDlg::UpdateInfo(lcLight* light)
916{
917    GetDlgItem(IDC_MODDLG_TARGETX)->EnableWindow(TRUE);
918    GetDlgItem(IDC_MODDLG_TARGETY)->EnableWindow(TRUE);
919    GetDlgItem(IDC_MODDLG_TARGETZ)->EnableWindow(TRUE);
920    GetDlgItem(IDC_MODDLG_CONSTANT)->EnableWindow(TRUE);
921    GetDlgItem(IDC_MODDLG_LINEAR)->EnableWindow(TRUE);
922    GetDlgItem(IDC_MODDLG_QUADRATIC)->EnableWindow(TRUE);
923
924    if (light == NULL)
925    {
926        m_PosX = 0.0f;
927        m_PosY = 0.0f;
928        m_PosZ = 0.0f;
929        m_TargetX = 0.0f;
930        m_TargetY = 0.0f;
931        m_TargetZ = 0.0f;
932        m_AmbientColor = Vector3(0, 0, 0);
933        m_DiffuseColor = Vector3(0, 0, 0);
934        m_SpecularColor = Vector3(0, 0, 0);
935        m_Constant = 0.0f;
936        m_Linear = 0.0f;
937        m_Quadratic = 0.0f;
938        m_Exponent = 0.0f;
939        m_Cutoff = 0.0f;
940        m_Hidden = false;
941    }
942    else
943    {
944        Vector3 tmp;
945
946        // TODO: directional lights don't have children either.
947        bool Omni = (light->m_Children == NULL);
948        bool Spot = (light->m_Children != NULL) && (light->m_SpotCutoff != 180.0f);
949
950        tmp = light->m_ParentPosition;
951        lcGetActiveProject()->ConvertToUserUnits(tmp);
952        m_PosX = tmp[0];
953        m_PosY = tmp[1];
954        m_PosZ = tmp[2];
955
956        if (Omni)
957        {
958            m_TargetX = 0.0f;
959            m_TargetY = 0.0f;
960            m_TargetZ = 0.0f;
961            GetDlgItem(IDC_MODDLG_TARGETX)->EnableWindow(FALSE);
962            GetDlgItem(IDC_MODDLG_TARGETY)->EnableWindow(FALSE);
963            GetDlgItem(IDC_MODDLG_TARGETZ)->EnableWindow(FALSE);
964        }
965        else
966        {
967            // TODO: hide target controls
968            if (light->m_Children)
969            {
970                tmp = light->m_Children->m_ParentPosition;
971                lcGetActiveProject()->ConvertToUserUnits(tmp);
972                m_TargetX = tmp[0];
973                m_TargetY = tmp[1];
974                m_TargetZ = tmp[2];
975            }
976            else
977            {
978                m_TargetX = 0.0f;
979                m_TargetY = 0.0f;
980                m_TargetZ = 0.0f;
981            }
982        }
983
984        m_AmbientColor = light->m_AmbientColor;
985        m_DiffuseColor = light->m_DiffuseColor;
986        m_SpecularColor = light->m_SpecularColor;
987
988        if (Omni || Spot)
989        {
990            m_Constant = light->m_ConstantAttenuation;
991            m_Linear = light->m_LinearAttenuation;
992            m_Quadratic = light->m_QuadraticAttenuation;
993        }
994        else
995        {
996            m_Constant = 1.0f;
997            m_Linear = 0.0f;
998            m_Quadratic = 0.0f;
999            GetDlgItem(IDC_MODDLG_CONSTANT)->EnableWindow(FALSE);
1000            GetDlgItem(IDC_MODDLG_LINEAR)->EnableWindow(FALSE);
1001            GetDlgItem(IDC_MODDLG_QUADRATIC)->EnableWindow(FALSE);
1002        }
1003
1004        m_Cutoff = light->m_SpotCutoff;
1005        m_Exponent = light->m_SpotExponent;
1006
1007        m_Hidden = !light->IsHidden();
1008    }
1009
1010    UpdateData(FALSE);
1011}
1012
1013void CModifyLightDlg::Apply(lcLight* light)
1014{
1015    UpdateData(TRUE);
1016
1017    LC_LIGHT_MODIFY mod;
1018
1019    mod.light = light;
1020    mod.Position = Vector3(m_PosX, m_PosY, m_PosZ);
1021    lcGetActiveProject()->ConvertFromUserUnits(mod.Position);
1022    mod.Target = Vector3(m_TargetX, m_TargetY, m_TargetZ);
1023    lcGetActiveProject()->ConvertFromUserUnits(mod.Target);
1024
1025    mod.AmbientColor = m_AmbientColor;
1026    mod.DiffuseColor = m_DiffuseColor;
1027    mod.SpecularColor = m_SpecularColor;
1028    mod.ConstantAttenuation = m_Constant;
1029    mod.LinearAttenuation = m_Linear;
1030    mod.QuadraticAttenuation = m_Quadratic;
1031    mod.SpotCutoff = m_Cutoff;
1032    mod.SpotExponent = m_Exponent;
1033    mod.Hidden = (m_Hidden != FALSE);
1034
1035    strcpy(mod.name, ((CModifyDialog*)GetParent()->GetParent())->m_strName);
1036
1037    lcGetActiveProject()->HandleNotify(LC_LIGHT_MODIFIED, (unsigned long)&mod);
1038}
Note: See TracBrowser for help on using the browser.