Skip to content

Commit

Permalink
GH-177 Fix type propagation for Preload and Instantiate Scene
Browse files Browse the repository at this point in the history
  • Loading branch information
Naros committed Mar 24, 2024
1 parent e769057 commit 34f85f8
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 2 deletions.
27 changes: 25 additions & 2 deletions src/script/nodes/resources/preload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
//
#include "preload.h"

#include <godot_cpp/classes/node.hpp>
#include <godot_cpp/classes/packed_scene.hpp>
#include <godot_cpp/classes/resource_loader.hpp>

class OScriptNodePreloadInstance : public OScriptNodeInstance
Expand Down Expand Up @@ -82,9 +84,8 @@ bool OScriptNodePreload::_set(const StringName &p_name, const Variant& p_value)
void OScriptNodePreload::allocate_default_pins()
{
Ref<OScriptNodePin> path = create_pin(PD_Output, "path", Variant::OBJECT, _resource_path);
path->set_flags(OScriptNodePin::Flags::DATA | OScriptNodePin::Flags::SHOW_LABEL);
path->set_flags(OScriptNodePin::Flags::DATA | OScriptNodePin::Flags::SHOW_LABEL | OScriptNodePin::Flags::NO_CAPITALIZE);
path->set_label(_resource_path);
path->set_target_class("Resource");

super::allocate_default_pins();
}
Expand All @@ -110,6 +111,28 @@ String OScriptNodePreload::get_icon() const
return "ResourcePreloader";
}

StringName OScriptNodePreload::resolve_type_class(const Ref<OScriptNodePin>& p_pin) const
{
if (p_pin.is_valid() && p_pin->is_output() && !p_pin->is_execution())
{
// If resource is invalid, attempt to load it
Ref<Resource> resource = _resource;
if (!resource.is_valid())
resource = ResourceLoader::get_singleton()->load(_resource_path);

// If resource is valid, if scene, get root node type; otherwise resource type
if (resource.is_valid())
{
const Ref<PackedScene> scene = resource;
if (scene.is_valid() && scene->can_instantiate())
return scene->instantiate()->get_class();

return resource->get_class();
}
}
return super::resolve_type_class(p_pin);
}

OScriptNodeInstance* OScriptNodePreload::instantiate(OScriptInstance* p_instance)
{
OScriptNodePreloadInstance* i = memnew(OScriptNodePreloadInstance);
Expand Down
1 change: 1 addition & 0 deletions src/script/nodes/resources/preload.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class OScriptNodePreload : public OScriptNode
String get_node_title() const override;
String get_node_title_color_name() const override { return "resources"; }
String get_icon() const override;
StringName resolve_type_class(const Ref<OScriptNodePin>& p_pin) const override;
OScriptNodeInstance* instantiate(OScriptInstance* p_instance) override;
void initialize(const OScriptNodeInitContext& p_context) override;
//~ End OScriptNode Interface
Expand Down
14 changes: 14 additions & 0 deletions src/script/nodes/scene/instantiate_scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,20 @@ void OScriptNodeInstantiateScene::pin_default_value_changed(const Ref<OScriptNod
super::pin_default_value_changed(p_pin);
}

StringName OScriptNodeInstantiateScene::resolve_type_class(const Ref<OScriptNodePin>& p_pin) const
{
if (p_pin.is_valid() && p_pin->is_output() && !p_pin->is_execution())
{
Ref<PackedScene> packed_scene = ResourceLoader::get_singleton()->load(_scene);
if (packed_scene.is_valid())
{
if (packed_scene->can_instantiate())
return packed_scene->instantiate()->get_class();
}
}
return super::resolve_type_class(p_pin);
}

OScriptNodeInstance* OScriptNodeInstantiateScene::instantiate(OScriptInstance* p_instance)
{
OScriptNodeInstantiateSceneInstance* i = memnew(OScriptNodeInstantiateSceneInstance);
Expand Down
1 change: 1 addition & 0 deletions src/script/nodes/scene/instantiate_scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class OScriptNodeInstantiateScene : public OScriptNode
String get_node_title_color_name() const override { return "scene"; }
String get_icon() const override;
void pin_default_value_changed(const Ref<OScriptNodePin>& p_pin) override;
StringName resolve_type_class(const Ref<OScriptNodePin>& p_pin) const override;
OScriptNodeInstance* instantiate(OScriptInstance* p_instance) override;
//~ End OScriptNode Interface
};
Expand Down

0 comments on commit 34f85f8

Please sign in to comment.