• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン357 (tree)
日時2007-07-01 23:40:42
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/MapEditorWX/src/MapEditorWX.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/MapEditorWX.cpp (revision 357)
@@ -270,6 +270,14 @@
270270 ::wxSetCursor(cursors[0]);
271271 }
272272 }
273+/**
274+ 線編集情報を初期化します
275+*/
276+void MapEditorWX::resetLineEditInfo()
277+{
278+ prevPointIndex = NONE;
279+ isFirstOfLineToAdd = true;
280+}
273281
274282 //char->wx
275283 wxString getString(const char* format, ...)
--- marathon/trunk/MapEditorWX/src/MapEditorMainFrame.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/MapEditorMainFrame.cpp (revision 357)
@@ -62,6 +62,7 @@
6262
6363 EVT_PAINT(MapEditorMainFrame::OnPaint)
6464 EVT_LEFT_DOWN(MapEditorMainFrame::OnLeftDown)
65+ EVT_LEFT_DCLICK(MapEditorMainFrame::OnLeftDoubleClick)
6566 EVT_RIGHT_DOWN(MapEditorMainFrame::OnRightDown)
6667 EVT_LEFT_UP(MapEditorMainFrame::OnLeftUp)
6768 EVT_RIGHT_UP(MapEditorMainFrame::OnRightUp)
--- marathon/trunk/MapEditorWX/src/PolygonPropDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/PolygonPropDialog.cpp (revision 357)
@@ -226,9 +226,9 @@
226226 choice_14->Insert(getString("%d", i), i);
227227 choice_16->Insert(getString("%d", i), i);
228228 }
229- choice_13->Insert(_T("NONE"), LightList.size());
230- choice_14->Insert(_T("NONE"), LightList.size());
231- choice_16->Insert(_T("NONE"), LightList.size());
229+ choice_13->Insert(_T("NONE"), (int)LightList.size());
230+ choice_14->Insert(_T("NONE"), (int)LightList.size());
231+ choice_16->Insert(_T("NONE"), (int)LightList.size());
232232
233233 //first object
234234 choice_19->Clear();
@@ -235,7 +235,7 @@
235235 for(int i = 0; i < (int)SavedObjectList.size(); i ++){
236236 choice_19->Insert(getString("%d", i), i);
237237 }
238- choice_19->Insert(_T("NONE"), LightList.size());
238+ choice_19->Insert(_T("NONE"), (int)LightList.size());
239239
240240 //Media
241241 choice_15->Clear();
@@ -242,7 +242,7 @@
242242 for(int i = 0; i < (int)MediaList.size(); i ++){
243243 choice_15->Insert(getString("%d", i), i);
244244 }
245- choice_15->Insert(_T("NONE"), MediaList.size());
245+ choice_15->Insert(_T("NONE"), (int)MediaList.size());
246246
247247 //TODO snd src
248248 choice_20->Clear();
@@ -254,7 +254,7 @@
254254 for(int i = 0; i < (int)AmbientSoundImageList.size(); i ++){
255255 choice_17->Insert(getString("%d", i), i);
256256 }
257- choice_17->Insert(_T("NONE"), AmbientSoundImageList.size());
257+ choice_17->Insert(_T("NONE"), (int)AmbientSoundImageList.size());
258258 //random sound
259259 choice_18->Clear();
260260 /* for(int i = 0; i < (int).size(); i ++){
@@ -275,7 +275,7 @@
275275 text_ctrl_26->SetValue(getString("%d", poly->permutation));
276276 int index = poly->first_object;
277277 if(index == NONE){
278- index = SavedObjectList.size();
278+ index = (int)SavedObjectList.size();
279279 }
280280 choice_19->SetSelection(index);
281281 text_ctrl_28->SetValue(getString("%d", poly->first_exclusion_zone_index));
@@ -293,12 +293,12 @@
293293 text_ctrl_36->SetValue(getString("%d", poly->ceiling_origin.y));
294294 index = poly->media_index;
295295 if(index == NONE){
296- index = MediaList.size();
296+ index = (int)MediaList.size();
297297 }
298298 choice_15->SetSelection(index);
299299 index = poly->media_lightsource_index;
300300 if(index == NONE){
301- index = LightList.size();
301+ index = (int)LightList.size();
302302 }
303303 choice_16->SetSelection(index);
304304 /* TODO snd src
@@ -309,7 +309,7 @@
309309 choice_20->SetSelection(index);*/
310310 index = poly->ambient_sound_image_index;
311311 if(index == NONE){
312- index = AmbientSoundImageList.size();
312+ index = (int)AmbientSoundImageList.size();
313313 }
314314 choice_17->SetSelection(index);
315315 /*
--- marathon/trunk/MapEditorWX/src/MainFrameDraw.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/MainFrameDraw.cpp (revision 357)
@@ -181,6 +181,7 @@
181181
182182 //TODO 高さ順ソート?
183183 //ソートするならvalidityのように事前にやっておくべき
184+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
184185
185186 wxPoint points[8];
186187 for(int i = 0; i < (int)PolygonList.size(); i ++){
@@ -201,9 +202,8 @@
201202 //TODO 高さを求める方法
202203 int ceilHeight = polygon->ceiling_height;//get_endpoint_data(polygon->endpoint_indexes[0])->lowest_adjacent_ceiling_height;
203204 int floorHeight = polygon->floor_height;//get_endpoint_data(polygon->endpoint_indexes[0])->highest_adjacent_floor_height;
204- if(floorHeight < wxGetApp().getViewGridManager()->getViewHeightMin() ||
205- ceilHeight > wxGetApp().getViewGridManager()->getViewHeightMax()){
206- continue;
205+ if(!vmgr->isValidHeight(floorHeight, ceilHeight)){
206+ continue;
207207 }
208208 int vpoint[2];
209209 for(int j = 0; j < vertexCount; j ++){
@@ -288,6 +288,9 @@
288288 endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
289289 endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
290290
291+ if(wxGetApp().getStockManager()->delLines[i]){
292+ continue;
293+ }
291294 //高さ
292295 int floor = line->highest_adjacent_floor;
293296 int ceiling = line->lowest_adjacent_ceiling;
@@ -357,6 +360,9 @@
357360
358361 //点表示
359362 for(int i = 0; i < (int)EndpointList.size(); i ++){
363+ if(wxGetApp().getStockManager()->delPoints[i]){
364+ continue;
365+ }
360366 endpoint_data* ep = get_endpoint_data(i);
361367 int floor = ep->highest_adjacent_floor_height;
362368 int ceil = ep->lowest_adjacent_ceiling_height;
@@ -392,6 +398,9 @@
392398 int zMax = wxGetApp().getViewGridManager()->getViewHeightMax();
393399
394400 for(int i = 0; i < (int)SavedObjectList.size(); i ++){
401+ if(wxGetApp().getStockManager()->delObjects[i]){
402+ continue;
403+ }
395404 map_object* obj = &(SavedObjectList[i]);
396405
397406 int type = obj->type;
--- marathon/trunk/MapEditorWX/src/SelectLevelDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/SelectLevelDialog.cpp (revision 357)
@@ -6,7 +6,7 @@
66
77 BEGIN_EVENT_TABLE(SelectLevelDialog, wxDialog)
88 EVT_LISTBOX(ID_List, SelectLevelDialog::OnList)
9- EVT_BUTTON(wxID_OK, SelectLevelDialog::OnOk)
9+// EVT_BUTTON(wxID_OK, SelectLevelDialog::OnOk)
1010 EVT_BUTTON(wxID_CANCEL, SelectLevelDialog::OnCancel)
1111 END_EVENT_TABLE()
1212 SelectLevelDialog::SelectLevelDialog()
@@ -21,7 +21,7 @@
2121 label_57 = new wxStaticText(this, wxID_ANY, wxT("Select level"));
2222
2323 list_box_4 = new wxListBox(this, wxID_ANY);
24- button_22 = new wxButton(this, wxID_OK, wxEmptyString);
24+// button_22 = new wxButton(this, wxID_OK, wxEmptyString);
2525 button_23 = new wxButton(this, wxID_CANCEL, wxEmptyString);
2626
2727 list_box_4->SetMinSize(wxSize(320, 320));
@@ -30,7 +30,7 @@
3030 wxFlexGridSizer* grid_sizer_25 = new wxFlexGridSizer(1, 2, 0, 0);
3131 grid_sizer_17->Add(label_57, 0, 0, 0);
3232 grid_sizer_17->Add(list_box_4, 0, wxEXPAND, 0);
33- grid_sizer_25->Add(button_22, 0, wxRIGHT|wxALIGN_RIGHT, 0);
33+// grid_sizer_25->Add(button_22, 0, wxRIGHT|wxALIGN_RIGHT, 0);
3434 grid_sizer_25->Add(button_23, 0, wxRIGHT|wxALIGN_RIGHT, 0);
3535 grid_sizer_17->Add(grid_sizer_25, 1, wxALIGN_RIGHT, 0);
3636 SetSizer(grid_sizer_17);
@@ -41,9 +41,13 @@
4141 }
4242 void SelectLevelDialog::OnList(wxCommandEvent &event)
4343 {
44- event.Skip();
45- std::cout<<"Event handler (SelectLevelDialog::OnList) not implemented yet"<<std::endl; //notify the user that he hasn't implemented the event handler yet
44+ int sel = event.GetSelection();
45+ this->selectLevel = sel;
4646 }
47+int SelectLevelDialog::getSelectLevel()
48+{
49+ return this->selectLevel;
50+}
4751
4852
4953 void SelectLevelDialog::OnOk(wxCommandEvent &event)
@@ -55,6 +59,6 @@
5559
5660 void SelectLevelDialog::OnCancel(wxCommandEvent &event)
5761 {
58- event.Skip();
59- std::cout<<"Event handler (SelectLevelDialog::OnCancel) not implemented yet"<<std::endl; //notify the user that he hasn't implemented the event handler yet
62+ SetReturnCode(wxCANCEL);
63+ Destroy();
6064 }
--- marathon/trunk/MapEditorWX/src/AnnotationDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/AnnotationDialog.cpp (revision 357)
@@ -74,9 +74,9 @@
7474 choice_7->Insert(wxConvertMB2WX(buf), i);
7575 }
7676 //最後にNONE
77- choice_7->Insert(_T("NONE"), PolygonList.size());
77+ choice_7->Insert(_T("NONE"), (int)PolygonList.size());
7878 if(annotation.polygon_index == NONE){
79- choice_7->SetSelection(PolygonList.size());
79+ choice_7->SetSelection((int)PolygonList.size());
8080 }else{
8181 choice_7->SetSelection(annotation.polygon_index);
8282 }
--- marathon/trunk/MapEditorWX/src/ColorCustomizeDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/ColorCustomizeDialog.cpp (revision 357)
@@ -207,7 +207,7 @@
207207
208208 void ColorCustomizeDialog::OnPaint(wxPaintEvent &event)
209209 {
210- wxSize size = GetSize();
210+/* wxSize size = GetSize();
211211 if(!wxWindow::IsExposed(0,0,size.GetWidth(), size.GetHeight())){
212212 return;
213213 }
@@ -217,7 +217,7 @@
217217 this->drawPanel(this->panel_3, ColorType::Lines);
218218 this->drawPanel(this->panel_4, ColorType::Polygons);
219219 this->drawPanel(this->panel_5, ColorType::Strings);
220- this->drawPanel(this->panel_6, ColorType::Points);
220+ this->drawPanel(this->panel_6, ColorType::Points);*/
221221 }
222222 /**
223223 @param type MapEditorOneSetting.hをみよう
@@ -225,12 +225,6 @@
225225 void ColorCustomizeDialog::drawPanel(wxPanel* panel, int type)
226226 {
227227
228- wxPaintDC dc(panel);
229- wxRect rect = panel->GetClientRect();
230- int col[COL_NUM];
231-
232- dc.SetBrush(wxBrush(wxColor(col[0], col[1], col[2])));
233- dc.DrawRectangle(rect);
234228 }
235229 ColorSettings ColorCustomizeDialog::getColor()
236230 {
--- marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 357)
@@ -1,654 +1,7 @@
11 #include "MapEditorMainFrame.h"
22 #include "AnnotationDialog.h"
33
4-////////////////////////////////////////////////////////
5-////////////////////////////////////////////////////////
6-/**
7- 左ボタンを押したときに呼ばれる
8-*/
9-void MapEditorMainFrame::OnLeftDown(wxMouseEvent &ev)
10-{
11- //カーソル設定
12- wxGetApp().setCursor();
13- //マウス座標記録
14- wxGetApp().getViewGridManager()->setNewMousePoint(ev.m_x, ev.m_y);
15- bool shift = ev.ShiftDown();
16- bool ctrl = ev.ControlDown();
174
18-// int toolType = wxGetApp().getEventManager()->getToolType();
19-
20- if(ctrl){
21- Refresh();
22- return;
23- }
24- switch(wxGetApp().getEventManager()->getEditModeType()){
25- case EditModeType::EM_DRAW:
26- doLButtonOnDrawMode(ev);
27- break;
28- case EditModeType::EM_POLYGON_TYPE:
29- doLButtonOnPolygonMode(ev);
30- break;
31- case EditModeType::EM_FLOOR_HEIGHT:
32- doLButtonOnFloorHeightMode(ev);
33- break;
34- case EditModeType::EM_CEILING_HEIGHT:
35- doLButtonOnCeilingHeightMode(ev);
36- break;
37- case EditModeType::EM_FLOOR_LIGHT:
38- doLButtonOnFloorLightMode(ev);
39- break;
40- case EditModeType::EM_CEILING_LIGHT:
41- doLButtonOnCeilingLightMode(ev);
42- break;
43- case EditModeType::EM_MEDIA:
44- doLButtonOnMediaMode(ev);
45- break;
46- case EditModeType::EM_FLOOR_TEXTURE:
47- doLButtonOnFloorTextureMode(ev);
48- break;
49- case EditModeType::EM_CEILING_TEXTURE:
50- doLButtonOnCeilingTextureMode(ev);
51- break;
52- }
53- Refresh();
54-}
55-void MapEditorMainFrame::doLButtonOnDrawMode(wxMouseEvent& ev)
56-{
57- int tool = wxGetApp().getEventManager()->getToolType();
58- switch(tool){
59- case ToolType::TI_ARROW:
60- doLButtonOnArrowTool(ev);
61- break;
62- case ToolType::TI_FILL:
63- doLButtonOnFillTool(ev);
64- break;
65- case ToolType::TI_HAND:
66- doLButtonOnHandTool(ev);
67- break;
68- case ToolType::TI_LINE:
69- doLButtonOnLineTool(ev);
70- break;
71- case ToolType::TI_MAGNIFY:
72- doLButtonOnMagnifyTool(ev);
73- break;
74- case ToolType::TI_SKULL:
75- doLButtonOnSkullTool(ev);
76- break;
77- case ToolType::TI_TEXT:
78- doLButtonOnTextTool(ev);
79- break;
80- case ToolType::TI_POLYGON:
81- doLButtonOnPolygonTool(ev);
82- break;
83- default:
84- hpl::error::halt("Invalid tool type");
85- }
86-}
87-
88-void MapEditorMainFrame::doLButtonOnArrowTool(wxMouseEvent& ev)
89-{
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- return;
120- }else{
121- //クリックしていない
122- //→選択解除
123- //<en> no click on selection datas
124- //-> release all selections
125- sel->clear();
126- }
127- }
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-}
141-
142-/**
143- オフセットを設定します
144- @param mx,my ビュー座標の基点位置
145-*/
146-void MapEditorMainFrame::setupSelectDataGroupOffsets(int mx, int my)
147-{
148- hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
149-
150- //点 <en> points
151- for(int i = 0; i < (int)sel->getSelPoints()->size(); i ++){
152- endpoint_data* ep = get_endpoint_data(sel->getSelPoints()->at(i).index);
153- //ビュー座標に変換
154- int vpoint[2];
155- wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
156-
157- //引き算
158- sel->getSelPoints()->at(i).offset[0] = vpoint[0] - mx;
159- sel->getSelPoints()->at(i).offset[1] = vpoint[1] - my;
160- }
161-
162- //線 <en> lines
163- for(int i = 0; i < (int)sel->getSelLines()->size(); i ++){
164- line_data* line = get_line_data(sel->getSelLines()->at(i).index);
165- endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
166- endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
167- int vpointStart[2];
168- int vpointEnd[2];
169- wxGetApp().getViewPointFromWorldPoint(begin->vertex, vpointStart);
170- wxGetApp().getViewPointFromWorldPoint(end->vertex, vpointEnd);
171-
172- //オフセット設定
173- sel->getSelLines()->at(i).offset[0][0] = vpointStart[0] - mx;
174- sel->getSelLines()->at(i).offset[0][1] = vpointStart[1] - my;
175- sel->getSelLines()->at(i).offset[1][0] = vpointEnd[0] - mx;
176- sel->getSelLines()->at(i).offset[1][1] = vpointEnd[1] - my;
177- }
178-
179- //ポリゴン
180- for(int i = 0; i < (int)sel->getSelPolygons()->size(); i ++){
181- hpl::aleph::map::SelPolygon* selpoly = &sel->getSelPolygons()->at(i);
182- polygon_data* poly = get_polygon_data(selpoly->index);
183- int n = poly->vertex_count;
184- selpoly->num = n;
185- for(int j = 0; j < n; j ++){
186- int vpoint[2];
187- endpoint_data* ep = get_endpoint_data(poly->endpoint_indexes[j]);
188- wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
189-
190- //オフセット
191- selpoly->offset[j][0] = vpoint[0] - mx;
192- selpoly->offset[j][1] = vpoint[1] - my;
193- }
194- }
195-
196- //オブジェクト
197- for(int i = 0; i < (int)sel->getSelObjects()->size(); i ++){
198- map_object* obj = &SavedObjectList[sel->getSelObjects()->at(i).index];
199- //ビュー座標に変換
200- int vpoint[2];
201- wxGetApp().getViewPointFromWorldPoint(obj->location.x, obj->location.y, vpoint);
202-
203- //引き算
204- sel->getSelObjects()->at(i).offset[0] = vpoint[0] - mx;
205- sel->getSelObjects()->at(i).offset[1] = vpoint[1] - my;
206- }
207-
208-}
209-
210-/**
211- @param ev
212- @return 選択に成功した場合真
213-*/
214-bool MapEditorMainFrame::tryToSelectOneItem(wxMouseEvent& ev)
215-{
216- //シフトキー
217- bool shift = ev.ShiftDown();
218-
219- hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
220- //イベントマネージャー
221- hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
222- hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
223-
224- //ビューオフセット
225- int voffset[2];
226- vmgr->getOffset(voffset);
227- int div = vmgr->getZoomDivision();
228-
229- int zMin = vmgr->getViewHeightMin();
230- int zMax = vmgr->getViewHeightMax();
231- int mx = ev.m_x;
232- int my = ev.m_y;
233-
234- if(!shift){
235- //シフトキーを押さずにクリックしたら一旦解放する
236- sel->clear();
237- emgr->setSelectingGroup(false);
238- }
239-
240- //選択の優先順位は
241- //1:オブジェクト
242- //2:点
243- //3:線
244- //4:ポリゴン
245-
246-
247- //オブジェクト
248- for(int i = 0; i < (int)SavedObjectList.size(); i ++){
249- map_object* obj = &SavedObjectList[i];
250- int x = obj->location.x;
251- int y = obj->location.y;
252- int z = obj->location.z;
253-
254- //高さが範囲外かどうか
255- if(z > zMax || z < zMin){
256- continue;
257- }
258-
259- //点選択検査
260- if(hpl::aleph::map::isSelectPoint(mx, my,
261- x, y, voffset[0], voffset[1],
262- OFFSET_X_WORLD, OFFSET_Y_WORLD, div, OBJECT_DISTANCE_EPSILON))
263- {
264- //
265- int vpoint[2];
266- wxGetApp().getViewPointFromWorldPoint(x, y, vpoint);
267- int offset[2];
268- offset[0] = vpoint[0] - mx;
269- offset[1] = vpoint[1] - my;
270- sel->addSelObject(i, offset);
271- //オブジェクトのプロパティ・ダイアログを表示する
272- //TODO
273- this->objPropDialog.setObjIndex(i);
274- this->objPropDialog.Show(true);
275- return true;
276- }
277- }
278-
279- //no obj selected
280- //TODO 選択ID関連の実装
281- this->objPropDialog.setObjIndex(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- this->polyPropDialog.setPolyIndex(polyIndex);
365- this->polyPropDialog.Show(true);
366-
367- //オフセット
368- for(int j = 0; j < n; j ++){
369- int vpoint[2];
370- wxGetApp().getViewPointFromWorldPoint(get_endpoint_data(poly->endpoint_indexes[j])->vertex, vpoint);
371- offset[j][0] = vpoint[0] - mx;
372- offset[j][1] = vpoint[1] - my;
373- }
374-
375- sel->addSelPolygon(polyIndex, offset, n);
376- return true;
377- }
378-
379- return false;
380-}
381-
382-
383-/////////////////////////////////////////////////////////////
384-void MapEditorMainFrame::doLButtonOnFillTool(wxMouseEvent& ev)
385-{
386- //TODO
387- //塗りつぶし可能なポリゴンデータを取得します
388- //hp::aleph::map::getValidPolygons();
389-}
390-void MapEditorMainFrame::doLButtonOnHandTool(wxMouseEvent& ev)
391-{
392- //MouseMotionに丸投げ
393-
394-}
395-void MapEditorMainFrame::doLButtonOnLineTool(wxMouseEvent& ev)
396-{
397- //線追加
398-#ifdef MAP_VIEWER
399-#else
400- //選択解除
401- wxGetApp().selectData.clear();
402-
403- hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
404-
405- int mx = ev.m_x;
406- int my = ev.m_y;
407- //世界座標にする
408- world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(mx, my);
409-
410- bool isFirst = wxGetApp().isFirstOfLineToAdd;
411-
412- hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
413-
414- int voffset[2];
415- vmgr->getOffset(voffset);
416- int div = wxGetApp().getViewGridManager()->getZoomDivision();
417- int zMin = vmgr->getViewHeightMin();
418- int zMax = vmgr->getViewHeightMax();
419-
420- //重なる点があるかどうかチェック
421- int pointIndex = hpl::aleph::map::getSelectPointIndex(wpoint, POINT_DISTANCE_EPSILON, zMin, zMax);
422- //重なる線があるか判定する
423- int lineIndex = hpl::aleph::map::getSelectLineIndex(wpoint, LINE_DISTANCE_EPSILON, zMin, zMax);
424-
425- hpl::aleph::HPLStockManager* smgr = wxGetApp().getStockManager();
426- if(pointIndex != NONE)
427- {
428- //既存の点をクリックしている
429- /*
430- 1:点の上でクリック
431- 1:最初のクリック
432- 前回クリック点の更新
433- 2:二回目以降のクリック
434- 1:既に線が存在している
435- 何もしない
436- 2:線は存在していない
437- 線の追加
438- 前回クリック点の更新
439- */
440- if(isFirst){
441- //最初のクリック
442- //始点とする
443- wxGetApp().prevPointIndex = pointIndex;
444-
445- }else{
446- //2回目以降のクリック
447- //同じ点をクリックしているか?
448- if(wxGetApp().prevPointIndex == pointIndex){
449- //始点とする
450- }else{
451- //既に線が存在しているか?
452- int lineIndex = hpl::aleph::map::getLineIndexFromTwoLPoints(
453- wxGetApp().prevPointIndex, pointIndex);
454- if(lineIndex != NONE){
455- //何もせず現在の点を始点とする
456- wxGetApp().prevPointIndex = pointIndex;
457- }else{
458- //でなけば線を作成する
459- //TODO
460- }
461- }
462- }
463-
464- //中継点・始点・終点にする
465- wxGetApp().isFirstOfLineToAdd = false;
466- }else{
467- //線を踏んでいないかチェックします
468- if(lineIndex != NONE){
469- /*
470- 2:線の上でクリック
471- 1:最初のクリック
472- 1:ポリゴンに所属する線
473- 警告を出して何もしない
474- 2:所属しない線
475- その線を削除
476- 点を追加
477- 線の始点→新点を終点とした新線を追加
478- 新点→線の終点を終点とした新線を追加
479- 前回クリック点の更新
480- 2:二回目以降のクリック
481- 同上
482- */
483- line_data* line = get_line_data(lineIndex);
484- assert(line != NULL);
485-
486- int newPointIndex = NONE;
487- //ポリゴンに所属しているか確かめます
488- if(line->clockwise_polygon_owner != NONE ||
489- line->counterclockwise_polygon_owner != NONE)
490- {
491- //ポリゴンに属する線
492- //警告を出す。線を分断したりしない
493- hpl::error::caution("cannot divide line , because line belongs to polygon (line's index:%d, clockwise polygon's index:%d, counterclockwise polygon's index:%d)",
494- lineIndex, line->clockwise_polygon_owner, line->counterclockwise_polygon_owner);
495- //独立した点を追加する
496- endpoint_data ep;
497- hpl::aleph::map::createPoint(wpoint, &ep, POINT_DISTANCE_EPSILON);
498- newPointIndex = hpl::aleph::map::addEndpoint(ep);
499- assert(newPointIndex != NONE);
500- }else{
501- //始点、終点の情報取得
502- //endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
503- //endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
504-
505- //線を削除
506- smgr->deleteLine(lineIndex);
507- smgr->updateDeletes();
508- //点を追加
509- endpoint_data ep;
510- assert(hpl::aleph::map::createPoint(wpoint, &ep, POINT_DISTANCE_EPSILON));
511- newPointIndex = hpl::aleph::map::addEndpoint(ep);
512- assert(newPointIndex != NONE);
513- endpoint_data *newEp = get_endpoint_data(newPointIndex);
514-
515- //始点→点の線を追加
516- line_data newLine1;
517- assert(hpl::aleph::map::createLine(line->endpoint_indexes[0], line->endpoint_indexes[1], &newLine1));
518- int newLine1Index = hpl::aleph::map::addLine(newLine1);
519- assert(newLine1Index != NONE);
520-
521- //点→終点の線を追加
522- line_data newLine2;
523- hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &newLine2);
524- int newLine2Index = hpl::aleph::map::addLine(newLine2);
525-
526- //前回→今回の点の間に線を追加
527- line_data line;
528- hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &line);
529- int lineIndex = hpl::aleph::map::addLine(line);
530- }
531- }else{
532- //新規追加
533- endpoint_data ep;
534- assert(hpl::aleph::map::createPoint(wpoint, &ep, POINT_DISTANCE_EPSILON));
535- int newPointIndex = hpl::aleph::map::addEndpoint(ep);
536- if(wxGetApp().isFirstOfLineToAdd){
537- //最初の点なので追加しない
538- }else{
539- //線を追加する
540- line_data line;
541- hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &line);
542- int newLineIndex = hpl::aleph::map::addLine(line);
543- }
544-
545- wxGetApp().isFirstOfLineToAdd = false;
546- wxGetApp().prevPointIndex = newPointIndex;
547- }
548- }
549- wxGetApp().isFirstOfLineToAdd = isFirst;
550-
551- //情報を更新する
552- wxGetApp().getStockManager()->updateDeletes();
553-
554-#endif
555-}
556-void MapEditorMainFrame::doLButtonOnMagnifyTool(wxMouseEvent& ev)
557-{
558- bool shift = ev.ShiftDown();
559- wxCommandEvent dummy;
560- if(shift){
561- //縮小
562- this->OnZoomOut(dummy);
563- }else{
564- this->OnZoomIn(dummy);
565- }
566-}
567-void MapEditorMainFrame::doLButtonOnSkullTool(wxMouseEvent& ev)
568-{
569- //オブジェクト配置
570-#ifdef MAP_VIEWER
571-#else
572- int mx = ev.m_x;
573- int my = ev.m_y;
574- world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(mx, my);
575- //点の中に入るポリゴンを取得します
576- //std::vector<int> polyIndexes = hpl::aleph::map::getPolygonIndexesIncludePoint(wpoint);
577- //TODO
578-#endif
579-}
580-void MapEditorMainFrame::doLButtonOnTextTool(wxMouseEvent& ev)
581-{
582-#ifdef MAP_VIEWER
583-#else
584- //アノテーション追加
585- //ダイアログ準備
586- AnnotationDialog dlg;
587- map_annotation sample;
588- //初期化
589- memset(&sample, 0, SIZEOF_map_annotation);
590-
591- //マウス座標の位置に追加する
592- int viewX = ev.m_x;
593- int viewY = ev.m_y;
594- world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(viewX, viewY);
595- sample.location.x = wpoint.x;
596- sample.location.y = wpoint.y;
597- sample.polygon_index = NONE;
598-
599- //ダイアログ表示
600- dlg.Create(this, ID_ANNOTATION_DIALOG, sample);
601- if(dlg.ShowModal() == wxID_OK){
602- //決定
603- //アノテーションデータを取得
604- map_annotation newAnnotation = dlg.getAnnotation();
605- //追加
606- hpl::aleph::map::addAnnotation(newAnnotation);
607- }
608- //情報を更新する
609- wxGetApp().getStockManager()->updateDeletes();
610-
611-#endif
612-}
613-void MapEditorMainFrame::doLButtonOnPolygonTool(wxMouseEvent& ev)
614-{
615-#ifdef MAP_VIEWER
616-#else
617- //範囲選択開始
618- //TODO
619- wxGetApp().getEventManager()->setSelectingGroup(true);
620- wxGetApp().getEventManager()->setSelectGroupStartPoint(ev.m_x, ev.m_y);
621-#endif
622-}
623-
624-void MapEditorMainFrame::doLButtonOnPolygonMode(wxMouseEvent& ev)
625-{
626-#ifdef MAP_VIEWER
627-#else
628-#endif
629-}
630-void MapEditorMainFrame::doLButtonOnFloorHeightMode(wxMouseEvent& ev)
631-{
632-}
633-void MapEditorMainFrame::doLButtonOnCeilingHeightMode(wxMouseEvent& ev)
634-{
635-}
636-void MapEditorMainFrame::doLButtonOnFloorLightMode(wxMouseEvent& ev)
637-{
638-}
639-void MapEditorMainFrame::doLButtonOnCeilingLightMode(wxMouseEvent& ev)
640-{
641-}
642-void MapEditorMainFrame::doLButtonOnMediaMode(wxMouseEvent& ev)
643-{
644-}
645-void MapEditorMainFrame::doLButtonOnFloorTextureMode(wxMouseEvent& ev)
646-{
647-}
648-void MapEditorMainFrame::doLButtonOnCeilingTextureMode(wxMouseEvent& ev)
649-{
650-}
651-
6525 ////////////////////////////////////////////////////////
6536 ////////////////////////////////////////////////////////
6547 /**
@@ -677,7 +30,8 @@
67730 int toolType = emgr->getToolType();
67831 if(editMode == EditModeType::EM_DRAW && toolType == ToolType::TI_ARROW){
67932 //点の上で右クリックしたか?
680- int epIndex = hpl::aleph::map::getSelectPointIndex(wmp, POINT_DISTANCE_EPSILON * div, zMin, zMax);
33+ int epIndex = hpl::aleph::map::getSelectPointIndex(wmp,
34+ POINT_DISTANCE_EPSILON, zMin, zMax, div, wxGetApp().getStockManager());
68135 wxGetApp().popupEndpointIndex = epIndex;
68236 if(epIndex != NONE){
68337 //点ポップアップ表示
@@ -684,7 +38,8 @@
68438 PopupMenu(&wxGetApp().pointPopupMenu);
68539 }else{
68640 //点は押されなかった
687- int lineIndex = hpl::aleph::map::getSelectLineIndex(wmp, LINE_DISTANCE_EPSILON * div, zMin, zMax);
41+ int lineIndex = hpl::aleph::map::getSelectLineIndex(
42+ wmp, LINE_DISTANCE_EPSILON, zMin, zMax, div, wxGetApp().getStockManager());
68843 wxGetApp().popupLineIndex = lineIndex;
68944 if(lineIndex != NONE){
69045 //線が押された
@@ -1120,7 +475,8 @@
1120475 int div = vmgr->getZoomDivision();
1121476
1122477 //点を踏んでいないか確認
1123- int endpointIndex = hpl::aleph::map::getSelectPointIndex(wmp, POINT_DISTANCE_EPSILON * div, zMin, zMax);
478+ int endpointIndex = hpl::aleph::map::getSelectPointIndex(wmp,
479+ POINT_DISTANCE_EPSILON , zMin, zMax, div, wxGetApp().getStockManager());
1124480 if(endpointIndex != NONE){
1125481 wxGetApp().isNowOnThePoint = true;
1126482 wxGetApp().isNowOnTheLine = false;
@@ -1127,7 +483,8 @@
1127483 }else{
1128484 wxGetApp().isNowOnThePoint = false;
1129485
1130- int lineIndex = hpl::aleph::map::getSelectLineIndex(wmp, POINT_DISTANCE_EPSILON * div, zMin, zMax);
486+ int lineIndex = hpl::aleph::map::getSelectLineIndex(wmp,
487+ LINE_DISTANCE_EPSILON, zMin, zMax, div, wxGetApp().getStockManager());
1131488 if(lineIndex != NONE){
1132489 wxGetApp().isNowOnTheLine = true;
1133490 }else{
@@ -1211,3 +568,28 @@
1211568 voffset[1] += deltaY;
1212569 mgr->setOffset(voffset[0], voffset[1]);
1213570 }
571+/////////////////////////////////////////////////
572+/////////////////////////////////////////////////
573+// 左ダブルクリック <en> Mouse Left Button Double Click
574+void MapEditorMainFrame::OnLeftDoubleClick(wxMouseEvent& ev)
575+{
576+ //カーソル設定
577+ wxGetApp().setCursor();
578+
579+ hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
580+ int editMode = emgr->getEditModeType();
581+ int toolType = emgr->getToolType();
582+ if(editMode == EditModeType::EM_DRAW &&
583+ toolType == ToolType::TI_LINE)
584+ {
585+ //線モードでダブルクリック
586+
587+ //線の追加
588+ this->doLButtonOnLineTool(ev);
589+
590+ //線編集情報の初期化
591+ wxGetApp().resetLineEditInfo();
592+ }
593+
594+ Refresh();
595+}
--- marathon/trunk/MapEditorWX/src/MainFrameLeftDown.cpp (nonexistent)
+++ marathon/trunk/MapEditorWX/src/MainFrameLeftDown.cpp (revision 357)
@@ -0,0 +1,626 @@
1+#include "MapEditorMainFrame.h"
2+#include "AnnotationDialog.h"
3+
4+////////////////////////////////////////////////////////
5+////////////////////////////////////////////////////////
6+/**
7+ 左ボタンを押したときに呼ばれる
8+*/
9+void MapEditorMainFrame::OnLeftDown(wxMouseEvent &ev)
10+{
11+ //カーソル設定
12+ wxGetApp().setCursor();
13+ //マウス座標記録
14+ wxGetApp().getViewGridManager()->setNewMousePoint(ev.m_x, ev.m_y);
15+ bool shift = ev.ShiftDown();
16+ bool ctrl = ev.ControlDown();
17+
18+// int toolType = wxGetApp().getEventManager()->getToolType();
19+
20+ if(ctrl){
21+ Refresh();
22+ return;
23+ }
24+ switch(wxGetApp().getEventManager()->getEditModeType()){
25+ case EditModeType::EM_DRAW:
26+ doLButtonOnDrawMode(ev);
27+ break;
28+ case EditModeType::EM_POLYGON_TYPE:
29+ doLButtonOnPolygonMode(ev);
30+ break;
31+ case EditModeType::EM_FLOOR_HEIGHT:
32+ doLButtonOnFloorHeightMode(ev);
33+ break;
34+ case EditModeType::EM_CEILING_HEIGHT:
35+ doLButtonOnCeilingHeightMode(ev);
36+ break;
37+ case EditModeType::EM_FLOOR_LIGHT:
38+ doLButtonOnFloorLightMode(ev);
39+ break;
40+ case EditModeType::EM_CEILING_LIGHT:
41+ doLButtonOnCeilingLightMode(ev);
42+ break;
43+ case EditModeType::EM_MEDIA:
44+ doLButtonOnMediaMode(ev);
45+ break;
46+ case EditModeType::EM_FLOOR_TEXTURE:
47+ doLButtonOnFloorTextureMode(ev);
48+ break;
49+ case EditModeType::EM_CEILING_TEXTURE:
50+ doLButtonOnCeilingTextureMode(ev);
51+ break;
52+ }
53+ Refresh();
54+}
55+void MapEditorMainFrame::doLButtonOnDrawMode(wxMouseEvent& ev)
56+{
57+ int tool = wxGetApp().getEventManager()->getToolType();
58+ switch(tool){
59+ case ToolType::TI_ARROW:
60+ doLButtonOnArrowTool(ev);
61+ break;
62+ case ToolType::TI_FILL:
63+ doLButtonOnFillTool(ev);
64+ break;
65+ case ToolType::TI_HAND:
66+ doLButtonOnHandTool(ev);
67+ break;
68+ case ToolType::TI_LINE:
69+ doLButtonOnLineTool(ev);
70+ break;
71+ case ToolType::TI_MAGNIFY:
72+ doLButtonOnMagnifyTool(ev);
73+ break;
74+ case ToolType::TI_SKULL:
75+ doLButtonOnSkullTool(ev);
76+ break;
77+ case ToolType::TI_TEXT:
78+ doLButtonOnTextTool(ev);
79+ break;
80+ case ToolType::TI_POLYGON:
81+ doLButtonOnPolygonTool(ev);
82+ break;
83+ default:
84+ hpl::error::halt("Invalid tool type");
85+ }
86+}
87+
88+void MapEditorMainFrame::doLButtonOnArrowTool(wxMouseEvent& ev)
89+{
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+ hpl::aleph::map::setupSelectDataGroupOffsets(mx, my,
119+ &wxGetApp().selectData, voffset[0], voffset[1],
120+ OFFSET_X_WORLD, OFFSET_Y_WORLD, div);
121+ return;
122+ }else{
123+ //クリックしていない
124+ //→選択解除
125+ //<en> no click on selection datas
126+ //-> release all selections
127+ sel->clear();
128+ }
129+ }
130+ //何も選択していない状態
131+ //一つを選択できるか試してみます
132+ if(this->tryToSelectOneItem(ev)){
133+ //選択範囲は解除します
134+ wxGetApp().getEventManager()->setSelectingGroup(false);
135+ }else{
136+ //選択されなかった
137+ //範囲選択の開始
138+ wxGetApp().getEventManager()->setSelectGroupStartPoint(mx, my);
139+ //選択情報の解除
140+ sel->clear();
141+ }
142+}
143+
144+
145+/**
146+ @param ev
147+ @return 選択に成功した場合真
148+*/
149+bool MapEditorMainFrame::tryToSelectOneItem(wxMouseEvent& ev)
150+{
151+ //シフトキー
152+ bool shift = ev.ShiftDown();
153+
154+ hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
155+ //イベントマネージャー
156+ hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
157+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
158+
159+ //ビューオフセット
160+ int voffset[2];
161+ vmgr->getOffset(voffset);
162+ int div = vmgr->getZoomDivision();
163+
164+ int zMin = vmgr->getViewHeightMin();
165+ int zMax = vmgr->getViewHeightMax();
166+ int mx = ev.m_x;
167+ int my = ev.m_y;
168+
169+ if(!shift){
170+ //シフトキーを押さずにクリックしたら一旦解放する
171+ sel->clear();
172+ emgr->setSelectingGroup(false);
173+ }
174+
175+ //選択の優先順位は
176+ //1:オブジェクト
177+ //2:点
178+ //3:線
179+ //4:ポリゴン
180+
181+
182+ //オブジェクト
183+ for(int i = 0; i < (int)SavedObjectList.size(); i ++){
184+ if(wxGetApp().getStockManager()->delObjects[i]){
185+ continue;
186+ }
187+ map_object* obj = &SavedObjectList[i];
188+ int x = obj->location.x;
189+ int y = obj->location.y;
190+ int z = obj->location.z;
191+
192+ //高さが範囲外かどうか
193+ if(z > zMax || z < zMin){
194+ continue;
195+ }
196+
197+ //点選択検査
198+ if(hpl::aleph::map::isSelectPoint(mx, my,
199+ x, y, voffset[0], voffset[1],
200+ OFFSET_X_WORLD, OFFSET_Y_WORLD, div, OBJECT_DISTANCE_EPSILON))
201+ {
202+ //
203+ int vpoint[2];
204+ wxGetApp().getViewPointFromWorldPoint(x, y, vpoint);
205+ int offset[2];
206+ offset[0] = vpoint[0] - mx;
207+ offset[1] = vpoint[1] - my;
208+ sel->addSelObject(i, offset);
209+ //オブジェクトのプロパティ・ダイアログを表示する
210+ //TODO
211+ this->objPropDialog.setObjIndex(i);
212+ this->objPropDialog.Show(true);
213+ return true;
214+ }
215+ }
216+
217+ //no obj selected
218+ //TODO 選択ID関連の実装
219+ this->objPropDialog.setObjIndex(NONE);
220+
221+
222+ //////////
223+ //点
224+ for(int i = 0; i < (int)EndpointList.size(); i ++){
225+ if(wxGetApp().getStockManager()->delPoints[i]){
226+ continue;
227+ }
228+ endpoint_data* ep = get_endpoint_data(i);
229+
230+ //高さチェック
231+ int floor = ep->highest_adjacent_floor_height;
232+ int ceiling = ep->lowest_adjacent_ceiling_height;
233+ if(floor > zMax || ceiling < zMin){
234+ continue;
235+ }
236+ if(hpl::aleph::map::isSelectPoint(mx, my,
237+ ep->vertex.x, ep->vertex.y,
238+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD,
239+ div, POINT_DISTANCE_EPSILON))
240+ {
241+ //見つかった
242+ int vpoint[2];
243+ wxGetApp().getViewPointFromWorldPoint(ep->vertex, vpoint);
244+ int offset[2];
245+ offset[0] = vpoint[0] - mx;
246+ offset[1] = vpoint[1] - my;
247+ sel->addSelPoint(i, offset);
248+ return true;
249+ }
250+ }
251+
252+ /////////////////////////
253+ //lines
254+ for(int i = 0; i < (int)LineList.size(); i ++){
255+ if(wxGetApp().getStockManager()->delLines[i]){
256+ continue;
257+ }
258+ line_data* line = get_line_data(i);
259+ endpoint_data* start = get_endpoint_data(line->endpoint_indexes[0]);
260+ endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
261+
262+ //高さチェック
263+ int floor = line->highest_adjacent_floor;
264+ int ceiling = line->lowest_adjacent_ceiling;
265+ if(floor > zMax || ceiling < zMin){
266+ continue;
267+ }
268+
269+ if(hpl::aleph::map::isSelectLine(mx, my,
270+ start->vertex.x, start->vertex.y, end->vertex.x, end->vertex.y,
271+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD, div, LINE_DISTANCE_EPSILON))
272+ {
273+ //選択
274+ int vstart[2];
275+ int vend[2];
276+ wxGetApp().getViewPointFromWorldPoint(start->vertex, vstart);
277+ wxGetApp().getViewPointFromWorldPoint(end->vertex, vend);
278+
279+ int offset[2][2];
280+ offset[0][0] = vstart[0] - mx;
281+ offset[0][1] = vstart[1] - my;
282+ offset[1][0] = vend[0] - mx;
283+ offset[1][1] = vend[1] - my;
284+ sel->addSelLine(i, offset);
285+ return true;
286+ }
287+ }
288+
289+ //ポリゴン
290+ //TODO 高さ順にソートする
291+ int polyIndex = NONE;
292+ for(int i = 0; i < (int)PolygonList.size(); i ++){
293+ if(wxGetApp().getStockManager()->delPolygons[i]){
294+ continue;
295+ }
296+ if(hpl::aleph::map::isPointInPolygon(mx, my,
297+ i, OFFSET_X_WORLD, OFFSET_Y_WORLD, div,
298+ voffset[0], voffset[1]))
299+ {
300+ polyIndex = i;
301+ break;
302+ }
303+ }
304+ if(polyIndex != NONE){
305+ polygon_data* poly = get_polygon_data(polyIndex);
306+ int n = poly->vertex_count;
307+ int offset[MAXIMUM_VERTICES_PER_POLYGON][2];
308+
309+ //ポリゴンプロパティ表示
310+ //TODO
311+ this->polyPropDialog.setPolyIndex(polyIndex);
312+ this->polyPropDialog.Show(true);
313+
314+ //オフセット
315+ for(int j = 0; j < n; j ++){
316+ int vpoint[2];
317+ wxGetApp().getViewPointFromWorldPoint(get_endpoint_data(poly->endpoint_indexes[j])->vertex, vpoint);
318+ offset[j][0] = vpoint[0] - mx;
319+ offset[j][1] = vpoint[1] - my;
320+ }
321+
322+ sel->addSelPolygon(polyIndex, offset, n);
323+ return true;
324+ }
325+
326+ return false;
327+}
328+
329+
330+/////////////////////////////////////////////////////////////
331+void MapEditorMainFrame::doLButtonOnFillTool(wxMouseEvent& ev)
332+{
333+ hpl::aleph::HPLStockManager* smgr = wxGetApp().getStockManager();
334+
335+ int mx = ev.m_x;
336+ int my = ev.m_y;
337+ world_point2d wmp = wxGetApp().getWorldPointFromViewPoint(mx, my);
338+
339+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
340+ int zMin = vmgr->getViewHeightMin();
341+ int zMax = vmgr->getViewHeightMax();
342+ //TODO
343+ //塗りつぶし可能なポリゴンデータを取得します
344+ std::vector<polygon_data> polyDatas = hpl::aleph::map::searchValidPolygon(
345+ wmp, smgr, zMin, zMax);
346+ if(polyDatas.size() == 0){
347+ //失敗
348+ hpl::error::caution("No frame to fill as a polygon found");
349+ }else{
350+ //追加
351+ hpl::aleph::map::addPolygon(polyDatas[0]);
352+ }
353+}
354+void MapEditorMainFrame::doLButtonOnHandTool(wxMouseEvent& ev)
355+{
356+ //MouseMotionに丸投げ
357+
358+}
359+void MapEditorMainFrame::doLButtonOnLineTool(wxMouseEvent& ev)
360+{
361+ //線追加
362+#ifdef MAP_VIEWER
363+#else
364+ //選択解除
365+ wxGetApp().selectData.clear();
366+
367+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
368+
369+ int mx = ev.m_x;
370+ int my = ev.m_y;
371+ //世界座標にする
372+ world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(mx, my);
373+
374+ bool isFirst = wxGetApp().isFirstOfLineToAdd;
375+
376+ hpl::aleph::HPLEventManager* emgr = wxGetApp().getEventManager();
377+
378+ int voffset[2];
379+ vmgr->getOffset(voffset);
380+ int div = wxGetApp().getViewGridManager()->getZoomDivision();
381+ int zMin = vmgr->getViewHeightMin();
382+ int zMax = vmgr->getViewHeightMax();
383+
384+ hpl::aleph::HPLStockManager* smgr = wxGetApp().getStockManager();
385+
386+ //重なる点があるかどうかチェック
387+ int pointIndex = hpl::aleph::map::getSelectPointIndex(
388+ wpoint, POINT_DISTANCE_EPSILON, zMin, zMax, div, smgr);
389+ //重なる線があるか判定する
390+ int lineIndex = hpl::aleph::map::getSelectLineIndex(
391+ wpoint, LINE_DISTANCE_EPSILON, zMin, zMax, div, smgr);
392+
393+ if(pointIndex != NONE)
394+ {
395+ //既存の点をクリックしている
396+ /*
397+ 1:点の上でクリック
398+ 1:最初のクリック
399+ 前回クリック点の更新
400+ 2:二回目以降のクリック
401+ 1:既に線が存在している
402+ 何もしない
403+ 2:線は存在していない
404+ 線の追加
405+ 前回クリック点の更新
406+ */
407+ if(wxGetApp().isFirstOfLineToAdd){
408+ //最初のクリック
409+ //始点とする
410+ wxGetApp().prevPointIndex = pointIndex;
411+
412+ }else{
413+ //2回目以降のクリック
414+ //同じ点をクリックしているか?
415+ if(wxGetApp().prevPointIndex == pointIndex){
416+ //始点とする
417+ }else{
418+ //既に線が存在しているか?
419+ int lineIndex = hpl::aleph::map::getLineIndexFromTwoLPoints(
420+ wxGetApp().prevPointIndex, pointIndex);
421+ if(lineIndex != NONE){
422+ //既に線が存在している
423+ //何もしない
424+ }else{
425+ //でなけば線を作成する
426+ line_data line;
427+ assert(hpl::aleph::map::createLine(wxGetApp().prevPointIndex,
428+ pointIndex, &line));
429+ int newLineIndex = hpl::aleph::map::addLine(line);
430+ }
431+ wxGetApp().prevPointIndex = pointIndex;
432+ }
433+ }
434+
435+ //最初のクリックではなくなった
436+ wxGetApp().isFirstOfLineToAdd = false;
437+ }else{
438+ //線を踏んでいないかチェックします
439+ if(lineIndex != NONE){
440+ /*
441+ 2:線の上でクリック
442+ 1:最初のクリック
443+ 1:ポリゴンに所属する線
444+ 警告を出して何もしない
445+ 2:所属しない線
446+ その線を削除
447+ 点を追加
448+ 線の始点→新点を終点とした新線を追加
449+ 新点→線の終点を終点とした新線を追加
450+ 前回クリック点の更新
451+ 2:二回目以降のクリック
452+ 同上
453+ */
454+ line_data* line = get_line_data(lineIndex);
455+ assert(line != NULL);
456+
457+ //ポリゴンに所属しているか確かめます
458+ if(line->clockwise_polygon_owner != NONE ||
459+ line->counterclockwise_polygon_owner != NONE)
460+ {
461+ //ポリゴンに属する線
462+ //警告を出す。線を分断したりしない
463+ hpl::error::caution("cannot divide line , because line belongs to polygon (line's index:%d, clockwise polygon's index:%d, counterclockwise polygon's index:%d)",
464+ lineIndex, line->clockwise_polygon_owner, line->counterclockwise_polygon_owner);
465+ //独立した点を追加する
466+ endpoint_data ep;
467+ hpl::aleph::map::createPoint(wpoint, &ep);
468+ int newPointIndex = hpl::aleph::map::addEndpoint(ep);
469+ assert(newPointIndex != NONE);
470+ }else{
471+ //始点、終点の情報取得
472+ //endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
473+ //endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
474+ int epStartIndex = line->endpoint_indexes[0];
475+ int epEndIndex = line->endpoint_indexes[1];
476+
477+ //線を削除
478+ smgr->deleteLine(lineIndex);
479+ smgr->updateDeletes();
480+
481+ //点を追加
482+ endpoint_data ep;
483+ assert(hpl::aleph::map::createPoint(wpoint, &ep));
484+ int newPointIndex = hpl::aleph::map::addEndpoint(ep);
485+ assert(newPointIndex != NONE);
486+ endpoint_data *newEp = get_endpoint_data(newPointIndex);
487+
488+ //始点→点の線を追加
489+ line_data newLine1;
490+ assert(hpl::aleph::map::createLine(epStartIndex,
491+ newPointIndex, &newLine1));
492+ int newLine1Index = hpl::aleph::map::addLine(newLine1);
493+ assert(newLine1Index != NONE);
494+
495+ //点→終点の線を追加
496+ line_data newLine2;
497+ hpl::aleph::map::createLine(newPointIndex, epEndIndex,
498+ &newLine2);
499+ int newLine2Index = hpl::aleph::map::addLine(newLine2);
500+
501+ //前回→今回の点の間に線を追加
502+ line_data newLine;
503+ hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &newLine);
504+ int lineIndex = hpl::aleph::map::addLine(newLine);
505+
506+ wxGetApp().prevPointIndex = newPointIndex;
507+ }
508+ }else{
509+ //新規追加
510+ endpoint_data ep;
511+ assert(hpl::aleph::map::createPoint(wpoint, &ep));
512+ int newPointIndex = hpl::aleph::map::addEndpoint(ep);
513+ if(wxGetApp().isFirstOfLineToAdd){
514+ //最初の点なので追加しない
515+ }else{
516+ //線を追加する
517+ line_data line;
518+ assert(hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &line));
519+ int newLineIndex = hpl::aleph::map::addLine(line);
520+ }
521+
522+ wxGetApp().isFirstOfLineToAdd = false;
523+ wxGetApp().prevPointIndex = newPointIndex;
524+ }
525+ }
526+
527+ //情報を更新する
528+ wxGetApp().getStockManager()->updateDeletes();
529+
530+#endif
531+}
532+void MapEditorMainFrame::doLButtonOnMagnifyTool(wxMouseEvent& ev)
533+{
534+ bool shift = ev.ShiftDown();
535+ wxCommandEvent dummy;
536+ if(shift){
537+ //縮小
538+ this->OnZoomOut(dummy);
539+ }else{
540+ this->OnZoomIn(dummy);
541+ }
542+}
543+void MapEditorMainFrame::doLButtonOnSkullTool(wxMouseEvent& ev)
544+{
545+ //オブジェクト配置
546+#ifdef MAP_VIEWER
547+#else
548+ int mx = ev.m_x;
549+ int my = ev.m_y;
550+ world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(mx, my);
551+ //点の中に入るポリゴンを取得します
552+ //std::vector<int> polyIndexes = hpl::aleph::map::getPolygonIndexesIncludePoint(wpoint);
553+ //TODO
554+#endif
555+}
556+void MapEditorMainFrame::doLButtonOnTextTool(wxMouseEvent& ev)
557+{
558+#ifdef MAP_VIEWER
559+#else
560+ //アノテーション追加
561+ //ダイアログ準備
562+ AnnotationDialog dlg;
563+ map_annotation sample;
564+ //初期化
565+ memset(&sample, 0, SIZEOF_map_annotation);
566+
567+ //マウス座標の位置に追加する
568+ int viewX = ev.m_x;
569+ int viewY = ev.m_y;
570+ world_point2d wpoint = wxGetApp().getWorldPointFromViewPoint(viewX, viewY);
571+ sample.location.x = wpoint.x;
572+ sample.location.y = wpoint.y;
573+ sample.polygon_index = NONE;
574+
575+ //ダイアログ表示
576+ dlg.Create(this, ID_ANNOTATION_DIALOG, sample);
577+ if(dlg.ShowModal() == wxID_OK){
578+ //決定
579+ //アノテーションデータを取得
580+ map_annotation newAnnotation = dlg.getAnnotation();
581+ //追加
582+ hpl::aleph::map::addAnnotation(newAnnotation);
583+ }
584+ //情報を更新する
585+ wxGetApp().getStockManager()->updateDeletes();
586+
587+#endif
588+}
589+void MapEditorMainFrame::doLButtonOnPolygonTool(wxMouseEvent& ev)
590+{
591+#ifdef MAP_VIEWER
592+#else
593+ //範囲選択開始
594+ //TODO
595+ wxGetApp().getEventManager()->setSelectingGroup(true);
596+ wxGetApp().getEventManager()->setSelectGroupStartPoint(ev.m_x, ev.m_y);
597+#endif
598+}
599+
600+void MapEditorMainFrame::doLButtonOnPolygonMode(wxMouseEvent& ev)
601+{
602+#ifdef MAP_VIEWER
603+#else
604+#endif
605+}
606+void MapEditorMainFrame::doLButtonOnFloorHeightMode(wxMouseEvent& ev)
607+{
608+}
609+void MapEditorMainFrame::doLButtonOnCeilingHeightMode(wxMouseEvent& ev)
610+{
611+}
612+void MapEditorMainFrame::doLButtonOnFloorLightMode(wxMouseEvent& ev)
613+{
614+}
615+void MapEditorMainFrame::doLButtonOnCeilingLightMode(wxMouseEvent& ev)
616+{
617+}
618+void MapEditorMainFrame::doLButtonOnMediaMode(wxMouseEvent& ev)
619+{
620+}
621+void MapEditorMainFrame::doLButtonOnFloorTextureMode(wxMouseEvent& ev)
622+{
623+}
624+void MapEditorMainFrame::doLButtonOnCeilingTextureMode(wxMouseEvent& ev)
625+{
626+}
--- marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 356)
+++ marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 357)
@@ -259,6 +259,11 @@
259259 現在のモード・ツールにあわせてカーソルを変更します
260260 */
261261 void setCursor();
262+
263+ /**
264+ 線編集情報を初期化します
265+ */
266+ void resetLineEditInfo();
262267 private:
263268
264269 };
--- marathon/trunk/MapEditorWX/src/MapEditorMainFrame.h (revision 356)
+++ marathon/trunk/MapEditorWX/src/MapEditorMainFrame.h (revision 357)
@@ -258,6 +258,7 @@
258258 void OnRightUp(wxMouseEvent& ev);
259259 void OnMotion(wxMouseEvent& ev);
260260 void OnMouseWheel(wxMouseEvent& ev);
261+ void OnLeftDoubleClick(wxMouseEvent& ev);
261262
262263 //サイズ変更<en>change window size event
263264 void OnSize(wxSizeEvent& ev);
--- marathon/trunk/MapEditorWX/src/MainFrameMenuEvent.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/MainFrameMenuEvent.cpp (revision 357)
@@ -397,11 +397,27 @@
397397 }
398398 void MapEditorMainFrame::OnLevelInfo(wxCommandEvent& ev)
399399 {
400+ //保存確認
401+ if(wxGetApp().isChanged){
402+ if(wxMessageBox(_T("This level has been edited. Destruct it?"), _T("Message"),
403+ wxOK | wxCANCEL) == wxCANCEL)
404+ {
405+ return;
406+ }
407+ }
400408 LevelInfoDialog dlg;
401409 dlg.Create(this, wxID_ANY);
402- if(dlg.ShowModal() == wxID_OK){
403- //内容変更
404- //TODO
410+ if(dlg.ShowModal() != wxCANCEL){
411+ //初期化
412+ this->initLevel();
413+
414+ int index = wxGetApp().editLevelIndex;
415+ //読み込み
416+ bool check = load_level_from_map(index);
417+ if(!check){
418+ hpl::error::caution("Loading level[%d] failure", index);
419+ }
420+ wxGetApp().getStockManager()->updateDeletes();
405421 }
406422 }
407423 void MapEditorMainFrame::OnObjectPlacement(wxCommandEvent& ev)
@@ -419,6 +435,9 @@
419435 dlg.ShowModal();
420436 }
421437
438+//////////////////////////////////////////////////
439+//////////////////////////////////////////////////
440+
422441 void MapEditorMainFrame::OnLineProp(wxCommandEvent& ev)
423442 {
424443 LinePropDialog dlg;
--- marathon/trunk/MapEditorWX/src/TerminalDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/TerminalDialog.cpp (revision 357)
@@ -84,13 +84,13 @@
8484 void TerminalDialog::OnSelTerminal(wxCommandEvent &event)
8585 {
8686 int sel = event.GetSelection();
87- if(sel < 0 || sel >= map_terminal_text.size()){
87+ if(sel < 0 || sel >= (int)map_terminal_text.size()){
8888 //illegal selecting
8989 }else{
9090 //スクリーンリストを初期化
9191 this->list_box_2->Clear();
9292 terminal_text_t *terminal = &map_terminal_text[sel];
93- for(int i = 0; i < terminal->groupings.size(); i ++){
93+ for(int i = 0; i < (int)terminal->groupings.size(); i ++){
9494 terminal_groupings *group = &terminal->groupings[i];
9595 list_box_2->Insert(
9696 wxString(wxConvertMB2WX(wxGetApp().terminalTypeInfo[i].jname.c_str())),
@@ -129,13 +129,13 @@
129129 {
130130 //Editに流し込みます
131131 int tsel = this->list_box_1->GetSelection();
132- if(tsel < 0 || tsel >= map_terminal_text.size()){
132+ if(tsel < 0 || tsel >= (int)map_terminal_text.size()){
133133 return;
134134 }
135135
136136 terminal_text_t *terminal = &map_terminal_text[tsel];
137137 int sel = event.GetSelection();
138- if(sel < 0 || sel >= terminal->groupings.size()){
138+ if(sel < 0 || sel >= (int)terminal->groupings.size()){
139139 return;
140140 }
141141
--- marathon/trunk/MapEditorWX/src/SelectLevelDialog.h (revision 356)
+++ marathon/trunk/MapEditorWX/src/SelectLevelDialog.h (revision 357)
@@ -8,8 +8,9 @@
88 wxListBox* list_box_4;
99 wxButton* button_22;
1010 wxButton* button_23;
11+ int selectLevel;
1112 public:
12- int polygonIndex;
13+ int getSelectLevel();
1314
1415 SelectLevelDialog();
1516 bool Create(wxWindow* parent, wxWindowID id);
--- marathon/trunk/MapEditorWX/src/ToolDialog.cpp (revision 356)
+++ marathon/trunk/MapEditorWX/src/ToolDialog.cpp (revision 357)
@@ -101,6 +101,9 @@
101101 //変化
102102 emgr->setToolType(i);
103103
104+ //線追加ツールの初期化
105+ wxGetApp().resetLineEditInfo();
106+
104107 if(i == ToolType::TI_SKULL){
105108 //オブジェクトツール
106109 //プロパティを表示する
--- marathon/trunk/MapEditorWX/WXTODOリスト.txt (revision 356)
+++ marathon/trunk/MapEditorWX/WXTODOリスト.txt (revision 357)
@@ -179,4 +179,8 @@
179179 heights/light/media/sound palette
180180 texture dialog
181181 load textures from shapes file
182-level info dialog I/O
\ No newline at end of file
182+level info dialog I/O
183+double click when line tool using
184+LineList?Ȃǂ?vector??push_back,remove?Ȃǂ?????ƁA???????̍Ċ??蓖?āi?T?C?Y?ύX?j
185+ ?ɂ???ă|?C???^?A?h???X???ω????邱?Ƃ?????B
186+?lj??E?폜?????ꍇ?A????܂łɕێ????Ă???line_data*?Ȃǂ̃|?C???^?͎g??Ȃ????ƁI
\ No newline at end of file
--- marathon/trunk/HPLLib/HPLMapToolModifier.cpp (revision 356)
+++ marathon/trunk/HPLLib/HPLMapToolModifier.cpp (revision 357)
@@ -130,4 +130,6 @@
130130 obj->polygon_index = indexMapPolygons[obj->polygon_index];
131131 }
132132 }
133+
134+ return true;
133135 }
--- marathon/trunk/HPLLib/HPLMapTool.cpp (revision 356)
+++ marathon/trunk/HPLLib/HPLMapTool.cpp (revision 357)
@@ -1,22 +1,27 @@
1-#include "HPLMapTool.h"
1+?ソ#include "HPLMapTool.h"
22 #include "HPLMath.h"
33 #include <limits.h>
44 #include "HPLQuickSort.h"
55 #include <fstream>
6+#include <set>
67 #include "HPLError.h"
78 #include "HPLStringModifier.h"
9+#include "HPLStockManager.h"
810
9-//文字列仮読み込みのサイズ
11+//譁?ュ怜?莉ョ隱ュ縺ソ霎シ縺ソ縺ョ繧オ繧、繧コ
1012 //<en>size for buffering string
1113 const int BUF_MAX = 1024;
1214
13-//色情報の区切り文字
15+//濶イ諠??ア縺ョ蛹コ蛻?j譁?ュ
1416 static char* COLOR_ITEM_SEPARATER = ",";
15-//色情報の次元
17+//濶イ諠??ア縺ョ谺。蜈
1618 const int COL_NUM = 3;
1719
20+//隗貞コヲ縺ョ譛?螟ァ
21+const double DEG_ROUND = 360.0;
22+
1823 /**
19- 直線距離を求めます
24+ 逶エ邱夊キ晞屬繧呈アゅa縺セ縺
2025 */
2126 static double getLengthDouble(double x, double y)
2227 {
@@ -38,7 +43,7 @@
3843 if(strcmp(buf, "") == 0){
3944 continue;
4045 }
41- //stringにする
46+ //string縺ォ縺吶k
4247 infos[lineCounter].jname = std::string(buf);
4348 lineCounter ++;
4449 if(lineCounter >= maxLines){
@@ -49,8 +54,8 @@
4954 }
5055
5156 /**
52- カラーデータをファイルから読み込みます
53- @return 失敗時に偽
57+ 繧ォ繝ゥ繝シ繝??繧ソ繧偵ヵ繧。繧、繝ォ縺九i隱ュ縺ソ霎シ縺ソ縺セ縺
58+ @return 螟ア謨玲凾縺ォ蛛ス
5459 */
5560 bool hpl::aleph::loadColorSetting(const char* filePath, int colors[][3], int max)
5661 {
@@ -128,19 +133,25 @@
128133 dest[1] = (point.y + offsetYWorld)/zoomDivision + offsety;
129134 }
130135 /**
131- 指定した場所に点があるかどうかを得ます
132- @return その場所に点があればそのインデックスがかえります。
133- なければNONE
136+ 謖?ョ壹@縺溷?エ謇?縺ォ轤ケ縺後≠繧九°縺ゥ縺?°繧貞セ励∪縺
137+ @return 縺昴?蝣エ謇?縺ォ轤ケ縺後≠繧後?縺昴?繧、繝ウ繝?ャ繧ッ繧ケ縺後°縺医j縺セ縺吶?
138+ 縺ェ縺代l縺ーNONE
134139 */
135-int hpl::aleph::map::getSelectPointIndex(world_point2d& wpoint, int threshold, int zMin, int zMax)
140+int hpl::aleph::map::getSelectPointIndex(world_point2d& wpoint,
141+ int threshold, int zMin, int zMax, int div,
142+ hpl::aleph::HPLStockManager* smgr)
136143 {
137144 for(int i = 0; i < (int)EndpointList.size(); i ++){
138145 endpoint_data* ep = get_endpoint_data(i);
139- //高さチェック
146+ //鬮倥&繝√ぉ繝?け
140147 if(!hpl::aleph::map::isValidHeight(ep->highest_adjacent_floor_height, ep->lowest_adjacent_ceiling_height, zMin, zMax)){
141148 continue;
142149 }
143- if(hpl::aleph::map::isSelectPoint(wpoint, ep->vertex, threshold)){
150+ //蜑企勁繝√ぉ繝?け
151+ if(smgr->delPoints[i]){
152+ continue;
153+ }
154+ if(hpl::aleph::map::isSelectPoint(wpoint, ep->vertex, threshold * div)){
144155 return i;
145156 }
146157 }
@@ -147,25 +158,26 @@
147158 return NONE;
148159 }
149160 int hpl::aleph::map::getSelectPointIndex(int viewX, int viewY, int threshold, int zMin, int zMax,
150- int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div)
161+ int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div,
162+ hpl::aleph::HPLStockManager* smgr)
151163 {
152164 world_point2d wpoint = hpl::aleph::map::getWorldPoint2DFromViewPoint(viewX, viewY, offsetXW, offsetYW, div,
153165 voffsetX, voffsetY);
154- int index = hpl::aleph::map::getSelectPointIndex(wpoint, threshold * div, zMin, zMax);
166+ int index = hpl::aleph::map::getSelectPointIndex(wpoint, threshold, zMin, zMax, div, smgr);
155167 return index;
156168 }
157169
158170 /**
159- ある高さが規定範囲内にあるかを確かめます
160- @return ある高度の範囲が規定範囲と共有する部分を持たない場合負
171+ 縺ゅk鬮倥&縺瑚ヲ丞ョ夂ッ?峇蜀?↓縺ゅk縺九r遒コ縺九a縺セ縺
172+ @return 縺ゅk鬮伜コヲ縺ョ遽?峇縺瑚ヲ丞ョ夂ッ?峇縺ィ蜈ア譛峨☆繧矩Κ蛻?r謖√◆縺ェ縺??エ蜷郁イ?
161173 */
162174 bool hpl::aleph::map::isValidHeight(int checkMin, int checkMax, int validMin, int validMax)
163175 {
164176 if(checkMin > checkMax || checkMin > validMax || checkMax < validMin){
165- //・高さ指定が逆
166- //・床が許容範囲より上にある
167- //・天井が許容範囲より下にある
168- //→以上の場合規定範囲外(不正)とみなす
177+ //繝サ鬮倥&謖?ョ壹′騾
178+ //繝サ蠎翫′險ア螳ケ遽?峇繧医j荳翫↓縺ゅk
179+ //繝サ螟ゥ莠輔′險ア螳ケ遽?峇繧医j荳九↓縺ゅk
180+ //竊剃サ・荳翫?蝣エ蜷郁ヲ丞ョ夂ッ?峇螟厄シ井ク肴ュ」?峨→縺ソ縺ェ縺
169181 return false;
170182 }else{
171183 return true;
@@ -172,25 +184,30 @@
172184 }
173185 }
174186 /**
175- 指定した点が線を踏んでいる場合、その点
187+ 謖?ョ壹@縺溽せ縺檎キ壹r雕上s縺ァ縺?k蝣エ蜷医?√◎縺ョ轤ケ
176188 */
177-int hpl::aleph::map::getSelectLineIndex(world_point2d& wpoint, int threshold, int zMin, int zMax)
189+int hpl::aleph::map::getSelectLineIndex(world_point2d& wpoint,
190+ int threshold, int zMin, int zMax, int div,
191+ hpl::aleph::HPLStockManager* smgr)
178192 {
179193 for(int i = 0; i < (int)LineList.size(); i ++){
180194 line_data* line = get_line_data(i);
181- //高さチェック
195+ //鬮倥&繝√ぉ繝?け
182196 if(!hpl::aleph::map::isValidHeight(line->highest_adjacent_floor, line->lowest_adjacent_ceiling,
183197 zMin, zMax))
184198 {
185199 continue;
186200 }
187-
201+ if(smgr->delLines[i]){
202+ continue;
203+ }
188204 endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
189205 endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
190206
191- //選択しているか判定
192- if(hpl::aleph::map::isSelectLine(wpoint, begin->vertex, end->vertex, threshold)){
193- //選択できている(online)
207+ //驕ク謚槭@縺ヲ縺?k縺句愛螳
208+ if(hpl::aleph::map::isSelectLine(wpoint, begin->vertex, end->vertex,
209+ threshold, div)){
210+ //驕ク謚槭〒縺阪※縺?k??nline?
194211 return i;
195212 }
196213 }
@@ -197,11 +214,13 @@
197214 return NONE;
198215 }
199216 int hpl::aleph::map::getSelectLineIndex(int viewX, int viewY, int threshold, int zMin, int zMax,
200- int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div)
217+ int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div,
218+ hpl::aleph::HPLStockManager* smgr)
201219 {
202220 world_point2d wpoint = hpl::aleph::map::getWorldPoint2DFromViewPoint(viewX, viewY, offsetXW, offsetYW, div,
203221 voffsetX, voffsetY);
204- int index = hpl::aleph::map::getSelectLineIndex(wpoint, threshold * div, zMin, zMax);
222+ int index = hpl::aleph::map::getSelectLineIndex(wpoint,
223+ threshold , zMin, zMax, div, smgr);
205224 return index;
206225 }
207226
@@ -215,6 +234,7 @@
215234 int div,
216235 int distance)
217236 {
237+ //繝薙Η繝シ蠎ァ讓吶↓螟画鋤
218238 int x0 = (worldPX0 + offsetWorldX) / div + offsetViewX;
219239 int y0 = (worldPY0 + offsetWorldY) / div + offsetViewY;
220240 int x1 = (worldPX1 + offsetWorldX) / div + offsetViewX;
@@ -224,25 +244,25 @@
224244 return isSelect;
225245 }
226246 /**
227- 指定した座標では線を選択できたか?
228- @param point 指定ポイント
229- @param linePoint0 線の端点0
230- @param linePoint1 線の端点1
231- @param distance 閾値
232- @return 選択できるなら真
247+ 謖?ョ壹@縺溷コァ讓吶〒縺ッ邱壹r驕ク謚槭〒縺阪◆縺具シ
248+ @param point 謖?ョ壹?繧、繝ウ繝
249+ @param linePoint0 邱壹?遶ッ轤ケ0
250+ @param linePoint1 邱壹?遶ッ轤ケ1
251+ @param distance 髢セ蛟、
252+ @return 驕ク謚槭〒縺阪k縺ェ繧臥悄
233253 */
234254 bool hpl::aleph::map::isSelectLine(world_point2d &point,
235255 world_point2d &linePoint0, world_point2d &linePoint1,
236- int distance)
256+ int distance, int div)
237257 {
238258 bool isSelect = hpl::math::isNearbyPointToLine(point.x, point.y,
239- linePoint0.x, linePoint0.y, linePoint1.x, linePoint1.y, distance);
259+ linePoint0.x, linePoint0.y, linePoint1.x, linePoint1.y, distance * div);
240260 return isSelect;
241261 }
242262
243263 /**
244- 線の長さを求めます
245- @param index 線インデックス
264+ 邱壹?髟キ縺輔r豎ゅa縺セ縺
265+ @param index 邱壹う繝ウ繝?ャ繧ッ繧ケ
246266 */
247267 double hpl::aleph::map::getLineLength(int index)
248268 {
@@ -254,7 +274,7 @@
254274 }
255275
256276 /**
257- 2点の距離を求めます
277+ 2轤ケ縺ョ霍晞屬繧呈アゅa縺セ縺
258278 */
259279 double hpl::aleph::map::getPointsDistance(world_point2d& pointA, world_point2d& pointB)
260280 {
@@ -263,9 +283,9 @@
263283 }
264284
265285 /**
266- <jp>線情報を更新する
286+ <jp>邱壽ュ蝣ア繧呈峩譁ー縺吶k
267287 <en>Fix line_data up
268- @param isDeleteOldSide descide which deletes or not 使われていない壁情報を削除するか
288+ @param isDeleteOldSide descide which deletes or not 菴ソ繧上l縺ヲ縺?↑縺?」∵ュ蝣ア繧貞炎髯、縺吶k縺
269289 */
270290 void hpl::aleph::map::fixLine(int index, bool isDeleteOldSide)
271291 {
@@ -318,9 +338,9 @@
318338 }
319339
320340 /**
321- 線情報を線を構成する点によって取得します
341+ 邱壽ュ蝣ア繧堤キ壹r讒区?縺吶k轤ケ縺ォ繧医▲縺ヲ蜿門セ励@縺セ縺
322342 get line index with two point indexes
323- @return 線が存在しない場合NONE
343+ @return 邱壹′蟄伜惠縺励↑縺??エ蜷?ONE
324344 */
325345 int hpl::aleph::map::getLineIndexFromTwoLPoints(int pindex0, int pindex1)
326346 {
@@ -332,7 +352,7 @@
332352 if((ep0 == pindex0 && ep1 == pindex1) ||
333353 (ep1 == pindex0 && ep0 == pindex1))
334354 {
335- //双方が一致した場合のみ返す
355+ //蜿梧婿縺御ク?閾エ縺励◆蝣エ蜷医?縺ソ霑斐☆
336356 return i;
337357 }
338358 }
@@ -340,7 +360,7 @@
340360 }
341361
342362 /**
343- 点を共有する線インデックスのリストを取得します
363+ 轤ケ繧貞?譛峨☆繧狗キ壹う繝ウ繝?ャ繧ッ繧ケ縺ョ繝ェ繧ケ繝医r蜿門セ励@縺セ縺
344364 */
345365 std::vector<int> hpl::aleph::map::getLineIndexesIncludePoint(int endpointIndex)
346366 {
@@ -357,7 +377,7 @@
357377 }
358378
359379 /**
360- 線を共有するポリゴンのリストを取得します
380+ 邱壹r蜈ア譛峨☆繧九?繝ェ繧エ繝ウ縺ョ繝ェ繧ケ繝医r蜿門セ励@縺セ縺
361381 *
362382 std::vector<int> hpl::aleph::map::getPolygonIndexesIncludeLine(int lineIndex)
363383 {
@@ -364,7 +384,7 @@
364384 std::vector<int> polygonIndexes;
365385 for(int i = 0; i < (int)LineList.size(); i ++){
366386 polygon_data* polygon = get_polygon_data(i);
367- //頂点の数
387+ //鬆らせ縺ョ謨ー
368388 int n = polygon->vertex_count;
369389
370390 for(int i = 0; i < n; i ++){
@@ -379,7 +399,7 @@
379399 }
380400 */
381401 /**
382- 点を共有するポリゴンのリストを取得します
402+ 轤ケ繧貞?譛峨☆繧九?繝ェ繧エ繝ウ縺ョ繝ェ繧ケ繝医r蜿門セ励@縺セ縺
383403 */
384404 std::vector<int> hpl::aleph::map::getPolygonIndexesIncludePoint(int endpointIndex)
385405 {
@@ -386,7 +406,7 @@
386406 std::vector<int> polygonIndexes;
387407 for(int i = 0; i < (int)LineList.size(); i ++){
388408 polygon_data* polygon = get_polygon_data(i);
389- //頂点の数
409+ //鬆らせ縺ョ謨ー
390410 int n = polygon->vertex_count;
391411
392412 for(int i = 0; i < n; i ++){
@@ -408,14 +428,14 @@
408428
409429 /////////////////////// Groups ////////////////////////////////////////////
410430 /**
411- マウスが既に選択されているアイテムをクリックしているか確かめます
431+ 繝槭え繧ケ縺梧里縺ォ驕ク謚槭&繧後※縺?k繧「繧、繝?Β繧偵け繝ェ繝?け縺励※縺?k縺狗「コ縺九a縺セ縺
412432 <en>is point in select groups?
413- @param px point locatin(view) マウス位置(ビュー座標)
414- @param offsetViewX offset(view) ビュー座標ズレ
415- @param offsetWorldX offset(world) 実座標
416- @param pointDistance distance as nearby 点用閾値
417- @param lineDistance distance as nearby 線用閾値
418- @param selectInfo select group for check グループクラス
433+ @param px point locatin(view) 繝槭え繧ケ菴咲スョ?医ン繝・繝シ蠎ァ讓呻シ
434+ @param offsetViewX offset(view) 繝薙Η繝シ蠎ァ讓吶ぜ繝ャ
435+ @param offsetWorldX offset(world) 螳溷コァ讓
436+ @param pointDistance distance as nearby 轤ケ逕ィ髢セ蛟、
437+ @param lineDistance distance as nearby 邱夂畑髢セ蛟、
438+ @param selectInfo select group for check 繧ー繝ォ繝シ繝励け繝ゥ繧ケ
419439 */
420440 bool hpl::aleph::map::isPointInSelection(int px, int py,
421441 int offsetViewX, int offsetViewY,
@@ -508,21 +528,21 @@
508528
509529
510530 /**
511- ポリゴンが存在として正しいかどうかを判定します
512- @param index index of polygon which is checked 検査対象のポリゴンインデックス
531+ 繝昴Μ繧エ繝ウ縺悟ュ伜惠縺ィ縺励※豁」縺励>縺九←縺?°繧貞愛螳壹@縺セ縺
532+ @param index index of polygon which is checked 讀懈渊蟇セ雎。縺ョ繝昴Μ繧エ繝ウ繧、繝ウ繝?ャ繧ッ繧ケ
513533 */
514534 bool hpl::aleph::map::isValidPolygon(int index)
515535 {
516536 //TODO
517- //ポリゴン情報を取得します
537+ //繝昴Μ繧エ繝ウ諠??ア繧貞叙蠕励@縺セ縺
518538 polygon_data *polygon = get_polygon_data(index);
519539
520- //ポリゴン情報が無い
540+ //繝昴Μ繧エ繝ウ諠??ア縺檎┌縺
521541 if(polygon == NULL){
522542 return false;
523543 }
524544
525- //線の並びが正しいかチェック
545+ //邱壹?荳ヲ縺ウ縺梧ュ」縺励>縺九メ繧ァ繝?け
526546 int vertexCount = polygon->vertex_count;
527547 double points[MAXIMUM_VERTICES_PER_POLYGON][2];
528548 for(int i = 0; i < vertexCount; i ++){
@@ -547,26 +567,26 @@
547567 int pointA, pointB, pointC;
548568
549569
550- //時計回りか、反時計回りか
570+ //譎りィ亥屓繧翫°縲∝渚譎りィ亥屓繧翫°
551571 int polygonRotationType = hpl::math::RotationType::Clockwise;
552572 bool isFirstLoop = true;
553573
554574 for(int i = 0; i < vertexCount - 2; i ++){
555- //点iと点i+1を含む線をAB, 点i+1と点i+2を含む線をBCとする。
556- //最初の線[点0,点1]と線[点1,点2]の角度から、時計回りか、反時計回りかを判定する
575+ //轤ケi縺ィ轤ケi+1繧貞性繧?邱壹rAB, 轤ケi+1縺ィ轤ケi+2繧貞性繧?邱壹rBC縺ィ縺吶k縲
576+ //譛?蛻昴?邱喙轤ケ0,轤ケ1]縺ィ邱喙轤ケ1,轤ケ2]縺ョ隗貞コヲ縺九i縲∵凾險亥屓繧翫°縲∝渚譎りィ亥屓繧翫°繧貞愛螳壹☆繧
557577 pointA = polygon->endpoint_indexes[i];
558578 pointB = polygon->endpoint_indexes[i + 1];
559579 pointC = polygon->endpoint_indexes[i + 2];
560580
561- //二つの線AB,BCが織り成す角度を求める
581+ //莠後▽縺ョ邱哂B,BC縺檎ケ斐j謌舌☆隗貞コヲ繧呈アゅa繧
562582 double firstDegree = hpl::aleph::map::getTwoLinesDegree(pointA, pointB, pointB, pointC);
563583 int lineABIndex = hpl::aleph::map::getLineIndexFromTwoLPoints(pointA, pointB);
564584 int lineBCIndex = hpl::aleph::map::getLineIndexFromTwoLPoints(pointB, pointC);
565585 if(lineABIndex == NONE || lineBCIndex == NONE){
566- //線の並び順が正しくない
586+ //邱壹?荳ヲ縺ウ鬆?′豁」縺励¥縺ェ縺
567587 return false;
568588 }
569- //line_indexesのならびに対応しているかどうか
589+ //line_indexes縺ョ縺ェ繧峨?縺ォ蟇セ蠢懊@縺ヲ縺?k縺九←縺?°
570590 if(polygon->line_indexes[i] != lineABIndex ||
571591 polygon->line_indexes[i + 1] != lineBCIndex){
572592 return false;
@@ -575,14 +595,14 @@
575595 double optDeg = hpl::math::optimizeDegree(firstDegree);
576596
577597 if(isFirstLoop){
578- //もし角度が[0,180)ならば、右回りである
579- //それ以外([180,360))ならば、左回りである
598+ //繧ゅ@隗貞コヲ縺啓0,180)縺ェ繧峨?縲∝承蝗槭j縺ァ縺ゅk
599+ //縺昴l莉・螟厄シ?180,360)?峨↑繧峨?縲∝キヲ蝗槭j縺ァ縺ゅk
580600 if(optDeg >= 180.0){
581601 polygonRotationType = hpl::math::RotationType::Counterclockwise;
582602 }
583603 isFirstLoop = false;
584604 }else{
585- //ポリゴンが逆鋭角(切り込んでる)状態ならば異常であるとする
605+ //繝昴Μ繧エ繝ウ縺碁??強隗抵シ亥?繧願セシ繧薙〒繧具シ臥憾諷九↑繧峨?逡ー蟶ク縺ァ縺ゅk縺ィ縺吶k
586606 if((polygonRotationType == hpl::math::RotationType::Clockwise && optDeg >= 180) ||
587607 (polygonRotationType == hpl::math::RotationType::Counterclockwise && optDeg < 180)){
588608 return false;
@@ -591,21 +611,155 @@
591611 }
592612 return true;
593613 */
594- }
614+}
595615
596616 /**
597- 座標を取り囲むポリゴンのうち、ポリゴンとして成立しているものをさがします
598- すでにポリゴンが存在している場合は無視します
599- @param wpoint 探索基点。ここを囲むポリゴンを探す
600- @return ポリゴンの実データ候補。これを元に生成すると良い。データはcreatePolygonで生成すべし
617+ 蝓コ譛ャ縺ョ邱?轤ケ縺九i縺、縺ェ縺後k邱壹?縺?■縲√し繧、繧コ縺後b縺」縺ィ繧ょー上&縺上↑繧九h縺?↓
618+ 轤ケ縺ョ繝ェ繧ケ繝医r蜿門セ励@縺セ縺吶?らせ縺ョ荳ヲ縺ウ縺ッ繝昴Μ繧エ繝ウ謖?ョ壹↓縺昴?縺セ縺セ菴ソ縺医k迚ゥ縺ィ縺ェ縺」縺ヲ縺?∪縺吶?
619+
620+ 蜀榊クー逧?↓蜻シ縺ウ蜃コ縺励∪縺吶?
621+ @param pointIndexes 縺薙l縺セ縺ァ縺ォ縺、縺ェ縺偵※縺阪◆轤ケ縺ョ繝ェ繧ケ繝医?ゅ%縺ョ蛟区焚縺勲AXIMUM_VERTEX_PER_POLYGON
622+ 繧定カ?∴縺溘i隕九▽縺九i縺ェ縺九▲縺溘b縺ョ縺ィ縺吶k
623+ @return 繝昴Μ繧エ繝ウ縺悟ョ檎オ舌@縺溷?エ蜷育悄
601624 */
602-std::vector<polygon_data> hpl::aleph::map::searchValidPolygon(world_point2d wpoint)
625+static bool getValidLines(int basePointIndex, int baseLineIndex,
626+ std::vector<int> *pointIndexes,
627+ hpl::aleph::HPLStockManager* smgr,
628+ int rotRem, std::set<int>* doneList,
629+ int zMin, int zMax,
630+ world_point2d& wpoint)
603631 {
632+ //譛?蟆上?隗貞コヲ
633+ double minDeg = 360;
634+ int minLineIndex = NONE;
635+
636+ line_data* baseLine = get_line_data(baseLineIndex);
637+ int startBasePointIndex = baseLine->endpoint_indexes[0];
638+ int endBasePointIndex = baseLine->endpoint_indexes[1];
639+ if(startBasePointIndex == basePointIndex){
640+ //蜈・繧梧崛縺
641+ hpl::math::exchange(&startBasePointIndex, &endBasePointIndex);
642+ }else if(endBasePointIndex == basePointIndex){
643+ }else{
644+ assert(false);
645+ }
646+
647+ int lastPointIndex = NONE;
648+ //繝吶?繧ケ繝昴う繝ウ繝医↓郢九′繧狗キ壹r蜿悶j蜃コ縺
649+ std::vector<int> conLines = hpl::aleph::map::getLineIndexesIncludePoint(basePointIndex);
650+ for(int k = 0; k < (int)conLines.size(); k ++){
651+ if(doneList->find(conLines[k]) != doneList->end()){
652+ //譌「縺ォ隕九▽縺大?縺励◆繧ゅ?縺ッ逵√¥
653+ continue;
654+ }
655+ //delLines縺ッ逵√¥
656+ if(smgr->delLines[conLines[k]]){
657+ continue;
658+ }
659+ //繝吶?繧ケ縺ョ邱壹→荳?邱偵?蝣エ蜷医b髯、螟悶☆繧
660+ if(baseLineIndex == conLines[k]){
661+ continue;
662+ }
663+
664+ line_data* line = get_line_data(conLines[k]);
665+ assert(line);
666+ //鬮倥&繝√ぉ繝?け
667+ if(!hpl::aleph::map::isValidHeight(line->highest_adjacent_floor,
668+ line->lowest_adjacent_ceiling, zMin, zMax))
669+ {
670+ continue;
671+ }
672+
673+ int ep0Index = line->endpoint_indexes[0];
674+ int ep1Index = line->endpoint_indexes[1];
675+ if(basePointIndex == ep0Index){
676+ }else if(basePointIndex == ep1Index){
677+ //蜈・繧梧崛縺
678+ hpl::math::exchange(&ep0Index, &ep1Index);
679+ }else{
680+ assert(false);
681+ }
682+
683+ endpoint_data* ep0 = get_endpoint_data(ep0Index);
684+ endpoint_data* ep1 = get_endpoint_data(ep1Index);
685+ double l0x = ep0->vertex.x;
686+ double l0y = ep0->vertex.y;
687+ double l1x = ep1->vertex.x;
688+ double l1y = ep1->vertex.y;
689+ //邱壹°繧画欠螳夂せ縺ォ蟇セ縺吶k隗貞コヲ繧呈アゅa繧具シ亥キヲ蜿ウ縺ョ遒コ隱搾シ
690+ int rot = hpl::math::getPointRotationTypeFromLine(
691+ wpoint.x, wpoint.y, l0x, l0y, l1x, l1y);
692+ //譛?蛻昴?邱壹→驕輔≧?磯??髄縺搾シ峨↓謖?ョ夂せ縺梧擂縺ヲ縺?k蝣エ蜷医?豁」縺励¥縺ェ縺?b縺ョ縺ィ縺吶k縲
693+ if(rotRem != rot){
694+ continue;
695+ }
696+
697+ //蜑阪?邱壹?蟋狗せ竊貞?譛臥せ竊呈怙蠕後?轤ケ縺ァ隗貞コヲ繧呈アゅa繧
698+ //蜑阪?邱壹?蟋狗せ
699+ endpoint_data* prevStartEp = get_endpoint_data(startBasePointIndex);
700+ assert(prevStartEp);
701+ double deg = hpl::math::getTwoLinesDegree(prevStartEp->vertex.x,
702+ prevStartEp->vertex.y, l0x, l0y,
703+ l0x, l0y, l1x, l1y);
704+ //[0,360)縺ォ蛻カ髯舌☆繧
705+ deg = hpl::math::optimizeDegree(deg);
706+ if(deg > DEG_ROUND / 2.0){
707+ deg = DEG_ROUND - deg;
708+ }
709+ //隗貞コヲ縺檎樟蝨ィ譛?蟆上°縺ゥ縺?°遒コ隱阪☆繧
710+ if(deg < minDeg){
711+ minDeg = deg;
712+ //莉翫∪縺ァ繧医j蟆上&縺
713+ minLineIndex = conLines[k];
714+ //譛?蠕後?轤ケ
715+ lastPointIndex = ep1Index;
716+ }
717+ //貂医∩
718+ doneList->insert(conLines[k]);
719+ }
720+
721+ if(minLineIndex == NONE){
722+ //隕九▽縺九i縺ェ縺九▲縺
723+ //繧医▲縺ヲ謌サ縺」縺ヲ縺?¥
724+ return false;
725+ }else{
726+ //隕九▽縺九▲縺
727+ //譛?蠕後↓霑ス蜉?縺吶k
728+ pointIndexes->push_back(lastPointIndex);
729+
730+ //譛?蠕後?轤ケ縺継ointIndexes[0]縺ィ蜷御ク??井ク?蜻ィ縺励※縺阪◆?峨□縺」縺溘i
731+ //邨ゅo縺」縺溘→縺吶k
732+ if(lastPointIndex == pointIndexes->at(0)){
733+ //繝昴Μ繧エ繝ウ縺ィ縺励※謌千ォ九☆繧九そ繝?ヨ繧定ヲ九▽縺大?縺帙◆
734+ return true;
735+ }else{
736+ //縺セ縺?縺セ縺?
737+ //谺。繧呈爾縺
738+ baseLineIndex = minLineIndex;
739+ basePointIndex = lastPointIndex;
740+ bool found = getValidLines(basePointIndex, baseLineIndex, pointIndexes,
741+ smgr, rotRem, doneList, zMin, zMax, wpoint);
742+ //邨仙ア?隕九▽縺九▲縺溘°縺ゥ縺?°縺ッ蟄蝉セ帙□縺代′遏・縺」縺ヲ縺?k
743+ return found;
744+ }
745+ }
746+}
747+
748+/**
749+ 蠎ァ讓吶r蜿悶j蝗イ繧?繝昴Μ繧エ繝ウ縺ョ縺?■縲√?繝ェ繧エ繝ウ縺ィ縺励※謌千ォ九@縺ヲ縺?k繧ゅ?繧偵&縺後@縺セ縺
750+ 縺吶〒縺ォ繝昴Μ繧エ繝ウ縺悟ュ伜惠縺励※縺?k蝣エ蜷医?辟。隕悶@縺セ縺
751+ @param wpoint 謗「邏「蝓コ轤ケ縲ゅ%縺薙r蝗イ繧?繝昴Μ繧エ繝ウ繧呈爾縺
752+ @return 繝昴Μ繧エ繝ウ縺ョ螳溘ョ繝シ繧ソ蛟呵」懊?ゅ%繧後r蜈?↓逕滓?縺吶k縺ィ濶ッ縺??ゅョ繝シ繧ソ縺ッcreatePolygon縺ァ逕滓?縺吶∋縺
753+*/
754+std::vector<polygon_data> hpl::aleph::map::searchValidPolygon(world_point2d wpoint,
755+ hpl::aleph::HPLStockManager* smgr,
756+ int zMin, int zMax)
757+{
604758 std::vector<polygon_data> polyDatas;
605759
606760 int max = (int)LineList.size();
607- //線への垂線の距離順で整列する
608- //全部の線への垂線を求める
761+ //邱壹∈縺ョ蝙らキ壹?霍晞屬鬆?〒謨エ蛻励☆繧
762+ //蜈ィ驛ィ縺ョ邱壹∈縺ョ蝙らキ壹r豎ゅa繧
609763 struct hpl::math::qsort::Pair<double>* pairs = new struct hpl::math::qsort::Pair<double>[max];
610764 for(int i = 0; i < max; i ++){
611765 line_data* line = get_line_data(i);
@@ -616,38 +770,109 @@
616770 }
617771 hpl::math::qsort::quickSort<double>(pairs, max);
618772
619- //近くにある線から見ていく
773+ //譌「縺ォ隱ソ縺ケ縺溘Μ繧ケ繝?邱壹?繧、繝ウ繝?ャ繧ッ繧ケ蛟、繧貞?繧後k)
774+ std::set<int> doneList;
775+
776+ //霑代¥縺ォ縺ゅk邱壹°繧芽ヲ九※縺?¥
620777 for(int i = 0; i < max; i ++){
621- line_data* startLine = get_line_data(pairs[i].index);
622- endpoint_data* epStart = get_endpoint_data(startLine->endpoint_indexes[0]);
623- endpoint_data* epEnd = get_endpoint_data(startLine->endpoint_indexes[1]);
778+ //蜑企勁蟇セ雎。縺ェ繧臥┌隕
779+ if(smgr->delLines[i]){
780+ continue;
781+ }
782+ //縺吶〒縺ォ隱ソ縺ケ縺溽キ壹↑繧臥┌隕
783+ if(doneList.find(i) != doneList.end()){
784+ continue;
785+ }
786+ int lineIndexBase = pairs[i].index;
787+ line_data* startLine = get_line_data(lineIndexBase);
788+ assert(startLine);
789+ //鬮倥&繝√ぉ繝?け
790+ if(!hpl::aleph::map::isValidHeight(startLine->highest_adjacent_floor,
791+ startLine->lowest_adjacent_ceiling, zMin, zMax))
792+ {
793+ continue;
794+ }
624795
625- //線の左右どちらの側に点があるかをチェックします
796+ int startPointIndex = startLine->endpoint_indexes[0];
797+ endpoint_data* epStart = get_endpoint_data(startPointIndex);
798+ assert(epStart);
799+ int endPointIndex = startLine->endpoint_indexes[1];
800+ endpoint_data* epEnd = get_endpoint_data(endPointIndex);
801+ assert(epEnd);
802+
803+ //邱壹?蟾ヲ蜿ウ縺ゥ縺。繧峨?蛛エ縺ォ轤ケ縺後≠繧九°繧偵メ繧ァ繝?け縺励∪縺
626804 int rotRem = hpl::math::getPointRotationTypeFromLine(
627805 wpoint.x, wpoint.y, epStart->vertex.x, epStart->vertex.y,
628806 epEnd->vertex.x, epEnd->vertex.y);
629- int previousPoint;
807+ if(rotRem == hpl::math::RotationType::Clockwise &&
808+ startLine->clockwise_polygon_owner != NONE)
809+ {
810+ //蜿ウ蜻ィ繧翫〒縲√°縺、邱壹?蜿ウ蛛エ?域欠螳夂せ縺ョ縺ゅk鬆伜沺?
811+ //縺ォ繝昴Μ繧エ繝ウ縺梧里縺ォ縺ゅk蝣エ蜷医せ繧ュ繝??
812+ continue;
813+ }
814+ if(rotRem == hpl::math::RotationType::Counterclockwise &&
815+ startLine->counterclockwise_polygon_owner != NONE)
816+ {
817+ continue;
818+ }
819+ //縺薙l莉・髯阪?縺吶〒縺ォ謖?ョ夂せ縺ョ驛ィ蛻?↓繝昴Μ繧エ繝ウ縺後↑縺?→莉ョ螳壹☆繧
820+
821+ //蝓コ轤ケ
822+ int nowBasePointIndex = endPointIndex;
823+ int prevLineIndex = lineIndexBase;
630824 //TODO
825+ //startLine->endpoint_indexes[1]縺九i縺、縺ェ縺後k邱壹r隱ソ縺ケ繧
826+ std::vector<int> pointIndexes;
827+ //譛?蛻昴?莠後▽繧剃サ」蜈・縺励※縺翫¥
828+ pointIndexes.push_back(startPointIndex);
829+ pointIndexes.push_back(endPointIndex);
830+
831+ bool found = getValidLines(nowBasePointIndex, prevLineIndex,
832+ &pointIndexes, smgr, rotRem, &doneList,
833+ zMin, zMax, wpoint);
834+ if(found){
835+ //逋コ隕具シ
836+ //轤ケ繧、繝ウ繝?ャ繧ッ繧ケ?亥?、貂。縺礼畑?
837+ int indexes[MAXIMUM_VERTICES_PER_POLYGON];
838+
839+ //轤ケ繝??繧ソ髮?ィ
840+ for(int l = 0; l < pointIndexes.size() - 2; i ++){
841+ //
842+ indexes[l] = pointIndexes[l];
843+ }
844+ int vertexCount = pointIndexes.size() - 1;
845+ //繝昴Μ繧エ繝ウ菴懈?
846+ polygon_data poly;
847+ hpl::aleph::map::createPolygon(indexes, vertexCount, &poly);
848+ polyDatas.push_back(poly);
849+
850+ //TODO 隍?焚隕九▽縺大?縺吶?縺具シ
851+ //鬮倥&鬆?シ滉ス輔?縺薙→縺九??
852+ //諢溯ヲ夂噪縺ォ霑代>邱壹r蜿悶l縺ー縺?>繧薙§繧???
853+ break;
854+ }
855+ doneList.insert(i);
631856 }
632857
633- //解放
858+ //隗」謾セ
634859 delete pairs;
635860 return polyDatas;
636861 }
637862
638863 /**
639- 世界座標からポリゴンデータを作ります
640- TODO 整合性
641- @param points 世界座標
642- @param ep 生成された点データ
643- @param ld 生成された線データ
644- @param n n角形
864+ 荳也阜蠎ァ讓吶°繧峨?繝ェ繧エ繝ウ繝??繧ソ繧剃ス懊j縺セ縺
865+ TODO 謨エ蜷域?ァ
866+ @param points 荳也阜蠎ァ讓
867+ @param ep 逕滓?縺輔l縺溽せ繝??繧ソ
868+ @param ld 逕滓?縺輔l縺溽キ壹ョ繝シ繧ソ
869+ @param n n隗貞ス「
645870 */
646871 polygon_data hpl::aleph::map::createPolygon(world_point2d points[],
647872 endpoint_data epd[], line_data ld[],
648873 int n)
649874 {
650- //点生成
875+ //轤ケ逕滓?
651876 for(int i = 0; i < n; i ++){
652877 epd[i].flags = 0;
653878 epd[i].highest_adjacent_floor_height = 0;
@@ -658,7 +883,7 @@
658883 epd[i].supporting_polygon_index = 0;
659884 }
660885
661- //線
886+ //邱
662887 for(int i = 0; i < n ; i ++){
663888 ld[i].endpoint_indexes[0] = i;
664889 ld[i].endpoint_indexes[1] = i + 1;
@@ -680,7 +905,7 @@
680905 epd[ld[i].endpoint_indexes[0]].vertex, epd[ld[i].endpoint_indexes[1]].vertex);
681906 }
682907
683- //ポリゴン
908+ //繝昴Μ繧エ繝ウ
684909 polygon_data pdata;
685910 pdata.type = _polygon_is_normal;
686911 pdata.flags = 0;
@@ -734,16 +959,16 @@
734959 return pdata;
735960 }
736961 /**
737- 独立したポリゴンデータを追加します
962+ 迢ャ遶九@縺溘?繝ェ繧エ繝ウ繝??繧ソ繧定ソス蜉?縺励∪縺
738963 */
739964 void hpl::aleph::map::addNewPolygon(polygon_data& pdata, endpoint_data epd[],
740965 line_data ld[], int n)
741966 {
742- //点
967+ //轤ケ
743968 std::map<int,int> epIndexTable;
744969 std::string str;
745970 for(int i = 0; i < n; i ++){
746- //点の追加
971+ //轤ケ縺ョ霑ス蜉?
747972 int newIndex = hpl::aleph::map::addEndpoint(epd[i]);
748973 epIndexTable[i] = newIndex;
749974
@@ -755,10 +980,10 @@
755980 }
756981 // const char *buf = str.c_str();
757982
758- //線の追加
983+ //邱壹?霑ス蜉?
759984 std::map<int,int> lIndexTable;
760985 for(int i = 0; i < n; i ++){
761- //修正
986+ //菫ョ豁」
762987 for(int j = 0; j < 2; j ++){
763988 ld[i].endpoint_indexes[j] = epIndexTable[ld[i].endpoint_indexes[j]];
764989 }
@@ -768,7 +993,7 @@
768993 lIndexTable[i] = newIndex;
769994 }
770995
771- //ポリゴン情報修正
996+ //繝昴Μ繧エ繝ウ諠??ア菫ョ豁」
772997 for(int i = 0; i < n; i ++){
773998 pdata.endpoint_indexes[i] = epIndexTable[pdata.endpoint_indexes[i]];
774999 pdata.line_indexes[i] = lIndexTable[pdata.line_indexes[i]];
@@ -775,9 +1000,9 @@
7751000 pdata.side_indexes[i] = NONE;
7761001 }
7771002
778- //ポリゴン追加
1003+ //繝昴Μ繧エ繝ウ霑ス蜉?
7791004 int newPolygonIndex = hpl::aleph::map::addPolygon(pdata);
780- //線情報修正
1005+ //邱壽ュ蝣ア菫ョ豁」
7811006 for(int i = 0; i < n; i ++){
7821007 int newIndex = epIndexTable[i];
7831008 endpoint_data* ep = get_endpoint_data(newIndex);
@@ -809,13 +1034,13 @@
8091034 }
8101035
8111036 /**
812- 二つの線が織り成す角度を求めます
813- @param pIndexA1,2 線分A1-A2の点インデックス
814- @param pIndexB1,2 線分B1-B2の点インデックス
1037+ 莠後▽縺ョ邱壹′郢斐j謌舌☆隗貞コヲ繧呈アゅa縺セ縺
1038+ @param pIndexA1,2 邱壼?A1-A2縺ョ轤ケ繧、繝ウ繝?ャ繧ッ繧ケ
1039+ @param pIndexB1,2 邱壼?B1-B2縺ョ轤ケ繧、繝ウ繝?ャ繧ッ繧ケ
8151040 */
8161041 double hpl::aleph::map::getTwoLinesDegree(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2)
8171042 {
818- //degreeにします
1043+ //degree縺ォ縺励∪縺
8191044 double rad = hpl::aleph::map::getTwoLinesRadian(pIndexA1, pIndexA2, pIndexB1, pIndexB2);
8201045 double deg = hpl::math::getDegreeFromRadian(rad);
8211046 return deg;
@@ -822,7 +1047,7 @@
8221047 }
8231048 double hpl::aleph::map::getTwoLinesRadian(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2)
8241049 {
825- //radianで求めます
1050+ //radian縺ァ豎ゅa縺セ縺
8261051 endpoint_data *a1 = get_endpoint_data(pIndexA1);
8271052 endpoint_data *a2 = get_endpoint_data(pIndexA2);
8281053 endpoint_data *b1 = get_endpoint_data(pIndexB1);
@@ -835,13 +1060,13 @@
8351060 }
8361061
8371062 /**
838- 指定した点がポリゴンの中に存在するかどうかを確かめます
1063+ 謖?ョ壹@縺溽せ縺後?繝ェ繧エ繝ウ縺ョ荳ュ縺ォ蟄伜惠縺吶k縺九←縺?°繧堤「コ縺九a縺セ縺
8391064 @
8401065 */
8411066 bool hpl::aleph::map::isPointInPolygon(int viewPX, int viewPY, int polygonIndex,
8421067 int offsetXWorld, int offsetYWorld, int zoomDivision, int offsetx, int offsety)
8431068 {
844- //ワールド座標に変換します
1069+ //繝ッ繝シ繝ォ繝牙コァ讓吶↓螟画鋤縺励∪縺
8451070 world_point2d wpoint = hpl::aleph::map::getWorldPoint2DFromViewPoint(viewPX, viewPY,
8461071 offsetXWorld, offsetYWorld, zoomDivision, offsetx, offsety);
8471072 bool isPointIn = hpl::aleph::map::isPointInPolygon(wpoint, polygonIndex);
@@ -851,7 +1076,7 @@
8511076 bool hpl::aleph::map::isPointInPolygon(world_point2d& wpoint, int polygonIndex)
8521077 {
8531078 double points[MAXIMUM_VERTICES_PER_POLYGON][2];
854- //ポリゴン情報を得ます
1079+ //繝昴Μ繧エ繝ウ諠??ア繧貞セ励∪縺
8551080 polygon_data* poly = get_polygon_data(polygonIndex);
8561081 int n = poly->vertex_count;
8571082 for(int i = 0; i < n; i ++){
@@ -859,7 +1084,7 @@
8591084 points[i][0] = ep->vertex.x;
8601085 points[i][1] = ep->vertex.y;
8611086 }
862- //位置検査します
1087+ //菴咲スョ讀懈渊縺励∪縺
8631088 bool isPointIn = hpl::math::isPointInPolygon(wpoint.x, wpoint.y, points, n);
8641089 return isPointIn;
8651090 }
@@ -867,9 +1092,9 @@
8671092 //////////////////////////////////////////////////////
8681093 /////// add delete and modify
8691094 /**
870- 点情報を追加します
871- @param ep 追加する点データ(値渡しなのでコピーされます)
872- @return 追加された点のインデックス値
1095+ 轤ケ諠??ア繧定ソス蜉?縺励∪縺
1096+ @param ep 霑ス蜉?縺吶k轤ケ繝??繧ソ?亥?、貂。縺励↑縺ョ縺ァ繧ウ繝斐?縺輔l縺セ縺呻シ
1097+ @return 霑ス蜉?縺輔l縺溽せ縺ョ繧、繝ウ繝?ャ繧ッ繧ケ蛟、
8731098 */
8741099 int hpl::aleph::map::addEndpoint(endpoint_data ep)
8751100 {
@@ -903,9 +1128,9 @@
9031128 {
9041129 SavedObjectList.push_back(object);
9051130 //TODO
906- //プレースメント情報に付加
1131+ //繝励Ξ繝シ繧ケ繝。繝ウ繝域ュ蝣ア縺ォ莉伜刈
9071132
908- //TODO どれを集計すれば良いのか?
1133+ //TODO 縺ゥ繧後r髮?ィ医☆繧後?濶ッ縺??縺具シ
9091134 // dynamic_world->object_count ++;// SavedObjectList.size();
9101135 dynamic_world->initial_objects_count = (int16)SavedObjectList.size();
9111136 int index = dynamic_world->initial_objects_count - 1;
@@ -921,24 +1146,15 @@
9211146 }
9221147
9231148 /**
924- 簡略バージョン
1149+ 邁。逡・繝舌?繧ク繝ァ繝ウ
9251150 */
926-bool hpl::aleph::map::createPoint(world_point2d& wpoint, endpoint_data* ep,
927- int threshold)
1151+bool hpl::aleph::map::createPoint(world_point2d& wpoint, endpoint_data* ep)
9281152 {
9291153 //TODO
9301154 ep->flags = 1;
9311155 ep->vertex.x = wpoint.x;
9321156 ep->vertex.y = wpoint.y;
933-
934- //他の点を踏んでいないか確認
935- int pIndex = hpl::aleph::map::getSelectPointIndex(wpoint, threshold,
936- -SHRT_MIN, SHRT_MAX);
937- if(pIndex != NONE){
938- //踏んでる
939- //→作成できない
940- return false;
941- }
1157+
9421158 ep->highest_adjacent_floor_height = 0;
9431159 ep->lowest_adjacent_ceiling_height = WORLD_ONE;
9441160 ep->supporting_polygon_index = NONE;
@@ -945,7 +1161,7 @@
9451161 return true;
9461162 }
9471163 /**
948- @param polyIndex 載せるポリゴンのインデックス
1164+ @param polyIndex 霈峨○繧九?繝ェ繧エ繝ウ縺ョ繧、繝ウ繝?ャ繧ッ繧ケ
9491165 */
9501166 bool hpl::aleph::map::createObject(world_point2d& wpoint, int polyIndex, map_object* obj,
9511167 int flags)
@@ -965,6 +1181,7 @@
9651181 obj->location.z = poly->floor_height;
9661182 }
9671183 obj->flags = flags;
1184+ return true;
9681185 }
9691186
9701187 bool hpl::aleph::map::createLine(int beginPointIndex, int endPointIndex, line_data* line)
@@ -981,8 +1198,11 @@
9811198 line->endpoint_indexes[0] = beginPointIndex;
9821199 line->endpoint_indexes[1] = endPointIndex;
9831200 line->flags = SOLID_LINE_BIT;
984- //TODO 点のうち高い方のフロア高度
985- line->highest_adjacent_floor = 0;
1201+ //TODO 轤ケ縺ョ縺?■鬮倥>譁ケ縺ョ繝輔Ο繧「鬮伜コヲ
1202+ line->highest_adjacent_floor = MIN(begin->highest_adjacent_floor_height,
1203+ end->highest_adjacent_floor_height);
1204+ line->lowest_adjacent_ceiling = MAX(begin->lowest_adjacent_ceiling_height,
1205+ end->lowest_adjacent_ceiling_height);
9861206 return true;
9871207 }
9881208
@@ -1013,7 +1233,7 @@
10131233 poly->ambient_sound_image_index = NONE;
10141234 //TODO area?
10151235 poly->area = 0;
1016- //TODO 点のうち一番高い高度
1236+ //TODO 轤ケ縺ョ縺?■荳?逡ェ鬮倥>鬮伜コヲ
10171237 poly->ceiling_height = WORLD_ONE;
10181238 poly->ceiling_lightsource_index = NONE;
10191239 //TODO ?
@@ -1036,7 +1256,7 @@
10361256 poly->flags = 0;
10371257 poly->media_index = NONE;
10381258 poly->media_lightsource_index = NONE;
1039- //TODO count 線の反対側の
1259+ //TODO count 邱壹?蜿榊ッセ蛛エ縺ョ
10401260 poly->neighbor_count = 0;
10411261 //TODO ?
10421262 poly->permutation = 0;
@@ -1048,16 +1268,90 @@
10481268 return true;
10491269 }
10501270
1271+/**
1272+ 驕ク謚槭ョ繝シ繧ソ縺ォ繧ェ繝輔そ繝?ヨ繧定ィュ螳壹@縺セ縺吶?
1273+ @param mx, my 繝槭え繧ケ蠎ァ讓
1274+ @param sel 驕ク謚槭ョ繝シ繧ソ
1275+*/
1276+void hpl::aleph::map::setupSelectDataGroupOffsets(int mx, int my,
1277+ hpl::aleph::map::HPLSelectData* sel,
1278+ int voffsetX, int voffsetY, int woffsetX, int woffsetY, int div)
1279+{
1280+ //轤ケ <en> points
1281+ for(int i = 0; i < (int)sel->getSelPoints()->size(); i ++){
1282+ endpoint_data* ep = get_endpoint_data(sel->getSelPoints()->at(i).index);
1283+ //繝薙Η繝シ蠎ァ讓吶↓螟画鋤
1284+ int vpoint[2];
1285+ hpl::aleph::map::getViewPointFromWorldPoint2D(ep->vertex, vpoint,
1286+ woffsetX, woffsetY, div, voffsetX, voffsetY);
1287+
1288+ //蠑輔″邂
1289+ sel->getSelPoints()->at(i).offset[0] = vpoint[0] - mx;
1290+ sel->getSelPoints()->at(i).offset[1] = vpoint[1] - my;
1291+ }
1292+
1293+ //邱 <en> lines
1294+ for(int i = 0; i < (int)sel->getSelLines()->size(); i ++){
1295+ line_data* line = get_line_data(sel->getSelLines()->at(i).index);
1296+ endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
1297+ endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
1298+ int vpointStart[2];
1299+ int vpointEnd[2];
1300+ hpl::aleph::map::getViewPointFromWorldPoint2D(begin->vertex, vpointStart,
1301+ woffsetX, woffsetY, div, voffsetX, voffsetY);
1302+ hpl::aleph::map::getViewPointFromWorldPoint2D(end->vertex, vpointEnd,
1303+ woffsetX, woffsetY, div, voffsetX, voffsetY);
1304+
1305+ //繧ェ繝輔そ繝?ヨ險ュ螳
1306+ sel->getSelLines()->at(i).offset[0][0] = vpointStart[0] - mx;
1307+ sel->getSelLines()->at(i).offset[0][1] = vpointStart[1] - my;
1308+ sel->getSelLines()->at(i).offset[1][0] = vpointEnd[0] - mx;
1309+ sel->getSelLines()->at(i).offset[1][1] = vpointEnd[1] - my;
1310+ }
1311+
1312+ //繝昴Μ繧エ繝ウ
1313+ for(int i = 0; i < (int)sel->getSelPolygons()->size(); i ++){
1314+ hpl::aleph::map::SelPolygon* selpoly = &sel->getSelPolygons()->at(i);
1315+ polygon_data* poly = get_polygon_data(selpoly->index);
1316+ int n = poly->vertex_count;
1317+ selpoly->num = n;
1318+ for(int j = 0; j < n; j ++){
1319+ int vpoint[2];
1320+ endpoint_data* ep = get_endpoint_data(poly->endpoint_indexes[j]);
1321+ hpl::aleph::map::getViewPointFromWorldPoint2D(ep->vertex, vpoint,
1322+ woffsetX, woffsetY, div, voffsetX, voffsetY);
1323+
1324+ //繧ェ繝輔そ繝?ヨ
1325+ selpoly->offset[j][0] = vpoint[0] - mx;
1326+ selpoly->offset[j][1] = vpoint[1] - my;
1327+ }
1328+ }
1329+
1330+ //繧ェ繝悶ず繧ァ繧ッ繝
1331+ for(int i = 0; i < (int)sel->getSelObjects()->size(); i ++){
1332+ map_object* obj = &SavedObjectList[sel->getSelObjects()->at(i).index];
1333+ //繝薙Η繝シ蠎ァ讓吶↓螟画鋤
1334+ int vpoint[2];
1335+ world_point2d worldP = {obj->location.x, obj->location.y};
1336+ hpl::aleph::map::getViewPointFromWorldPoint2D(worldP, vpoint,
1337+ woffsetX, woffsetY, div, voffsetX, voffsetY);
1338+
1339+ //蠑輔″邂
1340+ sel->getSelObjects()->at(i).offset[0] = vpoint[0] - mx;
1341+ sel->getSelObjects()->at(i).offset[1] = vpoint[1] - my;
1342+ }
1343+}
1344+
10511345 ////////////////////////////////////////////////
10521346 //////// objects ///////////////////////////////
10531347 /**
1054- 初期配置数の設定
1055- @param objectType オブジェクトタイプ
1348+ 蛻晄悄驟咲スョ謨ー縺ョ險ュ螳
1349+ @param objectType 繧ェ繝悶ず繧ァ繧ッ繝医ち繧、繝
10561350 _saved_item
10571351 _saved_monster
1058- @param index どのオブジェクトの初期は位置をいじるか
1059- @param num 増減させる値
1060- @return 増減の結果の数
1352+ @param index 縺ゥ縺ョ繧ェ繝悶ず繧ァ繧ッ繝医?蛻晄悄縺ッ菴咲スョ繧偵>縺倥k縺
1353+ @param num 蠅玲ク帙&縺帙k蛟、
1354+ @return 蠅玲ク帙?邨先棡縺ョ謨ー
10611355 */
10621356 int hpl::aleph::map::addInitialPlacementNum(int objectType, int index, int num)
10631357 {
@@ -1070,12 +1364,12 @@
10701364 }
10711365 }
10721366 /**
1073- 配置情報を取得
1074- @param objectType オブジェクトタイプ
1367+ 驟咲スョ諠??ア繧貞叙蠕
1368+ @param objectType 繧ェ繝悶ず繧ァ繧ッ繝医ち繧、繝
10751369 _saved_item
10761370 _saved_monster
1077- @param index どのオブジェクトの初期は位置をいじるか
1078- @return 配置情報。配置数やランダムマックスなど
1371+ @param index 縺ゥ縺ョ繧ェ繝悶ず繧ァ繧ッ繝医?蛻晄悄縺ッ菴咲スョ繧偵>縺倥k縺
1372+ @return 驟咲スョ諠??ア縲る?鄂ョ謨ー繧?Λ繝ウ繝?繝?繝槭ャ繧ッ繧ケ縺ェ縺ゥ
10791373 */
10801374 struct object_frequency_definition* hpl::aleph::map::getPlacementData(int objectType, int index)
10811375 {
--- marathon/trunk/HPLLib/HPLStockManager.cpp (revision 356)
+++ marathon/trunk/HPLLib/HPLStockManager.cpp (revision 357)
@@ -47,19 +47,19 @@
4747 void hpl::aleph::HPLStockManager::resizeDeletes()
4848 {
4949 //points
50- for(int i = delPoints.size(); i < dynamic_world->endpoint_count; i ++){
50+ for(int i = (int)delPoints.size(); i < dynamic_world->endpoint_count; i ++){
5151 delPoints.push_back(false);
5252 }
53- for(int i = delLines.size(); i < dynamic_world->line_count; i ++){
53+ for(int i = (int)delLines.size(); i < dynamic_world->line_count; i ++){
5454 delLines.push_back(false);
5555 }
56- for(int i = delSides.size(); i < dynamic_world->side_count; i ++){
56+ for(int i = (int)delSides.size(); i < dynamic_world->side_count; i ++){
5757 delSides.push_back(false);
5858 }
59- for(int i = delPolygons.size(); i < dynamic_world->polygon_count; i ++){
59+ for(int i = (int)delPolygons.size(); i < dynamic_world->polygon_count; i ++){
6060 delPolygons.push_back(false);
6161 }
62- for(int i = delObjects.size(); i < SavedObjectList.size(); i ++){
62+ for(int i = (int)delObjects.size(); i < (int)SavedObjectList.size(); i ++){
6363 delObjects.push_back(false);
6464 }
6565 }
@@ -296,6 +296,7 @@
296296 {
297297 assert(get_endpoint_data(index));
298298 this->delPoints[index] = true;
299+ updateDeletes();
299300 return true;
300301 }
301302 bool hpl::aleph::HPLStockManager::deleteLine(int index)
@@ -302,6 +303,7 @@
302303 {
303304 assert(get_line_data(index));
304305 this->delLines[index] = true;
306+ updateDeletes();
305307 return true;
306308 }
307309 bool hpl::aleph::HPLStockManager::deletePolygon(int index)
@@ -308,6 +310,7 @@
308310 {
309311 assert(get_polygon_data(index));
310312 this->delPolygons[index] = true;
313+ updateDeletes();
311314 return true;
312315 }
313316 bool hpl::aleph::HPLStockManager::deleteSide(int index)
@@ -314,6 +317,7 @@
314317 {
315318 assert(get_side_data(index));
316319 this->delSides[index] = true;
320+ updateDeletes();
317321 return true;
318322 }
319323 bool hpl::aleph::HPLStockManager::deleteObject(int index)
@@ -320,5 +324,6 @@
320324 {
321325 assert(index >= 0 && index < SavedObjectList.size());
322326 this->delObjects[index] = true;
327+ updateDeletes();
323328 return true;
324329 }
--- marathon/trunk/HPLLib/HPLMapTool.h (revision 356)
+++ marathon/trunk/HPLLib/HPLMapTool.h (revision 357)
@@ -11,9 +11,12 @@
1111
1212 //#include "HPLMath.h"
1313 #include "HPLSelectData.h"
14+//#include "HPLStockManager.h"
1415
16+namespace hpl{namespace aleph{
17+class HPLStockManager;
18+}};
1519
16-
1720 /*
1821 const int NUMBER_OF_POLYGON_TYPE = 24;
1922 const int NUMBER_OF_ZOOM_DIVISION = 3;
@@ -124,14 +127,17 @@
124127 /**
125128 指定した場所に点があるかどうかを得ます
126129 @param wpoint ワールド座標の点
127- @param threshold 点との距離がこれ以下ならば近いと見なす
130+ @param threshold 点との距離がこれ以下ならば近いと見なす。View座標系の距離を指定する
128131 @param zMin, zMax 高さチェック用
129132 @return その場所に点があればそのインデックスがかえります。
130133 なければNONE
131134 */
132- int getSelectPointIndex(world_point2d& wpoint, int thresholdWorld, int zMin, int zMax);
135+ int getSelectPointIndex(world_point2d& wpoint, int threshold,
136+ int zMin, int zMax, int div,
137+ hpl::aleph::HPLStockManager* smgr);
133138 int getSelectPointIndex(int viewX, int viewY, int threshold, int zMin, int zMax,
134- int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div);
139+ int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div,
140+ hpl::aleph::HPLStockManager* smgr);
135141
136142 /**
137143 ある高さが規定範囲内にあるかを確かめます
@@ -142,9 +148,11 @@
142148 /**
143149 指定した点が線を踏んでいる場合、その点
144150 */
145- int getSelectLineIndex(world_point2d& wpoint, int threshold, int zMin, int zMax);
151+ int getSelectLineIndex(world_point2d& wpoint, int threshold, int zMin, int zMax, int div,
152+ hpl::aleph::HPLStockManager* smgr);
146153 int getSelectLineIndex(int viewX, int viewY, int threshold, int zMin, int zMax,
147- int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div);
154+ int voffsetX, int voffsetY, int offsetXW, int offsetYW, int div,
155+ hpl::aleph::HPLStockManager* smgr);
148156
149157 /////////////////////// Lines ////////////////////////////////////////////
150158 /**
@@ -176,7 +184,7 @@
176184 */
177185 bool isSelectLine(world_point2d &point,
178186 world_point2d &linePoint0, world_point2d &linePoint1,
179- int distance);
187+ int distance, int div);
180188
181189 /**
182190 線の長さを取得
@@ -276,7 +284,9 @@
276284 @param wpoint 探索基点。ここを囲むポリゴンを探す
277285 @return ポリゴンの実データ候補。これを元に生成すると良い。データはcreatePolygonで生成すべし
278286 */
279- std::vector<polygon_data> searchValidPolygon(world_point2d wpoint);
287+ std::vector<polygon_data> searchValidPolygon(world_point2d wpoint,
288+ hpl::aleph::HPLStockManager* smgr,
289+ int zMin, int zMax);
280290
281291 /**
282292 二つの線が織り成す角度を求めます
@@ -287,12 +297,6 @@
287297 double getTwoLinesRadian(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2);
288298
289299 /**
290- ポリゴンデータを作ります
291- TODO
292- */
293- polygon_data createPolygon(int epindexes[8]);
294-
295- /**
296300 世界座標からポリゴンデータを作ります
297301 TODO 整合性
298302 @param points 世界座標
@@ -343,8 +347,7 @@
343347 /**
344348 簡略バージョン
345349 */
346- bool createPoint(world_point2d& wpoint, endpoint_data* ep,
347- int threshold);
350+ bool createPoint(world_point2d& wpoint, endpoint_data* ep);
348351 /**
349352 @param polyIndex 載せるポリゴンのインデックス
350353 */
@@ -401,6 +404,15 @@
401404 void addNewPolygon(world_distance points[][2], int n);
402405 void addNewPolygon(world_point2d points[], int n);
403406
407+ /**
408+ 選択データにオフセットを設定します。
409+ @param mx, my マウス座標
410+ @param sel 選択データ
411+ */
412+ void setupSelectDataGroupOffsets(int mx, int my,
413+ hpl::aleph::map::HPLSelectData* sel,
414+ int voffsetX, int voffsetY, int woffsetX, int woffsetY, int div);
415+
404416 ////////////////////////////////////////////////
405417 ////// objects ////////////////////////////////
406418 /**
旧リポジトリブラウザで表示