-Massive clean up to gizmos

-Make sure handles are always visible (on top)
-Fixed instanced scene selection (should work properly now)
-Added interpolated camera
-Customizable gizmo colors in editor settings
This commit is contained in:
Juan Linietsky 2017-08-26 00:40:45 -03:00
parent d9e94fa0c3
commit 1894157c9f
31 changed files with 498 additions and 1732 deletions

View file

@ -63,17 +63,45 @@
#define MIN_FOV 0.01
#define MAX_FOV 179
void SpatialEditorViewport::_update_camera() {
void SpatialEditorViewport::_update_camera(float p_interp_delta) {
if (orthogonal) {
//camera->set_orthogonal(size.width*cursor.distance,get_znear(),get_zfar());
camera->set_orthogonal(2 * cursor.distance, 0.1, 8192);
} else
camera->set_perspective(get_fov(), get_znear(), get_zfar());
Transform camera_transform = to_camera_transform(cursor);
Transform new_transform = to_camera_transform(cursor);
Transform old_transform = camera->get_global_transform();
Transform transform;
if (camera->get_global_transform() != camera_transform) {
camera->set_global_transform(camera_transform);
if (p_interp_delta && Input::get_singleton()->get_mouse_button_mask() == 0) {
//interpolate
float interp_speed = 14; //maybe should be made configuration
transform = old_transform.interpolate_with(new_transform, MIN(1.0, p_interp_delta * interp_speed));
} else {
transform = new_transform;
}
float tolerance = 0.0001;
bool equal = true;
for (int i = 0; i < 3; i++) {
if (transform.basis[i].distance_to(old_transform.basis[i]) > tolerance) {
equal = false;
break;
}
}
if (equal && transform.origin.distance_to(old_transform.origin) > tolerance) {
equal = false;
}
if (equal) {
transform = new_transform;
}
if (!equal || p_interp_delta == 0) {
//print_line(transform);
camera->set_global_transform(transform);
update_transform_gizmo_view();
}
}
@ -257,14 +285,12 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2 &p_pos, bool p_append,
Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(pos, ray, get_tree()->get_root()->get_world()->get_scenario());
Set<Ref<SpatialEditorGizmo> > found_gizmos;
Node *edited_scene = get_tree()->get_edited_scene_root();
ObjectID closest = 0;
Spatial *item = NULL;
float closest_dist = 1e20;
int selected_handle = -1;
Vector<Spatial *> subscenes = Vector<Spatial *>();
Vector<Vector3> subscenes_positions = Vector<Vector3>();
for (int i = 0; i < instances.size(); i++) {
Spatial *spat = Object::cast_to<Spatial>(ObjectDB::get_instance(instances[i]));
@ -275,19 +301,6 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2 &p_pos, bool p_append,
Ref<SpatialEditorGizmo> seg = spat->get_gizmo();
if ((!seg.is_valid()) || found_gizmos.has(seg)) {
Node *subscene_candidate = spat;
Vector3 source_click_spatial_pos = spat->get_global_transform().origin;
while ((subscene_candidate->get_owner() != NULL) && (subscene_candidate->get_owner() != editor->get_edited_scene()))
subscene_candidate = subscene_candidate->get_owner();
spat = Object::cast_to<Spatial>(subscene_candidate);
if (spat && (spat->get_filename() != "") && (subscene_candidate->get_owner() != NULL)) {
subscenes.push_back(spat);
subscenes_positions.push_back(source_click_spatial_pos);
}
continue;
}
@ -307,32 +320,26 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2 &p_pos, bool p_append,
continue;
if (dist < closest_dist) {
closest = instances[i];
closest_dist = dist;
selected_handle = handle;
item = spat;
//make sure that whathever is selected is editable
while (spat && spat != edited_scene && spat->get_owner() != edited_scene && !edited_scene->is_editable_instance(spat->get_owner())) {
spat = Object::cast_to<Spatial>(spat->get_owner());
}
if (spat) {
item = spat;
closest = spat->get_instance_id();
closest_dist = dist;
selected_handle = handle;
} else {
ERR_PRINT("Bug?");
}
}
// if (editor_selection->is_selected(spat))
// r_includes_current=true;
}
for (int idx_subscene = 0; idx_subscene < subscenes.size(); idx_subscene++) {
Spatial *subscene = subscenes.get(idx_subscene);
float dist = ray.cross(subscenes_positions.get(idx_subscene) - pos).length();
if ((dist < 0) || (dist > 1.2))
continue;
if (dist < closest_dist) {
closest = subscene->get_instance_id();
closest_dist = dist;
item = subscene;
selected_handle = -1;
}
}
if (!item)
return 0;
@ -1678,7 +1685,7 @@ void SpatialEditorViewport::_notification(int p_what) {
set_process(visible);
if (visible)
_update_camera();
_update_camera(0);
call_deferred("update_transform_gizmo_view");
}
@ -1710,7 +1717,7 @@ void SpatialEditorViewport::_notification(int p_what) {
_update_freelook(delta);
_update_camera();
_update_camera(get_process_delta_time());
Map<Node *, Object *> &selection = editor_selection->get_selection();
@ -3677,7 +3684,7 @@ void SpatialEditor::_request_gizmo(Object *p_obj) {
Spatial *sp = Object::cast_to<Spatial>(p_obj);
if (!sp)
return;
if (editor->get_edited_scene() && (sp == editor->get_edited_scene() || sp->get_owner() == editor->get_edited_scene() || editor->get_edited_scene()->is_editable_instance(sp->get_owner()))) {
if (editor->get_edited_scene() && (sp == editor->get_edited_scene() || (sp->get_owner() && editor->get_edited_scene()->is_a_parent_of(sp)))) {
Ref<SpatialEditorGizmo> seg;
@ -3691,7 +3698,6 @@ void SpatialEditor::_request_gizmo(Object *p_obj) {
if (!seg.is_valid()) {
seg = gizmos->get_gizmo(sp);
}
if (seg.is_valid()) {
sp->set_gizmo(seg);
}