diff options
| -rw-r--r-- | core/io/file_access_pack.cpp | 9 | ||||
| -rw-r--r-- | drivers/unix/packet_peer_udp_posix.cpp | 2 | ||||
| -rw-r--r-- | editor/editor_export.cpp | 143 | ||||
| -rw-r--r-- | editor/editor_export.h | 5 | ||||
| -rw-r--r-- | editor/editor_node.cpp | 31 | ||||
| -rw-r--r-- | editor/editor_node.h | 3 | ||||
| -rw-r--r-- | editor/editor_settings.cpp | 7 | ||||
| -rw-r--r-- | editor/import/resource_importer_obj.cpp | 7 | ||||
| -rw-r--r-- | editor/plugins/spatial_editor_plugin.cpp | 231 | ||||
| -rw-r--r-- | editor/plugins/spatial_editor_plugin.h | 9 | ||||
| -rw-r--r-- | editor/project_export.cpp | 2 | ||||
| -rw-r--r-- | editor/script_editor_debugger.cpp | 32 | ||||
| -rw-r--r-- | platform/javascript/os_javascript.cpp | 35 | ||||
| -rw-r--r-- | platform/javascript/os_javascript.h | 1 | ||||
| -rw-r--r-- | platform/windows/packet_peer_udp_winsock.cpp | 2 | ||||
| -rw-r--r-- | scene/gui/tree.cpp | 2 | 
16 files changed, 292 insertions, 229 deletions
diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index bb942b54d7..79aa39521f 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -440,13 +440,12 @@ Error DirAccessPack::change_dir(String p_dir) {  String DirAccessPack::get_current_dir() { -	String p;  	PackedData::PackedDir *pd = current; -	while (pd->parent) { +	String p = current->name; -		if (pd != current) -			p = "/" + p; -		p = p + pd->name; +	while (pd->parent) { +		pd = pd->parent; +		p = pd->name + "/" + p;  	}  	return "res://" + p; diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp index 5dbccd4b63..74ceb3946a 100644 --- a/drivers/unix/packet_peer_udp_posix.cpp +++ b/drivers/unix/packet_peer_udp_posix.cpp @@ -216,6 +216,8 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) {  		len = sizeof(struct sockaddr_storage);  		++queue_count; +		if (p_wait) +			break;  	};  	// TODO: Should ECONNRESET be handled here? diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 4796640a3d..3774c8d4c3 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -321,7 +321,7 @@ Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_pat  	return OK;  } -String EditorExportPlatform::find_export_template(String template_file_name) const { +String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {  	String base_name = itos(VERSION_MAJOR) + "." + itos(VERSION_MINOR) + "-" + _MKSTR(VERSION_STATUS) + "/" + template_file_name;  	String user_file = EditorSettings::get_singleton()->get_settings_path() + "/templates/" + base_name; @@ -342,9 +342,20 @@ String EditorExportPlatform::find_export_template(String template_file_name) con  			return system_file;  		}  	} -	print_line("none,sorry"); -	return String(); //not found +	// Not found +	if (err) { +		*err += "No export template found at \"" + user_file + "\""; +		if (has_system_path) +			*err += "\n or \"" + system_file + "\"."; +		else +			*err += "."; +	} +	return String(); // not found +} + +bool EditorExportPlatform::exists_export_template(String template_file_name, String *err) const { +	return find_export_template(template_file_name, err) != "";  }  Ref<EditorExportPreset> EditorExportPlatform::create_preset() { @@ -925,19 +936,47 @@ Ref<Texture> EditorExportPlatformPC::get_logo() const {  bool EditorExportPlatformPC::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { -	r_missing_templates = false; +	String err; +	bool valid = true; + +	if (use64 && (!exists_export_template(debug_file_64, &err) || !exists_export_template(release_file_64, &err))) { +		valid = false; +	} + +	if (!use64 && (!exists_export_template(debug_file_32, &err) || !exists_export_template(release_file_32, &err))) { +		valid = false; +	} + +	String custom_debug_binary = p_preset->get("custom_template/debug"); +	String custom_release_binary = p_preset->get("custom_template/release"); + +	if (custom_debug_binary == "" && custom_release_binary == "") { +		if (!err.empty()) +			r_error = err; +		return valid; +	} + +	bool dvalid = true; +	bool rvalid = true; + +	if (!FileAccess::exists(custom_debug_binary)) { +		dvalid = false; +		err = "Custom debug binary not found.\n"; +	} -	if (find_export_template(release_file_32) == String()) { -		r_missing_templates = true; -	} else if (find_export_template(debug_file_32) == String()) { -		r_missing_templates = true; -	} else if (find_export_template(release_file_64) == String()) { -		r_missing_templates = true; -	} else if (find_export_template(debug_file_64) == String()) { -		r_missing_templates = true; +	if (!FileAccess::exists(custom_release_binary)) { +		rvalid = false; +		err += "Custom release binary not found.\n";  	} -	return !r_missing_templates; +	if (dvalid || rvalid) +		valid = true; +	else +		valid = false; + +	if (!err.empty()) +		r_error = err; +	return valid;  }  String EditorExportPlatformPC::get_binary_extension() const { @@ -1497,40 +1536,6 @@ Vector<StringName> EditorExportPlatform::get_dependencies(bool p_bundles) const  } -String EditorExportPlatform::find_export_template(String template_file_name, String *err) const { -	String user_file = EditorSettings::get_singleton()->get_settings_path() -		+"/templates/"+template_file_name; -	String system_file=OS::get_singleton()->get_installed_templates_path(); -	bool has_system_path=(system_file!=""); -	system_file+=template_file_name; - -	// Prefer user file -	if (FileAccess::exists(user_file)) { -		return user_file; -	} - -	// Now check system file -	if (has_system_path) { -		if (FileAccess::exists(system_file)) { -			return system_file; -		} -	} - -	// Not found -	if (err) { -		*err+="No export template found at \""+user_file+"\""; -		if (has_system_path) -			*err+="\n or \""+system_file+"\"."; -		else -			*err+="."; -	} -	return ""; -} - -bool EditorExportPlatform::exists_export_template(String template_file_name, String *err) const { -	return find_export_template(template_file_name,err)!=""; -} -  /////////////////////////////////////// @@ -2430,50 +2435,6 @@ void EditorExportPlatformPC::set_binary_extension(const String& p_extension) {  	binary_extension=p_extension;  } -bool EditorExportPlatformPC::can_export(String *r_error) const { - -	String err; -	bool valid=true; - -	if (use64 && (!exists_export_template(debug_binary64) || !exists_export_template(release_binary64))) { -		valid=false; -		err="No 64 bits export templates found.\nDownload and install export templates.\n"; -	} - -	if (!use64 && (!exists_export_template(debug_binary32) || !exists_export_template(release_binary32))) { -		valid=false; -		err="No 32 bits export templates found.\nDownload and install export templates.\n"; -	} - -	if(custom_debug_binary=="" && custom_release_binary=="") { -		if (r_error) *r_error=err; -		return valid; -	} - -	bool dvalid = true; -	bool rvalid = true; - -	if(!FileAccess::exists(custom_debug_binary)) { -		dvalid = false; -		err = "Custom debug binary not found.\n"; -	} - -	if(!FileAccess::exists(custom_release_binary)) { -		rvalid = false; -		err = "Custom release binary not found.\n"; -	} - -	if (dvalid || rvalid) -		valid = true; -	else -		valid = false; - -	if (r_error) -		*r_error=err; -	return valid; -} - -  EditorExportPlatformPC::EditorExportPlatformPC() {  	export_mode=EXPORT_PACK; diff --git a/editor/editor_export.h b/editor/editor_export.h index a78762ad80..740f05174b 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -154,7 +154,8 @@ private:  protected:  	virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) = 0; -	String find_export_template(String template_file_name) const; +	bool exists_export_template(String template_file_name, String *err) const; +	String find_export_template(String template_file_name, String *err = NULL) const;  	void gen_export_flags(Vector<String> &r_flags, int p_flags);  public: @@ -258,6 +259,8 @@ class EditorExportPlatformPC : public EditorExportPlatform {  	String debug_file_32;  	String debug_file_64; +	bool use64; +  public:  	virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 6b23a02275..5f88a928ca 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -2689,6 +2689,14 @@ void EditorNode::_editor_select(int p_which) {  	editor_plugin_screen = new_editor;  	editor_plugin_screen->make_visible(true);  	editor_plugin_screen->selected_notify(); + +	if (EditorSettings::get_singleton()->get("interface/separate_distraction_mode")) { +		if (p_which == EDITOR_SCRIPT) { +			set_distraction_free_mode(script_distraction); +		} else { +			set_distraction_free_mode(scene_distraction); +		} +	}  }  void EditorNode::add_editor_plugin(EditorPlugin *p_editor) { @@ -4382,7 +4390,25 @@ bool EditorNode::get_docks_visible() const {  void EditorNode::_toggle_distraction_free_mode() { -	set_distraction_free_mode(distraction_free->is_pressed()); +	if (EditorSettings::get_singleton()->get("interface/separate_distraction_mode")) { +		int screen = -1; +		for (int i = 0; i < editor_table.size(); i++) { +			if (editor_plugin_screen == editor_table[i]) { +				screen = i; +				break; +			} +		} + +		if (screen == EDITOR_SCRIPT) { +			script_distraction = not script_distraction; +			set_distraction_free_mode(script_distraction); +		} else { +			scene_distraction = not scene_distraction; +			set_distraction_free_mode(scene_distraction); +		} +	} else { +		set_distraction_free_mode(distraction_free->is_pressed()); +	}  }  void EditorNode::set_distraction_free_mode(bool p_enter) { @@ -4806,6 +4832,9 @@ EditorNode::EditorNode() {  	_initializing_addons = false;  	docks_visible = true; +	scene_distraction = false; +	script_distraction = false; +  	FileAccess::set_backup_save(true);  	TranslationServer::get_singleton()->set_enabled(false); diff --git a/editor/editor_node.h b/editor/editor_node.h index 7de713eae9..fc107bb505 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -357,6 +357,9 @@ private:  	bool docks_visible;  	ToolButton *distraction_free; +	bool scene_distraction; +	bool script_distraction; +  	String _tmp_import_path;  	EditorExport *editor_export; diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 1b4f77419b..7d7db5ac75 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -509,6 +509,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {  	set("interface/dim_transition_time", 0.08f);  	hints["interface/dim_transition_time"] = PropertyInfo(Variant::REAL, "interface/dim_transition_time", PROPERTY_HINT_RANGE, "0,1,0.001", PROPERTY_USAGE_DEFAULT); +	set("interface/separate_distraction_mode", false); +  	set("filesystem/directories/autoscan_project_path", "");  	hints["filesystem/directories/autoscan_project_path"] = PropertyInfo(Variant::STRING, "filesystem/directories/autoscan_project_path", PROPERTY_HINT_GLOBAL_DIR);  	set("filesystem/directories/default_project_path", ""); @@ -589,6 +591,11 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {  	set("editors/3d/emulate_3_button_mouse", false);  	set("editors/3d/warped_mouse_panning", true); +	set("editors/3d/freelook_base_speed", 5); +	set("editors/3d/freelook_acceleration", 10); +	set("editors/3d/freelook_max_speed", 100); +	set("editors/3d/freelook_modifier_speed_factor", 1.0 / 5.0); +  	set("editors/2d/bone_width", 5);  	set("editors/2d/bone_color1", Color(1.0, 1.0, 1.0, 0.9));  	set("editors/2d/bone_color2", Color(0.75, 0.75, 0.75, 0.9)); diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 19fd1208b9..21c2ae6eb3 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -168,18 +168,23 @@ Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_s  					if (face[idx].size() == 3) {  						int norm = face[idx][2].to_int() - 1; +						if (norm < 0) +							norm += normals.size() + 1;  						ERR_FAIL_INDEX_V(norm, normals.size(), ERR_PARSE_ERROR);  						surf_tool->add_normal(normals[norm]);  					}  					if (face[idx].size() >= 2 && face[idx][1] != String()) { -  						int uv = face[idx][1].to_int() - 1; +						if (uv < 0) +							uv += uvs.size() + 1;  						ERR_FAIL_INDEX_V(uv, uvs.size(), ERR_PARSE_ERROR);  						surf_tool->add_uv(uvs[uv]);  					}  					int vtx = face[idx][0].to_int() - 1; +					if (vtx < 0) +						vtx += vertices.size() + 1;  					ERR_FAIL_INDEX_V(vtx, vertices.size(), ERR_PARSE_ERROR);  					Vector3 vertex = vertices[vtx]; diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index d73349f773..8a8add5611 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -58,20 +58,26 @@ void SpatialEditorViewport::_update_camera() {  	} else  		camera->set_perspective(get_fov(), get_znear(), get_zfar()); +	Transform camera_transform = to_camera_transform(cursor); + +	if (camera->get_global_transform() != camera_transform) { +		camera->set_global_transform(camera_transform); +		update_transform_gizmo_view(); +	} +} + +Transform SpatialEditorViewport::to_camera_transform(const Cursor &p_cursor) const {  	Transform camera_transform; -	camera_transform.translate(cursor.pos); -	camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot); -	camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot); +	camera_transform.translate(p_cursor.pos); +	camera_transform.basis.rotate(Vector3(1, 0, 0), -p_cursor.x_rot); +	camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot);  	if (orthogonal)  		camera_transform.translate(0, 0, 4096);  	else -		camera_transform.translate(0, 0, cursor.distance); +		camera_transform.translate(0, 0, p_cursor.distance); -	if (camera->get_global_transform() != camera_transform) { -		camera->set_global_transform(camera_transform); -		update_transform_gizmo_view(); -	} +	return camera_transform;  }  String SpatialEditorGizmo::get_handle_name(int p_idx) const { @@ -669,8 +675,7 @@ void SpatialEditorViewport::_list_select(InputEventMouseButton b) {  			selection_menu->add_item(spat->get_name());  			selection_menu->set_item_icon(i, icon);  			selection_menu->set_item_metadata(i, node_path); -			selection_menu->set_item_tooltip(i, String(spat->get_name()) + -														"\nType: " + spat->get_class() + "\nPath: " + node_path); +			selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path);  		}  		selection_menu->set_global_position(Vector2(b.global_x, b.global_y)); @@ -729,76 +734,6 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {  					if (_edit.mode == TRANSFORM_NONE && b.pressed) { -						Plane cursor_plane(cursor.cursor_pos, _get_camera_normal()); - -						Vector3 ray_origin = _get_ray_pos(Vector2(b.x, b.y)); -						Vector3 ray_dir = _get_ray(Vector2(b.x, b.y)); - -						//gizmo modify - -						if (b.mod.control) { - -							Vector<ObjectID> instances = VisualServer::get_singleton()->instances_cull_ray(ray_origin, ray_dir, get_tree()->get_root()->get_world()->get_scenario()); - -							Plane p(ray_origin, _get_camera_normal()); - -							float min_d = 1e10; -							bool found = false; - -							for (int i = 0; i < instances.size(); i++) { - -								Object *obj = ObjectDB::get_instance(instances[i]); - -								if (!obj) -									continue; - -								VisualInstance *vi = obj->cast_to<VisualInstance>(); -								if (!vi) -									continue; - -								//optimize by checking AABB (although should pre sort by distance) -								Rect3 aabb = vi->get_global_transform().xform(vi->get_aabb()); -								if (p.distance_to(aabb.get_support(-ray_dir)) > min_d) -									continue; - -								PoolVector<Face3> faces = vi->get_faces(VisualInstance::FACES_SOLID); -								int c = faces.size(); -								if (c > 0) { -									PoolVector<Face3>::Read r = faces.read(); - -									for (int j = 0; j < c; j++) { - -										Vector3 inters; -										if (r[j].intersects_ray(ray_origin, ray_dir, &inters)) { - -											float d = p.distance_to(inters); -											if (d < 0) -												continue; - -											if (d < min_d) { -												min_d = d; -												found = true; -											} -										} -									} -								} -							} - -							if (found) { - -								//cursor.cursor_pos=ray_origin+ray_dir*min_d; -								//VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos)); -							} - -						} else { -							Vector3 new_pos; -							if (cursor_plane.intersects_ray(ray_origin, ray_dir, &new_pos)) { - -								//cursor.cursor_pos=new_pos; -								//VisualServer::get_singleton()->instance_set_transform(cursor_instance,Transform(Matrix3(),cursor.cursor_pos)); -							} -						} -  						if (b.mod.alt) {  							if (nav_scheme == NAVIGATION_MAYA) @@ -1344,6 +1279,8 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {  				if (nav_scheme == NAVIGATION_MAYA && m.mod.alt) {  					nav_mode = NAVIGATION_ZOOM; +				} else { +					nav_mode = NAVIGATION_LOOK;  				}  			} else if (m.button_mask & 4) { @@ -1453,6 +1390,29 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {  					_update_name();  				} break; +				case NAVIGATION_LOOK: { +					// Freelook only works properly in perspective. +					// It technically works too in ortho, but it's awful for a user due to fov being near zero +					if (!orthogonal) { +						cursor.x_rot += m.relative_y / 120.0; +						cursor.y_rot += m.relative_x / 120.0; +						if (cursor.x_rot > Math_PI / 2.0) +							cursor.x_rot = Math_PI / 2.0; +						if (cursor.x_rot < -Math_PI / 2.0) +							cursor.x_rot = -Math_PI / 2.0; + +						// Look is like Orbit, except the cursor translates, not the camera +						Transform camera_transform = to_camera_transform(cursor); +						Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); +						Vector3 diff = camera->get_translation() - pos; +						cursor.pos += diff; + +						name = ""; +						_update_name(); +					} + +				} break; +  				default: {}  			}  		} break; @@ -1543,6 +1503,75 @@ void SpatialEditorViewport::_sinput(const InputEvent &p_event) {  	}  } +void SpatialEditorViewport::_update_freelook(real_t delta) { + +	const Input &input = *Input::get_singleton(); + +	if (!input.is_mouse_button_pressed(BUTTON_RIGHT)) +		return; + +	Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); +	Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0)); +	Vector3 up = Vector3(0, 1, 0); + +	int key_left = ED_SHORTCUT("spatial_editor/freelook_left", TTR("Freelook Left"), KEY_A)->get_shortcut().key.scancode; +	int key_right = ED_SHORTCUT("spatial_editor/freelook_right", TTR("Freelook Right"), KEY_D)->get_shortcut().key.scancode; +	int key_forward = ED_SHORTCUT("spatial_editor/freelook_forward", TTR("Freelook Forward"), KEY_W)->get_shortcut().key.scancode; +	int key_backwards = ED_SHORTCUT("spatial_editor/freelook_backwards", TTR("Freelook Backwards"), KEY_S)->get_shortcut().key.scancode; +	int key_up = ED_SHORTCUT("spatial_editor/freelook_up", TTR("Freelook Up"), KEY_Q)->get_shortcut().key.scancode; +	int key_down = ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), KEY_E)->get_shortcut().key.scancode; +	int key_speed_modifier = ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), KEY_SHIFT)->get_shortcut().key.scancode; + +	Vector3 velocity; +	bool pressed = false; +	bool speed_modifier = false; + +	if (input.is_key_pressed(key_left)) { +		velocity -= right; +		pressed = true; +	} +	if (input.is_key_pressed(key_right)) { +		velocity += right; +		pressed = true; +	} +	if (input.is_key_pressed(key_forward)) { +		velocity += forward; +		pressed = true; +	} +	if (input.is_key_pressed(key_backwards)) { +		velocity -= forward; +		pressed = true; +	} +	if (input.is_key_pressed(key_up)) { +		velocity += up; +		pressed = true; +	} +	if (input.is_key_pressed(key_down)) { +		velocity -= up; +		pressed = true; +	} +	if (input.is_key_pressed(key_speed_modifier)) { +		speed_modifier = true; +	} + +	const EditorSettings &s = *EditorSettings::get_singleton(); + +	real_t base_speed = s.get("editors/3d/freelook_base_speed"); +	real_t acceleration = s.get("editors/3d/freelook_acceleration"); +	real_t max_speed = s.get("editors/3d/freelook_max_speed"); +	real_t modifier_speed_factor = s.get("editors/3d/freelook_modifier_speed_factor"); + +	if (pressed) { +		velocity.normalize(); +		freelook_speed += acceleration * delta; +		if (freelook_speed > max_speed) +			freelook_speed = max_speed; +		cursor.pos += velocity * ((freelook_speed * (speed_modifier ? modifier_speed_factor : 1.0) * delta)); +	} else { +		freelook_speed = base_speed; +	} +} +  void SpatialEditorViewport::set_message(String p_message, float p_time) {  	message = p_message; @@ -1579,6 +1608,8 @@ void SpatialEditorViewport::_notification(int p_what) {  		}  		*/ +		_update_freelook(get_tree()->get_idle_process_time()); +  		_update_camera();  		Map<Node *, Object *> &selection = editor_selection->get_selection(); @@ -2204,6 +2235,7 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed  	previewing = NULL;  	preview = NULL;  	gizmo_scale = 1.0; +	freelook_speed = 0;  	selection_menu = memnew(PopupMenu);  	add_child(selection_menu); @@ -3149,36 +3181,6 @@ void SpatialEditor::_finish_indicators() {  	VisualServer::get_singleton()->free(cursor_mesh);  } -void SpatialEditor::_instance_scene() { -#if 0 -	EditorNode *en = get_scene()->get_root_node()->cast_to<EditorNode>(); -	ERR_FAIL_COND(!en); -	String path = en->get_filesystem_dock()->get_selected_path(); -	if (path=="") { -		set_message(TTR("No scene selected to instance!")); -		return; -	} - -	undo_redo->create_action(TTR("Instance at Cursor")); - -	Node* scene = en->request_instance_scene(path); - -	if (!scene) { -		set_message(TTR("Could not instance scene!")); -		undo_redo->commit_action(); //bleh -		return; -	} - -	Spatial *s = scene->cast_to<Spatial>(); -	if (s) { - -		undo_redo->add_do_method(s,"set_global_transform",Transform(Matrix3(),cursor.cursor_pos)); -	} - -	undo_redo->commit_action(); -#endif -} -  void SpatialEditor::_unhandled_key_input(InputEvent p_event) {  	if (!is_visible_in_tree() || get_viewport()->gui_has_modal_stack()) @@ -3242,8 +3244,6 @@ void SpatialEditor::_notification(int p_what) {  		tool_button[SpatialEditor::TOOL_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));  		tool_button[SpatialEditor::TOOL_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));  		tool_button[SpatialEditor::TOOL_MODE_LIST_SELECT]->set_icon(get_icon("ListSelect", "EditorIcons")); -		instance_button->set_icon(get_icon("SpatialAdd", "EditorIcons")); -		instance_button->hide();  		view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_1_VIEWPORT), get_icon("Panels1", "EditorIcons"));  		view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_2_VIEWPORTS), get_icon("Panels2", "EditorIcons")); @@ -3383,7 +3383,6 @@ void SpatialEditor::_bind_methods() {  	ClassDB::bind_method("_node_removed", &SpatialEditor::_node_removed);  	ClassDB::bind_method("_menu_item_pressed", &SpatialEditor::_menu_item_pressed);  	ClassDB::bind_method("_xform_dialog_action", &SpatialEditor::_xform_dialog_action); -	ClassDB::bind_method("_instance_scene", &SpatialEditor::_instance_scene);  	ClassDB::bind_method("_get_editor_data", &SpatialEditor::_get_editor_data);  	ClassDB::bind_method("_request_gizmo", &SpatialEditor::_request_gizmo);  	ClassDB::bind_method("_default_light_angle_input", &SpatialEditor::_default_light_angle_input); @@ -3520,12 +3519,6 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {  	tool_button[TOOL_MODE_SCALE]->connect("pressed", this, "_menu_item_pressed", button_binds);  	tool_button[TOOL_MODE_SCALE]->set_tooltip(TTR("Scale Mode (R)")); -	instance_button = memnew(Button); -	hbc_menu->add_child(instance_button); -	instance_button->set_flat(true); -	instance_button->connect("pressed", this, "_instance_scene"); -	instance_button->hide(); -  	VSeparator *vs = memnew(VSeparator);  	hbc_menu->add_child(vs); diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index 4302927426..c7336cef86 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -113,6 +113,7 @@ private:  	bool transforming;  	bool orthogonal;  	float gizmo_scale; +	real_t freelook_speed;  	struct _RayResult { @@ -168,7 +169,8 @@ private:  		NAVIGATION_NONE,  		NAVIGATION_PAN,  		NAVIGATION_ZOOM, -		NAVIGATION_ORBIT +		NAVIGATION_ORBIT, +		NAVIGATION_LOOK  	};  	enum TransformMode {  		TRANSFORM_NONE, @@ -203,8 +205,6 @@ private:  	struct Cursor { -		Vector3 cursor_pos; -  		Vector3 pos;  		float x_rot, y_rot, distance;  		bool region_select; @@ -227,10 +227,12 @@ private:  	//  	void _update_camera(); +	Transform to_camera_transform(const Cursor &p_cursor) const;  	void _draw();  	void _smouseenter();  	void _sinput(const InputEvent &p_ie); +	void _update_freelook(real_t delta);  	SpatialEditor *spatial_editor;  	Camera *previewing; @@ -385,7 +387,6 @@ private:  	};  	Button *tool_button[TOOL_MAX]; -	Button *instance_button;  	MenuButton *transform_menu;  	MenuButton *view_menu; diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 90db23d236..40ffb8e246 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -229,6 +229,8 @@ void ProjectExportDialog::_edit_preset(int p_index) {  		}  		if (needs_templates)  			export_templates_error->show(); +		else +			export_templates_error->hide();  		export_button->set_disabled(true); diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp index 2bc00c62fb..ebf4b1cf3a 100644 --- a/editor/script_editor_debugger.cpp +++ b/editor/script_editor_debugger.cpp @@ -90,11 +90,13 @@ public:  		return "";  	} -	void add_property(const String &p_name, const Variant &p_value) { +	void add_property(const String &p_name, const Variant &p_value, const PropertyHint &p_hint, const String p_hint_string) {  		PropertyInfo pinfo;  		pinfo.name = p_name;  		pinfo.type = p_value.get_type(); +		pinfo.hint = p_hint; +		pinfo.hint_string = p_hint_string;  		props.push_back(pinfo);  		values[p_name] = p_value;  	} @@ -437,7 +439,11 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da  		inspected_object->last_edited_id = id; -		inspect_properties->edit(inspected_object); +		if (tabs->get_current_tab() == 2) { +			inspect_properties->edit(inspected_object); +		} else { +			editor->push_item(inspected_object); +		}  	} else if (p_msg == "message:video_mem") { @@ -499,13 +505,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da  			String n = p_data[ofs + i * 2 + 0];  			Variant v = p_data[ofs + i * 2 + 1]; +			PropertyHint h = PROPERTY_HINT_NONE; +			String hs = String();  			if (n.begins_with("*")) {  				n = n.substr(1, n.length()); +				h = PROPERTY_HINT_OBJECT_ID; +				String s = v; +				s = s.replace("[", ""); +				hs = s.get_slice(":", 0); +				v = s.get_slice(":", 1).to_int();  			} -			variables->add_property("members/" + n, v); +			variables->add_property("members/" + n, v, h, hs);  		}  		ofs += mcount * 2; @@ -516,13 +529,20 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da  			String n = p_data[ofs + i * 2 + 0];  			Variant v = p_data[ofs + i * 2 + 1]; +			PropertyHint h = PROPERTY_HINT_NONE; +			String hs = String();  			if (n.begins_with("*")) {  				n = n.substr(1, n.length()); +				h = PROPERTY_HINT_OBJECT_ID; +				String s = v; +				s = s.replace("[", ""); +				hs = s.get_slice(":", 0); +				v = s.get_slice(":", 1).to_int();  			} -			variables->add_property("locals/" + n, v); +			variables->add_property("locals/" + n, v, h, hs);  		}  		variables->update(); @@ -1056,6 +1076,9 @@ void ScriptEditorDebugger::stop() {  	EditorNode::get_singleton()->get_pause_button()->set_pressed(false);  	EditorNode::get_singleton()->get_pause_button()->set_disabled(true); +	//avoid confusion when stopped debugging but an object is still edited +	EditorNode::get_singleton()->push_item(NULL); +  	if (hide_on_stop) {  		if (is_visible_in_tree())  			EditorNode::get_singleton()->hide_bottom_panel(); @@ -1636,6 +1659,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {  		inspector->get_scene_tree()->set_column_title(0, TTR("Variable"));  		inspector->set_enable_capitalize_paths(false);  		inspector->set_read_only(true); +		inspector->connect("object_id_selected", this, "_scene_tree_property_select_object");  		sc->add_child(inspector);  		server = TCP_Server::create_ref(); diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index 1cd1991608..dda619a54d 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -517,6 +517,31 @@ void OS_JavaScript::alert(const String &p_alert, const String &p_title) {  	/* clang-format on */  } +static const char *godot2dom_cursor(OS::CursorShape p_shape) { + +	switch (p_shape) { +		case OS::CURSOR_ARROW: +		default: +			return "auto"; +		case OS::CURSOR_IBEAM: return "text"; +		case OS::CURSOR_POINTING_HAND: return "pointer"; +		case OS::CURSOR_CROSS: return "crosshair"; +		case OS::CURSOR_WAIT: return "progress"; +		case OS::CURSOR_BUSY: return "wait"; +		case OS::CURSOR_DRAG: return "grab"; +		case OS::CURSOR_CAN_DROP: return "grabbing"; +		case OS::CURSOR_FORBIDDEN: return "no-drop"; +		case OS::CURSOR_VSIZE: return "ns-resize"; +		case OS::CURSOR_HSIZE: return "ew-resize"; +		case OS::CURSOR_BDIAGSIZE: return "nesw-resize"; +		case OS::CURSOR_FDIAGSIZE: return "nwse-resize"; +		case OS::CURSOR_MOVE: return "move"; +		case OS::CURSOR_VSPLIT: return "row-resize"; +		case OS::CURSOR_HSPLIT: return "col-resize"; +		case OS::CURSOR_HELP: return "help"; +	} +} +  void OS_JavaScript::set_css_cursor(const char *p_cursor) {  	/* clang-format off */ @@ -547,7 +572,7 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {  	if (p_mode == MOUSE_MODE_VISIBLE) { -		set_css_cursor("auto"); +		set_css_cursor(godot2dom_cursor(cursor_shape));  		emscripten_exit_pointerlock();  	} else if (p_mode == MOUSE_MODE_HIDDEN) { @@ -561,7 +586,7 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {  		ERR_EXPLAIN("MOUSE_MODE_CAPTURED can only be entered from within an appropriate input callback");  		ERR_FAIL_COND(result == EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED);  		ERR_FAIL_COND(result != EMSCRIPTEN_RESULT_SUCCESS); -		set_css_cursor("auto"); +		set_css_cursor(godot2dom_cursor(cursor_shape));  	}  } @@ -706,7 +731,11 @@ bool OS_JavaScript::can_draw() const {  void OS_JavaScript::set_cursor_shape(CursorShape p_shape) { -	//javascript really really really has no mouse.. how amazing.. +	ERR_FAIL_INDEX(p_shape, CURSOR_MAX); + +	cursor_shape = p_shape; +	if (get_mouse_mode() != MOUSE_MODE_HIDDEN) +		set_css_cursor(godot2dom_cursor(cursor_shape));  }  void OS_JavaScript::main_loop_begin() { diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h index ffd269b512..2bc603d8d9 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -61,6 +61,7 @@ class OS_JavaScript : public OS_Unix {  	InputDefault *input;  	bool window_maximized;  	VideoMode video_mode; +	CursorShape cursor_shape;  	MainLoop *main_loop;  	GetDataDirFunc get_data_dir_func; diff --git a/platform/windows/packet_peer_udp_winsock.cpp b/platform/windows/packet_peer_udp_winsock.cpp index f69c0bd2ed..f3b91c1b56 100644 --- a/platform/windows/packet_peer_udp_winsock.cpp +++ b/platform/windows/packet_peer_udp_winsock.cpp @@ -203,6 +203,8 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {  		len = sizeof(struct sockaddr_storage);  		++queue_count; +		if (p_wait) +			break;  	};  	if (ret == SOCKET_ERROR) { diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 6f2d725353..258e6c9a9f 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -1518,6 +1518,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool  			if (p_doubleclick && (!c.editable || c.mode == TreeItem::CELL_MODE_CUSTOM || c.mode == TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it' s confusing for check  				emit_signal("item_activated"); +				incr_search.clear();  				return -1;  			} @@ -2071,6 +2072,7 @@ void Tree::_gui_input(InputEvent p_event) {  						//bring up editor if possible  						if (!edit_selected()) {  							emit_signal("item_activated"); +							incr_search.clear();  						}  					}  					accept_event();  |