• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン340 (tree)
日時2007-06-21 01:45:19
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 339)
+++ marathon/trunk/MapEditorWX/src/MainFrameEvent.cpp (revision 340)
@@ -411,16 +411,7 @@
411411 int div = wxGetApp().getViewGridManager()->getZoomDivision();
412412
413413 //重なる点があるかどうかチェック
414- int pointIndex = NONE;
415- for(int i = 0; i < (int)EndpointList.size(); i ++){
416- endpoint_data* ep = get_endpoint_data(i);
417- if(hpl::aleph::map::isSelectPoint(mx, my, ep->vertex.x, ep->vertex.y,
418- voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD, div, POINT_DISTANCE_EPSILON))
419- {
420- pointIndex = i;
421- break;
422- }
423- }
414+ int pointIndex = hpl::aleph::map::getSelectPointIndex(wpoint, POINT_DISTANCE_EPSILON);
424415 //重なる線があるか判定する
425416
426417 if(pointIndex != NONE)
@@ -440,13 +431,25 @@
440431 if(isFirst){
441432 //最初のクリック
442433 //始点とする
443- //wxGetApp().prevPointIndex =
434+ wxGetApp().prevPointIndex = pointIndex;
435+
444436 }else{
445437 //2回目以降のクリック
446- //同じ点をクリックしていたら何もしない
447- //TODO
448- //でなけば線を作成する
449- //TODO
438+ //同じ点をクリックしているか?
439+ if(wxGetApp().prevPointIndex == pointIndex){
440+ //始点とする
441+ }else{
442+ //既に線が存在しているか?
443+ int lineIndex = hpl::aleph::map::getLineIndexFromTwoLPoints(
444+ wxGetApp().prevPointIndex, pointIndex);
445+ if(lineIndex != NONE){
446+ //何もせず現在の点を始点とする
447+ wxGetApp().prevPointIndex = pointIndex;
448+ }else{
449+ //でなけば線を作成する
450+ //TODO
451+ }
452+ }
450453 }
451454
452455 //中継点・始点・終点にする
@@ -799,10 +802,15 @@
799802 //ポリゴン整合性チェックカウント
800803 updatePolygonValidityCount ++;
801804
802- if(updatePolygonValidityCount >= UPDATE_POLYGON_VALIDITY_INTERVAL){
803- //TODO
804- }
805+
806+ int mx = ev.m_x;
807+ int my = ev.m_y;
805808 if(ev.ButtonIsDown(wxMOUSE_BTN_LEFT)){
809+ if(updatePolygonValidityCount >= UPDATE_POLYGON_VALIDITY_INTERVAL){
810+ //ポリゴン整合性
811+ //TODO
812+ }
813+
806814 //左ボタンを押しながら動いている
807815 bool shift = ev.ShiftDown();
808816 bool ctrl = ev.ControlDown();
@@ -812,7 +820,8 @@
812820 if(ctrl ||
813821 editModeType == EditModeType::EM_DRAW && toolType == ToolType::TI_HAND)
814822 {
815-
823+ //オフセット移動
824+ moveMapOffset(mx, my);
816825 }
817826 #else
818827
@@ -823,6 +832,9 @@
823832 if(ctrl ||
824833 editModeType == EditModeType::EM_DRAW && toolType == ToolType::TI_HAND)
825834 {
835+ //コントロール押しながら、
836+ //あるいはハンドツールでD&D
837+ //→オフセット移動
826838 this->moveMapOffset(ev.m_x, ev.m_y);
827839 }else{
828840 //Ctrl押さない
@@ -861,6 +873,13 @@
861873
862874 #endif
863875 Refresh();
876+ }else{
877+ //押していない状態
878+ if(editModeType == EditModeType::EM_DRAW &&
879+ wxGetApp().getEventManager()->getToolType() == ToolType::TI_LINE)
880+ {
881+ this->doMouseMotionOnLineTool(ev);
882+ }
864883 }
865884
866885 //更新
@@ -880,7 +899,8 @@
880899 doMouseMotionOnHandTool(ev);
881900 break;
882901 case ToolType::TI_LINE:
883- doMouseMotionOnLineTool(ev);
902+ //線ツールはD&Dは考慮しない
903+ //doMouseMotionOnLineTool(ev);
884904 break;
885905 case ToolType::TI_MAGNIFY:
886906 doMouseMotionOnMagnifyTool(ev);
@@ -904,6 +924,60 @@
904924 //ここですることはない
905925
906926 //もし選択中のマップアイテムがあれば、それらを移動させる
927+
928+ //選択情報
929+ hpl::aleph::map::HPLSelectData* sel = &wxGetApp().selectData;
930+
931+ hpl::aleph::view::HPLViewGridManager* vmgr = wxGetApp().getViewGridManager();
932+ int div = vmgr->getZoomDivision();
933+
934+ if(sel->isSelected()){
935+ //選択中
936+ //選択物の移動
937+
938+ //ワールド座標系にする
939+ world_point2d wmp = wxGetApp().getWorldPointFromViewPoint(mx, my);
940+
941+ //点
942+ for(int i = 0; i < (int)sel->getSelPoints()->size(); i ++){
943+ struct hpl::aleph::map::SelPoint* selp = &sel->getSelPoints()->at(i);
944+ //位置変更
945+ get_endpoint_data(selp->index)->vertex.x = wmp.x + selp->offset[0] * div;
946+ get_endpoint_data(selp->index)->vertex.y = wmp.x + selp->offset[1] * div;
947+ }
948+
949+ //線
950+ for(int i = 0; i < (int)sel->getSelLines()->size(); i ++){
951+ struct hpl::aleph::map::SelLine* sell = &sel->getSelLines()->at(i);
952+ int index = sell->index;
953+ line_data* line = get_line_data(index);
954+ for(int j = 0; j < 2; j ++){
955+ get_endpoint_data(line->endpoint_indexes[j])->vertex.x =
956+ wmp.x + sell->offset[j][0] * div;
957+ get_endpoint_data(line->endpoint_indexes[j])->vertex.y =
958+ wmp.y + sell->offset[j][1] * div;
959+ }
960+ }
961+
962+ //ポリゴン
963+ for(int i = 0; i < (int)sel->getSelPolygons()->size(); i ++){
964+ struct hpl::aleph::map::SelPolygon* selp = &sel->getSelPolygons()->at(i);
965+ polygon_data* poly = get_polygon_data(selp->index);
966+ for(int j = 0; j < selp->num; j ++){
967+ get_endpoint_data(poly->endpoint_indexes[j])->vertex.x =
968+ wmp.x + selp->offset[j][0] * div;
969+ get_endpoint_data(poly->endpoint_indexes[j])->vertex.y =
970+ wmp.y + selp->offset[j][1] * div;
971+ }
972+ }
973+
974+ //オブジェクト
975+ for(int i = 0; i < (int)sel->getSelObjects()->size(); i ++){
976+ struct hpl::aleph::map::SelObject* selo = &sel->getSelObjects()->at(i);
977+ SavedObjectList[selo->index].location.x = wmp.x + selo->offset[0] * div;
978+ SavedObjectList[selo->index].location.y = wmp.y + selo->offset[1] * div;
979+ }
980+ }
907981 }
908982 void MapEditorMainFrame::doMouseMotionOnFillTool(wxMouseEvent& ev)
909983 {
@@ -910,9 +984,37 @@
910984 }
911985 void MapEditorMainFrame::doMouseMotionOnHandTool(wxMouseEvent& ev)
912986 {
987+ //移動
988+ this->moveMapOffset(ev.m_x, ev.m_y);
913989 }
914990 void MapEditorMainFrame::doMouseMotionOnLineTool(wxMouseEvent& ev)
915991 {
992+ //点を踏んでいないか確認
993+ int endpointIndex = NONE;
994+ bool found = false;
995+ world_point2d wmp = wxGetApp().getWorldPointFromViewPoint(ev.m_x, ev.m_y);
996+ for(int i = 0; i < (int)EndpointList.size(); i ++){
997+ endpoint_data* ep = get_endpoint_data(i);
998+ if(!wxGetApp().getViewGridManager()->isValidHeight(
999+ ep->highest_adjacent_floor_height, ep->lowest_adjacent_ceiling_height)
1000+ {
1001+ continue;
1002+ }
1003+
1004+ if(hpl::aleph::map::isSelectPoint(ev.m_x, ev.m_y, ep->vertex.x, ep->vertex.y,
1005+ voffset[0], voffset[1], OFFSET_X_WORLD, OFFSET_Y_WORLD, div, POINT_DISTANCE_EPSILON))
1006+ {
1007+ wxGetApp().isNowOnThePoint = true;
1008+ found = true;
1009+ break;
1010+ }
1011+ }
1012+ if(!found){
1013+ wxGetApp().isNowOnThePoint = false;
1014+
1015+ //線の上にいるかどうか?
1016+ //TODO
1017+ }
9161018 }
9171019 void MapEditorMainFrame::doMouseMotionOnMagnifyTool(wxMouseEvent& ev)
9181020 {
--- marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 339)
+++ marathon/trunk/MapEditorWX/src/MapEditorWX.h (revision 340)
@@ -181,6 +181,10 @@
181181 //プリセットで追加するポリゴンの頂点数
182182 int presetPolygonVertexCount;
183183
184+ //現在のポイントは点の上にあるか?
185+ //ただし、高さ範囲の外にある場合考慮しない
186+ bool isNowOnThePoint;
187+ bool isNowOnTheLine;
184188 private:
185189
186190 ///////////////////////
--- marathon/trunk/HPLLib/HPLMapTool.cpp (revision 339)
+++ marathon/trunk/HPLLib/HPLMapTool.cpp (revision 340)
@@ -127,6 +127,23 @@
127127 dest[0] = (point.x + offsetXWorld)/zoomDivision + offsetx;
128128 dest[1] = (point.y + offsetYWorld)/zoomDivision + offsety;
129129 }
130+/**
131+ 指定した場所に点があるかどうかを得ます
132+ @return その場所に点があればそのインデックスがかえります。
133+ なければNONE
134+*/
135+int hpl::aleph::map::getSelectPointIndex(world_point2d& wpoint, int threshold)
136+{
137+ int pointIndex = NONE;
138+ for(int i = 0; i < (int)EndpointList.size(); i ++){
139+ endpoint_data* ep = get_endpoint_data(i);
140+ if(hpl::aleph::map::isSelectPoint(wpoint, ep->vertex, threshold)){
141+ pointIndex = i;
142+ break;
143+ }
144+ }
145+ return pointIndex;
146+}
130147
131148 /////////////////////// Lines ////////////////////////////////////////////
132149
@@ -841,6 +858,52 @@
841858 return index;
842859 }
843860
861+/**
862+ 簡略バージョン
863+*/
864+bool hpl::aleph::map::createPoint(world_point2d& wpoint, endpoint_data* ep,
865+ int threshold)
866+{
867+ //TODO
868+ ep->flags = POINT_FLAG_SOLID;
869+ ep->vertex.x = wpoint.x;
870+ ep->vertex.y = wpoint.y;
871+
872+ //他の点を踏んでいないか確認
873+ int pIndex = hpl::aleph::map::getSelectPointIndex(wpoint, threshold);
874+ if(pIndex != NONE){
875+ //踏んでる
876+ //→作成できない
877+ return false;
878+ }
879+ ep->highest_adjacent_floor_height = 0;
880+ ep->lowest_adjacent_ceiling_height = WORLD_ONE;
881+ ep->supporting_polygon_index = NONE;
882+ return true;
883+}
884+/**
885+ @param polyIndex 載せるポリゴンのインデックス
886+*/
887+bool hpl::aleph::map::createObject(worldpoint2d& wpoint, int polyIndex, map_object* obj,
888+ int flags)
889+{
890+ //TODO
891+ obj->polygon_index = polygonIndex;
892+ obj->location.x = wpoint.x;
893+ obj->location.y = wpoint.y;
894+ polygon_data* poly = get_polygon_data(polygonIndex);
895+ if(poly == NULL){
896+ return false;
897+ }
898+ //TODO flag?
899+ if(flags & _map_object_hanging_from_ceiling){
900+ obj->location.z = poly->ceiling_height;
901+ }else{
902+ obj->location.z = poly->floor_height;
903+ }
904+ obj->flags = flags;
905+}
906+
844907 bool hpl::aleph::map::createLine(int beginPointIndex, int endPointIndex, line_data* line)
845908 {
846909 endpoint_data* begin = get_endpoint_data(beginPointIndex);
@@ -854,7 +917,7 @@
854917 line->counterclockwise_polygon_side_index = NONE;
855918 line->endpoint_indexes[0] = beginPointIndex;
856919 line->endpoint_indexes[1] = endPointIndex;
857- line->flags = 0;
920+ line->flags = SOLID_LINE_BIT;
858921 //TODO 点のうち高い方のフロア高度
859922 line->highest_adjacent_floor = 0;
860923 return true;
--- marathon/trunk/HPLLib/HPLMapTool.h (revision 339)
+++ marathon/trunk/HPLLib/HPLMapTool.h (revision 340)
@@ -121,6 +121,13 @@
121121 void getViewPointFromWorldPoint2D(world_point2d& point, int *dest,
122122 int offsetXWorld, int offsetYWorld, int zoomDivision, int offsetx, int offsety);
123123
124+ /**
125+ 指定した場所に点があるかどうかを得ます
126+ @return その場所に点があればそのインデックスがかえります。
127+ なければNONE
128+ */
129+ int getSelectPointIndex(world_point2d& wpoint, int threshold);
130+
124131 /////////////////////// Lines ////////////////////////////////////////////
125132 /**
126133 指定した点を用いたときに線を選択できているかを判定
@@ -307,6 +314,17 @@
307314 int addAnnotation(map_annotation annotation);
308315
309316 /**
317+ 簡略バージョン
318+ */
319+ bool createPoint(world_point2d& wpoint, endpoint_data* ep,
320+ int threshold);
321+ /**
322+ @param polyIndex 載せるポリゴンのインデックス
323+ */
324+ bool createObject(worldpoint2d& wpoint, int polyIndex, map_object* obj,
325+ int flags);
326+
327+ /**
310328 既存の点を用いて線やポリゴンを作成します
311329 <en> create new line and polygon with points already exist
312330 */
旧リポジトリブラウザで表示