Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CSceneEditMode.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Sun Aug 15 01:53:13 2010 UTC (13 years, 9 months ago) by okadu
File MIME type: text/x-c++src
File size: 7988 byte(s)


1 #include "stdafx.h"
2 #include "CSimpleDialog.h"
3 #include "CScene.h"
4 #include "CSaveFile.h"
5 #include "CSurfacePlugin.h"
6 #include "CSkinPlugin.h"
7 #include "CSceneEditMode.h"
8 #include "CConfigMode.h"
9
10 /*
11 * リネーム終了処理
12 */
13 void CSceneListView::EndRename(
14 CListElement *item // アイテム
15 ){
16 CScene *sc = (CScene *)item->GetData();
17 sc->SetName(item->GetString(0));
18 }
19
20 /*
21 * ダブルクリック
22 */
23 void CSceneListView::DoubleClick(){
24 ((CScene *)m_FocusItem->GetData())->Enter(false);
25 g_Skin->MouseUp();
26 CGameMode::SetNeutral();
27 }
28
29 ////////////////////////////////////////////////////////////////////////////////
30 ////////////////////////////////////////////////////////////////////////////////
31
32 /*
33 * コンストラクタ
34 */
35 CSceneEditMode::CSceneEditMode():
36 CModelPluginMode(lang(SurfacePlugin)) // 基本クラス
37 {
38 m_SelectScene = NULL;
39 int ww = TILE_UNIT*16, wh = TILE_UNIT*10;
40 m_MyCamera.Init(2000.0f, 100.0f, 5000.0f, false);
41 m_Camera = &m_MyCamera;
42 if(!g_RSPV) m_AddButton.Init(0, 0, TILE_UNIT*4, TILE_UNIT, lang(Add), &m_InfoWindow);
43 m_InfoWindow.SetSize(m_InfoWindow.GetWidth(), m_InfoWindow.GetHeight());
44 if(!g_RSPV){
45 m_SceneWindow.Init(g_DispWidth-ww-TILE_UNIT*5, g_DispHeight-wh-TILE_UNIT*3,
46 ww, wh, lang(SceneList), &m_Interface, true);
47 m_SceneWindow.SetResize(TILE_UNIT*8, TILE_UNIT*8, g_DispWidth, g_DispHeight, this);
48 char *lvcol[2] = {lang(Name), lang(Surface)};
49 m_SceneListView.Init(TILE_UNIT/2, TILE_QUAD+TILE_UNIT, ww-TILE_UNIT, wh-TILE_UNIT*2,
50 &m_SceneWindow, 2, lvcol, DRAG_INSERT, LISTVIEW_RENAMABLE|LISTVIEW_INSERTABLE, this, CMD_SCENE);
51 }
52 InitSwitchWindow();
53 m_OptionListView.GiveFocus(false);
54 m_PluginMenu = new CPopMenu("", NULL);
55 new CPopMenu(lang(AddScene), m_PluginMenu);
56 m_SceneMenu = new CPopMenu("", NULL);
57 new CPopMenu(lang(SelectScene), m_SceneMenu);
58 new CPopMenu(lang(DeleteScene), m_SceneMenu);
59 new CPopMenu(lang(ChangeName), m_SceneMenu);
60 }
61
62 /*
63 * デストラクタ
64 */
65 CSceneEditMode::~CSceneEditMode(){
66 DELETE_V(m_SceneMenu);
67 }
68
69 /*
70 * ウィンドウリサイズ
71 */
72 void CSceneEditMode::WindowResized(
73 int w, int h, // 新規サイズ
74 CWindowCtrl *wnd // ウィドウコントロール
75 ){
76 if(wnd==&m_SceneWindow){
77 m_SceneListView.SetSize(w-TILE_UNIT, h-TILE_UNIT*2);
78 }else if(wnd==&m_InfoWindow){
79 m_AddButton.SetPos(w-TILE_UNIT*4-TILE_HALF, h+TILE_QUAD);
80 CModelPluginMode::WindowResized(w, h, wnd);
81 }else{
82 CModelPluginMode::WindowResized(w, h, wnd);
83 }
84 }
85
86 /*
87 * メニュー発行
88 */
89 CPopMenu *CSceneEditMode::Dispatch(
90 CMDTYPE type, // コマンドタイプ
91 DWORD data // データ
92 ){
93 switch(type){
94 case CMD_PITVELEM:
95 class CSceneAdder: public CMenuCommand{
96 private:
97 CSurfacePlugin *m_SurfacePlugin; // シーン
98 public:
99 CSceneAdder(CSurfacePlugin *sp){ m_SurfacePlugin = sp; }
100 void Exec(){ g_SceneEditMode->AddScene(m_SurfacePlugin); }
101 };
102 m_PluginMenu->GetMenu(0)->Enable(!g_NetworkInitialized);
103 m_PluginMenu->GetMenu(0)->SetCommand(new CSceneAdder((CSurfacePlugin *)data));
104 return m_PluginMenu;
105 case CMD_PILVELEM: {
106 CListElement *le = (CListElement *)data;
107 CTreeElement *te = (CTreeElement *)le->GetData();
108 CTreeFileElement *fe = te->IsFile();
109 if(fe){
110 m_PluginMenu->GetMenu(0)->SetCommand(
111 new CSceneAdder((CSurfacePlugin *)fe->GetPlugin()));
112 return m_PluginMenu;
113 }
114 break; }
115 case CMD_SCENE: {
116 class CSceneSelector: public CMenuCommand{
117 private:
118 CScene *m_Scene; // シーン
119 public:
120 CSceneSelector(CScene *sc){ m_Scene = sc; }
121 void Exec(){ m_Scene->Enter(false); CGameMode::SetNeutral(); }
122 };
123 class CSceneDeleter: public CMenuCommand{
124 private:
125 bool m_Confirm; // 確認
126 CScene *m_Scene; // シーン
127 public:
128 CSceneDeleter(bool c, CScene *sc){ m_Confirm = c; m_Scene = sc; }
129 void Exec(){
130 if(m_Confirm){
131 g_SceneEditMode->DeleteScene(m_Scene);
132 }else{
133 CYesNoDialog *dlg = new CYesNoDialog(
134 lang(DeleteSceneCfmMessage), m_Scene->GetName(), false);
135 dlg->SetYesCommand(new CSceneDeleter(true, m_Scene));
136 EnqueueCommonDialog(dlg);
137 }
138 }
139 };
140 class CSceneRenamer: public CMenuCommand{
141 private:
142 CScene *m_Scene; // シーン
143 public:
144 CSceneRenamer(CScene *sc){ m_Scene = sc; }
145 void Exec(){ m_Scene->GetListElement()->BeginRename(); }
146 };
147 if(data){
148 m_SceneMenu->GetMenu(0)->Enable(true);
149 m_SceneMenu->GetMenu(0)->SetCommand(new CSceneSelector(
150 (CScene *)((CListElement *)data)->GetData()));
151 m_SceneMenu->GetMenu(1)->Enable(!g_NetworkInitialized);
152 m_SceneMenu->GetMenu(1)->SetCommand(new CSceneDeleter(
153 false, (CScene *)((CListElement *)data)->GetData()));
154 m_SceneMenu->GetMenu(2)->Enable(!g_NetworkInitialized);
155 m_SceneMenu->GetMenu(2)->SetCommand(new CSceneRenamer(
156 (CScene *)((CListElement *)data)->GetData()));
157 }else{
158 m_SceneMenu->GetMenu(0)->Enable(false);
159 m_SceneMenu->GetMenu(1)->Enable(false);
160 m_SceneMenu->GetMenu(2)->Enable(false);
161 }
162 return m_SceneMenu; }
163 }
164 return CPluginMode::Dispatch(type, data);
165 }
166
167 /*
168 * ダブルクリック処理
169 */
170 void CSceneEditMode::DoubleClick(
171 CMDTYPE type, // コマンドタイプ
172 DWORD data // データ
173 ){
174 switch(type){
175 case CMD_PITVELEM:
176 AddScene((CSurfacePlugin *)data);
177 break;
178 }
179 }
180
181 /*
182 * 現在のモデルプラグインを取得
183 */
184 CModelPlugin *CSceneEditMode::GetModelPlugin(){
185 return g_Surface;
186 }
187
188 /*
189 * シーン追加
190 */
191 void CSceneEditMode::AddScene(
192 CSurfacePlugin *spi // 地形プラグイン
193 ){
194 if(g_NetworkInitialized){
195 g_Skin->Error();
196 return;
197 }
198 g_SaveFile->AddScene(spi);
199 g_SaveFile->ListScene(&m_SceneListView);
200 int id = m_SceneListView.GetItemNum()-1;
201 m_SceneListView.SetSelectionMark(id, 0);
202 m_SceneListView.EnsureVisible(id);
203 m_SceneListView.GetFocusItem()->BeginRename();
204 }
205
206 /*
207 * シーン削除
208 */
209 void CSceneEditMode::DeleteScene(
210 CScene *sc // シーン
211 ){
212 if(g_NetworkInitialized){
213 g_Skin->Error();
214 return;
215 }
216 g_SaveFile->DeleteScene(sc);
217 g_SaveFile->ListScene(&m_SceneListView);
218 }
219
220 /*
221 * プラグインリスト取得
222 */
223 CPluginList *CSceneEditMode::GetPluginList(){
224 return g_SurfacePluginList;
225 }
226
227 /*
228 * モードを有効化
229 */
230 void CSceneEditMode::EnterModelPlugin(){
231 ms_ModeLabel = lang(EditScene);
232 m_PluginTree.SelectPlugin(g_Surface = Surface());
233 g_SaveFile->ListScene(&m_SceneListView);
234 m_SceneListView.GiveFocus(false);
235 }
236
237 /*
238 * 入力チェック
239 */
240 CModelInst *CSceneEditMode::ScanInputModelPlugin(){
241 if(g_RSPV) return NULL;
242 if(m_SceneWindow.CheckClose()){
243 SetNeutral();
244 return NULL;
245 }
246 if(m_AddButton.IsPushed()) AddScene(g_Surface);
247 if(m_SceneListView.GetInsertRow()>=0){
248 int move_from = m_SceneListView.GetSelectionMark();
249 int move_to = m_SceneListView.GetInsertRow();
250 if(move_from<0) ErrorDialog("invalid value: move_from");
251 vector<CScene *> scene_list = g_SaveFile->GetSceneByVector();
252 scene_list.insert(scene_list.begin()+move_to, scene_list[move_from]);
253 scene_list.erase(scene_list.begin()+(move_to<=move_from ? move_from+1 : move_from));
254 g_SaveFile->SetSceneByVector(scene_list);
255 g_SaveFile->ListScene(&m_SceneListView);
256 }
257 CListElement *sle = m_SceneListView.GetFocusItem();
258 if(sle && sle->IsSelected()){
259 CScene *sc = (CScene *)sle->GetData();
260 if(sc!=m_SelectScene){
261 m_SelectScene = sc;
262 m_PluginTree.SelectPlugin(m_SelectScene->m_SurfacePlugin);
263 m_SelectScene->m_SurfacePlugin->SetSwitch(m_SelectScene);
264 m_PreviewModel = NULL;
265 return m_SelectScene;
266 }else if(!g_Surface || !CPlugin::IsPreview()
267 || g_Surface->GetLinkInst()!=m_SelectScene){
268 m_SceneListView.SetSelectionMark(-1, 0);
269 }
270 }else if(m_SelectScene){
271 m_SelectScene = NULL;
272 if(g_Surface) g_Surface->FreeInst();
273 }
274 return NULL;
275 }
276
277 /*
278 * レンダリング
279 */
280 void CSceneEditMode::RenderModelPlugin(){
281 if(CPlugin::IsPreview()){
282 CSurfacePlugin::RenderPreview();
283 devSetZRead(FALSE);
284 devSetZWrite(FALSE);
285 RenderCompass();
286 }
287 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26