Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/ogre/Tools/3dsmaxExport/OgreExport/src/OgreMaxExportTabSkeletalAnimation.cpp @ 24

Last change on this file since 24 was 6, checked in by anonymous, 17 years ago

=…

File size: 4.8 KB
Line 
1#include "OgreExport.h"
2#include "resource.h"
3
4static OgreMaxExport_SkeletalAnimation* sInst;
5
6void OgreMaxExport_SkeletalAnimation::onInitDialog(HWND hDlg) {
7        OgreMaxExport_TabPaneHandler::onInitDialog(hDlg);
8
9        // set up animation listbox
10        int frameStart = m_i->GetAnimRange().Start();
11        int frameEnd = m_i->GetAnimRange().End();
12
13        HWND anims = GetDlgItem(m_hDlg, IDC_LIST_ANIMATIONS);
14
15        Rect r;
16        GetWindowRect(anims, &r);
17
18        LVCOLUMN lvc;
19        ZeroMemory(&lvc, sizeof(LVCOLUMN));
20        lvc.mask = LVCF_TEXT | LVCF_WIDTH;
21        lvc.cx = r.w() * 0.6;
22        lvc.pszText = "Animation";
23        ListView_InsertColumn(anims, 0, &lvc);
24        lvc.cx = r.w() * 0.2;
25        lvc.pszText = "Begin";
26        ListView_InsertColumn(anims, 1, &lvc);
27        lvc.pszText = "End";
28        ListView_InsertColumn(anims, 2, &lvc);
29
30        // add a spanning entry to the animation list as a default
31        LVITEM lvi;
32        char buf[32];
33        ZeroMemory(&lvi, sizeof(LVITEM));
34
35        lvi.mask = LVIF_TEXT;
36        lvi.pszText = "Animation";
37        lvi.iItem = 10000;
38        int idx = ListView_InsertItem(anims, &lvi);
39
40        sprintf(buf, "%d", frameStart / GetTicksPerFrame());
41        lvi.iItem = idx;
42        lvi.iSubItem = 1;
43        lvi.pszText = buf;
44        ListView_SetItem(anims, &lvi);
45
46        sprintf(buf, "%d", frameEnd / GetTicksPerFrame());
47        lvi.iSubItem = 2;
48        lvi.pszText = buf;
49        ListView_SetItem(anims, &lvi);
50
51        // populate the frame range info box
52        sprintf(buf, "%d to %d", frameStart / GetTicksPerFrame(), frameEnd / GetTicksPerFrame());
53        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_FRAME_RANGE), WM_SETTEXT, 0, (LPARAM)buf);
54        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_FPS), WM_SETTEXT, 0, (LPARAM)_T("1.0"));
55}
56
57void OgreMaxExport_SkeletalAnimation::onDestroy() {
58        update();
59}
60
61// read the contents from the dialog controls
62void OgreMaxExport_SkeletalAnimation::update() {
63
64}
65
66void OgreMaxExport_SkeletalAnimation::onAddAnimation() {
67        addAnimation();
68}
69
70void OgreMaxExport_SkeletalAnimation::onDeleteAnimation() {
71        deleteAnimation();
72}
73
74void OgreMaxExport_SkeletalAnimation::addAnimation() {
75        char buf[256];
76        int start, end;
77        HWND anims = GetDlgItem(m_hDlg, IDC_LIST_ANIMATIONS);
78
79        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_FPS), WM_GETTEXT, 256, (LPARAM)buf);
80        float fps = atof(buf);
81
82        if (fps <= 0.0) {
83                MessageBox(NULL, "FPS must be >= 0.0", "Invalid Entry", MB_ICONEXCLAMATION);
84                return;
85        }
86
87        int minAnimTime = m_i->GetAnimRange().Start() / GetTicksPerFrame();
88        int maxAnimTime = m_i->GetAnimRange().End() / GetTicksPerFrame();
89
90        // get animation start and end times
91        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_ANIM_START), WM_GETTEXT, 256, (LPARAM)buf);
92        start = atoi(buf);
93
94        if (start < minAnimTime) {
95                sprintf(buf, "Start time must be >= %d", start);
96                MessageBox(NULL, buf, "Invalid Entry", MB_ICONEXCLAMATION);
97                return;
98        }
99
100        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_ANIM_END), WM_GETTEXT, 256, (LPARAM)buf);
101        end = atoi(buf);
102
103        if (end > maxAnimTime) {
104                sprintf(buf, "End time must be <= %d", end);
105                MessageBox(NULL, buf, "Invalid Entry", MB_ICONEXCLAMATION);
106                return;
107        }
108
109        // get animation name
110        SendMessage(GetDlgItem(m_hDlg, IDC_TXT_ANIMATION_NAME), WM_GETTEXT, 256, (LPARAM)buf);
111        std::string name(buf);
112
113        if (name.length() == 0) {
114                MessageBox(NULL, "Animation name must not be empty", "Invalid Entry", MB_ICONEXCLAMATION);
115                return;
116        }
117
118        // if, after all that, we have valid data, stick it in the listview
119        LVITEM lvi;
120        ZeroMemory(&lvi, sizeof(LVITEM));
121
122        lvi.mask = LVIF_TEXT;
123        lvi.pszText = buf;
124        lvi.iItem = 10000;
125        int idx = ListView_InsertItem(anims, &lvi);
126
127        lvi.iItem = idx;
128        lvi.iSubItem = 1;
129        sprintf(buf, "%d", start);
130        lvi.pszText = buf;
131        ListView_SetItem(anims, &lvi);
132        lvi.iSubItem = 2;
133        sprintf(buf, "%d", end);
134        lvi.pszText = buf;
135        ListView_SetItem(anims, &lvi);
136
137        // Finally, clear out the entry controls
138        SetWindowText(GetDlgItem(m_hDlg, IDC_TXT_ANIMATION_NAME), "");
139        SetWindowText(GetDlgItem(m_hDlg, IDC_TXT_ANIM_START), "");
140        SetWindowText(GetDlgItem(m_hDlg, IDC_TXT_ANIM_END), "");
141}
142
143void OgreMaxExport_SkeletalAnimation::deleteAnimation() {
144
145        HWND anims = GetDlgItem(m_hDlg, IDC_LIST_ANIMATIONS);
146
147        // delete selected animation(s) from the listview
148        int idx;
149        while ((idx=ListView_GetNextItem(anims, -1, LVNI_SELECTED)) != -1)
150                ListView_DeleteItem(anims, idx);
151}
152
153// for the sake of sanity, keep the dlgproc and the handler class implementation here in the same source file
154INT_PTR CALLBACK SkeletalAnimationTabDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
155
156        switch(message) {
157        case WM_INITDIALOG:
158                sInst = (OgreMaxExport_SkeletalAnimation*) lParam;
159
160                sInst->onInitDialog(hDlg);
161                SetWindowPos(hDlg, HWND_TOP, 10, 40, 0, 0, SWP_NOSIZE);
162                ShowWindow(hDlg, SW_SHOW);
163                break;
164
165        case WM_COMMAND:
166                switch(LOWORD(wParam)) {
167                case IDC_CMD_DELETE_ANIMATION:
168                        sInst->onDeleteAnimation();
169                        break;
170                case IDC_CMD_ADD_ANIMATION:
171                        sInst->onAddAnimation();
172                        break;
173                }
174                break;
175
176        case WM_NOTIFY:
177                break;
178
179        case WM_DESTROY:
180                sInst->onDestroy();
181                break;
182        }
183        return FALSE;
184}
Note: See TracBrowser for help on using the repository browser.