1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-12 13:20:55 +00:00

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.
This commit is contained in:
Juan Linietsky
2014-05-04 22:50:23 -03:00
parent 3c17e0c915
commit 72ae89c5aa
36 changed files with 3222 additions and 2360 deletions

View File

@@ -53,6 +53,7 @@ void SpatialGizmoTool::clear() {
}
billboard_handle=false;
collision_segments.clear();
collision_mesh=Ref<TriangleMesh>();
instances.clear();
@@ -103,10 +104,39 @@ void SpatialGizmoTool::add_lines(const Vector<Vector3> &p_lines, const Ref<Mater
Ref<Mesh> mesh = memnew( Mesh );
Array a;
a.resize(Mesh::ARRAY_MAX);
a[Mesh::ARRAY_VERTEX]=p_lines;
DVector<Color> color;
color.resize(p_lines.size());
{
DVector<Color>::Write w = color.write();
for(int i=0;i<p_lines.size();i++) {
if (is_selected())
w[i]=Color(1,1,1,0.6);
else
w[i]=Color(1,1,1,0.25);
}
}
a[Mesh::ARRAY_COLOR]=color;
mesh->add_surface(Mesh::PRIMITIVE_LINES,a);
mesh->surface_set_material(0,p_material);
if (p_billboard) {
float md=0;
for(int i=0;i<p_lines.size();i++) {
md=MAX(0,p_lines[i].length());
}
if (md) {
mesh->set_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<Material>& 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;i<vs.size();i++) {
md=MAX(0,vs[i].length());
}
if (md) {
mesh->set_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<Vector3> &p_lines) {
void SpatialGizmoTool::add_handles(const Vector<Vector3> &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> mesh = memnew( Mesh );
#if 1
@@ -190,11 +235,35 @@ void SpatialGizmoTool::add_handles(const Vector<Vector3> &p_handles, bool p_bill
Array a;
a.resize(VS::ARRAY_MAX);
a[VS::ARRAY_VERTEX]=p_handles;
DVector<Color> colors;
{
colors.resize(p_handles.size());
DVector<Color>::Write w=colors.write();
for(int i=0;i<p_handles.size();i++) {
Color col(1,1,1,1);
if (SpatialEditor::get_singleton()->get_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;i<p_handles.size();i++) {
md=MAX(0,p_handles[i].length());
}
if (md) {
mesh->set_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<SpatialEditorGizmo> SpatialEditorGizmos::get_gizmo(Spatial *p_spatial) {
return Ref<SpatialEditorGizmo>();
}
Ref<FixedMaterial> SpatialEditorGizmos::create_line_material(const Color& p_base_color) {
Ref<FixedMaterial> line_material = Ref<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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<FixedMaterial>( 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));
}