• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン331 (tree)
日時2007-06-14 20:34:30
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/MapEditorWX/src/MapEditorMainFrame.cpp (revision 330)
+++ marathon/trunk/MapEditorWX/src/MapEditorMainFrame.cpp (revision 331)
@@ -57,6 +57,8 @@
5757 EVT_PAINT(MapEditorMainFrame::OnPaint)
5858 EVT_LEFT_DOWN(MapEditorMainFrame::OnLeftDown)
5959 EVT_RIGHT_DOWN(MapEditorMainFrame::OnRightDown)
60+ EVT_LEFT_UP(MapEditorMainFrame::OnLeftUp)
61+ EVT_RIGHT_UP(MapEditorMainFrame::OnRightUp)
6062 EVT_MOTION(MapEditorMainFrame::OnMotion)
6163 EVT_MOUSEWHEEL(MapEditorMainFrame::OnMouseWheel)
6264 EVT_SIZE(MapEditorMainFrame::OnSize)
--- marathon/trunk/MapEditorWX/src/AnnotationDialog.cpp (revision 330)
+++ marathon/trunk/MapEditorWX/src/AnnotationDialog.cpp (revision 331)
@@ -89,8 +89,10 @@
8989 //OKボタン押した時
9090 void AnnotationDialog::OnOk(wxCommandEvent& wv)
9191 {
92+ Destroy();
9293 }
9394 void AnnotationDialog::OnCancel(wxCommandEvent &ev)
9495 {
96+ Destroy();
9597 }
9698
--- marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 330)
+++ marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 331)
@@ -50,6 +50,7 @@
5050 //TODO
5151 break;
5252 }
53+ Refresh();
5354 }
5455 void MapEditorMainFrame::doLButtonOnDrawMode(wxMouseEvent& ev)
5556 {
@@ -56,29 +57,328 @@
5657 int tool = wxGetApp().getEventManager()->getToolType();
5758 switch(tool){
5859 case ToolType::TI_ARROW:
60+ doLButtonOnArrowTool(ev);
5961 break;
6062 case ToolType::TI_FILL:
63+ doLButtonOnFillTool(ev);
6164 break;
6265 case ToolType::TI_HAND:
66+ doLButtonOnHandTool(ev);
6367 break;
6468 case ToolType::TI_LINE:
69+ doLButtonOnLineTool(ev);
6570 break;
6671 case ToolType::TI_MAGNIFY:
72+ doLButtonOnMagnifyTool(ev);
6773 break;
6874 case ToolType::TI_SKULL:
75+ doLButtonOnSkullTool(ev);
6976 break;
7077 case ToolType::TI_TEXT:
78+ doLButtonOnTextTool(ev);
7179 break;
7280 case ToolType::TI_POLYGON:
81+ doLButtonOnPolygonTool(ev);
7382 break;
7483 default:
7584 hpl::error::halt("Invalid tool type");
7685 }
7786 }
87+
7888 void MapEditorMainFrame::doLButtonOnArrowTool(wxMouseEvent& ev)
7989 {
80- //選択
90+ //選択データ
91+ hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
92+
93+ //グリッドマネージャー
94+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
95+ //ビューオフセット
96+ int voffset[2];
97+ vmgr->getOffset(voffset);
98+ int div = vmgr->getZoomDivision();
99+
100+ int zMin = vmgr->getViewHeightMin();
101+ int zMax = vmgr->getViewHeightMax();
102+ int mx = ev.m_x;
103+ int my = ev.m_y;
104+
105+ if(sel->isSelected()){
106+ //既に選択中
107+
108+ //マウス座標が選択部分に含まれるかチェック
109+ if(hpl::aleph::map::isPointInSelection(mx, my,
110+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD,
111+ POINT_DISTANCE_EPSILON, LINE_DISTANCE_EPSILON, OBJECT_DISTANCE_EPSILON,
112+ sel, zMax, zMin, div))
113+ {
114+ //選択部分をクリックしている
115+ //→オフセットを設定する
116+ //<en> clicked on selection datas
117+ //-> set offsets
118+ this->setupSelectDataGroupOffsets(mx, my);
119+ }else{
120+ //クリックしていない
121+ //→選択解除
122+ //<en> no click on selection datas
123+ //-> release all selections
124+ sel->clear();
125+ }
126+
127+ }else{
128+ //何も選択していない状態
129+ //一つを選択できるか試してみます
130+ if(this->tryToSelectOneItem(ev)){
131+ //選択範囲は解除します
132+ wxGetApp().getEventManager()->setSelectingGroup(false);
133+ }else{
134+ //選択されなかった
135+ //範囲選択の開始
136+ wxGetApp().getEventManager()->setSelectGroupStartPoint(mx, my);
137+ //選択情報の解除
138+ sel->clear();
139+ }
140+ }
81141 }
142+
143+/**
144+ オフセットを設定します
145+ @param mx,my ビュー座標の基点位置
146+*/
147+void MapEditorMainFrame::setupSelectDataGroupOffsets(int mx, int my)
148+{
149+ hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
150+
151+ //点 <en> points
152+ for(int i = 0; i < (int)sel->getSelPoints()->size(); i ++){
153+ endpoint_data* ep = get_endpoint_data(sel->getSelPoints()->at(i).index);
154+ //ビュー座標に変換
155+ int vpoint[2];
156+ wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
157+
158+ //引き算
159+ sel->getSelPoints()->at(i).offset[0] = vpoint[0] - mx;
160+ sel->getSelPoints()->at(i).offset[1] = vpoint[1] - my;
161+ }
162+
163+ //線 <en> lines
164+ for(int i = 0; (int)sel->getSelLines()->size(); i ++){
165+ line_data* line = get_line_data(sel->getSelLines()->at(i).index);
166+ endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
167+ endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
168+ int vpointStart[2];
169+ int vpointEnd[2];
170+ wxGetApp().getViewPointFromWorldPoint(begin->vertex, vpointStart);
171+ wxGetApp().getViewPointFromWorldPoint(end->vertex, vpointEnd);
172+
173+ //オフセット設定
174+ sel->getSelLines()->at(i).offset[0][0] = vpointStart[0] - mx;
175+ sel->getSelLines()->at(i).offset[0][1] = vpointStart[1] - my;
176+ sel->getSelLines()->at(i).offset[1][0] = vpointEnd[0] - mx;
177+ sel->getSelLines()->at(i).offset[1][1] = vpointEnd[1] - my;
178+ }
179+
180+ //ポリゴン
181+ for(int i = 0; (int)sel->getSelPolygons()->size(); i ++){
182+ hpl::aleph::map::SelPolygon* selpoly = &sel->getSelPolygons()->at(i);
183+ polygon_data* poly = get_polygon_data(selpoly->index);
184+ int n = poly->vertex_count;
185+ selpoly->num = n;
186+ for(int j = 0; j < n; j ++){
187+ int vpoint[2];
188+ endpoint_data* ep = get_endpoint_data(poly->endpoint_indexes[j]);
189+ wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
190+
191+ //オフセット
192+ selpoly->offset[j][0] = vpoint[0] - mx;
193+ selpoly->offset[j][1] = vpoint[1] - my;
194+ }
195+ }
196+
197+ //オブジェクト
198+ for(int i = 0; i < (int)sel->getSelObjects()->size(); i ++){
199+ map_object* obj = &SavedObjectList[sel->getSelObjects()->at(i).index];
200+ //ビュー座標に変換
201+ int vpoint[2];
202+ wxGetApp().getViewPointFromWorldPoint(obj->location.x, obj->location.y, vpoint);
203+
204+ //引き算
205+ sel->getSelObjects()->at(i).offset[0] = vpoint[0] - mx;
206+ sel->getSelObjects()->at(i).offset[1] = vpoint[1] - my;
207+ }
208+
209+}
210+
211+/**
212+ @param ev
213+ @return 選択に成功した場合真
214+*/
215+bool MapEditorMainFrame::tryToSelectOneItem(wxMouseEvent& ev)
216+{
217+ //シフトキー
218+ bool shift = ev.ShiftDown();
219+
220+ hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
221+ //イベントマネージャー
222+ hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
223+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
224+
225+ //ビューオフセット
226+ int voffset[2];
227+ vmgr->getOffset(voffset);
228+ int div = vmgr->getZoomDivision();
229+
230+ int zMin = vmgr->getViewHeightMin();
231+ int zMax = vmgr->getViewHeightMax();
232+ int mx = ev.m_x;
233+ int my = ev.m_y;
234+
235+ if(!shift){
236+ //シフトキーを押さずにクリックしたら一旦解放する
237+ sel->clear();
238+ emgr->setSelectingGroup(false);
239+ }
240+
241+ //選択の優先順位は
242+ //1:オブジェクト
243+ //2:点
244+ //3:線
245+ //4:ポリゴン
246+
247+
248+ //オブジェクト
249+ for(int i = 0; i < (int)SavedObjectList.size(); i ++){
250+ map_object* obj = &SavedObjectList[i];
251+ int x = obj->location.x;
252+ int y = obj->location.y;
253+ int z = obj->location.z;
254+
255+ //高さが範囲外かどうか
256+ if(z > zMax || z < zMin){
257+ continue;
258+ }
259+
260+ //点選択検査
261+ if(hpl::aleph::map::isSelectPoint(mx, my,
262+ x, y, voffset[0], voffset[1],
263+ OFFSET_X_WORLD, OFFSET_Y_WORLD, div, OBJECT_DISTANCE_EPSILON))
264+ {
265+ //
266+ int vpoint[2];
267+ wxGetApp().getViewPointFromWorldPoint(x, y, vpoint);
268+ int offset[2];
269+ offset[0] = vpoint[0] - mx;
270+ offset[1] = vpoint[1] - my;
271+ sel->addSelObject(i, offset);
272+ //オブジェクトのプロパティ・ダイアログを表示する
273+ //TODO
274+ //this->objectPropDialog.Show(true);
275+ return true;
276+ }
277+ }
278+
279+ //no obj selected
280+ //TODO 選択ID関連の実装
281+ //this->objectPropDialog->setSelectedObjectIndex(NONE);
282+
283+
284+ //////////
285+ //点
286+ for(int i = 0; i < (int)EndpointList.size(); i ++){
287+ endpoint_data* ep = get_endpoint_data(i);
288+
289+ //高さチェック
290+ int floor = ep->highest_adjacent_floor_height;
291+ int ceiling = ep->lowest_adjacent_ceiling_height;
292+ if(floor > zMax || ceiling < zMin){
293+ continue;
294+ }
295+ if(hpl::aleph::map::isSelectPoint(mx, my,
296+ ep->vertex.x, ep->vertex.y,
297+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD,
298+ div, POINT_DISTANCE_EPSILON))
299+ {
300+ //見つかった
301+ int vpoint[2];
302+ wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
303+ int offset[2];
304+ offset[0] = vpoint[0] - mx;
305+ offset[1] = vpoint[1] - my;
306+ sel->addSelPoint(i, offset);
307+ return true;
308+ }
309+ }
310+
311+ /////////////////////////
312+ //lines
313+ for(int i = 0; i < (int)LineList.size(); i ++){
314+ line_data* line = get_line_data(i);
315+ endpoint_data* start = get_endpoint_data(line->endpoint_indexes[0]);
316+ endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
317+
318+ //高さチェック
319+ int floor = line->highest_adjacent_floor;
320+ int ceiling = line->lowest_adjacent_ceiling;
321+ if(floor > zMax || ceiling < zMin){
322+ continue;
323+ }
324+
325+ if(hpl::aleph::map::isSelectLine(mx, my,
326+ start->vertex.x, start->vertex.y, end->vertex.x, end->vertex.y,
327+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD, div, LINE_DISTANCE_EPSILON))
328+ {
329+ //選択
330+ int vstart[2];
331+ int vend[2];
332+ wxGetApp().getViewPointFromWorldPoint(start->vertex, vstart);
333+ wxGetApp().getViewPointFromWorldPoint(end->vertex, vend);
334+
335+ int offset[2][2];
336+ offset[0][0] = vstart[0] - mx;
337+ offset[0][1] = vstart[1] - my;
338+ offset[1][0] = vend[0] - mx;
339+ offset[1][1] = vend[1] - my;
340+ sel->addSelLine(i, offset);
341+ return true;
342+ }
343+ }
344+
345+ //ポリゴン
346+ //TODO 高さ順にソートする
347+ int polyIndex = NONE;
348+ for(int i = 0; i < (int)PolygonList.size(); i ++){
349+ if(hpl::aleph::map::isPointInPolygon(mx, my,
350+ i, OFFSET_X_WORLD, OFFSET_Y_WORLD, div,
351+ voffset[0], voffset[1]))
352+ {
353+ polyIndex = i;
354+ break;
355+ }
356+ }
357+ if(polyIndex != NONE){
358+ polygon_data* poly = get_polygon_data(polyIndex);
359+ int n = poly->vertex_count;
360+ int offset[MAXIMUM_VERTICES_PER_POLYGON][2];
361+
362+ //ポリゴンプロパティ表示
363+ //TODO
364+
365+ //オフセット
366+ for(int j = 0; j < n; j ++){
367+ int vpoint[2];
368+ wxGetApp().getViewPointFromWorldPoint(get_endpoint_data(poly->endpoint_indexes[j])->vertex, vpoint);
369+ offset[j][0] = vpoint[0] - mx;
370+ offset[j][1] = vpoint[1] - my;
371+ }
372+
373+ sel->addSelPolygon(polyIndex, offset, n);
374+ return true;
375+ }
376+
377+ return false;
378+}
379+
380+
381+/////////////////////////////////////////////////////////////
82382 void MapEditorMainFrame::doLButtonOnFillTool(wxMouseEvent& ev)
83383 {
84384 }
@@ -157,9 +457,26 @@
157457 */
158458 void MapEditorMainFrame::OnRightDown(wxMouseEvent& ev)
159459 {
460+ //カーソル設定
461+ wxGetApp().setCursor();
160462 //マウス座標記録
161463 wxGetApp().getViewGridManager()->setNewMousePoint(ev.m_x, ev.m_y);
162464 }
465+///////////////////////////////////////////////////////
466+void MapEditorMainFrame::OnRightUp(wxMouseEvent& ev)
467+{
468+ //カーソル設定
469+ wxGetApp().setCursor();
470+ //マウス座標記録
471+ wxGetApp().getViewGridManager()->setNewMousePoint(ev.m_x, ev.m_y);
472+}
473+void MapEditorMainFrame::OnLeftUp(wxMouseEvent& ev)
474+{
475+ //カーソル設定
476+ wxGetApp().setCursor();
477+ //マウス座標記録
478+ wxGetApp().getViewGridManager()->setNewMousePoint(ev.m_x, ev.m_y);
479+}
163480
164481 /////////////////////////////////////////////////////
165482 /////////////////////////////////////////////////////
--- marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 330)
+++ marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 331)
@@ -224,6 +224,11 @@
224224 world_point2d getWorldPointFromViewPoint(int vx, int vy);
225225 //
226226 void getViewPointFromWorldPoint(world_point2d& wpoint, int vpoint[2]);
227+ void getViewPointFromWorldPoint(int x, int y, int vpoint[2])
228+ {
229+ world_point2d wpoint = {x,y};
230+ this->getViewPointFromWorldPoint(wpoint, vpoint);
231+ }
227232
228233 /**
229234 ビットマップの読み込み(簡易版)
--- marathon/trunk/MapEditorWX/src/MapEditorMainFrame.h (revision 330)
+++ marathon/trunk/MapEditorWX/src/MapEditorMainFrame.h (revision 331)
@@ -217,7 +217,9 @@
217217 void OnPaint(wxPaintEvent& ev);
218218
219219 void OnLeftDown(wxMouseEvent& ev);
220+ void OnLeftUp(wxMouseEvent& ev);
220221 void OnRightDown(wxMouseEvent& ev);
222+ void OnRightUp(wxMouseEvent& ev);
221223 void OnMotion(wxMouseEvent& ev);
222224 void OnMouseWheel(wxMouseEvent& ev);
223225
@@ -328,4 +330,16 @@
328330 編集モードメニューのチェックを全てはずします
329331 */
330332 void uncheckModesOnMenu();
333+
334+ /**
335+ オフセットを設定します
336+ @param mx,my ビュー座標の基点位置
337+ */
338+ void setupSelectDataGroupOffsets(int mx, int my);
339+
340+ /**
341+ @param ev
342+ @return 選択に成功した場合真
343+ */
344+ bool tryToSelectOneItem(wxMouseEvent& ev);
331345 };
--- marathon/trunk/MapEditorWX/WXTODOリスト.txt (revision 330)
+++ marathon/trunk/MapEditorWX/WXTODOリスト.txt (revision 331)
@@ -7,4 +7,21 @@
77 -AlephOneSrc??DLL??肽???ȁc
88 -XRC???߂????????????B?N???X?̃C???X?^???X???̂܂܍?????Ⴄ???ĉ????悗???????ǂ??g??????΂????񂾂?????
99 -rad1??#define????Ă??B?l?[????
10--rad2?????I
\ No newline at end of file
10+-rad2?????I
11+
12+
13+-?V?K?}?b?v
14+-?ۑ?
15+-?_?C?A???O???
16+--?v???p?e?B
17+--?^?[?~?i??
18+--?e?N?X?`??
19+--?r?W???A??
20+-???j???[?R?}???h
21+-?|???S????????????
22+-?I???E?ړ?
23+-?A?m?e?[?V????/?_/??/?|???S???lj?
24+
25+-?E?N???b?Nor Alt+?N???b?N?Ń??j???[
26+
27+///MAXIMUM_VERTICES_PER_POLYGON=8
\ No newline at end of file
旧リポジトリブラウザで表示