diff --git a/modules/gltf/editor/editor_import_blend_runner.cpp b/modules/gltf/editor/editor_import_blend_runner.cpp index 659a60e6a1f7..fc3bb8d11c16 100644 --- a/modules/gltf/editor/editor_import_blend_runner.cpp +++ b/modules/gltf/editor/editor_import_blend_runner.cpp @@ -198,6 +198,40 @@ Error EditorImportBlendRunner::do_import(const Dictionary &p_options) { } } +HTTPClient::Status EditorImportBlendRunner::connect_blender_rpc(const Ref &p_client, int p_timeout_usecs) { + p_client->connect_to_host("127.0.0.1", rpc_port); + HTTPClient::Status status = p_client->get_status(); + + int attempts = 1; + int wait_usecs = 1000; + + bool done = false; + while (!done) { + OS::get_singleton()->delay_usec(wait_usecs); + status = p_client->get_status(); + switch (status) { + case HTTPClient::STATUS_RESOLVING: + case HTTPClient::STATUS_CONNECTING: { + p_client->poll(); + break; + } + case HTTPClient::STATUS_CONNECTED: { + done = true; + break; + } + default: { + if (attempts * wait_usecs < p_timeout_usecs) { + p_client->connect_to_host("127.0.0.1", rpc_port); + } else { + return status; + } + } + } + } + + return status; +} + Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) { kill_timer->stop(); @@ -217,25 +251,9 @@ Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) { // Connect to RPC server. Ref client = HTTPClient::create(); - client->connect_to_host("127.0.0.1", rpc_port); - - bool done = false; - while (!done) { - HTTPClient::Status status = client->get_status(); - switch (status) { - case HTTPClient::STATUS_RESOLVING: - case HTTPClient::STATUS_CONNECTING: { - client->poll(); - break; - } - case HTTPClient::STATUS_CONNECTED: { - done = true; - break; - } - default: { - ERR_FAIL_V_MSG(ERR_CONNECTION_ERROR, vformat("Unexpected status during RPC connection: %d", status)); - } - } + HTTPClient::Status status = connect_blender_rpc(client, 1000000); + if (status != HTTPClient::STATUS_CONNECTED) { + ERR_FAIL_V_MSG(ERR_CONNECTION_ERROR, vformat("Unexpected status during RPC connection: %d", status)); } // Send XML request. @@ -246,9 +264,9 @@ Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) { } // Wait for response. - done = false; + bool done = false; while (!done) { - HTTPClient::Status status = client->get_status(); + status = client->get_status(); switch (status) { case HTTPClient::STATUS_REQUESTING: { client->poll(); diff --git a/modules/gltf/editor/editor_import_blend_runner.h b/modules/gltf/editor/editor_import_blend_runner.h index b2b82394e13b..626f3c9ebad2 100644 --- a/modules/gltf/editor/editor_import_blend_runner.h +++ b/modules/gltf/editor/editor_import_blend_runner.h @@ -33,6 +33,7 @@ #ifdef TOOLS_ENABLED +#include "core/io/http_client.h" #include "core/os/os.h" #include "scene/main/node.h" #include "scene/main/timer.h" @@ -60,6 +61,7 @@ class EditorImportBlendRunner : public Node { bool is_running() { return blender_pid != 0 && OS::get_singleton()->is_process_running(blender_pid); } bool is_using_rpc() { return rpc_port != 0; } Error do_import(const Dictionary &p_options); + HTTPClient::Status connect_blender_rpc(const Ref &p_client, int p_timeout_usecs); EditorImportBlendRunner(); };