diff options
Diffstat (limited to 'tools/editor/plugins/spatial_editor_plugin.cpp')
| -rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.cpp | 363 |
1 files changed, 294 insertions, 69 deletions
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index 98108c2de..78df6ffa0 100644 --- a/tools/editor/plugins/spatial_editor_plugin.cpp +++ b/tools/editor/plugins/spatial_editor_plugin.cpp @@ -38,7 +38,7 @@ #include "tools/editor/editor_settings.h" #include "scene/resources/surface_tool.h" #include "tools/editor/spatial_editor_gizmos.h" - +#include "globals.h" #define DISTANCE_DEFAULT 4 @@ -81,7 +81,7 @@ bool SpatialEditorGizmo::intersect_ray(const Camera *p_camera, const Point2 &p_p SpatialEditorGizmo::SpatialEditorGizmo(){ - + selected=false; } @@ -288,7 +288,7 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2& p_pos, bool p_append,b Vector3 normal; int handle=-1; - bool inters = seg->intersect_ray(camera,p_pos,point,normal,&handle,p_alt_select); + bool inters = seg->intersect_ray(camera,p_pos,point,normal,NULL,p_alt_select); if (!inters) continue; @@ -553,7 +553,8 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2& p_screenpos,bool p_hili Plane cplane(ray_pos,cn.normalized()); Transform gt = spatial_editor->get_gizmo_transform(); - float gs=0; + float gs=gizmo_scale; + /* if (orthogonal) { gs= cursor.distance/surface->get_size().get_aspect(); @@ -562,7 +563,7 @@ bool SpatialEditorViewport::_gizmo_select(const Vector2& p_screenpos,bool p_hili } gs*=GIZMO_SCALE_DEFAULT; - +*/ if (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_MOVE) { @@ -689,10 +690,16 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { case BUTTON_WHEEL_UP: { + cursor.distance/=1.08; + if (cursor.distance<0.001) + cursor.distance=0.001; + } break; case BUTTON_WHEEL_DOWN: { + if (cursor.distance<0.001) + cursor.distance=0.001; cursor.distance*=1.08; } break; @@ -855,6 +862,29 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { //gizmo has priority over everything + + if (spatial_editor->get_selected()) { + + Ref<SpatialEditorGizmo> seg = spatial_editor->get_selected()->get_gizmo(); + if (seg.is_valid()) { + int handle=-1; + Vector3 point; + Vector3 normal; + bool inters = seg->intersect_ray(camera,_edit.mouse_pos,point,normal,&handle,b.mod.shift); + if (inters && handle!=-1) { + + _edit.gizmo=seg; + _edit.gizmo_handle=handle; + //_edit.gizmo_initial_pos=seg->get_handle_pos(gizmo_handle); + _edit.gizmo_initial_value=seg->get_handle_value(handle); + break; + + } + } + } + + + if (_gizmo_select(_edit.mouse_pos)) break; @@ -1012,7 +1042,35 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { const InputEventMouseMotion &m=p_event.mouse_motion; _edit.mouse_pos=Point2(p_event.mouse_motion.x,p_event.mouse_motion.y); - if (!(m.button_mask&1) && !_edit.gizmo.is_valid()) { + + if (spatial_editor->get_selected()) { + + + Ref<SpatialEditorGizmo> seg = spatial_editor->get_selected()->get_gizmo(); + if (seg.is_valid()) { + + int selected_handle=-1; + + int handle=-1; + Vector3 point; + Vector3 normal; + bool inters = seg->intersect_ray(camera,_edit.mouse_pos,point,normal,&handle,false); + if (inters && handle!=-1) { + + selected_handle=handle; + + } + + if (selected_handle!=spatial_editor->get_over_gizmo_handle()) { + spatial_editor->set_over_gizmo_handle(selected_handle); + spatial_editor->get_selected()->update_gizmo(); + if (selected_handle!=-1) + spatial_editor->select_gizmo_hilight_axis(-1); + } + } + } + + if (spatial_editor->get_over_gizmo_handle()==-1 && !(m.button_mask&1) && !_edit.gizmo.is_valid()) { _gizmo_select(_edit.mouse_pos,true); @@ -1114,7 +1172,6 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { Transform r; r.basis.scale(Vector3(scale,scale,scale)); - List<Node*> &selection = editor_selection->get_selected_node_list(); for(List<Node*>::Element *E=selection.front();E;E=E->next()) { @@ -1436,6 +1493,7 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { orthogonal = !orthogonal; _menu_option(orthogonal?VIEW_PERSPECTIVE:VIEW_ORTHOGONAL); + } break; case KEY_K: { @@ -1466,7 +1524,13 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { } break; case KEY_F: { - _menu_option(VIEW_CENTER_TO_SELECTION); + + if (k.pressed && k.mod.shift && k.mod.control) { + _menu_option(VIEW_ALIGN_SELECTION_WITH_VIEW); + } else if (k.pressed) { + _menu_option(VIEW_CENTER_TO_SELECTION); + } + } break; case KEY_SPACE: { @@ -1500,6 +1564,13 @@ void SpatialEditorViewport::_notification(int p_what) { bool visible=is_visible(); set_process(visible); + call_deferred("update_transform_gizmo_view"); + } + + if (p_what==NOTIFICATION_RESIZED) { + + call_deferred("update_transform_gizmo_view"); + } if (p_what==NOTIFICATION_PROCESS) { @@ -1534,7 +1605,7 @@ void SpatialEditorViewport::_notification(int p_what) { if (camera->get_global_transform()!=camera_transform) { camera->set_global_transform( camera_transform ); - //_update_transform_gizmo_view(); + update_transform_gizmo_view(); } Map<Node*,Object*> &selection = editor_selection->get_selection(); @@ -1637,6 +1708,7 @@ void SpatialEditorViewport::_notification(int p_what) { surface->connect("input_event",this,"_sinput"); surface->connect("mouse_enter",this,"_smouseenter"); preview_camera->set_icon(get_icon("Camera","EditorIcons")); + _init_gizmo_instance(index); } @@ -1687,6 +1759,41 @@ void SpatialEditorViewport::_draw() { } + if (previewing) { + + + Size2 ss = Size2( Globals::get_singleton()->get("display/width"), Globals::get_singleton()->get("display/height") ); + float aspect = ss.get_aspect(); + Size2 s = get_size(); + + Rect2 draw_rect; + + + switch(previewing->get_keep_aspect_mode()) { + case Camera::KEEP_WIDTH: { + + draw_rect.size = Size2(s.width,s.width/aspect); + draw_rect.pos.x=0; + draw_rect.pos.y=(s.height-draw_rect.size.y)*0.5; + + } break; + case Camera::KEEP_HEIGHT: { + + draw_rect.size = Size2(s.height*aspect,s.height); + draw_rect.pos.y=0; + draw_rect.pos.x=(s.width-draw_rect.size.x)*0.5; + + } break; + } + + draw_rect = Rect2(Vector2(),s).clip(draw_rect); + + surface->draw_line(draw_rect.pos,draw_rect.pos+Vector2(draw_rect.size.x,0),Color(0.6,0.6,0.1,0.5),2.0); + surface->draw_line(draw_rect.pos+Vector2(draw_rect.size.x,0),draw_rect.pos+draw_rect.size,Color(0.6,0.6,0.1,0.5),2.0); + surface->draw_line(draw_rect.pos+draw_rect.size,draw_rect.pos+Vector2(0,draw_rect.size.y),Color(0.6,0.6,0.1,0.5),2.0); + surface->draw_line(draw_rect.pos,draw_rect.pos+Vector2(0,draw_rect.size.y),Color(0.6,0.6,0.1,0.5),2.0); + } + } @@ -1757,6 +1864,34 @@ void SpatialEditorViewport::_menu_option(int p_option) { cursor.pos=center; } break; + case VIEW_ALIGN_SELECTION_WITH_VIEW: { + + if (!get_selected_count()) + break; + + Transform camera_transform = camera->get_global_transform(); + + List<Node*> &selection = editor_selection->get_selected_node_list(); + + undo_redo->create_action("Align with view"); + for(List<Node*>::Element *E=selection.front();E;E=E->next()) { + + Spatial *sp = E->get()->cast_to<Spatial>(); + if (!sp) + continue; + + SpatialEditorSelectedItem *se=editor_selection->get_node_editor_data<SpatialEditorSelectedItem>(sp); + if (!se) + continue; + + Vector3 original_scale = sp->get_scale(); + sp->set_global_transform(camera_transform); + sp->set_scale(original_scale); + undo_redo->add_do_method(sp,"set_global_transform",sp->get_global_transform()); + undo_redo->add_undo_method(sp,"set_global_transform",se->original); + } + undo_redo->commit_action(); + } break; case VIEW_ENVIRONMENT: { int idx = view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT); @@ -1779,12 +1914,15 @@ void SpatialEditorViewport::_menu_option(int p_option) { view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), true ); view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), false ); orthogonal=false; + call_deferred("update_transform_gizmo_view"); + } break; case VIEW_ORTHOGONAL: { view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_PERSPECTIVE), false ); view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ORTHOGONAL), true ); orthogonal=true; + call_deferred("update_transform_gizmo_view"); } break; @@ -1801,6 +1939,30 @@ void SpatialEditorViewport::_preview_exited_scene() { } +void SpatialEditorViewport::_init_gizmo_instance(int p_idx) { + + uint32_t layer=1<<(GIZMO_BASE_LAYER+p_idx); + + for(int i=0;i<3;i++) { + move_gizmo_instance[i]=VS::get_singleton()->instance_create(); + VS::get_singleton()->instance_set_base(move_gizmo_instance[i],spatial_editor->get_move_gizmo(i)->get_rid()); + VS::get_singleton()->instance_set_scenario(move_gizmo_instance[i],get_scene()->get_root()->get_world()->get_scenario()); + VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,false); + //VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true); + VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_CAST_SHADOW,false); + VS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i],layer); + + rotate_gizmo_instance[i]=VS::get_singleton()->instance_create(); + VS::get_singleton()->instance_set_base(rotate_gizmo_instance[i],spatial_editor->get_rotate_gizmo(i)->get_rid()); + VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i],get_scene()->get_root()->get_world()->get_scenario()); + VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,false); + //VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true); + VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_CAST_SHADOW,false); + VS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i],layer); + } + +} + void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) { @@ -1815,6 +1977,7 @@ void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) { if (!preview) preview_camera->hide(); view_menu->show(); + surface->update(); } else { @@ -1822,6 +1985,7 @@ void SpatialEditorViewport::_toggle_camera_preview(bool p_activate) { previewing->connect("exit_scene",this,"_preview_exited_scene"); VS::get_singleton()->viewport_attach_camera( viewport->get_viewport(), preview->get_camera() ); //replace view_menu->hide(); + surface->update(); } } @@ -1840,6 +2004,43 @@ void SpatialEditorViewport::set_can_preview(Camera* p_preview) { } } +void SpatialEditorViewport::update_transform_gizmo_view() { + + if (!is_visible()) + return; + + Transform xform = spatial_editor->get_gizmo_transform(); + + + Transform camera_xform = camera->get_transform(); + Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized(); + Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized(); + Plane p(camera_xform.origin,camz); + float gizmo_d = Math::abs( p.distance_to(xform.origin )); + float d0 = camera->unproject_position(camera_xform.origin+camz*gizmo_d).y; + float d1 = camera->unproject_position(camera_xform.origin+camz*gizmo_d+camy).y; + float dd = Math::abs(d0-d1); + if (dd==0) + dd=0.0001; + + float gsize = EditorSettings::get_singleton()->get("3d_editor/manipulator_gizmo_size"); + gizmo_scale=(gsize/Math::abs(dd)); + Vector3 scale = Vector3(1,1,1) * gizmo_scale; + + xform.basis.scale(scale); + + //xform.basis.scale(GIZMO_SCALE_DEFAULT*Vector3(1,1,1)); + + + for(int i=0;i<3;i++) { + VisualServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], xform ); + VisualServer::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,spatial_editor->is_gizmo_visible()&& (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_MOVE) ); + VisualServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], xform ); + VisualServer::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode()==SpatialEditor::TOOL_MODE_ROTATE) ); + } + +} + void SpatialEditorViewport::set_state(const Dictionary& p_state) { cursor.pos=p_state["pos"]; @@ -1879,6 +2080,7 @@ void SpatialEditorViewport::_bind_methods(){ ObjectTypeDB::bind_method(_MD("_menu_option"),&SpatialEditorViewport::_menu_option); ObjectTypeDB::bind_method(_MD("_toggle_camera_preview"),&SpatialEditorViewport::_toggle_camera_preview); ObjectTypeDB::bind_method(_MD("_preview_exited_scene"),&SpatialEditorViewport::_preview_exited_scene); + ObjectTypeDB::bind_method(_MD("update_transform_gizmo_view"),&SpatialEditorViewport::update_transform_gizmo_view); ADD_SIGNAL( MethodInfo("toggle_maximize_view", PropertyInfo(Variant::OBJECT, "viewport")) ); } @@ -1886,8 +2088,9 @@ void SpatialEditorViewport::_bind_methods(){ -SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor,EditorNode *p_editor) { +SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, EditorNode *p_editor, int p_index) { + index=p_index; editor=p_editor; editor_selection=editor->get_editor_selection();; undo_redo=editor->get_undo_redo(); @@ -1907,6 +2110,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor,Edi surface->set_area_as_parent_rect(); camera = memnew(Camera); camera->set_disable_gizmo(true); + camera->set_visible_layers( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+p_index)) ); //camera->set_environment(SpatialEditor::get_singleton()->get_viewport_environment()); viewport->add_child(camera); camera->make_current(); @@ -1932,7 +2136,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor,Edi view_menu->get_popup()->add_check_item("Environment",VIEW_ENVIRONMENT); view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT),true); view_menu->get_popup()->add_separator(); - view_menu->get_popup()->add_item("Selection",VIEW_CENTER_TO_SELECTION); + view_menu->get_popup()->add_item("Selection (F)",VIEW_CENTER_TO_SELECTION); + view_menu->get_popup()->add_item("Align with view (Ctrl+Shift+F)",VIEW_ALIGN_SELECTION_WITH_VIEW); view_menu->get_popup()->connect("item_pressed",this,"_menu_option"); preview_camera = memnew( Button ); @@ -1945,6 +2150,8 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor,Edi preview_camera->connect("toggled",this,"_toggle_camera_preview"); previewing=NULL; preview=NULL; + gizmo_scale=1.0; + EditorSettings::get_singleton()->connect("settings_changed",this,"update_transform_gizmo_view"); } @@ -1963,39 +2170,6 @@ SpatialEditorSelectedItem::~SpatialEditorSelectedItem() { } -void SpatialEditor::_update_transform_gizmo_view() { - - - Transform xform = gizmo.transform; - -/* - Transform camera_xform = camera->get_transform(); - Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized(); - Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized(); - Plane p(camera_xform.origin,camz); - float gizmo_d = Math::abs( p.distance_to(xform.origin )); - float d0 = camera->unproject_position(camera_xform.origin+camz*gizmo_d).y; - float d1 = camera->unproject_position(camera_xform.origin+camz*gizmo_d+camy).y; - float dd = Math::abs(d0-d1); - if (dd==0) - dd=0.0001; - - gizmo.scale=(60.0/Math::abs(dd)); - Vector3 scale = Vector3(1,1,1) * gizmo.scale; - - //xform.basis.scale(scale); -*/ - xform.basis.scale(GIZMO_SCALE_DEFAULT*Vector3(1,1,1)); - - - for(int i=0;i<3;i++) { - VisualServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], xform ); - VisualServer::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,gizmo.visible && (tool_mode==TOOL_MODE_SELECT || tool_mode==TOOL_MODE_MOVE) ); - VisualServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[i], xform ); - VisualServer::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,gizmo.visible && (tool_mode==TOOL_MODE_SELECT || tool_mode==TOOL_MODE_ROTATE) ); - } - -} void SpatialEditor::select_gizmo_hilight_axis(int p_axis) { @@ -2048,7 +2222,9 @@ void SpatialEditor::update_transform_gizmo() { gizmo.transform.origin=pcenter; gizmo.transform.basis=gizmo_basis; - _update_transform_gizmo_view(); + for(int i=0;i<4;i++) { + viewports[i]->update_transform_gizmo_view(); + } } @@ -2212,8 +2388,7 @@ void SpatialEditor::set_state(const Dictionary& p_state) { bool use = d["show_grid"]; if (use!=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID))) { - view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), use ); - grid_enabled=use; + _menu_item_pressed(MENU_VIEW_GRID); } } @@ -2233,6 +2408,28 @@ void SpatialEditor::set_state(const Dictionary& p_state) { void SpatialEditor::edit(Spatial *p_spatial) { + if (p_spatial!=selected) { + if (selected) { + + Ref<SpatialEditorGizmo> seg = selected->get_gizmo(); + if (seg.is_valid()) { + seg->set_selected(false); + selected->update_gizmo(); + } + } + + selected=p_spatial; + over_gizmo_handle=-1; + + if (selected) { + + Ref<SpatialEditorGizmo> seg = selected->get_gizmo(); + if (seg.is_valid()) { + seg->set_selected(true); + selected->update_gizmo(); + } + } + } if (p_spatial) { //_validate_selection(); @@ -2498,6 +2695,13 @@ void SpatialEditor::_menu_item_pressed(int p_option) { grid_enabled=!is_checked; + for(int i=0;i<3;++i) { + if (grid_enable[i]) { + VisualServer::get_singleton()->instance_geometry_set_flag(grid_instance[i],VS::INSTANCE_FLAG_VISIBLE,grid_enabled); + grid_visible[i]=grid_enabled; + } + } + view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), grid_enabled ); @@ -2645,31 +2849,18 @@ void SpatialEditor::_init_indicators() { //move gizmo + float gizmo_alph = EditorSettings::get_singleton()->get("3d_editor/manipulator_gizmo_opacity"); + gizmo_hl = Ref<FixedMaterial>( memnew( FixedMaterial ) ); gizmo_hl->set_flag(Material::FLAG_UNSHADED, true); gizmo_hl->set_flag(Material::FLAG_ONTOP, true); gizmo_hl->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - gizmo_hl->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,0.4)); + gizmo_hl->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,gizmo_alph+0.2f)); for(int i=0;i<3;i++) { move_gizmo[i]=Ref<Mesh>( memnew( Mesh ) ); - move_gizmo_instance[i]=VS::get_singleton()->instance_create(); - VS::get_singleton()->instance_set_base(move_gizmo_instance[i],move_gizmo[i]->get_rid()); - VS::get_singleton()->instance_set_scenario(move_gizmo_instance[i],get_scene()->get_root()->get_world()->get_scenario()); - VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,false); - VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true); - VS::get_singleton()->instance_geometry_set_flag(move_gizmo_instance[i],VS::INSTANCE_FLAG_CAST_SHADOW,false); - - - rotate_gizmo[i]=Ref<Mesh>( memnew( Mesh ) ); - rotate_gizmo_instance[i]=VS::get_singleton()->instance_create(); - VS::get_singleton()->instance_set_base(rotate_gizmo_instance[i],rotate_gizmo[i]->get_rid()); - VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i],get_scene()->get_root()->get_world()->get_scenario()); - VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_VISIBLE,false); - VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_DEPH_SCALE,true); - VS::get_singleton()->instance_geometry_set_flag(rotate_gizmo_instance[i],VS::INSTANCE_FLAG_CAST_SHADOW,false); Ref<FixedMaterial> mat = memnew( FixedMaterial ); @@ -2678,7 +2869,7 @@ void SpatialEditor::_init_indicators() { mat->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); Color col; col[i]=1.0; - col.a=0.2; + col.a= gizmo_alph; mat->set_parameter(FixedMaterial::PARAM_DIFFUSE,col); gizmo_color[i]=mat; @@ -2795,6 +2986,10 @@ void SpatialEditor::_init_indicators() { } } + /*for(int i=0;i<4;i++) { + + viewports[i]->init_gizmo_instance(i); + }*/ _generate_selection_box(); @@ -2928,6 +3123,7 @@ void SpatialEditor::_notification(int p_what) { _init_indicators(); } + if (p_what==NOTIFICATION_EXIT_SCENE) { _finish_indicators(); @@ -2969,14 +3165,29 @@ void SpatialEditor::_request_gizmo(Object* p_obj) { Ref<SpatialEditorGizmo> seg = gizmos->get_gizmo(sp); - if (seg.is_valid()) + if (seg.is_valid()) { sp->set_gizmo(seg); + } for (List<EditorPlugin*>::Element *E=gizmo_plugins.front();E;E=E->next()) { - if (E->get()->create_spatial_gizmo(sp)) + if (E->get()->create_spatial_gizmo(sp)) { + + seg = sp->get_gizmo(); + if (sp==selected && seg.is_valid()) { + + seg->set_selected(true); + selected->update_gizmo(); + } return; + } } + + if (seg.is_valid() && sp==selected) { + seg->set_selected(true); + selected->update_gizmo(); + } + } } @@ -3023,11 +3234,18 @@ void SpatialEditor::_toggle_maximize_view(Object* p_viewport) { } + +void SpatialEditor::_node_removed(Node* p_node) { + + if (p_node==selected) + selected=NULL; +} + void SpatialEditor::_bind_methods() { // ObjectTypeDB::bind_method("_input_event",&SpatialEditor::_input_event); ObjectTypeDB::bind_method("_unhandled_key_input",&SpatialEditor::_unhandled_key_input); - //ObjectTypeDB::bind_method("_node_removed",&SpatialEditor::_node_removed); + ObjectTypeDB::bind_method("_node_removed",&SpatialEditor::_node_removed); ObjectTypeDB::bind_method("_menu_item_pressed",&SpatialEditor::_menu_item_pressed); ObjectTypeDB::bind_method("_xform_dialog_action",&SpatialEditor::_xform_dialog_action); ObjectTypeDB::bind_method("_instance_scene",&SpatialEditor::_instance_scene); @@ -3178,7 +3396,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { viewport_base->set_v_size_flags(SIZE_EXPAND_FILL); for(int i=0;i<4;i++) { - viewports[i] = memnew( SpatialEditorViewport(this,editor) ); + viewports[i] = memnew( SpatialEditorViewport(this,editor,i) ); viewports[i]->connect("toggle_maximize_view",this,"_toggle_maximize_view"); viewport_base->add_child(viewports[i]); } @@ -3333,9 +3551,16 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { scenario_debug=VisualServer::SCENARIO_DEBUG_DISABLED; + selected=NULL; set_process_unhandled_key_input(true); add_to_group("_spatial_editor_group"); + + EDITOR_DEF("3d_editor/manipulator_gizmo_size",80); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT,"3d_editor/manipulator_gizmo_size",PROPERTY_HINT_RANGE,"16,1024,1")); + EDITOR_DEF("3d_editor/manipulator_gizmo_opacity",0.2); + + over_gizmo_handle=-1; } SpatialEditor::~SpatialEditor() { @@ -3366,7 +3591,7 @@ void SpatialEditorPlugin::make_visible(bool p_visible) { } void SpatialEditorPlugin::edit(Object *p_object) { - + spatial_editor->edit(p_object->cast_to<Spatial>()); } |
