aboutsummaryrefslogtreecommitdiff
path: root/tools/editor/plugins/spatial_editor_plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/editor/plugins/spatial_editor_plugin.cpp')
-rw-r--r--tools/editor/plugins/spatial_editor_plugin.cpp363
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>());
}