diff options
Diffstat (limited to 'tools/editor/plugins/spatial_editor_plugin.cpp')
-rw-r--r-- | tools/editor/plugins/spatial_editor_plugin.cpp | 234 |
1 files changed, 187 insertions, 47 deletions
diff --git a/tools/editor/plugins/spatial_editor_plugin.cpp b/tools/editor/plugins/spatial_editor_plugin.cpp index f0d0d53dd5..8f3f4dea8e 100644 --- a/tools/editor/plugins/spatial_editor_plugin.cpp +++ b/tools/editor/plugins/spatial_editor_plugin.cpp @@ -860,10 +860,19 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) { _edit.snap=false; _edit.mode=TRANSFORM_NONE; + //gizmo has priority over everything + bool can_select_gizmos=true; + + { + int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS); + can_select_gizmos = view_menu->get_popup()->is_item_checked( idx ); + } + + - if (spatial_editor->get_selected()) { + if (can_select_gizmos && spatial_editor->get_selected()) { Ref<SpatialEditorGizmo> seg = spatial_editor->get_selected()->get_gizmo(); if (seg.is_valid()) { @@ -1934,6 +1943,18 @@ void SpatialEditorViewport::_menu_option(int p_option) { view_menu->get_popup()->set_item_checked( idx, current ); } break; + case VIEW_GIZMOS: { + + int idx = view_menu->get_popup()->get_item_index(VIEW_GIZMOS); + bool current = view_menu->get_popup()->is_item_checked( idx ); + current=!current; + if (current) + camera->set_visible_layers( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+index))|(1<<GIZMO_EDIT_LAYER) ); + else + camera->set_visible_layers( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+index)) ); + view_menu->get_popup()->set_item_checked( idx, current ); + + } break; } @@ -2115,6 +2136,9 @@ void SpatialEditorViewport::reset() { cursor.distance=4; cursor.region_select=false; + + + } SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, EditorNode *p_editor, int p_index) { @@ -2139,7 +2163,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed 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_visible_layers( ((1<<20)-1)|(1<<(GIZMO_BASE_LAYER+p_index))|(1<<GIZMO_EDIT_LAYER) ); //camera->set_environment(SpatialEditor::get_singleton()->get_viewport_environment()); viewport->add_child(camera); camera->make_current(); @@ -2166,6 +2190,9 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed 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_check_item("Audio Listener",VIEW_AUDIO_LISTENER); + view_menu->get_popup()->add_separator(); + view_menu->get_popup()->add_check_item("Gizmos",VIEW_GIZMOS); + view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(VIEW_GIZMOS),true); view_menu->get_popup()->add_separator(); view_menu->get_popup()->add_item("Selection (F)",VIEW_CENTER_TO_SELECTION); @@ -2362,11 +2389,16 @@ Dictionary SpatialEditor::get_state() const { d["viewports"]=vpdata; d["default_light"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_LIGHT) );; + d["ambient_light_color"]=settings_ambient_color->get_color(); + + d["default_srgb"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_SRGB) );; d["show_grid"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID) );; d["show_origin"]=view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN) );; d["fov"]=get_fov(); d["znear"]=get_znear(); d["zfar"]=get_zfar(); + d["deflight_rot_x"]=settings_default_light_rot_x; + d["deflight_rot_y"]=settings_default_light_rot_y; return d; } @@ -2407,11 +2439,12 @@ void SpatialEditor::set_state(const Dictionary& p_state) { if (d.has("zfar")) - settings_zfar->set_text(d["zfar"]); + settings_zfar->set_val(float(d["zfar"])); if (d.has("znear")) - settings_znear->set_text(d["znear"]); + settings_znear->set_val(float(d["znear"])); if (d.has("fov")) - settings_fov->set_text(d["fov"]); + settings_fov->set_val(float(d["fov"])); + if (d.has("default_light")) { bool use = d["default_light"]; @@ -2429,7 +2462,17 @@ void SpatialEditor::set_state(const Dictionary& p_state) { } } + if (d.has("ambient_light_color")) { + settings_ambient_color->set_color(d["ambient_light_color"]); + viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,d["ambient_light_color"]); + } + + if (d.has("default_srgb")) { + bool use = d["default_light"]; + viewport_environment->set_enable_fx(Environment::FX_SRGB,use); + view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_USE_DEFAULT_SRGB), use ); + } if (d.has("show_grid")) { bool use = d["show_grid"]; @@ -2447,6 +2490,12 @@ void SpatialEditor::set_state(const Dictionary& p_state) { } } + if (d.has("deflight_rot_x")) + settings_default_light_rot_x=d["deflight_rot_x"]; + if (d.has("deflight_rot_y")) + settings_default_light_rot_y=d["deflight_rot_y"]; + + _update_default_light_angle(); } @@ -2609,11 +2658,29 @@ void SpatialEditor::_menu_item_pressed(int p_option) { } else { light_instance=VisualServer::get_singleton()->instance_create2(light,get_scene()->get_root()->get_world()->get_scenario()); VisualServer::get_singleton()->instance_set_transform(light_instance,light_transform); + + _update_default_light_angle(); } view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), light_instance.is_valid() ); } break; + case MENU_VIEW_USE_DEFAULT_SRGB: { + + bool is_checked = view_menu->get_popup()->is_item_checked( view_menu->get_popup()->get_item_index(p_option) ); + + if (is_checked) { + viewport_environment->set_enable_fx(Environment::FX_SRGB,false); + } else { + viewport_environment->set_enable_fx(Environment::FX_SRGB,true); + } + + is_checked = ! is_checked; + + view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(p_option), is_checked ); + + + } break; case MENU_VIEW_USE_1_VIEWPORT: { for(int i=1;i<4;i++) { @@ -2824,7 +2891,7 @@ void SpatialEditor::_menu_item_pressed(int p_option) { } break; case MENU_VIEW_CAMERA_SETTINGS: { - settings_dialog->popup_centered(Size2(200,160)); + settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size()+Size2(50,50)); } break; } @@ -3233,13 +3300,15 @@ void SpatialEditor::_notification(int p_what) { _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT); get_scene()->connect("node_removed",this,"_node_removed"); + VS::get_singleton()->scenario_set_fallback_environment(get_viewport()->find_world()->get_scenario(),viewport_environment->get_rid()); + } if (p_what==NOTIFICATION_ENTER_SCENE) { gizmos = memnew( SpatialEditorGizmos ); _init_indicators(); - + _update_default_light_angle(); } if (p_what==NOTIFICATION_EXIT_SCENE) { @@ -3374,7 +3443,8 @@ void SpatialEditor::_bind_methods() { // ObjectTypeDB::bind_method("_update_selection",&SpatialEditor::_update_selection); ObjectTypeDB::bind_method("_get_editor_data",&SpatialEditor::_get_editor_data); ObjectTypeDB::bind_method("_request_gizmo",&SpatialEditor::_request_gizmo); - + ObjectTypeDB::bind_method("_default_light_angle_input",&SpatialEditor::_default_light_angle_input); + ObjectTypeDB::bind_method("_update_ambient_light_color",&SpatialEditor::_update_ambient_light_color); ObjectTypeDB::bind_method("_toggle_maximize_view",&SpatialEditor::_toggle_maximize_view); ADD_SIGNAL( MethodInfo("transform_key_request") ); @@ -3384,9 +3454,9 @@ void SpatialEditor::_bind_methods() { void SpatialEditor::clear() { - settings_fov->set_text(EDITOR_DEF("3d_editor/default_fov",60.0)); - settings_znear->set_text(EDITOR_DEF("3d_editor/default_z_near",0.1)); - settings_zfar->set_text(EDITOR_DEF("3d_editor/default_z_far",1500.0)); + settings_fov->set_val(EDITOR_DEF("3d_editor/default_fov",60.0)); + settings_znear->set_val(EDITOR_DEF("3d_editor/default_z_near",0.1)); + settings_zfar->set_val(EDITOR_DEF("3d_editor/default_z_far",1500.0)); for(int i=0;i<4;i++) { viewports[i]->reset(); @@ -3410,11 +3480,54 @@ void SpatialEditor::clear() { viewports[i]->view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(SpatialEditorViewport::VIEW_AUDIO_LISTENER),i==0); viewports[i]->viewport->set_as_audio_listener(i==0); } + view_menu->get_popup()->set_item_checked( view_menu->get_popup()->get_item_index(MENU_VIEW_GRID), true ); + settings_default_light_rot_x=Math_PI*0.3; + settings_default_light_rot_y=Math_PI*0.2; + + viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,Color(0.15,0.15,0.15)); + settings_ambient_color->set_color(Color(0.15,0.15,0.15)); + if (!light_instance.is_valid()) + _menu_item_pressed(MENU_VIEW_USE_DEFAULT_LIGHT); + + _update_default_light_angle(); + + +} + + +void SpatialEditor::_update_ambient_light_color(const Color& p_color) { + + viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,settings_ambient_color->get_color()); + +} + +void SpatialEditor::_update_default_light_angle() { + + Transform t; + t.basis.rotate(Vector3(1,0,0),settings_default_light_rot_x); + t.basis.rotate(Vector3(0,1,0),settings_default_light_rot_y); + settings_dlight->set_transform(t); + if (light_instance.is_valid()) { + VS::get_singleton()->instance_set_transform(light_instance,t); + } + +} + +void SpatialEditor::_default_light_angle_input(const InputEvent& p_event) { + + + if (p_event.type==InputEvent::MOUSE_MOTION && p_event.mouse_motion.button_mask&(0x1|0x2|0x4)) { + + settings_default_light_rot_y = Math::fposmod(settings_default_light_rot_y - p_event.mouse_motion.relative_x*0.01,Math_PI*2.0); + settings_default_light_rot_x = Math::fposmod(settings_default_light_rot_x - p_event.mouse_motion.relative_y*0.01,Math_PI*2.0); + _update_default_light_angle(); + } } + SpatialEditor::SpatialEditor(EditorNode *p_editor) { @@ -3510,6 +3623,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { p = view_menu->get_popup(); p->add_check_item("Use Default Light",MENU_VIEW_USE_DEFAULT_LIGHT); + p->add_check_item("Use Default sRGB",MENU_VIEW_USE_DEFAULT_SRGB); p->add_separator(); p->add_check_item("1 Viewport",MENU_VIEW_USE_1_VIEWPORT,KEY_MASK_ALT+KEY_1); @@ -3612,42 +3726,68 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) { settings_dialog = memnew( ConfirmationDialog ); settings_dialog->set_title("Viewport Settings"); add_child(settings_dialog); - l = memnew(Label); - l->set_text("Perspective FOV (deg.):"); - l->set_pos(Point2(5,5)); - settings_dialog->add_child(l); - - settings_fov = memnew( LineEdit ); - settings_fov->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - settings_fov->set_begin( Point2(15,22) ); - settings_fov->set_end( Point2(15,35) ); - settings_fov->set_text(EDITOR_DEF("3d_editor/default_fov",60.0)); - settings_dialog->add_child(settings_fov); - - l = memnew(Label); - l->set_text("View Z-Near"); - l->set_pos(Point2(5,45)); - settings_dialog->add_child(l); - - settings_znear = memnew( LineEdit ); - settings_znear->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - settings_znear->set_begin( Point2(15,62) ); - settings_znear->set_end( Point2(15,75) ); - settings_znear->set_text(EDITOR_DEF("3d_editor/default_z_near",0.1)); - settings_dialog->add_child(settings_znear); - - - l = memnew(Label); - l->set_text("View Z-Far"); - l->set_pos(Point2(5,85)); - settings_dialog->add_child(l); - - settings_zfar = memnew( LineEdit ); - settings_zfar->set_anchor( MARGIN_RIGHT, ANCHOR_END ); - settings_zfar->set_begin( Point2(15,102) ); - settings_zfar->set_end( Point2(15,115) ); - settings_zfar->set_text(EDITOR_DEF("3d_editor/default_z_far",1500.0)); - settings_dialog->add_child(settings_zfar); + settings_vbc = memnew( VBoxContainer ); + settings_vbc->set_custom_minimum_size(Size2(200,0)); + settings_dialog->add_child(settings_vbc); + settings_dialog->set_child_rect(settings_vbc); + + + + settings_light_base = memnew( Control ); + settings_light_base->set_custom_minimum_size(Size2(128,128)); + settings_light_base->connect("input_event",this,"_default_light_angle_input"); + settings_vbc->add_margin_child("Default Light Normal:",settings_light_base); + settings_light_vp = memnew( Viewport ); + settings_light_vp->set_use_own_world(true); + settings_light_base->add_child(settings_light_vp); + + settings_dlight = memnew( DirectionalLight ); + settings_light_vp->add_child(settings_dlight); + settings_sphere = memnew( ImmediateGeometry ); + settings_sphere->begin(Mesh::PRIMITIVE_TRIANGLES,Ref<Texture>()); + settings_sphere->set_color(Color(1,1,1)); + settings_sphere->add_sphere(32,16,1); + settings_sphere->end(); + settings_light_vp->add_child(settings_sphere); + settings_camera = memnew( Camera ); + settings_light_vp->add_child(settings_camera); + settings_camera->set_translation(Vector3(0,0,2)); + settings_camera->set_orthogonal(2.1,0.1,5); + + settings_default_light_rot_x=Math_PI*0.3; + settings_default_light_rot_y=Math_PI*0.2; + + + + settings_ambient_color = memnew( ColorPickerButton ); + settings_vbc->add_margin_child("Ambient Light Color:",settings_ambient_color); + settings_ambient_color->connect("color_changed",this,"_update_ambient_light_color"); + + viewport_environment->set_enable_fx(Environment::FX_AMBIENT_LIGHT,true); + viewport_environment->fx_set_param(Environment::FX_PARAM_AMBIENT_LIGHT_COLOR,Color(0.15,0.15,0.15)); + settings_ambient_color->set_color(Color(0.15,0.15,0.15)); + + + settings_fov = memnew( SpinBox ); + settings_fov->set_max(179); + settings_fov->set_min(1); + settings_fov->set_step(0.01); + settings_fov->set_val(EDITOR_DEF("3d_editor/default_fov",60.0)); + settings_vbc->add_margin_child("Perspective FOV (deg.):",settings_fov); + + settings_znear = memnew( SpinBox ); + settings_znear->set_max(10000); + settings_znear->set_min(0.1); + settings_znear->set_step(0.01); + settings_znear->set_val(EDITOR_DEF("3d_editor/default_z_near",0.1)); + settings_vbc->add_margin_child("View Z-Near:",settings_znear); + + settings_zfar = memnew( SpinBox ); + settings_zfar->set_max(10000); + settings_zfar->set_min(0.1); + settings_zfar->set_step(0.01); + settings_zfar->set_val(EDITOR_DEF("3d_editor/default_z_far",1500)); + settings_vbc->add_margin_child("View Z-Far:",settings_zfar); //settings_dialog->get_cancel()->hide(); /* XFORM DIALOG */ |