void SplitSelected() { if(ClipMode()) { UndoableCommand undo("clipperSplit"); SplitClip(); } }
void ClipSelected() { if(ClipMode()) { UndoableCommand undo("clipperClip"); Clip(); } }
void GridMapEditor::edit(GridMap *p_gridmap) { node=p_gridmap; VS *vs = VS::get_singleton(); last_mouseover=Vector3(-1,-1,-1); input_action=INPUT_NONE; selection.active=false; _update_selection_transform(); _update_duplicate_indicator(); spatial_editor = editor->get_editor_plugin_screen()->cast_to<SpatialEditorPlugin>(); if (!node) { set_process(false); for(int i=0;i<3;i++) { VisualServer::get_singleton()->instance_geometry_set_flag(grid_instance[i],VS::INSTANCE_FLAG_VISIBLE,false); } VisualServer::get_singleton()->instance_geometry_set_flag(cursor_instance, VS::INSTANCE_FLAG_VISIBLE,false); _clear_areas(); return; } update_pallete(); update_areas(); set_process(true); Vector3 edited_floor = p_gridmap->get_meta("_editor_floor_"); clip_mode=p_gridmap->has_meta("_editor_clip_")?ClipMode(p_gridmap->get_meta("_editor_clip_").operator int()):CLIP_DISABLED; for(int i=0;i<3;i++) { if (vs->mesh_get_surface_count(grid[i])>0) vs->mesh_remove_surface(grid[i],0); edit_floor[i]=edited_floor[i]; } { //update grids indicator_mat = VisualServer::get_singleton()->fixed_material_create(); VisualServer::get_singleton()->material_set_flag( indicator_mat, VisualServer::MATERIAL_FLAG_UNSHADED, true ); VisualServer::get_singleton()->material_set_flag( indicator_mat, VisualServer::MATERIAL_FLAG_ONTOP, false ); VisualServer::get_singleton()->fixed_material_set_param(indicator_mat,VisualServer::FIXED_MATERIAL_PARAM_DIFFUSE,Color(0.8,0.5,0.1)); VisualServer::get_singleton()->fixed_material_set_flag( indicator_mat, VisualServer::FIXED_MATERIAL_FLAG_USE_ALPHA, true ); VisualServer::get_singleton()->fixed_material_set_flag( indicator_mat, VisualServer::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY, true ); Vector<Vector3> grid_points[3]; Vector<Color> grid_colors[3]; float cell_size[3]={p_gridmap->get_cell_size(),p_gridmap->get_cell_size(),p_gridmap->get_cell_size()}; for(int i=0;i<3;i++) { Vector3 axis; axis[i]=1; Vector3 axis_n1; axis_n1[(i+1)%3]=cell_size[(i+1)%3]; Vector3 axis_n2; axis_n2[(i+2)%3]=cell_size[(i+2)%3]; for(int j=-GRID_CURSOR_SIZE;j<=GRID_CURSOR_SIZE;j++) { for(int k=-GRID_CURSOR_SIZE;k<=GRID_CURSOR_SIZE;k++) { Vector3 p = axis_n1*j + axis_n2 *k; float trans = Math::pow(MAX(0,1.0-(Vector2(j,k).length()/GRID_CURSOR_SIZE)),2); Vector3 pj = axis_n1*(j+1) + axis_n2 *k; float transj = Math::pow(MAX(0,1.0-(Vector2(j+1,k).length()/GRID_CURSOR_SIZE)),2); Vector3 pk = axis_n1*j + axis_n2 *(k+1); float transk = Math::pow(MAX(0,1.0-(Vector2(j,k+1).length()/GRID_CURSOR_SIZE)),2); grid_points[i].push_back(p); grid_points[i].push_back(pk); grid_colors[i].push_back(Color(1,1,1,trans)); grid_colors[i].push_back(Color(1,1,1,transk)); grid_points[i].push_back(p); grid_points[i].push_back(pj); grid_colors[i].push_back(Color(1,1,1,trans)); grid_colors[i].push_back(Color(1,1,1,transj)); } } Array d; d.resize(VS::ARRAY_MAX); d[VS::ARRAY_VERTEX]=grid_points[i]; d[VS::ARRAY_COLOR]=grid_colors[i]; VisualServer::get_singleton()->mesh_add_surface(grid[i],VisualServer::PRIMITIVE_LINES,d); VisualServer::get_singleton()->mesh_surface_set_material(grid[i],0,indicator_mat); } } update_grid(); _update_clip(); _update_areas_display(); }
void GridMapEditor::_menu_option(int p_option) { switch(p_option) { case MENU_OPTION_CONFIGURE: { } break; case MENU_OPTION_LOCK_VIEW: { int index=options->get_popup()->get_item_index(MENU_OPTION_LOCK_VIEW); lock_view=!options->get_popup()->is_item_checked(index); options->get_popup()->set_item_checked(index,lock_view); } break; case MENU_OPTION_CLIP_DISABLED: case MENU_OPTION_CLIP_ABOVE: case MENU_OPTION_CLIP_BELOW: { clip_mode=ClipMode(p_option-MENU_OPTION_CLIP_DISABLED); for(int i=0;i<3;i++) { int index=options->get_popup()->get_item_index(MENU_OPTION_CLIP_DISABLED+i); options->get_popup()->set_item_checked(index,i==clip_mode); } _update_clip(); } break; case MENU_OPTION_X_AXIS: case MENU_OPTION_Y_AXIS: case MENU_OPTION_Z_AXIS: { int new_axis = p_option-MENU_OPTION_X_AXIS; for(int i=0;i<3;i++) { int idx=options->get_popup()->get_item_index(MENU_OPTION_X_AXIS+i); options->get_popup()->set_item_checked(idx,i==new_axis); } edit_axis=Vector3::Axis(new_axis); update_grid(); _update_clip(); } break; case MENU_OPTION_CURSOR_ROTATE_Y: { Basis r; if (input_action==INPUT_DUPLICATE) { r.set_orthogonal_index(selection.duplicate_rot); r.rotate(Vector3(0,1,0),-Math_PI/2.0); selection.duplicate_rot=r.get_orthogonal_index(); _update_duplicate_indicator(); break; } r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(0,1,0),-Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_ROTATE_X: { Basis r; if (input_action==INPUT_DUPLICATE) { r.set_orthogonal_index(selection.duplicate_rot); r.rotate(Vector3(1,0,0),-Math_PI/2.0); selection.duplicate_rot=r.get_orthogonal_index(); _update_duplicate_indicator(); break; } r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(1,0,0),-Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_ROTATE_Z: { Basis r; if (input_action==INPUT_DUPLICATE) { r.set_orthogonal_index(selection.duplicate_rot); r.rotate(Vector3(0,0,1),-Math_PI/2.0); selection.duplicate_rot=r.get_orthogonal_index(); _update_duplicate_indicator(); break; } r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(0,0,1),-Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_BACK_ROTATE_Y: { Basis r; r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(0,1,0),Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_BACK_ROTATE_X: { Basis r; r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(1,0,0),Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_BACK_ROTATE_Z: { Basis r; r.set_orthogonal_index(cursor_rot); r.rotate(Vector3(0,0,1),Math_PI/2.0); cursor_rot=r.get_orthogonal_index(); _update_cursor_transform(); } break; case MENU_OPTION_CURSOR_CLEAR_ROTATION: { if (input_action==INPUT_DUPLICATE) { selection.duplicate_rot=0; _update_duplicate_indicator(); break; } cursor_rot=0; _update_cursor_transform(); } break; case MENU_OPTION_DUPLICATE_SELECTS: { int idx = options->get_popup()->get_item_index(MENU_OPTION_DUPLICATE_SELECTS); options->get_popup()->set_item_checked( idx, !options->get_popup()->is_item_checked( idx ) ); } break; case MENU_OPTION_SELECTION_MAKE_AREA: case MENU_OPTION_SELECTION_MAKE_EXTERIOR_CONNECTOR: { if (!selection.active) break; int area = node->get_unused_area_id(); Error err = node->create_area(area,Rect3(selection.begin,selection.end-selection.begin+Vector3(1,1,1))); if (err!=OK) { } if (p_option==MENU_OPTION_SELECTION_MAKE_EXTERIOR_CONNECTOR) { node->area_set_exterior_portal(area,true); } _update_areas_display(); update_areas(); } break; case MENU_OPTION_REMOVE_AREA: { if (selected_area<1) return; node->erase_area(selected_area); _update_areas_display(); update_areas(); } break; case MENU_OPTION_SELECTION_DUPLICATE: if (!(selection.active && input_action==INPUT_NONE)) return; if (last_mouseover==Vector3(-1,-1,-1)) //nono mouseovering anythin break; input_action=INPUT_DUPLICATE; selection.click=last_mouseover; selection.current=last_mouseover; selection.duplicate_rot=0; _update_duplicate_indicator(); break; case MENU_OPTION_SELECTION_CLEAR: { if (!selection.active) return; _delete_selection(); } break; case MENU_OPTION_GRIDMAP_SETTINGS: { settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size() + Size2(50, 50)); } break; } }