From 72ae89c5aa8da9110ec8f89e5558d5d04935f3b5 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Sun, 4 May 2014 22:50:23 -0300 Subject: Lots of 3D improvements: -Object Manipulator Gizmo keeps proper scale in all windows and projections, (configurable on settings too). -Manipulator gizmos for other objects (camera, shapes, etc) massively improved and bug-fixed. -Manipulator gizmos are different for edited object and other objects. -Properly highlight manipulator gizmo handles when hovered. -Fixed bugs in fragment program when using more than 1 light together. -Reload png/jpg files automatically in editor if edited externally. -Added 4-stages Parallel Split Shadow Mapping, to improve shadow quality in large scenarios -Added PCF13 to improve smoothness of shadow borders -General optimization of directional light shadow mapping for Orthogonal,PSM and PSSM. -Fixed normal mapping when importing DAE files, works nicely now. --- tools/editor/spatial_editor_gizmos.cpp | 184 +++++++++++++++++++-------------- 1 file changed, 109 insertions(+), 75 deletions(-) (limited to 'tools/editor/spatial_editor_gizmos.cpp') diff --git a/tools/editor/spatial_editor_gizmos.cpp b/tools/editor/spatial_editor_gizmos.cpp index b62ac00e7..71a5ae3d3 100644 --- a/tools/editor/spatial_editor_gizmos.cpp +++ b/tools/editor/spatial_editor_gizmos.cpp @@ -53,6 +53,7 @@ void SpatialGizmoTool::clear() { } + billboard_handle=false; collision_segments.clear(); collision_mesh=Ref(); instances.clear(); @@ -103,10 +104,39 @@ void SpatialGizmoTool::add_lines(const Vector &p_lines, const Ref mesh = memnew( Mesh ); Array a; a.resize(Mesh::ARRAY_MAX); + a[Mesh::ARRAY_VERTEX]=p_lines; + + DVector color; + color.resize(p_lines.size()); + { + DVector::Write w = color.write(); + for(int i=0;iadd_surface(Mesh::PRIMITIVE_LINES,a); mesh->surface_set_material(0,p_material); + if (p_billboard) { + float md=0; + for(int i=0;iset_custom_aabb(AABB(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0)); + } + } ins.billboard=p_billboard; ins.mesh=mesh; @@ -145,6 +175,17 @@ void SpatialGizmoTool::add_unscaled_billboard(const Ref& p_material,fl mesh->add_surface(Mesh::PRIMITIVE_TRIANGLE_FAN,a); mesh->surface_set_material(0,p_material); + if (true) { + float md=0; + for(int i=0;iset_custom_aabb(AABB(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0)); + } + } ins.mesh=mesh; ins.unscaled=true; @@ -177,12 +218,16 @@ void SpatialGizmoTool::add_collision_segments(const Vector &p_lines) { void SpatialGizmoTool::add_handles(const Vector &p_handles, bool p_billboard,bool p_secondary){ + billboard_handle=p_billboard; + + if (!is_selected()) + return; + ERR_FAIL_COND(!spatial_node); ERR_FAIL_COND(!spatial_node); Instance ins; - billboard_handle=p_billboard; Ref mesh = memnew( Mesh ); #if 1 @@ -190,11 +235,35 @@ void SpatialGizmoTool::add_handles(const Vector &p_handles, bool p_bill Array a; a.resize(VS::ARRAY_MAX); a[VS::ARRAY_VERTEX]=p_handles; + DVector colors; + { + colors.resize(p_handles.size()); + DVector::Write w=colors.write(); + for(int i=0;iget_over_gizmo_handle()!=i) + col=Color(0.9,0.9,0.9,0.9); + w[i]=col; + } + + } + a[VS::ARRAY_COLOR]=colors; mesh->add_surface(Mesh::PRIMITIVE_POINTS,a); - if (!p_secondary) - mesh->surface_set_material(0,SpatialEditorGizmos::singleton->handle2_material); - else - mesh->surface_set_material(0,SpatialEditorGizmos::singleton->handle2_secondary_material); + mesh->surface_set_material(0,SpatialEditorGizmos::singleton->handle2_material); + + if (p_billboard) { + float md=0; + for(int i=0;iset_custom_aabb(AABB(Vector3(-md,-md,-md),Vector3(md,md,md)*2.0)); + } + } + #else @@ -467,6 +536,9 @@ bool SpatialGizmoTool::intersect_ray(const Camera *p_camera,const Point2& p_poin int vc=collision_segments.size(); const Vector3* vptr=collision_segments.ptr(); Transform t = spatial_node->get_global_transform(); + if (billboard_handle) { + t.set_look_at(t.origin,t.origin+p_camera->get_transform().basis.get_axis(2),p_camera->get_transform().basis.get_axis(1)); + } Vector3 cp; float cpd=1e20; @@ -507,7 +579,7 @@ bool SpatialGizmoTool::intersect_ray(const Camera *p_camera,const Point2& p_poin } } - if (cpd<5) { + if (cpd<8) { r_pos=cp; r_normal=-p_camera->project_ray_normal(p_point); @@ -520,6 +592,11 @@ bool SpatialGizmoTool::intersect_ray(const Camera *p_camera,const Point2& p_poin if (collision_mesh.is_valid()) { Transform gt = spatial_node->get_global_transform(); + + if (billboard_handle) { + gt.set_look_at(gt.origin,gt.origin+p_camera->get_transform().basis.get_axis(2),p_camera->get_transform().basis.get_axis(1)); + } + Transform ai=gt.affine_inverse(); Vector3 ray_from = ai.xform(p_camera->project_ray_origin(p_point)); Vector3 ray_dir=ai.basis.xform(p_camera->project_ray_normal(p_point)).normalized(); @@ -815,6 +892,7 @@ void LightSpatialGizmo::redraw() { } add_lines(points,SpatialEditorGizmos::singleton->light_material,true); + add_collision_segments(points); add_unscaled_billboard(SpatialEditorGizmos::singleton->light_material_omni_icon,0.05); @@ -2117,6 +2195,20 @@ Ref SpatialEditorGizmos::get_gizmo(Spatial *p_spatial) { return Ref(); } + +Ref SpatialEditorGizmos::create_line_material(const Color& p_base_color) { + + Ref line_material = Ref( memnew( FixedMaterial )); + line_material->set_flag(Material::FLAG_UNSHADED, true); + line_material->set_line_width(3.0); + line_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); + line_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true); + line_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,p_base_color); + + return line_material; + +} + SpatialEditorGizmos::SpatialEditorGizmos() { singleton=this; @@ -2133,15 +2225,9 @@ SpatialEditorGizmos::SpatialEditorGizmos() { handle2_material->set_texture(FixedMaterial::PARAM_DIFFUSE,handle_t); handle2_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1)); handle2_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); + handle2_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true); - handle2_secondary_material = handle2_material->duplicate(); - handle2_secondary_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,.5)); - - light_material = Ref( memnew( FixedMaterial )); - light_material->set_flag(Material::FLAG_UNSHADED, true); - light_material->set_line_width(3.0); - light_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - light_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,0.2,0.3)); + light_material = create_line_material(Color(1,1,0.2)); light_material_omni_icon = Ref( memnew( FixedMaterial )); light_material_omni_icon->set_flag(Material::FLAG_UNSHADED, true); @@ -2160,22 +2246,10 @@ SpatialEditorGizmos::SpatialEditorGizmos() { light_material_directional_icon->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,0.9)); light_material_directional_icon->set_texture(FixedMaterial::PARAM_DIFFUSE,SpatialEditor::get_singleton()->get_icon("GizmoDirectionalLight","EditorIcons")); - camera_material = Ref( memnew( FixedMaterial )); - camera_material->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.5,1.0,0.7) ); - camera_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - camera_material->set_line_width(3); - camera_material->set_flag(Material::FLAG_DOUBLE_SIDED,true); - camera_material->set_flag(Material::FLAG_UNSHADED,true); - camera_material->set_hint(Material::HINT_NO_DEPTH_DRAW,true); + camera_material = create_line_material(Color(1.0,0.5,1.0)); - - skeleton_material=Ref( memnew( FixedMaterial )); - - //skeleton_material->set_parameter( FixedMaterial::PARAM_DIFFUSE,Color(0.6,1.0,0.3,0.1) ); - skeleton_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - skeleton_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true); - skeleton_material->set_line_width(3); + skeleton_material = create_line_material(Color(0.6,1.0,0.3)); skeleton_material->set_flag(Material::FLAG_DOUBLE_SIDED,true); skeleton_material->set_flag(Material::FLAG_UNSHADED,true); skeleton_material->set_flag(Material::FLAG_ONTOP,true); @@ -2224,48 +2298,11 @@ SpatialEditorGizmos::SpatialEditorGizmos() { sample_player_icon->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1,1,1,0.9)); sample_player_icon->set_texture(FixedMaterial::PARAM_DIFFUSE,SpatialEditor::get_singleton()->get_icon("GizmoSpatialSamplePlayer","EditorIcons")); - room_material = Ref( memnew( FixedMaterial )); - room_material->set_flag(Material::FLAG_UNSHADED, true); - room_material->set_flag(Material::FLAG_DOUBLE_SIDED, true); - //room_material->set_hint(Material::HINT_NO_DEPTH_DRAW, true); - room_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - room_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.6,0.9,0.8)); - room_material->set_line_width(3); - - portal_material = Ref( memnew( FixedMaterial )); - portal_material->set_flag(Material::FLAG_UNSHADED, true); - portal_material->set_flag(Material::FLAG_DOUBLE_SIDED, true); - //portal_material->set_hint(Material::HINT_NO_DEPTH_DRAW, true); - portal_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - portal_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.8,0.6,0.8)); - portal_material->set_line_width(3); - - - raycast_material = Ref( memnew( FixedMaterial )); - raycast_material->set_flag(Material::FLAG_UNSHADED, true); - raycast_material->set_flag(Material::FLAG_DOUBLE_SIDED, true); - //raycast_material->set_hint(Material::HINT_NO_DEPTH_DRAW, true); - raycast_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - raycast_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.8,0.6,0.8)); - raycast_material->set_line_width(3); - - car_wheel_material = Ref( memnew( FixedMaterial )); - car_wheel_material->set_flag(Material::FLAG_UNSHADED, true); - car_wheel_material->set_flag(Material::FLAG_DOUBLE_SIDED, true); - //car_wheel_material->set_hint(Material::HINT_NO_DEPTH_DRAW, true); - car_wheel_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - car_wheel_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(0.6,0.8,1.0,0.8)); - car_wheel_material->set_line_width(3); - - - - visibility_notifier_material = Ref( memnew( FixedMaterial )); - visibility_notifier_material->set_flag(Material::FLAG_UNSHADED, true); - visibility_notifier_material->set_flag(Material::FLAG_DOUBLE_SIDED, true); - //visibility_notifier_material->set_hint(Material::HINT_NO_DEPTH_DRAW, true); - visibility_notifier_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - visibility_notifier_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(1.0,0.5,1.0,0.8)); - visibility_notifier_material->set_line_width(3); + room_material = create_line_material(Color(1.0,0.6,0.9)); + portal_material = create_line_material(Color(1.0,0.8,0.6)); + raycast_material = create_line_material(Color(1.0,0.8,0.6)); + car_wheel_material = create_line_material(Color(0.6,0.8,1.0)); + visibility_notifier_material = create_line_material(Color(1.0,0.5,1.0)); stream_player_icon = Ref( memnew( FixedMaterial )); stream_player_icon->set_flag(Material::FLAG_UNSHADED, true); @@ -2326,11 +2363,8 @@ SpatialEditorGizmos::SpatialEditorGizmos() { test_cube_tm->create(vertices); } + shape_material = create_line_material(Color(0.2,1,1.0)); - shape_material = Ref( memnew( FixedMaterial )); - shape_material->set_flag(Material::FLAG_UNSHADED, true); - shape_material->set_line_width(3.0); - shape_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true); - shape_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,Color(0.2,1,1.0,0.3)); } + -- cgit v1.2.3-70-g09d2