diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 41f6410a7..3804ccc79 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -105,6 +105,8 @@ add_library(wmoge STATIC event/event_window.hpp event/event_resource.cpp event/event_resource.hpp + event/event_scene.cpp + event/event_scene.hpp event/register_classes_event.cpp event/register_classes_event.hpp gameplay/action_manager.cpp @@ -276,6 +278,8 @@ add_library(wmoge STATIC render/camera.hpp render/canvas.cpp render/canvas.hpp + render/culling.cpp + render/culling.hpp render/deferred_pipeline.cpp render/deferred_pipeline.hpp render/graphics_pipeline.cpp @@ -304,8 +308,6 @@ add_library(wmoge STATIC render/view.hpp render/view_manager.cpp render/view_manager.hpp - render/visibility.cpp - render/visibility.hpp resource/array_mesh.cpp resource/array_mesh.hpp resource/audio_stream.cpp diff --git a/engine/audio/audio_bus.hpp b/engine/audio/audio_bus.hpp index b91c46cb7..60779752d 100644 --- a/engine/audio/audio_bus.hpp +++ b/engine/audio/audio_bus.hpp @@ -50,10 +50,10 @@ namespace wmoge { virtual void set_pitch_scale(float value) = 0; virtual void get_playbacks(std::vector>& playbacks) = 0; - const StringId& get_name() const { return m_name; } + const Strid& get_name() const { return m_name; } protected: - StringId m_name; + Strid m_name; }; }// namespace wmoge diff --git a/engine/audio/audio_engine.hpp b/engine/audio/audio_engine.hpp index 84f6658df..f076c062a 100644 --- a/engine/audio/audio_engine.hpp +++ b/engine/audio/audio_engine.hpp @@ -53,25 +53,25 @@ namespace wmoge { public: virtual ~AudioEngine() = default; - virtual void update() = 0; - virtual void shutdown() = 0; - virtual Ref make_playback(Ref stream, const StringId& bus, const StringId& name) = 0; - virtual Ref make_bus(const StringId& name) = 0; - virtual Ref find_bus(const StringId& name) = 0; - virtual bool has_bus(const StringId& name) = 0; + virtual void update() = 0; + virtual void shutdown() = 0; + virtual Ref make_playback(Ref stream, const Strid& bus, const Strid& name) = 0; + virtual Ref make_bus(const Strid& name) = 0; + virtual Ref find_bus(const Strid& name) = 0; + virtual bool has_bus(const Strid& name) = 0; const AudioDriverCaps& get_caps() const { return m_caps; } - const StringId& get_engine_name() const { return m_engine_name; } - const StringId& get_driver_name() const { return m_driver_name; } - const StringId& get_device_name() const { return m_device_name; } - const StringId& get_default_bus() const { return m_default_bus; } + const Strid& get_engine_name() const { return m_engine_name; } + const Strid& get_driver_name() const { return m_driver_name; } + const Strid& get_device_name() const { return m_device_name; } + const Strid& get_default_bus() const { return m_default_bus; } protected: AudioDriverCaps m_caps; - StringId m_engine_name; - StringId m_driver_name; - StringId m_device_name; - StringId m_default_bus; + Strid m_engine_name; + Strid m_driver_name; + Strid m_device_name; + Strid m_default_bus; }; }// namespace wmoge diff --git a/engine/audio/audio_playback.hpp b/engine/audio/audio_playback.hpp index eab497018..7b1830ca6 100644 --- a/engine/audio/audio_playback.hpp +++ b/engine/audio/audio_playback.hpp @@ -58,13 +58,13 @@ namespace wmoge { virtual void set_loop(bool value) = 0; const Ref& get_stream() const { return m_stream; } - const StringId& get_name() const { return m_name; } - const StringId& get_bus_name() const { return m_bus_name; } + const Strid& get_name() const { return m_name; } + const Strid& get_bus_name() const { return m_bus_name; } protected: Ref m_stream; - StringId m_name; - StringId m_bus_name; + Strid m_name; + Strid m_bus_name; }; }// namespace wmoge diff --git a/engine/audio/openal/al_bus.cpp b/engine/audio/openal/al_bus.cpp index add337f16..f0d436a9e 100644 --- a/engine/audio/openal/al_bus.cpp +++ b/engine/audio/openal/al_bus.cpp @@ -32,7 +32,7 @@ namespace wmoge { - ALAudioBus::ALAudioBus(StringId name, class ALAudioEngine& engine) : m_engine(engine) { + ALAudioBus::ALAudioBus(Strid name, class ALAudioEngine& engine) : m_engine(engine) { assert(!name.empty()); m_name = std::move(name); } diff --git a/engine/audio/openal/al_bus.hpp b/engine/audio/openal/al_bus.hpp index bfe614712..f17200082 100644 --- a/engine/audio/openal/al_bus.hpp +++ b/engine/audio/openal/al_bus.hpp @@ -43,7 +43,7 @@ namespace wmoge { */ class ALAudioBus final : public AudioBus { public: - ALAudioBus(StringId name, class ALAudioEngine& engine); + ALAudioBus(Strid name, class ALAudioEngine& engine); ~ALAudioBus() override; void add_playback(ALAudioPlayback* playback); diff --git a/engine/audio/openal/al_engine.cpp b/engine/audio/openal/al_engine.cpp index 2907c9626..ddd7e9b38 100644 --- a/engine/audio/openal/al_engine.cpp +++ b/engine/audio/openal/al_engine.cpp @@ -72,7 +72,7 @@ namespace wmoge { WG_LOG_INFO("shutdown openal audio engine"); } - Ref ALAudioEngine::make_playback(Ref stream, const StringId& bus, const StringId& name) { + Ref ALAudioEngine::make_playback(Ref stream, const Strid& bus, const Strid& name) { WG_AUTO_PROFILE_OPENAL("ALAudioEngine::make_playback"); std::lock_guard guard(m_mutex); @@ -92,7 +92,7 @@ namespace wmoge { return make_ref(std::move(stream), bus, name, *this); } - Ref ALAudioEngine::make_bus(const StringId& name) { + Ref ALAudioEngine::make_bus(const Strid& name) { WG_AUTO_PROFILE_OPENAL("ALAudioEngine::make_bus"); std::lock_guard guard(m_mutex); @@ -111,17 +111,17 @@ namespace wmoge { return (m_bus[name] = make_ref(name, *this)).as(); } - Ref ALAudioEngine::find_bus(const StringId& name) { + Ref ALAudioEngine::find_bus(const Strid& name) { std::lock_guard guard(m_mutex); auto query = m_bus.find(name); return query != m_bus.end() ? query->second.as() : Ref{}; } - bool ALAudioEngine::has_bus(const StringId& name) { + bool ALAudioEngine::has_bus(const Strid& name) { std::lock_guard guard(m_mutex); return m_bus.find(name) != m_bus.end(); } - ALAudioBus* ALAudioEngine::get_bus(const StringId& name) { + ALAudioBus* ALAudioEngine::get_bus(const Strid& name) { auto query = m_bus.find(name); assert(query != m_bus.end()); return query != m_bus.end() ? query->second.get() : nullptr; diff --git a/engine/audio/openal/al_engine.hpp b/engine/audio/openal/al_engine.hpp index 58539530c..9e765d7b8 100644 --- a/engine/audio/openal/al_engine.hpp +++ b/engine/audio/openal/al_engine.hpp @@ -49,12 +49,12 @@ namespace wmoge { void update() override; void shutdown() override; - Ref make_playback(Ref stream, const StringId& bus, const StringId& name) override; - Ref make_bus(const StringId& name) override; - Ref find_bus(const StringId& name) override; - bool has_bus(const StringId& name) override; + Ref make_playback(Ref stream, const Strid& bus, const Strid& name) override; + Ref make_bus(const Strid& name) override; + Ref find_bus(const Strid& name) override; + bool has_bus(const Strid& name) override; - ALAudioBus* get_bus(const StringId& name); + ALAudioBus* get_bus(const Strid& name); ALCdevice* get_device(); ALCcontext* get_context(); std::recursive_mutex& get_mutex(); @@ -65,10 +65,10 @@ namespace wmoge { bool init_caps(); private: - fast_map> m_bus; - ALCdevice* m_device = nullptr; - ALCcontext* m_context = nullptr; - std::recursive_mutex m_mutex; + fast_map> m_bus; + ALCdevice* m_device = nullptr; + ALCcontext* m_context = nullptr; + std::recursive_mutex m_mutex; }; }// namespace wmoge diff --git a/engine/audio/openal/al_playback.cpp b/engine/audio/openal/al_playback.cpp index f800092d0..d1184ebcd 100644 --- a/engine/audio/openal/al_playback.cpp +++ b/engine/audio/openal/al_playback.cpp @@ -34,7 +34,7 @@ namespace wmoge { - ALAudioPlayback::ALAudioPlayback(Ref stream, StringId bus, const StringId& name, class ALAudioEngine& engine) + ALAudioPlayback::ALAudioPlayback(Ref stream, Strid bus, const Strid& name, class ALAudioEngine& engine) : m_engine(engine) { WG_AUTO_PROFILE_OPENAL("ALAudioPlayback::ALAudioPlayback"); diff --git a/engine/audio/openal/al_playback.hpp b/engine/audio/openal/al_playback.hpp index 5f72fa123..e876cb322 100644 --- a/engine/audio/openal/al_playback.hpp +++ b/engine/audio/openal/al_playback.hpp @@ -41,7 +41,7 @@ namespace wmoge { */ class ALAudioPlayback final : public AudioPlayback { public: - ALAudioPlayback(Ref stream, StringId bus, const StringId& name, class ALAudioEngine& engine); + ALAudioPlayback(Ref stream, Strid bus, const Strid& name, class ALAudioEngine& engine); ~ALAudioPlayback() override; void play() override; diff --git a/engine/core/class.cpp b/engine/core/class.cpp index 5998557cc..d159f02a7 100644 --- a/engine/core/class.cpp +++ b/engine/core/class.cpp @@ -31,26 +31,26 @@ namespace wmoge { - ClassMember::ClassMember(StringId name) + ClassMember::ClassMember(Strid name) : m_name(name) { } - ClassProperty::ClassProperty(VarType type, StringId name, StringId getter, StringId setter) + ClassProperty::ClassProperty(VarType type, Strid name, Strid getter, Strid setter) : ClassMember(name), m_getter(getter), m_setter(setter), m_type(type) { } - ClassField::ClassField(VarType type, StringId name) + ClassField::ClassField(VarType type, Strid name) : ClassProperty(type, name) { } - ClassMethod::ClassMethod(VarType ret, StringId name, std::vector args) + ClassMethod::ClassMethod(VarType ret, Strid name, std::vector args) : ClassMember(name), m_args_names(std::move(args)), m_ret(ret) { } Status ClassMethod::call(Object* object, int argc, const Var* argv, Var& ret) const { return m_callable(*this, object, argc, argv, ret); } - Class* ClassDB::class_emplace(StringId name) { + Class* ClassDB::class_emplace(Strid name) { Class* ptr = class_ptr(name); if (!ptr) { auto& storage = m_db[name]; @@ -59,7 +59,7 @@ namespace wmoge { } return ptr; } - Class* ClassDB::class_ptr(StringId name) { + Class* ClassDB::class_ptr(Strid name) { auto query = m_db.find(name); return query != m_db.end() ? query->second.get() : nullptr; } @@ -71,15 +71,15 @@ namespace wmoge { const Class* Class::super() const { return class_ptr(super_name()); } - const ClassProperty* Class::property(const StringId& name) const { + const ClassProperty* Class::property(const Strid& name) const { auto query = m_properties.find(name); return query != m_properties.end() ? query->second : nullptr; } - const ClassField* Class::field(const StringId& name) const { + const ClassField* Class::field(const Strid& name) const { auto query = m_fields.find(name); return query != m_fields.end() ? query->second : nullptr; } - const ClassMethod* Class::method(const StringId& name) const { + const ClassMethod* Class::method(const Strid& name) const { auto query = m_methods.find(name); return query != m_methods.end() ? query->second : nullptr; } @@ -103,15 +103,15 @@ namespace wmoge { return Ref(m_instantiate()); } - bool Class::is_inherited_from(const StringId& name) const { + bool Class::is_inherited_from(const Strid& name) const { return m_supers.find(name) != m_supers.end(); } - Class* Class::class_ptr(StringId name) { + Class* Class::class_ptr(Strid name) { ClassDB* db = class_db(); return db->class_ptr(name); } - Class* Class::register_class(const StringId& name, const StringId& super, std::size_t size, std::function instantiate) { + Class* Class::register_class(const Strid& name, const Strid& super, std::size_t size, std::function instantiate) { if (!class_ptr(super)) { WG_LOG_ERROR("no such supper class: " << super << " registered"); return nullptr; diff --git a/engine/core/class.hpp b/engine/core/class.hpp index cfa5779f0..7692d649f 100644 --- a/engine/core/class.hpp +++ b/engine/core/class.hpp @@ -49,14 +49,14 @@ namespace wmoge { */ class ClassMember { public: - ClassMember(StringId name); + ClassMember(Strid name); - [[nodiscard]] const StringId& name() const { return m_name; }; + [[nodiscard]] const Strid& name() const { return m_name; }; private: friend class Class; - StringId m_name; + Strid m_name; }; /** @@ -65,11 +65,11 @@ namespace wmoge { */ class ClassProperty : public ClassMember { public: - ClassProperty(VarType type, StringId name, StringId getter = StringId(), StringId setter = StringId()); + ClassProperty(VarType type, Strid name, Strid getter = Strid(), Strid setter = Strid()); - [[nodiscard]] const StringId& getter() const { return m_getter; }; - [[nodiscard]] const StringId& setter() const { return m_setter; }; - [[nodiscard]] VarType type() const { return m_type; }; + [[nodiscard]] const Strid& getter() const { return m_getter; }; + [[nodiscard]] const Strid& setter() const { return m_setter; }; + [[nodiscard]] VarType type() const { return m_type; }; [[nodiscard]] bool has_setter() const { return !m_setter.empty(); } [[nodiscard]] bool has_getter() const { return !m_getter.empty(); } @@ -77,9 +77,9 @@ namespace wmoge { private: friend class Class; - StringId m_getter; - StringId m_setter; - VarType m_type; + Strid m_getter; + Strid m_setter; + VarType m_type; }; /** @@ -88,7 +88,7 @@ namespace wmoge { */ class ClassField final : public ClassProperty { public: - ClassField(VarType type, StringId name); + ClassField(VarType type, Strid name); [[nodiscard]] int native_size() const { return m_native_size; } [[nodiscard]] int native_offset() const { return m_native_offset; } @@ -111,7 +111,7 @@ namespace wmoge { */ using Call = std::function; - ClassMethod(VarType ret, StringId name, std::vector args); + ClassMethod(VarType ret, Strid name, std::vector args); /** * @brief Call this method on object instance @@ -125,20 +125,20 @@ namespace wmoge { */ Status call(Object* object, int argc, const Var* argv, Var& ret) const; - [[nodiscard]] const std::vector& args_names() const { return m_args_names; } - [[nodiscard]] const std::vector& args_values() const { return m_args_values; } - [[nodiscard]] std::size_t args_count() const { return m_args_names.size(); } - [[nodiscard]] VarType ret() const { return m_ret; } + [[nodiscard]] const std::vector& args_names() const { return m_args_names; } + [[nodiscard]] const std::vector& args_values() const { return m_args_values; } + [[nodiscard]] std::size_t args_count() const { return m_args_names.size(); } + [[nodiscard]] VarType ret() const { return m_ret; } [[nodiscard]] bool has_ret() const { return m_ret != VarType::Nil; } private: friend class Class; - Call m_callable; - std::vector m_args_names; - std::vector m_args_values; - VarType m_ret; + Call m_callable; + std::vector m_args_names; + std::vector m_args_values; + VarType m_ret; }; /** @@ -147,12 +147,12 @@ namespace wmoge { */ class ClassDB final { public: - class Class* class_emplace(StringId name); - class Class* class_ptr(StringId name); + class Class* class_emplace(Strid name); + class Class* class_ptr(Strid name); static ClassDB* instance(); private: - std::unordered_map> m_db; + std::unordered_map> m_db; }; /** @@ -161,22 +161,22 @@ namespace wmoge { */ class Class final { public: - [[nodiscard]] const StringId& name() const { return m_name; } - [[nodiscard]] const StringId& super_name() const { return m_super_name; } + [[nodiscard]] const Strid& name() const { return m_name; } + [[nodiscard]] const Strid& super_name() const { return m_super_name; } [[nodiscard]] std::size_t size() const { return m_size; } [[nodiscard]] const Class* super() const; - [[nodiscard]] const ClassProperty* property(const StringId& name) const; - [[nodiscard]] const ClassField* field(const StringId& name) const; - [[nodiscard]] const ClassMethod* method(const StringId& name) const; + [[nodiscard]] const ClassProperty* property(const Strid& name) const; + [[nodiscard]] const ClassField* field(const Strid& name) const; + [[nodiscard]] const ClassMethod* method(const Strid& name) const; [[nodiscard]] std::vector members() const; [[nodiscard]] bool has_super() const { return !m_super_name.empty(); } - [[nodiscard]] bool is_inherited_from(const StringId& name) const; + [[nodiscard]] bool is_inherited_from(const Strid& name) const; [[nodiscard]] Ref instantiate() const; - static Class* class_ptr(StringId name); - static Class* register_class(const StringId& name, const StringId& super, std::size_t size, std::function instantiate); + static Class* class_ptr(Strid name); + static Class* register_class(const Strid& name, const Strid& super, std::size_t size, std::function instantiate); static ClassDB* class_db(); template @@ -199,15 +199,15 @@ namespace wmoge { static void register_types(); private: - std::function m_instantiate; - std::unordered_map m_properties; - std::unordered_map m_fields; - std::unordered_map m_methods; - std::unordered_set m_supers; - std::vector> m_members; - std::size_t m_size; - StringId m_name; - StringId m_super_name; + std::function m_instantiate; + std::unordered_map m_properties; + std::unordered_map m_fields; + std::unordered_map m_methods; + std::unordered_set m_supers; + std::vector> m_members; + std::size_t m_size; + Strid m_name; + Strid m_super_name; }; template diff --git a/engine/core/object.cpp b/engine/core/object.cpp index 221bfae1a..e024449c0 100644 --- a/engine/core/object.cpp +++ b/engine/core/object.cpp @@ -33,7 +33,7 @@ namespace wmoge { - Status Object::set(const StringId& property, const Var& value) { + Status Object::set(const Strid& property, const Var& value) { const Class* cls = class_ptr(); assert(cls); @@ -52,7 +52,7 @@ namespace wmoge { Var dummy; return setter->call(this, 1, &value, dummy); } - Status Object::get(const StringId& property, Var& value) { + Status Object::get(const Strid& property, Var& value) { const Class* cls = class_ptr(); assert(cls); @@ -70,7 +70,7 @@ namespace wmoge { return getter->call(this, 0, nullptr, value); } - Status Object::call(const StringId& method, int argc, const Var* argv, Var& ret) { + Status Object::call(const Strid& method, int argc, const Var* argv, Var& ret) { const Class* cls = class_ptr(); assert(cls); @@ -105,28 +105,28 @@ namespace wmoge { const Class* Object::class_ptr() const { return class_ptr_static(); } - const StringId& Object::class_name() const { + const Strid& Object::class_name() const { return class_name_static(); } - const StringId& Object::super_class_name() const { + const Strid& Object::super_class_name() const { return super_class_name_static(); } const Class* Object::class_ptr_static() { return Class::class_ptr(class_name_static()); } - const StringId& Object::class_name_static() { - static StringId name = SID("Object"); + const Strid& Object::class_name_static() { + static Strid name = SID("Object"); return name; } - const StringId& Object::super_class_name_static() { - static StringId name = SID(""); + const Strid& Object::super_class_name_static() { + static Strid name = SID(""); return name; } Status yaml_read_object(const YamlConstNodeRef& node, Ref& object) { assert(!object); - StringId class_name; + Strid class_name; WG_YAML_READ_AS(node, "class", class_name); auto* cls = Class::class_ptr(class_name); @@ -155,7 +155,7 @@ namespace wmoge { Status archive_read_object(Archive& archive, Ref& object) { assert(!object); - StringId class_name; + Strid class_name; WG_ARCHIVE_READ(archive, class_name); auto* cls = Class::class_ptr(class_name); diff --git a/engine/core/object.hpp b/engine/core/object.hpp index d8cfe00d3..b376536c3 100644 --- a/engine/core/object.hpp +++ b/engine/core/object.hpp @@ -64,10 +64,10 @@ namespace wmoge { virtual std::string to_string() { return ""; } virtual std::size_t hash() { return 0; } - virtual Status set(const StringId& property, const Var& value); - virtual Status get(const StringId& property, Var& value); - virtual Status call(const StringId& method, int argc, const Var* argv, Var& ret); - virtual Status signal(const StringId& signal) { return StatusCode::Ok; } + virtual Status set(const Strid& property, const Var& value); + virtual Status get(const Strid& property, Var& value); + virtual Status call(const Strid& method, int argc, const Var* argv, Var& ret); + virtual Status signal(const Strid& signal) { return StatusCode::Ok; } virtual Status copy_to(Object& other) const { return StatusCode::Ok; } virtual Status read_from_yaml(const YamlConstNodeRef& node) { return StatusCode::NotImplemented; } virtual Status write_to_yaml(YamlNodeRef node) const { return StatusCode::NotImplemented; } @@ -78,12 +78,12 @@ namespace wmoge { virtual Ref duplicate() const; virtual const class Class* class_ptr() const; - virtual const StringId& class_name() const; - virtual const StringId& super_class_name() const; + virtual const Strid& class_name() const; + virtual const Strid& super_class_name() const; static const class Class* class_ptr_static(); - static const StringId& class_name_static(); - static const StringId& super_class_name_static(); + static const Strid& class_name_static(); + static const Strid& super_class_name_static(); friend Status yaml_read_object(const YamlConstNodeRef& node, Ref& object); friend Status yaml_write_object(YamlNodeRef node, const Ref& object); @@ -196,17 +196,17 @@ public: ~name() override = default; \ static void register_class(); \ const class Class* class_ptr() const override { return class_ptr_static(); } \ - const StringId& class_name() const override { return class_name_static(); } \ - const StringId& super_class_name() const override { return super_class_name_static(); } \ + const Strid& class_name() const override { return class_name_static(); } \ + const Strid& super_class_name() const override { return super_class_name_static(); } \ static const class Class* class_ptr_static() { \ thread_local Class* cls = Class::class_ptr(class_name_static()); \ return cls; \ } \ - static const StringId& class_name_static() { \ - thread_local StringId sid = SID(#name); \ + static const Strid& class_name_static() { \ + thread_local Strid sid = SID(#name); \ return sid; \ } \ - static const StringId& super_class_name_static() { \ + static const Strid& super_class_name_static() { \ return super::class_name_static(); \ } diff --git a/engine/core/string_id.cpp b/engine/core/string_id.cpp index dc9af612f..af5a7d410 100644 --- a/engine/core/string_id.cpp +++ b/engine/core/string_id.cpp @@ -73,38 +73,38 @@ namespace wmoge { return g_storage; } - StringId::StringId() { + Strid::Strid() { static std::string g_empty; m_string = &g_empty; } - StringId::StringId(const std::string& string) : StringId() { + Strid::Strid(const std::string& string) : Strid() { if (string.empty()) return; StringStorage::instance().get_or_create(string, m_string); } - bool StringId::operator==(const StringId& other) const { + bool Strid::operator==(const Strid& other) const { return m_string == other.m_string; } - bool StringId::operator!=(const StringId& other) const { + bool Strid::operator!=(const Strid& other) const { return m_string != other.m_string; } - bool StringId::operator<(const StringId& other) const { + bool Strid::operator<(const Strid& other) const { return *m_string < *other.m_string; } - std::size_t StringId::id() const { + std::size_t Strid::id() const { return reinterpret_cast(m_string); } - std::size_t StringId::hash() const { + std::size_t Strid::hash() const { return std::hash()(id()); } - const std::string& StringId::str() const { + const std::string& Strid::str() const { return *m_string; } diff --git a/engine/core/string_id.hpp b/engine/core/string_id.hpp index 5ec916170..fa9fc7e85 100644 --- a/engine/core/string_id.hpp +++ b/engine/core/string_id.hpp @@ -36,17 +36,17 @@ namespace wmoge { /** - * @class StringId + * @class Strid * @brief Interned globally-stored string based ids for fast lookups */ - class StringId { + class Strid { public: - StringId(); - explicit StringId(const std::string& string); + Strid(); + explicit Strid(const std::string& string); - bool operator==(const StringId& other) const; - bool operator!=(const StringId& other) const; - bool operator<(const StringId& other) const; + bool operator==(const Strid& other) const; + bool operator!=(const Strid& other) const; + bool operator<(const Strid& other) const; [[nodiscard]] bool empty() const { return m_string->empty(); } @@ -58,23 +58,23 @@ namespace wmoge { const std::string* m_string; }; - static_assert(std::is_trivially_destructible_v, "string must be trivial as ptr or int"); + static_assert(std::is_trivially_destructible_v, "string must be trivial as ptr or int"); - inline std::ostream& operator<<(std::ostream& stream, const StringId& id) { + inline std::ostream& operator<<(std::ostream& stream, const Strid& id) { stream << '\'' << id.str() << '\''; return stream; } -#define SID(id) ::wmoge::StringId(id) +#define SID(id) ::wmoge::Strid(id) }// namespace wmoge namespace std { template<> - struct hash { + struct hash { public: - std::size_t operator()(const wmoge::StringId& id) const { + std::size_t operator()(const wmoge::Strid& id) const { return id.hash(); } }; diff --git a/engine/core/task.cpp b/engine/core/task.cpp index 6fbef0b57..1e0cf195d 100644 --- a/engine/core/task.cpp +++ b/engine/core/task.cpp @@ -33,7 +33,7 @@ namespace wmoge { - Task::Task(StringId name, TaskRunnable runnable) + Task::Task(Strid name, TaskRunnable runnable) : m_runnable(std::move(runnable)), m_task_manager(Engine::instance()->task_manager()), m_name(name) { diff --git a/engine/core/task.hpp b/engine/core/task.hpp index 0688e9d31..d97420365 100644 --- a/engine/core/task.hpp +++ b/engine/core/task.hpp @@ -64,7 +64,7 @@ namespace wmoge { * @param name Name of the task for debugging * @param runnable Function to execute as a task job */ - explicit Task(StringId name, TaskRunnable runnable); + explicit Task(Strid name, TaskRunnable runnable); /** * @brief Kick off task for execution @@ -93,7 +93,7 @@ namespace wmoge { [[nodiscard]] TaskRunnable& runnable() { return m_runnable; } /** @brief Optional task label for debugging */ - [[nodiscard]] const StringId& name() const { return m_name; } + [[nodiscard]] const Strid& name() const { return m_name; } /** @brief Task manager to execute this task; null if used default engine manager */ [[nodiscard]] TaskManager* task_manager() const { return m_task_manager; } @@ -101,7 +101,7 @@ namespace wmoge { private: TaskRunnable m_runnable; TaskManager* m_task_manager = nullptr; - StringId m_name; + Strid m_name; }; }// namespace wmoge \ No newline at end of file diff --git a/engine/core/task_manager.hpp b/engine/core/task_manager.hpp index 12a34fbcb..fbc1e980f 100644 --- a/engine/core/task_manager.hpp +++ b/engine/core/task_manager.hpp @@ -44,14 +44,14 @@ namespace wmoge { */ class TaskContext { public: - [[nodiscard]] const StringId& thread_name() const { return m_thread_name; } - [[nodiscard]] int thread_id() const { return m_thread_id; } + [[nodiscard]] const Strid& thread_name() const { return m_thread_name; } + [[nodiscard]] int thread_id() const { return m_thread_id; } private: friend class TaskManager; - StringId m_thread_name; - int m_thread_id = -1; + Strid m_thread_name; + int m_thread_id = -1; }; /** diff --git a/engine/core/task_parallel_for.cpp b/engine/core/task_parallel_for.cpp index 074d94db9..4966e0ab5 100644 --- a/engine/core/task_parallel_for.cpp +++ b/engine/core/task_parallel_for.cpp @@ -33,7 +33,7 @@ namespace wmoge { - TaskParallelFor::TaskParallelFor(StringId name, TaskRunnableFor runnable) + TaskParallelFor::TaskParallelFor(Strid name, TaskRunnableFor runnable) : m_runnable(std::move(runnable)), m_task_manager(Engine::instance()->task_manager()), m_name(name) { diff --git a/engine/core/task_parallel_for.hpp b/engine/core/task_parallel_for.hpp index 21ee0bfc5..fdded4152 100644 --- a/engine/core/task_parallel_for.hpp +++ b/engine/core/task_parallel_for.hpp @@ -67,7 +67,7 @@ namespace wmoge { * @param name Name of the task for debugging * @param runnable Function to execute as a task job */ - explicit TaskParallelFor(StringId name, TaskRunnableFor runnable); + explicit TaskParallelFor(Strid name, TaskRunnableFor runnable); /** * @brief Kick off task for execution @@ -101,7 +101,7 @@ namespace wmoge { [[nodiscard]] TaskRunnableFor& runnable() { return m_runnable; } /** @brief Optional task label for debugging */ - [[nodiscard]] const StringId& name() const { return m_name; } + [[nodiscard]] const Strid& name() const { return m_name; } /** @brief Task manager to execute this task; null if used default engine manager */ [[nodiscard]] TaskManager* task_manager() const { return m_task_manager; } @@ -109,7 +109,7 @@ namespace wmoge { private: TaskRunnableFor m_runnable; TaskManager* m_task_manager = nullptr; - StringId m_name; + Strid m_name; }; }// namespace wmoge \ No newline at end of file diff --git a/engine/core/task_runtime.cpp b/engine/core/task_runtime.cpp index 14d233c13..86e954dcd 100644 --- a/engine/core/task_runtime.cpp +++ b/engine/core/task_runtime.cpp @@ -34,7 +34,7 @@ namespace wmoge { - TaskRuntime::TaskRuntime(StringId name, TaskRunnable runnable, TaskManager* task_manager) { + TaskRuntime::TaskRuntime(Strid name, TaskRunnable runnable, TaskManager* task_manager) { assert(runnable); assert(task_manager); @@ -79,7 +79,7 @@ namespace wmoge { } } - TaskRuntimeParallelFor::TaskRuntimeParallelFor(StringId name, TaskRunnableFor runnable, TaskManager* task_manager, int num_elements, int batch_size) { + TaskRuntimeParallelFor::TaskRuntimeParallelFor(Strid name, TaskRunnableFor runnable, TaskManager* task_manager, int num_elements, int batch_size) { assert(runnable); assert(task_manager); assert(num_elements > 0); diff --git a/engine/core/task_runtime.hpp b/engine/core/task_runtime.hpp index 23b1a4f72..876c5a768 100644 --- a/engine/core/task_runtime.hpp +++ b/engine/core/task_runtime.hpp @@ -44,7 +44,7 @@ namespace wmoge { */ class TaskRuntime final : public AsyncState { public: - TaskRuntime(StringId name, TaskRunnable runnable, TaskManager* task_manager); + TaskRuntime(Strid name, TaskRunnable runnable, TaskManager* task_manager); void notify(AsyncStatus status, AsyncStateBase* invoker) override; void wait_completed() override; @@ -54,7 +54,7 @@ namespace wmoge { private: TaskRunnable m_runnable; TaskManager* m_task_manager; - StringId m_name; + Strid m_name; }; /** @@ -63,7 +63,7 @@ namespace wmoge { */ class TaskRuntimeParallelFor final : public AsyncState { public: - TaskRuntimeParallelFor(StringId name, TaskRunnableFor runnable, TaskManager* task_manager, int num_elements, int batch_size); + TaskRuntimeParallelFor(Strid name, TaskRunnableFor runnable, TaskManager* task_manager, int num_elements, int batch_size); void notify(AsyncStatus status, AsyncStateBase* invoker) override; void wait_completed() override; @@ -72,7 +72,7 @@ namespace wmoge { private: TaskRunnableFor m_runnable; TaskManager* m_task_manager; - StringId m_name; + Strid m_name; int m_num_elements; int m_batch_size; int m_num_tasks; diff --git a/engine/core/var.cpp b/engine/core/var.cpp index e5e24270d..9d25ae20a 100644 --- a/engine/core/var.cpp +++ b/engine/core/var.cpp @@ -55,9 +55,9 @@ namespace wmoge { m_type = VarType::String; new (m_data.m_mem) String(std::move(value)); } - Var::Var(StringId value) { - m_type = VarType::StringId; - new (m_data.m_mem) StringId(std::move(value)); + Var::Var(Strid value) { + m_type = VarType::Strid; + new (m_data.m_mem) Strid(std::move(value)); } Var::Var(Array value) { m_type = VarType::Array; @@ -113,8 +113,8 @@ namespace wmoge { case VarType::String: new (m_data.m_mem) String(var.as()); break; - case VarType::StringId: - new (m_data.m_mem) StringId(var.as()); + case VarType::Strid: + new (m_data.m_mem) Strid(var.as()); break; case VarType::Array: new (m_data.m_mem) Array(var.as()); @@ -161,8 +161,8 @@ namespace wmoge { case VarType::String: new (m_data.m_mem) String(std::move(var.as())); break; - case VarType::StringId: - new (m_data.m_mem) StringId(std::move(var.as())); + case VarType::Strid: + new (m_data.m_mem) Strid(std::move(var.as())); break; case VarType::Array: new (m_data.m_mem) Array(std::move(var.as())); @@ -234,8 +234,8 @@ namespace wmoge { return Math::abs(m_data.m_float - var.m_data.m_float) <= Math::THRESH_COMPARE_FLOAT32; case VarType::String: return as() == var.as(); - case VarType::StringId: - return as() == var.as(); + case VarType::Strid: + return as() == var.as(); case VarType::Array: { const auto& ar1 = as(); const auto& ar2 = var.as(); @@ -267,8 +267,8 @@ namespace wmoge { return Math::abs(m_data.m_float - var.m_data.m_float) > Math::THRESH_COMPARE_FLOAT32; case VarType::String: return as() != var.as(); - case VarType::StringId: - return as() != var.as(); + case VarType::Strid: + return as() != var.as(); case VarType::Array: { const auto& ar1 = as(); const auto& ar2 = var.as(); @@ -300,8 +300,8 @@ namespace wmoge { return m_data.m_float < var.m_data.m_float; case VarType::String: return as() < var.as(); - case VarType::StringId: - return as() < var.as(); + case VarType::Strid: + return as() < var.as(); case VarType::Array: { const auto& ar1 = as(); const auto& ar2 = var.as(); @@ -373,8 +373,8 @@ namespace wmoge { return static_cast(m_data.m_float); case VarType::String: return std::stoll(as()); - case VarType::StringId: - return std::stoll(as().str()); + case VarType::Strid: + return std::stoll(as().str()); default: return 0; } @@ -395,8 +395,8 @@ namespace wmoge { return m_data.m_float; case VarType::String: return std::stod(as()); - case VarType::StringId: - return std::stod(as().str()); + case VarType::Strid: + return std::stod(as().str()); default: return 0; } @@ -408,20 +408,20 @@ namespace wmoge { switch (type()) { case VarType::String: return as(); - case VarType::StringId: - return as().str(); + case VarType::Strid: + return as().str(); default: return String(); } } - Var::operator StringId() const { + Var::operator Strid() const { switch (type()) { - case VarType::StringId: - return as(); + case VarType::Strid: + return as(); case VarType::String: - return StringId(as()); + return Strid(as()); default: - return StringId(); + return Strid(); } } Var::operator Array() const { @@ -476,8 +476,8 @@ namespace wmoge { case VarType::String: as().~String(); break; - case VarType::StringId: - as().~StringId(); + case VarType::Strid: + as().~Strid(); break; case VarType::Array: as().~Array(); @@ -539,8 +539,8 @@ namespace wmoge { case VarType::String: stream << '"' << as() << '"'; break; - case VarType::StringId: - stream << as(); + case VarType::Strid: + stream << as(); break; case VarType::Array: stream << '['; @@ -626,8 +626,8 @@ namespace wmoge { case VarType::String: accum ^= std::hash()(as()); break; - case VarType::StringId: - accum ^= std::hash()(as()); + case VarType::Strid: + accum ^= std::hash()(as()); break; case VarType::Array: for (const auto& v : as()) { diff --git a/engine/core/var.hpp b/engine/core/var.hpp index 37142bff5..ee4846fa2 100644 --- a/engine/core/var.hpp +++ b/engine/core/var.hpp @@ -53,7 +53,7 @@ namespace wmoge { Int = 1, Float = 2, String = 3, - StringId = 4, + Strid = 4, Array = 5, Map = 6, Object = 7, @@ -96,7 +96,7 @@ namespace wmoge { Var(int value); Var(double value); Var(String value); - Var(StringId value); + Var(Strid value); Var(Array value); Var(Map value); Var(const Ref& value); @@ -131,7 +131,7 @@ namespace wmoge { operator double() const; operator std::size_t() const; operator String() const; - operator StringId() const; + operator Strid() const; operator Array() const; operator Map() const; operator Ref() const; @@ -161,7 +161,7 @@ namespace wmoge { static constexpr std::size_t MEM_SIZE = Math::const_max(); VarType m_type = VarType::Nil; diff --git a/engine/debug/console.cpp b/engine/debug/console.cpp index c66634b42..a458dbb39 100644 --- a/engine/debug/console.cpp +++ b/engine/debug/console.cpp @@ -64,7 +64,7 @@ namespace wmoge { return (std::string) m_value; } - ConsoleVar* Console::register_var(StringId name, Var default_value, std::string help, std::function on_changed) { + ConsoleVar* Console::register_var(Strid name, Var default_value, std::string help, std::function on_changed) { std::lock_guard lock(m_mutex); if (m_vars.find(name) != m_vars.end()) { @@ -81,7 +81,7 @@ namespace wmoge { return &var; } - ConsoleCmd* Console::register_cmd(StringId name, std::string help, std::function&)> function) { + ConsoleCmd* Console::register_cmd(Strid name, std::string help, std::function&)> function) { std::lock_guard lock(m_mutex); if (m_cmds.find(name) != m_cmds.end()) { @@ -96,12 +96,12 @@ namespace wmoge { return &cmd; } - ConsoleVar* Console::find_var(const StringId& name) { + ConsoleVar* Console::find_var(const Strid& name) { std::lock_guard lock(m_mutex); auto query = m_vars.find(name); return query != m_vars.end() ? &query->second : nullptr; } - ConsoleCmd* Console::find_cmd(const StringId& name) { + ConsoleCmd* Console::find_cmd(const Strid& name) { std::lock_guard lock(m_mutex); auto query = m_cmds.find(name); return query != m_cmds.end() ? &query->second : nullptr; @@ -306,7 +306,7 @@ namespace wmoge { return 0; } - StringId name(args[1]); + Strid name(args[1]); if (auto var = find_var(name)) { add_suggestion(var->get_help()); @@ -327,7 +327,7 @@ namespace wmoge { return 0; } - StringId name(args[1]); + Strid name(args[1]); if (auto var = find_var(name)) { add_info(var->get_value().to_string()); @@ -384,8 +384,8 @@ namespace wmoge { return 0; } - StringId name(args[1]); - Var value(args[2]); + Strid name(args[1]); + Var value(args[2]); if (auto var = find_var(name)) { var->change(std::move(value)); diff --git a/engine/debug/console.hpp b/engine/debug/console.hpp index 1058a0296..7530c62be 100644 --- a/engine/debug/console.hpp +++ b/engine/debug/console.hpp @@ -49,7 +49,7 @@ namespace wmoge { public: virtual ~ConsoleObject() = default; - [[nodiscard]] const StringId& get_name() const { return m_name; } + [[nodiscard]] const Strid& get_name() const { return m_name; } [[nodiscard]] const std::string& get_help() const { return m_help; } [[nodiscard]] virtual bool is_cmd() const { return false; } @@ -57,7 +57,7 @@ namespace wmoge { protected: friend class Console; - StringId m_name; + Strid m_name; std::string m_help; }; @@ -119,7 +119,7 @@ namespace wmoge { * * @return Registered variable on success */ - ConsoleVar* register_var(StringId name, Var default_value, std::string help, std::function on_changed = {}); + ConsoleVar* register_var(Strid name, Var default_value, std::string help, std::function on_changed = {}); /** * @brief Register new console command * @@ -129,12 +129,12 @@ namespace wmoge { * * @return Registered command on success */ - ConsoleCmd* register_cmd(StringId name, std::string help, std::function& args)> function); + ConsoleCmd* register_cmd(Strid name, std::string help, std::function& args)> function); /** @brief Find existing console var by name */ - ConsoleVar* find_var(const StringId& name); + ConsoleVar* find_var(const Strid& name); /** @brief Find existing console cmd by name */ - ConsoleCmd* find_cmd(const StringId& name); + ConsoleCmd* find_cmd(const Strid& name); /** @brief Add message to the console as a text */ void add_info(const std::string& text); @@ -170,12 +170,12 @@ namespace wmoge { }; private: - fast_map m_vars; - fast_map m_cmds; - std::vector m_messages; - std::vector m_history; - std::vector m_to_process; - std::recursive_mutex m_mutex; + fast_map m_vars; + fast_map m_cmds; + std::vector m_messages; + std::vector m_history; + std::vector m_to_process; + std::recursive_mutex m_mutex; EventListenerHnd m_actions_listener; EventListenerHnd m_keyboard_listener; diff --git a/engine/debug/profiler.cpp b/engine/debug/profiler.cpp index ab47e5000..959b40501 100644 --- a/engine/debug/profiler.cpp +++ b/engine/debug/profiler.cpp @@ -34,11 +34,11 @@ namespace wmoge { - ProfilerMark::ProfilerMark(StringId label, - StringId in_function, - StringId in_function_sig, - StringId in_file, - StringId in_category, + ProfilerMark::ProfilerMark(Strid label, + Strid in_function, + Strid in_function_sig, + Strid in_file, + Strid in_category, std::size_t in_line) : label(label), function(in_function), @@ -79,7 +79,7 @@ namespace wmoge { } } - void ProfilerCapture::set_name(StringId name) { + void ProfilerCapture::set_name(Strid name) { m_name = name; } void ProfilerCapture::set_file(std::string file) { @@ -168,7 +168,7 @@ namespace wmoge { std::lock_guard guard(m_mutex); if (m_capture) m_capture->add_entry(std::move(entry)); } - void Profiler::add_tid(std::thread::id id, StringId name) { + void Profiler::add_tid(std::thread::id id, Strid name) { std::lock_guard guard(m_mutex); m_tid_names[id] = std::move(name); } @@ -178,7 +178,7 @@ namespace wmoge { bool Profiler::is_collecting() { return m_is_collecting.load(); } - std::unordered_map Profiler::get_tid_names() const { + std::unordered_map Profiler::get_tid_names() const { return m_tid_names; } diff --git a/engine/debug/profiler.hpp b/engine/debug/profiler.hpp index 6e7c02a73..9589c04ab 100644 --- a/engine/debug/profiler.hpp +++ b/engine/debug/profiler.hpp @@ -47,15 +47,15 @@ namespace wmoge { */ struct ProfilerMark { public: - ProfilerMark(StringId label, StringId in_function, StringId in_function_sig, - StringId in_file, StringId in_category, + ProfilerMark(Strid label, Strid in_function, Strid in_function_sig, + Strid in_file, Strid in_category, std::size_t in_line); - StringId label; - StringId function; - StringId function_sig; - StringId file; - StringId category; + Strid label; + Strid function; + Strid function_sig; + Strid file; + Strid category; std::size_t line; std::string pretty_name; class Profiler* profiler; @@ -96,16 +96,16 @@ namespace wmoge { public: ProfilerCapture() = default; - void set_name(StringId name); + void set_name(Strid name); void set_file(std::string file); void add_entry(ProfilerEntry&& entry); void save_to_json(); - [[nodiscard]] const StringId& get_name() const { return m_name; } + [[nodiscard]] const Strid& get_name() const { return m_name; } [[nodiscard]] const std::vector& get_entries() const { return m_entries; } private: - StringId m_name; + Strid m_name; std::string m_file; std::vector m_entries; }; @@ -122,18 +122,18 @@ namespace wmoge { void start_capture(std::shared_ptr capture); void end_capture(); void add_entry(ProfilerEntry&& entry); - void add_tid(std::thread::id id, StringId name); + void add_tid(std::thread::id id, Strid name); - bool is_enabled(); - bool is_collecting(); - std::unordered_map get_tid_names() const; + bool is_enabled(); + bool is_collecting(); + std::unordered_map get_tid_names() const; private: - std::atomic_bool m_is_enabled{false}; - std::atomic_bool m_is_collecting{false}; - std::shared_ptr m_capture; - std::unordered_map m_tid_names; - SpinMutex m_mutex; + std::atomic_bool m_is_enabled{false}; + std::atomic_bool m_is_collecting{false}; + std::shared_ptr m_capture; + std::unordered_map m_tid_names; + SpinMutex m_mutex; }; }// namespace wmoge diff --git a/engine/ecs/ecs_component.hpp b/engine/ecs/ecs_component.hpp index 31cfc8bd0..6e2c3c3a4 100644 --- a/engine/ecs/ecs_component.hpp +++ b/engine/ecs/ecs_component.hpp @@ -45,14 +45,14 @@ namespace wmoge { */ template struct EcsComponent { - static int IDX; - static StringId NAME; + static int IDX; + static Strid NAME; static bool is(int id) { return id == IDX; } static bool is(const std::string& name) { return name == NAME.str(); } - static bool is(const StringId& name) { return name == NAME; } + static bool is(const Strid& name) { return name == NAME; } - static void bind(int id, const StringId& name) { + static void bind(int id, const Strid& name) { IDX = id; NAME = name; } @@ -62,19 +62,19 @@ namespace wmoge { int EcsComponent::IDX = -1; template - StringId EcsComponent::NAME; + Strid EcsComponent::NAME; /** * @class EcsComponentInfo * @brief Holds information required to work with components */ struct EcsComponentInfo { - StringId name; - int idx = -1; - int size = -1; - std::function create; - std::function destroy; - std::function swap; + Strid name; + int idx = -1; + int size = -1; + std::function create; + std::function destroy; + std::function swap; }; #define WG_ECS_COMPONENT(ecs_component_class) \ diff --git a/engine/ecs/ecs_core.cpp b/engine/ecs/ecs_core.cpp index d8a83f780..145f3ade3 100644 --- a/engine/ecs/ecs_core.cpp +++ b/engine/ecs/ecs_core.cpp @@ -51,7 +51,7 @@ namespace wmoge { for (int i = 0; i < EcsLimits::MAX_COMPONENTS; i++) { if (test(i)) { - const StringId& name = registry->get_component_info(i).name; + const Strid& name = registry->get_component_info(i).name; stream << name << ","; } } @@ -77,7 +77,7 @@ namespace wmoge { for (int i = 0; i < EcsLimits::MAX_COMPONENTS; i++) { if (affected.test(i)) { - const StringId& name = registry->get_component_info(i).name; + const Strid& name = registry->get_component_info(i).name; stream << (write.test(i) ? "rw-" : "r-") << name << ","; } } diff --git a/engine/ecs/ecs_core.hpp b/engine/ecs/ecs_core.hpp index 336b3f1cc..9ef1ee056 100644 --- a/engine/ecs/ecs_core.hpp +++ b/engine/ecs/ecs_core.hpp @@ -109,14 +109,16 @@ namespace wmoge { EcsQuery() = default; template - void set_read() { + EcsQuery& set_read() { read.set(Component::IDX); + return *this; } template - void set_write() { + EcsQuery& set_write() { read.set(Component::IDX); write.set(Component::IDX); + return *this; } template diff --git a/engine/ecs/ecs_memory.cpp b/engine/ecs/ecs_memory.cpp index 8c6379c22..1675fa15d 100644 --- a/engine/ecs/ecs_memory.cpp +++ b/engine/ecs/ecs_memory.cpp @@ -53,7 +53,7 @@ namespace wmoge { return ((std::uint8_t*) m_chunks[idx / m_chunk_size]) + m_element_size * (idx % m_chunk_size); } - EcsArchStorage::EcsArchStorage(EcsArch arch, class EcsWorld* world) : m_world(world), m_arch(arch) { + EcsArchStorage::EcsArchStorage(EcsArch arch) : m_arch(arch) { WG_AUTO_PROFILE_ECS("EcsArchStorage::EcsArchStorage"); EcsRegistry* registry = Engine::instance()->ecs_registry(); @@ -92,7 +92,7 @@ namespace wmoge { *m_pool.back().get_element(entity_idx) = entity; m_arch.for_each_component([&](int component_idx) { - m_components_info[component_idx]->create(m_world, m_pool[component_idx].get_element_raw(entity_idx)); + m_components_info[component_idx]->create(m_pool[component_idx].get_element_raw(entity_idx)); }); out_entity_idx = entity_idx; @@ -125,7 +125,7 @@ namespace wmoge { } m_arch.for_each_component([&](int component_idx) { - m_components_info[component_idx]->destroy(m_world, m_pool[component_idx].get_element_raw(last_entity)); + m_components_info[component_idx]->destroy(m_pool[component_idx].get_element_raw(last_entity)); }); m_size -= 1; @@ -137,7 +137,7 @@ namespace wmoge { for (int entity_idx = 0; entity_idx < m_size; entity_idx++) { *m_pool.back().get_element(entity_idx) = EcsEntity(); m_arch.for_each_component([&](int component_idx) { - m_components_info[component_idx]->destroy(m_world, m_pool[component_idx].get_element_raw(entity_idx)); + m_components_info[component_idx]->destroy(m_pool[component_idx].get_element_raw(entity_idx)); }); } @@ -147,6 +147,7 @@ namespace wmoge { void* EcsArchStorage::get_component(int entity_idx, int component_idx) const { assert(entity_idx < m_size); assert(component_idx < EcsLimits::MAX_COMPONENTS); + assert(m_components_info[component_idx]); assert(m_pool.back().get_element(entity_idx)->is_valid()); return m_pool[component_idx].get_element_raw(entity_idx); diff --git a/engine/ecs/ecs_memory.hpp b/engine/ecs/ecs_memory.hpp index 002d0b197..65eda1cb7 100644 --- a/engine/ecs/ecs_memory.hpp +++ b/engine/ecs/ecs_memory.hpp @@ -70,7 +70,7 @@ namespace wmoge { */ class EcsArchStorage { public: - explicit EcsArchStorage(EcsArch arch, class EcsWorld* world); + explicit EcsArchStorage(EcsArch arch); EcsArchStorage(const EcsArchStorage&) = delete; EcsArchStorage(EcsArchStorage&&) = delete; ~EcsArchStorage(); @@ -91,8 +91,7 @@ namespace wmoge { std::array m_pool{}; std::array m_components_info{}; - class EcsWorld* m_world = nullptr; - const EcsArch m_arch; + const EcsArch m_arch; int m_chunk_size = 0;// num entities data within single chunk int m_size = 0;// count of allocated entities diff --git a/engine/ecs/ecs_registry.cpp b/engine/ecs/ecs_registry.cpp index 8c78185b7..441580eae 100644 --- a/engine/ecs/ecs_registry.cpp +++ b/engine/ecs/ecs_registry.cpp @@ -41,12 +41,12 @@ namespace wmoge { m_entity_pool = std::make_unique(m_chunk_size * sizeof(EcsEntity), m_expand_size); } - int EcsRegistry::get_component_idx(const StringId& name) { + int EcsRegistry::get_component_idx(const Strid& name) { assert(m_components_name_to_idx.find(name) != m_components_name_to_idx.end()); return m_components_name_to_idx[name]; } - const EcsComponentInfo& EcsRegistry::get_component_info(const StringId& name) { + const EcsComponentInfo& EcsRegistry::get_component_info(const Strid& name) { assert(m_components_name_to_idx.find(name) != m_components_name_to_idx.end()); return m_components_info[m_components_name_to_idx[name]]; } diff --git a/engine/ecs/ecs_registry.hpp b/engine/ecs/ecs_registry.hpp index 3ca2c96f4..f27991b8a 100644 --- a/engine/ecs/ecs_registry.hpp +++ b/engine/ecs/ecs_registry.hpp @@ -52,8 +52,8 @@ namespace wmoge { EcsRegistry(EcsRegistry&&) = delete; ~EcsRegistry() = default; - [[nodiscard]] int get_component_idx(const StringId& name); - [[nodiscard]] const EcsComponentInfo& get_component_info(const StringId& name); + [[nodiscard]] int get_component_idx(const Strid& name); + [[nodiscard]] const EcsComponentInfo& get_component_info(const Strid& name); [[nodiscard]] const EcsComponentInfo& get_component_info(int idx); [[nodiscard]] MemPool& get_component_pool(int idx); [[nodiscard]] MemPool& get_entity_pool(); @@ -63,16 +63,10 @@ namespace wmoge { template void register_component(); - template - void on_create_hook(Func&& on_destroy); - - template - void on_destroy_hook(Func&& on_destroy); - private: std::array m_components_info; // type info of component, indexed by component id std::array, EcsLimits::MAX_COMPONENTS> m_components_pool; // pools to allocate components chunks - fast_map m_components_name_to_idx;// resolve component name to its idx + fast_map m_components_name_to_idx;// resolve component name to its idx std::unique_ptr m_entity_pool; // pool to allocate entities chunks int m_chunk_size = 16;// num of components of a single type sequentially allocate in one chunk @@ -86,7 +80,7 @@ namespace wmoge { assert(component_idx < EcsLimits::MAX_COMPONENTS); EcsComponentInfo& component_info = m_components_info[component_idx]; - assert(component_info.name == StringId()); + assert(component_info.name == Strid()); assert(component_info.idx == -1); assert(component_info.size == -1); @@ -96,11 +90,11 @@ namespace wmoge { component_info.idx = Component::IDX; component_info.size = sizeof(Component); - component_info.create = [](class EcsWorld*, void* mem) -> void { + component_info.create = [](void* mem) -> void { new (mem) Component(); }; - component_info.destroy = [](class EcsWorld*, void* mem) -> void { + component_info.destroy = [](void* mem) -> void { static_cast(mem)->~Component(); }; @@ -114,24 +108,4 @@ namespace wmoge { m_components_pool[component_info.idx] = std::make_unique(component_info.size * m_chunk_size, m_expand_size); } - template - inline void EcsRegistry::on_create_hook(Func&& on_destroy) { - EcsComponentInfo& component_info = m_components_info[Component::IDX]; - - component_info.create = [](class EcsWorld* w, void* mem) -> void { - new (mem) Component(); - f(*w, *(static_cast(mem))); - }; - } - - template - inline void EcsRegistry::on_destroy_hook(Func&& on_destroy) { - EcsComponentInfo& component_info = m_components_info[Component::IDX]; - - component_info.destroy = [f = std::forward(on_destroy)](class EcsWorld* w, void* mem) -> void { - f(*w, *(static_cast(mem))); - static_cast(mem)->~Component(); - }; - } - }// namespace wmoge \ No newline at end of file diff --git a/engine/ecs/ecs_system.hpp b/engine/ecs/ecs_system.hpp index dd234e6fe..bff781ecf 100644 --- a/engine/ecs/ecs_system.hpp +++ b/engine/ecs/ecs_system.hpp @@ -31,6 +31,7 @@ #include "ecs/ecs_core.hpp" #include "ecs/ecs_memory.hpp" +#include #include #include #include @@ -43,15 +44,16 @@ namespace wmoge { * @brief Type of a system */ enum class EcsSystemType { - Default + Update,// Runtime system for every frame updates + Destroy// Called on entity deletion }; /** * @brief How system must be executed */ enum class EcsSystemExecMode { - OnMain, - OnWorkers + OnMain, // On main (game) thread only without parallel speed up + OnWorkers// In task manager with multiple parallel tasks }; /** @@ -80,9 +82,9 @@ namespace wmoge { */ virtual void process_batch(class EcsWorld& world, EcsArchStorage& storage, int start_entity, int count) = 0; - [[nodiscard]] virtual EcsSystemType get_type() const { return EcsSystemType::Default; } + [[nodiscard]] virtual EcsSystemType get_type() const { return EcsSystemType::Update; } [[nodiscard]] virtual EcsSystemExecMode get_exec_mode() const { return EcsSystemExecMode::OnMain; } - [[nodiscard]] virtual StringId get_name() const = 0; + [[nodiscard]] virtual Strid get_name() const = 0; [[nodiscard]] virtual EcsQuery get_query() const = 0; }; @@ -91,13 +93,12 @@ namespace wmoge { */ struct EcsSystemInfo { EcsQuery query; // system query, which archetypes its affects + EcsSystemType type; // system type (exec, deletion, etc.) EcsSystemExecMode exec_mode; // execution mode std::shared_ptr system; // cached system ptr std::vector filtered_arch;// pre-filtered arch idx to execute using this system }; -#define WG_ECS_SYSTEM_BIND(System) EcsSystemBindHelper(this, &System::process).process_batch(world, storage, start_entity, count) - /** * @class EcsSystemBindHelper * @brief Executor implementation for binding C++ systems @@ -108,7 +109,7 @@ namespace wmoge { template class EcsSystemBindHelper { public: - static_assert(sizeof...(TArgs) <= 5, "supported auto binding is limited by num of components"); + static_assert(sizeof...(TArgs) <= 6, "supported auto binding is limited by num of components"); EcsSystemBindHelper(T* system_ptr, EcsSystemNativeFunc function_ptr); @@ -135,9 +136,7 @@ namespace wmoge { const int entity_idx = start_entity + i; const EcsEntity entity = storage.get_entity(entity_idx); - if (entity.is_invalid()) { - continue; - } + assert(entity.is_valid()); #define WG_ECS_ACCESS_COMPONENT(at) \ using TypeComponent##at = typename std::remove_reference>::type>::type; \ @@ -170,10 +169,97 @@ namespace wmoge { WG_ECS_ACCESS_COMPONENT(3); WG_ECS_ACCESS_COMPONENT(4); (*m_system_ptr.*m_function_ptr)(world, entity, *ptr0, *ptr1, *ptr2, *ptr3, *ptr4); + } else if constexpr (num_args == 6) { + WG_ECS_ACCESS_COMPONENT(0); + WG_ECS_ACCESS_COMPONENT(1); + WG_ECS_ACCESS_COMPONENT(2); + WG_ECS_ACCESS_COMPONENT(3); + WG_ECS_ACCESS_COMPONENT(4); + WG_ECS_ACCESS_COMPONENT(5); + (*m_system_ptr.*m_function_ptr)(world, entity, *ptr0, *ptr1, *ptr2, *ptr3, *ptr4, *ptr5); } #undef WG_ECS_ACCESS_COMPONENT } } + /** + * @class EcsSystemQueryHelper + * @brief Utility to derive query type + * + * @tparam T System type + * @tparam TArgs Type of system args for processing + */ + template + class EcsSystemQueryHelper { + public: + static_assert(sizeof...(TArgs) <= 6, "supported auto binding is limited by num of components"); + + EcsSystemQueryHelper(const T* system_ptr, EcsSystemNativeFunc function_ptr); + + EcsQuery get_query() const; + + private: + const T* m_system_ptr = nullptr; + EcsSystemNativeFunc m_function_ptr = nullptr; + }; + + template + inline EcsSystemQueryHelper::EcsSystemQueryHelper(const T* system_ptr, EcsSystemNativeFunc function_ptr) { + m_system_ptr = system_ptr; + m_function_ptr = function_ptr; + } + + template + inline EcsQuery EcsSystemQueryHelper::get_query() const { + EcsQuery query; + + std::tuple...> pack; + constexpr std::size_t N = std::tuple_size_v; + +#define WG_ECS_PROCESS_ARG(id) \ + if constexpr (id < N) { \ + using Arg = std::tuple_element_t<0, decltype(pack)>; \ + using NoConst = std::remove_const_t; \ + if constexpr (std::is_same_v) { \ + query.set_read(); \ + } else { \ + query.set_write(); \ + } \ + } + + WG_ECS_PROCESS_ARG(0) + WG_ECS_PROCESS_ARG(1) + WG_ECS_PROCESS_ARG(2) + WG_ECS_PROCESS_ARG(3) + WG_ECS_PROCESS_ARG(4) + WG_ECS_PROCESS_ARG(5) + +#undef WG_ECS_PROCESS_ARG + + return query; + } + +#define WG_ECS_SYSTEM_BIND(System) \ + EcsSystemBindHelper(this, &System::process).process_batch(world, storage, start_entity, count) + +#define WG_ECS_SYSTEM(name, type, mode) \ + ~name() = default; \ + void process_batch(class EcsWorld& world, EcsArchStorage& storage, int start_entity, int count) override { \ + WG_AUTO_PROFILE_ECS(#name "::process_batch"); \ + EcsSystemBindHelper(this, &name::process).process_batch(world, storage, start_entity, count); \ + } \ + [[nodiscard]] EcsSystemType get_type() const override { \ + return EcsSystemType::type; \ + } \ + [[nodiscard]] EcsSystemExecMode get_exec_mode() const override { \ + return EcsSystemExecMode::mode; \ + } \ + [[nodiscard]] Strid get_name() const override { \ + return SID(#name); \ + } \ + [[nodiscard]] EcsQuery get_query() const override { \ + return EcsSystemQueryHelper(this, &name::process).get_query(); \ + } + }// namespace wmoge \ No newline at end of file diff --git a/engine/ecs/ecs_world.cpp b/engine/ecs/ecs_world.cpp index 51df16358..e2b063268 100644 --- a/engine/ecs/ecs_world.cpp +++ b/engine/ecs/ecs_world.cpp @@ -65,7 +65,8 @@ namespace wmoge { void EcsWorld::make_entity(const EcsEntity& entity, const EcsArch& arch) { WG_AUTO_PROFILE_ECS("EcsWorld::make_entity"); - assert(arch.any()); + assert(entity.is_valid()); + m_entity_info.resize(m_entity_counter); register_arch(arch); @@ -139,8 +140,19 @@ namespace wmoge { bool need_swap = false; - EcsEntityInfo& entity_info = m_entity_info[entity.idx]; - m_arch_storage[entity_info.arch]->destroy_entity(entity_info.storage, need_swap); + EcsEntityInfo& entity_info = m_entity_info[entity.idx]; + EcsArch entity_arch = m_arch_by_idx[entity_info.arch]; + EcsArchStorage* entity_storage = m_arch_storage[entity_info.arch].get(); + + for (int idx : m_systems_destroy) { + const EcsSystemInfo& system_info = m_systems[idx]; + const EcsArch requried = system_info.query.affected(); + if ((requried & entity_arch) == requried) { + system_info.system->process_batch(*this, *entity_storage, entity_info.storage, 1); + } + } + + entity_storage->destroy_entity(entity_info.storage, need_swap); if (need_swap) { const EcsEntity entity_to_swap = m_arch_storage[entity_info.arch]->get_entity(entity_info.storage); @@ -188,7 +200,7 @@ namespace wmoge { const int arch_idx = int(m_arch_storage.size()); m_arch_to_idx[arch] = arch_idx; m_arch_by_idx.emplace_back(arch); - m_arch_storage.emplace_back() = std::make_unique(arch, this); + m_arch_storage.emplace_back() = std::make_unique(arch); for (EcsSystemInfo& system_info : m_systems) { auto filter = system_info.query.affected(); @@ -206,13 +218,19 @@ namespace wmoge { assert(system); assert(m_system_to_idx.find(system->get_name()) == m_system_to_idx.end()); - m_system_to_idx[system->get_name()] = int(m_systems.size()); + auto system_idx = int(m_systems.size()); + m_system_to_idx[system->get_name()] = system_idx; EcsSystemInfo& system_info = m_systems.emplace_back(); system_info.query = system->get_query(); system_info.system = system; + system_info.type = system->get_type(); system_info.exec_mode = system->get_exec_mode(); system_info.filtered_arch = filter_arch_idx(system->get_query()); + + if (system_info.type == EcsSystemType::Destroy) { + m_systems_destroy.push_back(system_idx); + } } void EcsWorld::execute_system(const std::shared_ptr& system) { @@ -322,7 +340,17 @@ namespace wmoge { m_queue.clear(); + for (std::uint32_t idx = 0; idx < std::uint32_t(m_entity_info.size()); idx++) { + const EcsEntityInfo& enity_info = m_entity_info[idx]; + + if (enity_info.state == EcsEntityState::Alive) { + EcsEntity entity(idx, enity_info.gen); + destroy_entity(entity); + } + } + for (std::unique_ptr& storage : m_arch_storage) { + assert(storage->get_size() == 0); storage->clear(); } diff --git a/engine/ecs/ecs_world.hpp b/engine/ecs/ecs_world.hpp index 71157b356..10ee88000 100644 --- a/engine/ecs/ecs_world.hpp +++ b/engine/ecs/ecs_world.hpp @@ -136,15 +136,19 @@ namespace wmoge { T& get_attribute(int slot = 0); private: - std::vector m_entity_info; // entity info, accessed by entity idx - std::deque m_entity_pool; // pool with free entities handles - int m_entity_counter = 0;// total count of created entities - fast_map m_system_to_idx; // map unique system name to idx - std::vector m_systems; // registered systems info - fast_map m_arch_to_idx; // arch to unique index - std::vector> m_arch_storage; // storage per arch, indexed by arch idx - std::vector m_arch_by_idx; // arch mask, indexed by arch idx - fast_vector m_attributes; // custom attributes to access context within world + std::vector m_entity_info; // entity info, accessed by entity idx + std::deque m_entity_pool; // pool with free entities handles + int m_entity_counter = 0;// total count of created entities + + fast_map m_system_to_idx; // map unique system name to idx + std::vector m_systems; // registered systems info + std::vector m_systems_destroy;// on entity destroy + + fast_map m_arch_to_idx; // arch to unique index + std::vector> m_arch_storage;// storage per arch, indexed by arch idx + std::vector m_arch_by_idx; // arch mask, indexed by arch idx + + fast_vector m_attributes;// custom attributes to access context within world CallbackQueue m_queue; // queue for async world operations, flushed on sync TaskManager* m_task_manager;// manager for parallel system update diff --git a/engine/engine.hpp b/engine/engine.hpp index 5b966dc2d..caf65daba 100644 --- a/engine/engine.hpp +++ b/engine/engine.hpp @@ -83,6 +83,7 @@ #include "event/event_listener.hpp" #include "event/event_manager.hpp" #include "event/event_resource.hpp" +#include "event/event_scene.hpp" #include "event/event_script.hpp" #include "event/event_token.hpp" #include "event/event_window.hpp" @@ -158,6 +159,7 @@ #include "render/aux_draw_manager.hpp" #include "render/camera.hpp" #include "render/canvas.hpp" +#include "render/culling.hpp" #include "render/graphics_pipeline.hpp" #include "render/light.hpp" #include "render/model_instance.hpp" @@ -170,7 +172,6 @@ #include "render/texture_manager.hpp" #include "render/view.hpp" #include "render/view_manager.hpp" -#include "render/visibility.hpp" #include "resource/array_mesh.hpp" #include "resource/audio_stream.hpp" diff --git a/engine/event/event.hpp b/engine/event/event.hpp index 225d91820..b2eecbd43 100644 --- a/engine/event/event.hpp +++ b/engine/event/event.hpp @@ -39,7 +39,7 @@ namespace wmoge { /** * @brief Type to identify different events */ - using EventType = StringId; + using EventType = Strid; /** * @class Event @@ -50,7 +50,7 @@ namespace wmoge { WG_OBJECT(Event, Object) virtual const EventType& type() const { - static StringId none; + static Strid none; return none; }; }; diff --git a/engine/event/event_action.hpp b/engine/event/event_action.hpp index eba6dbc5e..6d030cf9c 100644 --- a/engine/event/event_action.hpp +++ b/engine/event/event_action.hpp @@ -39,8 +39,8 @@ namespace wmoge { public: WG_EVENT(EventAction, Event) - StringId name; - float strength = 0.0f; + Strid name; + float strength = 0.0f; }; }// namespace wmoge diff --git a/engine/event/event_resource.cpp b/engine/event/event_resource.cpp index e9845ae93..c966c1a75 100644 --- a/engine/event/event_resource.cpp +++ b/engine/event/event_resource.cpp @@ -28,15 +28,15 @@ #include "event_resource.hpp" #include "core/class.hpp" +#include "io/enum.hpp" -#include #include namespace wmoge { std::string EventResource::to_string() { std::stringstream str; - str << "type:" << magic_enum::enum_name(notification) << " res:" << resource_id; + str << "type:" << Enum::to_str(notification) << " res:" << resource_id; return str.str(); } void EventResource::register_class() { diff --git a/engine/event/event_resource.hpp b/engine/event/event_resource.hpp index e32b8a3d8..df89cd9f9 100644 --- a/engine/event/event_resource.hpp +++ b/engine/event/event_resource.hpp @@ -51,7 +51,7 @@ namespace wmoge { WG_EVENT(EventResource, Event) Ref resource_ref; - StringId resource_id; + Strid resource_id; ResourceNotification notification = ResourceNotification::None; }; diff --git a/engine/event/event_scene.cpp b/engine/event/event_scene.cpp new file mode 100644 index 000000000..015ee03e0 --- /dev/null +++ b/engine/event/event_scene.cpp @@ -0,0 +1,46 @@ +/**********************************************************************************/ +/* Wmoge game engine */ +/* Available at github https://github.com/EgorOrachyov/wmoge */ +/**********************************************************************************/ +/* MIT License */ +/* */ +/* Copyright (c) 2023 Egor Orachyov */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining a copy */ +/* of this software and associated documentation files (the "Software"), to deal */ +/* in the Software without restriction, including without limitation the rights */ +/* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell */ +/* copies of the Software, and to permit persons to whom the Software is */ +/* furnished to do so, subject to the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be included in all */ +/* copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */ +/* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, */ +/* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE */ +/* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */ +/* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, */ +/* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ +/* SOFTWARE. */ +/**********************************************************************************/ + +#include "event_scene.hpp" + +#include "core/class.hpp" +#include "io/enum.hpp" + +#include + +namespace wmoge { + + std::string EventSceneNode::to_string() { + std::stringstream str; + str << "type:" << Enum::to_str(notification); + return str.str(); + } + void EventSceneNode::register_class() { + auto* cls = Class::register_class(); + } + +}// namespace wmoge \ No newline at end of file diff --git a/engine/event/event_scene.hpp b/engine/event/event_scene.hpp new file mode 100644 index 000000000..02bb4f438 --- /dev/null +++ b/engine/event/event_scene.hpp @@ -0,0 +1,53 @@ +/**********************************************************************************/ +/* Wmoge game engine */ +/* Available at github https://github.com/EgorOrachyov/wmoge */ +/**********************************************************************************/ +/* MIT License */ +/* */ +/* Copyright (c) 2023 Egor Orachyov */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining a copy */ +/* of this software and associated documentation files (the "Software"), to deal */ +/* in the Software without restriction, including without limitation the rights */ +/* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell */ +/* copies of the Software, and to permit persons to whom the Software is */ +/* furnished to do so, subject to the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be included in all */ +/* copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */ +/* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, */ +/* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE */ +/* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */ +/* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, */ +/* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ +/* SOFTWARE. */ +/**********************************************************************************/ + +#pragma once + +#include "event/event.hpp" + +namespace wmoge { + + /** + * @brief Node notification type + */ + enum class SceneNodeNotification { + None = 0, + TransformUpdated + }; + + /** + * @class EventSceneNode + * @brief Event dispatched on scene node updates + */ + class EventSceneNode final : public Event { + public: + WG_EVENT(EventSceneNode, Event) + + SceneNodeNotification notification = SceneNodeNotification::None; + }; + +}// namespace wmoge \ No newline at end of file diff --git a/engine/event/event_script.cpp b/engine/event/event_script.cpp index 6120f2cb9..27c795aaa 100644 --- a/engine/event/event_script.cpp +++ b/engine/event/event_script.cpp @@ -31,7 +31,7 @@ namespace wmoge { - void EventScript::set_type(StringId type) { + void EventScript::set_type(Strid type) { m_type = std::move(type); } std::string EventScript::to_string() { diff --git a/engine/event/event_script.hpp b/engine/event/event_script.hpp index f4f05f105..74af50c51 100644 --- a/engine/event/event_script.hpp +++ b/engine/event/event_script.hpp @@ -39,12 +39,12 @@ namespace wmoge { public: WG_OBJECT(EventScript, Event) - void set_type(StringId type); + void set_type(Strid type); std::string to_string() override; const EventType& type() const override; protected: - StringId m_type; + Strid m_type; }; }// namespace wmoge diff --git a/engine/event/event_token.hpp b/engine/event/event_token.hpp index 0954bbb0f..42a6d7091 100644 --- a/engine/event/event_token.hpp +++ b/engine/event/event_token.hpp @@ -50,7 +50,7 @@ namespace wmoge { WG_EVENT(EventToken, Event) TokenNotification notification = TokenNotification::None; - StringId token; + Strid token; }; }// namespace wmoge diff --git a/engine/event/register_classes_event.cpp b/engine/event/register_classes_event.cpp index 454a38472..fc8d8139d 100644 --- a/engine/event/register_classes_event.cpp +++ b/engine/event/register_classes_event.cpp @@ -32,6 +32,7 @@ #include "event/event_filesystem.hpp" #include "event/event_input.hpp" #include "event/event_resource.hpp" +#include "event/event_scene.hpp" #include "event/event_script.hpp" #include "event/event_token.hpp" #include "event/event_window.hpp" @@ -48,6 +49,7 @@ namespace wmoge { EventWindow::register_class(); EventAction::register_class(); EventResource::register_class(); + EventSceneNode::register_class(); EventToken::register_class(); EventScript::register_class(); EventFileSystem::register_class(); diff --git a/engine/gameplay/action_manager.cpp b/engine/gameplay/action_manager.cpp index f3f97c654..259ccc4f7 100644 --- a/engine/gameplay/action_manager.cpp +++ b/engine/gameplay/action_manager.cpp @@ -76,7 +76,7 @@ namespace wmoge { for (const auto& entry : info.action_map->m_actions) { const ActionMapAction& action_map_action = entry.second; - const StringId& action_name = action_map_action.name; + const Strid& action_name = action_map_action.name; const fast_vector& action_activations = action_map_action.activations; for (const ActionActivation& activation : action_activations) { @@ -154,7 +154,7 @@ namespace wmoge { return true; } - bool ActionManager::remove(const StringId& action_map) { + bool ActionManager::remove(const Strid& action_map) { const auto query = std::find_if(m_maps.begin(), m_maps.end(), [&](auto& info) { return info.action_map->get_name() == action_map; }); const bool found = query != m_maps.end(); @@ -163,11 +163,11 @@ namespace wmoge { return found; } - bool ActionManager::has(const StringId& action_map) { + bool ActionManager::has(const Strid& action_map) { return get_action_map_info(action_map) != nullptr; } - void ActionManager::activate(const StringId& action_map, bool active) { + void ActionManager::activate(const Strid& action_map, bool active) { ActionMapInfo* info = get_action_map_info(action_map); if (!info) { @@ -186,7 +186,7 @@ namespace wmoge { WG_LOG_INFO("[all] action map " << info.action_map->get_name() << " active=" << active); } } - void ActionManager::activate_all_except(const StringId& action_map, bool active) { + void ActionManager::activate_all_except(const Strid& action_map, bool active) { for (auto& info : m_maps) { if (info.action_map->get_name() != action_map) { info.active = active; @@ -204,7 +204,7 @@ namespace wmoge { for (const auto& entry : info.action_map->m_actions) { const ActionMapAction& action_map_action = entry.second; - const StringId& action_name = action_map_action.name; + const Strid& action_name = action_map_action.name; const fast_vector& action_activations = action_map_action.activations; for (const ActionActivation& activation : action_activations) { @@ -233,7 +233,7 @@ namespace wmoge { for (const auto& entry : info.action_map->m_actions) { const ActionMapAction& action_map_action = entry.second; - const StringId& action_name = action_map_action.name; + const Strid& action_name = action_map_action.name; const fast_vector& action_activations = action_map_action.activations; for (const ActionActivation& activation : action_activations) { @@ -262,7 +262,7 @@ namespace wmoge { for (const auto& entry : info.action_map->m_actions) { const ActionMapAction& action_map_action = entry.second; - const StringId& action_name = action_map_action.name; + const Strid& action_name = action_map_action.name; const fast_vector& action_activations = action_map_action.activations; for (const ActionActivation& activation : action_activations) { @@ -292,7 +292,7 @@ namespace wmoge { for (const auto& entry : info.action_map->m_actions) { const ActionMapAction& action_map_action = entry.second; - const StringId& action_name = action_map_action.name; + const Strid& action_name = action_map_action.name; const fast_vector& action_activations = action_map_action.activations; for (const ActionActivation& activation : action_activations) { @@ -316,7 +316,7 @@ namespace wmoge { return false; } - ActionManager::ActionMapInfo* ActionManager::get_action_map_info(const StringId& name) { + ActionManager::ActionMapInfo* ActionManager::get_action_map_info(const Strid& name) { for (auto& info : m_maps) { if (info.action_map->get_name() == name) { return &info; diff --git a/engine/gameplay/action_manager.hpp b/engine/gameplay/action_manager.hpp index cb8a47568..da72f92fe 100644 --- a/engine/gameplay/action_manager.hpp +++ b/engine/gameplay/action_manager.hpp @@ -52,13 +52,13 @@ namespace wmoge { bool load(const std::string& filepath); bool add(const Ref& action_map); - bool remove(const StringId& action_map); + bool remove(const Strid& action_map); - bool has(const StringId& action_map); + bool has(const Strid& action_map); - void activate(const StringId& action_map, bool active = true); + void activate(const Strid& action_map, bool active = true); void activate_all(bool active = true); - void activate_all_except(const StringId& action_map, bool active = true); + void activate_all_except(const Strid& action_map, bool active = true); void update(); @@ -73,7 +73,7 @@ namespace wmoge { bool on_input_keyboard(const EventKeyboard& event); bool on_input_joystick(const EventJoystick& event); bool on_input_gamepad(const EventGamepad& event); - ActionMapInfo* get_action_map_info(const StringId& name); + ActionMapInfo* get_action_map_info(const Strid& name); private: fast_vector m_maps; diff --git a/engine/gameplay/action_map.cpp b/engine/gameplay/action_map.cpp index c06a45dc2..14c392874 100644 --- a/engine/gameplay/action_map.cpp +++ b/engine/gameplay/action_map.cpp @@ -88,11 +88,11 @@ namespace wmoge { return StatusCode::Ok; } - void ActionMap::rename(StringId new_name) { + void ActionMap::rename(Strid new_name) { m_name = new_name; } - void ActionMap::add_action_activation(const StringId& action_name, const ActionActivation& activation) { + void ActionMap::add_action_activation(const Strid& action_name, const ActionActivation& activation) { if (!has_action(action_name)) { WG_LOG_ERROR("no such action " << action_name); return; @@ -101,7 +101,7 @@ namespace wmoge { action.activations.push_back(activation); } - void ActionMap::remove_action(const StringId& action_name) { + void ActionMap::remove_action(const Strid& action_name) { if (!has_action(action_name)) { WG_LOG_ERROR("no such action " << action_name); return; @@ -109,16 +109,16 @@ namespace wmoge { m_actions.erase(action_name); } - const StringId& ActionMap::get_name() { + const Strid& ActionMap::get_name() { return m_name; } int ActionMap::get_priority() { return m_priority; } - bool ActionMap::has_action(const StringId& action_name) { + bool ActionMap::has_action(const Strid& action_name) { return get_action(action_name) != nullptr; } - void ActionMap::add_action(const StringId& action_name, const StringId& display_name) { + void ActionMap::add_action(const Strid& action_name, const Strid& display_name) { if (has_action(action_name)) { WG_LOG_ERROR("an attempt to overwrite action " << action_name); return; @@ -127,7 +127,7 @@ namespace wmoge { action.name = action_name; action.display_name = display_name; } - const ActionMapAction* ActionMap::get_action(const StringId& action_name) { + const ActionMapAction* ActionMap::get_action(const Strid& action_name) { auto query = m_actions.find(action_name); return query != m_actions.end() ? &query->second : nullptr; } diff --git a/engine/gameplay/action_map.hpp b/engine/gameplay/action_map.hpp index 7ef6c6812..3913e196e 100644 --- a/engine/gameplay/action_map.hpp +++ b/engine/gameplay/action_map.hpp @@ -46,7 +46,7 @@ namespace wmoge { * @brief Single activation info which can be used to trigger an action */ struct ActionActivation { - StringId device_name = SID("unknown"); + Strid device_name = SID("unknown"); InputDeviceType device_type = InputDeviceType::Any; InputAction action = InputAction::Unknown; InputKeyboardKey key = InputKeyboardKey::Unknown; @@ -68,8 +68,8 @@ namespace wmoge { * @brief Single action which can be stored inside an action map and triggered by an activation info */ struct ActionMapAction { - StringId name = SID(""); - StringId display_name = SID(""); + Strid name = SID(""); + Strid display_name = SID(""); fast_vector activations; friend Status yaml_read(const YamlConstNodeRef& node, ActionMapAction& action); @@ -84,15 +84,15 @@ namespace wmoge { public: ~ActionMap() override = default; - void rename(StringId new_name); - void add_action(const StringId& action_name, const StringId& display_name); - void add_action_activation(const StringId& action_name, const ActionActivation& activation); - void remove_action(const StringId& action_name); + void rename(Strid new_name); + void add_action(const Strid& action_name, const Strid& display_name); + void add_action_activation(const Strid& action_name, const ActionActivation& activation); + void remove_action(const Strid& action_name); - [[nodiscard]] const StringId& get_name(); + [[nodiscard]] const Strid& get_name(); [[nodiscard]] int get_priority(); - [[nodiscard]] bool has_action(const StringId& action_name); - [[nodiscard]] const ActionMapAction* get_action(const StringId& action_name); + [[nodiscard]] bool has_action(const Strid& action_name); + [[nodiscard]] const ActionMapAction* get_action(const Strid& action_name); [[nodiscard]] std::vector get_actions() const; friend Status yaml_read(const YamlConstNodeRef& node, ActionMap& action_map); @@ -101,9 +101,9 @@ namespace wmoge { private: friend class ActionManager; - fast_map m_actions; - StringId m_name; - int m_priority = 0; + fast_map m_actions; + Strid m_name; + int m_priority = 0; }; }// namespace wmoge diff --git a/engine/gameplay/game_token_manager.cpp b/engine/gameplay/game_token_manager.cpp index 855f05c3f..5bac9a2b1 100644 --- a/engine/gameplay/game_token_manager.cpp +++ b/engine/gameplay/game_token_manager.cpp @@ -38,16 +38,16 @@ namespace wmoge { m_event_manager = Engine::instance()->event_manager(); } - void GameTokenManager::set(const StringId& token, int value) { + void GameTokenManager::set(const Strid& token, int value) { set(token, Var(value)); } - void GameTokenManager::set(const StringId& token, float value) { + void GameTokenManager::set(const Strid& token, float value) { set(token, Var(value)); } - void GameTokenManager::set(const StringId& token, std::string value) { + void GameTokenManager::set(const Strid& token, std::string value) { set(token, Var(std::move(value))); } - void GameTokenManager::set(const StringId& token, Var value) { + void GameTokenManager::set(const Strid& token, Var value) { bool has_already = m_tokens.find(token) != m_tokens.end(); m_tokens[token] = std::move(value); @@ -61,7 +61,7 @@ namespace wmoge { } } - bool GameTokenManager::get(const StringId& token, int& value) { + bool GameTokenManager::get(const Strid& token, int& value) { auto query = m_tokens.find(token); if (query != m_tokens.end()) { value = query->second.operator int(); @@ -70,7 +70,7 @@ namespace wmoge { WG_LOG_ERROR("no such token " << token); return false; } - bool GameTokenManager::get(const StringId& token, float& value) { + bool GameTokenManager::get(const Strid& token, float& value) { auto query = m_tokens.find(token); if (query != m_tokens.end()) { value = query->second.operator float(); @@ -79,7 +79,7 @@ namespace wmoge { WG_LOG_ERROR("no such token " << token); return false; } - bool GameTokenManager::get(const StringId& token, std::string& value) { + bool GameTokenManager::get(const Strid& token, std::string& value) { auto query = m_tokens.find(token); if (query != m_tokens.end()) { value = query->second.operator std::string(); @@ -88,7 +88,7 @@ namespace wmoge { WG_LOG_ERROR("no such token " << token); return false; } - bool GameTokenManager::get(const StringId& token, Var& value) { + bool GameTokenManager::get(const Strid& token, Var& value) { auto query = m_tokens.find(token); if (query != m_tokens.end()) { value = query->second; diff --git a/engine/gameplay/game_token_manager.hpp b/engine/gameplay/game_token_manager.hpp index 9d5840c00..1a47b3f61 100644 --- a/engine/gameplay/game_token_manager.hpp +++ b/engine/gameplay/game_token_manager.hpp @@ -46,19 +46,19 @@ namespace wmoge { public: GameTokenManager(); - void set(const StringId& token, int value); - void set(const StringId& token, float value); - void set(const StringId& token, std::string value); - void set(const StringId& token, Var value); + void set(const Strid& token, int value); + void set(const Strid& token, float value); + void set(const Strid& token, std::string value); + void set(const Strid& token, Var value); - bool get(const StringId& token, int& value); - bool get(const StringId& token, float& value); - bool get(const StringId& token, std::string& value); - bool get(const StringId& token, Var& value); + bool get(const Strid& token, int& value); + bool get(const Strid& token, float& value); + bool get(const Strid& token, std::string& value); + bool get(const Strid& token, Var& value); private: - fast_map m_tokens; - class EventManager* m_event_manager; + fast_map m_tokens; + class EventManager* m_event_manager; }; }// namespace wmoge diff --git a/engine/gfx/gfx_ctx.hpp b/engine/gfx/gfx_ctx.hpp index d8c4535b1..ff4c34c06 100644 --- a/engine/gfx/gfx_ctx.hpp +++ b/engine/gfx/gfx_ctx.hpp @@ -85,7 +85,7 @@ namespace wmoge { virtual void barrier_image(const Ref& texture, GfxTexBarrierType barrier_type) = 0; virtual void barrier_buffer(const Ref& buffer) = 0; - virtual void begin_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name = StringId()) = 0; + virtual void begin_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name = Strid()) = 0; virtual void bind_target(const Ref& window) = 0; virtual void bind_color_target(const Ref& texture, int target, int mip, int slice) = 0; virtual void bind_depth_target(const Ref& texture, int mip, int slice) = 0; @@ -109,8 +109,8 @@ namespace wmoge { virtual void begin_frame() = 0; virtual void end_frame() = 0; - virtual void begin_label(const StringId& label) = 0; - virtual void end_label() = 0; + virtual void begin_label(const Strid& label) = 0; + virtual void end_label() = 0; [[nodiscard]] virtual const Mat4x4f& clip_matrix() const = 0; [[nodiscard]] virtual GfxCtxType ctx_type() const = 0; @@ -123,7 +123,7 @@ namespace wmoge { * @brief Scope for debug laber */ struct GfxDebugLabel { - GfxDebugLabel(GfxCtx* ctx, const StringId& label) : ctx(ctx) { ctx->begin_label(label); } + GfxDebugLabel(GfxCtx* ctx, const Strid& label) : ctx(ctx) { ctx->begin_label(label); } ~GfxDebugLabel() { ctx->end_label(); } GfxCtx* ctx; }; diff --git a/engine/gfx/gfx_desc_set.hpp b/engine/gfx/gfx_desc_set.hpp index bf5ba163f..e5524634c 100644 --- a/engine/gfx/gfx_desc_set.hpp +++ b/engine/gfx/gfx_desc_set.hpp @@ -50,7 +50,7 @@ namespace wmoge { GfxBindingType type = GfxBindingType::Unknown; std::int16_t binding = 0; std::int16_t count = 1; - StringId name; + Strid name; [[nodiscard]] bool operator==(const GfxDescBinging& other) const; [[nodiscard]] bool operator!=(const GfxDescBinging& other) const; diff --git a/engine/gfx/gfx_driver.hpp b/engine/gfx/gfx_driver.hpp index 42161dd70..df2f479ee 100644 --- a/engine/gfx/gfx_driver.hpp +++ b/engine/gfx/gfx_driver.hpp @@ -69,26 +69,26 @@ namespace wmoge { virtual ~GfxDriver() = default; - virtual Ref make_vert_format(const GfxVertElements& elements, const StringId& name = StringId()) = 0; - virtual Ref make_vert_buffer(int size, GfxMemUsage usage, const StringId& name = StringId()) = 0; - virtual Ref make_index_buffer(int size, GfxMemUsage usage, const StringId& name = StringId()) = 0; - virtual Ref make_uniform_buffer(int size, GfxMemUsage usage, const StringId& name = StringId()) = 0; - virtual Ref make_storage_buffer(int size, GfxMemUsage usage, const StringId& name = StringId()) = 0; - virtual Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name = StringId()) = 0; - virtual Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name = StringId()) = 0; - virtual Ref make_shader(Ref code, const StringId& name = StringId()) = 0; - virtual Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name = StringId()) = 0; - virtual Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name = StringId()) = 0; - virtual Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name = StringId()) = 0; - virtual Ref make_sampler(const GfxSamplerDesc& desc, const StringId& name = StringId()) = 0; - virtual Ref make_pipeline(const GfxPipelineState& state, const StringId& name = StringId()) = 0; - virtual Ref make_comp_pipeline(const GfxCompPipelineState& state, const StringId& name = StringId()) = 0; - virtual Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name = StringId()) = 0; - virtual Ref make_dyn_vert_buffer(int chunk_size, const StringId& name = StringId()) = 0; - virtual Ref make_dyn_index_buffer(int chunk_size, const StringId& name = StringId()) = 0; - virtual Ref make_dyn_uniform_buffer(int chunk_size, const StringId& name = StringId()) = 0; - virtual Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const StringId& name = StringId()) = 0; - virtual Ref make_desc_set(const GfxDescSetResources& resources, const StringId& name = StringId()) = 0; + virtual Ref make_vert_format(const GfxVertElements& elements, const Strid& name = Strid()) = 0; + virtual Ref make_vert_buffer(int size, GfxMemUsage usage, const Strid& name = Strid()) = 0; + virtual Ref make_index_buffer(int size, GfxMemUsage usage, const Strid& name = Strid()) = 0; + virtual Ref make_uniform_buffer(int size, GfxMemUsage usage, const Strid& name = Strid()) = 0; + virtual Ref make_storage_buffer(int size, GfxMemUsage usage, const Strid& name = Strid()) = 0; + virtual Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name = Strid()) = 0; + virtual Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name = Strid()) = 0; + virtual Ref make_shader(Ref code, const Strid& name = Strid()) = 0; + virtual Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name = Strid()) = 0; + virtual Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name = Strid()) = 0; + virtual Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name = Strid()) = 0; + virtual Ref make_sampler(const GfxSamplerDesc& desc, const Strid& name = Strid()) = 0; + virtual Ref make_pipeline(const GfxPipelineState& state, const Strid& name = Strid()) = 0; + virtual Ref make_comp_pipeline(const GfxCompPipelineState& state, const Strid& name = Strid()) = 0; + virtual Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name = Strid()) = 0; + virtual Ref make_dyn_vert_buffer(int chunk_size, const Strid& name = Strid()) = 0; + virtual Ref make_dyn_index_buffer(int chunk_size, const Strid& name = Strid()) = 0; + virtual Ref make_dyn_uniform_buffer(int chunk_size, const Strid& name = Strid()) = 0; + virtual Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const Strid& name = Strid()) = 0; + virtual Ref make_desc_set(const GfxDescSetResources& resources, const Strid& name = Strid()) = 0; virtual void shutdown() = 0; @@ -109,7 +109,7 @@ namespace wmoge { [[nodiscard]] virtual GfxDynUniformBuffer* dyn_uniform_buffer() = 0; [[nodiscard]] virtual const GfxDeviceCaps& device_caps() const = 0; - [[nodiscard]] virtual const StringId& driver_name() const = 0; + [[nodiscard]] virtual const Strid& driver_name() const = 0; [[nodiscard]] virtual const std::string& shader_cache_path() const = 0; [[nodiscard]] virtual const std::string& pipeline_cache_path() const = 0; [[nodiscard]] virtual const std::thread::id& thread_id() const = 0; diff --git a/engine/gfx/gfx_dynamic_buffers.cpp b/engine/gfx/gfx_dynamic_buffers.cpp index 91464e417..4631b0b41 100644 --- a/engine/gfx/gfx_dynamic_buffers.cpp +++ b/engine/gfx/gfx_dynamic_buffers.cpp @@ -41,7 +41,7 @@ namespace wmoge { - GfxUniformPool::GfxUniformPool(const StringId& name) { + GfxUniformPool::GfxUniformPool(const Strid& name) { m_name = name; } GfxUniformBufferSetup GfxUniformPool::allocate(int constants_size, const void* mem) { @@ -106,7 +106,7 @@ namespace wmoge { } } - GfxDynBuffer::GfxDynBuffer(int size, int alignment, const StringId& name) { + GfxDynBuffer::GfxDynBuffer(int size, int alignment, const Strid& name) { m_default_chunk_size = size; m_alignment = alignment; m_name = name; @@ -184,9 +184,9 @@ namespace wmoge { } } - GfxDynVertBuffer::GfxDynVertBuffer(int size, int alignment, const StringId& name) : GfxDynBuffer(size, alignment, name) { + GfxDynVertBuffer::GfxDynVertBuffer(int size, int alignment, const Strid& name) : GfxDynBuffer(size, alignment, name) { } - Ref GfxDynVertBuffer::make_buffer(int size, const StringId& name) { + Ref GfxDynVertBuffer::make_buffer(int size, const Strid& name) { return Engine::instance()->gfx_driver()->make_vert_buffer(size, GfxMemUsage::GpuLocal, name); } void* GfxDynVertBuffer::map_buffer(const Ref& buffer) { @@ -196,9 +196,9 @@ namespace wmoge { Engine::instance()->gfx_ctx()->unmap_vert_buffer(buffer.cast()); } - GfxDynIndexBuffer::GfxDynIndexBuffer(int size, int alignment, const StringId& name) : GfxDynBuffer(size, alignment, name) { + GfxDynIndexBuffer::GfxDynIndexBuffer(int size, int alignment, const Strid& name) : GfxDynBuffer(size, alignment, name) { } - Ref GfxDynIndexBuffer::make_buffer(int size, const StringId& name) { + Ref GfxDynIndexBuffer::make_buffer(int size, const Strid& name) { return Engine::instance()->gfx_driver()->make_index_buffer(size, GfxMemUsage::GpuLocal, name); } void* GfxDynIndexBuffer::map_buffer(const Ref& buffer) { @@ -208,9 +208,9 @@ namespace wmoge { Engine::instance()->gfx_ctx()->unmap_index_buffer(buffer.cast()); } - GfxDynUniformBuffer::GfxDynUniformBuffer(int size, int alignment, const StringId& name) : GfxDynBuffer(size, alignment, name) { + GfxDynUniformBuffer::GfxDynUniformBuffer(int size, int alignment, const Strid& name) : GfxDynBuffer(size, alignment, name) { } - Ref GfxDynUniformBuffer::make_buffer(int size, const StringId& name) { + Ref GfxDynUniformBuffer::make_buffer(int size, const Strid& name) { return Engine::instance()->gfx_driver()->make_uniform_buffer(size, GfxMemUsage::GpuLocal, name); } void* GfxDynUniformBuffer::map_buffer(const Ref& buffer) { diff --git a/engine/gfx/gfx_dynamic_buffers.hpp b/engine/gfx/gfx_dynamic_buffers.hpp index 6c2cd29f9..3f5a752ad 100644 --- a/engine/gfx/gfx_dynamic_buffers.hpp +++ b/engine/gfx/gfx_dynamic_buffers.hpp @@ -44,7 +44,7 @@ namespace wmoge { */ class GfxUniformPool : public GfxResource { public: - GfxUniformPool(const StringId& name); + GfxUniformPool(const Strid& name); ~GfxUniformPool() override = default; virtual GfxUniformBufferSetup allocate(int constants_size, const void* mem); @@ -95,7 +95,7 @@ namespace wmoge { */ class GfxDynBuffer : public GfxResource { public: - GfxDynBuffer(int size, int alignment, const StringId& name); + GfxDynBuffer(int size, int alignment, const Strid& name); ~GfxDynBuffer() override = default; virtual GfxDynAllocation allocate_base(int bytes_to_allocate); @@ -115,9 +115,9 @@ namespace wmoge { } protected: - virtual Ref make_buffer(int size, const StringId& name) = 0; - virtual void* map_buffer(const Ref& buffer) = 0; - virtual void unmap_buffer(const Ref& buffer) = 0; + virtual Ref make_buffer(int size, const Strid& name) = 0; + virtual void* map_buffer(const Ref& buffer) = 0; + virtual void unmap_buffer(const Ref& buffer) = 0; protected: struct Chunk { @@ -140,7 +140,7 @@ namespace wmoge { */ class GfxDynVertBuffer : public GfxDynBuffer { public: - GfxDynVertBuffer(int size, int alignment, const StringId& name); + GfxDynVertBuffer(int size, int alignment, const Strid& name); ~GfxDynVertBuffer() override = default; GfxDynAllocation allocate(int bytes_to_allocate) { @@ -159,7 +159,7 @@ namespace wmoge { } protected: - Ref make_buffer(int size, const StringId& name) override; + Ref make_buffer(int size, const Strid& name) override; void* map_buffer(const Ref& buffer) override; void unmap_buffer(const Ref& buffer) override; }; @@ -170,7 +170,7 @@ namespace wmoge { */ class GfxDynIndexBuffer : public GfxDynBuffer { public: - GfxDynIndexBuffer(int size, int alignment, const StringId& name); + GfxDynIndexBuffer(int size, int alignment, const Strid& name); ~GfxDynIndexBuffer() override = default; template @@ -184,7 +184,7 @@ namespace wmoge { } protected: - Ref make_buffer(int size, const StringId& name) override; + Ref make_buffer(int size, const Strid& name) override; void* map_buffer(const Ref& buffer) override; void unmap_buffer(const Ref& buffer) override; }; @@ -195,7 +195,7 @@ namespace wmoge { */ class GfxDynUniformBuffer : public GfxDynBuffer { public: - GfxDynUniformBuffer(int size, int alignment, const StringId& name); + GfxDynUniformBuffer(int size, int alignment, const Strid& name); ~GfxDynUniformBuffer() override = default; template @@ -209,7 +209,7 @@ namespace wmoge { } protected: - Ref make_buffer(int size, const StringId& name) override; + Ref make_buffer(int size, const Strid& name) override; void* map_buffer(const Ref& buffer) override; void unmap_buffer(const Ref& buffer) override; }; diff --git a/engine/gfx/gfx_resource.hpp b/engine/gfx/gfx_resource.hpp index 2360375db..6f393de34 100644 --- a/engine/gfx/gfx_resource.hpp +++ b/engine/gfx/gfx_resource.hpp @@ -47,10 +47,10 @@ namespace wmoge { public: ~GfxResource() override = default; - [[nodiscard]] const StringId& name() const { return m_name; } + [[nodiscard]] const Strid& name() const { return m_name; } protected: - StringId m_name; + Strid m_name; }; }// namespace wmoge diff --git a/engine/gfx/gfx_shader.hpp b/engine/gfx/gfx_shader.hpp index cff7f63c1..1e37a63b1 100644 --- a/engine/gfx/gfx_shader.hpp +++ b/engine/gfx/gfx_shader.hpp @@ -47,7 +47,7 @@ namespace wmoge { class GfxShaderReflection { public: struct Texture { - StringId name; + Strid name; std::int16_t set = -1; std::int16_t binding = -1; std::int16_t array_size = -1; @@ -56,16 +56,16 @@ namespace wmoge { WG_IO_DECLARE(Texture); }; struct Buffer { - StringId name; + Strid name; std::int16_t set = -1; std::int16_t binding = -1; int size = -1; WG_IO_DECLARE(Buffer); }; - fast_map textures; - fast_map ub_buffers; - fast_map sb_buffers; + fast_map textures; + fast_map ub_buffers; + fast_map sb_buffers; std::array textures_per_desc{}; std::array ub_buffers_per_desc{}; std::array sb_buffers_per_desc{}; diff --git a/engine/gfx/gfx_vector.hpp b/engine/gfx/gfx_vector.hpp index 3d5f52cac..46d9316f4 100644 --- a/engine/gfx/gfx_vector.hpp +++ b/engine/gfx/gfx_vector.hpp @@ -50,7 +50,7 @@ namespace wmoge { class GfxVector { public: GfxVector() = default; - GfxVector(const StringId& name) : m_name(name) {} + GfxVector(const Strid& name) : m_name(name) {} GfxVector(const GfxVector&) = delete; GfxVector(GfxVector&&) = delete; ~GfxVector() = default; @@ -63,7 +63,7 @@ namespace wmoge { void flush(GfxCtx* gfx_ctx); void clear(); void free(); - void set_name(const StringId& name); + void set_name(const Strid& name); [[nodiscard]] const std::vector& get_data() const { return m_data; } [[nodiscard]] T* get_mem() { return m_data.data(); } @@ -78,7 +78,7 @@ namespace wmoge { private: std::vector m_data; Ref m_buffer; - StringId m_name; + Strid m_name; }; template @@ -136,7 +136,7 @@ namespace wmoge { } template - void GfxVector::set_name(const StringId& name) { + void GfxVector::set_name(const Strid& name) { m_name = name; } @@ -153,7 +153,7 @@ namespace wmoge { const std::size_t new_capacity = Math::ge_pow2_val(elements); const int new_size = int(sizeof(T) * new_capacity); - const StringId buffer_name = SID(m_name.str() + " cap=" + StringUtils::from_int(int(new_capacity))); + const Strid buffer_name = SID(m_name.str() + " cap=" + StringUtils::from_int(int(new_capacity))); if constexpr (std::is_same_v) { m_buffer = Engine::instance()->gfx_driver()->make_vert_buffer(new_size, GfxMemUsage::GpuLocal, buffer_name); diff --git a/engine/gfx/gfx_vert_format.cpp b/engine/gfx/gfx_vert_format.cpp index baeecda14..ef73e5a58 100644 --- a/engine/gfx/gfx_vert_format.cpp +++ b/engine/gfx/gfx_vert_format.cpp @@ -44,7 +44,7 @@ namespace wmoge { std::size_t GfxVertElements::hash() const { return Crc32::hash(&m_elements, sizeof(m_elements)); } - void GfxVertElements::add_element(StringId name, GfxFormat format, int buffer, int offset, int stride, bool instanced) { + void GfxVertElements::add_element(Strid name, GfxFormat format, int buffer, int offset, int stride, bool instanced) { assert(buffer < GfxLimits::MAX_VERT_BUFFERS); assert(m_elements_count < GfxLimits::MAX_VERT_ATTRIBUTES); diff --git a/engine/gfx/gfx_vert_format.hpp b/engine/gfx/gfx_vert_format.hpp index f2cc2694c..e55ca27a0 100644 --- a/engine/gfx/gfx_vert_format.hpp +++ b/engine/gfx/gfx_vert_format.hpp @@ -58,17 +58,17 @@ namespace wmoge { bool operator==(const GfxVertElements& other) const; std::size_t hash() const; - void add_element(StringId name, GfxFormat format, int buffer, int offset, int stride, bool instanced = false); + void add_element(Strid name, GfxFormat format, int buffer, int offset, int stride, bool instanced = false); void add_vert_attribs(GfxVertAttribs attribs, GfxVertAttribs layout, int buffer, bool instanced); void add_vert_attribs(GfxVertAttribs attribs, int buffer, bool instanced); [[nodiscard]] const std::array& elements() const { return m_elements; } - [[nodiscard]] const std::array& elements_names() const { return m_elements_names; } + [[nodiscard]] const std::array& elements_names() const { return m_elements_names; } [[nodiscard]] int elements_count() const { return m_elements_count; } private: std::array m_elements; - std::array m_elements_names; + std::array m_elements_names; int m_elements_count = 0; }; diff --git a/engine/gfx/threaded/gfx_ctx_wrapper.cpp b/engine/gfx/threaded/gfx_ctx_wrapper.cpp index f3395f1c6..e7043d2eb 100644 --- a/engine/gfx/threaded/gfx_ctx_wrapper.cpp +++ b/engine/gfx/threaded/gfx_ctx_wrapper.cpp @@ -110,7 +110,7 @@ namespace wmoge { m_stream->push([=]() { m_ctx->barrier_buffer(buffer); }); } - void GfxCtxWrapper::begin_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) { + void GfxCtxWrapper::begin_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) { m_stream->push([=]() { m_ctx->begin_render_pass(pass_desc, name); }); } void GfxCtxWrapper::bind_target(const Ref& window) { @@ -184,7 +184,7 @@ namespace wmoge { m_stream->push([=]() { m_ctx->end_frame(); }); } - void GfxCtxWrapper::begin_label(const StringId& label) { + void GfxCtxWrapper::begin_label(const Strid& label) { m_stream->push([=]() { m_ctx->begin_label(label); }); } void GfxCtxWrapper::end_label() { diff --git a/engine/gfx/threaded/gfx_ctx_wrapper.hpp b/engine/gfx/threaded/gfx_ctx_wrapper.hpp index 3b326fb89..e22cbd47d 100644 --- a/engine/gfx/threaded/gfx_ctx_wrapper.hpp +++ b/engine/gfx/threaded/gfx_ctx_wrapper.hpp @@ -75,7 +75,7 @@ namespace wmoge { void barrier_image(const Ref& texture, GfxTexBarrierType barrier_type) override; void barrier_buffer(const Ref& buffer) override; - void begin_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) override; + void begin_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) override; void bind_target(const Ref& window) override; void bind_color_target(const Ref& texture, int target, int mip, int slice) override; void bind_depth_target(const Ref& texture, int mip, int slice) override; @@ -99,7 +99,7 @@ namespace wmoge { void begin_frame() override; void end_frame() override; - void begin_label(const StringId& label) override; + void begin_label(const Strid& label) override; void end_label() override; [[nodiscard]] const Mat4x4f& clip_matrix() const override; diff --git a/engine/gfx/threaded/gfx_driver_wrapper.cpp b/engine/gfx/threaded/gfx_driver_wrapper.cpp index 8ca40b9ca..96456d997 100644 --- a/engine/gfx/threaded/gfx_driver_wrapper.cpp +++ b/engine/gfx/threaded/gfx_driver_wrapper.cpp @@ -59,7 +59,7 @@ namespace wmoge { m_vert_fmt_cache = driver->vert_fmt_cache(); } - Ref GfxDriverWrapper::make_vert_format(const GfxVertElements& elements, const StringId& name) { + Ref GfxDriverWrapper::make_vert_format(const GfxVertElements& elements, const Strid& name) { auto cached = m_vert_fmt_cache->get(elements); if (cached.has_value()) { return cached.value(); @@ -71,84 +71,84 @@ namespace wmoge { WG_LOG_INFO("cache new vf " << name); return vert_format; } - Ref GfxDriverWrapper::make_vert_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref GfxDriverWrapper::make_vert_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_vert_buffer"); Ref buffer; m_stream->push_and_wait([&]() { buffer = m_driver->make_vert_buffer(size, usage, name); }); return buffer; } - Ref GfxDriverWrapper::make_index_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref GfxDriverWrapper::make_index_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_index_buffer"); Ref buffer; m_stream->push_and_wait([&]() { buffer = m_driver->make_index_buffer(size, usage, name); }); return buffer; } - Ref GfxDriverWrapper::make_uniform_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref GfxDriverWrapper::make_uniform_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_uniform_buffer"); Ref buffer; m_stream->push_and_wait([&]() { buffer = m_driver->make_uniform_buffer(size, usage, name); }); return buffer; } - Ref GfxDriverWrapper::make_storage_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref GfxDriverWrapper::make_storage_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_storage_buffer"); Ref buffer; m_stream->push_and_wait([&]() { buffer = m_driver->make_storage_buffer(size, usage, name); }); return buffer; } - Ref GfxDriverWrapper::make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name) { + Ref GfxDriverWrapper::make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_shader"); Ref shader; m_stream->push_and_wait([&]() { shader = m_driver->make_shader(std::move(vertex), std::move(fragment), layouts, name); }); return shader; } - Ref GfxDriverWrapper::make_shader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name) { + Ref GfxDriverWrapper::make_shader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_shader"); Ref shader; m_stream->push_and_wait([&]() { shader = m_driver->make_shader(std::move(compute), layouts, name); }); return shader; } - Ref GfxDriverWrapper::make_shader(Ref code, const StringId& name) { + Ref GfxDriverWrapper::make_shader(Ref code, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_shader"); Ref shader; m_stream->push_and_wait([&]() { shader = m_driver->make_shader(std::move(code), name); }); return shader; } - Ref GfxDriverWrapper::make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name) { + Ref GfxDriverWrapper::make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_texture_2d"); Ref texture; m_stream->push_and_wait([&]() { texture = m_driver->make_texture_2d(width, height, mips, format, usages, mem_usage, swizz, name); }); return texture; } - Ref GfxDriverWrapper::make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + Ref GfxDriverWrapper::make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_texture_2d_array"); Ref texture; m_stream->push_and_wait([&]() { texture = m_driver->make_texture_2d_array(width, height, mips, slices, format, usages, mem_usage, name); }); return texture; } - Ref GfxDriverWrapper::make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + Ref GfxDriverWrapper::make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_texture_cube"); Ref texture; m_stream->push_and_wait([&]() { texture = m_driver->make_texture_cube(width, height, mips, format, usages, mem_usage, name); }); return texture; } - Ref GfxDriverWrapper::make_sampler(const GfxSamplerDesc& desc, const StringId& name) { + Ref GfxDriverWrapper::make_sampler(const GfxSamplerDesc& desc, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_sampler"); Ref sampler; m_stream->push_and_wait([&]() { sampler = m_driver->make_sampler(desc, name); }); return sampler; } - Ref GfxDriverWrapper::make_pipeline(const GfxPipelineState& state, const StringId& name) { + Ref GfxDriverWrapper::make_pipeline(const GfxPipelineState& state, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_pipeline"); auto cached = m_pso_cache->get(state); @@ -162,7 +162,7 @@ namespace wmoge { WG_LOG_INFO("cache new pso " << name); return pipeline; } - Ref GfxDriverWrapper::make_comp_pipeline(const GfxCompPipelineState& state, const StringId& name) { + Ref GfxDriverWrapper::make_comp_pipeline(const GfxCompPipelineState& state, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_comp_pipeline"); auto cached = m_comp_pso_cache->get(state); @@ -176,42 +176,42 @@ namespace wmoge { WG_LOG_INFO("cache new comp pso " << name); return pipeline; } - Ref GfxDriverWrapper::make_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) { + Ref GfxDriverWrapper::make_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_render_pass"); Ref render_pass; m_stream->push_and_wait([&]() { render_pass = m_driver->make_render_pass(pass_desc, name); }); return render_pass; } - Ref GfxDriverWrapper::make_dyn_vert_buffer(int chunk_size, const StringId& name) { + Ref GfxDriverWrapper::make_dyn_vert_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_dyn_vert_buffer"); Ref dyn_buffer; m_stream->push_and_wait([&]() { dyn_buffer = m_driver->make_dyn_vert_buffer(chunk_size, name); }); return dyn_buffer; } - Ref GfxDriverWrapper::make_dyn_index_buffer(int chunk_size, const StringId& name) { + Ref GfxDriverWrapper::make_dyn_index_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_dyn_index_buffer"); Ref dyn_buffer; m_stream->push_and_wait([&]() { dyn_buffer = m_driver->make_dyn_index_buffer(chunk_size, name); }); return dyn_buffer; } - Ref GfxDriverWrapper::make_dyn_uniform_buffer(int chunk_size, const StringId& name) { + Ref GfxDriverWrapper::make_dyn_uniform_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_dyn_uniform_buffer"); Ref dyn_buffer; m_stream->push_and_wait([&]() { dyn_buffer = m_driver->make_dyn_uniform_buffer(chunk_size, name); }); return dyn_buffer; } - Ref GfxDriverWrapper::make_desc_layout(const GfxDescSetLayoutDesc& desc, const StringId& name) { + Ref GfxDriverWrapper::make_desc_layout(const GfxDescSetLayoutDesc& desc, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_desc_layout"); Ref desc_layout; m_stream->push_and_wait([&]() { desc_layout = m_driver->make_desc_layout(desc, name); }); return desc_layout; } - Ref GfxDriverWrapper::make_desc_set(const GfxDescSetResources& resources, const StringId& name) { + Ref GfxDriverWrapper::make_desc_set(const GfxDescSetResources& resources, const Strid& name) { WG_AUTO_PROFILE_GFX("GfxDriverWrapper::make_desc_set"); Ref desc_set; @@ -278,7 +278,7 @@ namespace wmoge { const GfxDeviceCaps& GfxDriverWrapper::device_caps() const { return m_device_caps; } - const StringId& GfxDriverWrapper::driver_name() const { + const Strid& GfxDriverWrapper::driver_name() const { return m_driver_name; } const std::string& GfxDriverWrapper::shader_cache_path() const { diff --git a/engine/gfx/threaded/gfx_driver_wrapper.hpp b/engine/gfx/threaded/gfx_driver_wrapper.hpp index 5d28779fe..5d4e13f84 100644 --- a/engine/gfx/threaded/gfx_driver_wrapper.hpp +++ b/engine/gfx/threaded/gfx_driver_wrapper.hpp @@ -52,26 +52,26 @@ namespace wmoge { ~GfxDriverWrapper() override = default; - Ref make_vert_format(const GfxVertElements& elements, const StringId& name) override; - Ref make_vert_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_index_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_uniform_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_storage_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name) override; - Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name) override; - Ref make_shader(Ref code, const StringId& name) override; - Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name) override; - Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) override; - Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) override; - Ref make_sampler(const GfxSamplerDesc& desc, const StringId& name) override; - Ref make_pipeline(const GfxPipelineState& state, const StringId& name) override; - Ref make_comp_pipeline(const GfxCompPipelineState& state, const StringId& name) override; - Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) override; - Ref make_dyn_vert_buffer(int chunk_size, const StringId& name) override; - Ref make_dyn_index_buffer(int chunk_size, const StringId& name) override; - Ref make_dyn_uniform_buffer(int chunk_size, const StringId& name) override; - Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const StringId& name) override; - Ref make_desc_set(const GfxDescSetResources& resources, const StringId& name) override; + Ref make_vert_format(const GfxVertElements& elements, const Strid& name) override; + Ref make_vert_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_index_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_uniform_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_storage_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name) override; + Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name) override; + Ref make_shader(Ref code, const Strid& name) override; + Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name) override; + Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) override; + Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) override; + Ref make_sampler(const GfxSamplerDesc& desc, const Strid& name) override; + Ref make_pipeline(const GfxPipelineState& state, const Strid& name) override; + Ref make_comp_pipeline(const GfxCompPipelineState& state, const Strid& name) override; + Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) override; + Ref make_dyn_vert_buffer(int chunk_size, const Strid& name) override; + Ref make_dyn_index_buffer(int chunk_size, const Strid& name) override; + Ref make_dyn_uniform_buffer(int chunk_size, const Strid& name) override; + Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const Strid& name) override; + Ref make_desc_set(const GfxDescSetResources& resources, const Strid& name) override; void shutdown() override; @@ -92,7 +92,7 @@ namespace wmoge { [[nodiscard]] GfxDynUniformBuffer* dyn_uniform_buffer() override; [[nodiscard]] const GfxDeviceCaps& device_caps() const override; - [[nodiscard]] const StringId& driver_name() const override; + [[nodiscard]] const Strid& driver_name() const override; [[nodiscard]] const std::string& shader_cache_path() const override; [[nodiscard]] const std::string& pipeline_cache_path() const override; [[nodiscard]] const std::thread::id& thread_id() const override; @@ -110,7 +110,7 @@ namespace wmoge { GfxShaderLang m_shader_lang; CallbackStream* m_stream = nullptr; GfxDeviceCaps m_device_caps; - StringId m_driver_name; + Strid m_driver_name; std::thread::id m_thread_id; Mat4x4f m_clip_matrix; std::string m_shader_cache_path; diff --git a/engine/gfx/threaded/gfx_worker.hpp b/engine/gfx/threaded/gfx_worker.hpp index e3d8e89dc..7af863309 100644 --- a/engine/gfx/threaded/gfx_worker.hpp +++ b/engine/gfx/threaded/gfx_worker.hpp @@ -51,7 +51,7 @@ namespace wmoge { CallbackStream* m_stream = nullptr; std::thread m_worker_thread; std::atomic_bool m_finished{false}; - StringId m_name = SID("gfx-thread"); + Strid m_name = SID("gfx-thread"); }; }// namespace wmoge diff --git a/engine/gfx/vulkan/vk_buffers.cpp b/engine/gfx/vulkan/vk_buffers.cpp index 175bf6f5f..1e4e0cbc6 100644 --- a/engine/gfx/vulkan/vk_buffers.cpp +++ b/engine/gfx/vulkan/vk_buffers.cpp @@ -128,7 +128,7 @@ namespace wmoge { VKVertBuffer::~VKVertBuffer() { release(); } - void VKVertBuffer::create(int size, GfxMemUsage usage, const StringId& name) { + void VKVertBuffer::create(int size, GfxMemUsage usage, const Strid& name) { GfxBuffer::m_size = size; GfxBuffer::m_usage = usage; GfxResource::m_name = name; @@ -149,7 +149,7 @@ namespace wmoge { VKIndexBuffer::~VKIndexBuffer() { release(); } - void VKIndexBuffer::create(int size, GfxMemUsage usage, const StringId& name) { + void VKIndexBuffer::create(int size, GfxMemUsage usage, const Strid& name) { GfxBuffer::m_size = size; GfxBuffer::m_usage = usage; GfxResource::m_name = name; @@ -170,7 +170,7 @@ namespace wmoge { VKUniformBuffer::~VKUniformBuffer() { release(); } - void VKUniformBuffer::create(int size, GfxMemUsage usage, const StringId& name) { + void VKUniformBuffer::create(int size, GfxMemUsage usage, const Strid& name) { GfxBuffer::m_size = size; GfxBuffer::m_usage = usage; GfxResource::m_name = name; @@ -191,7 +191,7 @@ namespace wmoge { VKStorageBuffer::~VKStorageBuffer() { release(); } - void VKStorageBuffer::create(int size, GfxMemUsage usage, const StringId& name) { + void VKStorageBuffer::create(int size, GfxMemUsage usage, const Strid& name) { GfxBuffer::m_size = size; GfxBuffer::m_usage = usage; GfxResource::m_name = name; diff --git a/engine/gfx/vulkan/vk_buffers.hpp b/engine/gfx/vulkan/vk_buffers.hpp index 88aff5957..fe1d8f954 100644 --- a/engine/gfx/vulkan/vk_buffers.hpp +++ b/engine/gfx/vulkan/vk_buffers.hpp @@ -71,7 +71,7 @@ namespace wmoge { VKVertBuffer(class VKDriver& driver); ~VKVertBuffer() override; - void create(int size, GfxMemUsage usage, const StringId& name); + void create(int size, GfxMemUsage usage, const Strid& name); void unmap(VkCommandBuffer cmd) override; void update(VkCommandBuffer cmd, VkDeviceSize offset, VkDeviceSize size, const Ref& mem) override; class VKDriver& driver() override { return m_driver; } @@ -86,7 +86,7 @@ namespace wmoge { VKIndexBuffer(class VKDriver& driver); ~VKIndexBuffer() override; - void create(int size, GfxMemUsage usage, const StringId& name); + void create(int size, GfxMemUsage usage, const Strid& name); void unmap(VkCommandBuffer cmd) override; void update(VkCommandBuffer cmd, VkDeviceSize offset, VkDeviceSize size, const Ref& mem) override; class VKDriver& driver() override { return m_driver; } @@ -101,7 +101,7 @@ namespace wmoge { VKUniformBuffer(class VKDriver& driver); ~VKUniformBuffer() override; - void create(int size, GfxMemUsage usage, const StringId& name); + void create(int size, GfxMemUsage usage, const Strid& name); void unmap(VkCommandBuffer cmd) override; void update(VkCommandBuffer cmd, VkDeviceSize offset, VkDeviceSize size, const Ref& mem) override; class VKDriver& driver() override { return m_driver; } @@ -116,7 +116,7 @@ namespace wmoge { VKStorageBuffer(class VKDriver& driver); ~VKStorageBuffer() override; - void create(int size, GfxMemUsage usage, const StringId& name); + void create(int size, GfxMemUsage usage, const Strid& name); void unmap(VkCommandBuffer cmd) override; void update(VkCommandBuffer cmd, VkDeviceSize offset, VkDeviceSize size, const Ref& mem) override; void barrier(VkCommandBuffer cmd); diff --git a/engine/gfx/vulkan/vk_ctx.cpp b/engine/gfx/vulkan/vk_ctx.cpp index 716e9c170..6592fc1f1 100644 --- a/engine/gfx/vulkan/vk_ctx.cpp +++ b/engine/gfx/vulkan/vk_ctx.cpp @@ -213,7 +213,7 @@ namespace wmoge { dynamic_cast(buffer.get())->barrier(cmd_current()); } - void VKCtx::begin_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) { + void VKCtx::begin_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKCtx::begin_render_pass"); assert(check_thread_valid()); @@ -497,7 +497,7 @@ namespace wmoge { m_render_pass_started = false; } - void VKCtx::begin_label(const StringId& label) { + void VKCtx::begin_label(const Strid& label) { assert(!m_in_render_pass); WG_VK_BEGIN_LABEL(cmd_current(), label); diff --git a/engine/gfx/vulkan/vk_ctx.hpp b/engine/gfx/vulkan/vk_ctx.hpp index 7a481b9d3..2355da8ae 100644 --- a/engine/gfx/vulkan/vk_ctx.hpp +++ b/engine/gfx/vulkan/vk_ctx.hpp @@ -83,7 +83,7 @@ namespace wmoge { void barrier_image(const Ref& texture, GfxTexBarrierType barrier_type) override; void barrier_buffer(const Ref& buffer) override; - void begin_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) override; + void begin_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) override; void bind_target(const Ref& window) override; void bind_color_target(const Ref& texture, int target, int mip, int slice) override; void bind_depth_target(const Ref& texture, int mip, int slice) override; @@ -107,7 +107,7 @@ namespace wmoge { void begin_frame() override; void end_frame() override; - void begin_label(const StringId& label) override; + void begin_label(const Strid& label) override; void end_label() override; [[nodiscard]] const Mat4x4f& clip_matrix() const override; @@ -140,12 +140,12 @@ namespace wmoge { int m_clear_stencil = 0; Rect2i m_viewport; - bool m_in_render_pass = false; - bool m_render_pass_started = false; - bool m_pipeline_bound = false; - bool m_comp_pipeline_bound = false; - bool m_target_bound = false; - StringId m_render_pass_name; + bool m_in_render_pass = false; + bool m_render_pass_started = false; + bool m_pipeline_bound = false; + bool m_comp_pipeline_bound = false; + bool m_target_bound = false; + Strid m_render_pass_name; GfxCtxType m_ctx_type = GfxCtxType::Immediate; Mat4x4f m_clip_matrix; diff --git a/engine/gfx/vulkan/vk_defs.cpp b/engine/gfx/vulkan/vk_defs.cpp index 8e314d4d7..03e6de250 100644 --- a/engine/gfx/vulkan/vk_defs.cpp +++ b/engine/gfx/vulkan/vk_defs.cpp @@ -65,7 +65,7 @@ namespace wmoge { void VKDebug::add_debug_name(VkDevice device, void* object, VkObjectType object_type, const std::string& name) { add_debug_name(device, object, object_type, name.c_str()); } - void VKDebug::add_debug_name(VkDevice device, void* object, VkObjectType object_type, const StringId& name) { + void VKDebug::add_debug_name(VkDevice device, void* object, VkObjectType object_type, const Strid& name) { add_debug_name(device, object, object_type, name.str().c_str()); } void VKDebug::add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const char* name) { @@ -74,7 +74,7 @@ namespace wmoge { void VKDebug::add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const std::string& name) { add_debug_name(device, object, object_type, name.c_str()); } - void VKDebug::add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const StringId& name) { + void VKDebug::add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const Strid& name) { add_debug_name(device, object, object_type, name.str().c_str()); } void VKDebug::begin_label(VkCommandBuffer buffer, const char* name, const Vec3f& color) { @@ -93,7 +93,7 @@ namespace wmoge { void VKDebug::begin_label(VkCommandBuffer buffer, const std::string& name, const Vec3f& color) { begin_label(buffer, name.c_str(), color); } - void VKDebug::begin_label(VkCommandBuffer buffer, const StringId& name, const Vec3f& color) { + void VKDebug::begin_label(VkCommandBuffer buffer, const Strid& name, const Vec3f& color) { begin_label(buffer, name.str().c_str(), color); } void VKDebug::end_label(VkCommandBuffer buffer) { diff --git a/engine/gfx/vulkan/vk_defs.hpp b/engine/gfx/vulkan/vk_defs.hpp index 6e05ec087..53b273664 100644 --- a/engine/gfx/vulkan/vk_defs.hpp +++ b/engine/gfx/vulkan/vk_defs.hpp @@ -103,13 +103,13 @@ namespace wmoge { static void load_inst_functions(VkInstance instance); static void add_debug_name(VkDevice device, void* object, VkObjectType object_type, const char* name); static void add_debug_name(VkDevice device, void* object, VkObjectType object_type, const std::string& name); - static void add_debug_name(VkDevice device, void* object, VkObjectType object_type, const StringId& name); + static void add_debug_name(VkDevice device, void* object, VkObjectType object_type, const Strid& name); static void add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const char* name); static void add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const std::string& name); - static void add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const StringId& name); + static void add_debug_name(VkDevice device, uint64_t object, VkObjectType object_type, const Strid& name); static void begin_label(VkCommandBuffer buffer, const char* name, const Vec3f& color = Vec3f(1, 1, 1)); static void begin_label(VkCommandBuffer buffer, const std::string& name, const Vec3f& color = Vec3f(1, 1, 1)); - static void begin_label(VkCommandBuffer buffer, const StringId& name, const Vec3f& color = Vec3f(1, 1, 1)); + static void begin_label(VkCommandBuffer buffer, const Strid& name, const Vec3f& color = Vec3f(1, 1, 1)); static void end_label(VkCommandBuffer buffer); static PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; diff --git a/engine/gfx/vulkan/vk_desc_set.cpp b/engine/gfx/vulkan/vk_desc_set.cpp index 52a7e3bb1..20e6c911a 100644 --- a/engine/gfx/vulkan/vk_desc_set.cpp +++ b/engine/gfx/vulkan/vk_desc_set.cpp @@ -35,7 +35,7 @@ namespace wmoge { - VKDescSetLayout::VKDescSetLayout(const GfxDescSetLayoutDesc& desc, const StringId& name, class VKDriver& driver) : VKResource(driver) { + VKDescSetLayout::VKDescSetLayout(const GfxDescSetLayoutDesc& desc, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_desc = desc; m_name = name; @@ -65,7 +65,7 @@ namespace wmoge { } } - VKDescSet::VKDescSet(const GfxDescSetResources& resources, const Ref& layout, const StringId& name, class VKDriver& driver) : VKResource(driver) { + VKDescSet::VKDescSet(const GfxDescSetResources& resources, const Ref& layout, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_name = name; m_resources = resources; m_layout = layout; diff --git a/engine/gfx/vulkan/vk_desc_set.hpp b/engine/gfx/vulkan/vk_desc_set.hpp index f266ccb64..d460dafd1 100644 --- a/engine/gfx/vulkan/vk_desc_set.hpp +++ b/engine/gfx/vulkan/vk_desc_set.hpp @@ -41,7 +41,7 @@ namespace wmoge { */ class VKDescSetLayout final : public VKResource { public: - VKDescSetLayout(const GfxDescSetLayoutDesc& desc, const StringId& name, class VKDriver& driver); + VKDescSetLayout(const GfxDescSetLayoutDesc& desc, const Strid& name, class VKDriver& driver); ~VKDescSetLayout() override; [[nodiscard]] VkDescriptorSetLayout layout() const { return m_layout; } @@ -57,7 +57,7 @@ namespace wmoge { */ class VKDescSet final : public VKResource { public: - VKDescSet(const GfxDescSetResources& resources, const Ref& layout, const StringId& name, class VKDriver& driver); + VKDescSet(const GfxDescSetResources& resources, const Ref& layout, const Strid& name, class VKDriver& driver); ~VKDescSet() override; void copy(const GfxDescSetResources& resources); diff --git a/engine/gfx/vulkan/vk_driver.cpp b/engine/gfx/vulkan/vk_driver.cpp index e78658315..d939a7b0a 100644 --- a/engine/gfx/vulkan/vk_driver.cpp +++ b/engine/gfx/vulkan/vk_driver.cpp @@ -166,13 +166,13 @@ namespace wmoge { WG_LOG_INFO("shutdown vulkan gfx driver"); } - Ref VKDriver::make_vert_format(const GfxVertElements& elements, const StringId& name) { + Ref VKDriver::make_vert_format(const GfxVertElements& elements, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_vert_format"); assert(on_gfx_thread()); return make_ref(elements, name); } - Ref VKDriver::make_vert_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref VKDriver::make_vert_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_vert_buffer"); assert(on_gfx_thread()); @@ -181,7 +181,7 @@ namespace wmoge { buffer->create(size, usage, name); return buffer; } - Ref VKDriver::make_index_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref VKDriver::make_index_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_index_buffer"); assert(on_gfx_thread()); @@ -190,7 +190,7 @@ namespace wmoge { buffer->create(size, usage, name); return buffer; } - Ref VKDriver::make_uniform_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref VKDriver::make_uniform_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_uniform_buffer"); assert(on_gfx_thread()); @@ -199,7 +199,7 @@ namespace wmoge { buffer->create(size, usage, name); return buffer; } - Ref VKDriver::make_storage_buffer(int size, GfxMemUsage usage, const StringId& name) { + Ref VKDriver::make_storage_buffer(int size, GfxMemUsage usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_storage_buffer"); assert(on_gfx_thread()); @@ -208,7 +208,7 @@ namespace wmoge { buffer->create(size, usage, name); return buffer; } - Ref VKDriver::make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name) { + Ref VKDriver::make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_shader"); assert(on_gfx_thread()); @@ -224,7 +224,7 @@ namespace wmoge { return shader; } - Ref VKDriver::make_shader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name) { + Ref VKDriver::make_shader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_shader"); assert(on_gfx_thread()); @@ -240,7 +240,7 @@ namespace wmoge { return shader; } - Ref VKDriver::make_shader(Ref code, const StringId& name) { + Ref VKDriver::make_shader(Ref code, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_shader"); assert(on_gfx_thread()); @@ -256,7 +256,7 @@ namespace wmoge { return shader; } - Ref VKDriver::make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name) { + Ref VKDriver::make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_texture_2d"); assert(on_gfx_thread()); @@ -265,7 +265,7 @@ namespace wmoge { texture->create_2d(m_ctx_immediate->cmd_current(), width, height, mips, format, usages, mem_usage, swizz, name); return texture; } - Ref VKDriver::make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + Ref VKDriver::make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_texture_2d_array"); assert(on_gfx_thread()); @@ -274,7 +274,7 @@ namespace wmoge { texture->create_2d_array(m_ctx_immediate->cmd_current(), width, height, mips, slices, format, usages, mem_usage, name); return texture; } - Ref VKDriver::make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + Ref VKDriver::make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_texture_cube"); assert(on_gfx_thread()); @@ -283,7 +283,7 @@ namespace wmoge { texture->create_cube(m_ctx_immediate->cmd_current(), width, height, mips, format, usages, mem_usage, name); return texture; } - Ref VKDriver::make_sampler(const GfxSamplerDesc& desc, const StringId& name) { + Ref VKDriver::make_sampler(const GfxSamplerDesc& desc, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_sampler"); assert(on_gfx_thread()); @@ -298,21 +298,21 @@ namespace wmoge { return sampler; } - Ref VKDriver::make_pipeline(const GfxPipelineState& state, const StringId& name) { + Ref VKDriver::make_pipeline(const GfxPipelineState& state, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_pipeline"); assert(on_gfx_thread()); return make_ref(state, name, *this); } - Ref VKDriver::make_comp_pipeline(const GfxCompPipelineState& state, const StringId& name) { + Ref VKDriver::make_comp_pipeline(const GfxCompPipelineState& state, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_comp_pipeline"); assert(on_gfx_thread()); return make_ref(state, name, *this); } - Ref VKDriver::make_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) { + Ref VKDriver::make_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_render_pass"); auto& render_pass = m_render_passes[pass_desc]; @@ -323,7 +323,7 @@ namespace wmoge { return render_pass; } - Ref VKDriver::make_frame_buffer(const VKFrameBufferDesc& desc, const StringId& name) { + Ref VKDriver::make_frame_buffer(const VKFrameBufferDesc& desc, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_frame_buffer"); auto& frame_buffer = m_frame_buffers[desc]; @@ -334,22 +334,22 @@ namespace wmoge { return frame_buffer; } - Ref VKDriver::make_dyn_vert_buffer(int chunk_size, const StringId& name) { + Ref VKDriver::make_dyn_vert_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_dyn_vert_buffer"); return make_ref(chunk_size, 64, name); } - Ref VKDriver::make_dyn_index_buffer(int chunk_size, const StringId& name) { + Ref VKDriver::make_dyn_index_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_dyn_index_buffer"); return make_ref(chunk_size, 64, name); } - Ref VKDriver::make_dyn_uniform_buffer(int chunk_size, const StringId& name) { + Ref VKDriver::make_dyn_uniform_buffer(int chunk_size, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_dyn_uniform_buffer"); return make_ref(chunk_size, m_device_caps.uniform_block_offset_alignment, name); } - Ref VKDriver::make_desc_layout(const GfxDescSetLayoutDesc& desc, const StringId& name) { + Ref VKDriver::make_desc_layout(const GfxDescSetLayoutDesc& desc, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_desc_layout"); auto& desc_layout = m_layouts[desc]; @@ -360,7 +360,7 @@ namespace wmoge { return desc_layout; } - Ref VKDriver::make_desc_set(const GfxDescSetResources& resources, const StringId& name) { + Ref VKDriver::make_desc_set(const GfxDescSetResources& resources, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKDriver::make_desc_set"); GfxDescSetLayoutDesc layout_desc; diff --git a/engine/gfx/vulkan/vk_driver.hpp b/engine/gfx/vulkan/vk_driver.hpp index 20fcad272..bc1478b2b 100644 --- a/engine/gfx/vulkan/vk_driver.hpp +++ b/engine/gfx/vulkan/vk_driver.hpp @@ -64,27 +64,27 @@ namespace wmoge { explicit VKDriver(const VKInitInfo& info); ~VKDriver() override; - Ref make_vert_format(const GfxVertElements& elements, const StringId& name) override; - Ref make_vert_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_index_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_uniform_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_storage_buffer(int size, GfxMemUsage usage, const StringId& name) override; - Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name) override; - Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name) override; - Ref make_shader(Ref code, const StringId& name) override; - Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name) override; - Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) override; - Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) override; - Ref make_sampler(const GfxSamplerDesc& desc, const StringId& name) override; - Ref make_pipeline(const GfxPipelineState& state, const StringId& name) override; - Ref make_comp_pipeline(const GfxCompPipelineState& state, const StringId& name) override; - Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const StringId& name) override; - Ref make_frame_buffer(const VKFrameBufferDesc& desc, const StringId& name); - Ref make_dyn_vert_buffer(int chunk_size, const StringId& name) override; - Ref make_dyn_index_buffer(int chunk_size, const StringId& name) override; - Ref make_dyn_uniform_buffer(int chunk_size, const StringId& name) override; - Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const StringId& name) override; - Ref make_desc_set(const GfxDescSetResources& resources, const StringId& name) override; + Ref make_vert_format(const GfxVertElements& elements, const Strid& name) override; + Ref make_vert_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_index_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_uniform_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_storage_buffer(int size, GfxMemUsage usage, const Strid& name) override; + Ref make_shader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name) override; + Ref make_shader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name) override; + Ref make_shader(Ref code, const Strid& name) override; + Ref make_texture_2d(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name) override; + Ref make_texture_2d_array(int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) override; + Ref make_texture_cube(int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) override; + Ref make_sampler(const GfxSamplerDesc& desc, const Strid& name) override; + Ref make_pipeline(const GfxPipelineState& state, const Strid& name) override; + Ref make_comp_pipeline(const GfxCompPipelineState& state, const Strid& name) override; + Ref make_render_pass(const GfxRenderPassDesc& pass_desc, const Strid& name) override; + Ref make_frame_buffer(const VKFrameBufferDesc& desc, const Strid& name); + Ref make_dyn_vert_buffer(int chunk_size, const Strid& name) override; + Ref make_dyn_index_buffer(int chunk_size, const Strid& name) override; + Ref make_dyn_uniform_buffer(int chunk_size, const Strid& name) override; + Ref make_desc_layout(const GfxDescSetLayoutDesc& desc, const Strid& name) override; + Ref make_desc_set(const GfxDescSetResources& resources, const Strid& name) override; void shutdown() override; @@ -105,7 +105,7 @@ namespace wmoge { GfxDynUniformBuffer* dyn_uniform_buffer() override { return m_dyn_uniform_buffer.get(); } const GfxDeviceCaps& device_caps() const override { return m_device_caps; } - const StringId& driver_name() const override { return m_driver_name; } + const Strid& driver_name() const override { return m_driver_name; } const std::string& shader_cache_path() const override { return m_shader_cache_path; } const std::string& pipeline_cache_path() const override { return m_pipeline_cache_path; } const std::thread::id& thread_id() const override { return m_thread_id; } @@ -173,7 +173,7 @@ namespace wmoge { fast_map> m_layouts; GfxDeviceCaps m_device_caps; - StringId m_driver_name = SID("unknown"); + Strid m_driver_name = SID("unknown"); std::thread::id m_thread_id = std::this_thread::get_id(); Mat4x4f m_clip_matrix; std::atomic_size_t m_frame_number{0}; diff --git a/engine/gfx/vulkan/vk_pipeline.cpp b/engine/gfx/vulkan/vk_pipeline.cpp index 74addd299..4bd8b62da 100644 --- a/engine/gfx/vulkan/vk_pipeline.cpp +++ b/engine/gfx/vulkan/vk_pipeline.cpp @@ -35,7 +35,7 @@ namespace wmoge { - VKPipeline::VKPipeline(const GfxPipelineState& state, const StringId& name, VKDriver& driver) : VKResource(driver) { + VKPipeline::VKPipeline(const GfxPipelineState& state, const Strid& name, VKDriver& driver) : VKResource(driver) { m_name = name; m_state = state; } @@ -245,7 +245,7 @@ namespace wmoge { return m_state; } - VKCompPipeline::VKCompPipeline(const GfxCompPipelineState& state, const StringId& name, VKDriver& driver) : VKResource(driver) { + VKCompPipeline::VKCompPipeline(const GfxCompPipelineState& state, const Strid& name, VKDriver& driver) : VKResource(driver) { m_state = state; m_name = name; } diff --git a/engine/gfx/vulkan/vk_pipeline.hpp b/engine/gfx/vulkan/vk_pipeline.hpp index d7f52fe20..6e9e8d63d 100644 --- a/engine/gfx/vulkan/vk_pipeline.hpp +++ b/engine/gfx/vulkan/vk_pipeline.hpp @@ -42,7 +42,7 @@ namespace wmoge { */ class VKPipeline final : public VKResource { public: - VKPipeline(const GfxPipelineState& state, const StringId& name, class VKDriver& driver); + VKPipeline(const GfxPipelineState& state, const Strid& name, class VKDriver& driver); ~VKPipeline() override; bool validate(const Ref& render_pass); @@ -72,7 +72,7 @@ namespace wmoge { */ class VKCompPipeline final : public VKResource { public: - VKCompPipeline(const GfxCompPipelineState& state, const StringId& name, class VKDriver& driver); + VKCompPipeline(const GfxCompPipelineState& state, const Strid& name, class VKDriver& driver); ~VKCompPipeline() override; bool validate(); diff --git a/engine/gfx/vulkan/vk_render_pass.cpp b/engine/gfx/vulkan/vk_render_pass.cpp index 97c8149f7..969c6f6a9 100644 --- a/engine/gfx/vulkan/vk_render_pass.cpp +++ b/engine/gfx/vulkan/vk_render_pass.cpp @@ -33,7 +33,7 @@ namespace wmoge { - VKRenderPass::VKRenderPass(const GfxRenderPassDesc& pass_desc, const StringId& name, class VKDriver& driver) : VKResource(driver), m_pass_desc(pass_desc) { + VKRenderPass::VKRenderPass(const GfxRenderPassDesc& pass_desc, const Strid& name, class VKDriver& driver) : VKResource(driver), m_pass_desc(pass_desc) { m_name = name; int attachments_count = 0; @@ -121,7 +121,7 @@ namespace wmoge { return static_cast(Crc32::hash(this, sizeof(VKFrameBufferDesc))); } - VKFramebufferObject::VKFramebufferObject(const VKFrameBufferDesc& desc, const StringId& name, class VKDriver& driver) + VKFramebufferObject::VKFramebufferObject(const VKFrameBufferDesc& desc, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_desc = desc; m_name = name; @@ -202,7 +202,7 @@ namespace wmoge { m_current_pass_desc.stencil_op = GfxRtOp::ClearStore; } - void VKRenderPassBinder::start(const StringId& name) { + void VKRenderPassBinder::start(const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKRenderPassBinder::start"); m_current_name = name; @@ -242,7 +242,7 @@ namespace wmoge { m_current_framebuffer.reset(); m_current_size = {0, 0}; m_current_pass_desc = GfxRenderPassDesc{}; - m_current_name = StringId(); + m_current_name = Strid(); } void VKRenderPassBinder::prepare_render_pass() { diff --git a/engine/gfx/vulkan/vk_render_pass.hpp b/engine/gfx/vulkan/vk_render_pass.hpp index b32d81038..10f59c382 100644 --- a/engine/gfx/vulkan/vk_render_pass.hpp +++ b/engine/gfx/vulkan/vk_render_pass.hpp @@ -58,7 +58,7 @@ namespace wmoge { */ class VKRenderPass : public VKResource { public: - VKRenderPass(const GfxRenderPassDesc& pass_desc, const StringId& name, class VKDriver& driver); + VKRenderPass(const GfxRenderPassDesc& pass_desc, const Strid& name, class VKDriver& driver); ~VKRenderPass() override; [[nodiscard]] const GfxRenderPassDesc& pass_desc() const override { return m_pass_desc; } @@ -95,7 +95,7 @@ namespace wmoge { */ class VKFramebufferObject : public VKResource { public: - VKFramebufferObject(const VKFrameBufferDesc& desc, const StringId& name, class VKDriver& driver); + VKFramebufferObject(const VKFrameBufferDesc& desc, const Strid& name, class VKDriver& driver); ~VKFramebufferObject() override; Size2i size() const { return m_size; } @@ -123,7 +123,7 @@ namespace wmoge { void clear_depth(); void clear_stencil(); - void start(const StringId& name); + void start(const Strid& name); void validate(VkCommandBuffer cmd); void finish(VkCommandBuffer cmd); @@ -146,7 +146,7 @@ namespace wmoge { Ref m_current_render_pass{}; Ref m_current_framebuffer{}; Size2i m_current_size{}; - StringId m_current_name{}; + Strid m_current_name{}; class VKDriver& m_driver; }; diff --git a/engine/gfx/vulkan/vk_sampler.cpp b/engine/gfx/vulkan/vk_sampler.cpp index 35fef5b54..63b9264ef 100644 --- a/engine/gfx/vulkan/vk_sampler.cpp +++ b/engine/gfx/vulkan/vk_sampler.cpp @@ -33,7 +33,7 @@ namespace wmoge { - VKSampler::VKSampler(const GfxSamplerDesc& desc, const StringId& name, class VKDriver& driver) : VKResource(driver) { + VKSampler::VKSampler(const GfxSamplerDesc& desc, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_name = name; m_desc = desc; } diff --git a/engine/gfx/vulkan/vk_sampler.hpp b/engine/gfx/vulkan/vk_sampler.hpp index 59079a767..c0d4bff89 100644 --- a/engine/gfx/vulkan/vk_sampler.hpp +++ b/engine/gfx/vulkan/vk_sampler.hpp @@ -40,7 +40,7 @@ namespace wmoge { */ class VKSampler : public VKResource { public: - VKSampler(const GfxSamplerDesc& desc, const StringId& name, class VKDriver& driver); + VKSampler(const GfxSamplerDesc& desc, const Strid& name, class VKDriver& driver); ~VKSampler() override; void create(); diff --git a/engine/gfx/vulkan/vk_shader.cpp b/engine/gfx/vulkan/vk_shader.cpp index e7cedc913..555151694 100644 --- a/engine/gfx/vulkan/vk_shader.cpp +++ b/engine/gfx/vulkan/vk_shader.cpp @@ -42,7 +42,7 @@ namespace wmoge { WG_IO_FIELD(reflection) WG_IO_END(VKShaderBinary) - VKShader::VKShader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name, class VKDriver& driver) + VKShader::VKShader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_name = name; @@ -50,14 +50,14 @@ namespace wmoge { m_sources.push_back(std::move(fragment)); m_set_layouts = layouts; } - VKShader::VKShader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name, VKDriver& driver) + VKShader::VKShader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name, VKDriver& driver) : VKResource(driver) { m_name = name; m_sources.push_back(std::move(compute)); m_set_layouts = layouts; } - VKShader::VKShader(Ref byte_code, const StringId& name, class VKDriver& driver) + VKShader::VKShader(Ref byte_code, const Strid& name, class VKDriver& driver) : VKResource(driver) { m_name = name; @@ -338,7 +338,7 @@ namespace wmoge { } for (const auto& layout : binary.layouts) { - m_set_layouts.push_back(m_driver.make_desc_layout(layout, StringId())); + m_set_layouts.push_back(m_driver.make_desc_layout(layout, Strid())); } m_reflection = std::move(binary.reflection); diff --git a/engine/gfx/vulkan/vk_shader.hpp b/engine/gfx/vulkan/vk_shader.hpp index 042eac974..55edd7d56 100644 --- a/engine/gfx/vulkan/vk_shader.hpp +++ b/engine/gfx/vulkan/vk_shader.hpp @@ -64,9 +64,9 @@ namespace wmoge { */ class VKShader final : public VKResource { public: - VKShader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const StringId& name, class VKDriver& driver); - VKShader(std::string compute, const GfxDescSetLayouts& layouts, const StringId& name, class VKDriver& driver); - VKShader(Ref byte_code, const StringId& name, class VKDriver& driver); + VKShader(std::string vertex, std::string fragment, const GfxDescSetLayouts& layouts, const Strid& name, class VKDriver& driver); + VKShader(std::string compute, const GfxDescSetLayouts& layouts, const Strid& name, class VKDriver& driver); + VKShader(Ref byte_code, const Strid& name, class VKDriver& driver); ~VKShader() override; void compile_from_source(); diff --git a/engine/gfx/vulkan/vk_texture.cpp b/engine/gfx/vulkan/vk_texture.cpp index 32fd2604e..64ac77c94 100644 --- a/engine/gfx/vulkan/vk_texture.cpp +++ b/engine/gfx/vulkan/vk_texture.cpp @@ -44,7 +44,7 @@ namespace wmoge { if (m_image && m_allocation) m_driver.mem_manager()->deallocate(m_image, m_allocation); } - void VKTexture::create_2d(VkCommandBuffer cmd, int width, int height, VkImage image, VkFormat format, const StringId& name) { + void VKTexture::create_2d(VkCommandBuffer cmd, int width, int height, VkImage image, VkFormat format, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKTexture::create_2d"); m_tex_type = GfxTex::Tex2d; @@ -76,7 +76,7 @@ namespace wmoge { init_view(); init_layout(cmd); } - void VKTexture::create_2d(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name) { + void VKTexture::create_2d(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKTexture::create_2d"); m_tex_type = GfxTex::Tex2d; @@ -96,7 +96,7 @@ namespace wmoge { init_rt_views(); init_layout(cmd); } - void VKTexture::create_2d_array(VkCommandBuffer cmd, int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + void VKTexture::create_2d_array(VkCommandBuffer cmd, int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKTexture::create_2d_array"); m_tex_type = GfxTex::Tex2dArray; @@ -115,7 +115,7 @@ namespace wmoge { init_rt_views(); init_layout(cmd); } - void VKTexture::create_cube(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name) { + void VKTexture::create_cube(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name) { WG_AUTO_PROFILE_VULKAN("VKTexture::create_cube"); m_tex_type = GfxTex::TexCube; diff --git a/engine/gfx/vulkan/vk_texture.hpp b/engine/gfx/vulkan/vk_texture.hpp index 020de2b66..08e9848b9 100644 --- a/engine/gfx/vulkan/vk_texture.hpp +++ b/engine/gfx/vulkan/vk_texture.hpp @@ -44,10 +44,10 @@ namespace wmoge { explicit VKTexture(class VKDriver& driver); ~VKTexture() override; - void create_2d(VkCommandBuffer cmd, int width, int height, VkImage image, VkFormat format, const StringId& name); - void create_2d(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const StringId& name); - void create_2d_array(VkCommandBuffer cmd, int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name); - void create_cube(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const StringId& name); + void create_2d(VkCommandBuffer cmd, int width, int height, VkImage image, VkFormat format, const Strid& name); + void create_2d(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, GfxTexSwizz swizz, const Strid& name); + void create_2d_array(VkCommandBuffer cmd, int width, int height, int mips, int slices, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name); + void create_cube(VkCommandBuffer cmd, int width, int height, int mips, GfxFormat format, GfxTexUsages usages, GfxMemUsage mem_usage, const Strid& name); void update_2d(VkCommandBuffer cmd, int mip, const Rect2i& region, const Ref& data); void update_2d_array(VkCommandBuffer cmd, int mip, int slice, const Rect2i& region, const Ref& data); diff --git a/engine/gfx/vulkan/vk_vert_format.cpp b/engine/gfx/vulkan/vk_vert_format.cpp index 1e1395c8b..f639b7b42 100644 --- a/engine/gfx/vulkan/vk_vert_format.cpp +++ b/engine/gfx/vulkan/vk_vert_format.cpp @@ -31,7 +31,7 @@ namespace wmoge { - VKVertFormat::VKVertFormat(const GfxVertElements& elements, const StringId& name) { + VKVertFormat::VKVertFormat(const GfxVertElements& elements, const Strid& name) { m_name = name; m_attributes_count = 0; m_buffers_count = 0; diff --git a/engine/gfx/vulkan/vk_vert_format.hpp b/engine/gfx/vulkan/vk_vert_format.hpp index e90e26ed3..55363d0ae 100644 --- a/engine/gfx/vulkan/vk_vert_format.hpp +++ b/engine/gfx/vulkan/vk_vert_format.hpp @@ -39,7 +39,7 @@ namespace wmoge { */ class VKVertFormat final : public GfxVertFormat { public: - VKVertFormat(const GfxVertElements& elements, const StringId& name); + VKVertFormat(const GfxVertElements& elements, const Strid& name); ~VKVertFormat() override = default; const GfxVertElements& elements() const override; diff --git a/engine/gfx/vulkan/vk_window.hpp b/engine/gfx/vulkan/vk_window.hpp index c7faa0a4c..98497a2ff 100644 --- a/engine/gfx/vulkan/vk_window.hpp +++ b/engine/gfx/vulkan/vk_window.hpp @@ -121,7 +121,7 @@ namespace wmoge { Ref get_or_create(const Ref& window); private: - fast_map> m_windows; + fast_map> m_windows; std::function, VkSurfaceKHR&)> m_factory; class VKDriver& m_driver; }; diff --git a/engine/hgfx/hgfx_pass.cpp b/engine/hgfx/hgfx_pass.cpp index 755fda7aa..f8e9d7abc 100644 --- a/engine/hgfx/hgfx_pass.cpp +++ b/engine/hgfx/hgfx_pass.cpp @@ -39,7 +39,7 @@ namespace wmoge { return false; } - StringId HgfxPass::get_pass_name() { + Strid HgfxPass::get_pass_name() { return {}; } HgfxPassType HgfxPass::get_pass_type() { @@ -48,7 +48,7 @@ namespace wmoge { void HgfxPass::register_class() { auto* cls = Class::register_class(); - cls->add_method(ClassMethod(VarType::StringId, SID("get_pass_name"), {}), &HgfxPass::get_pass_name, {}); + cls->add_method(ClassMethod(VarType::Strid, SID("get_pass_name"), {}), &HgfxPass::get_pass_name, {}); cls->add_method(ClassMethod(VarType::Int, SID("get_pass_type"), {}), &HgfxPass::get_pass_type, {}); } diff --git a/engine/hgfx/hgfx_pass.hpp b/engine/hgfx/hgfx_pass.hpp index 2f31a0e1c..2798c793f 100644 --- a/engine/hgfx/hgfx_pass.hpp +++ b/engine/hgfx/hgfx_pass.hpp @@ -71,7 +71,7 @@ namespace wmoge { */ virtual bool configure(GfxCtx* ctx); - virtual StringId get_pass_name(); + virtual Strid get_pass_name(); virtual HgfxPassType get_pass_type(); }; diff --git a/engine/hgfx/hgfx_pass_base.cpp b/engine/hgfx/hgfx_pass_base.cpp index 2ef3ab2a4..89e67ebf6 100644 --- a/engine/hgfx/hgfx_pass_base.cpp +++ b/engine/hgfx/hgfx_pass_base.cpp @@ -103,7 +103,7 @@ namespace wmoge { return false; } - StringId HgfxPassBase::get_pass_name() { + Strid HgfxPassBase::get_pass_name() { return name; } HgfxPassType HgfxPassBase::get_pass_type() { diff --git a/engine/hgfx/hgfx_pass_base.hpp b/engine/hgfx/hgfx_pass_base.hpp index b3845b8d4..de525d762 100644 --- a/engine/hgfx/hgfx_pass_base.hpp +++ b/engine/hgfx/hgfx_pass_base.hpp @@ -46,7 +46,7 @@ namespace wmoge { public: WG_OBJECT(HgfxPassBase, HgfxPass); - StringId name; + Strid name; GfxVertAttribs attribs_req = {GfxVertAttrib::Pos3f}; GfxVertAttribs attribs_full = {GfxVertAttrib::Pos3f}; GfxPrimType prim_type = GfxPrimType::Triangles; @@ -66,7 +66,7 @@ namespace wmoge { bool compile(GfxCtx* gfx_ctx) override; bool configure(GfxCtx* gfx_ctx) override; - StringId get_pass_name() override; + Strid get_pass_name() override; HgfxPassType get_pass_type() override; private: diff --git a/engine/hgfx/hgfx_pass_text.cpp b/engine/hgfx/hgfx_pass_text.cpp index 3c2fe3cea..0e7585052 100644 --- a/engine/hgfx/hgfx_pass_text.cpp +++ b/engine/hgfx/hgfx_pass_text.cpp @@ -103,7 +103,7 @@ namespace wmoge { return false; } - StringId HgfxPassText::get_pass_name() { + Strid HgfxPassText::get_pass_name() { return name; } HgfxPassType HgfxPassText::get_pass_type() { diff --git a/engine/hgfx/hgfx_pass_text.hpp b/engine/hgfx/hgfx_pass_text.hpp index fd59fd28b..ddf9b7c9a 100644 --- a/engine/hgfx/hgfx_pass_text.hpp +++ b/engine/hgfx/hgfx_pass_text.hpp @@ -47,7 +47,7 @@ namespace wmoge { public: WG_OBJECT(HgfxPassText, HgfxPass); - StringId name; + Strid name; Vec2f screen_size = Vec2f(1280, 720); float gamma = 2.2f; bool out_srgb = false; @@ -57,7 +57,7 @@ namespace wmoge { bool compile(GfxCtx* gfx_ctx) override; bool configure(GfxCtx* gfx_ctx) override; - StringId get_pass_name() override; + Strid get_pass_name() override; HgfxPassType get_pass_type() override; private: diff --git a/engine/io/archive.cpp b/engine/io/archive.cpp index d723dc218..cbe964ead 100644 --- a/engine/io/archive.cpp +++ b/engine/io/archive.cpp @@ -41,7 +41,7 @@ namespace wmoge { return StatusCode::Ok; } - Status archive_write(Archive& archive, const StringId& value) { + Status archive_write(Archive& archive, const Strid& value) { WG_ARCHIVE_WRITE(archive, value.str()); return StatusCode::Ok; } @@ -51,10 +51,10 @@ namespace wmoge { return archive.nwrite(int(value.length() * sizeof(char)), value.data()); } - Status archive_read(Archive& archive, StringId& value) { + Status archive_read(Archive& archive, Strid& value) { std::string str; WG_ARCHIVE_READ(archive, str); - value = StringId(str); + value = Strid(str); return StatusCode::Ok; } Status archive_read(Archive& archive, std::string& value) { diff --git a/engine/io/archive.hpp b/engine/io/archive.hpp index 9a780242f..8dcfdae8a 100644 --- a/engine/io/archive.hpp +++ b/engine/io/archive.hpp @@ -60,14 +60,14 @@ namespace wmoge { [[nodiscard]] virtual bool is_physical() = 0; [[nodiscard]] virtual std::size_t get_size() = 0; - [[nodiscard]] bool can_read() const { return m_can_read; } - [[nodiscard]] bool can_write() const { return m_can_write; } - [[nodiscard]] const StringId& get_name() const { return m_name; } + [[nodiscard]] bool can_read() const { return m_can_read; } + [[nodiscard]] bool can_write() const { return m_can_write; } + [[nodiscard]] const Strid& get_name() const { return m_name; } protected: - StringId m_name; - bool m_can_read = false; - bool m_can_write = false; + Strid m_name; + bool m_can_read = false; + bool m_can_write = false; }; template @@ -104,10 +104,10 @@ namespace wmoge { Status archive_read(Archive& archive, bool& value); Status archive_write(Archive& archive, const bool& value); - Status archive_write(Archive& archive, const StringId& value); + Status archive_write(Archive& archive, const Strid& value); Status archive_write(Archive& archive, const std::string& value); - Status archive_read(Archive& archive, StringId& value); + Status archive_read(Archive& archive, Strid& value); Status archive_read(Archive& archive, std::string& value); #define WG_ARCHIVE_READ(archive, what) \ diff --git a/engine/io/enum.hpp b/engine/io/enum.hpp index bc6cd251d..6c687b457 100644 --- a/engine/io/enum.hpp +++ b/engine/io/enum.hpp @@ -49,7 +49,7 @@ namespace wmoge { } template - static StringId to_sid(T value) { + static Strid to_sid(T value) { return SID(to_str(value)); } diff --git a/engine/io/serialization.hpp b/engine/io/serialization.hpp index 181db33e6..be7845395 100644 --- a/engine/io/serialization.hpp +++ b/engine/io/serialization.hpp @@ -66,33 +66,50 @@ namespace wmoge { return nmsp##__##cls##Serializer()(archive, value); \ } -#define WG_IO_BEGIN_SUPER(cls, super) \ - template \ - struct global__##cls##Serializer final { \ - Status operator()(Stream stream, Target target) { \ - if constexpr (std::is_same_v) { \ - WG_YAML_READ_SUPER(stream, super, target); \ - } \ - if constexpr (std::is_same_v) { \ - WG_YAML_WRITE_SUPER(stream, super, target); \ - } \ - if constexpr (std::is_same_v && std::is_same_v) { \ - WG_ARCHIVE_READ_SUPER(stream, super, target); \ - } \ - if constexpr (std::is_same_v && std::is_same_v) { \ - WG_ARCHIVE_WRITE_SUPER(stream, super, target); \ - } +#define WG_IO_SUPER(super) \ + if constexpr (std::is_same_v) { \ + WG_YAML_READ_SUPER(stream, super, target); \ + } \ + if constexpr (std::is_same_v) { \ + WG_YAML_WRITE_SUPER(stream, super, target); \ + } \ + if constexpr (std::is_same_v && std::is_same_v) { \ + WG_ARCHIVE_READ_SUPER(stream, super, target); \ + } \ + if constexpr (std::is_same_v && std::is_same_v) { \ + WG_ARCHIVE_WRITE_SUPER(stream, super, target); \ + } -#define WG_IO_BEGIN_NMSP(nmsp, cls) \ - template \ - struct nmsp##__##cls##Serializer final { \ - Status operator()(Stream stream, Target target) { \ - if constexpr (std::is_same_v) { \ - WG_YAML_MAP(stream); \ +#define WG_IO_BEGIN_NMSP(nmsp, cls) \ + template \ + struct nmsp##__##cls##Serializer final { \ + Status operator()(Stream stream, Target target) { \ + static const char* profile_mark_yaml_read = #cls "::yaml_read"; \ + static const char* profile_mark_yaml_write = #cls "::yaml_write"; \ + static const char* profile_mark_archive_read = #cls "::archive_read"; \ + static const char* profile_mark_archive_write = #cls "::archive_write"; \ + if constexpr (std::is_same_v) { \ + WG_YAML_MAP(stream); \ } #define WG_IO_BEGIN(cls) WG_IO_BEGIN_NMSP(global, cls) +#define WG_IO_PROFILE() \ + const char* profile_mark_name = ""; \ + if constexpr (std::is_same_v) { \ + profile_mark_name = profile_mark_yaml_read; \ + } \ + if constexpr (std::is_same_v) { \ + profile_mark_name = profile_mark_yaml_write; \ + } \ + if constexpr (std::is_same_v && std::is_same_v) { \ + profile_mark_name = profile_mark_archive_read; \ + } \ + if constexpr (std::is_same_v && std::is_same_v) { \ + profile_mark_name = profile_mark_archive_write; \ + } \ + WG_AUTO_PROFILE_IO(profile_mark_name); + #define WG_IO_FIELD_EXT(field, name, flags) \ if constexpr (std::is_same_v) { \ const IoFlags mask = flags; \ diff --git a/engine/io/yaml.cpp b/engine/io/yaml.cpp index 7e0d11a81..ee4331be1 100644 --- a/engine/io/yaml.cpp +++ b/engine/io/yaml.cpp @@ -64,7 +64,7 @@ namespace wmoge { node >> value; return StatusCode::Ok; } - Status yaml_read(const YamlConstNodeRef& node, StringId& value) { + Status yaml_read(const YamlConstNodeRef& node, Strid& value) { std::string string; node >> string; value = SID(string); @@ -93,7 +93,7 @@ namespace wmoge { node << value; return StatusCode::Ok; } - Status yaml_write(YamlNodeRef node, const StringId& value) { + Status yaml_write(YamlNodeRef node, const Strid& value) { node << value.str(); return StatusCode::Ok; } diff --git a/engine/io/yaml.hpp b/engine/io/yaml.hpp index daa378c84..f9af22723 100644 --- a/engine/io/yaml.hpp +++ b/engine/io/yaml.hpp @@ -86,14 +86,14 @@ namespace wmoge { Status yaml_read(const YamlConstNodeRef& node, bool& value); Status yaml_read(const YamlConstNodeRef& node, int& value); Status yaml_read(const YamlConstNodeRef& node, float& value); - Status yaml_read(const YamlConstNodeRef& node, StringId& value); + Status yaml_read(const YamlConstNodeRef& node, Strid& value); Status yaml_read(const YamlConstNodeRef& node, std::string& value); Status yaml_read(const YamlConstNodeRef& node, std::int16_t& value); Status yaml_write(YamlNodeRef node, const bool& value); Status yaml_write(YamlNodeRef node, const int& value); Status yaml_write(YamlNodeRef node, const float& value); - Status yaml_write(YamlNodeRef node, const StringId& value); + Status yaml_write(YamlNodeRef node, const Strid& value); Status yaml_write(YamlNodeRef node, const std::string& value); Status yaml_write(YamlNodeRef node, const std::int16_t& value); diff --git a/engine/math/transform.hpp b/engine/math/transform.hpp index 882de3cca..2a973e3a6 100644 --- a/engine/math/transform.hpp +++ b/engine/math/transform.hpp @@ -125,35 +125,25 @@ namespace wmoge { void rotate_z(float rad) { m_rotation = Quatf(Vec3f::axis_z(), rad) * m_rotation; } void scale(const Vec3f& scale) { m_scale *= scale; } - Vec3f transform(const Vec3f& v) const { - return m_translation + m_rotation.rotate(m_scale * v); + Transform3d inv() const { + Transform3d t; + t.set_translation(-m_translation); + t.set_rotation(m_rotation.conjugate()); + t.set_scale(Vec3f(1.0f, 1.0f, 1.0f) / m_scale); + return t; } - Transform3d operator*(const Transform3d& other) const { - // v' = t1 + r1(s1 * v) - // v'' = t2 + r2(s2 * v') - // = t2 + r2(s2 * t1 + s2 * r1(s1 * v)) - // = (t2 + r2(s2 * t1)) + r2(s2 * r1(s1 * v)) - // = (t2 + r2(s2 * t1)) + r2(r1(r1^-1(s2) * s1 * v))) - // - // t' = t2 + r2(s2 * t1) - // r' = r2 x r1 - // s' = r1^-1(s2) * s1 - - Transform3d result; - result.set_translation(m_translation + transform(other.m_translation)); - result.set_rotation(m_rotation * other.m_rotation); - result.set_scale(other.m_rotation.conjugate().rotate(m_scale) * other.m_scale); - return result; + Vec3f transform(const Vec3f& v) const { + return m_translation + m_rotation.rotate(m_scale * v); } - [[nodiscard]] Mat4x4f get_transform() const { + [[nodiscard]] Mat4x4f to_mat4x4() const { return Math3d::translate(m_translation) * m_rotation.as_matrix() * Math3d::scale(m_scale); } - [[nodiscard]] Mat4x4f get_inverse_transform() const { + [[nodiscard]] Mat4x4f to_inv_mat4x4() const { return Math3d::scale(Vec3f(1.0f, 1.0f, 1.0f) / m_scale) * m_rotation.inverse().as_matrix() * Math3d::translate(-m_translation); @@ -198,7 +188,7 @@ namespace wmoge { /** * @class TransformEdt - * @brief Utility to manage 3d space transformations with euler angles + * @brief Utility to manage 3d space transformations with euler angles (roll, yaw, pitch) */ class TransformEdt { public: @@ -210,13 +200,21 @@ namespace wmoge { void rotate(const Vec3f& angles) { m_rotation += angles; } void scale(const Vec3f& scale) { m_scale *= scale; } - [[nodiscard]] Mat4x4f get_transform() const { + [[nodiscard]] Transform3d to_transform3d() const { + Transform3d t; + t.set_translation(m_translation); + t.set_scale(m_scale); + t.set_rotation(Quatf(m_rotation.x(), m_rotation.y(), m_rotation.z())); + return t; + } + + [[nodiscard]] Mat4x4f to_mat4x4() const { return Math3d::translate(m_translation) * Quatf(m_rotation[0], m_rotation[1], m_rotation[2]).as_matrix() * Math3d::scale(m_scale); } - [[nodiscard]] Mat4x4f get_inverse_transform() const { + [[nodiscard]] Mat4x4f to_inv_mat4x4() const { return Math3d::scale(Vec3f(1.0f, 1.0f, 1.0f) / m_scale) * Quatf(m_rotation[0], m_rotation[1], m_rotation[2]).inverse().as_matrix() * Math3d::translate(-m_translation); diff --git a/engine/mesh/mesh_batch.hpp b/engine/mesh/mesh_batch.hpp index 47bfb1eca..51770ee79 100644 --- a/engine/mesh/mesh_batch.hpp +++ b/engine/mesh/mesh_batch.hpp @@ -54,7 +54,7 @@ namespace wmoge { * @brief Batch of mesh elements with the same vertex/index buffer and material instances */ struct MeshBatch final { - StringId name; //< Unique element name for debug + Strid name; //< Unique element name for debug GfxDrawCall draw_call; //< Params to dispatch a draw GfxIndexBufferSetup index_buffer; //< Optional index buffer with batch indices RenderCameraMask cam_mask; //< Mask in which cameras mesh batch wants to be rendered diff --git a/engine/mesh/mesh_builder.cpp b/engine/mesh/mesh_builder.cpp index 8483934c0..25f611324 100644 --- a/engine/mesh/mesh_builder.cpp +++ b/engine/mesh/mesh_builder.cpp @@ -39,7 +39,7 @@ namespace wmoge { m_mesh = std::move(mesh); } - void MeshBuilder::add_chunk(const StringId& name, const Ref& data) { + void MeshBuilder::add_chunk(const Strid& name, const Ref& data) { assert(data); m_chunks.push_back(data); diff --git a/engine/mesh/mesh_builder.hpp b/engine/mesh/mesh_builder.hpp index ae5c16235..6737357ad 100644 --- a/engine/mesh/mesh_builder.hpp +++ b/engine/mesh/mesh_builder.hpp @@ -45,7 +45,7 @@ namespace wmoge { class MeshBuilder { public: void set_mesh(Ref mesh); - void add_chunk(const StringId& name, const Ref& data); + void add_chunk(const Strid& name, const Ref& data); void add_child(int parent_idx, int child_idx); Status build(); @@ -54,7 +54,7 @@ namespace wmoge { private: std::vector> m_chunks; - std::vector m_chunks_names; + std::vector m_chunks_names; std::vector m_chunks_parents; std::vector> m_chunks_children; diff --git a/engine/pfx/pfx_component.cpp b/engine/pfx/pfx_component.cpp index 3f90a323d..6f995c313 100644 --- a/engine/pfx/pfx_component.cpp +++ b/engine/pfx/pfx_component.cpp @@ -43,8 +43,8 @@ namespace wmoge { } for (auto it = node["features"].first_child(); it.valid(); it = it.next_sibling()) { - StringId feature_name;// = Yaml::read_sid(it["feature"]); - Class* feature_class = Class::class_ptr(feature_name); + Strid feature_name;// = Yaml::read_sid(it["feature"]); + Class* feature_class = Class::class_ptr(feature_name); if (!feature_class) { WG_LOG_ERROR("no registered class for feature " << feature_name); @@ -87,7 +87,7 @@ namespace wmoge { PfxAttributes PfxComponent::get_attributes() const { return m_attributes; } - const StringId& PfxComponent::get_name() const { + const Strid& PfxComponent::get_name() const { return m_name; } int PfxComponent::get_features_count() const { diff --git a/engine/pfx/pfx_component.hpp b/engine/pfx/pfx_component.hpp index 28e204de1..79388b2b7 100644 --- a/engine/pfx/pfx_component.hpp +++ b/engine/pfx/pfx_component.hpp @@ -63,7 +63,7 @@ namespace wmoge { const Ref& get_feature(int id) const; PfxAttributes get_attributes() const; - const StringId& get_name() const; + const Strid& get_name() const; int get_features_count() const; int get_amount() const; bool is_active() const; @@ -71,7 +71,7 @@ namespace wmoge { private: fast_vector> m_features; PfxAttributes m_attributes; - StringId m_name; + Strid m_name; int m_amount = 0; bool m_active = false; }; diff --git a/engine/pfx/pfx_feature.hpp b/engine/pfx/pfx_feature.hpp index 45dd550e5..0db606e1f 100644 --- a/engine/pfx/pfx_feature.hpp +++ b/engine/pfx/pfx_feature.hpp @@ -55,8 +55,8 @@ namespace wmoge { WG_OBJECT(PfxFeature, Object) virtual Ref create() const { return {}; }; - virtual StringId get_feature_name() const { return StringId(); }; - virtual StringId get_feature_family() const { return StringId(); }; + virtual Strid get_feature_name() const { return Strid(); }; + virtual Strid get_feature_family() const { return Strid(); }; virtual bool load_from_options(const YamlConstNodeRef& node) { return true; }; diff --git a/engine/platform/application.cpp b/engine/platform/application.cpp index 263afaeed..0f6753155 100644 --- a/engine/platform/application.cpp +++ b/engine/platform/application.cpp @@ -61,6 +61,7 @@ #include "render/render_engine.hpp" #include "render/shader_manager.hpp" #include "render/texture_manager.hpp" +#include "render/view_manager.hpp" #include "resource/config_file.hpp" #include "resource/resource_manager.hpp" #include "scene/scene_manager.hpp" @@ -202,6 +203,7 @@ namespace wmoge { ioc->bind(); ioc->bind(); ioc->bind(); + ioc->bind(); ioc->bind_f([]() { ConfigFile* config = Engine::instance()->config(); @@ -272,6 +274,7 @@ namespace wmoge { IocContainer* ioc = IocContainer::instance(); + ioc->unbind(); ioc->unbind(); ioc->unbind(); ioc->unbind(); diff --git a/engine/platform/glfw/glfw_window.cpp b/engine/platform/glfw/glfw_window.cpp index 7382545f4..db57ef85d 100644 --- a/engine/platform/glfw/glfw_window.cpp +++ b/engine/platform/glfw/glfw_window.cpp @@ -153,7 +153,7 @@ namespace wmoge { return glfwGetWindowAttrib(m_hnd, GLFW_FOCUSED); } - const StringId& GlfwWindow::id() const { + const Strid& GlfwWindow::id() const { return m_id; } diff --git a/engine/platform/glfw/glfw_window.hpp b/engine/platform/glfw/glfw_window.hpp index 1b631da86..fd6fec69f 100644 --- a/engine/platform/glfw/glfw_window.hpp +++ b/engine/platform/glfw/glfw_window.hpp @@ -53,13 +53,13 @@ namespace wmoge { float scale_x() const override; float scale_y() const override; bool in_focus() const override; - const StringId& id() const override; + const Strid& id() const override; const std::string& title() const override; private: friend class GlfwWindowManager; - StringId m_id; + Strid m_id; std::string m_title; GLFWwindow* m_hnd = nullptr; class GlfwWindowManager& m_manager; diff --git a/engine/platform/glfw/glfw_window_manager.cpp b/engine/platform/glfw/glfw_window_manager.cpp index 2d46bde77..65f218f22 100644 --- a/engine/platform/glfw/glfw_window_manager.cpp +++ b/engine/platform/glfw/glfw_window_manager.cpp @@ -164,7 +164,7 @@ namespace wmoge { return window; } - Ref GlfwWindowManager::get(const StringId& window_id) { + Ref GlfwWindowManager::get(const Strid& window_id) { std::lock_guard guard(m_mutex); auto query = m_windows.find(window_id); diff --git a/engine/platform/glfw/glfw_window_manager.hpp b/engine/platform/glfw/glfw_window_manager.hpp index 5e5fa0b87..4af13da20 100644 --- a/engine/platform/glfw/glfw_window_manager.hpp +++ b/engine/platform/glfw/glfw_window_manager.hpp @@ -60,7 +60,7 @@ namespace wmoge { fast_vector> windows() override; Ref primary_window() override; Ref create(const WindowInfo& window_info) override; - Ref get(const StringId& window_id) override; + Ref get(const Strid& window_id) override; std::shared_ptr input(); std::recursive_mutex& mutex(); @@ -82,7 +82,7 @@ namespace wmoge { static void dispatch(GLFWwindow* hnd, WindowNotification notification); private: - fast_map> m_windows; + fast_map> m_windows; fast_map> m_windows_by_hnd; std::shared_ptr m_input; Ref m_primary; diff --git a/engine/platform/input_devices.hpp b/engine/platform/input_devices.hpp index ce98f1d2e..d75dc291a 100644 --- a/engine/platform/input_devices.hpp +++ b/engine/platform/input_devices.hpp @@ -40,12 +40,12 @@ namespace wmoge { class InputDevice : public RefCnt { public: ~InputDevice() override = default; - virtual const StringId& name() const { return m_mame; } + virtual const Strid& name() const { return m_mame; } virtual InputDeviceState state() const { return m_state; } virtual InputDeviceType device_type() const { return InputDeviceType::Any; } protected: - StringId m_mame; + Strid m_mame; InputDeviceState m_state; }; @@ -84,8 +84,8 @@ namespace wmoge { const std::vector& buttons_states() const { return m_buttons; } const std::vector& gamepad_axes_states() const { return m_gamepad_axes; } const std::vector& gamepad_buttons_states() const { return m_gamepad_buttons; } - const StringId& gamepad_name() const { return m_gamepad_name; } - const StringId& guid() const { return m_guid; } + const Strid& gamepad_name() const { return m_gamepad_name; } + const Strid& guid() const { return m_guid; } int id() const { return m_id; } bool is_gamepad() const { return m_is_gamepad; } InputDeviceType device_type() const override { return InputDeviceType::Joystick; } @@ -95,8 +95,8 @@ namespace wmoge { std::vector m_axes; std::vector m_gamepad_buttons; std::vector m_gamepad_axes; - StringId m_gamepad_name; - StringId m_guid; + Strid m_gamepad_name; + Strid m_guid; int m_id = -1; bool m_is_gamepad = false; }; diff --git a/engine/platform/window.hpp b/engine/platform/window.hpp index ef01b979f..8e41e76b7 100644 --- a/engine/platform/window.hpp +++ b/engine/platform/window.hpp @@ -42,7 +42,7 @@ namespace wmoge { struct WindowInfo { int width = 1280; int height = 720; - StringId id = SID("primary"); + Strid id = SID("primary"); std::string title = "Window"; Ref icons[2]; }; @@ -64,7 +64,7 @@ namespace wmoge { virtual float scale_x() const = 0; virtual float scale_y() const = 0; virtual bool in_focus() const = 0; - virtual const StringId& id() const = 0; + virtual const Strid& id() const = 0; virtual const std::string& title() const = 0; }; diff --git a/engine/platform/window_manager.hpp b/engine/platform/window_manager.hpp index de404eafc..793514aaa 100644 --- a/engine/platform/window_manager.hpp +++ b/engine/platform/window_manager.hpp @@ -44,7 +44,7 @@ namespace wmoge { virtual fast_vector> windows() = 0; virtual Ref primary_window() = 0; virtual Ref create(const WindowInfo& window_info) = 0; - virtual Ref get(const StringId& window_id) = 0; + virtual Ref get(const Strid& window_id) = 0; }; }// namespace wmoge diff --git a/engine/render/aux_draw_manager.hpp b/engine/render/aux_draw_manager.hpp index 3de254e3a..fe3126817 100644 --- a/engine/render/aux_draw_manager.hpp +++ b/engine/render/aux_draw_manager.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_AUX_DRAW_MANAGER_HPP -#define WMOGE_AUX_DRAW_MANAGER_HPP +#pragma once #include "core/synchronization.hpp" #include "gfx/gfx_vector.hpp" @@ -91,6 +90,4 @@ namespace wmoge { mutable SpinMutex m_mutex; }; -}// namespace wmoge - -#endif//WMOGE_AUX_DRAW_MANAGER_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/camera.cpp b/engine/render/camera.cpp index d0fae622b..392d6b6c8 100644 --- a/engine/render/camera.cpp +++ b/engine/render/camera.cpp @@ -29,15 +29,32 @@ namespace wmoge { - void Camera::set_proj_params(float fov, float aspect, float near, float far) { - m_fov = fov; + Camera::Camera() { + validate(); + } + + void Camera::set_fov(float fov) { + m_fov = fov; + } + void Camera::set_aspect(float aspect) { m_aspect = aspect; - m_near = near; - m_far = far; + } + void Camera::set_near_far(float near, float far) { + m_near = near; + m_far = far; } void Camera::set_viewport(const Rect2i& viewport) { m_viewport = viewport; } + void Camera::set_color(const Color4f& color) { + m_color = color; + } + void Camera::set_proj(CameraProjection proj) { + m_projection = proj; + } + void Camera::set_name(Strid name) { + m_name = std::move(name); + } void Camera::look(const Vec3f& dir, const Vec3f& up) { m_direction = dir; m_up = up; diff --git a/engine/render/camera.hpp b/engine/render/camera.hpp index 1a1a39ab9..2f11c4c0b 100644 --- a/engine/render/camera.hpp +++ b/engine/render/camera.hpp @@ -30,12 +30,12 @@ #include "core/array_view.hpp" #include "core/fast_vector.hpp" #include "math/aabb.hpp" +#include "math/color.hpp" #include "math/frustum.hpp" #include "math/mat.hpp" #include "math/math_utils3d.hpp" #include "math/plane.hpp" #include "math/vec.hpp" -#include "mesh/mesh_pass.hpp" #include "render/render_defs.hpp" #include @@ -49,10 +49,15 @@ namespace wmoge { */ class Camera final { public: - Camera() = default; + Camera(); - void set_proj_params(float fov, float aspect, float near, float far); + void set_fov(float fov); + void set_aspect(float aspect); + void set_near_far(float near, float far); void set_viewport(const Rect2i& viewport); + void set_color(const Color4f& color); + void set_proj(CameraProjection proj); + void set_name(Strid name); void look(const Vec3f& dir, const Vec3f& up); void move(const Vec3f& delta); void move_to(const Vec3f& point); @@ -91,8 +96,10 @@ namespace wmoge { float m_near = 0.1f; float m_far = 1000.0f; Vec3f m_position; - Vec3f m_direction = Vec3f::axis_z(); - Vec3f m_up = Vec3f::axis_y(); + Vec3f m_direction = Vec3f::axis_z(); + Vec3f m_up = Vec3f::axis_y(); + Strid m_name; + Color4f m_color = Color::BLACK4f; CameraProjection m_projection = CameraProjection::Perspective; }; diff --git a/engine/render/canvas.hpp b/engine/render/canvas.hpp index 1b53fac2d..32f32fcd6 100644 --- a/engine/render/canvas.hpp +++ b/engine/render/canvas.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_CANVAS_HPP -#define WMOGE_CANVAS_HPP +#pragma once #include "core/array_view.hpp" #include "core/fast_map.hpp" @@ -193,6 +192,4 @@ namespace wmoge { Ref m_params_set; //< Cached ubo to fill with const params and draw cmds buffer }; -}// namespace wmoge - -#endif//WMOGE_CANVAS_HPP \ No newline at end of file +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/visibility.cpp b/engine/render/culling.cpp similarity index 81% rename from engine/render/visibility.cpp rename to engine/render/culling.cpp index 327b91780..f0502491b 100644 --- a/engine/render/visibility.cpp +++ b/engine/render/culling.cpp @@ -25,7 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#include "visibility.hpp" +#include "culling.hpp" #include "core/string_utils.hpp" #include "core/task_parallel_for.hpp" @@ -37,7 +37,7 @@ namespace wmoge { - VisibilityItem VisibilitySystem::alloc_item() { + CullingItem CullingManager::alloc_item() { if (m_free.empty()) { const int curr_capacity = int(m_items.size()); const int new_capacity = curr_capacity + ALLOC_BATCH_SIZE; @@ -52,52 +52,52 @@ namespace wmoge { assert(!m_free.empty()); - VisibilityItem new_item = m_free.back(); + CullingItem new_item = m_free.back(); m_free.pop_back(); - m_items[new_item.id] = VisibilityItemData(); - m_result[new_item.id] = VisibilityItemResult(); + m_items[new_item.id] = CullingItemData(); + m_result[new_item.id] = CullingItemResult(); m_items[new_item.id].id = new_item; return new_item; } - void VisibilitySystem::release_item(VisibilityItem item) { + void CullingManager::release_item(CullingItem item) { assert(item.is_valid()); - m_items[item.id] = VisibilityItemData(); - m_result[item.id] = VisibilityItemResult(); + m_items[item.id] = CullingItemData(); + m_result[item.id] = CullingItemResult(); m_free.push_back(item); } - void VisibilitySystem::update_item_min_dist(const VisibilityItem& item, float min_dist) { + void CullingManager::update_item_min_dist(const CullingItem& item, float min_dist) { assert(item.is_valid()); m_items[item.id].min_dist_2 = min_dist * min_dist; } - void VisibilitySystem::update_item_max_dist(const VisibilityItem& item, float max_dist) { + void CullingManager::update_item_max_dist(const CullingItem& item, float max_dist) { assert(item.is_valid()); m_items[item.id].max_dist_2 = max_dist * max_dist; } - void VisibilitySystem::update_item_bbox(const VisibilityItem& item, const Aabbf& aabbf) { + void CullingManager::update_item_bbox(const CullingItem& item, const Aabbf& aabbf) { assert(item.is_valid()); m_items[item.id].aabb = aabbf; } - VisibilityItemResult VisibilitySystem::get_item_result(const VisibilityItem& item) { + CullingItemResult CullingManager::get_item_result(const CullingItem& item) { assert(item.is_valid()); return m_result[item.id]; } - void VisibilitySystem::cull(const CameraList& cameras) { - WG_AUTO_PROFILE_RENDER("VisibilitySystem::cull"); + void CullingManager::cull(const CameraList& cameras) { + WG_AUTO_PROFILE_RENDER("CullingManager::cull"); const int total_items = int(m_items.size()); const int n_cameras = int(cameras.get_size()); @@ -107,8 +107,8 @@ namespace wmoge { const Vec3f pos = cameras.camera_at(cam_idx).get_position(); TaskParallelFor task_cull_camera(SID("cull_cam_" + StringUtils::from_int(cam_idx)), [&](TaskContext&, int id, int) { - VisibilityItemData& data = m_items[id]; - VisibilityItemResult& result = m_result[id]; + CullingItemData& data = m_items[id]; + CullingItemResult& result = m_result[id]; const float dist_to_camera2 = Vec3f::distance2(pos, data.aabb.center()); const bool is_visible_frustum = frustum.is_inside_or_intersects(data.aabb); diff --git a/engine/render/visibility.hpp b/engine/render/culling.hpp similarity index 67% rename from engine/render/visibility.hpp rename to engine/render/culling.hpp index 989ccd0b0..dc95198de 100644 --- a/engine/render/visibility.hpp +++ b/engine/render/culling.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMGOE_VISIBILITY_HPP -#define WMGOE_VISIBILITY_HPP +#pragma once #include "core/array_view.hpp" #include "core/string_id.hpp" @@ -42,15 +41,15 @@ namespace wmoge { /** - * @class VisibilityItem + * @class CullingItem * @brief Id of the item to reference in visibility system */ - struct VisibilityItem { - VisibilityItem() = default; - VisibilityItem(int id) : id(id) {} + struct CullingItem { + CullingItem() = default; + CullingItem(int id) : id(id) {} - bool operator==(const VisibilityItem& other) const { return id == other.id; } - bool operator!=(const VisibilityItem& other) const { return id != other.id; } + bool operator==(const CullingItem& other) const { return id == other.id; } + bool operator!=(const CullingItem& other) const { return id != other.id; } bool is_valid() const { return id != -1; } @@ -63,53 +62,51 @@ namespace wmoge { }; /** - * @class VisibilityItemData + * @class CullingItemData * @brief Data of a single item for management */ - struct VisibilityItemData { - Aabbf aabb; - float min_dist_2 = 0.0f; - float max_dist_2 = 10000000000.0f; - VisibilityItem id; + struct CullingItemData { + Aabbf aabb; + float min_dist_2 = 0.0f; + float max_dist_2 = 10000000000.0f; + CullingItem id; }; /** - * @class VisibilityItemResult + * @class CullingItemResult * @brief Result of a visibility item culling tests */ - struct VisibilityItemResult { + struct CullingItemResult { RenderCameraMask cam_mask; float distance; }; /** - * @class VisibilitySystem + * @class CullingManager * @brief Manages allocation, frustum and occlussion culling of visibility items */ - class VisibilitySystem { + class CullingManager { public: static constexpr int ALLOC_BATCH_SIZE = 1024; - VisibilitySystem() = default; - VisibilitySystem(const VisibilitySystem&) = delete; - VisibilitySystem(VisibilitySystem&&) = delete; + CullingManager() = default; + CullingManager(const CullingManager&) = delete; + CullingManager(CullingManager&&) = delete; - VisibilityItem alloc_item(); - void release_item(VisibilityItem item); - void update_item_min_dist(const VisibilityItem& item, float min_dist); - void update_item_max_dist(const VisibilityItem& item, float max_dist); - void update_item_bbox(const VisibilityItem& item, const Aabbf& aabbf); - VisibilityItemResult get_item_result(const VisibilityItem& item); + CullingItem alloc_item(); + void release_item(CullingItem item); + void update_item_min_dist(const CullingItem& item, float min_dist); + void update_item_max_dist(const CullingItem& item, float max_dist); + void update_item_bbox(const CullingItem& item, const Aabbf& aabbf); + CullingItemResult get_item_result(const CullingItem& item); void cull(const CameraList& cameras); private: - std::vector m_items; - std::vector m_result; - std::vector m_free; - int m_task_batch = 16; + std::vector m_items; + std::vector m_result; + std::vector m_free; + int m_task_batch = 16; }; -}// namespace wmoge - -#endif//WMGOE_VISIBILITY_HPP \ No newline at end of file +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/deferred_pipeline.hpp b/engine/render/deferred_pipeline.hpp index 0a6ff9720..da329a5ab 100644 --- a/engine/render/deferred_pipeline.hpp +++ b/engine/render/deferred_pipeline.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_DEFERRED_PIPELINE_HPP -#define WMOGE_DEFERRED_PIPELINE_HPP +#pragma once #include "gfx/gfx_texture.hpp" #include "render/graphics_pipeline.hpp" @@ -49,6 +48,4 @@ namespace wmoge { private: }; -}// namespace wmoge - -#endif//WMOGE_DEFERRED_PIPELINE_HPP \ No newline at end of file +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/graphics_pipeline.cpp b/engine/render/graphics_pipeline.cpp index 1ae169f37..5959c4b41 100644 --- a/engine/render/graphics_pipeline.cpp +++ b/engine/render/graphics_pipeline.cpp @@ -27,11 +27,14 @@ #include "graphics_pipeline.hpp" +#include "debug/profiler.hpp" + #include namespace wmoge { WG_IO_BEGIN(BloomSettings) + WG_IO_PROFILE() WG_IO_FIELD_OPT(enable) WG_IO_FIELD_OPT(intensity) WG_IO_FIELD_OPT(threshold) @@ -43,6 +46,7 @@ namespace wmoge { WG_IO_END(BloomSettings) WG_IO_BEGIN(AutoExposureSettings) + WG_IO_PROFILE() WG_IO_FIELD_OPT(enable) WG_IO_FIELD_OPT(mode) WG_IO_FIELD_OPT(histogram_log_min) @@ -53,12 +57,14 @@ namespace wmoge { WG_IO_END(AutoExposureSettings) WG_IO_BEGIN(TonemapSettings) + WG_IO_PROFILE() WG_IO_FIELD_OPT(mode) WG_IO_FIELD_OPT(exposure) WG_IO_FIELD_OPT(white_point) WG_IO_END(TonemapSettings) WG_IO_BEGIN(GraphicsPipelineSettings) + WG_IO_PROFILE() WG_IO_FIELD_OPT(bloom) WG_IO_FIELD_OPT(auto_exposure) WG_IO_FIELD_OPT(tonemap) diff --git a/engine/render/render_defs.hpp b/engine/render/render_defs.hpp index ce24ed7fb..53f3a254b 100644 --- a/engine/render/render_defs.hpp +++ b/engine/render/render_defs.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_RENDER_DEFS_HPP -#define WMOGE_RENDER_DEFS_HPP +#pragma once #include @@ -66,6 +65,4 @@ namespace wmoge { */ class RenderCameraMask : public std::bitset {}; -}// namespace wmoge - -#endif//WMOGE_RENDER_DEFS_HPP \ No newline at end of file +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/render_engine.hpp b/engine/render/render_engine.hpp index ef15f3a88..c9adaf928 100644 --- a/engine/render/render_engine.hpp +++ b/engine/render/render_engine.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_RENDER_ENGINE_HPP -#define WMOGE_RENDER_ENGINE_HPP +#pragma once #include "core/array_view.hpp" #include "core/fast_vector.hpp" @@ -177,6 +176,4 @@ namespace wmoge { int m_batch_size = 4; }; -}// namespace wmoge - -#endif//WMOGE_RENDER_ENGINE_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/render_queue.hpp b/engine/render/render_queue.hpp index 5b5c34e2b..4d365c7a5 100644 --- a/engine/render/render_queue.hpp +++ b/engine/render/render_queue.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_RENDER_QUEUE_HPP -#define WMOGE_RENDER_QUEUE_HPP +#pragma once #include "core/fast_vector.hpp" #include "core/mask.hpp" @@ -154,6 +153,4 @@ namespace wmoge { SpinMutex m_mutex; }; -}// namespace wmoge - -#endif//WMOGE_RENDER_QUEUE_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/render_scene.hpp b/engine/render/render_scene.hpp index 76457df6a..54026e29d 100644 --- a/engine/render/render_scene.hpp +++ b/engine/render/render_scene.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_RENDER_SCENE_HPP -#define WMOGE_RENDER_SCENE_HPP +#pragma once #include "core/array_view.hpp" #include "gfx/gfx_buffers.hpp" @@ -84,6 +83,4 @@ namespace wmoge { std::vector m_free_objects_ids; //< Pool with free ids }; -}// namespace wmoge - -#endif//WMOGE_RENDER_SCENE_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/shader_builder.hpp b/engine/render/shader_builder.hpp index 0aecfa555..dda169d48 100644 --- a/engine/render/shader_builder.hpp +++ b/engine/render/shader_builder.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_SHADER_BUILDER_HPP -#define WMOGE_SHADER_BUILDER_HPP +#pragma once #include "core/fast_vector.hpp" #include "core/string_id.hpp" @@ -60,7 +59,7 @@ namespace wmoge { bool compile(); - StringId key; + Strid key; std::optional vertex; std::optional fragment; std::optional compute; @@ -68,6 +67,4 @@ namespace wmoge { Ref gfx_shader; }; -}// namespace wmoge - -#endif//WMOGE_SHADER_BUILDER_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/shader_manager.cpp b/engine/render/shader_manager.cpp index 9c1a42aee..14db288dc 100644 --- a/engine/render/shader_manager.cpp +++ b/engine/render/shader_manager.cpp @@ -149,7 +149,7 @@ namespace wmoge { } } - StringId ShaderManager::make_shader_key(const StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader) { + Strid ShaderManager::make_shader_key(const Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader) { std::stringstream shader_key_builder; shader_key_builder << "type=" << shader_name.str(); @@ -183,17 +183,17 @@ namespace wmoge { return SID(shader_key_builder.str()); } - Ref ShaderManager::get_shader(const StringId& shader_name) { + Ref ShaderManager::get_shader(const Strid& shader_name) { return get_shader(shader_name, {}); } - Ref ShaderManager::get_shader(const StringId& shader_name, const fast_vector& defines) { + Ref ShaderManager::get_shader(const Strid& shader_name, const fast_vector& defines) { return get_shader(shader_name, {}, defines, nullptr); } - Ref ShaderManager::get_shader(const wmoge::StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines) { + Ref ShaderManager::get_shader(const wmoge::Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines) { return get_shader(shader_name, attribs, defines, nullptr); } - Ref ShaderManager::get_shader(const StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader) { - const StringId shader_key = make_shader_key(shader_name, attribs, defines, shader); + Ref ShaderManager::get_shader(const Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader) { + const Strid shader_key = make_shader_key(shader_name, attribs, defines, shader); Ref gfx_shader = find(shader_key); if (gfx_shader) { @@ -222,7 +222,7 @@ namespace wmoge { return gfx_shader; } - Ref ShaderManager::find(const StringId& shader_key) { + Ref ShaderManager::find(const Strid& shader_key) { std::lock_guard lock(m_mutex); auto query = m_cache.find(shader_key); @@ -244,7 +244,7 @@ namespace wmoge { return nullptr; } - void ShaderManager::cache(const StringId& shader_key, const Ref& shader, bool allow_overwrite) { + void ShaderManager::cache(const Strid& shader_key, const Ref& shader, bool allow_overwrite) { WG_AUTO_PROFILE_RENDER("ShaderManager::cache"); std::lock_guard lock(m_mutex); @@ -269,7 +269,7 @@ namespace wmoge { int current_entry = 1; for (const auto& entry : m_cache) { - const StringId& key = entry.first; + const Strid& key = entry.first; const ShaderData& data = entry.second; Ref bytecode = data.bytecode ? data.bytecode : data.shader->byte_code(); diff --git a/engine/render/shader_manager.hpp b/engine/render/shader_manager.hpp index 16adddc0a..5da29260e 100644 --- a/engine/render/shader_manager.hpp +++ b/engine/render/shader_manager.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_SHADER_MANAGER_HPP -#define WMOGE_SHADER_MANAGER_HPP +#pragma once #include "core/fast_map.hpp" #include "core/fast_vector.hpp" @@ -47,7 +46,7 @@ namespace wmoge { * @brief Entry holding cached data of a particular shader */ struct ShaderData { - StringId name; + Strid name; Ref shader; Ref bytecode; @@ -66,13 +65,13 @@ namespace wmoge { ShaderManager(ShaderManager&&) = delete; ~ShaderManager(); - StringId make_shader_key(const StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader); - Ref get_shader(const StringId& shader_name); - Ref get_shader(const StringId& shader_name, const fast_vector& defines); - Ref get_shader(const StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines); - Ref get_shader(const StringId& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader); - Ref find(const StringId& shader_key); - void cache(const StringId& shader_key, const Ref& shader, bool allow_overwrite = false); + Strid make_shader_key(const Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader); + Ref get_shader(const Strid& shader_name); + Ref get_shader(const Strid& shader_name, const fast_vector& defines); + Ref get_shader(const Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines); + Ref get_shader(const Strid& shader_name, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader); + Ref find(const Strid& shader_key); + void cache(const Strid& shader_key, const Ref& shader, bool allow_overwrite = false); void dump_stats(); void reload_shaders(); void clear_cache(); @@ -85,10 +84,10 @@ namespace wmoge { void load_sources_from_disk(); private: - fast_map m_cache; - fast_map> m_passes; - std::string m_shaders_directory; - bool m_save_cache = false; + fast_map m_cache; + fast_map> m_passes; + std::string m_shaders_directory; + bool m_save_cache = false; class FileSystem* m_file_system = nullptr; class GfxDriver* m_driver = nullptr; @@ -104,6 +103,4 @@ namespace wmoge { mutable std::recursive_mutex m_mutex; }; -}// namespace wmoge - -#endif//WMOGE_SHADER_MANAGER_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/shader_pass.cpp b/engine/render/shader_pass.cpp index e2407f9ce..8b73eaee9 100644 --- a/engine/render/shader_pass.cpp +++ b/engine/render/shader_pass.cpp @@ -34,7 +34,7 @@ namespace wmoge { - Status ShaderPass::compile(const StringId& name, GfxDriver* driver, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader, Ref& out_shader) { + Status ShaderPass::compile(const Strid& name, GfxDriver* driver, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader, Ref& out_shader) { WG_AUTO_PROFILE_RENDER("ShaderPass::compile"); GfxShaderLang gfx_lang = driver->shader_lang(); diff --git a/engine/render/shader_pass.hpp b/engine/render/shader_pass.hpp index 9c311bd1d..4aa15f6a1 100644 --- a/engine/render/shader_pass.hpp +++ b/engine/render/shader_pass.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_SHADER_PASS_HPP -#define WMOGE_SHADER_PASS_HPP +#pragma once #include "core/string_id.hpp" #include "gfx/gfx_defs.hpp" @@ -65,7 +64,7 @@ namespace wmoge { * * @return Ok on success */ - virtual Status compile(const StringId& name, GfxDriver* driver, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader, Ref& out_shader); + virtual Status compile(const Strid& name, GfxDriver* driver, const GfxVertAttribs& attribs, const fast_vector& defines, class Shader* shader, Ref& out_shader); /** * @brief Reloads shader pass sources from a disc @@ -90,9 +89,7 @@ namespace wmoge { virtual const std::string& get_compute(GfxShaderLang lang) = 0; /** @brief unique lower-case pass name */ - virtual StringId get_name() = 0; + virtual Strid get_name() = 0; }; -}// namespace wmoge - -#endif//WMOGE_SHADER_PASS_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/texture_compression.hpp b/engine/render/texture_compression.hpp index c41f9f35e..00dabf2f2 100644 --- a/engine/render/texture_compression.hpp +++ b/engine/render/texture_compression.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_TEXTURE_COMPRESSION_HPP -#define WMOGE_TEXTURE_COMPRESSION_HPP +#pragma once #include "core/data.hpp" #include "core/status.hpp" @@ -174,6 +173,4 @@ namespace wmoge { static Status compress(const TexCompressionParams& params, std::vector& source, std::vector& compressed); }; -}// namespace wmoge - -#endif//WMOGE_TEXTURE_COMPRESSION_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/texture_manager.hpp b/engine/render/texture_manager.hpp index 57efd9212..df94ad5cb 100644 --- a/engine/render/texture_manager.hpp +++ b/engine/render/texture_manager.hpp @@ -25,8 +25,7 @@ /* SOFTWARE. */ /**********************************************************************************/ -#ifndef WMOGE_TEXTURE_MANAGER_HPP -#define WMOGE_TEXTURE_MANAGER_HPP +#pragma once #include "gfx/gfx_sampler.hpp" #include "gfx/gfx_texture.hpp" @@ -56,6 +55,4 @@ namespace wmoge { class GfxCtx* m_gfx_ctx; }; -}// namespace wmoge - -#endif//WMOGE_TEXTURE_MANAGER_HPP +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/view.cpp b/engine/render/view.cpp index 7a80bfff6..fe417444a 100644 --- a/engine/render/view.cpp +++ b/engine/render/view.cpp @@ -27,6 +27,13 @@ #include "view.hpp" +#include "platform/window_manager.hpp" +#include "system/engine.hpp" + namespace wmoge { -} \ No newline at end of file + View::View(Strid name) { + m_name = std::move(name); + } + +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/view.hpp b/engine/render/view.hpp index ba7d188b4..002bf7c47 100644 --- a/engine/render/view.hpp +++ b/engine/render/view.hpp @@ -27,6 +27,53 @@ #pragma once +#include "core/ref.hpp" +#include "core/string_id.hpp" +#include "gfx/gfx_texture.hpp" +#include "math/color.hpp" +#include "math/vec.hpp" +#include "platform/window.hpp" +#include "render/camera.hpp" +#include "scene/scene_entity.hpp" + +#include + namespace wmoge { -} \ No newline at end of file + /** + * @class ViewParams + * @brief Holds params assositated to the view + */ + struct ViewParams { + bool auto_aspect = true; + }; + + /** + * @class View + * @brief View control how to present rendered content to the screen + */ + class View : public RefCnt { + public: + View(Strid name); + ~View() override = default; + + void update(bool is_active); + + [[nodiscard]] const ViewParams& get_params() const { return m_params; } + [[nodiscard]] const Camera& get_camera() const { return m_camera; } + [[nodiscard]] const std::optional& get_camera_prev() const { return m_camera_prev; } + [[nodiscard]] const std::optional& get_owner() const { return m_owner; } + [[nodiscard]] const Strid& get_name() const { return m_name; } + + private: + ViewParams m_params; + Camera m_camera; + std::optional m_camera_prev; + std::optional m_owner; + Strid m_name; + Ref m_window; + Rect2i m_presentation_area = Rect2i(0, 0, 1280, 720); + Color4f m_presentation_color = Color::BLACK4f; + }; + +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/view_manager.cpp b/engine/render/view_manager.cpp index 50a11cc6b..64a476b5a 100644 --- a/engine/render/view_manager.cpp +++ b/engine/render/view_manager.cpp @@ -27,6 +27,32 @@ #include "view_manager.hpp" +#include +#include + namespace wmoge { -} \ No newline at end of file + ViewManager::ViewManager() { + m_active = create_view(SID("default")); + } + + Ref ViewManager::create_view(Strid name) { + auto view = make_ref(std::move(name)); + m_views.push_back(view); + return view; + } + + void ViewManager::delete_view(const Ref& view) { + assert(has_view(view)); + m_views.erase(std::find(m_views.begin(), m_views.end(), view)); + } + + void ViewManager::make_active(Ref view) { + m_active = std::move(view); + } + + bool ViewManager::has_view(const Ref& view) { + return std::find(m_views.begin(), m_views.end(), view) != m_views.end(); + } + +}// namespace wmoge \ No newline at end of file diff --git a/engine/render/view_manager.hpp b/engine/render/view_manager.hpp index ba7d188b4..078ec0b24 100644 --- a/engine/render/view_manager.hpp +++ b/engine/render/view_manager.hpp @@ -27,6 +27,28 @@ #pragma once +#include "render/view.hpp" + namespace wmoge { -} \ No newline at end of file + /** + * @class ViewManager + * @brief Managers views to render scene and present images to the final window + */ + class ViewManager { + public: + ViewManager(); + + void update(); + + Ref create_view(Strid name); + void delete_view(const Ref& view); + void make_active(Ref view); + bool has_view(const Ref& view); + + private: + std::vector> m_views; + Ref m_active; + }; + +}// namespace wmoge \ No newline at end of file diff --git a/engine/resource/config_file.cpp b/engine/resource/config_file.cpp index 0380c1b9a..962f16e04 100644 --- a/engine/resource/config_file.cpp +++ b/engine/resource/config_file.cpp @@ -48,7 +48,7 @@ namespace wmoge { return StatusCode::FailedRead; } - StringId section; + Strid section; std::string line; while (!file.eof()) { @@ -93,7 +93,7 @@ namespace wmoge { WG_AUTO_PROFILE_RESOURCE("ConfigFile::stack"); for (const auto& other_entry : other.m_entries) { - const StringId& key = other_entry.first; + const Strid& key = other_entry.first; if (m_entries.find(key) == m_entries.end() || mode == ConfigStackMode::Overwrite) { @@ -123,28 +123,28 @@ namespace wmoge { return m_entries.empty(); } - Status ConfigFile::set(const StringId& key, const bool& value, bool overwrite) { + Status ConfigFile::set(const Strid& key, const bool& value, bool overwrite) { if (m_entries.find(key) == m_entries.end() || overwrite) { m_entries[key] = value; return StatusCode::Ok; } return StatusCode::NoValue; } - Status ConfigFile::set(const StringId& key, const int& value, bool overwrite) { + Status ConfigFile::set(const Strid& key, const int& value, bool overwrite) { if (m_entries.find(key) == m_entries.end() || overwrite) { m_entries[key] = value; return StatusCode::Ok; } return StatusCode::NoValue; } - Status ConfigFile::set(const StringId& key, const float& value, bool overwrite) { + Status ConfigFile::set(const Strid& key, const float& value, bool overwrite) { if (m_entries.find(key) == m_entries.end() || overwrite) { m_entries[key] = value; return StatusCode::Ok; } return StatusCode::NoValue; } - Status ConfigFile::set(const StringId& key, const std::string& value, bool overwrite) { + Status ConfigFile::set(const Strid& key, const std::string& value, bool overwrite) { if (m_entries.find(key) == m_entries.end() || overwrite) { m_entries[key] = value; return StatusCode::Ok; @@ -152,54 +152,54 @@ namespace wmoge { return StatusCode::NoValue; } - Status ConfigFile::get(const StringId& key, bool& value) { + Status ConfigFile::get(const Strid& key, bool& value) { Var* p_var; if (!get_element(key, p_var)) return StatusCode::NoValue; value = (*p_var).operator int(); return StatusCode::Ok; } - Status ConfigFile::get(const StringId& key, int& value) { + Status ConfigFile::get(const Strid& key, int& value) { Var* p_var; if (!get_element(key, p_var)) return StatusCode::NoValue; value = *p_var; return StatusCode::Ok; } - Status ConfigFile::get(const StringId& key, float& value) { + Status ConfigFile::get(const Strid& key, float& value) { Var* p_var; if (!get_element(key, p_var)) return StatusCode::NoValue; value = *p_var; return StatusCode::Ok; } - Status ConfigFile::get(const StringId& key, std::string& value) { + Status ConfigFile::get(const Strid& key, std::string& value) { Var* p_var; if (!get_element(key, p_var)) return StatusCode::NoValue; value = p_var->operator String(); return StatusCode::Ok; } - Status ConfigFile::get(const StringId& key, Color4f& value) { + Status ConfigFile::get(const Strid& key, Color4f& value) { Var* p_var; if (!get_element(key, p_var)) return StatusCode::NoValue; value = Color::from_hex4(static_cast(StringUtils::to_ulong(p_var->operator String(), 16))); return StatusCode::Ok; } - bool ConfigFile::get_bool(const StringId& key, bool value) { + bool ConfigFile::get_bool(const Strid& key, bool value) { get(key, value); return value; } - int ConfigFile::get_int(const StringId& key, int value) { + int ConfigFile::get_int(const Strid& key, int value) { get(key, value); return value; } - float ConfigFile::get_float(const StringId& key, float value) { + float ConfigFile::get_float(const Strid& key, float value) { get(key, value); return value; } - std::string ConfigFile::get_string(const StringId& key, std::string value) { + std::string ConfigFile::get_string(const Strid& key, std::string value) { get(key, value); return value; } - Color4f ConfigFile::get_color4f(const StringId& key, Color4f value) { + Color4f ConfigFile::get_color4f(const Strid& key, Color4f value) { get(key, value); return value; } @@ -211,7 +211,7 @@ namespace wmoge { return StatusCode::Ok; } - bool ConfigFile::get_element(const StringId& key, Var*& element) { + bool ConfigFile::get_element(const Strid& key, Var*& element) { auto it_element = m_entries.find(key); if (it_element == m_entries.end()) return false; diff --git a/engine/resource/config_file.hpp b/engine/resource/config_file.hpp index d6834417f..d486b2cf4 100644 --- a/engine/resource/config_file.hpp +++ b/engine/resource/config_file.hpp @@ -85,31 +85,31 @@ namespace wmoge { /** @brief Check if config has no entries */ bool is_empty(); - Status set(const StringId& key, const bool& value, bool overwrite = true); - Status set(const StringId& key, const int& value, bool overwrite = true); - Status set(const StringId& key, const float& value, bool overwrite = true); - Status set(const StringId& key, const std::string& value, bool overwrite = true); - - Status get(const StringId& key, bool& value); - Status get(const StringId& key, int& value); - Status get(const StringId& key, float& value); - Status get(const StringId& key, std::string& value); - Status get(const StringId& key, Color4f& value); - - bool get_bool(const StringId& key, bool def_value = false); - int get_int(const StringId& key, int def_value = 0); - float get_float(const StringId& key, float def_value = 1.0f); - std::string get_string(const StringId& key, std::string def_value = ""); - Color4f get_color4f(const StringId& key, Color4f value = {}); + Status set(const Strid& key, const bool& value, bool overwrite = true); + Status set(const Strid& key, const int& value, bool overwrite = true); + Status set(const Strid& key, const float& value, bool overwrite = true); + Status set(const Strid& key, const std::string& value, bool overwrite = true); + + Status get(const Strid& key, bool& value); + Status get(const Strid& key, int& value); + Status get(const Strid& key, float& value); + Status get(const Strid& key, std::string& value); + Status get(const Strid& key, Color4f& value); + + bool get_bool(const Strid& key, bool def_value = false); + int get_int(const Strid& key, int def_value = 0); + float get_float(const Strid& key, float def_value = 1.0f); + std::string get_string(const Strid& key, std::string def_value = ""); + Color4f get_color4f(const Strid& key, Color4f value = {}); Status copy_to(Object& other) const override; private: /** @brief Single element in a config file */ - bool get_element(const StringId& key, Var*& element); + bool get_element(const Strid& key, Var*& element); private: - fast_map m_entries; + fast_map m_entries; }; }// namespace wmoge diff --git a/engine/resource/loaders/resource_loader_assimp.cpp b/engine/resource/loaders/resource_loader_assimp.cpp index 3d81e8d94..e8f04ed68 100644 --- a/engine/resource/loaders/resource_loader_assimp.cpp +++ b/engine/resource/loaders/resource_loader_assimp.cpp @@ -46,7 +46,7 @@ namespace wmoge { struct AssimpImportContext { - const StringId* name = nullptr; + const Strid* name = nullptr; const ResourceMeta* meta = nullptr; const aiScene* scene = nullptr; unsigned int options = 0; @@ -55,7 +55,7 @@ namespace wmoge { int next_mesh_id = 0; }; - Status ResourceLoaderAssimp::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderAssimp::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderAssimp::load"); if (!meta.import_options.has_value()) { @@ -121,7 +121,7 @@ namespace wmoge { return StatusCode::Ok; } - StringId ResourceLoaderAssimp::get_name() { + Strid ResourceLoaderAssimp::get_name() { return SID("assimp"); } Status ResourceLoaderAssimp::process_node(AssimpImportContext& context, aiNode* node, const Mat4x4f& parent_transform, const Mat4x4f& inv_parent_transform, std::optional parent) { diff --git a/engine/resource/loaders/resource_loader_assimp.hpp b/engine/resource/loaders/resource_loader_assimp.hpp index d8276d517..fd63efcb2 100644 --- a/engine/resource/loaders/resource_loader_assimp.hpp +++ b/engine/resource/loaders/resource_loader_assimp.hpp @@ -48,8 +48,8 @@ namespace wmoge { class ResourceLoaderAssimp final : public ResourceLoader { public: ~ResourceLoaderAssimp() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; private: Status process_node(struct AssimpImportContext& context, aiNode* node, const Mat4x4f& parent_transform, const Mat4x4f& inv_parent_transform, std::optional parent); diff --git a/engine/resource/loaders/resource_loader_default.cpp b/engine/resource/loaders/resource_loader_default.cpp index 7ad3ba795..01c19be2d 100644 --- a/engine/resource/loaders/resource_loader_default.cpp +++ b/engine/resource/loaders/resource_loader_default.cpp @@ -31,7 +31,7 @@ namespace wmoge { - Status ResourceLoaderDefault::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderDefault::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderDefault::load"); res = meta.cls->instantiate().cast(); @@ -62,7 +62,7 @@ namespace wmoge { return StatusCode::Ok; } - StringId ResourceLoaderDefault::get_name() { + Strid ResourceLoaderDefault::get_name() { return SID("default"); } diff --git a/engine/resource/loaders/resource_loader_default.hpp b/engine/resource/loaders/resource_loader_default.hpp index cb80edafd..8483ced95 100644 --- a/engine/resource/loaders/resource_loader_default.hpp +++ b/engine/resource/loaders/resource_loader_default.hpp @@ -42,8 +42,8 @@ namespace wmoge { class ResourceLoaderDefault final : public ResourceLoader { public: ~ResourceLoaderDefault() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; }// namespace wmoge diff --git a/engine/resource/loaders/resource_loader_freetype.cpp b/engine/resource/loaders/resource_loader_freetype.cpp index c1a1a0d69..aa69a07c3 100644 --- a/engine/resource/loaders/resource_loader_freetype.cpp +++ b/engine/resource/loaders/resource_loader_freetype.cpp @@ -32,7 +32,7 @@ namespace wmoge { - Status ResourceLoaderFreeType::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderFreeType::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderFreeType::load"); Ref font = meta.cls->instantiate().cast(); @@ -55,7 +55,7 @@ namespace wmoge { return font->load(options.source_file, options.height, options.glyphs_in_row); } - StringId ResourceLoaderFreeType::get_name() { + Strid ResourceLoaderFreeType::get_name() { return SID("freetype"); } diff --git a/engine/resource/loaders/resource_loader_freetype.hpp b/engine/resource/loaders/resource_loader_freetype.hpp index 27a955843..90972dd34 100644 --- a/engine/resource/loaders/resource_loader_freetype.hpp +++ b/engine/resource/loaders/resource_loader_freetype.hpp @@ -39,8 +39,8 @@ namespace wmoge { class ResourceLoaderFreeType final : public ResourceLoader { public: ~ResourceLoaderFreeType() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; }// namespace wmoge diff --git a/engine/resource/loaders/resource_loader_image.cpp b/engine/resource/loaders/resource_loader_image.cpp index 4851747f7..540bb65f2 100644 --- a/engine/resource/loaders/resource_loader_image.cpp +++ b/engine/resource/loaders/resource_loader_image.cpp @@ -32,7 +32,7 @@ namespace wmoge { - Status ResourceLoaderImage::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderImage::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderImage::load"); Ref image = meta.cls->instantiate().cast(); @@ -55,7 +55,7 @@ namespace wmoge { return image->load(options.source_file, options.channels); } - StringId ResourceLoaderImage::get_name() { + Strid ResourceLoaderImage::get_name() { return SID("image"); } diff --git a/engine/resource/loaders/resource_loader_image.hpp b/engine/resource/loaders/resource_loader_image.hpp index 4144e5a1d..6339703b9 100644 --- a/engine/resource/loaders/resource_loader_image.hpp +++ b/engine/resource/loaders/resource_loader_image.hpp @@ -39,8 +39,8 @@ namespace wmoge { class ResourceLoaderImage final : public ResourceLoader { public: ~ResourceLoaderImage() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; }// namespace wmoge diff --git a/engine/resource/loaders/resource_loader_texture.cpp b/engine/resource/loaders/resource_loader_texture.cpp index 049367a93..320dd3551 100644 --- a/engine/resource/loaders/resource_loader_texture.cpp +++ b/engine/resource/loaders/resource_loader_texture.cpp @@ -36,7 +36,7 @@ namespace wmoge { - Status ResourceLoaderTexture2d::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderTexture2d::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderTexture2d::load"); if (!meta.import_options.has_value()) { @@ -90,11 +90,11 @@ namespace wmoge { return StatusCode::Ok; } - StringId ResourceLoaderTexture2d::get_name() { + Strid ResourceLoaderTexture2d::get_name() { return SID("texture_2d"); } - Status ResourceLoaderTextureCube::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderTextureCube::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderTextureCube::load"); if (!meta.import_options.has_value()) { @@ -161,7 +161,7 @@ namespace wmoge { return StatusCode::Ok; } - StringId ResourceLoaderTextureCube::get_name() { + Strid ResourceLoaderTextureCube::get_name() { return SID("texture_cube"); } diff --git a/engine/resource/loaders/resource_loader_texture.hpp b/engine/resource/loaders/resource_loader_texture.hpp index 4d54061f6..d2e076523 100644 --- a/engine/resource/loaders/resource_loader_texture.hpp +++ b/engine/resource/loaders/resource_loader_texture.hpp @@ -44,8 +44,8 @@ namespace wmoge { class ResourceLoaderTexture2d final : public ResourceLoader { public: ~ResourceLoaderTexture2d() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; /** @@ -55,8 +55,8 @@ namespace wmoge { class ResourceLoaderTextureCube final : public ResourceLoader { public: ~ResourceLoaderTextureCube() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; }// namespace wmoge diff --git a/engine/resource/loaders/resource_loader_wav.cpp b/engine/resource/loaders/resource_loader_wav.cpp index 6308bf6e8..dac8f1fb6 100644 --- a/engine/resource/loaders/resource_loader_wav.cpp +++ b/engine/resource/loaders/resource_loader_wav.cpp @@ -32,7 +32,7 @@ namespace wmoge { - Status ResourceLoaderWav::load(const StringId& name, const ResourceMeta& meta, Ref& res) { + Status ResourceLoaderWav::load(const Strid& name, const ResourceMeta& meta, Ref& res) { WG_AUTO_PROFILE_RESOURCE("ResourceLoaderWav::load"); Ref audio = meta.cls->instantiate().cast(); @@ -55,7 +55,7 @@ namespace wmoge { return audio->load(options.source_file); } - StringId ResourceLoaderWav::get_name() { + Strid ResourceLoaderWav::get_name() { return SID("wav"); } diff --git a/engine/resource/loaders/resource_loader_wav.hpp b/engine/resource/loaders/resource_loader_wav.hpp index 7b44b780d..2b562bdef 100644 --- a/engine/resource/loaders/resource_loader_wav.hpp +++ b/engine/resource/loaders/resource_loader_wav.hpp @@ -39,8 +39,8 @@ namespace wmoge { class ResourceLoaderWav final : public ResourceLoader { public: ~ResourceLoaderWav() override = default; - Status load(const StringId& name, const ResourceMeta& meta, Ref& res) override; - StringId get_name() override; + Status load(const Strid& name, const ResourceMeta& meta, Ref& res) override; + Strid get_name() override; }; }// namespace wmoge diff --git a/engine/resource/material.cpp b/engine/resource/material.cpp index ff52851c7..493747fe5 100644 --- a/engine/resource/material.cpp +++ b/engine/resource/material.cpp @@ -54,6 +54,7 @@ namespace wmoge { WG_IO_END_NMSP(MaterialFile, EntryTexture) WG_IO_BEGIN(MaterialFile) + WG_IO_PROFILE() WG_IO_FIELD(shader) WG_IO_FIELD_OPT(parameters) WG_IO_FIELD_OPT(textures) @@ -85,7 +86,7 @@ namespace wmoge { } } - void Material::set_param(const StringId& name, const std::string& string_value) { + void Material::set_param(const Strid& name, const std::string& string_value) { assert(m_shader); const auto& params = m_shader->get_parameters(); @@ -128,7 +129,7 @@ namespace wmoge { m_dirty.set(DirtyFlag::Parameters); } - void Material::set_int(const StringId& name, int value) { + void Material::set_int(const Strid& name, int value) { assert(m_shader); const auto type = GfxShaderParam::Int; @@ -143,7 +144,7 @@ namespace wmoge { std::memcpy(m_parameters->buffer() + param->second.offset, &value, param->second.size); m_dirty.set(DirtyFlag::Parameters); } - void Material::set_float(const StringId& name, float value) { + void Material::set_float(const Strid& name, float value) { assert(m_shader); const auto type = GfxShaderParam::Float; @@ -158,7 +159,7 @@ namespace wmoge { std::memcpy(m_parameters->buffer() + param->second.offset, &value, param->second.size); m_dirty.set(DirtyFlag::Parameters); } - void Material::set_vec2(const StringId& name, const Vec2f& value) { + void Material::set_vec2(const Strid& name, const Vec2f& value) { assert(m_shader); const auto type = GfxShaderParam::Vec2; @@ -173,7 +174,7 @@ namespace wmoge { std::memcpy(m_parameters->buffer() + param->second.offset, &value, param->second.size); m_dirty.set(DirtyFlag::Parameters); } - void Material::set_vec3(const StringId& name, const Vec3f& value) { + void Material::set_vec3(const Strid& name, const Vec3f& value) { assert(m_shader); const auto type = GfxShaderParam::Vec3; @@ -188,7 +189,7 @@ namespace wmoge { std::memcpy(m_parameters->buffer() + param->second.offset, &value, param->second.size); m_dirty.set(DirtyFlag::Parameters); } - void Material::set_vec4(const StringId& name, const Vec4f& value) { + void Material::set_vec4(const Strid& name, const Vec4f& value) { assert(m_shader); const auto type = GfxShaderParam::Vec4; @@ -203,7 +204,7 @@ namespace wmoge { std::memcpy(m_parameters->buffer() + param->second.offset, &value, param->second.size); m_dirty.set(DirtyFlag::Parameters); } - void Material::set_texture(const StringId& name, const Ref& texture) { + void Material::set_texture(const Strid& name, const Ref& texture) { assert(m_shader); if (!texture) { diff --git a/engine/resource/material.hpp b/engine/resource/material.hpp index 9c497511f..1481feb50 100644 --- a/engine/resource/material.hpp +++ b/engine/resource/material.hpp @@ -54,7 +54,7 @@ namespace wmoge { struct MaterialFile { /** @brief Param info of a material */ struct EntryParam { - StringId name; + Strid name; std::string value; WG_IO_DECLARE(EntryParam); @@ -62,7 +62,7 @@ namespace wmoge { /** @brief Texture info of a material */ struct EntryTexture { - StringId name; + Strid name; ResRef value; WG_IO_DECLARE(EntryTexture); @@ -107,19 +107,19 @@ namespace wmoge { Material(Ref shader); /** @brief Set material parameter by name from string value */ - void set_param(const StringId& name, const std::string& value); + void set_param(const Strid& name, const std::string& value); /** @brief Set material int parameter value by name */ - void set_int(const StringId& name, int value); + void set_int(const Strid& name, int value); /** @brief Set material float parameter value by name */ - void set_float(const StringId& name, float value); + void set_float(const Strid& name, float value); /** @brief Set material vec2 parameter value by name */ - void set_vec2(const StringId& name, const Vec2f& value); + void set_vec2(const Strid& name, const Vec2f& value); /** @brief Set material vec3 parameter value by name */ - void set_vec3(const StringId& name, const Vec3f& value); + void set_vec3(const Strid& name, const Vec3f& value); /** @brief Set material vec4 parameter value by name */ - void set_vec4(const StringId& name, const Vec4f& value); + void set_vec4(const Strid& name, const Vec4f& value); /** @brief Set material texture parameter value by name */ - void set_texture(const StringId& name, const Ref& texture); + void set_texture(const Strid& name, const Ref& texture); /** @brief Validates GPU state of material, buffer and descriptor set for rendering */ void validate(); diff --git a/engine/resource/mesh.cpp b/engine/resource/mesh.cpp index b20efcdf7..70d3aa096 100644 --- a/engine/resource/mesh.cpp +++ b/engine/resource/mesh.cpp @@ -118,8 +118,8 @@ namespace wmoge { m_gfx_vertex_buffers.resize(m_vertex_buffers.size()); for (int i = 0; i < m_vertex_buffers.size(); ++i) { - const int size = static_cast(m_vertex_buffers[i]->size()); - const StringId name = SID(get_name().str() + "_" + StringUtils::from_int(i)); + const int size = static_cast(m_vertex_buffers[i]->size()); + const Strid name = SID(get_name().str() + "_" + StringUtils::from_int(i)); m_gfx_vertex_buffers[i] = gfx_driver->make_vert_buffer(size, mem_usage, name); gfx_ctx->update_vert_buffer(m_gfx_vertex_buffers[i], 0, size, m_vertex_buffers[i]); } @@ -127,8 +127,8 @@ namespace wmoge { m_gfx_index_buffers.resize(m_index_buffers.size()); for (int i = 0; i < m_index_buffers.size(); ++i) { - const int size = static_cast(m_index_buffers[i]->size()); - const StringId name = SID(get_name().str() + "_" + StringUtils::from_int(i)); + const int size = static_cast(m_index_buffers[i]->size()); + const Strid name = SID(get_name().str() + "_" + StringUtils::from_int(i)); m_gfx_index_buffers[i] = gfx_driver->make_index_buffer(size, mem_usage, name); gfx_ctx->update_index_buffer(m_gfx_index_buffers[i], 0, size, m_index_buffers[i]); } diff --git a/engine/resource/mesh.hpp b/engine/resource/mesh.hpp index cd4df0ff9..57611f1fa 100644 --- a/engine/resource/mesh.hpp +++ b/engine/resource/mesh.hpp @@ -79,7 +79,7 @@ namespace wmoge { * @brief Represents single mesh chunk in a mesh which can be rendered individually with material */ struct MeshChunk { - StringId name; + Strid name; Aabbf aabb; GfxVertAttribs attribs; GfxPrimType prim_type = GfxPrimType::Triangles; diff --git a/engine/resource/model.cpp b/engine/resource/model.cpp index 8397dbae9..2acc8f5aa 100644 --- a/engine/resource/model.cpp +++ b/engine/resource/model.cpp @@ -27,72 +27,55 @@ #include "model.hpp" +#include "debug/profiler.hpp" + namespace wmoge { - Status yaml_read(const YamlConstNodeRef& node, ModelChunk& data) { - WG_YAML_READ_AS(node, "material", data.material); - return StatusCode::Ok; - } - Status yaml_write(YamlNodeRef node, const ModelChunk& data) { - WG_YAML_MAP(node); - WG_YAML_WRITE_AS(node, "material", data.material); - return StatusCode::Ok; - } + WG_IO_BEGIN(ModelObj) + WG_IO_FIELD(material) + WG_IO_FIELD(mesh_idx) + WG_IO_FIELD(chunk_idx) + WG_IO_FIELD_OPT(flags) + WG_IO_FIELD_OPT(name) + WG_IO_END(ModelObj) - Status yaml_read(const YamlConstNodeRef& node, ModelLod& data) { - WG_YAML_READ_AS_OPT(node, "mesh", data.mesh); - WG_YAML_READ_AS_OPT(node, "chunks", data.chunks); - WG_YAML_READ_AS_OPT(node, "shadow_mesh", data.shadow_mesh); - return StatusCode::Ok; - } - Status yaml_write(YamlNodeRef node, const ModelLod& data) { - WG_YAML_MAP(node); - WG_YAML_WRITE_AS(node, "mesh", data.mesh); - WG_YAML_WRITE_AS(node, "chunks", data.chunks); - WG_YAML_WRITE_AS(node, "shadow_mesh", data.shadow_mesh); - return StatusCode::Ok; - } + WG_IO_BEGIN(ModelLod) + WG_IO_FIELD_OPT(ranges) + WG_IO_END(ModelLod) - Status yaml_read(const YamlConstNodeRef& node, ModelLodSettings& data) { - WG_YAML_READ_AS_OPT(node, "minimum_lod", data.minimum_lod); - WG_YAML_READ_AS_OPT(node, "num_of_lods", data.num_of_lods); - return StatusCode::Ok; - } - Status yaml_write(YamlNodeRef node, const ModelLodSettings& data) { - WG_YAML_MAP(node); - WG_YAML_WRITE_AS_OPT(node, "minimum_lod", data.minimum_lod.has_value(), data.minimum_lod); - WG_YAML_WRITE_AS_OPT(node, "num_of_lods", data.num_of_lods.has_value(), data.num_of_lods); - return StatusCode::Ok; - } + WG_IO_BEGIN(ModelLodSettings) + WG_IO_FIELD_OPT(area) + WG_IO_FIELD(minimum_lod) + WG_IO_FIELD(num_of_lods) + WG_IO_END(ModelLodSettings) - Status yaml_read(const YamlConstNodeRef& node, ModelFile& data) { - WG_YAML_READ_AS_OPT(node, "lods", data.lods); - WG_YAML_READ_AS_OPT(node, "lod_settings", data.lod_settings); - WG_YAML_READ_AS_OPT(node, "collision_mesh", data.collision_mesh); - return StatusCode::Ok; - } - Status yaml_write(YamlNodeRef node, const ModelFile& data) { - WG_YAML_MAP(node); - WG_YAML_WRITE_AS(node, "lods", data.lods); - WG_YAML_WRITE_AS(node, "lod_settings", data.lod_settings); - WG_YAML_WRITE_AS(node, "collision_mesh", data.collision_mesh); - return StatusCode::Ok; - } + WG_IO_BEGIN(ModelFile) + WG_IO_FIELD(objs) + WG_IO_FIELD(meshes) + WG_IO_FIELD_OPT(lod) + WG_IO_FIELD_OPT(lod_settings) + WG_IO_FIELD_OPT(aabb) + WG_IO_END(ModelFile) void Model::update_aabb() { m_aabb = Aabbf(); - for (const auto& lod : m_lods) { - m_aabb = m_aabb.join(lod.mesh->get_aabb()); + for (const auto& mesh : m_meshes) { + m_aabb = m_aabb.join(mesh->get_aabb()); } } Status Model::read_from_yaml(const YamlConstNodeRef& node) { + WG_AUTO_PROFILE_RESOURCE("Model::read_from_yaml"); + ModelFile model_file; WG_YAML_READ(node, model_file); - m_lods = std::move(model_file.lods); + m_objs = std::move(model_file.objs); + m_meshes = std::move(model_file.meshes); + m_lod = std::move(model_file.lod); m_lod_settings = std::move(model_file.lod_settings); + m_aabb = std::move(model_file.aabb); update_aabb(); @@ -101,7 +84,8 @@ namespace wmoge { Status Model::copy_to(Object& other) const { Resource::copy_to(other); auto* ptr = dynamic_cast(&other); - ptr->m_lods = m_lods; + ptr->m_objs = m_objs; + ptr->m_lod = m_lod; ptr->m_lod_settings = m_lod_settings; ptr->m_aabb = m_aabb; return StatusCode::Ok; diff --git a/engine/resource/model.hpp b/engine/resource/model.hpp index b2d647ee7..87f74d339 100644 --- a/engine/resource/model.hpp +++ b/engine/resource/model.hpp @@ -28,7 +28,7 @@ #pragma once #include "core/fast_vector.hpp" -#include "io/yaml.hpp" +#include "io/serialization.hpp" #include "math/aabb.hpp" #include "resource/material.hpp" #include "resource/mesh.hpp" @@ -36,19 +36,31 @@ #include "resource/resource.hpp" #include "resource/resource_ref.hpp" +#include #include namespace wmoge { + /** @brief Model obj flag */ + enum class ModelObjFlag { + + }; + + /** @brief Flags to configure model obj */ + using ModelObjFlags = Mask; + /** - * @class ModelLod - * @brief Serializable struct to hold single drawable model mesh chunk info + * @class ModelObj + * @brief Serializable struct to hold single renderable model obj */ - struct ModelChunk { + struct ModelObj { ResRef material; + std::int16_t mesh_idx = 0; + std::int16_t chunk_idx = 0; + ModelObjFlags flags; + Strid name; - friend Status yaml_read(const YamlConstNodeRef& node, ModelChunk& data); - friend Status yaml_write(YamlNodeRef node, const ModelChunk& data); + WG_IO_DECLARE(ModelObj); }; /** @@ -56,12 +68,9 @@ namespace wmoge { * @brief Serializable struct to hold single lod params */ struct ModelLod { - fast_vector chunks; - ResRef mesh; - std::optional> shadow_mesh; + fast_vector ranges; - friend Status yaml_read(const YamlConstNodeRef& node, ModelLod& data); - friend Status yaml_write(YamlNodeRef node, const ModelLod& data); + WG_IO_DECLARE(ModelLod); }; /** @@ -69,11 +78,11 @@ namespace wmoge { * @brief Serializable struct to hold model lods settings */ struct ModelLodSettings { + fast_vector area; std::optional minimum_lod; std::optional num_of_lods; - friend Status yaml_read(const YamlConstNodeRef& node, ModelLodSettings& data); - friend Status yaml_write(YamlNodeRef node, const ModelLodSettings& data); + WG_IO_DECLARE(ModelLodSettings); }; /** @@ -81,12 +90,13 @@ namespace wmoge { * @brief Serializable struct to hold model info */ struct ModelFile { - fast_vector lods; - ModelLodSettings lod_settings; - std::optional> collision_mesh; + fast_vector objs; + fast_vector> meshes; + ModelLod lod; + ModelLodSettings lod_settings; + Aabbf aabb; - friend Status yaml_read(const YamlConstNodeRef& node, ModelFile& data); - friend Status yaml_write(YamlNodeRef node, const ModelFile& data); + WG_IO_DECLARE(ModelFile); }; /** @@ -107,17 +117,19 @@ namespace wmoge { void update_aabb(); - [[nodiscard]] ArrayView get_lods() const { return m_lods; } - [[nodiscard]] const ModelLodSettings& get_lod_settings() const { return m_lod_settings; } - [[nodiscard]] const Aabbf& get_aabb() const { return m_aabb; } + [[nodiscard]] ArrayView get_objs() { return m_objs; } + [[nodiscard]] const ModelLodSettings& get_lod_settings() const { return m_lod_settings; } + [[nodiscard]] const Aabbf& get_aabb() const { return m_aabb; } Status read_from_yaml(const YamlConstNodeRef& node) override; Status copy_to(Object& other) const override; private: - fast_vector m_lods; - ModelLodSettings m_lod_settings; - Aabbf m_aabb; + fast_vector m_objs; + fast_vector> m_meshes; + ModelLod m_lod; + ModelLodSettings m_lod_settings; + Aabbf m_aabb; }; }// namespace wmoge \ No newline at end of file diff --git a/engine/resource/paks/resource_pak_fs.cpp b/engine/resource/paks/resource_pak_fs.cpp index 9321ac7cd..20c9a3b0f 100644 --- a/engine/resource/paks/resource_pak_fs.cpp +++ b/engine/resource/paks/resource_pak_fs.cpp @@ -68,6 +68,7 @@ namespace wmoge { meta.cls = Class::class_ptr(res_file.cls); meta.pak = this; meta.loader = loader ? loader.value() : nullptr; + meta.deps = std::move(res_file.deps); meta.path_on_disk = res_file.path_on_disk; meta.import_options.emplace(std::move(res_tree)); diff --git a/engine/resource/resource.cpp b/engine/resource/resource.cpp index f79c91b9c..275828edb 100644 --- a/engine/resource/resource.cpp +++ b/engine/resource/resource.cpp @@ -56,7 +56,7 @@ namespace wmoge { ResourceId::ResourceId(const std::string& id) { m_name = SID(id); } - ResourceId::ResourceId(const StringId& id) { + ResourceId::ResourceId(const Strid& id) { m_name = id; } @@ -74,8 +74,8 @@ namespace wmoge { void Resource::register_class() { auto cls = Class::register_class(); - cls->add_property(ClassProperty(VarType::StringId, SID("name"), SID("get_name"))); - cls->add_method(ClassMethod(VarType::StringId, SID("get_name"), {}), &Resource::get_name, {}); + cls->add_property(ClassProperty(VarType::Strid, SID("name"), SID("get_name"))); + cls->add_method(ClassMethod(VarType::Strid, SID("get_name"), {}), &Resource::get_name, {}); } void ResourceDependencies::set_mode(CollectionMode mode, std::optional num_levels) { diff --git a/engine/resource/resource.hpp b/engine/resource/resource.hpp index 7cb207d85..e06651789 100644 --- a/engine/resource/resource.hpp +++ b/engine/resource/resource.hpp @@ -56,16 +56,16 @@ namespace wmoge { public: ResourceId() = default; ResourceId(const std::string& id); - ResourceId(const StringId& id); + ResourceId(const Strid& id); bool operator==(const ResourceId& other) const { return m_name == other.m_name; } bool operator!=(const ResourceId& other) const { return m_name != other.m_name; } bool operator<(const ResourceId& other) const { return m_name < other.m_name; } operator bool() const { return is_empty(); } - operator StringId() const { return sid(); } + operator Strid() const { return sid(); } - [[nodiscard]] const StringId& sid() const { return m_name; } + [[nodiscard]] const Strid& sid() const { return m_name; } [[nodiscard]] const std::string& str() const { return m_name.str(); } [[nodiscard]] bool is_empty() const { return m_name.empty(); } [[nodiscard]] std::size_t hash() const { return m_name.hash(); } @@ -76,7 +76,7 @@ namespace wmoge { friend Status archive_write(Archive& archive, const ResourceId& id); private: - StringId m_name; + Strid m_name; }; static_assert(std::is_trivially_destructible_v, "id must be trivial as ptr or int"); @@ -94,10 +94,10 @@ namespace wmoge { public: WG_OBJECT(Resource, Object); - void set_name(StringId name) { m_id = ResourceId(name); } + void set_name(Strid name) { m_id = ResourceId(name); } void set_id(ResourceId id) { m_id = id; } void set_uuid(UUID uuid) { m_uuid = uuid; } - const StringId& get_name() { return m_id.sid(); } + const Strid& get_name() { return m_id.sid(); } const ResourceId& get_id() { return m_id; } const UUID& get_uuid() { return m_uuid; } diff --git a/engine/resource/resource_loader.hpp b/engine/resource/resource_loader.hpp index 2bd34102b..8f35105e9 100644 --- a/engine/resource/resource_loader.hpp +++ b/engine/resource/resource_loader.hpp @@ -40,9 +40,9 @@ namespace wmoge { */ class ResourceLoader { public: - virtual ~ResourceLoader() = default; - virtual Status load(const StringId& name, const ResourceMeta& meta, Ref& res) = 0; - virtual StringId get_name() = 0; + virtual ~ResourceLoader() = default; + virtual Status load(const Strid& name, const ResourceMeta& meta, Ref& res) = 0; + virtual Strid get_name() = 0; }; }// namespace wmoge diff --git a/engine/resource/resource_manager.cpp b/engine/resource/resource_manager.cpp index 5b155e600..e9c7d167f 100644 --- a/engine/resource/resource_manager.cpp +++ b/engine/resource/resource_manager.cpp @@ -96,7 +96,7 @@ namespace wmoge { // get dependencies which still loading or already loaded fast_vector deps; - for (const StringId& dep : resource_meta.value().deps) { + for (const Strid& dep : resource_meta.value().deps) { deps.push_back(load_async(dep).as_async()); } @@ -196,7 +196,7 @@ namespace wmoge { m_paks.push_back(std::move(pak)); } - std::optional ResourceManager::find_loader(const StringId& loader) { + std::optional ResourceManager::find_loader(const Strid& loader) { std::lock_guard guard(m_mutex); auto query = m_loaders.find(loader); return query != m_loaders.end() ? std::make_optional(query->second.get()) : std::nullopt; diff --git a/engine/resource/resource_manager.hpp b/engine/resource/resource_manager.hpp index 5a77bd75b..6cff2ac4d 100644 --- a/engine/resource/resource_manager.hpp +++ b/engine/resource/resource_manager.hpp @@ -130,7 +130,7 @@ namespace wmoge { void add_pak(std::shared_ptr pak); /** @brief Find resource loader by loader name */ - std::optional find_loader(const StringId& loader); + std::optional find_loader(const Strid& loader); /** @brief Find resource meta by resource name */ std::optional find_meta(const ResourceId& resource); @@ -175,10 +175,10 @@ namespace wmoge { }; private: - fast_vector> m_paks; - fast_map> m_resources; - fast_map m_loading; - fast_map> m_loaders; + fast_vector> m_paks; + fast_map> m_resources; + fast_map m_loading; + fast_map> m_loaders; mutable std::recursive_mutex m_mutex; }; diff --git a/engine/resource/resource_meta.cpp b/engine/resource/resource_meta.cpp index 26e9eb61f..0ad77b719 100644 --- a/engine/resource/resource_meta.cpp +++ b/engine/resource/resource_meta.cpp @@ -29,29 +29,14 @@ namespace wmoge { - Status yaml_read(const YamlConstNodeRef& node, ResourceResFile& file) { - WG_YAML_READ_AS(node, "version", file.version); - WG_YAML_READ_AS(node, "uuid", file.uuid); - WG_YAML_READ_AS(node, "class", file.cls); - WG_YAML_READ_AS(node, "loader", file.loader); - WG_YAML_READ_AS(node, "deps", file.deps); - WG_YAML_READ_AS(node, "description", file.description); - WG_YAML_READ_AS_OPT(node, "path_on_disk", file.path_on_disk); - - return StatusCode::Ok; - } - - Status yaml_write(YamlNodeRef node, const ResourceResFile& file) { - WG_YAML_MAP(node); - WG_YAML_WRITE_AS(node, "version", file.version); - WG_YAML_WRITE_AS(node, "uuid", file.uuid); - WG_YAML_WRITE_AS(node, "class", file.cls); - WG_YAML_WRITE_AS(node, "loader", file.loader); - WG_YAML_WRITE_AS(node, "deps", file.deps); - WG_YAML_WRITE_AS(node, "description", file.description); - WG_YAML_WRITE_AS_OPT(node, "path_on_disk", file.path_on_disk.has_value(), file.path_on_disk); - - return StatusCode::Ok; - } + WG_IO_BEGIN(ResourceResFile) + WG_IO_FIELD(version) + WG_IO_FIELD(uuid) + WG_IO_FIELD_AS(cls, "class") + WG_IO_FIELD(loader) + WG_IO_FIELD(deps) + WG_IO_FIELD(description) + WG_IO_FIELD_OPT(path_on_disk) + WG_IO_END(ResourceResFile) }// namespace wmoge \ No newline at end of file diff --git a/engine/resource/resource_meta.hpp b/engine/resource/resource_meta.hpp index 97b9c0996..9da7a748a 100644 --- a/engine/resource/resource_meta.hpp +++ b/engine/resource/resource_meta.hpp @@ -32,7 +32,7 @@ #include "core/fast_vector.hpp" #include "core/string_id.hpp" #include "core/uuid.hpp" -#include "io/yaml.hpp" +#include "io/serialization.hpp" #include "resource/resource.hpp" #include @@ -40,6 +40,22 @@ namespace wmoge { + /** + * @class ResourceResFile + * @brief Structure for ResourceMeta info stored as `.res` file in file system + */ + struct ResourceResFile { + int version; + UUID uuid; + Strid cls; + Strid loader; + fast_vector deps; + std::string description; + std::optional path_on_disk; + + WG_IO_DECLARE(ResourceResFile) + }; + /** * @class ResourceMeta * @brief Meta information of a particular resource @@ -50,28 +66,11 @@ namespace wmoge { class Class* cls = nullptr; class ResourcePak* pak = nullptr; class ResourceLoader* loader = nullptr; - fast_vector deps; + fast_vector deps; std::optional path_on_disk; std::optional import_options; }; - /** - * @class ResourceResFile - * @brief Structure for ResourceMeta info stored as `.res` file in file system - */ - struct ResourceResFile { - int version; - UUID uuid; - StringId cls; - StringId loader; - fast_vector deps; - std::string description; - std::optional path_on_disk; - - friend Status yaml_read(const YamlConstNodeRef& node, ResourceResFile& file); - friend Status yaml_write(YamlNodeRef node, const ResourceResFile& file); - }; - }// namespace wmoge #endif//WMOGE_RESOURCE_META_HPP diff --git a/engine/resource/script.cpp b/engine/resource/script.cpp index f37d6cf50..7aef51b06 100644 --- a/engine/resource/script.cpp +++ b/engine/resource/script.cpp @@ -49,16 +49,16 @@ namespace wmoge { Ref Script::attach_to(Object* object) { return Ref{}; } - bool Script::has_property(const StringId& property) { + bool Script::has_property(const Strid& property) { return false; } - bool Script::has_method(const StringId& method) { + bool Script::has_method(const Strid& method) { return false; } ScriptFunctionsMask Script::get_mask() { return m_mask; } - const StringId& Script::get_language() { + const Strid& Script::get_language() { return m_language; } const std::string& Script::get_code() { diff --git a/engine/resource/script.hpp b/engine/resource/script.hpp index b9165492e..c29d924c2 100644 --- a/engine/resource/script.hpp +++ b/engine/resource/script.hpp @@ -61,15 +61,15 @@ namespace wmoge { Status copy_to(Object& other) const override; virtual Ref attach_to(Object* object); - virtual bool has_property(const StringId& property); - virtual bool has_method(const StringId& method); + virtual bool has_property(const Strid& property); + virtual bool has_method(const Strid& method); ScriptFunctionsMask get_mask(); - const StringId& get_language(); + const Strid& get_language(); const std::string& get_code(); protected: - StringId m_language; + Strid m_language; std::string m_code; ScriptFunctionsMask m_mask; }; diff --git a/engine/resource/shader.cpp b/engine/resource/shader.cpp index e8b3c8d87..2eb74977b 100644 --- a/engine/resource/shader.cpp +++ b/engine/resource/shader.cpp @@ -62,6 +62,7 @@ namespace wmoge { WG_IO_END(ShaderPipelineState) WG_IO_BEGIN(ShaderFile) + WG_IO_PROFILE() WG_IO_FIELD_OPT(parameters) WG_IO_FIELD_OPT(textures) WG_IO_FIELD_OPT(keywords) @@ -164,16 +165,16 @@ namespace wmoge { return m_fragment; } - const StringId& Shader::get_domain() const { + const Strid& Shader::get_domain() const { return m_domain; } - const fast_set& Shader::get_keywords() const { + const fast_set& Shader::get_keywords() const { return m_keywords; } - const fast_map& Shader::get_parameters() const { + const fast_map& Shader::get_parameters() const { return m_parameters; } - const fast_map& Shader::get_textures() const { + const fast_map& Shader::get_textures() const { return m_textures; } const ShaderPipelineState& Shader::get_pipeline_state() const { diff --git a/engine/resource/shader.hpp b/engine/resource/shader.hpp index 8a0f94d4d..9ffe2f9f4 100644 --- a/engine/resource/shader.hpp +++ b/engine/resource/shader.hpp @@ -50,7 +50,7 @@ namespace wmoge { * @brief Shader parameter info */ struct ShaderParameter { - StringId name; + Strid name; GfxShaderParam type; int offset = -1; int size = -1; @@ -64,7 +64,7 @@ namespace wmoge { * @brief Shader texture info */ struct ShaderTexture { - StringId name; + Strid name; GfxTex type; int id = -1; ResRef value; @@ -94,11 +94,11 @@ namespace wmoge { struct ShaderFile { std::vector parameters; std::vector textures; - std::vector keywords; + std::vector keywords; std::string vertex; std::string fragment; std::string compute; - StringId domain; + Strid domain; ShaderPipelineState state{}; WG_IO_DECLARE(ShaderFile); @@ -145,38 +145,38 @@ namespace wmoge { [[nodiscard]] Ref create_variant(const GfxVertAttribs& attribs, const fast_vector& defines); void fill_layout(GfxDescSetLayoutDesc& layout) const; - [[nodiscard]] const std::string& get_vertex() const; - [[nodiscard]] const std::string& get_fragment() const; - [[nodiscard]] const std::string& get_compute() const; - [[nodiscard]] const StringId& get_domain() const; - [[nodiscard]] const fast_set& get_keywords() const; - [[nodiscard]] const fast_map& get_parameters() const; - [[nodiscard]] const fast_map& get_textures() const; - [[nodiscard]] const ShaderPipelineState& get_pipeline_state() const; - [[nodiscard]] int get_parameters_size() const; - [[nodiscard]] int get_parameters_count() const; - [[nodiscard]] int get_textures_count() const; - [[nodiscard]] int get_start_textures_slot() const; - [[nodiscard]] int get_start_buffers_slot() const; - [[nodiscard]] const std::string& get_include_textures() const; - [[nodiscard]] const std::string& get_include_parameters() const; + [[nodiscard]] const std::string& get_vertex() const; + [[nodiscard]] const std::string& get_fragment() const; + [[nodiscard]] const std::string& get_compute() const; + [[nodiscard]] const Strid& get_domain() const; + [[nodiscard]] const fast_set& get_keywords() const; + [[nodiscard]] const fast_map& get_parameters() const; + [[nodiscard]] const fast_map& get_textures() const; + [[nodiscard]] const ShaderPipelineState& get_pipeline_state() const; + [[nodiscard]] int get_parameters_size() const; + [[nodiscard]] int get_parameters_count() const; + [[nodiscard]] int get_textures_count() const; + [[nodiscard]] int get_start_textures_slot() const; + [[nodiscard]] int get_start_buffers_slot() const; + [[nodiscard]] const std::string& get_include_textures() const; + [[nodiscard]] const std::string& get_include_parameters() const; protected: Status generate_params_layout(); Status generate_textures_layout(); private: - fast_map m_parameters; - fast_map m_textures; - fast_set m_keywords; - ShaderPipelineState m_pipeline_state{}; - StringId m_domain; - std::string m_vertex; - std::string m_fragment; - std::string m_compute; - std::string m_include_textures; - std::string m_include_parameters; - int m_parameters_size = 0; + fast_map m_parameters; + fast_map m_textures; + fast_set m_keywords; + ShaderPipelineState m_pipeline_state{}; + Strid m_domain; + std::string m_vertex; + std::string m_fragment; + std::string m_compute; + std::string m_include_textures; + std::string m_include_parameters; + int m_parameters_size = 0; }; }// namespace wmoge diff --git a/engine/resource/texture.cpp b/engine/resource/texture.cpp index 80dbfb210..7b82a9db0 100644 --- a/engine/resource/texture.cpp +++ b/engine/resource/texture.cpp @@ -49,7 +49,8 @@ namespace wmoge { WG_IO_FIELD_OPT(compression) WG_IO_END(TextureImportOptions) - WG_IO_BEGIN_SUPER(Texture2dImportOptions, TextureImportOptions) + WG_IO_BEGIN(Texture2dImportOptions) + WG_IO_SUPER(TextureImportOptions) WG_IO_FIELD(source_file) WG_IO_END(Texture2dImportOptions) @@ -62,7 +63,8 @@ namespace wmoge { WG_IO_FIELD(front) WG_IO_END_NMSP(TextureCubeImportOptions, SourceFiles) - WG_IO_BEGIN_SUPER(TextureCubeImportOptions, TextureImportOptions) + WG_IO_BEGIN(TextureCubeImportOptions) + WG_IO_SUPER(TextureImportOptions) WG_IO_FIELD(source_files) WG_IO_END(TextureCubeImportOptions) diff --git a/engine/scene/register_classes_scene.cpp b/engine/scene/register_classes_scene.cpp index 720e5d25a..1280e504b 100644 --- a/engine/scene/register_classes_scene.cpp +++ b/engine/scene/register_classes_scene.cpp @@ -28,6 +28,7 @@ #include "register_classes_scene.hpp" #include "scene/scene_node.hpp" +#include "scene/scene_node_props.hpp" #include "scene/scene_tree.hpp" namespace wmoge { @@ -36,6 +37,8 @@ namespace wmoge { SceneNodeProp::register_class(); SceneNode::register_class(); SceneTree::register_class(); + NodePropSpatial::register_class(); + NodePropCamera::register_class(); } }// namespace wmoge diff --git a/engine/scene/scene.cpp b/engine/scene/scene.cpp index d596703c9..9fb4b6a88 100644 --- a/engine/scene/scene.cpp +++ b/engine/scene/scene.cpp @@ -27,6 +27,7 @@ #include "scene.hpp" +#include "debug/profiler.hpp" #include "render/deferred_pipeline.hpp" #include "scene/scene_components.hpp" #include "scene/scene_entity.hpp" @@ -35,11 +36,13 @@ namespace wmoge { - Scene::Scene(StringId name) { - m_name = name; - m_ecs_world = std::make_unique(); - m_visibility_system = std::make_unique(); - m_render_scene = std::make_unique(); + Scene::Scene(Strid name) { + WG_AUTO_PROFILE_SCENE("Scene::Scene"); + + m_name = name; + m_ecs_world = std::make_unique(); + m_culling_manager = std::make_unique(); + m_render_scene = std::make_unique(); m_ecs_world->set_attribute(0, *this); } @@ -53,12 +56,15 @@ namespace wmoge { } Status Scene::build(const SceneData& data) { + WG_AUTO_PROFILE_SCENE("Scene::build"); + return StatusCode::Ok; } void Scene::advance(float delta_time) { m_delta_time = delta_time; m_time += m_delta_time; + m_frame_id += 1; } void Scene::clear() { m_ecs_world->clear(); @@ -67,18 +73,20 @@ namespace wmoge { m_state = state; } void Scene::finalize() { + WG_AUTO_PROFILE_SCENE("Scene::finalize"); + m_ecs_world.reset(); - m_visibility_system.reset(); + m_culling_manager.reset(); m_render_scene.reset(); } - const StringId& Scene::get_name() { + const Strid& Scene::get_name() { return m_name; } EcsWorld* Scene::get_ecs_world() { return m_ecs_world.get(); } - VisibilitySystem* Scene::get_visibility_system() { - return m_visibility_system.get(); + CullingManager* Scene::get_culling_manager() { + return m_culling_manager.get(); } RenderScene* Scene::get_render_scene() { return m_render_scene.get(); diff --git a/engine/scene/scene.hpp b/engine/scene/scene.hpp index 09e4ed8eb..84e1ce76e 100644 --- a/engine/scene/scene.hpp +++ b/engine/scene/scene.hpp @@ -32,9 +32,9 @@ #include "core/string_id.hpp" #include "core/weak_ref.hpp" #include "ecs/ecs_world.hpp" +#include "render/culling.hpp" #include "render/graphics_pipeline.hpp" #include "render/render_scene.hpp" -#include "render/visibility.hpp" #include "scene/scene_data.hpp" #include @@ -75,7 +75,7 @@ namespace wmoge { */ class Scene final : public WeakRefCnt { public: - Scene(StringId name = StringId()); + Scene(Strid name = Strid()); ~Scene() override = default; class Entity create_entity(); @@ -86,26 +86,28 @@ namespace wmoge { void set_state(SceneState state); void finalize(); - [[nodiscard]] const StringId& get_name(); - [[nodiscard]] EcsWorld* get_ecs_world(); - [[nodiscard]] VisibilitySystem* get_visibility_system(); - [[nodiscard]] RenderScene* get_render_scene(); - [[nodiscard]] float get_time() const { return m_time; } - [[nodiscard]] float get_delta_time() const { return m_delta_time; } - [[nodiscard]] bool need_simulate() const { return m_need_simulate; } - [[nodiscard]] bool need_render() const { return m_need_render; } - [[nodiscard]] SceneState get_state() const { return m_state; } + [[nodiscard]] const Strid& get_name(); + [[nodiscard]] EcsWorld* get_ecs_world(); + [[nodiscard]] CullingManager* get_culling_manager(); + [[nodiscard]] RenderScene* get_render_scene(); + [[nodiscard]] float get_time() const { return m_time; } + [[nodiscard]] float get_delta_time() const { return m_delta_time; } + [[nodiscard]] bool need_simulate() const { return m_need_simulate; } + [[nodiscard]] bool need_render() const { return m_need_render; } + [[nodiscard]] int get_frame_id() const { return m_frame_id; } + [[nodiscard]] SceneState get_state() const { return m_state; } private: - std::unique_ptr m_ecs_world; - std::unique_ptr m_visibility_system; - std::unique_ptr m_render_scene; + std::unique_ptr m_ecs_world; + std::unique_ptr m_culling_manager; + std::unique_ptr m_render_scene; - StringId m_name; - float m_time = 0.0f; - float m_delta_time = 0.0f; - bool m_need_simulate = true; - bool m_need_render = true; + Strid m_name; + float m_time = 0.0f; + float m_delta_time = 0.0f; + bool m_need_simulate = true; + bool m_need_render = true; + int m_frame_id = -1; SceneState m_state = SceneState::Default; }; diff --git a/engine/scene/scene_components.hpp b/engine/scene/scene_components.hpp index 02676432d..f08783a30 100644 --- a/engine/scene/scene_components.hpp +++ b/engine/scene/scene_components.hpp @@ -33,13 +33,13 @@ #include "math/aabb.hpp" #include "math/color.hpp" #include "math/mat.hpp" +#include "math/math_utils3d.hpp" #include "math/transform.hpp" #include "math/vec.hpp" #include "render/camera.hpp" +#include "render/culling.hpp" #include "render/light.hpp" #include "render/model_instance.hpp" -#include "render/visibility.hpp" -#include "scene/scene_node.hpp" #include #include @@ -83,6 +83,7 @@ namespace wmoge { struct EcsComponentTransformUpd : EcsComponent { WG_ECS_COMPONENT(EcsComponentTransformUpd); + int batch_id = 0; int last_frame_updated = -1; bool is_dirty = true; }; @@ -94,7 +95,7 @@ namespace wmoge { struct EcsComponentLocalToWorld : EcsComponent { WG_ECS_COMPONENT(EcsComponentLocalToWorld); - Mat4x4f matrix; + Mat4x4f matrix = Math3d::identity(); }; /** @@ -104,7 +105,7 @@ namespace wmoge { struct EcsComponentWorldToLocal : EcsComponent { WG_ECS_COMPONENT(EcsComponentWorldToLocal); - Mat4x4f matrix; + Mat4x4f matrix = Math3d::identity(); }; /** @@ -114,7 +115,7 @@ namespace wmoge { struct EcsComponentLocalToParent : EcsComponent { WG_ECS_COMPONENT(EcsComponentLocalToParent); - Mat4x4f matrix; + Mat4x4f matrix = Math3d::identity(); }; /** @@ -128,7 +129,7 @@ namespace wmoge { }; /** - * @class EcsComponentWorldAabb + * @class EcsComponentAabbWorld * @brief Aabb volume of object in the world space */ struct EcsComponentAabbWorld : EcsComponent { @@ -144,7 +145,7 @@ namespace wmoge { struct EcsComponentTag : EcsComponent { WG_ECS_COMPONENT(EcsComponentTag); - StringId tag; + Strid tag; }; /** @@ -179,7 +180,7 @@ namespace wmoge { /** * @class EcsComponentModel - * @brief Visiblity item for culling (shared for geometry, lights, etc.) + * @brief A renderable model */ struct EcsComponentModel : EcsComponent { WG_ECS_COMPONENT(EcsComponentModel); @@ -188,13 +189,13 @@ namespace wmoge { }; /** - * @class EcsComponentVisibilityItem - * @brief Visiblity item for culling (shared for geometry, lights, etc.) + * @class EcsComponentCullingItem + * @brief Item for culling (shared for geometry, lights, etc.) */ - struct EcsComponentVisibilityItem : EcsComponent { - WG_ECS_COMPONENT(EcsComponentVisibilityItem); + struct EcsComponentCullingItem : EcsComponent { + WG_ECS_COMPONENT(EcsComponentCullingItem); - VisibilityItem item; + CullingItem item; }; }// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_data.cpp b/engine/scene/scene_data.cpp index 9ae7fb553..3d7460251 100644 --- a/engine/scene/scene_data.cpp +++ b/engine/scene/scene_data.cpp @@ -27,12 +27,16 @@ #include "scene_data.hpp" +#include "debug/profiler.hpp" + namespace wmoge { + WG_IO_BEGIN(SceneDataSpatial) + WG_IO_END(SceneDataSpatial) + WG_IO_BEGIN(SceneDataCamera) WG_IO_FIELD_OPT(name) WG_IO_FIELD_OPT(color) - WG_IO_FIELD_OPT(viewport) WG_IO_FIELD_OPT(fov) WG_IO_FIELD_OPT(near) WG_IO_FIELD_OPT(far) @@ -40,11 +44,22 @@ namespace wmoge { WG_IO_END(SceneDataCamera) WG_IO_BEGIN(SceneData) + WG_IO_PROFILE() WG_IO_FIELD(name) WG_IO_FIELD(entities) WG_IO_FIELD(names) + WG_IO_FIELD(hier) WG_IO_FIELD(cameras) WG_IO_FIELD(pipeline) WG_IO_END(SceneData) + void SceneDataCamera::fill(EcsComponentCamera& component) const { + Camera& camera = component.camera; + camera.set_fov(fov); + camera.set_near_far(near, far); + camera.set_color(color); + camera.set_proj(projection); + camera.set_name(name); + } + }// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_data.hpp b/engine/scene/scene_data.hpp index ab1327516..923d47c09 100644 --- a/engine/scene/scene_data.hpp +++ b/engine/scene/scene_data.hpp @@ -36,11 +36,12 @@ #include "math/color.hpp" #include "math/transform.hpp" #include "platform/window.hpp" +#include "render/culling.hpp" #include "render/graphics_pipeline.hpp" #include "render/render_scene.hpp" -#include "render/visibility.hpp" #include "resource/model.hpp" #include "resource/resource_ref.hpp" +#include "scene/scene_components.hpp" #include #include @@ -50,13 +51,14 @@ namespace wmoge { /** - * @class SceneDataTransform + * @class SceneDataSpatial * @brief Serializable struct with transform data for a scene entity */ - struct SceneDataTransform { - Transform3d transform; + struct SceneDataSpatial { + Transform3d transform; + std::optional parent; - WG_IO_DECLARE(SceneDataTransform); + WG_IO_DECLARE(SceneDataSpatial); }; /** @@ -64,14 +66,15 @@ namespace wmoge { * @brief Serializable struct with camera data for a scene entity */ struct SceneDataCamera { - StringId name; + Strid name; Color4f color = Color::BLACK4f; - Vec4f viewport = Vec4f(0, 0, 1, 1); float fov = 45.0f; float near = 0.1f; float far = 10000.0f; CameraProjection projection = CameraProjection::Perspective; + void fill(EcsComponentCamera& component) const; + WG_IO_DECLARE(SceneDataCamera); }; @@ -87,12 +90,12 @@ namespace wmoge { * @brief Serializable struct with a scene data for a runtime scene */ struct SceneData final { - StringId name; - std::vector entities; - SceneEntityVector names; - SceneEntityVector transforms; - SceneEntityVector cameras; - GraphicsPipelineSettings pipeline; + Strid name; + std::vector entities; + SceneEntityVector names; + SceneEntityVector hier; + SceneEntityVector cameras; + GraphicsPipelineSettings pipeline; WG_IO_DECLARE(SceneData); }; diff --git a/engine/scene/scene_manager.cpp b/engine/scene/scene_manager.cpp index ef4cd2eeb..4bf131dc4 100644 --- a/engine/scene/scene_manager.cpp +++ b/engine/scene/scene_manager.cpp @@ -37,6 +37,7 @@ #include "platform/window_manager.hpp" #include "render/render_engine.hpp" #include "scene/scene_components.hpp" +#include "scene/scene_systems.hpp" #include "system/engine.hpp" #include @@ -63,15 +64,15 @@ namespace wmoge { ecs_registry->register_component(); ecs_registry->register_component(); ecs_registry->register_component(); - ecs_registry->register_component(); + ecs_registry->register_component(); - ecs_registry->on_destroy_hook([](EcsWorld& world, EcsComponentVisibilityItem& comp) { - if (!comp.item.is_valid()) return; - world.get_attribute().get_visibility_system()->release_item(comp.item); - }); + m_sys_update_hier = std::make_shared(); + m_sys_release_cull_item = std::make_shared(); } void SceneManager::clear() { + WG_AUTO_PROFILE_SCENE("SceneManager::clear"); + for (auto& scene : m_scenes) { scene->finalize(); } @@ -98,9 +99,6 @@ namespace wmoge { // Play scene scene_play(); - - // If changed after play, updated active scene - scene_change(); } void SceneManager::change(Ref scene) { assert(scene); @@ -110,15 +108,20 @@ namespace wmoge { Ref SceneManager::get_running_scene() { return m_running; } - Ref SceneManager::make_scene(const StringId& name) { + Ref SceneManager::make_scene(const Strid& name) { WG_AUTO_PROFILE_SCENE("SceneManager::make_scene"); - auto scene = make_ref(name); + auto scene = make_ref(name); + auto* world = scene->get_ecs_world(); + + world->register_system(m_sys_update_hier); + world->register_system(m_sys_release_cull_item); + m_scenes.push_back(scene); return scene; } - std::optional> SceneManager::find_by_name(const StringId& name) { + std::optional> SceneManager::find_by_name(const Strid& name) { WG_AUTO_PROFILE_SCENE("SceneManager::find_by_name"); for (Ref& scene : m_scenes) { @@ -130,34 +133,49 @@ namespace wmoge { return std::nullopt; } - void SceneManager::scene_hier() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_hier"); - } + void SceneManager::update_scene_hier() { + WG_AUTO_PROFILE_SCENE("SceneManager::update_scene_hier"); + + Scene* scene = m_running.get(); + EcsWorld* ecs_world = scene->get_ecs_world(); + + bool has_dirty_transforms = true; + int current_batch = 0; + int frame_id = scene->get_frame_id(); + + while (has_dirty_transforms) { + m_sys_update_hier->current_batch = current_batch; + m_sys_update_hier->frame_id = frame_id; + m_sys_update_hier->num_updated.store(0); + m_sys_update_hier->num_dirty.store(0); + + ecs_world->execute_system(m_sys_update_hier); - void SceneManager::scene_transforms() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_transforms"); + has_dirty_transforms = m_sys_update_hier->num_dirty.load() > 0; + current_batch += 1; + } } - void SceneManager::scene_cameras() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_cameras"); + void SceneManager::update_scene_cameras() { + WG_AUTO_PROFILE_SCENE("SceneManager::update_scene_cameras"); } - void SceneManager::scene_visibility() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_visibility"); + void SceneManager::update_scene_visibility() { + WG_AUTO_PROFILE_SCENE("SceneManager::update_scene_visibility"); Engine* engine = Engine::instance(); RenderEngine* render_engine = engine->render_engine(); Scene* scene = m_running.get(); EcsWorld* ecs_world = scene->get_ecs_world(); - VisibilitySystem* vis_system = scene->get_visibility_system(); + CullingManager* vis_system = scene->get_culling_manager(); const CameraList& render_cameras = render_engine->get_cameras(); vis_system->cull(render_cameras); } - void SceneManager::scene_render() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_render"); + void SceneManager::render_scene() { + WG_AUTO_PROFILE_SCENE("SceneManager::render_scene"); return; @@ -194,22 +212,6 @@ namespace wmoge { render_engine->end_rendering(); } - void SceneManager::scene_pfx() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_pfx"); - } - - void SceneManager::scene_scripting() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_scripting"); - } - - void SceneManager::scene_physics() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_physics"); - } - - void SceneManager::scene_audio() { - WG_AUTO_PROFILE_SCENE("SceneManager::scene_audio"); - } - void SceneManager::scene_change() { WG_AUTO_PROFILE_SCENE("SceneManager::scene_change"); @@ -243,15 +245,10 @@ namespace wmoge { m_running->advance(Engine::instance()->time()->get_delta_time_game()); - scene_hier(); - scene_transforms(); - scene_cameras(); - scene_visibility(); - scene_render(); - scene_pfx(); - scene_scripting(); - scene_physics(); - scene_audio(); + update_scene_hier(); + update_scene_cameras(); + update_scene_visibility(); + render_scene(); assert(m_running->get_state() == SceneState::Playing); } diff --git a/engine/scene/scene_manager.hpp b/engine/scene/scene_manager.hpp index ce8917bc7..8f34b8258 100644 --- a/engine/scene/scene_manager.hpp +++ b/engine/scene/scene_manager.hpp @@ -30,6 +30,7 @@ #include "scene/scene.hpp" #include +#include #include #include #include @@ -48,20 +49,16 @@ namespace wmoge { void update(); void change(Ref scene); Ref get_running_scene(); - Ref make_scene(const StringId& name); - std::optional> find_by_name(const StringId& name); + Ref make_scene(const Strid& name); + std::optional> find_by_name(const Strid& name); private: - void scene_hier(); - void scene_transforms(); - void scene_cameras(); - void scene_visibility(); - void scene_render(); - void scene_pfx(); - void scene_scripting(); - void scene_physics(); - void scene_audio(); + void update_scene_hier(); + void update_scene_cameras(); + void update_scene_visibility(); + void render_scene(); + private: void scene_change(); void scene_start(); void scene_play(); @@ -76,6 +73,9 @@ namespace wmoge { Ref m_running;// active scene Ref m_next; // next scene to set Ref m_default;// default scene to always show something + + std::shared_ptr m_sys_update_hier; + std::shared_ptr m_sys_release_cull_item; }; }// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_node.cpp b/engine/scene/scene_node.cpp index d38237a51..3e671768c 100644 --- a/engine/scene/scene_node.cpp +++ b/engine/scene/scene_node.cpp @@ -29,6 +29,7 @@ #include "core/class.hpp" #include "core/log.hpp" +#include "debug/profiler.hpp" #include "resource/prefab.hpp" #include "scene/scene_components.hpp" #include "scene/scene_tree.hpp" @@ -39,6 +40,7 @@ namespace wmoge { WG_IO_BEGIN(SceneNodeData) + WG_IO_PROFILE() WG_IO_FIELD_OPT(name) WG_IO_FIELD(uuid) WG_IO_FIELD(type) @@ -49,6 +51,7 @@ namespace wmoge { WG_IO_END(SceneNodeData) WG_IO_BEGIN(SceneNodesData) + WG_IO_PROFILE() WG_IO_FIELD(nodes) WG_IO_END(SceneNodesData) @@ -56,12 +59,14 @@ namespace wmoge { auto* cls = Class::register_class(); } - SceneNode::SceneNode(const StringId& name, wmoge::SceneNodeType type) { + SceneNode::SceneNode(const Strid& name, wmoge::SceneNodeType type) { m_name = name; m_type = type; } Status SceneNode::build(const std::vector& nodes_data) { + WG_AUTO_PROFILE_SCENE("SceneNode::build"); + std::unordered_map> uuid_to_node; uuid_to_node.reserve(nodes_data.size()); @@ -85,6 +90,8 @@ namespace wmoge { return StatusCode::Ok; } Status SceneNode::dump(std::vector& nodes_data) { + WG_AUTO_PROFILE_SCENE("SceneNode::dump"); + std::vector> nodes = get_nodes(); std::unordered_map node_to_uuid; @@ -118,17 +125,21 @@ namespace wmoge { } void SceneNode::enter_tree(class SceneTree* tree) { + WG_AUTO_PROFILE_SCENE("SceneNode::enter_tree"); + assert(tree); assert(!m_tree); m_tree = tree; - m_entity = instantiate_entity(m_tree->get_scene().get()); + m_entity = instantiate_entity(m_tree->get_scene().get(), has_parent() ? m_parent->get_entity() : Entity()); for (auto& child : m_children) { child->enter_tree(tree); } } void SceneNode::exit_tree() { + WG_AUTO_PROFILE_SCENE("SceneNode::exit_tree"); + assert(m_tree); for (auto& child : m_children) { @@ -143,7 +154,38 @@ namespace wmoge { m_tree = nullptr; } - void SceneNode::set_name(const StringId& name) { + void SceneNode::process_event(const EventSceneNode& event) { + WG_AUTO_PROFILE_SCENE("SceneNode::process_event"); + + if (event.notification == SceneNodeNotification::TransformUpdated) { + m_l2w = m_transform.to_mat4x4(); + m_w2l = m_transform.to_inv_mat4x4(); + if (has_parent()) { + m_l2w = get_parent()->get_l2w() * m_l2w; + m_w2l = m_w2l * get_parent()->get_w2l(); + } + } + + if (has_tree()) { + dispatch_to_props(event); + } + + dispatch_to_children(event); + } + + void SceneNode::dispatch_to_props(const EventSceneNode& event) { + for (Ref& prop : m_properties) { + prop->process_event(event); + } + } + + void SceneNode::dispatch_to_children(const EventSceneNode& event) { + for (Ref& child : m_children) { + child->process_event(event); + } + } + + void SceneNode::set_name(const Strid& name) { m_name = name; } void SceneNode::set_uuid(const UUID& uuid) { @@ -161,28 +203,37 @@ namespace wmoge { } void SceneNode::add_child(const Ref& child) { + WG_AUTO_PROFILE_SCENE("SceneNode::add_child"); + assert(child); assert(child->m_parent == nullptr); + assert(child->m_tree == nullptr); m_children.push_back(child); child->m_parent = this; - child->m_tree = m_tree; child->m_path = m_path + '/' + child->m_name.str(); if (has_tree()) { child->enter_tree(m_tree); } + + EventSceneNode event; + + event.notification = SceneNodeNotification::TransformUpdated; + child->process_event(event); } void SceneNode::remove_child(const Ref& child) { + WG_AUTO_PROFILE_SCENE("SceneNode::remove_child"); + assert(child); assert(child->m_parent == this); + assert(child->m_tree == m_tree); if (has_tree()) { child->exit_tree(); } child->m_parent = nullptr; - child->m_tree = nullptr; child->m_path.clear(); m_children.erase(std::find(m_children.begin(), m_children.end(), child)); } @@ -270,19 +321,21 @@ namespace wmoge { return m_tree && m_tree->get_scene(); } - Entity SceneNode::instantiate_entity(class Scene* scene) { + Entity SceneNode::instantiate_entity(class Scene* scene, Entity parent) { + WG_AUTO_PROFILE_SCENE("SceneNode::instantiate_entity"); + EcsArch arch; for (auto& prop : m_properties) { prop->fill_arch(arch); } - EcsEntity ecs_entity; - EcsWorld* esc_world = scene->get_ecs_world(); + EcsWorld* esc_world = scene->get_ecs_world(); + EcsEntity ecs_entity = esc_world->allocate_entity(); esc_world->make_entity(ecs_entity, arch); Entity entity(ecs_entity, scene); for (auto& prop : m_properties) { - prop->add_components(entity); + prop->add_components(entity, parent); } return entity; @@ -311,7 +364,7 @@ namespace wmoge { void SceneNode::register_class() { auto* cls = Class::register_class(); - cls->add_field(ClassField(VarType::StringId, SID("name")), &SceneNode::m_name); + cls->add_field(ClassField(VarType::Strid, SID("name")), &SceneNode::m_name); cls->add_field(ClassField(VarType::String, SID("path")), &SceneNode::m_path); } diff --git a/engine/scene/scene_node.hpp b/engine/scene/scene_node.hpp index 393aab20c..1fd478634 100644 --- a/engine/scene/scene_node.hpp +++ b/engine/scene/scene_node.hpp @@ -33,7 +33,9 @@ #include "core/uuid.hpp" #include "ecs/ecs_core.hpp" #include "ecs/ecs_entity.hpp" +#include "event/event_scene.hpp" #include "io/serialization.hpp" +#include "math/math_utils3d.hpp" #include "math/transform.hpp" #include "resource/resource_ref.hpp" #include "scene/scene_entity.hpp" @@ -63,7 +65,8 @@ namespace wmoge { WG_OBJECT(SceneNodeProp, Object) virtual void fill_arch(EcsArch& arch) {} - virtual void add_components(Entity entity) {} + virtual void add_components(Entity entity, Entity parent) {} + virtual void process_event(const EventSceneNode& event) {} void set_node(class SceneNode* node) { m_node = node; } [[nodiscard]] bool has_node() const { return m_node != nullptr; } @@ -78,7 +81,7 @@ namespace wmoge { * @brief Serializable struct with scene tree single node data */ struct SceneNodeData { - StringId name; + Strid name; UUID uuid; SceneNodeType type; TransformEdt transform; @@ -126,13 +129,16 @@ namespace wmoge { * @param name Node name to show in editor * @param type Node type to hint in editor */ - SceneNode(const StringId& name, SceneNodeType type); + SceneNode(const Strid& name, SceneNodeType type); Status build(const std::vector& nodes); Status dump(std::vector& nodes); void enter_tree(class SceneTree* tree); void exit_tree(); - void set_name(const StringId& name); + void process_event(const EventSceneNode& event); + void dispatch_to_props(const EventSceneNode& event); + void dispatch_to_children(const EventSceneNode& event); + void set_name(const Strid& name); void set_uuid(const UUID& uuid); void set_transform(const TransformEdt& transform); void set_properties(std::vector> props); @@ -150,17 +156,19 @@ namespace wmoge { bool has_entity() const; bool has_tree() const; bool has_scene() const; - Entity instantiate_entity(class Scene* scene); + Entity instantiate_entity(class Scene* scene, Entity parent); [[nodiscard]] ArrayView> get_children() const { return m_children; } [[nodiscard]] ArrayView> get_properties() const { return m_properties; } [[nodiscard]] class SceneNode* get_parent() const { return m_parent; } - [[nodiscard]] const StringId& get_name() const { return m_name; } + [[nodiscard]] const Strid& get_name() const { return m_name; } [[nodiscard]] const std::string& get_path() const { return m_path; } [[nodiscard]] const UUID& get_uuid() const { return m_uuid; } [[nodiscard]] const Ref& get_prefab() const { return m_prefab; } [[nodiscard]] const SceneNodeType get_type() const { return m_type; } [[nodiscard]] const TransformEdt& get_transform() const { return m_transform; } + [[nodiscard]] const Mat4x4f& get_l2w() const { return m_l2w; } + [[nodiscard]] const Mat4x4f& get_w2l() const { return m_w2l; } [[nodiscard]] const Entity& get_entity() const { return m_entity; } [[nodiscard]] class SceneTree* get_tree() const { return m_tree; } [[nodiscard]] class Scene* get_scene() const; @@ -171,12 +179,14 @@ namespace wmoge { std::vector> m_children; std::vector> m_properties; SceneNode* m_parent = nullptr; - StringId m_name = SID(""); + Strid m_name = SID(""); std::string m_path; UUID m_uuid = UUID::generate(); Ref m_prefab; SceneNodeType m_type = SceneNodeType::Object; - TransformEdt m_transform; + TransformEdt m_transform; // local editable transform + Mat4x4f m_l2w = Math3d::identity();// cached in hier + Mat4x4f m_w2l = Math3d::identity();// cached in hier Entity m_entity; class SceneTree* m_tree = nullptr; }; diff --git a/engine/scene/scene_node_props.cpp b/engine/scene/scene_node_props.cpp index 1d94d1f6c..c5bcac482 100644 --- a/engine/scene/scene_node_props.cpp +++ b/engine/scene/scene_node_props.cpp @@ -27,6 +27,8 @@ #include "scene_node_props.hpp" +#include "core/class.hpp" + namespace wmoge { void NodePropSpatial::fill_arch(EcsArch& arch) { @@ -34,11 +36,69 @@ namespace wmoge { arch.set_component(); arch.set_component(); arch.set_component(); + arch.set_component(); + arch.set_component(); + } + + void NodePropSpatial::add_components(Entity entity, Entity parent) { + SceneNode* node = get_node(); + + if (parent.is_valid()) { + auto& ecs_parent = entity.get_component(); + ecs_parent.parent = parent.get_ecs_id(); + + if (parent.has_component()) { + auto& ecs_children = parent.get_component(); + ecs_children.children.push_back(entity.get_ecs_id()); + } + if (parent.has_component()) { + auto& ecs_parent_transform_upd = parent.get_component(); + auto& ecs_self_transform_upd = entity.get_component(); + ecs_self_transform_upd.batch_id = ecs_parent_transform_upd.batch_id + 1; + } + } + + auto& ecs_transform = entity.get_component(); + ecs_transform.transform = node->get_transform().to_transform3d(); } - void NodePropSpatial::add_components(Entity entity) { + void NodePropSpatial::process_event(const EventSceneNode& event) { SceneNode* node = get_node(); - SceneNode* parent = node->get_parent(); + Entity entity = node->get_entity(); + + if (event.notification == SceneNodeNotification::TransformUpdated) { + auto& ecs_transform = entity.get_component(); + ecs_transform.transform = node->get_transform().to_transform3d(); + + auto& ecs_transform_upd = entity.get_component(); + ecs_transform_upd.is_dirty = true; + } + } + + Status NodePropSpatial::read_from_yaml(const YamlConstNodeRef& node) { + WG_YAML_READ(node, params); + return StatusCode::Ok; + } + + void NodePropSpatial::register_class() { + auto* cls = Class::register_class(); + } + + void NodePropCamera::fill_arch(EcsArch& arch) { + arch.set_component(); + } + + void NodePropCamera::add_components(Entity entity, Entity parent) { + params.fill(entity.get_component()); + } + + Status NodePropCamera::read_from_yaml(const YamlConstNodeRef& node) { + WG_YAML_READ(node, params); + return StatusCode::Ok; + } + + void NodePropCamera::register_class() { + auto* cls = Class::register_class(); } }// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_node_props.hpp b/engine/scene/scene_node_props.hpp index 9c54e8dea..185e71ee8 100644 --- a/engine/scene/scene_node_props.hpp +++ b/engine/scene/scene_node_props.hpp @@ -35,21 +35,22 @@ namespace wmoge { class NodePropSpatial : public SceneNodeProp { public: - ~NodePropSpatial() override = default; - - void fill_arch(EcsArch& arch) override; - void add_components(Entity entity) override; + WG_OBJECT(NodePropSpatial, SceneNodeProp) + void fill_arch(EcsArch& arch) override; + void add_components(Entity entity, Entity parent) override; + void process_event(const EventSceneNode& event) override; Status read_from_yaml(const YamlConstNodeRef& node) override; + + SceneDataSpatial params; }; class NodePropCamera : public SceneNodeProp { public: - ~NodePropCamera() override = default; - - void fill_arch(EcsArch& arch) override; - void add_components(Entity entity) override; + WG_OBJECT(NodePropCamera, SceneNodeProp) + void fill_arch(EcsArch& arch) override; + void add_components(Entity entity, Entity parent) override; Status read_from_yaml(const YamlConstNodeRef& node) override; SceneDataCamera params; @@ -57,7 +58,7 @@ namespace wmoge { class NodePropModel : public SceneNodeProp { public: - ~NodePropModel() override = default; + WG_OBJECT(NodePropModel, SceneNodeProp) }; }// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_systems.cpp b/engine/scene/scene_systems.cpp index 7a361f3cf..9ed531c3b 100644 --- a/engine/scene/scene_systems.cpp +++ b/engine/scene/scene_systems.cpp @@ -27,6 +27,69 @@ #include "scene_systems.hpp" +#include "render/culling.hpp" +#include "scene/scene.hpp" + +#include + namespace wmoge { -} \ No newline at end of file + void EcsSysUpdateHier::process(EcsWorld& world, + const EcsEntity& entity, + const EcsComponentParent& parent, const EcsComponentChildren& children, + const EcsComponentTransform& transform, EcsComponentTransformUpd& transform_upd, + EcsComponentLocalToWorld& l2w, EcsComponentWorldToLocal& w2l) { + if (!transform_upd.is_dirty) { + return; + } + if (transform_upd.batch_id != current_batch) { + return; + } + + Mat4x4f l2w_parent = Math3d::identity(); + Mat4x4f w2l_parent = Math3d::identity(); + + if (parent.parent.is_valid()) { + EcsArch arch = world.get_arch(parent.parent); + + if (arch.has_component()) { + l2w_parent = world.get_component(parent.parent).matrix; + } + if (arch.has_component()) { + w2l_parent = world.get_component(parent.parent).matrix; + } + } + + const Transform3d& t = transform.transform; + Transform3d t_inv = t.inv(); + + l2w.matrix = l2w_parent * t.to_mat4x4(); + w2l.matrix = t_inv.to_mat4x4() * w2l_parent; + + num_updated.fetch_add(1); + + for (const EcsEntity child : children.children) { + if (world.has_component(child)) { + world.get_component_rw(child).is_dirty = true; + num_dirty.fetch_add(1); + } + } + + transform_upd.is_dirty = false; + transform_upd.last_frame_updated = frame_id; + } + + void EcsSysReleaseCullItem::process(EcsWorld& world, const EcsEntity& entity, EcsComponentCullingItem& culling_item) { + if (!culling_item.item.is_valid()) { + return; + } + + Scene& scene = world.get_attribute(); + CullingManager* culling_manager = scene.get_culling_manager(); + + culling_manager->release_item(culling_item.item); + + culling_item.item = CullingItem(); + } + +}// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_systems.hpp b/engine/scene/scene_systems.hpp index ba7d188b4..fb06a39fe 100644 --- a/engine/scene/scene_systems.hpp +++ b/engine/scene/scene_systems.hpp @@ -27,6 +27,52 @@ #pragma once +#include "debug/profiler.hpp" +#include "ecs/ecs_core.hpp" +#include "ecs/ecs_entity.hpp" +#include "ecs/ecs_system.hpp" +#include "ecs/ecs_world.hpp" +#include "scene/scene_components.hpp" + +#include + namespace wmoge { -} \ No newline at end of file + /** + * @class EcsSysUpdateHier + * @brief System to iteratively update spatial hierarchy of transforms + */ + class EcsSysUpdateHier : public EcsSystem { + public: + WG_ECS_SYSTEM(EcsSysUpdateHier, Update, OnWorkers); + + void process(EcsWorld& world, + const EcsEntity& entity, + const EcsComponentParent& parent, + const EcsComponentChildren& children, + const EcsComponentTransform& transform, + EcsComponentTransformUpd& transform_upd, + EcsComponentLocalToWorld& l2w, + EcsComponentWorldToLocal& w2l); + + std::atomic num_updated{0}; + std::atomic num_dirty{0}; + int current_batch = 0; + int frame_id = -1; + }; + + /** + * @class EcsSysReleaseCullItem + * @brief System to delete cull items + */ + class EcsSysReleaseCullItem : public EcsSystem { + public: + WG_ECS_SYSTEM(EcsSysReleaseCullItem, Destroy, OnMain); + + void process(EcsWorld& world, + const EcsEntity& entity, + EcsComponentCullingItem& culling_item); + ; + }; + +}// namespace wmoge \ No newline at end of file diff --git a/engine/scene/scene_tree.cpp b/engine/scene/scene_tree.cpp index e941b76db..828a25423 100644 --- a/engine/scene/scene_tree.cpp +++ b/engine/scene/scene_tree.cpp @@ -36,13 +36,14 @@ namespace wmoge { WG_IO_BEGIN(SceneTreeData) - WG_IO_FIELD(nodes) - WG_IO_FIELD(pipeline_settings) + WG_IO_PROFILE() + WG_IO_FIELD_OPT(nodes) + WG_IO_FIELD_OPT(pipeline) WG_IO_END(SceneTreeData) - SceneTree::SceneTree(const StringId& name) { + SceneTree::SceneTree(const Strid& name) { m_name = name; - m_scene = Engine::instance()->scene_manager()->make_scene(SID(name.str() + "__runtime")); + m_scene = Engine::instance()->scene_manager()->make_scene(SID(name.str() + ".runtime")); m_root = make_ref(SID(""), SceneNodeType::Object); m_root->enter_tree(this); } @@ -70,6 +71,8 @@ namespace wmoge { } Status SceneTree::build(const SceneTreeData& data) { + WG_AUTO_PROFILE_SCENE("SceneTree::build"); + if (!m_root->build(data.nodes)) { return StatusCode::Error; } @@ -77,6 +80,8 @@ namespace wmoge { return StatusCode::Ok; } Status SceneTree::dump(SceneTreeData& data) { + WG_AUTO_PROFILE_SCENE("SceneTree::dump"); + if (!m_root->dump(data.nodes)) { return StatusCode::Error; } diff --git a/engine/scene/scene_tree.hpp b/engine/scene/scene_tree.hpp index 22fc41ae9..42de86130 100644 --- a/engine/scene/scene_tree.hpp +++ b/engine/scene/scene_tree.hpp @@ -49,7 +49,7 @@ namespace wmoge { */ struct SceneTreeData { std::vector nodes; - GraphicsPipelineSettings pipeline_settings; + GraphicsPipelineSettings pipeline; WG_IO_DECLARE(SceneTreeData); }; @@ -85,7 +85,7 @@ namespace wmoge { * * @param name Scene name to unique identify it at editor and runtime */ - SceneTree(const StringId& name); + SceneTree(const Strid& name); void each(const std::function&)>& visitor); bool contains(const Ref& node) const; @@ -95,12 +95,12 @@ namespace wmoge { Status build(const SceneTreeData& data); Status dump(SceneTreeData& data); - [[nodiscard]] const StringId& get_name() const { return m_name; } + [[nodiscard]] const Strid& get_name() const { return m_name; } [[nodiscard]] const Ref& get_root() const { return m_root; } [[nodiscard]] const Ref& get_scene() const { return m_scene; } private: - StringId m_name; + Strid m_name; Ref m_root; Ref m_scene; }; diff --git a/engine/scripting/lua/lua_script.cpp b/engine/scripting/lua/lua_script.cpp index f03259317..e0249a4b9 100644 --- a/engine/scripting/lua/lua_script.cpp +++ b/engine/scripting/lua/lua_script.cpp @@ -132,17 +132,17 @@ namespace wmoge { return make_ref(std::move(user_object), Ref(this), object, m_state); } - bool LuaScript::has_property(const StringId& property) { + bool LuaScript::has_property(const Strid& property) { return m_lua_properties.find(property) != m_lua_properties.end(); } - bool LuaScript::has_method(const StringId& method) { + bool LuaScript::has_method(const Strid& method) { return m_lua_methods.find(method) != m_lua_methods.end(); } - const fast_map& LuaScript::get_lua_properties() { + const fast_map& LuaScript::get_lua_properties() { return m_lua_properties; } - const fast_map& LuaScript::get_lua_methods() { + const fast_map& LuaScript::get_lua_methods() { return m_lua_methods; } const std::optional& LuaScript::get_lua_class() { diff --git a/engine/scripting/lua/lua_script.hpp b/engine/scripting/lua/lua_script.hpp index 3fefbe308..be813e1c3 100644 --- a/engine/scripting/lua/lua_script.hpp +++ b/engine/scripting/lua/lua_script.hpp @@ -48,21 +48,21 @@ namespace wmoge { Status copy_to(Object& other) const override; Ref attach_to(Object* object) override; - bool has_property(const StringId& property) override; - bool has_method(const StringId& method) override; + bool has_property(const Strid& property) override; + bool has_method(const Strid& method) override; - const fast_map& get_lua_properties(); - const fast_map& get_lua_methods(); - const std::optional& get_lua_class(); - class LuaScriptSystem* get_system(); - lua_State* get_state(); + const fast_map& get_lua_properties(); + const fast_map& get_lua_methods(); + const std::optional& get_lua_class(); + class LuaScriptSystem* get_system(); + lua_State* get_state(); private: - fast_map m_lua_properties; - fast_map m_lua_methods; - std::optional m_lua_class; - class LuaScriptSystem* m_system = nullptr; - lua_State* m_state = nullptr; + fast_map m_lua_properties; + fast_map m_lua_methods; + std::optional m_lua_class; + class LuaScriptSystem* m_system = nullptr; + lua_State* m_state = nullptr; }; }// namespace wmoge diff --git a/engine/scripting/lua/lua_script_instance.cpp b/engine/scripting/lua/lua_script_instance.cpp index e8466033a..2976f6837 100644 --- a/engine/scripting/lua/lua_script_instance.cpp +++ b/engine/scripting/lua/lua_script_instance.cpp @@ -92,7 +92,7 @@ namespace wmoge { WG_AUTO_PROFILE_LUA("LuaScriptInstance::on_update"); WG_SAFE_CALL(ScriptFunction::OnUpdate, "on_update", m_script_object, delta_time); } - void LuaScriptInstance::on_signal(const StringId& signal) { + void LuaScriptInstance::on_signal(const Strid& signal) { WG_AUTO_PROFILE_LUA("LuaScriptInstance::on_signal"); WG_SAFE_CALL(ScriptFunction::OnSignal, "on_signal", m_script_object, luabridge::LuaRef(m_state, signal)); } @@ -120,13 +120,13 @@ namespace wmoge { WG_AUTO_PROFILE_LUA("LuaScriptInstance::on_token"); WG_SAFE_CALL(ScriptFunction::OnToken, "on_token", m_script_object, luabridge::LuaRef(m_state, LuaEventToken{Ref(token.get())})); } - int LuaScriptInstance::set(const StringId& property, const Var& value) { + int LuaScriptInstance::set(const Strid& property, const Var& value) { return ScriptInstance::set(property, value); } - int LuaScriptInstance::get(const StringId& property, Var& value) { + int LuaScriptInstance::get(const Strid& property, Var& value) { return ScriptInstance::get(property, value); } - int LuaScriptInstance::call(const StringId& method, int argc, const Var* argv, Var& ret) { + int LuaScriptInstance::call(const Strid& method, int argc, const Var* argv, Var& ret) { return ScriptInstance::call(method, argc, argv, ret); } diff --git a/engine/scripting/lua/lua_script_instance.hpp b/engine/scripting/lua/lua_script_instance.hpp index cad359722..6c3123221 100644 --- a/engine/scripting/lua/lua_script_instance.hpp +++ b/engine/scripting/lua/lua_script_instance.hpp @@ -52,7 +52,7 @@ namespace wmoge { void on_scene_exit() override; void on_transform_updated() override; void on_update(float delta_time) override; - void on_signal(const StringId& signal) override; + void on_signal(const Strid& signal) override; void on_input_mouse(const Ref& event) override; void on_input_keyboard(const Ref& event) override; void on_input_joystick(const Ref& event) override; @@ -60,9 +60,9 @@ namespace wmoge { void on_action(const Ref& action) override; void on_token(const Ref& token) override; - int set(const StringId& property, const Var& value) override; - int get(const StringId& property, Var& value) override; - int call(const StringId& method, int argc, const Var* argv, Var& ret) override; + int set(const Strid& property, const Var& value) override; + int get(const Strid& property, Var& value) override; + int call(const Strid& method, int argc, const Var* argv, Var& ret) override; luabridge::LuaRef& get_script_object() { return m_script_object; } diff --git a/engine/scripting/lua/lua_type_traits.cpp b/engine/scripting/lua/lua_type_traits.cpp index 3dc989b99..1840f8b99 100644 --- a/engine/scripting/lua/lua_type_traits.cpp +++ b/engine/scripting/lua/lua_type_traits.cpp @@ -33,19 +33,19 @@ namespace wmoge { - StringId LuaTypeTraits::to_sid(luabridge::LuaRef& ref) { - assert(ref.isString() || ref.isInstance()); + Strid LuaTypeTraits::to_sid(luabridge::LuaRef& ref) { + assert(ref.isString() || ref.isInstance()); if (ref.isString()) { return SID(ref.cast()); } - if (ref.isInstance()) { - return ref.cast(); + if (ref.isInstance()) { + return ref.cast(); } WG_LOG_ERROR("failed to convert lua object to string id"); - return StringId(); + return Strid(); } Var LuaTypeTraits::to_var(luabridge::LuaRef& ref) { @@ -101,8 +101,8 @@ namespace wmoge { if (var.type() == VarType::String) { return luabridge::LuaRef(state, var.operator std::string()); } - if (var.type() == VarType::StringId) { - return luabridge::LuaRef(state, var.operator StringId().str()); + if (var.type() == VarType::Strid) { + return luabridge::LuaRef(state, var.operator Strid().str()); } WG_LOG_ERROR("unsupported var to lua type"); diff --git a/engine/scripting/lua/lua_type_traits.hpp b/engine/scripting/lua/lua_type_traits.hpp index 3135d1063..f33e36879 100644 --- a/engine/scripting/lua/lua_type_traits.hpp +++ b/engine/scripting/lua/lua_type_traits.hpp @@ -45,7 +45,7 @@ namespace wmoge { */ class LuaTypeTraits { public: - static StringId to_sid(luabridge::LuaRef& ref); + static Strid to_sid(luabridge::LuaRef& ref); static Var to_var(luabridge::LuaRef& ref); static luabridge::LuaRef from_object(lua_State* state, Object* object); static luabridge::LuaRef from_var(lua_State* state, const Var& var); diff --git a/engine/scripting/lua_bindings/lua_bindings_core.cpp b/engine/scripting/lua_bindings/lua_bindings_core.cpp index f102cbd2d..42b17f9bc 100644 --- a/engine/scripting/lua_bindings/lua_bindings_core.cpp +++ b/engine/scripting/lua_bindings/lua_bindings_core.cpp @@ -113,14 +113,14 @@ namespace wmoge { .addFunction("refs_count", &LuaRefCnt::refs_count) .endClass(); - ns = ns.beginClass("StringId") + ns = ns.beginClass("Strid") .addStaticFunction("new", std::function([](const std::string& id) { return SID(id); })) .addConstructor() - .addProperty("empty", &StringId::empty) - .addProperty("id", &StringId::id) - .addProperty("hash", &StringId::hash) - .addProperty("str", &StringId::str) - .addProperty("__tostring", &StringId::str) + .addProperty("empty", &Strid::empty) + .addProperty("id", &Strid::id) + .addProperty("hash", &Strid::hash) + .addProperty("str", &Strid::str) + .addProperty("__tostring", &Strid::str) .endClass(); ns = ns.deriveClass("Data") diff --git a/engine/scripting/lua_bindings/lua_bindings_core.hpp b/engine/scripting/lua_bindings/lua_bindings_core.hpp index cbc8d07a4..b75116afe 100644 --- a/engine/scripting/lua_bindings/lua_bindings_core.hpp +++ b/engine/scripting/lua_bindings/lua_bindings_core.hpp @@ -93,10 +93,10 @@ namespace wmoge { std::string to_string() const { return cast_unsafe()->to_string(); } - const StringId& class_name() const { + const Strid& class_name() const { return cast_unsafe()->class_name(); } - void signal(const StringId& signal) { + void signal(const Strid& signal) { cast_unsafe()->signal(signal); } }; diff --git a/engine/scripting/lua_bindings/lua_bindings_event.cpp b/engine/scripting/lua_bindings/lua_bindings_event.cpp index 0b0ef0e26..115273822 100644 --- a/engine/scripting/lua_bindings/lua_bindings_event.cpp +++ b/engine/scripting/lua_bindings/lua_bindings_event.cpp @@ -36,7 +36,7 @@ namespace wmoge { auto arg_type = WG_LUA_ARG(state, 0); auto arg_function = WG_LUA_ARG(state, 1); - if (!arg_type.isString() && !arg_type.isInstance()) { + if (!arg_type.isString() && !arg_type.isInstance()) { WG_LOG_ERROR("invalid event type " << arg_type.tostring()); return 0; } @@ -73,7 +73,7 @@ namespace wmoge { auto arg_type = WG_LUA_ARG(state, 0); auto arg_data = WG_LUA_ARG(state, 1); - if (!arg_type.isString() && !arg_type.isInstance()) { + if (!arg_type.isString() && !arg_type.isInstance()) { WG_LOG_ERROR("invalid event type " << arg_type.tostring()); return 0; } diff --git a/engine/scripting/lua_bindings/lua_bindings_event.hpp b/engine/scripting/lua_bindings/lua_bindings_event.hpp index 1aa7e5daf..32a491de5 100644 --- a/engine/scripting/lua_bindings/lua_bindings_event.hpp +++ b/engine/scripting/lua_bindings/lua_bindings_event.hpp @@ -44,7 +44,7 @@ namespace wmoge { struct LuaEvent : public LuaObject { - const StringId& type() const { + const Strid& type() const { return cast_unsafe()->type(); } }; @@ -96,7 +96,7 @@ namespace wmoge { }; struct LuaEventAction : public LuaEvent { - const StringId& name() const { + const Strid& name() const { return cast_unsafe()->name; } float strength() const { @@ -105,7 +105,7 @@ namespace wmoge { }; struct LuaEventToken : public LuaEvent { - const StringId& token() const { + const Strid& token() const { return cast_unsafe()->token; } TokenNotification notification() const { diff --git a/engine/scripting/lua_bindings/lua_bindings_platform.hpp b/engine/scripting/lua_bindings/lua_bindings_platform.hpp index e17c11921..ae42264dc 100644 --- a/engine/scripting/lua_bindings/lua_bindings_platform.hpp +++ b/engine/scripting/lua_bindings/lua_bindings_platform.hpp @@ -65,7 +65,7 @@ namespace wmoge { bool in_focus() const { return cast_unsafe()->in_focus(); } - const StringId& id() const { + const Strid& id() const { return cast_unsafe()->id(); } const std::string& title() const { diff --git a/engine/scripting/lua_bindings/lua_bindings_resource.hpp b/engine/scripting/lua_bindings/lua_bindings_resource.hpp index 78bec40a1..8a07e7788 100644 --- a/engine/scripting/lua_bindings/lua_bindings_resource.hpp +++ b/engine/scripting/lua_bindings/lua_bindings_resource.hpp @@ -48,7 +48,7 @@ namespace wmoge { LuaResource duplicate() const { return LuaResource{cast_unsafe()->duplicate()}; } - const StringId& get_name() const { + const Strid& get_name() const { return cast_unsafe()->get_name(); } }; @@ -78,16 +78,16 @@ namespace wmoge { }; struct LuaConfigFile : public LuaResource { - bool get_bool(const StringId& key, bool default_value) { + bool get_bool(const Strid& key, bool default_value) { return cast_unsafe()->get_bool(key, default_value); } - int get_int(const StringId& key, int default_value) { + int get_int(const Strid& key, int default_value) { return cast_unsafe()->get_int(key, default_value); } - float get_float(const StringId& key, float default_value) { + float get_float(const Strid& key, float default_value) { return cast_unsafe()->get_float(key, default_value); } - std::string get_string(const StringId& key, std::string default_value) { + std::string get_string(const Strid& key, std::string default_value) { return cast_unsafe()->get_string(key, default_value); } }; @@ -144,22 +144,22 @@ namespace wmoge { }; struct LuaMaterial : public LuaResource { - void set_int(const StringId& name, int value) { + void set_int(const Strid& name, int value) { cast_unsafe()->set_int(name, value); } - void set_float(const StringId& name, float value) { + void set_float(const Strid& name, float value) { cast_unsafe()->set_float(name, value); } - void set_vec2(const StringId& name, const Vec2f& value) { + void set_vec2(const Strid& name, const Vec2f& value) { cast_unsafe()->set_vec2(name, value); } - void set_vec3(const StringId& name, const Vec3f& value) { + void set_vec3(const Strid& name, const Vec3f& value) { cast_unsafe()->set_vec3(name, value); } - void set_vec4(const StringId& name, const Vec4f& value) { + void set_vec4(const Strid& name, const Vec4f& value) { cast_unsafe()->set_vec4(name, value); } - void set_texture(const StringId& name, const Ref& texture) { + void set_texture(const Strid& name, const Ref& texture) { cast_unsafe()->set_texture(name, texture); } }; diff --git a/engine/scripting/script_instance.hpp b/engine/scripting/script_instance.hpp index dcce376de..84c51f346 100644 --- a/engine/scripting/script_instance.hpp +++ b/engine/scripting/script_instance.hpp @@ -81,7 +81,7 @@ namespace wmoge { virtual void on_scene_exit() {} virtual void on_transform_updated() {} virtual void on_update(float delta_time){}; - virtual void on_signal(const StringId& signal) {} + virtual void on_signal(const Strid& signal) {} virtual void on_input_mouse(const Ref& event) {} virtual void on_input_keyboard(const Ref& event) {} virtual void on_input_joystick(const Ref& event) {} @@ -89,9 +89,9 @@ namespace wmoge { virtual void on_action(const Ref& action) {} virtual void on_token(const Ref& token) {} - virtual int set(const StringId& property, const Var& value) { return -2; } - virtual int get(const StringId& property, Var& value) { return -2; } - virtual int call(const StringId& method, int argc, const Var* argv, Var& ret) { return -2; } + virtual int set(const Strid& property, const Var& value) { return -2; } + virtual int get(const Strid& property, Var& value) { return -2; } + virtual int call(const Strid& method, int argc, const Var* argv, Var& ret) { return -2; } }; }// namespace wmoge diff --git a/engine/scripting/script_system.hpp b/engine/scripting/script_system.hpp index 9efc45fcd..6d2d5b498 100644 --- a/engine/scripting/script_system.hpp +++ b/engine/scripting/script_system.hpp @@ -58,12 +58,12 @@ namespace wmoge { virtual void update() = 0; virtual void shutdown() = 0; - const StringId& get_name() { return m_name; } - const StringId& get_language() { return m_language; } + const Strid& get_name() { return m_name; } + const Strid& get_language() { return m_language; } protected: - StringId m_name = SID("none"); - StringId m_language = SID("none"); + Strid m_name = SID("none"); + Strid m_language = SID("none"); std::size_t m_gc_interval = 15; std::size_t m_gc_cycles = 0; std::size_t m_gc_frames_from_last = 0; diff --git a/engine/shaders/generated/auto_base_pass.hpp b/engine/shaders/generated/auto_base_pass.hpp index 4b037e6ab..16f5f5758 100644 --- a/engine/shaders/generated/auto_base_pass.hpp +++ b/engine/shaders/generated/auto_base_pass.hpp @@ -48,8 +48,8 @@ namespace wmoge { public: ShaderPassBase() = default; ~ShaderPassBase() override = default; - StringId get_name() override { return SID("base"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("base"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_bloom_pass.hpp b/engine/shaders/generated/auto_bloom_pass.hpp index cb9fee8a4..d23734559 100644 --- a/engine/shaders/generated/auto_bloom_pass.hpp +++ b/engine/shaders/generated/auto_bloom_pass.hpp @@ -46,8 +46,8 @@ namespace wmoge { public: ShaderPassBloom() = default; ~ShaderPassBloom() override = default; - StringId get_name() override { return SID("bloom"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("bloom"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_canvas_pass.hpp b/engine/shaders/generated/auto_canvas_pass.hpp index b90f5c70c..4b47de0fb 100644 --- a/engine/shaders/generated/auto_canvas_pass.hpp +++ b/engine/shaders/generated/auto_canvas_pass.hpp @@ -48,8 +48,8 @@ namespace wmoge { public: ShaderPassCanvas() = default; ~ShaderPassCanvas() override = default; - StringId get_name() override { return SID("canvas"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("canvas"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_composition_pass.hpp b/engine/shaders/generated/auto_composition_pass.hpp index 23b120e85..fab102598 100644 --- a/engine/shaders/generated/auto_composition_pass.hpp +++ b/engine/shaders/generated/auto_composition_pass.hpp @@ -48,8 +48,8 @@ namespace wmoge { public: ShaderPassComposition() = default; ~ShaderPassComposition() override = default; - StringId get_name() override { return SID("composition"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("composition"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_luminance_avg_pass.hpp b/engine/shaders/generated/auto_luminance_avg_pass.hpp index d19149149..704a59757 100644 --- a/engine/shaders/generated/auto_luminance_avg_pass.hpp +++ b/engine/shaders/generated/auto_luminance_avg_pass.hpp @@ -46,8 +46,8 @@ namespace wmoge { public: ShaderPassLuminanceAvg() = default; ~ShaderPassLuminanceAvg() override = default; - StringId get_name() override { return SID("luminance_avg"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("luminance_avg"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_luminance_histogram_pass.hpp b/engine/shaders/generated/auto_luminance_histogram_pass.hpp index 63e9085f1..17648bec8 100644 --- a/engine/shaders/generated/auto_luminance_histogram_pass.hpp +++ b/engine/shaders/generated/auto_luminance_histogram_pass.hpp @@ -46,8 +46,8 @@ namespace wmoge { public: ShaderPassLuminanceHistogram() = default; ~ShaderPassLuminanceHistogram() override = default; - StringId get_name() override { return SID("luminance_histogram"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("luminance_histogram"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_material_pass.hpp b/engine/shaders/generated/auto_material_pass.hpp index e37a43421..6d7612793 100644 --- a/engine/shaders/generated/auto_material_pass.hpp +++ b/engine/shaders/generated/auto_material_pass.hpp @@ -48,8 +48,8 @@ namespace wmoge { public: ShaderPassMaterial() = default; ~ShaderPassMaterial() override = default; - StringId get_name() override { return SID("material"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("material"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_text_pass.hpp b/engine/shaders/generated/auto_text_pass.hpp index 348aa0488..b9f2da06a 100644 --- a/engine/shaders/generated/auto_text_pass.hpp +++ b/engine/shaders/generated/auto_text_pass.hpp @@ -48,8 +48,8 @@ namespace wmoge { public: ShaderPassText() = default; ~ShaderPassText() override = default; - StringId get_name() override { return SID("text"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("text"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/generated/auto_tonemap_pass.hpp b/engine/shaders/generated/auto_tonemap_pass.hpp index 7ddca5c10..fa33c7982 100644 --- a/engine/shaders/generated/auto_tonemap_pass.hpp +++ b/engine/shaders/generated/auto_tonemap_pass.hpp @@ -46,8 +46,8 @@ namespace wmoge { public: ShaderPassTonemap() = default; ~ShaderPassTonemap() override = default; - StringId get_name() override { return SID("tonemap"); } - void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { + Strid get_name() override { return SID("tonemap"); } + void fill_layout(GfxDescSetLayoutDescs& layouts_desc, Shader* shader) override { // fill set num = 0 { auto& layout = layouts_desc.emplace_back(); diff --git a/engine/shaders/scripts/generator.py b/engine/shaders/scripts/generator.py index 1605dcad1..9a5249126 100644 --- a/engine/shaders/scripts/generator.py +++ b/engine/shaders/scripts/generator.py @@ -391,10 +391,7 @@ def __init__(self, shader, langs): def emit_name(self): return ( - f"StringId get_name() override " - "{" - f'return SID("{self.shader.name}");' - "}\n" + f"Strid get_name() override " "{" f'return SID("{self.shader.name}");' "}\n" ) def emit_layouts(self): diff --git a/engine/system/engine.cpp b/engine/system/engine.cpp index 3c77f2ee0..54911e276 100644 --- a/engine/system/engine.cpp +++ b/engine/system/engine.cpp @@ -62,6 +62,7 @@ #include "render/render_engine.hpp" #include "render/shader_manager.hpp" #include "render/texture_manager.hpp" +#include "render/view_manager.hpp" #include "resource/config_file.hpp" #include "resource/resource_manager.hpp" #include "scene/scene_manager.hpp" @@ -126,6 +127,7 @@ namespace wmoge { m_scene_manager = ioc->resolve().value(); m_action_manager = ioc->resolve().value(); m_canvas_debug = ioc->resolve().value(); + m_view_manager = ioc->resolve().value(); m_console->init(); m_layer_stack->attach(std::make_shared()); @@ -162,6 +164,10 @@ namespace wmoge { m_gfx_driver->prepare_window(w); } + if (m_scene_manager) { + m_scene_manager->update(); + } + m_layer_stack->each_up([](LayerStack::LayerPtr& layer) { layer->on_iter(); }); @@ -232,6 +238,7 @@ namespace wmoge { ScriptSystem* Engine::script_system() { return m_script_system; } AudioEngine* Engine::audio_engine() { return m_audio_engine; } RenderEngine* Engine::render_engine() { return m_render_engine; } + ViewManager* Engine::view_manager() { return m_view_manager; } EcsRegistry* Engine::ecs_registry() { return m_ecs_registry; } Engine* Engine::instance() { diff --git a/engine/system/engine.hpp b/engine/system/engine.hpp index 428fe7b01..0f9d87187 100644 --- a/engine/system/engine.hpp +++ b/engine/system/engine.hpp @@ -85,6 +85,7 @@ namespace wmoge { class ScriptSystem* script_system(); class AudioEngine* audio_engine(); class RenderEngine* render_engine(); + class ViewManager* view_manager(); class EcsRegistry* ecs_registry(); static Engine* instance(); @@ -120,6 +121,7 @@ namespace wmoge { class ScriptSystem* m_script_system = nullptr; class AudioEngine* m_audio_engine = nullptr; class RenderEngine* m_render_engine = nullptr; + class ViewManager* m_view_manager = nullptr; class EcsRegistry* m_ecs_registry = nullptr; }; diff --git a/template/main.cpp b/template/main.cpp index 59ded8516..152521078 100644 --- a/template/main.cpp +++ b/template/main.cpp @@ -48,14 +48,13 @@ class TemplateApplication : public GameApplication { Engine::instance()->action_manager()->activate(SID("console")); Engine::instance()->action_manager()->activate(SID("camera_debug")); - mesh = Engine::instance()->resource_manager()->load(SID("res://mesh/suzanne")).cast(); - mesh.acquire_cast(); + model = Engine::instance()->resource_manager()->load(SID("res://models/suzanne")).cast(); - // Ref scene_tree_packed = Engine::instance()->resource_manager()->load(SID("res://trees/test_scene")).cast(); - // scene_tree = scene_tree_packed->instantiate(); - // scene = scene_tree->get_scene(); + auto scene_tree_packed = Engine::instance()->resource_manager()->load(SID("res://trees/test_scene")).cast(); + scene_tree = scene_tree_packed->instantiate(); + scene = scene_tree->get_scene(); - // Engine::instance()->scene_manager()->change(scene); + Engine::instance()->scene_manager()->change(scene); class ApplicationLayer : public Layer { public: @@ -111,6 +110,7 @@ class TemplateApplication : public GameApplication { } Status on_shutdown() override { + model.reset(); mesh.reset(); scene.reset(); scene_tree.reset(); @@ -124,6 +124,7 @@ class TemplateApplication : public GameApplication { Ref scene; Ref scene_tree; WeakRef mesh; + Ref model; }; int main(int argc, const char* const* argv) { diff --git a/template/resources/models/suzanne.model b/template/resources/models/suzanne.model new file mode 100644 index 000000000..302f0296c --- /dev/null +++ b/template/resources/models/suzanne.model @@ -0,0 +1,13 @@ +objs: + - material: "res://materials/test_material_1" + mesh_idx: 0 + chunk_idx: 0 + name: "root" +meshes: + - "res://mesh/suzanne" +lod: + ranges: + - 0 1 +lod_settings: + minimum_lod: 0 + num_of_lods: 1 \ No newline at end of file diff --git a/template/resources/models/suzanne.res b/template/resources/models/suzanne.res new file mode 100644 index 000000000..39ff838af --- /dev/null +++ b/template/resources/models/suzanne.res @@ -0,0 +1,10 @@ +# Wmoge resource meta file +version: 1 +uuid: 0 +loader: default +class: Model +description: "test model" +path_on_disk: "res://models/suzanne.model" +deps: + - "res://materials/test_material_1" + - "res://mesh/suzanne" diff --git a/template/resources/models/suzanne_1.model b/template/resources/models/suzanne_1.model deleted file mode 100644 index 17837804f..000000000 --- a/template/resources/models/suzanne_1.model +++ /dev/null @@ -1,10 +0,0 @@ -materials: - - "res://materials/test_material_1" -lods: - - mesh: "res://mesh/suzanne" - materials: - - 0 - screen_size: 1 -lod_settings: - minimum_lod: 0 - num_of_lods: 1 \ No newline at end of file diff --git a/template/resources/models/suzanne_1.res b/template/resources/models/suzanne_1.res deleted file mode 100644 index 73491ee3b..000000000 --- a/template/resources/models/suzanne_1.res +++ /dev/null @@ -1,8 +0,0 @@ -# Wmoge resource meta file -version: 1 -uuid: 0 -loader: default -class: Model -description: "test model" -path_on_disk: "res://models/suzanne_1.model" -deps: [ ] \ No newline at end of file diff --git a/template/resources/models/suzanne_2.model b/template/resources/models/suzanne_2.model deleted file mode 100644 index f02db962d..000000000 --- a/template/resources/models/suzanne_2.model +++ /dev/null @@ -1,10 +0,0 @@ -materials: - - "res://materials/test_material_2" -lods: - - mesh: "res://mesh/suzanne" - materials: - - 0 - screen_size: 1 -lod_settings: - minimum_lod: 0 - num_of_lods: 1 \ No newline at end of file diff --git a/template/resources/models/suzanne_2.res b/template/resources/models/suzanne_2.res deleted file mode 100644 index 96a71f1c7..000000000 --- a/template/resources/models/suzanne_2.res +++ /dev/null @@ -1,8 +0,0 @@ -# Wmoge resource meta file -version: 1 -uuid: 0 -loader: default -class: Model -description: "test model" -path_on_disk: "res://models/suzanne_2.model" -deps: [ ] \ No newline at end of file diff --git a/template/resources/models/suzanne_3.model b/template/resources/models/suzanne_3.model deleted file mode 100644 index f70e8dcfc..000000000 --- a/template/resources/models/suzanne_3.model +++ /dev/null @@ -1,10 +0,0 @@ -materials: - - "res://materials/test_material_3" -lods: - - mesh: "res://mesh/suzanne" - materials: - - 0 - screen_size: 1 -lod_settings: - minimum_lod: 0 - num_of_lods: 1 \ No newline at end of file diff --git a/template/resources/models/suzanne_3.res b/template/resources/models/suzanne_3.res deleted file mode 100644 index f1e60e170..000000000 --- a/template/resources/models/suzanne_3.res +++ /dev/null @@ -1,8 +0,0 @@ -# Wmoge resource meta file -version: 1 -uuid: 0 -loader: default -class: Model -description: "test model" -path_on_disk: "res://models/suzanne_3.model" -deps: [ ] \ No newline at end of file diff --git a/template/resources/trees/test_scene.tree b/template/resources/trees/test_scene.tree index f254fedcb..ba1d011b9 100644 --- a/template/resources/trees/test_scene.tree +++ b/template/resources/trees/test_scene.tree @@ -1,5 +1,5 @@ # Serialized scene tree of scene node into a yaml readable file -pipeline_settings: +pipeline: bloom: dirt_mask: "res://textures/dirt_mask" nodes: @@ -14,7 +14,8 @@ nodes: rotation: 0 0 0 parent: "9468856891681035089" properties: - - class: ScenePropCamera + - class: NodePropSpatial + - class: NodePropCamera fov: 45.0 projection: Perspective - name: "camera_1" @@ -25,7 +26,8 @@ nodes: rotation: 0 180 0 parent: "9468856891681035089" properties: - - class: ScenePropCamera + - class: NodePropSpatial + - class: NodePropCamera fov: 45.0 projection: Perspective - name: "camera_2" @@ -36,7 +38,8 @@ nodes: rotation: 0 -90 0 parent: "9468856891681035089" properties: - - class: ScenePropCamera + - class: NodePropSpatial + - class: NodePropCamera fov: 45.0 projection: Perspective - name: "camera_3" @@ -47,7 +50,8 @@ nodes: rotation: 0 90 0 parent: "9468856891681035089" properties: - - class: ScenePropCamera + - class: NodePropSpatial + - class: NodePropCamera fov: 45.0 projection: Perspective - name: "models" @@ -61,9895 +65,4 @@ nodes: translation: -45 0 -45 rotation: 104.28762792055193 96.22532743218032 102.50450625101503 scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_1" - uuid: 6198622787913442785 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -42 - rotation: 177.04590518428466 8.768645102459878 34.397152996871135 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_2" - uuid: 3232863144774289034 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -39 - rotation: 34.70319757937899 13.66273188903569 164.74914453992307 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_3" - uuid: 3708819453208091307 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -36 - rotation: 13.482948363654202 90.37335136468946 35.37231439888672 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_4" - uuid: 8542448715164602241 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -33 - rotation: 2.9578186203687595 126.28981677227196 112.24842595518882 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_5" - uuid: 8772239442638677610 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -30 - rotation: 52.21277703608608 19.80471679060995 48.503085408176375 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_6" - uuid: 4353326341848382077 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -27 - rotation: 106.02767084899173 143.62314328455125 83.42622804288118 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_7" - uuid: 8938508759666812511 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -24 - rotation: 57.8679222395829 82.21280565780211 42.55643037840145 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_8" - uuid: 6692930133649162671 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -21 - rotation: 119.26139668908323 63.263612209681654 24.26804542512869 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_9" - uuid: 4362323812678873731 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -18 - rotation: 15.760270402797083 169.86354931791732 129.20243590776937 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_10" - uuid: 5729417660700230677 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -15 - rotation: 175.86331055376357 42.196668145063654 0.3245417990007282 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_11" - uuid: 9572707123235601234 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -12 - rotation: 42.75411664440493 114.82496653694909 102.86552548431474 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_12" - uuid: 6186300519735794041 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -9 - rotation: 105.90675022793826 50.7107759441079 2.2990705627084496 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_13" - uuid: 776833948307485066 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -6 - rotation: 138.2167230508236 105.4132782333911 60.62147052906583 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_14" - uuid: 712478253473985005 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 -3 - rotation: 10.441227931003388 87.05335421143599 150.80099215459262 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_15" - uuid: 2821489388041108020 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 0 - rotation: 143.41799972177614 76.51163959776963 3.3872461457984304 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_16" - uuid: 8765093751772735965 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 3 - rotation: 128.63037386341225 50.12168717795094 123.52534680529469 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_17" - uuid: 6293929116650610478 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 6 - rotation: 71.95234132587487 117.3832909255494 20.55513864485746 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_18" - uuid: 6510280594639882440 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 9 - rotation: 175.2630051159833 152.69549814275942 4.039047502234148 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_19" - uuid: 1067113481307771666 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 12 - rotation: 70.83508661760614 76.79679963014583 16.488490172956325 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_20" - uuid: 8516723401648947295 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 15 - rotation: 128.97479722503763 176.2582260803873 55.45593365123915 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_21" - uuid: 5721205357883835772 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 18 - rotation: 71.19823286361132 158.97844868558127 39.056532112692935 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_22" - uuid: 1313315483797000489 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 21 - rotation: 163.54875103674988 67.5100800907672 3.6095559780118314 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_23" - uuid: 345630711627839474 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 24 - rotation: 58.40115625901631 86.74603924451216 21.483578252323895 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_24" - uuid: 4226684501434368013 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 27 - rotation: 103.99628674636412 76.66294071731447 0.9313793770701828 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_25" - uuid: 3325771220079035830 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 30 - rotation: 41.550815341475435 72.52967632221669 37.26864712422068 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_26" - uuid: 5108982194172699442 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 33 - rotation: 142.66164223143653 52.97752267065374 38.13338036180143 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_27" - uuid: 2173063261614142535 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 36 - rotation: 92.63964764307839 131.86172302630126 175.113669713628 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_28" - uuid: 3641919689227163264 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 39 - rotation: 28.913923601491952 164.14570834462288 74.08595451810275 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_29" - uuid: 5699269224309594445 - parent: 13626177115197044525 - type: Object - transform: - translation: -45 0 42 - rotation: 148.21645014497273 56.35996635793227 157.390747734522 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_30" - uuid: 7773759130997353730 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -45 - rotation: 12.19685841321877 135.5236343968834 4.247396744190506 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_31" - uuid: 9834017408337845026 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -42 - rotation: 84.84254439237107 50.184704379736345 145.9562411174075 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_32" - uuid: 5767364789150195995 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -39 - rotation: 176.1107088549277 58.21765128857223 99.23381862212798 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_33" - uuid: 8126472285899209353 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -36 - rotation: 20.386207176563904 95.75626151450741 104.27468083289435 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_34" - uuid: 1004347449113106547 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -33 - rotation: 162.97175067285602 176.37664867374397 56.988699645744575 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_35" - uuid: 4736151764743051145 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -30 - rotation: 176.74851217343476 116.33652601797662 31.982121843343982 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_36" - uuid: 4997479474132107839 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -27 - rotation: 49.63689059313593 47.07283948932646 129.52432271879258 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_37" - uuid: 5627861935577186743 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -24 - rotation: 17.81250802624044 137.27963243282178 50.387510367545325 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_38" - uuid: 3059057489208613657 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -21 - rotation: 94.99287975836467 179.6350085144023 168.39141118249847 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_39" - uuid: 3384993352088838255 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -18 - rotation: 135.44894392292073 46.61816794340679 20.036759639244792 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_40" - uuid: 3197438607265011276 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -15 - rotation: 8.60293302011139 128.86472046595222 122.70095904198688 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_41" - uuid: 5233444332160045682 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -12 - rotation: 171.52587494726745 46.759425685996625 165.78117015011182 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_42" - uuid: 4143101619976029385 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -9 - rotation: 177.60942781226964 166.07397678457792 123.50441532590065 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_43" - uuid: 8168208325932316803 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -6 - rotation: 174.0876692433981 40.135717703799216 37.20192017107962 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_44" - uuid: 7545770290158710894 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 -3 - rotation: 94.45338164153982 104.49070155276152 54.800424300902804 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_45" - uuid: 6414153021372736931 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 0 - rotation: 146.6368209879192 20.599084639837773 173.41618737580708 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_46" - uuid: 9537227216540230048 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 3 - rotation: 66.05044898244243 141.08167050719067 55.68657323657727 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_47" - uuid: 9478412402131557894 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 6 - rotation: 63.957388346963576 153.9639602092469 3.0854861510692277 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_48" - uuid: 9852410381257203774 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 9 - rotation: 61.614774023245346 156.50021693153772 157.62366031248496 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_49" - uuid: 2497696202223759765 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 12 - rotation: 176.54195439460088 84.86008106020383 136.48293720824532 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_50" - uuid: 6595978025531946030 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 15 - rotation: 37.79442371908643 64.0071675350897 171.0180880994633 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_51" - uuid: 4383125419660150730 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 18 - rotation: 119.78072965655073 106.97126468340684 25.1958400704148 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_52" - uuid: 4068481222989461787 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 21 - rotation: 46.090222737629304 86.22912855995551 152.8381101967358 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_53" - uuid: 9322830780650834573 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 24 - rotation: 169.1162025749219 170.3689121695397 171.14004075526006 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_54" - uuid: 4017654469693026035 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 27 - rotation: 105.67225385197469 116.10269963375698 1.5202542065893043 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_55" - uuid: 3345460729684359596 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 30 - rotation: 69.71042985049868 135.41403887027124 69.22388381463658 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_56" - uuid: 6086375495263409185 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 33 - rotation: 169.04312781774254 51.46607401514723 133.20340356683226 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_57" - uuid: 4000713420865873263 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 36 - rotation: 148.88140207876083 58.96632773528628 119.62940256157415 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_58" - uuid: 2699565265826474224 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 39 - rotation: 149.75565122815675 69.00160802336761 138.55496460488993 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_59" - uuid: 1225554777801302379 - parent: 13626177115197044525 - type: Object - transform: - translation: -42 0 42 - rotation: 10.539814598069256 53.31958863434757 100.74029977803607 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_60" - uuid: 692454159360185584 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -45 - rotation: 9.149962294820313 164.90294594922463 153.5681657312946 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_61" - uuid: 5141346442676105628 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -42 - rotation: 10.351267773259092 146.9818911416061 93.40284734417516 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_62" - uuid: 1242546477570262264 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -39 - rotation: 71.61733016434886 143.05168629905245 21.519274395332303 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_63" - uuid: 5226891569498516941 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -36 - rotation: 82.47193268843635 172.2975372598763 86.69771141871185 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_64" - uuid: 9240263382154449962 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -33 - rotation: 81.69534949356236 37.94535855034292 16.359057473361588 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_65" - uuid: 2971296847757750345 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -30 - rotation: 160.61507339287533 71.79126515950011 172.8446428613191 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_66" - uuid: 4750955923493040773 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -27 - rotation: 41.005243626936654 168.4815794282667 97.26364072553228 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_67" - uuid: 6620104601940597763 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -24 - rotation: 34.81534478605795 19.07750417647391 83.28356030174518 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_68" - uuid: 8837001010334276873 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -21 - rotation: 29.992229655356372 136.36889010470148 4.517720003847819 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_69" - uuid: 5115092535197368398 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -18 - rotation: 176.9221897113909 170.58110827633124 50.69860983385593 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_70" - uuid: 9315170898406968346 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -15 - rotation: 71.74556952455102 108.69312355614757 171.21197584825507 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_71" - uuid: 3518060716965435503 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -12 - rotation: 107.75905541170917 162.88539951618225 108.22391514493775 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_72" - uuid: 9804635561681262267 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -9 - rotation: 104.85914902555062 177.6238312665293 0.3938260418606898 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_73" - uuid: 1039665414622275339 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -6 - rotation: 43.87255694481805 154.923939198437 64.20604027505321 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_74" - uuid: 1743292357391302810 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 -3 - rotation: 151.52200150030194 6.038659861820072 113.82834765437977 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_75" - uuid: 4545168314225234122 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 0 - rotation: 114.6101895969619 74.22555970770631 167.16394501340798 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_76" - uuid: 2873636562942462139 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 3 - rotation: 138.2794060183942 98.53665225084174 146.2333358835748 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_77" - uuid: 4936505191338886540 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 6 - rotation: 43.111700006018005 93.40910324386122 52.88103957134334 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_78" - uuid: 5551980537021285310 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 9 - rotation: 85.24029556636674 43.320071406141324 74.2800483847607 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_79" - uuid: 9525560992839584420 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 12 - rotation: 127.67145464853446 94.85373705492835 42.65402794902729 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_80" - uuid: 9300742608876671037 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 15 - rotation: 4.306702909676976 168.8031688760643 165.98683914489928 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_81" - uuid: 5215602234561708172 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 18 - rotation: 48.25046561482399 159.47647157914096 83.53461216009168 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_82" - uuid: 6798074178627883983 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 21 - rotation: 1.8612264079521479 48.823542107776895 62.50689313788189 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_83" - uuid: 2989078025076950641 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 24 - rotation: 103.05211973921746 27.596106785546098 41.14981078537529 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_84" - uuid: 5837489449902716355 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 27 - rotation: 113.8048757960909 64.24965948560268 138.97113042704896 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_85" - uuid: 6306164017439344744 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 30 - rotation: 51.670747635179374 45.69026760184771 89.70775861547473 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_86" - uuid: 6369625840577903707 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 33 - rotation: 167.4275931401154 97.70566295919936 140.7766707993026 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_87" - uuid: 6965434766200536274 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 36 - rotation: 7.919528209770843 97.00564588368191 155.72802021042423 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_88" - uuid: 9620025375915167111 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 39 - rotation: 123.79420777692332 138.8210838835036 73.08945822081614 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_89" - uuid: 2136979177433159017 - parent: 13626177115197044525 - type: Object - transform: - translation: -39 0 42 - rotation: 165.09073415538336 99.68016216891142 61.490037307996005 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_90" - uuid: 5423586735277130124 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -45 - rotation: 36.0160126882901 27.658059595370695 173.68595625717046 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_91" - uuid: 90793198998747889 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -42 - rotation: 98.79274228777629 36.74933722493492 148.67289240326497 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_92" - uuid: 7224483001916659661 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -39 - rotation: 41.727131888846884 44.440325767354864 25.78910206471922 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_93" - uuid: 157444378886109845 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -36 - rotation: 175.69210203269287 71.78706242932 36.732831990264195 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_94" - uuid: 6859587059432461937 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -33 - rotation: 79.76752395687912 2.0741172629830418 157.0987378123954 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_95" - uuid: 523510241244518017 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -30 - rotation: 135.23255944352005 95.4668214278279 130.99988362611379 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_96" - uuid: 9558674415395156301 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -27 - rotation: 118.31845995139408 22.622075430374586 165.4303871090004 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_97" - uuid: 8515227064189919375 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -24 - rotation: 153.5746827337452 76.57259457626895 25.382029884784284 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_98" - uuid: 4320786548845777257 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -21 - rotation: 72.68028636774946 35.26943043461675 105.12260603659843 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_99" - uuid: 8806767136497035513 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -18 - rotation: 46.61032356212079 147.952209148143 25.1730661181493 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_100" - uuid: 7645648293648065595 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -15 - rotation: 113.229728570548 101.96107554128753 159.130517284557 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_101" - uuid: 9963240254237988398 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -12 - rotation: 156.2183041065179 20.297639871559653 177.28655676310112 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_102" - uuid: 1675113961658411780 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -9 - rotation: 22.973747725145643 67.9919518175606 135.05498602109606 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_103" - uuid: 9160694055993184858 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -6 - rotation: 121.8969141382955 73.9835466183379 10.819139346633307 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_104" - uuid: 110849275356952990 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 -3 - rotation: 34.02250959200486 172.9933491430851 30.301816634080186 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_105" - uuid: 5981761377936905803 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 0 - rotation: 116.42848161416748 135.97178994177582 162.94370593752845 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_106" - uuid: 7104304826197656497 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 3 - rotation: 31.74023454466817 92.49819242314928 169.35487572780718 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_107" - uuid: 3581491194961371290 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 6 - rotation: 173.35105263142052 27.91263918046362 160.60631123619697 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_108" - uuid: 8019335567069003869 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 9 - rotation: 129.55053696114524 173.93196324750244 142.64942635735073 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_109" - uuid: 2803109186913282994 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 12 - rotation: 106.73112877996361 7.122992002246842 135.22683939043017 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_110" - uuid: 5234591444301147333 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 15 - rotation: 107.4674711548985 133.28786490271744 91.54071521472818 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_111" - uuid: 6180486895042639684 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 18 - rotation: 176.2850347384778 125.5789930857627 125.98075460222347 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_112" - uuid: 1149133623080774976 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 21 - rotation: 29.049367677676702 109.22037912158176 95.12240762584815 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_113" - uuid: 4567093276195173001 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 24 - rotation: 155.12135532093453 169.0235311740246 16.794520103798718 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_114" - uuid: 8706552272452688962 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 27 - rotation: 48.72902247399386 131.38117869375037 154.00620723158647 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_115" - uuid: 2015571479430044569 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 30 - rotation: 34.23060270064286 124.27645056404828 174.22304279171618 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_116" - uuid: 6032163115324918896 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 33 - rotation: 112.03159683509571 70.45116182060826 97.39016276128898 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_117" - uuid: 2199095083403138518 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 36 - rotation: 168.17552764024217 1.4386744927851125 60.37719650771342 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_118" - uuid: 2358584274864282494 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 39 - rotation: 63.90333828159717 139.17592273864366 84.19382791657024 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_119" - uuid: 4784311252458477757 - parent: 13626177115197044525 - type: Object - transform: - translation: -36 0 42 - rotation: 140.16246334068583 172.63074012425923 13.543399451807225 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_120" - uuid: 3149303445953677680 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -45 - rotation: 124.12282869782062 87.73564572876526 70.66728075292613 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_121" - uuid: 8560957229023058223 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -42 - rotation: 38.262536635876515 109.6657717877986 116.17586738758095 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_122" - uuid: 5126083070181757634 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -39 - rotation: 134.3566239045438 40.85350767881781 25.834441624009262 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_123" - uuid: 7893154257122073575 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -36 - rotation: 164.95443867705393 155.45745543530856 147.15802468829133 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_124" - uuid: 4408512892561841541 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -33 - rotation: 165.74989316509144 172.07170111130668 6.428292645085629 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_125" - uuid: 3119517507623840888 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -30 - rotation: 64.03945262218858 137.44478199176805 48.57703293663239 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_126" - uuid: 1533075435644648696 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -27 - rotation: 156.84130205805442 3.4793104183049506 42.343400561807066 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_127" - uuid: 9207097289151780972 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -24 - rotation: 123.92223541286067 51.734701117486956 58.94172627592974 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_128" - uuid: 316837812264538791 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -21 - rotation: 46.32423982468973 50.83730294932899 169.99898963818407 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_129" - uuid: 4953973340000860759 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -18 - rotation: 15.159932134036588 60.47858354583617 128.50105990891015 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_130" - uuid: 1449021609272334019 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -15 - rotation: 130.95173661800519 155.6072244752783 37.49410515165251 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_131" - uuid: 9452611609245094816 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -12 - rotation: 75.09471892212802 0.30369471807673243 37.023159342572896 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_132" - uuid: 3455715698140540330 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -9 - rotation: 8.938158165818743 30.811820819921383 2.50383167977426 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_133" - uuid: 9855694454562340874 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -6 - rotation: 103.06592578097768 159.0177257770088 119.79629785283473 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_134" - uuid: 755618807194839265 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 -3 - rotation: 65.85735443745861 98.83113060498832 13.484173674782582 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_135" - uuid: 4482403877706929784 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 0 - rotation: 137.38887826834622 36.855889443933165 26.288652493800686 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_136" - uuid: 5842483635408930899 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 3 - rotation: 38.96109263397048 166.2343526130541 163.02663683394445 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_137" - uuid: 7493603477192701339 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 6 - rotation: 58.42470220740222 25.128093673599267 145.8213434632967 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_138" - uuid: 2303564748513717045 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 9 - rotation: 114.2801652543191 9.401862248015025 75.03906958591598 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_139" - uuid: 9406328903918347927 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 12 - rotation: 23.2944271780497 22.42632946983133 160.7272859213012 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_140" - uuid: 6803989731609986493 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 15 - rotation: 11.685940943709621 116.114482523982 41.178477874578746 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_141" - uuid: 6407397517263611556 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 18 - rotation: 108.35416066405044 46.800613705703675 120.33688176726697 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_142" - uuid: 7702750747750413877 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 21 - rotation: 123.32922262499233 123.86825487648423 165.85704680509815 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_143" - uuid: 1310882453365602832 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 24 - rotation: 113.23474535201115 92.4633441200313 84.29417575890386 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_144" - uuid: 3087952584810499184 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 27 - rotation: 42.82490768047002 6.998676493860172 135.61276950174448 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_145" - uuid: 2693459647458950074 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 30 - rotation: 50.03247303887806 21.190963364814714 145.65563457705596 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_146" - uuid: 6744797557313225940 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 33 - rotation: 103.59383130939537 16.637678718908795 167.32282827220573 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_147" - uuid: 3404278714532972142 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 36 - rotation: 27.941021597710233 176.42442454822066 170.02028115441115 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_148" - uuid: 3625625446984506735 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 39 - rotation: 91.78519997920353 177.0959909855504 152.43643566664417 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_149" - uuid: 7144412756483536890 - parent: 13626177115197044525 - type: Object - transform: - translation: -33 0 42 - rotation: 175.44658692158438 117.36835431885501 171.05418848711778 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_150" - uuid: 6284017217355774523 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -45 - rotation: 123.27622932947071 0.4575789130718366 2.2678531044923522 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_151" - uuid: 9100049814423885062 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -42 - rotation: 10.088074347219163 102.31242699885358 8.846623557405689 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_152" - uuid: 4903036773648049040 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -39 - rotation: 94.01002633225447 120.13354119290561 179.90622172220057 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_153" - uuid: 7254062853396664559 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -36 - rotation: 130.32673279371443 62.89896371330632 155.28171461907834 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_154" - uuid: 9915408436586509839 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -33 - rotation: 114.58579800096382 160.9332276284304 97.79557024866523 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_155" - uuid: 5848078736276920031 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -30 - rotation: 137.0296049900924 8.285170803614273 80.46893333337373 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_156" - uuid: 6048104690603920167 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -27 - rotation: 100.59547090572842 25.806766688032475 86.52523920858803 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_157" - uuid: 493281769996433756 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -24 - rotation: 6.9940164699275575 83.7729327757359 61.60521647062569 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_158" - uuid: 5975640225477834923 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -21 - rotation: 69.08151489788197 105.37869020651179 167.72604870205828 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_159" - uuid: 3154484268351437589 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -18 - rotation: 133.73811367821915 169.50881994203286 100.95520410477704 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_160" - uuid: 6579556053358865266 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -15 - rotation: 140.7804599973802 143.68833457099723 152.74437113277386 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_161" - uuid: 4484361685384401999 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -12 - rotation: 99.29001652927765 54.86380501226296 41.652944251292084 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_162" - uuid: 4073104679811085330 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -9 - rotation: 56.501189717076514 43.039610922143495 106.51691792858063 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_163" - uuid: 7646174706284363820 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -6 - rotation: 63.970216733345204 168.7770111244751 137.37838767834654 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_164" - uuid: 6370449963436265296 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 -3 - rotation: 95.39710969143708 120.48392496951898 90.0554213634353 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_165" - uuid: 5957992794092022775 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 0 - rotation: 159.20255381498336 75.8329189683274 97.95731774798321 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_166" - uuid: 8266499826829743753 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 3 - rotation: 152.29135910239842 91.34416510906637 101.54128187045004 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_167" - uuid: 5982723175652404307 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 6 - rotation: 141.96990422525104 141.4225780013913 108.36673833214695 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_168" - uuid: 3903284151934208019 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 9 - rotation: 62.04954019458525 53.91271329000151 118.21154993973322 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_169" - uuid: 7653185584296023322 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 12 - rotation: 50.65323862732766 70.68006709315239 20.903723745830675 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_170" - uuid: 3494552645702988018 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 15 - rotation: 176.9564976781829 1.4930643592719206 102.8450728691638 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_171" - uuid: 6883920057497555531 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 18 - rotation: 165.2362815279821 141.1921638630645 94.87379138206678 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_172" - uuid: 2372952933861908939 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 21 - rotation: 54.47540208973069 160.09652798929903 161.167819435893 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_173" - uuid: 8732074196709085460 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 24 - rotation: 82.94819342861591 126.27615201308278 175.12867470753366 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_174" - uuid: 2050342719351462504 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 27 - rotation: 20.405806229547046 37.378128861527394 171.6800502953178 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_175" - uuid: 4041377789021389146 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 30 - rotation: 1.152211932479399 1.2988575050507767 85.70405761611289 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_176" - uuid: 4489536432151190007 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 33 - rotation: 16.049465776114342 49.06869604666216 93.86057021509471 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_177" - uuid: 2067312664563283666 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 36 - rotation: 80.18249643521686 64.62575809735765 43.886459094361264 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_178" - uuid: 6084010800451405658 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 39 - rotation: 177.60793579801162 45.90017393131549 125.23533319625982 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_179" - uuid: 5519389343241129960 - parent: 13626177115197044525 - type: Object - transform: - translation: -30 0 42 - rotation: 131.91944507248422 139.72416987893268 89.55010047100852 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_180" - uuid: 41120105003655435 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -45 - rotation: 19.08283779301893 124.94817841048392 128.62840687590676 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_181" - uuid: 4518940801052296584 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -42 - rotation: 45.21163413222821 121.77963997478759 99.77108408709903 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_182" - uuid: 1557122022430413009 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -39 - rotation: 54.66768878350627 93.38644070450661 26.790993162753505 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_183" - uuid: 6264840224549784332 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -36 - rotation: 126.45711178881683 133.79648824365586 32.579405393904786 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_184" - uuid: 6126585675944043850 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -33 - rotation: 6.095375308714608 152.7361748144659 65.52562551811532 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_185" - uuid: 5485492853644562267 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -30 - rotation: 132.3898591700327 166.6184915254166 46.98945677978548 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_186" - uuid: 3483145273346810494 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -27 - rotation: 1.418904839007098 16.128538961505548 96.83320629608968 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_187" - uuid: 541063759551727685 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -24 - rotation: 153.99584599430392 132.5245940279941 41.62277604321626 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_188" - uuid: 7793541553821894674 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -21 - rotation: 134.3611594092203 98.14607854615731 155.66663281214073 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_189" - uuid: 4946716781653801514 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -18 - rotation: 154.75994245959782 163.06586544574992 104.285294541053 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_190" - uuid: 4880657782970256724 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -15 - rotation: 166.01705181539197 98.98453960485169 34.91040093732467 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_191" - uuid: 5004770663127853164 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -12 - rotation: 133.69323172972125 0.4112314646290183 132.05799118256806 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_192" - uuid: 8868747155039571490 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -9 - rotation: 178.142283402966 124.06486180300568 65.816287883533 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_193" - uuid: 8917234296530271055 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -6 - rotation: 157.92078221050156 75.45652227141697 18.515076633343963 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_194" - uuid: 1367094442941338084 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 -3 - rotation: 12.367339883200469 150.07441457326132 12.915187679390545 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_195" - uuid: 3687420671416095656 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 0 - rotation: 15.109520505159376 142.60970218567482 167.0252959940746 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_196" - uuid: 1139210598578356620 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 3 - rotation: 33.53034027686696 166.77336053857104 155.711591279984 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_197" - uuid: 584858467156753855 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 6 - rotation: 8.186189067050027 31.596667879859734 3.687271706297335 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_198" - uuid: 8565764484568596254 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 9 - rotation: 167.57250952962536 76.58807955191303 121.63897747402325 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_199" - uuid: 4935704571397055322 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 12 - rotation: 90.28337155012022 32.81058490636356 49.539310488658266 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_200" - uuid: 7800106412146162621 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 15 - rotation: 74.40291501283211 69.31066003707588 105.3882687424596 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_201" - uuid: 2651966541382800081 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 18 - rotation: 177.02515444926274 165.45603011549363 58.52728811048352 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_202" - uuid: 3788518796900327958 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 21 - rotation: 87.57496361328504 147.89260717772103 77.61062972219861 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_203" - uuid: 357188853996388614 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 24 - rotation: 129.84618305877095 58.32230065900594 72.46285809600704 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_204" - uuid: 7979409572670250661 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 27 - rotation: 101.84055865902302 55.69965528376502 50.30872847168843 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_205" - uuid: 8664265017153379971 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 30 - rotation: 122.90277817989214 11.398861690011016 118.12342540684598 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_206" - uuid: 4472013229001338802 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 33 - rotation: 161.74135747263554 132.39781186251844 4.720170218487971 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_207" - uuid: 3113668293163692688 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 36 - rotation: 85.53321464739034 67.05512256863598 143.92848969119302 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_208" - uuid: 7338392626740829872 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 39 - rotation: 143.41666327614118 59.26090149360342 159.79520355617893 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_209" - uuid: 5773276748896353658 - parent: 13626177115197044525 - type: Object - transform: - translation: -27 0 42 - rotation: 46.77387958604237 111.70873341625274 157.77551125655123 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_210" - uuid: 8299784064683174850 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -45 - rotation: 108.29873093837513 94.71820903717318 109.76506293655814 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_211" - uuid: 4810083899734892498 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -42 - rotation: 49.22685326858178 36.88461179420253 137.14057641277563 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_212" - uuid: 2250077349243498857 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -39 - rotation: 36.59772256647048 11.490624867769801 84.74261965982522 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_213" - uuid: 2698259233446654413 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -36 - rotation: 55.5589237294963 131.13796447934263 28.45760297694635 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_214" - uuid: 4113387777874018847 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -33 - rotation: 160.07848880532825 146.57615278248403 48.35355694005466 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_215" - uuid: 8422809519010917110 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -30 - rotation: 148.39974517605611 49.50681746313942 156.44045350574322 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_216" - uuid: 9158911549318318704 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -27 - rotation: 40.06983156108762 110.0697157192326 143.50136524422305 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_217" - uuid: 3706933782102368152 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -24 - rotation: 38.10556816434045 134.26209785027092 91.67449813058896 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_218" - uuid: 5425694405617779480 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -21 - rotation: 47.59592390674842 143.21428596600768 47.16063021681302 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_219" - uuid: 3202126904917428208 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -18 - rotation: 175.45988060372062 33.776268965672685 18.93311905108932 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_220" - uuid: 2039030082612729704 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -15 - rotation: 33.29944480784224 148.8635222364031 37.92143042302955 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_221" - uuid: 4736606467498976561 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -12 - rotation: 47.94534709254412 85.19026662780392 55.74758993553582 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_222" - uuid: 870353420837131860 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -9 - rotation: 37.86307017557534 34.48722081343117 129.33184970542612 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_223" - uuid: 9213450747323657462 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -6 - rotation: 129.21125678593125 156.24658087763342 179.58389302724328 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_224" - uuid: 441799657277190465 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 -3 - rotation: 173.00658290034238 38.78736329438196 51.49774739795166 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_225" - uuid: 4197171679057035197 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 0 - rotation: 160.45918107554436 100.59856259664329 116.79109500444537 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_226" - uuid: 5303926236333630487 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 3 - rotation: 48.18053499879867 152.66708194186583 47.085326265029884 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_227" - uuid: 5349881492493714917 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 6 - rotation: 2.9478216406972413 129.1197818800038 177.26927620445767 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_228" - uuid: 5474320206159641151 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 9 - rotation: 13.408960830295175 72.07333392200333 17.057422747618585 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_229" - uuid: 651493919499994978 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 12 - rotation: 176.8754704257364 12.304538740575941 172.6596458144597 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_230" - uuid: 6667428998280652595 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 15 - rotation: 123.79910815975313 77.77688563381118 91.00493849796547 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_231" - uuid: 3934521956525088685 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 18 - rotation: 111.51570412327477 18.31059450086884 11.876663076239959 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_232" - uuid: 8479595729170412422 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 21 - rotation: 73.43864214564806 152.79191886999175 45.57874184804856 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_233" - uuid: 209578271461976137 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 24 - rotation: 8.215093258294168 31.184876558122244 108.05292560326345 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_234" - uuid: 2579875351851185035 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 27 - rotation: 92.89299874117975 112.52778862268066 2.0405030319089623 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_235" - uuid: 7671799966757103031 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 30 - rotation: 163.8840732548833 56.396041757922774 34.07386237762503 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_236" - uuid: 99329926221678596 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 33 - rotation: 134.5012234384388 13.501691723582852 40.56214309315644 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_237" - uuid: 9514021678885451420 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 36 - rotation: 68.97792928234433 177.9438726534943 125.84739595413437 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_238" - uuid: 1710939568799119263 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 39 - rotation: 165.03238148670488 33.05055113004353 97.06884617455988 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_239" - uuid: 8318670147959565629 - parent: 13626177115197044525 - type: Object - transform: - translation: -24 0 42 - rotation: 144.71877305749803 21.08171342605431 76.66126087400046 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_240" - uuid: 9938558666947471606 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -45 - rotation: 10.33105883645912 107.50352108287026 101.14488756199732 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_241" - uuid: 6146669799825541896 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -42 - rotation: 4.961720476113756 70.93809634654073 4.213211201149251 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_242" - uuid: 4534898590586187696 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -39 - rotation: 28.683022941066685 163.47093520378826 71.82277011116442 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_243" - uuid: 4619114935434636321 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -36 - rotation: 171.82787419074307 6.28106449702728 25.509043155161592 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_244" - uuid: 1915323098519280307 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -33 - rotation: 118.77963323795004 155.78021480205928 40.99974465776684 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_245" - uuid: 7814296103986892686 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -30 - rotation: 18.85458052393452 79.76064352612588 150.46277869369445 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_246" - uuid: 9476833616454623229 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -27 - rotation: 37.63859021230518 80.0377228402043 65.67833657253139 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_247" - uuid: 3319219670093938196 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -24 - rotation: 4.634326924266501 82.03567135901422 9.746672679896925 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_248" - uuid: 1486846316540561976 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -21 - rotation: 58.47452504071135 17.820696837667324 168.65457541614717 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_249" - uuid: 4963613658962651660 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -18 - rotation: 142.66299228966386 177.74954757693467 140.1349889860102 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_250" - uuid: 8208441708499269821 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -15 - rotation: 19.524268954543963 113.72149086868644 158.16024002456808 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_251" - uuid: 1667850799502203810 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -12 - rotation: 72.10142949462123 13.651458822154032 59.908247360038 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_252" - uuid: 6485487796257456299 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -9 - rotation: 47.401779311731886 0.4174568100429865 132.35797146536535 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_253" - uuid: 6548290467032625420 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -6 - rotation: 150.81089665480962 176.53191048831204 160.8408493745809 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_254" - uuid: 8886715754535985818 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 -3 - rotation: 169.56465700637486 25.27366733552714 32.22016370421491 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_255" - uuid: 8356502930670459336 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 0 - rotation: 137.8061400699725 110.98325222890216 13.86281837655333 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_256" - uuid: 4921352746658377555 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 3 - rotation: 9.248791179256203 31.105910418999468 118.49035701794413 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_257" - uuid: 2135219797196833171 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 6 - rotation: 152.53274321971227 71.54248226945951 68.80340859414912 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_258" - uuid: 1587386781473855991 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 9 - rotation: 160.8074539049953 77.4294897774515 19.03429818065908 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_259" - uuid: 3538388904331390227 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 12 - rotation: 79.35958303754484 105.54587303301813 162.20227901115328 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_260" - uuid: 3907168321275650709 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 15 - rotation: 60.27209111406846 57.1491157918503 21.073211684164303 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_261" - uuid: 753635526031943755 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 18 - rotation: 61.32188310102851 109.92688183323517 143.06188008448134 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_262" - uuid: 8061914585434649283 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 21 - rotation: 113.0512248238779 103.45093836351987 81.4126772200452 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_263" - uuid: 6813084588940954387 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 24 - rotation: 68.50655294822192 28.406648033335657 97.86359087259912 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_264" - uuid: 4033233166915773211 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 27 - rotation: 110.3583198356284 98.92092999143823 98.96254068309534 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_265" - uuid: 4141811535913381431 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 30 - rotation: 124.81385880580947 1.5068109251277018 38.232435748942514 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_266" - uuid: 1594958877392583393 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 33 - rotation: 163.2891430302551 2.5684720012213447 175.2689967528089 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_267" - uuid: 2450257877213699803 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 36 - rotation: 110.15818913300149 128.58910397924436 142.45617578271487 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_268" - uuid: 1801850729540028479 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 39 - rotation: 22.59829606942404 123.5730043173665 61.979935004129445 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_269" - uuid: 9968252216403882818 - parent: 13626177115197044525 - type: Object - transform: - translation: -21 0 42 - rotation: 10.083220558085843 157.8616468059309 30.118615717136045 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_270" - uuid: 3478265986883231390 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -45 - rotation: 54.06548322723704 173.29359770177453 86.09267720509683 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_271" - uuid: 1531516793149386757 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -42 - rotation: 120.94639976060867 155.0170409301545 179.32903549013056 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_272" - uuid: 3144435387107337369 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -39 - rotation: 51.09245911218191 71.47122740486007 144.6546219330723 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_273" - uuid: 9387090093058269151 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -36 - rotation: 107.53764053721999 42.86005680999528 77.72150416138392 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_274" - uuid: 1071326005835592700 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -33 - rotation: 148.11047534161293 129.98564445890437 69.24238782544803 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_275" - uuid: 6495141716498857609 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -30 - rotation: 53.009949427717196 70.23579288844061 100.37190578684422 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_276" - uuid: 2481455284821309926 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -27 - rotation: 101.4114982945231 37.22087239982014 82.6429064696479 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_277" - uuid: 3076368025985031737 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -24 - rotation: 48.74013169361751 109.1896699166159 12.395998327622317 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_278" - uuid: 2479581227257414803 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -21 - rotation: 37.332374742080674 117.55187962774686 115.73197308716777 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_279" - uuid: 1151598393490767850 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -18 - rotation: 74.85924271336492 133.50480781393702 122.55067497588274 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_280" - uuid: 3399925786113988014 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -15 - rotation: 119.28731400968513 140.1147513689274 57.68306211792232 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_281" - uuid: 1681081500131707802 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -12 - rotation: 176.7021818410204 78.26023308663412 138.28211803326087 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_282" - uuid: 1435515101834592905 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -9 - rotation: 176.07899718622807 57.51195829813442 68.59364035834933 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_283" - uuid: 2673894489233929411 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -6 - rotation: 90.23360495875 35.99333491175178 91.49637945293969 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_284" - uuid: 5360892404850958764 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 -3 - rotation: 19.041035782723366 9.90345207335382 10.148071798388669 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_285" - uuid: 8265956329659153736 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 0 - rotation: 67.20827443393708 24.999263419751255 5.7958147753297995 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_286" - uuid: 7673840017468387818 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 3 - rotation: 93.60765213399522 177.6546346314002 84.5048323223025 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_287" - uuid: 3509739930239189485 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 6 - rotation: 68.16559547942325 44.14859248250191 8.051784547895714 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_288" - uuid: 7137046319290371875 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 9 - rotation: 163.2126369498502 15.837887389354112 164.27317309035882 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_289" - uuid: 4999695606311337343 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 12 - rotation: 100.34256427091343 164.7417078847124 174.59932372375536 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_290" - uuid: 7162950202147590232 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 15 - rotation: 161.95885534973465 43.14450611634804 30.390941242528648 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_291" - uuid: 9855082949808461397 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 18 - rotation: 83.20670516202307 13.338883619014867 158.2699454713684 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_292" - uuid: 54856268162250192 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 21 - rotation: 42.01210481011294 121.17225809702418 128.01615751590285 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_293" - uuid: 3645648696700904745 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 24 - rotation: 13.388158615486983 98.81111275026564 89.78060727646087 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_294" - uuid: 380464924179282753 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 27 - rotation: 102.8282237073127 41.08397081777269 136.54136661358513 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_295" - uuid: 446958859204563254 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 30 - rotation: 161.5773638825083 68.20079054862082 115.908098509261 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_296" - uuid: 1637952082080063601 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 33 - rotation: 51.85655337754188 154.0962282501665 114.29975960963463 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_297" - uuid: 9584256732314071162 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 36 - rotation: 156.53432194409564 119.82812614338495 53.04200731917875 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_298" - uuid: 4596241381230215296 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 39 - rotation: 63.13157604265219 166.08804524038294 71.99854124458712 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_299" - uuid: 7080842892513214358 - parent: 13626177115197044525 - type: Object - transform: - translation: -18 0 42 - rotation: 52.73921743419497 60.099229913515885 173.9187035592699 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_300" - uuid: 6907381130073615301 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -45 - rotation: 79.77342490214623 17.762704240169235 20.878744103020406 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_301" - uuid: 7151613600713582342 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -42 - rotation: 163.9541619457597 47.412103964248786 166.90432479106263 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_302" - uuid: 8214865949606314765 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -39 - rotation: 96.01410358365042 83.46804648270998 11.472939324706253 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_303" - uuid: 1371677039725252716 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -36 - rotation: 18.7939596027193 65.3997010020649 164.15670914505455 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_304" - uuid: 6549845277534703806 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -33 - rotation: 123.4189448459575 135.8034847520412 64.45027509678273 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_305" - uuid: 21079530482287182 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -30 - rotation: 151.17822988592116 111.00713123851868 159.35442869644925 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_306" - uuid: 4961949686229153775 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -27 - rotation: 4.11971005522858 160.87578011366034 135.82455423336248 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_307" - uuid: 1807383643397163280 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -24 - rotation: 14.380733037793906 165.6919119483796 73.92719558476522 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_308" - uuid: 972516369700819806 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -21 - rotation: 4.879388004428855 22.614721265812523 172.42898187383904 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_309" - uuid: 5326522398919551548 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -18 - rotation: 14.70542249781113 23.22900300936054 23.947342697062254 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_310" - uuid: 763250238843886930 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -15 - rotation: 176.7502307807324 138.52132300111236 21.57216315689433 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_311" - uuid: 2599685850229471893 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -12 - rotation: 139.2528159975449 60.34230227871377 178.05942672044694 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_312" - uuid: 9459841752856009574 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -9 - rotation: 59.63077609024053 84.24736800342151 115.16412201532287 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_313" - uuid: 2820968952567738445 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -6 - rotation: 40.91691755273531 172.6542921480793 119.97749046703339 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_314" - uuid: 2617886580891808262 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 -3 - rotation: 160.0180316903689 161.58537653895044 128.90727221032068 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_315" - uuid: 4395031808993238451 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 0 - rotation: 62.792116354217356 83.4095039429731 4.531501298769223 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_316" - uuid: 9882560514960213217 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 3 - rotation: 89.27301343870788 31.460047479829495 53.494333381911886 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_317" - uuid: 3256246666605146783 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 6 - rotation: 20.385285870837496 72.03952034785142 91.11210763623023 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_318" - uuid: 6284845049612689856 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 9 - rotation: 66.81448375324015 81.07627136491183 168.5298723248794 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_319" - uuid: 7844508008320409700 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 12 - rotation: 46.58931989674811 105.00250517561233 106.72703165358294 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_320" - uuid: 6804965117271812144 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 15 - rotation: 47.69191210831168 162.4140772629921 70.44097653750832 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_321" - uuid: 8421542983648008255 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 18 - rotation: 178.01188798948675 125.30236845672145 103.90901076745446 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_322" - uuid: 5628407493925402928 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 21 - rotation: 91.68773164982909 176.5251568669722 85.8346088533899 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_323" - uuid: 1408489844743296746 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 24 - rotation: 74.21245408551977 58.585991493713 137.9966162203721 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_324" - uuid: 8314837754104885087 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 27 - rotation: 28.84541582259114 168.711361967863 126.243673935186 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_325" - uuid: 4368511288778296773 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 30 - rotation: 89.92350932750898 108.78700264481549 60.43262928677087 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_326" - uuid: 8179098613373194790 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 33 - rotation: 153.652493678655 36.74657195668785 30.01503054304932 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_327" - uuid: 601883472921442392 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 36 - rotation: 30.159467496398527 120.35693506208798 145.3997092471561 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_328" - uuid: 5756565060852275431 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 39 - rotation: 60.4079772644768 70.19000796834831 163.5416788165273 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_329" - uuid: 7404116113641617303 - parent: 13626177115197044525 - type: Object - transform: - translation: -15 0 42 - rotation: 133.14570977265092 49.53993249883201 47.958300930397435 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_330" - uuid: 2540404185707858999 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -45 - rotation: 81.68763235641205 2.2626878187676924 39.98282178998676 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_331" - uuid: 9555737804339252130 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -42 - rotation: 13.636623740481749 44.324214410033356 23.66062262021363 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_332" - uuid: 9189941234766857866 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -39 - rotation: 108.98484031424317 145.22692582893268 107.6865220887779 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_333" - uuid: 5814261723587711208 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -36 - rotation: 35.299231400759666 108.84260457730417 64.19183162514447 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_334" - uuid: 4818366773497659367 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -33 - rotation: 44.98908986320544 89.16126222992739 98.87667146974424 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_335" - uuid: 217888142553617279 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -30 - rotation: 169.08376487203097 79.78116153332508 152.147797782642 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_336" - uuid: 5369140566237234250 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -27 - rotation: 120.2890862316128 60.98296439770458 2.5115630673177947 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_337" - uuid: 748767913514916399 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -24 - rotation: 105.47456010271885 87.01493101757016 141.69933848274317 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_338" - uuid: 4880303605532682172 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -21 - rotation: 93.89098542318477 62.95554892815523 112.75768274359898 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_339" - uuid: 7418604360156446449 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -18 - rotation: 145.39884842204359 48.8775133314332 124.19742530879246 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_340" - uuid: 540845512984658525 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -15 - rotation: 76.49076252156772 18.704652036475224 177.44311230285368 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_341" - uuid: 4646044273834575779 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -12 - rotation: 72.66482683545263 106.33758002908144 171.66401393314354 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_342" - uuid: 7208972519896398701 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -9 - rotation: 120.89430728113817 59.7293497427401 115.46817147145819 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_343" - uuid: 2084132953334935901 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -6 - rotation: 8.040664585657261 22.16587009359196 77.02869255666674 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_344" - uuid: 7615253113213748074 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 -3 - rotation: 21.99186599582987 176.7215342980295 163.70632064635492 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_345" - uuid: 567985663033159667 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 0 - rotation: 1.8271499160704563 108.01690088314612 58.80696223898689 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_346" - uuid: 5191081624669716455 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 3 - rotation: 135.93409639733233 74.88513637982079 178.12518480848433 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_347" - uuid: 4448834913590721347 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 6 - rotation: 75.54779793721252 80.60751338552912 136.8415820528888 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_348" - uuid: 3552042570971705776 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 9 - rotation: 163.49079419719024 166.40745272984938 92.75655623102057 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_349" - uuid: 8229277348012681061 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 12 - rotation: 100.88020859065387 148.20681685076372 9.85053340285235 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_350" - uuid: 1953306700675103452 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 15 - rotation: 29.833173911227657 38.423319668427965 129.78301758922882 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_351" - uuid: 6678872214136376521 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 18 - rotation: 82.79625962906813 101.11997869138756 160.9682627885636 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_352" - uuid: 2864076791198529617 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 21 - rotation: 122.91735374038389 85.86389784612601 54.60660967293092 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_353" - uuid: 3589256163386370577 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 24 - rotation: 148.18009535720415 44.97808260617833 47.85989327996624 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_354" - uuid: 5040385697347494620 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 27 - rotation: 88.9380670769529 54.627000548546604 9.86844911441004 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_355" - uuid: 9462502792773344745 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 30 - rotation: 148.50016825284135 40.130097207651836 128.28263404483891 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_356" - uuid: 4852157054305885531 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 33 - rotation: 170.99757624127736 86.03816876895631 113.29449315835873 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_357" - uuid: 2411429785646624322 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 36 - rotation: 171.65853916435412 74.72196646169316 49.700671956192025 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_358" - uuid: 4887355507733372771 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 39 - rotation: 19.509813411912596 82.21491661362293 38.229196790366686 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_359" - uuid: 438619752311911178 - parent: 13626177115197044525 - type: Object - transform: - translation: -12 0 42 - rotation: 26.801556510060294 155.03345279459214 130.95039272387874 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_360" - uuid: 9938800275060391511 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -45 - rotation: 80.06205245775179 144.11198996657842 74.18760975094472 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_361" - uuid: 235796566803599423 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -42 - rotation: 165.92907090162205 43.55708640887849 44.761042541098575 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_362" - uuid: 8785086225431054964 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -39 - rotation: 29.410301606877 36.19857996554136 160.19117108971 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_363" - uuid: 2565044512717518680 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -36 - rotation: 130.99913910181246 116.71209695342417 29.94791403349318 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_364" - uuid: 5872002823888614136 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -33 - rotation: 113.3691810464114 115.07051403299315 146.21586518815212 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_365" - uuid: 446987356088390719 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -30 - rotation: 79.28804554143314 95.6772941436527 152.62707522830664 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_366" - uuid: 5716426177805961802 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -27 - rotation: 8.251378640191419 101.66865084513019 34.7554887485788 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_367" - uuid: 6561415383443824656 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -24 - rotation: 84.61961065046837 166.0355667111181 136.7315964672483 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_368" - uuid: 5479052139998282743 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -21 - rotation: 82.46628311791558 24.039587592632042 50.211597501397485 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_369" - uuid: 4843267300806783121 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -18 - rotation: 31.730368960229963 17.94649181165512 47.94684102356526 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_370" - uuid: 5152576578606138140 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -15 - rotation: 69.17531013727431 111.81073024887898 102.0559007739088 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_371" - uuid: 9656471967952271186 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -12 - rotation: 123.74100441166345 4.656362679749999 82.35181648350242 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_372" - uuid: 2571359122646224306 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -9 - rotation: 49.043558477127974 115.05312738066078 120.29781181631182 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_373" - uuid: 9825606544414517701 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -6 - rotation: 147.75294300348398 76.60041958682459 87.20735435086164 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_374" - uuid: 1894753487514859265 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 -3 - rotation: 89.8775740189356 41.102202455554846 59.11297506328362 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_375" - uuid: 7225436347933177536 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 0 - rotation: 138.94086259415408 134.9301083554377 56.1716749369429 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_376" - uuid: 5324838764763062274 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 3 - rotation: 134.3047077246898 52.590950014746014 135.76477638406703 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_377" - uuid: 9745175506646535750 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 6 - rotation: 54.179837028083746 136.46308144037985 55.6901913002608 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_378" - uuid: 9563180798242957103 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 9 - rotation: 120.68017147953542 85.02138571091342 138.84424024869708 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_379" - uuid: 2672713223678547783 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 12 - rotation: 34.15326021582777 144.29030839614933 84.39270415706511 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_380" - uuid: 1971545402562247114 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 15 - rotation: 68.36714719695601 83.07298030382847 31.91815090903176 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_381" - uuid: 7096302034865732609 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 18 - rotation: 116.29311966300014 27.824339756279638 150.27145848651332 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_382" - uuid: 2426616850286357417 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 21 - rotation: 106.51076424150139 40.69866667483693 13.699129149523193 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_383" - uuid: 1394629183227121241 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 24 - rotation: 135.5067145000836 30.747692959609424 95.7551761053146 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_384" - uuid: 6061299531367384481 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 27 - rotation: 132.0700594049825 97.47571823644677 52.031806029224065 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_385" - uuid: 3442082997862657927 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 30 - rotation: 47.750190025808635 58.85197327846568 102.75335638386564 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_386" - uuid: 7120328419335004572 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 33 - rotation: 38.93709538863258 110.81485777148923 108.03522887158043 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_387" - uuid: 1048577500682683201 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 36 - rotation: 43.10819603813456 60.46067978784098 85.93440135521936 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_388" - uuid: 7428757191719987171 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 39 - rotation: 141.06092686011374 103.15812896798457 23.33482087738841 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_389" - uuid: 5334914806714133792 - parent: 13626177115197044525 - type: Object - transform: - translation: -9 0 42 - rotation: 170.4157521929942 156.81682384938043 109.52176127869004 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_390" - uuid: 475715697288327367 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -45 - rotation: 169.84124646117203 27.016210705693982 40.58974377295446 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_391" - uuid: 7712794306137902632 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -42 - rotation: 12.38167643299835 95.45633044969279 122.0689306432971 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_392" - uuid: 9066423417797027488 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -39 - rotation: 1.761691865126136 89.25704074682646 79.50016887738731 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_393" - uuid: 5135574401003138029 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -36 - rotation: 140.78574618097477 126.79309162639669 41.946043030020824 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_394" - uuid: 1907457871673851691 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -33 - rotation: 162.1626620786962 2.0889723947912775 76.77771169326859 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_395" - uuid: 2343043063091315155 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -30 - rotation: 48.3547623365494 52.16117908817944 100.1595334719644 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_396" - uuid: 8910824215772379866 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -27 - rotation: 121.8331890350318 142.01316395416157 177.3823679060499 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_397" - uuid: 631553474474451567 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -24 - rotation: 104.88235214026751 147.06985891970086 126.52160304064923 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_398" - uuid: 1463011786684376491 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -21 - rotation: 144.68742561867433 126.29814430359308 64.67484275569568 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_399" - uuid: 629454116358518272 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -18 - rotation: 105.64121988105072 66.47791109426373 46.93603936787605 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_400" - uuid: 9968753137133791706 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -15 - rotation: 106.42737259783978 0.8937955661163599 12.927320108137511 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_401" - uuid: 1320831930153092198 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -12 - rotation: 80.05926955471871 30.41937878776931 178.8920670017767 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_402" - uuid: 6947953267723149104 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -9 - rotation: 33.850553237711395 158.24529035538387 18.375884089087513 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_403" - uuid: 1289887644029863089 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -6 - rotation: 130.02842463155298 53.669895879675444 119.54891560209221 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_404" - uuid: 9087571032271790348 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 -3 - rotation: 28.90426895172132 32.940977200905365 148.83080711909983 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_405" - uuid: 8059684204749072777 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 0 - rotation: 27.008113040553134 22.41833668974121 18.55735144503666 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_406" - uuid: 3077432524497476879 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 3 - rotation: 68.05309862268824 92.80602883943278 68.30375540684082 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_407" - uuid: 6642736189415609362 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 6 - rotation: 118.62467503879819 95.97552998521908 90.92197722816377 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_408" - uuid: 9229014851658166601 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 9 - rotation: 14.43300460128754 35.2254938356305 16.473994413517794 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_409" - uuid: 3431820521006511059 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 12 - rotation: 164.78880335421212 143.64412527553912 21.206366255289954 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_410" - uuid: 3629917278637329626 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 15 - rotation: 83.99078477950462 142.57090308557963 105.29884670331988 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_411" - uuid: 8611271035227551727 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 18 - rotation: 1.63170405740509 123.39679132978719 59.533607340949175 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_412" - uuid: 3154648690441098706 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 21 - rotation: 169.441218815258 93.21128938650423 84.56054157213379 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_413" - uuid: 6594369270855914880 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 24 - rotation: 11.337880571828364 83.0580197160457 142.41349914707268 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_414" - uuid: 4204180075052073832 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 27 - rotation: 131.3851999015761 40.63114869571628 86.36440057647793 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_415" - uuid: 6060083020185890961 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 30 - rotation: 67.2846488635633 143.77016816125678 123.00092399187255 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_416" - uuid: 774314371385995182 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 33 - rotation: 106.36025282381085 33.80595295257479 84.85315267799548 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_417" - uuid: 3615408948007173535 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 36 - rotation: 102.36220463314348 63.04188527115427 124.73335837781775 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_418" - uuid: 1212921287939528158 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 39 - rotation: 84.90621486884524 176.32973182111812 47.42984346923638 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_419" - uuid: 3940741000189413256 - parent: 13626177115197044525 - type: Object - transform: - translation: -6 0 42 - rotation: 19.132064247715807 59.9101597931868 133.75959382413487 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_420" - uuid: 7314554952989998787 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -45 - rotation: 69.27169828990016 86.24863894010846 155.4203800189988 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_421" - uuid: 9265748412429721154 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -42 - rotation: 157.6713469960065 133.5986742972814 40.57898072420473 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_422" - uuid: 1887671131642363437 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -39 - rotation: 136.75168781872057 100.86975133310271 30.666847342407 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_423" - uuid: 6353557970397682294 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -36 - rotation: 89.10857221053656 61.21609420809155 138.70105126359266 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_424" - uuid: 1896116630226263475 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -33 - rotation: 1.2749262589472954 34.48504729867226 163.8491619078983 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_425" - uuid: 5712119540589303773 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -30 - rotation: 103.76829788008538 6.985388869091764 137.6122343790093 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_426" - uuid: 8358576180139043550 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -27 - rotation: 116.56705573413389 155.1069341048807 74.63088143531313 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_427" - uuid: 2790727208399828408 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -24 - rotation: 61.78609922465517 93.79401264215907 106.51080221694492 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_428" - uuid: 7485259893084684883 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -21 - rotation: 50.37265881426736 73.36346449372766 172.25318274011664 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_429" - uuid: 6473630561447445843 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -18 - rotation: 33.80543275702034 157.32832049757735 60.08135793221798 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_430" - uuid: 8913919086169228448 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -15 - rotation: 117.22542397647736 153.6083984317398 18.9765138766858 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_431" - uuid: 1136607557165954540 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -12 - rotation: 35.37219415697037 166.90137890256705 42.94507060057062 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_432" - uuid: 6444627519630829012 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -9 - rotation: 124.5964337830018 87.77283671585002 47.06911746382094 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_433" - uuid: 3781145613004563831 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -6 - rotation: 108.75138104965772 179.4947388468902 146.24865747036898 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_434" - uuid: 7979393808914149860 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 -3 - rotation: 16.566076537885923 100.20804328103107 117.94882830692369 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_435" - uuid: 523192283117733227 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 0 - rotation: 91.13970457888509 21.046628530226034 132.46991924282216 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_436" - uuid: 4634126924627727651 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 3 - rotation: 19.51286001680388 77.17335141696948 116.0031148479723 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_437" - uuid: 7715603015240204185 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 6 - rotation: 94.24886549850048 164.33021800949027 160.30407785352196 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_438" - uuid: 8530103296536761285 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 9 - rotation: 91.77257250945509 104.49139807183239 79.8007701863005 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_439" - uuid: 1965503951682745846 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 12 - rotation: 143.35985313459597 65.5613837689268 6.933965241518829 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_440" - uuid: 1679944002179973832 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 15 - rotation: 115.252862425919 162.7779602999442 146.70937586879347 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_441" - uuid: 8730877524909255849 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 18 - rotation: 125.22444733574943 29.324625945407927 73.2771747731774 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_442" - uuid: 7030275978453964360 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 21 - rotation: 87.43360559894231 50.03513233030796 173.80570712207907 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_443" - uuid: 3967692900061220976 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 24 - rotation: 89.6782811658666 100.0951759633603 27.562760395122176 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_444" - uuid: 258704863971585377 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 27 - rotation: 122.52855062807642 111.03352035046578 118.3598693547785 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_445" - uuid: 2212727793650726708 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 30 - rotation: 18.696714826557645 3.6421870994611227 78.40157979832576 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_446" - uuid: 8190581745127827837 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 33 - rotation: 41.88094952358131 147.60151506167605 19.831126473611565 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_447" - uuid: 5738864889729142004 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 36 - rotation: 22.183947207838987 139.06190681721753 32.31684244090108 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_448" - uuid: 4863448590434495255 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 39 - rotation: 151.6449318684626 148.7191236857431 91.50379013276712 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_449" - uuid: 5323867742323691714 - parent: 13626177115197044525 - type: Object - transform: - translation: -3 0 42 - rotation: 75.26500493464064 177.12841860836033 122.6253420819074 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_450" - uuid: 7657781373951439186 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -45 - rotation: 56.667464843859456 124.19883213987919 114.26381668429627 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_451" - uuid: 5544324047177383926 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -42 - rotation: 144.2708285639572 67.60811805141691 106.7225656775256 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_452" - uuid: 2174003892973908966 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -39 - rotation: 144.68243292332625 15.329229537969635 35.68257946699569 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_453" - uuid: 6004070391341557204 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -36 - rotation: 144.89406136984368 97.9971155356271 179.08730266104607 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_454" - uuid: 2275012678982509691 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -33 - rotation: 102.34462795205323 13.26088686453167 141.5339750957553 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_455" - uuid: 9211662983081844347 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -30 - rotation: 47.15475136685336 39.930001522641014 133.86686874648592 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_456" - uuid: 1781966187038780907 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -27 - rotation: 102.41678771849551 57.86574776441016 105.23810068281793 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_457" - uuid: 731931422182772790 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -24 - rotation: 128.15996028607125 4.819942682913365 170.3960716617141 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_458" - uuid: 1453549239172565228 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -21 - rotation: 23.949747541895107 20.473434442077362 172.89454757155403 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_459" - uuid: 3514705108476734743 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -18 - rotation: 104.26321300858316 57.478081736758675 172.79334282143475 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_460" - uuid: 4099478632937713368 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -15 - rotation: 149.9914560744527 178.5920021074859 104.61470696468112 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_461" - uuid: 2192882856602964442 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -12 - rotation: 145.983275454251 139.19706364555293 177.3821324233662 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_462" - uuid: 1068847793960960870 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -9 - rotation: 1.2014146738707154 55.42000093024012 113.1677835037201 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_463" - uuid: 8663511218988168818 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -6 - rotation: 111.63295596718658 90.26623626579836 17.798786376703546 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_464" - uuid: 7110285177857268638 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 -3 - rotation: 27.25187372217694 40.728246844282985 5.004995053886536 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_465" - uuid: 7519118231583164404 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 0 - rotation: 84.52289097325551 51.653510336255756 131.66226720415114 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_466" - uuid: 7882729399550269611 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 3 - rotation: 86.51613440649699 86.89714983454351 144.56572480031815 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_467" - uuid: 8271501239344438684 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 6 - rotation: 155.1717282143036 156.20834050975182 52.524013197505596 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_468" - uuid: 4933845506362186103 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 9 - rotation: 1.2620190124128783 77.61175544386026 169.8064836599717 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_469" - uuid: 8183942213937296248 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 12 - rotation: 58.77852766236765 105.97889602498782 116.70981608861194 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_470" - uuid: 7159022549419554463 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 15 - rotation: 30.678960165662915 39.94326092606468 39.10761242648275 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_471" - uuid: 6274845123866556706 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 18 - rotation: 126.41151388865204 1.4154857697251821 15.628672321604354 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_472" - uuid: 8414051435214800982 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 21 - rotation: 115.31492098144807 9.523223935021763 0.4965209592362618 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_473" - uuid: 5778657261946143160 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 24 - rotation: 179.6092295303082 93.44910280905842 123.3977485502964 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_474" - uuid: 5659801621022084485 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 27 - rotation: 160.21255886066632 64.18522969391282 67.67006150108908 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_475" - uuid: 1367365302664457669 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 30 - rotation: 54.30313666795632 130.23935106911415 171.0713696803154 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_476" - uuid: 4477677451174262502 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 33 - rotation: 92.36528486562963 13.549477699227808 93.6841411558801 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_477" - uuid: 2396400043865874254 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 36 - rotation: 146.99514200159126 128.351585760441 135.46171203969678 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_478" - uuid: 4939584301624637766 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 39 - rotation: 79.2765381499826 144.5624148636488 45.793257293640494 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_479" - uuid: 5841776650809970355 - parent: 13626177115197044525 - type: Object - transform: - translation: 0 0 42 - rotation: 70.66748748307803 176.3569114422782 100.94925295443797 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_480" - uuid: 7216896359679174693 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -45 - rotation: 171.52852385556227 93.78584478594274 173.76515080251752 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_481" - uuid: 4476557866490497960 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -42 - rotation: 174.42998945008907 99.65775384303058 160.57700216746088 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_482" - uuid: 9897536483539802698 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -39 - rotation: 106.27117818405205 66.57629055534386 145.85722604649678 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_483" - uuid: 2697359246644737322 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -36 - rotation: 136.0116626440256 93.00262965803805 97.95542461088233 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_484" - uuid: 2303161359629784069 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -33 - rotation: 147.1548159035731 19.01174748430132 74.04810629056672 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_485" - uuid: 2476076984114008564 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -30 - rotation: 167.19615256681456 159.5906649745989 172.91913077616246 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_486" - uuid: 2591858942902650708 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -27 - rotation: 122.680885421453 144.2587992671542 97.43752451569914 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_487" - uuid: 3689590845872467378 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -24 - rotation: 20.054622012092896 162.64756734628548 121.42692363331477 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_488" - uuid: 8752329930145715703 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -21 - rotation: 37.592537443500234 108.55604211085313 48.11250442585405 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_489" - uuid: 4005813742513550360 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -18 - rotation: 106.04924766921279 31.38503533367424 134.15789104743655 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_490" - uuid: 5821549119101234244 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -15 - rotation: 89.06005711795231 136.37711718228715 148.04472305663984 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_491" - uuid: 8078620145770066482 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -12 - rotation: 91.64792893878432 44.67255078841447 48.72582248139743 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_492" - uuid: 6512249342467146496 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -9 - rotation: 98.01747191195052 29.386086927360918 103.0677524999899 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_493" - uuid: 7879427873312048482 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -6 - rotation: 177.53509061847186 26.310793358974117 68.43553778434355 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_494" - uuid: 4827271490905832869 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 -3 - rotation: 68.15031346403659 148.8367047795147 68.53349194268264 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_495" - uuid: 7539200819766724498 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 0 - rotation: 75.37318297590866 27.61722730538866 34.78676046631064 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_496" - uuid: 8087691819525246165 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 3 - rotation: 58.16773717105467 153.2684204252161 143.2626193912809 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_497" - uuid: 9472188047652921583 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 6 - rotation: 97.95605886805299 158.9601327071189 71.83399937394547 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_498" - uuid: 9124630592830042820 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 9 - rotation: 60.3751761688397 44.78004208217242 142.23241343817736 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_499" - uuid: 8196007829038258963 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 12 - rotation: 33.4421431818961 22.75464746035032 177.5961933021529 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_500" - uuid: 4299345717071950318 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 15 - rotation: 145.66877828913917 164.25767929602833 166.92472210851872 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_501" - uuid: 2555118193223890128 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 18 - rotation: 86.31229136946132 129.6383218158279 7.899865925533486 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_502" - uuid: 2179534134245485954 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 21 - rotation: 7.425609913041793 77.18612335246263 14.189652198813045 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_503" - uuid: 3968869560849785833 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 24 - rotation: 108.20098148736105 2.0295903802576043 5.457119954161902 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_504" - uuid: 5499542923294728222 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 27 - rotation: 148.54620059822142 177.5902202689997 79.62587625546239 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_505" - uuid: 6240934173200635371 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 30 - rotation: 177.60148838739195 60.28998008592004 29.133400094917967 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_506" - uuid: 2658121209640638170 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 33 - rotation: 43.62331559684341 154.95929679042715 141.31795739882813 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_507" - uuid: 3663475178225093239 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 36 - rotation: 88.06163681265598 106.98091086120263 8.749805167863105 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_508" - uuid: 7221811101132136917 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 39 - rotation: 163.78796342248657 145.8293636642891 132.08273027398064 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_509" - uuid: 1976611872953845187 - parent: 13626177115197044525 - type: Object - transform: - translation: 3 0 42 - rotation: 56.19770531562818 161.71357673905803 116.39895583800734 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_510" - uuid: 7362291545455669555 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -45 - rotation: 30.724492858560684 27.82422593612949 120.00395198476433 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_511" - uuid: 4880303447339938644 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -42 - rotation: 159.5200951301614 5.364987122245073 84.12206718458805 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_512" - uuid: 8769303790565549790 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -39 - rotation: 173.65524818724649 165.0039141163101 15.293042421122783 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_513" - uuid: 384717632299245399 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -36 - rotation: 142.88013388472652 173.6943467440314 78.12399626101195 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_514" - uuid: 3941790314330824030 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -33 - rotation: 130.50771221951408 161.7083567053509 172.6002971949232 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_515" - uuid: 8759880278426576469 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -30 - rotation: 151.33087339929273 31.128477342288686 118.8046373225749 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_516" - uuid: 9211470803638380301 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -27 - rotation: 121.12301074827259 18.132161268338066 58.51577517833415 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_517" - uuid: 5879210531771163126 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -24 - rotation: 89.42258524089887 39.502169918935635 168.41449791689243 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_518" - uuid: 5043077172032917565 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -21 - rotation: 61.6194379274557 95.97913517780505 47.07675619596655 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_519" - uuid: 2199657288310701151 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -18 - rotation: 93.99543469370673 18.630229771933706 6.693607852142582 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_520" - uuid: 1025315220982762071 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -15 - rotation: 54.90788288369225 45.929187703578734 75.1845292136543 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_521" - uuid: 9194209911677403864 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -12 - rotation: 125.67632933720162 11.700918824748037 81.97603190234234 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_522" - uuid: 222641985417169417 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -9 - rotation: 150.80191774629472 19.169658705163254 178.70263243959937 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_523" - uuid: 7919347194779613166 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -6 - rotation: 90.6699555522669 175.76169707465704 80.20938495391711 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_524" - uuid: 7409146670033569561 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 -3 - rotation: 61.83744045482374 85.57525904779718 39.39049399118374 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_525" - uuid: 4994446485494853510 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 0 - rotation: 85.04079730436365 168.60350271249786 167.38508409445268 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_526" - uuid: 4542723246486864944 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 3 - rotation: 94.62887120013396 53.90149499977131 88.42249651138546 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_527" - uuid: 6910380645675071701 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 6 - rotation: 36.50782222882234 58.56316157409059 168.48718293580535 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_528" - uuid: 2499258564773320988 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 9 - rotation: 18.316140522547425 27.71862629171618 147.88386991734754 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_529" - uuid: 1601234683501986334 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 12 - rotation: 24.322560490864586 73.87436956727034 151.61502570715163 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_530" - uuid: 1679313229989367365 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 15 - rotation: 137.90356924132652 81.04980723736193 137.11087863427022 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_531" - uuid: 8947173013871951182 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 18 - rotation: 134.06424227586763 131.40057090263687 4.7110549697941035 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_532" - uuid: 4443143974177802719 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 21 - rotation: 13.93815675611841 0.6133719646431857 108.93447408509172 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_533" - uuid: 5315083960373093391 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 24 - rotation: 50.1771367751143 77.02888824272229 166.2793871621482 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_534" - uuid: 1592952419090813098 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 27 - rotation: 18.390173227912747 62.176703068574334 161.3396023588822 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_535" - uuid: 6909308441035982489 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 30 - rotation: 104.01139353404736 129.03166170618798 133.98039433777436 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_536" - uuid: 6087757622174141830 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 33 - rotation: 48.05526590015051 85.35371599602828 80.20621668904195 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_537" - uuid: 2476040709497514752 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 36 - rotation: 118.49901657351666 20.488643799977517 80.99083942740424 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_538" - uuid: 5573167746329116138 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 39 - rotation: 81.06505843920297 44.897696414938984 45.07646426658358 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_539" - uuid: 5833615225581445839 - parent: 13626177115197044525 - type: Object - transform: - translation: 6 0 42 - rotation: 115.01450441684408 77.08407684932091 42.43888386791076 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_540" - uuid: 6463628458208167320 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -45 - rotation: 157.17424566264518 100.28384635828988 16.52137937387777 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_541" - uuid: 4017982658022823444 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -42 - rotation: 158.64548117884107 2.435103534478056 20.818448839464047 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_542" - uuid: 7631956621025659732 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -39 - rotation: 60.904583054385505 90.72140196544893 11.671917243227972 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_543" - uuid: 4383838714965333669 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -36 - rotation: 178.47210996848096 162.0046342929608 3.490469992458074 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_544" - uuid: 3836059558404586492 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -33 - rotation: 104.58501561440309 87.78094457832124 30.962543932008437 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_545" - uuid: 8026016048381367420 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -30 - rotation: 35.19415557285291 23.108507636069486 175.78966201282424 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_546" - uuid: 54807089935863508 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -27 - rotation: 137.96640828881507 87.32366869013283 143.51048482894367 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_547" - uuid: 920371689494106680 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -24 - rotation: 139.8617316949717 126.74770358376777 77.72154708062709 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_548" - uuid: 8528462939173575880 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -21 - rotation: 99.26556713503524 96.73109244384973 139.88034511967194 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_549" - uuid: 7562289956594160725 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -18 - rotation: 148.4653736960273 119.71756136011467 138.6374415671424 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_550" - uuid: 6403588233262431806 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -15 - rotation: 20.39274213666486 80.51491057179183 1.2374848631460433 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_551" - uuid: 5955443837117711898 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -12 - rotation: 134.9908058853847 115.72781521172297 3.13301413093942 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_552" - uuid: 9754118828200221571 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -9 - rotation: 129.84889283129888 116.03885895528859 114.3457546587759 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_553" - uuid: 745925549403729355 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -6 - rotation: 153.94139148504019 84.9491776251186 101.01176847039522 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_554" - uuid: 2462236554076890125 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 -3 - rotation: 28.1561550823304 8.808428557173558 13.35102881162802 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_555" - uuid: 5903236275477220577 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 0 - rotation: 144.75956142027619 85.5888913635841 162.08317579834406 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_556" - uuid: 8883183159730546863 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 3 - rotation: 167.2997906496 37.633510635328676 176.9047527236828 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_557" - uuid: 3263166110591168181 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 6 - rotation: 112.05581686661273 161.37070358401434 92.50924856372902 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_558" - uuid: 1910740877077150171 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 9 - rotation: 92.65359691721058 158.60636973218394 50.188809652390105 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_559" - uuid: 1770059134561352148 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 12 - rotation: 19.650168523442435 28.158989909754364 55.03595404030793 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_560" - uuid: 2458926595449707056 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 15 - rotation: 66.77874656433109 117.71791332488804 14.72598470261741 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_561" - uuid: 3594044976189008154 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 18 - rotation: 138.6391244700904 2.297574955826569 172.9287211029142 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_562" - uuid: 3836256724790784164 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 21 - rotation: 73.95425502500518 139.1501515980473 146.86051644360913 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_563" - uuid: 7603538299573890473 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 24 - rotation: 176.39597974091265 73.15400647728042 121.08021304333091 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_564" - uuid: 1495163828196074502 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 27 - rotation: 93.10606638775778 8.831489474880108 109.58977852337983 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_565" - uuid: 495335430688628252 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 30 - rotation: 28.645201268999156 94.64078806388919 140.3403892010029 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_566" - uuid: 540850622264898611 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 33 - rotation: 72.60218922294081 35.33186471736098 30.368388699972655 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_567" - uuid: 657072015193477742 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 36 - rotation: 29.21673644238117 90.9656944033786 42.88674639390298 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_568" - uuid: 4647481590517365553 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 39 - rotation: 127.22223128475629 96.39731292857262 134.25264855984773 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_569" - uuid: 7270858869070116660 - parent: 13626177115197044525 - type: Object - transform: - translation: 9 0 42 - rotation: 117.49520610734434 60.333833103504894 51.25448824418331 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_570" - uuid: 3271205580263323341 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -45 - rotation: 15.989469865318124 171.92437900840775 119.00706961564116 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_571" - uuid: 6944888929057679651 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -42 - rotation: 118.60416639578324 128.16274828394648 0.021896171297548506 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_572" - uuid: 5028526099037276427 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -39 - rotation: 141.4193919012263 105.43986095498059 125.05748119212386 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_573" - uuid: 7376890867970692582 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -36 - rotation: 130.53223058651838 20.173271562553406 14.047793009625885 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_574" - uuid: 4371578685159760173 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -33 - rotation: 42.7159061529243 101.6097232253279 57.49598390179284 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_575" - uuid: 4071807440597816677 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -30 - rotation: 45.130491114256394 149.06597344432004 177.9624420016226 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_576" - uuid: 450833549977338565 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -27 - rotation: 42.294344960535355 119.48429698663516 117.60944319585656 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_577" - uuid: 714391785965580637 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -24 - rotation: 123.46648375632755 54.7200415113811 84.7794188355768 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_578" - uuid: 8654659472995848629 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -21 - rotation: 161.86421121342258 113.83886167252548 49.2496644909294 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_579" - uuid: 3297676524330647288 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -18 - rotation: 38.77528155378433 11.593963123506796 42.52321361892309 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_580" - uuid: 7560805410543147663 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -15 - rotation: 101.18507264884764 130.75862217313514 160.84298052194018 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_581" - uuid: 9096272683012604500 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -12 - rotation: 58.28990341561898 147.40087757167416 106.10851991701901 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_582" - uuid: 6700701266247717438 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -9 - rotation: 61.55550727902467 110.98611869672997 123.27841932056936 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_583" - uuid: 9783090103571845192 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -6 - rotation: 48.81256583717591 5.543761901846256 124.0885619443836 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_584" - uuid: 6250914563264352860 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 -3 - rotation: 68.62068111434453 51.323804445416634 4.129315597312136 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_585" - uuid: 4163840685173635820 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 0 - rotation: 132.02866061102267 76.28266892418516 12.827086670844022 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_586" - uuid: 6308355728452534219 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 3 - rotation: 91.51218335004484 18.492107200394045 66.41702397476911 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_587" - uuid: 3535172102441656989 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 6 - rotation: 48.173283852889256 125.21131178794492 158.57330959308857 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_588" - uuid: 1041801816890193467 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 9 - rotation: 141.05254957616313 170.2006229272594 158.71746747718444 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_589" - uuid: 2947247610118369487 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 12 - rotation: 1.2811240315698935 58.654748621819735 107.62799249905608 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_590" - uuid: 3693668973670588259 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 15 - rotation: 52.98152506198817 121.15427088879107 46.03843727787026 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_591" - uuid: 6521205344777722052 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 18 - rotation: 112.39786866974113 160.88032906153904 166.45555324323436 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_592" - uuid: 8384903671032448945 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 21 - rotation: 65.15662577270682 75.17043381569155 92.8808789620787 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_593" - uuid: 5967298102557208186 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 24 - rotation: 137.36313005839625 101.40465490532229 108.7550265763352 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_594" - uuid: 3606580426657927626 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 27 - rotation: 155.847051531851 135.573220387284 46.63575583591951 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_595" - uuid: 924600094325638862 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 30 - rotation: 20.176514838501753 71.57770354082996 100.77976091802756 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_596" - uuid: 2372307595317366315 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 33 - rotation: 115.28590945656848 67.19697459512768 87.79099217266106 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_597" - uuid: 9936655565656287502 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 36 - rotation: 8.32272715549578 84.1063470329562 114.62120806569702 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_598" - uuid: 816376716266897051 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 39 - rotation: 80.90260787010968 62.53782231596778 120.80083282956645 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_599" - uuid: 9579766663153115207 - parent: 13626177115197044525 - type: Object - transform: - translation: 12 0 42 - rotation: 136.32661516876422 114.61628399213699 163.42619249156613 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_600" - uuid: 7018596018241143163 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -45 - rotation: 55.48714632858343 146.3729660816884 127.65749911041044 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_601" - uuid: 5181033472417259792 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -42 - rotation: 87.06506687101452 29.966477254467776 93.71731838628503 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_602" - uuid: 9704708368443330592 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -39 - rotation: 11.736320055976329 168.7325800619328 136.58534721474126 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_603" - uuid: 1119599183281579504 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -36 - rotation: 83.67566139898467 158.88545666973837 32.24192002446712 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_604" - uuid: 7500234214796750110 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -33 - rotation: 101.52301293356744 52.524991317976195 98.19090630729063 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_605" - uuid: 5769612651992128121 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -30 - rotation: 170.34932446446751 61.3963352171166 69.79084251191784 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_606" - uuid: 7656968759287681716 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -27 - rotation: 14.919948275552517 107.72518034805694 19.179578326097378 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_607" - uuid: 4143085256602993518 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -24 - rotation: 82.77071311208104 8.102709751332206 131.52092569103127 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_608" - uuid: 7597235925997153093 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -21 - rotation: 169.15499990370066 53.62796305371961 28.047650266108388 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_609" - uuid: 6022521569650906480 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -18 - rotation: 138.7846086559033 153.03692932451548 73.07367395320986 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_610" - uuid: 9423164234873515314 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -15 - rotation: 134.25830891888586 24.58151882004649 140.83926805212897 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_611" - uuid: 205382858543591479 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -12 - rotation: 155.9915285702846 36.68866716401134 102.84351626239983 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_612" - uuid: 5340491819540992266 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -9 - rotation: 170.86525973783935 107.78678640682399 23.93042063733572 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_613" - uuid: 1575521459502971727 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -6 - rotation: 157.9114940195211 103.10140359272661 25.79837093052368 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_614" - uuid: 2318926608382957071 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 -3 - rotation: 33.465567003275126 152.74665665023187 131.9154041692458 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_615" - uuid: 7815676738370056534 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 0 - rotation: 8.454251029112784 8.508062241027694 118.15122246513236 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_616" - uuid: 1873910402158518572 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 3 - rotation: 78.38568876823486 123.04777343831634 100.75947131576076 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_617" - uuid: 2486220430952820819 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 6 - rotation: 19.284547391525603 105.38267652199272 11.35296735065203 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_618" - uuid: 6954038851685423161 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 9 - rotation: 15.773736083290435 45.57630921067342 155.3801132227683 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_619" - uuid: 9579020921357952400 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 12 - rotation: 53.91808614385416 3.569041655775569 63.27160799021618 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_620" - uuid: 8173962863594221621 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 15 - rotation: 108.17885529513656 96.82488392127388 34.21395337011923 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_621" - uuid: 1606066976251649264 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 18 - rotation: 114.27914568211285 56.40146871744265 36.39506252577046 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_622" - uuid: 4935841038971995959 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 21 - rotation: 58.334197947248654 156.01236954629763 103.54878810363577 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_623" - uuid: 1052763091657594463 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 24 - rotation: 55.10413557005321 33.93405347582463 29.280317990117272 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_624" - uuid: 2514383720996957461 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 27 - rotation: 118.40786225450502 117.72241614324567 65.2656793773702 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_625" - uuid: 7006703323599410685 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 30 - rotation: 26.43729487465305 116.80216002114973 126.42296418600891 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_626" - uuid: 7230354547381394973 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 33 - rotation: 99.32820241906755 161.55351689246993 21.69839798740999 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_627" - uuid: 3185774350109560178 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 36 - rotation: 127.69757353096122 9.205118300812938 63.26053090060536 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_628" - uuid: 7833448239232535113 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 39 - rotation: 93.58675193272927 136.07319787000554 99.75681250379873 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_629" - uuid: 9608960031926121693 - parent: 13626177115197044525 - type: Object - transform: - translation: 15 0 42 - rotation: 119.30067367144748 136.77050376472494 90.239188287706 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_630" - uuid: 8714466957026973125 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -45 - rotation: 126.52066880437138 35.33788759575612 79.89728994327561 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_631" - uuid: 7349450183258254397 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -42 - rotation: 35.093599566351834 125.95086652161575 167.87159235097772 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_632" - uuid: 1166377030980249606 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -39 - rotation: 116.8643166871129 43.085674939762384 81.56892385155074 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_633" - uuid: 2672467340429615909 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -36 - rotation: 120.90187927621494 36.81219812284273 42.65413618675181 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_634" - uuid: 6880057984696683743 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -33 - rotation: 71.42437661839568 78.58967402612632 153.54278361210157 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_635" - uuid: 581910786301033480 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -30 - rotation: 58.336623629037824 107.17168564498932 92.04240587326655 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_636" - uuid: 9570766306735166951 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -27 - rotation: 10.144699769004891 174.87475670704822 139.37732968460466 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_637" - uuid: 3282676389017701281 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -24 - rotation: 142.87224597176711 98.17744540535696 68.23657202922999 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_638" - uuid: 5387885818082526369 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -21 - rotation: 56.21398010444486 102.35013089902118 96.52698837518608 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_639" - uuid: 4836207850874479325 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -18 - rotation: 72.09761093464121 122.02336646115748 44.49753499909413 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_640" - uuid: 9344064527040386515 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -15 - rotation: 5.798477227042618 179.62293708404633 39.96127124252167 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_641" - uuid: 2960604649358100320 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -12 - rotation: 54.65241636180324 169.35645276818033 108.957522227183 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_642" - uuid: 983838577030294358 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -9 - rotation: 64.1698440544666 41.60150351961496 98.37193282935505 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_643" - uuid: 3923642752553689411 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -6 - rotation: 17.506350743017805 126.82417480082091 132.661703787195 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_644" - uuid: 5268430922785406633 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 -3 - rotation: 99.76003164148145 160.31661706676593 64.87415415289685 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_645" - uuid: 5002010828231672901 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 0 - rotation: 163.9289321180958 49.15567478888773 61.3195336954109 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_646" - uuid: 5899486141929123629 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 3 - rotation: 173.2608381521253 129.96850226343855 119.47769739400486 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_647" - uuid: 6964586349409900884 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 6 - rotation: 15.208626094027514 144.39594972126682 176.65048980504335 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_648" - uuid: 1221410241618982704 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 9 - rotation: 38.79515527780705 114.59731973316228 123.66201028524314 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_649" - uuid: 607682685279729307 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 12 - rotation: 176.43565546665897 118.53933719071676 157.38720663352555 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_650" - uuid: 792926465363937494 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 15 - rotation: 88.31988106206808 161.88880375571924 44.67433447441465 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_651" - uuid: 6226283754814709519 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 18 - rotation: 24.211409169755797 176.1573332299287 55.96705276023732 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_652" - uuid: 6959053050767259928 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 21 - rotation: 2.5941721956748665 110.39124752481703 13.485376064117101 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_653" - uuid: 113572010863264529 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 24 - rotation: 174.9490824882825 19.721573085289364 117.87022204198357 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_654" - uuid: 6543664781582775202 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 27 - rotation: 128.9725230801845 116.12478610915386 119.94306169653278 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_655" - uuid: 27007614700774388 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 30 - rotation: 151.2396280905675 110.24102165107652 9.770729195361149 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_656" - uuid: 8798118726537781005 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 33 - rotation: 172.80801882884884 121.60224030474714 98.62783332227771 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_657" - uuid: 956539436447398975 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 36 - rotation: 33.16200441443122 162.64792639387656 144.2962550191321 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_658" - uuid: 8010779143776610077 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 39 - rotation: 109.6272207543757 159.51699786212782 66.22926492077734 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_659" - uuid: 5482551341678895852 - parent: 13626177115197044525 - type: Object - transform: - translation: 18 0 42 - rotation: 168.51799212583933 116.33055378253925 179.25083907336818 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_660" - uuid: 4858387148194945098 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -45 - rotation: 163.0793325209551 141.9948272893917 175.71444702468528 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_661" - uuid: 6938969723539208460 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -42 - rotation: 38.8492719504375 35.36734272568649 75.63884671701491 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_662" - uuid: 5622234004586894991 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -39 - rotation: 15.990193430045817 107.03965430795047 138.46218907900115 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_663" - uuid: 8888050498400231992 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -36 - rotation: 85.50172166410994 99.40915469136026 54.21800393039688 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_664" - uuid: 9963974982682147498 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -33 - rotation: 169.67393504038748 177.93328323766193 61.091589030170695 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_665" - uuid: 2391465678752504400 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -30 - rotation: 10.260385642644707 54.972949217535835 68.51714080123348 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_666" - uuid: 6011484161786751652 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -27 - rotation: 69.41780313188616 85.67870129706279 48.16584671773094 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_667" - uuid: 7548537608442737571 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -24 - rotation: 64.3314336979607 34.87463192953763 23.608309353779457 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_668" - uuid: 8365369481267318314 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -21 - rotation: 98.05325642479156 92.44414877254017 45.15074209004076 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_669" - uuid: 6255366191396069628 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -18 - rotation: 133.10351679420867 46.58270895688293 6.768398408053362 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_670" - uuid: 5801833758261149262 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -15 - rotation: 46.2929090806086 15.677722639210875 18.243088492215346 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_671" - uuid: 3881202566166697202 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -12 - rotation: 29.42581305552595 118.28981081844806 133.0231970056247 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_672" - uuid: 7696750652831409280 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -9 - rotation: 25.39585504065598 36.22668601861295 175.28334364206356 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_673" - uuid: 5928800618560408671 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -6 - rotation: 123.70153710765321 78.31754185182453 149.4084505190638 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_674" - uuid: 2755893718825609463 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 -3 - rotation: 38.29913071799361 168.24895084727243 89.81940986777904 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_675" - uuid: 8725076005360178206 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 0 - rotation: 74.70186907233703 122.09695408517408 25.734883479329 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_676" - uuid: 7734698509434270532 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 3 - rotation: 141.79277733577214 72.41484660361775 155.88362389905396 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_677" - uuid: 1166507587439221435 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 6 - rotation: 41.71234258137056 139.79968117769198 163.5372432777202 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_678" - uuid: 2632119800277240401 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 9 - rotation: 77.88548472857025 166.85704844337218 115.38134053621674 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_679" - uuid: 717970467407167972 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 12 - rotation: 3.8317630043740203 77.75696213655999 176.6116842689731 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_680" - uuid: 8363274866710621962 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 15 - rotation: 179.78292568408162 118.02338280904833 35.55177476585926 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_681" - uuid: 5821935917356056974 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 18 - rotation: 31.140854706784275 38.373790256440834 88.50192709864086 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_682" - uuid: 8098791942019077963 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 21 - rotation: 88.84339342574765 71.7310892312573 22.357600828839264 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_683" - uuid: 3797333536065106257 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 24 - rotation: 110.62362333015436 166.08325549014418 116.25094383228276 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_684" - uuid: 7656377913957410758 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 27 - rotation: 176.66899278755776 40.58844256546175 81.6710618542077 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_685" - uuid: 2349618818691588112 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 30 - rotation: 104.33942109910687 120.02754671820846 103.07812789650343 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_686" - uuid: 8183275049986317585 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 33 - rotation: 138.75876598712543 112.16476162896298 164.79836278489498 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_687" - uuid: 5124035602805116454 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 36 - rotation: 101.82794914909775 52.90852778746706 27.205238817896266 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_688" - uuid: 8984890371067653335 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 39 - rotation: 178.94665508376764 57.52767107588318 39.0375852578322 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_689" - uuid: 9035726618113320732 - parent: 13626177115197044525 - type: Object - transform: - translation: 21 0 42 - rotation: 172.3710164325611 149.50956323246098 97.25948578176015 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_690" - uuid: 3376778150740484089 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -45 - rotation: 164.34643685579508 50.229156200366205 52.159842113967095 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_691" - uuid: 4953503694429982394 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -42 - rotation: 63.80365969384509 107.08321023290328 42.09301214266941 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_692" - uuid: 7187022134699533358 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -39 - rotation: 71.06468219133349 27.549056013671564 111.15615559224561 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_693" - uuid: 2519494638583719208 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -36 - rotation: 134.58769029256356 40.80336139649999 37.608115576137614 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_694" - uuid: 8483699927788640430 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -33 - rotation: 8.107356323720524 167.23406961678594 134.1497192886794 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_695" - uuid: 2235714072810032258 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -30 - rotation: 104.26745776397888 103.09395910248139 165.36548902219417 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_696" - uuid: 4897092928609222993 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -27 - rotation: 60.23105880162983 161.92090805563484 111.68660553839133 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_697" - uuid: 7487973570927816521 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -24 - rotation: 22.89499462792908 68.53636577336681 25.159831143020043 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_698" - uuid: 9498313731511890736 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -21 - rotation: 21.736376752465656 112.50201741168429 129.61085631731473 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_699" - uuid: 1108792325610728532 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -18 - rotation: 18.583295577596758 84.33387744014395 117.86117172835903 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_700" - uuid: 9124819627596150396 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -15 - rotation: 163.4290089236441 22.280849368879107 98.49656923894291 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_701" - uuid: 1945639336891804511 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -12 - rotation: 52.52282219518192 30.327687065082845 22.86688653878818 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_702" - uuid: 4750140057575081451 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -9 - rotation: 91.44237613266827 38.759555049769524 151.6454631452431 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_703" - uuid: 2453775571687396351 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -6 - rotation: 11.481992242056213 82.1349626584813 36.642976229504555 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_704" - uuid: 2548214135888983830 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 -3 - rotation: 144.27656051306744 83.39486403539549 114.84736971204 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_705" - uuid: 6064968739890153428 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 0 - rotation: 22.584007363696383 104.61775123855064 159.2403369450192 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_706" - uuid: 4072460366118318087 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 3 - rotation: 154.5211541946412 86.98896726920353 135.0685991839815 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_707" - uuid: 6762934951299039902 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 6 - rotation: 122.08049155495505 33.46335647316868 60.973007153323 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_708" - uuid: 8089799793014177034 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 9 - rotation: 108.85368309958275 56.667525071908464 73.6756504083828 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_709" - uuid: 7364670720727466348 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 12 - rotation: 52.72414838836406 27.04945365637635 66.80752699867168 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_710" - uuid: 8471159549108192938 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 15 - rotation: 31.52065203819218 131.02622159011466 72.31705552097158 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_711" - uuid: 4215147883771670232 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 18 - rotation: 44.5983923443179 166.54916581081795 120.14697895770871 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_712" - uuid: 4668094019997411725 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 21 - rotation: 105.3542718272293 55.88040352794757 57.17622945102255 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_713" - uuid: 2151859686868125585 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 24 - rotation: 174.7648735760372 86.96220292334515 164.8317941501899 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_714" - uuid: 9999644641216081059 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 27 - rotation: 178.89373071275855 22.93267583141087 112.92709953191057 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_715" - uuid: 4723362044799491641 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 30 - rotation: 137.26913562687565 134.42760496282853 68.87302108285584 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_716" - uuid: 9712935921669763158 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 33 - rotation: 34.05623755748369 162.5638514525781 12.67813828104172 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_717" - uuid: 2268724403436441934 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 36 - rotation: 91.1516361695507 30.972391714357 29.928467939389357 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_718" - uuid: 2454250024534368327 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 39 - rotation: 40.863445055221455 105.77634406328268 157.05751751281204 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_719" - uuid: 3835063564840116518 - parent: 13626177115197044525 - type: Object - transform: - translation: 24 0 42 - rotation: 58.149678577100524 100.88773935067692 115.16898808927415 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_720" - uuid: 3709163780021333672 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -45 - rotation: 148.18119802012535 64.89477669386623 51.34473248973586 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_721" - uuid: 4099145932269619628 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -42 - rotation: 141.35950777743474 51.0303194746093 10.195894143528761 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_722" - uuid: 9415948730145115034 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -39 - rotation: 23.366963572106542 113.91168235922756 31.81433061032742 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_723" - uuid: 5474420401707122570 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -36 - rotation: 122.8225692558914 49.55521021587485 106.99826571064 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_724" - uuid: 9648362336539708103 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -33 - rotation: 101.68941744137726 130.67227505846188 49.61303374071714 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_725" - uuid: 6507903192212134506 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -30 - rotation: 8.542467460297317 74.91705857418773 106.2937223045141 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_726" - uuid: 1212589164997419062 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -27 - rotation: 108.02244597863444 111.82934508389232 123.7844634716199 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_727" - uuid: 7936220361060713795 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -24 - rotation: 168.04936709837006 102.95871326523621 99.0630305794308 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_728" - uuid: 5106390462907953066 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -21 - rotation: 33.80236323278665 166.4172708753706 155.76699010297 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_729" - uuid: 3118288601419043539 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -18 - rotation: 26.43097322502044 10.387986132585372 71.11868830608597 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_730" - uuid: 7092010928001390195 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -15 - rotation: 66.22592600818405 78.89801761967473 152.17987163628732 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_731" - uuid: 908589156912753203 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -12 - rotation: 37.914522686862234 96.93937498315306 35.44629940003684 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_732" - uuid: 8054683045669619962 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -9 - rotation: 137.95286345626323 128.93943274127346 139.76272387916222 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_733" - uuid: 7897408150954193266 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -6 - rotation: 159.18499751320905 24.14871135347551 104.31263978483568 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_734" - uuid: 5464937193273244588 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 -3 - rotation: 56.68350605296375 40.63053496754853 10.887383091592149 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_735" - uuid: 340849517401553805 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 0 - rotation: 145.84263810974068 119.86490175241352 47.230381078805294 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_736" - uuid: 4181619144347727919 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 3 - rotation: 63.63373320245567 69.13339738348265 62.525081686128146 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_737" - uuid: 7176665118897315589 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 6 - rotation: 154.5393678843639 131.56325301785307 35.8493263267257 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_738" - uuid: 1601324037252886743 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 9 - rotation: 140.0719089018689 39.13415701869255 56.68324748653293 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_739" - uuid: 3894192754792660870 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 12 - rotation: 22.21277920340825 152.7389885981561 148.84624748498322 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_740" - uuid: 3785682946414434477 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 15 - rotation: 17.689106357985935 27.791748037432466 27.88216554444326 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_741" - uuid: 517358281024000982 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 18 - rotation: 50.19812317797608 71.03080742577852 72.04395313873526 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_742" - uuid: 2573962238490711526 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 21 - rotation: 68.56243209697494 19.25794118375501 153.15320397857528 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_743" - uuid: 6695293672173452857 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 24 - rotation: 143.60750012608494 74.77145145670791 123.87783949076699 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_744" - uuid: 320204199284073658 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 27 - rotation: 151.94568320274882 95.31629531363366 146.45144062027484 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_745" - uuid: 2237336230255353154 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 30 - rotation: 44.36444513928452 62.18650372344871 1.701536945816442 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_746" - uuid: 867276839182137902 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 33 - rotation: 153.21353088905676 36.480722195557654 2.0795783267821344 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_747" - uuid: 7545255310134330448 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 36 - rotation: 23.3554451805843 53.023592578289 120.09271617103693 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_748" - uuid: 8732135678352668636 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 39 - rotation: 108.77910011505783 10.036981631513136 57.15401472777847 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_749" - uuid: 4391102797529774202 - parent: 13626177115197044525 - type: Object - transform: - translation: 27 0 42 - rotation: 133.10281601552836 134.05534749381354 79.68158755096796 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_750" - uuid: 6570425442168381177 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -45 - rotation: 87.28708001458905 44.380955537489946 33.07414520613063 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_751" - uuid: 9914049016711356204 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -42 - rotation: 109.03300739698446 74.64641262718995 57.91045356364095 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_752" - uuid: 5925566001985527705 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -39 - rotation: 88.0649582538707 63.20173667743921 68.16168216347683 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_753" - uuid: 6990203517942891886 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -36 - rotation: 79.22805872681619 160.62366952796268 177.6339503459812 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_754" - uuid: 7313405077149653636 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -33 - rotation: 83.68223932905069 87.90461260520239 56.19734392184975 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_755" - uuid: 9573029639139207464 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -30 - rotation: 23.802280227930797 143.66798326361837 84.7870012842263 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_756" - uuid: 8661651430184212400 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -27 - rotation: 174.28627112174914 160.7117306091516 72.67042494899795 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_757" - uuid: 4055684341463882129 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -24 - rotation: 132.79144900314355 27.169286785918345 29.528780392395625 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_758" - uuid: 9411234447622052370 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -21 - rotation: 104.46337820445498 52.40293318518704 170.14026606729115 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_759" - uuid: 6544672898542606315 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -18 - rotation: 92.63145826432694 14.21898701278752 127.10451801454003 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_760" - uuid: 3730099120813707993 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -15 - rotation: 174.7497769835878 173.56949446389868 6.466628871396991 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_761" - uuid: 9326174594914696958 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -12 - rotation: 138.1582473992259 173.1324228596887 95.88133423452457 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_762" - uuid: 715714398353094922 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -9 - rotation: 28.683585332002085 81.18781509444428 67.0848947684129 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_763" - uuid: 1355814265736378539 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -6 - rotation: 26.696400615488713 82.9172984203864 164.61373267971544 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_764" - uuid: 3072535114577059436 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 -3 - rotation: 87.44733966795013 58.34883105654526 123.57155740414626 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_765" - uuid: 6124023601893858352 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 0 - rotation: 165.87983748424554 58.71596610126297 58.555288092514274 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_766" - uuid: 8500169328006401802 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 3 - rotation: 167.27630307469144 79.50217266049759 147.60822592306135 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_767" - uuid: 9854277028835046067 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 6 - rotation: 80.77412673832441 46.320151282835596 100.02217350300116 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_768" - uuid: 8433822700381776985 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 9 - rotation: 117.50921366158269 75.45672623472527 27.8385519581539 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_769" - uuid: 6131753289932920679 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 12 - rotation: 143.99674811921318 147.9202598543464 112.11274897922607 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_770" - uuid: 6347477097855809067 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 15 - rotation: 82.12249645363015 75.53599673995313 179.74921974309777 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_771" - uuid: 3497500943384187140 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 18 - rotation: 68.41356068442002 157.52778303610367 152.12398466111358 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_772" - uuid: 5396602704284459477 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 21 - rotation: 176.70973288759896 118.29882060283893 140.53612835449684 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_773" - uuid: 7738688643254956655 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 24 - rotation: 28.233243021095554 50.050716029680714 167.84339080267188 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_774" - uuid: 9913393190098269709 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 27 - rotation: 73.39318263895186 93.13789141041387 149.35998012662995 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_775" - uuid: 4273859609057421747 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 30 - rotation: 39.995647142653766 31.169935458430075 18.969422071785573 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_776" - uuid: 8145662336430980824 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 33 - rotation: 105.75243684093377 165.18889944109878 138.33544979741868 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_777" - uuid: 1000435998848557664 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 36 - rotation: 168.2471927980105 20.171224956093305 8.405118679933587 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_778" - uuid: 2965967742358801226 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 39 - rotation: 49.865139021353464 26.851578236705084 173.51626900250255 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_779" - uuid: 7228518541696359109 - parent: 13626177115197044525 - type: Object - transform: - translation: 30 0 42 - rotation: 111.3214001438799 141.9668634462351 128.34745398215057 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_780" - uuid: 3008598327386649124 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -45 - rotation: 173.1070825177828 11.265363940364123 85.23340230587252 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_781" - uuid: 1832788185801133216 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -42 - rotation: 101.88545348895127 75.61725136357725 148.99830043404776 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_782" - uuid: 9623035894747124903 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -39 - rotation: 74.06932745225596 4.4801961660132665 176.16441465557972 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_783" - uuid: 9651589942676235212 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -36 - rotation: 151.8015654460249 178.28881331911558 43.3382429811055 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_784" - uuid: 722741284975239969 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -33 - rotation: 75.19626760214558 42.53892840611936 3.4729821933819305 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_785" - uuid: 8607963224431946937 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -30 - rotation: 166.3322731783399 23.660387652586916 133.06797948106905 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_786" - uuid: 8867257451110639905 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -27 - rotation: 70.19323781691949 19.18080647304156 112.207814980828 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_787" - uuid: 7780725752864949678 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -24 - rotation: 112.20991815693571 58.036988947713354 59.05877981541719 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_788" - uuid: 3505733822610714039 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -21 - rotation: 69.59457371139278 157.68685354517675 134.302417639119 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_789" - uuid: 6657875310403637958 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -18 - rotation: 65.05531726363341 16.237041619738072 155.04611282335154 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_790" - uuid: 3977771652531170335 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -15 - rotation: 73.01840056296861 28.883693465427353 92.15601981674278 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_791" - uuid: 5161011045063372008 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -12 - rotation: 3.6528941081292188 110.38045483230434 104.32166649849623 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_792" - uuid: 7889789504315144791 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -9 - rotation: 115.38169724986294 155.5227134685214 127.61397180435492 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_793" - uuid: 6334990509435368409 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -6 - rotation: 20.723093455053004 52.26684508653439 45.09693227677857 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_794" - uuid: 7692615680200575756 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 -3 - rotation: 30.545221093191483 138.4644507569452 29.030408741742786 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_795" - uuid: 9816383484825056571 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 0 - rotation: 74.01063989038046 72.75191256451124 33.404982664524304 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_796" - uuid: 4481042233965088474 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 3 - rotation: 76.80862208588414 107.4764144398001 155.217282360973 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_797" - uuid: 4374196514282617920 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 6 - rotation: 0.18332296398239745 151.16707375063896 71.18338645182872 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_798" - uuid: 9694729595570675924 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 9 - rotation: 13.524724352015397 27.339904207957517 118.5072022117616 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_799" - uuid: 4141703590086807913 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 12 - rotation: 45.74145825546819 149.34567113712444 79.25026782242948 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_800" - uuid: 1742184907808892962 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 15 - rotation: 88.01180768919727 120.75358840516999 4.80482287915777 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_801" - uuid: 6186353090773396902 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 18 - rotation: 131.78194662061418 72.17091356521752 32.55513914203206 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_802" - uuid: 8130272828034407158 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 21 - rotation: 115.82609639324784 43.22165476679216 48.860574610103285 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_803" - uuid: 7679365093750763162 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 24 - rotation: 78.82928960221211 41.870242578761335 103.72643161175026 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_804" - uuid: 9341087035835413696 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 27 - rotation: 42.654996627451325 0.3552662227421388 98.38130989429797 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_805" - uuid: 1026156981541615853 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 30 - rotation: 89.54264045645647 95.71606556940698 65.34087649888106 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_806" - uuid: 6975915825185920301 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 33 - rotation: 116.3592460069397 178.92279746134577 8.77216939983699 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_807" - uuid: 1423149523562994132 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 36 - rotation: 45.839299981869644 19.199249213334205 87.11027172349968 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_808" - uuid: 2606081472300777459 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 39 - rotation: 178.3823517238465 150.3510691436231 52.47906888639442 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_809" - uuid: 6677838733965594809 - parent: 13626177115197044525 - type: Object - transform: - translation: 33 0 42 - rotation: 80.77710759822797 1.6655789694101109 65.7786412288443 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_810" - uuid: 6474150062695117083 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -45 - rotation: 10.165411461536229 37.88465911600136 46.950876522201725 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_811" - uuid: 7096130423798478628 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -42 - rotation: 75.18573684622606 176.50225724152665 108.65045791531772 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_812" - uuid: 2608739750016074951 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -39 - rotation: 135.3114169660133 26.412211562426666 90.10175606808247 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_813" - uuid: 5022588215869644536 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -36 - rotation: 136.76209435327004 128.94017762516762 38.814019758917745 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_814" - uuid: 6492032726069031879 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -33 - rotation: 165.13019408668848 98.80488916927591 171.20791746973086 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_815" - uuid: 5716668612187791708 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -30 - rotation: 31.53733942506826 84.9495732780504 90.64899981838249 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_816" - uuid: 5654363924626737136 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -27 - rotation: 38.00009253011535 157.26728325320175 172.7105885013059 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_817" - uuid: 236471071967455528 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -24 - rotation: 68.24094337864669 44.996510811436906 74.10139525277248 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_818" - uuid: 1633036460377989649 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -21 - rotation: 12.84159940272193 31.72127337346616 44.78563054318947 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_819" - uuid: 2625192165720977815 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -18 - rotation: 19.01400248008892 122.75645879540723 144.78509234874167 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_820" - uuid: 3258882838357757962 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -15 - rotation: 167.58950227814006 54.585163918140125 90.5214040647644 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_821" - uuid: 8957037837709279407 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -12 - rotation: 142.25869664569578 70.195573915703 29.588150858222026 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_822" - uuid: 5251842662942152792 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -9 - rotation: 69.46368947749892 15.242478360019408 65.14542580089089 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_823" - uuid: 2338254125854422060 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -6 - rotation: 64.96679624058068 165.58459393633652 149.6683576475806 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_824" - uuid: 8946058310780947920 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 -3 - rotation: 113.65140134605353 95.86412066066063 134.14728919513732 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_825" - uuid: 7027316977472418726 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 0 - rotation: 171.27651568226366 131.8533590176471 2.870935511653321 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_826" - uuid: 8000227017246751817 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 3 - rotation: 108.25726639730394 106.7823691098658 41.74781049481673 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_827" - uuid: 2848114129724150615 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 6 - rotation: 8.035096099555513 79.26450716984141 82.62162531875126 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_828" - uuid: 8801248756798884360 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 9 - rotation: 53.55960866701678 33.6402734205534 122.60766410962403 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_829" - uuid: 2385729227221258364 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 12 - rotation: 172.8418675679598 140.0284352981085 55.43888161969796 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_830" - uuid: 8239547624677109311 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 15 - rotation: 142.49259836724198 96.25815368887304 77.18722507177759 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_831" - uuid: 4474643610208882597 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 18 - rotation: 43.44429868193952 40.29763800129974 29.42881025374664 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_832" - uuid: 424233372990657313 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 21 - rotation: 20.20299116760676 81.63403330767105 139.91667547507808 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_833" - uuid: 2390398056872316127 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 24 - rotation: 105.11617864041447 59.3250879897388 21.558864172134875 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_834" - uuid: 9647589926731900880 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 27 - rotation: 66.32771204465743 89.774904098633 22.718076683142126 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_835" - uuid: 8066803443415355058 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 30 - rotation: 7.218600860891806 146.69243683619067 27.74928017978229 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_836" - uuid: 4423757485344360208 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 33 - rotation: 106.87046811179684 165.5558241786153 163.2031824067796 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_837" - uuid: 4476305075852742572 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 36 - rotation: 107.77296341689326 134.91030167817883 13.011698625168282 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_838" - uuid: 6227974249746309037 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 39 - rotation: 70.15555499167102 125.63576727240539 114.5452206836964 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_839" - uuid: 8155714098778987275 - parent: 13626177115197044525 - type: Object - transform: - translation: 36 0 42 - rotation: 35.57033806429539 8.018541983782143 152.31867965869532 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_840" - uuid: 3146025293729394966 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -45 - rotation: 62.187277131262405 146.9154373543109 144.97653648476177 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_841" - uuid: 6990303996001681241 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -42 - rotation: 141.3405731045067 79.00378094772397 94.84455617070272 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_842" - uuid: 5516930879658529600 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -39 - rotation: 148.38760331167558 141.74293686692218 105.04024639591358 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_843" - uuid: 8081412742750264293 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -36 - rotation: 22.960655433028606 57.43894454697872 98.79629437419737 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_844" - uuid: 8894049273718615980 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -33 - rotation: 134.40788431850552 102.18445867779164 87.64524989155127 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_845" - uuid: 5332601683888495697 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -30 - rotation: 72.0729962581893 6.810557076938048 133.30995475096003 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_846" - uuid: 5793127790935056881 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -27 - rotation: 147.46284552707547 45.87091903122504 91.02412603858158 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_847" - uuid: 1534606270924570109 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -24 - rotation: 169.53629513372374 59.20887350683066 32.50005356815396 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_848" - uuid: 6753945475211775103 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -21 - rotation: 131.4909308862925 51.41203443079537 71.9649740545098 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_849" - uuid: 101886685095820465 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -18 - rotation: 136.01955301052436 100.60641508053864 4.7937721150983625 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_850" - uuid: 8999094497529936814 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -15 - rotation: 94.61240105066881 75.91754047787501 60.90559446371941 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_851" - uuid: 2095265168040917566 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -12 - rotation: 85.01075774986336 170.7278149750447 66.1693258797689 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_852" - uuid: 6670794829832417644 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -9 - rotation: 23.30782442567478 105.43106060083726 88.39575087216436 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_853" - uuid: 4575052496464734695 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -6 - rotation: 83.76541247515522 72.95563005255194 174.72714615804117 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_854" - uuid: 9669589859707190397 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 -3 - rotation: 122.15970840276685 140.17026969773946 151.54193208626097 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_855" - uuid: 1256397944145831803 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 0 - rotation: 163.51414060102914 106.32631649577387 19.655279272717557 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_856" - uuid: 6824383040418592692 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 3 - rotation: 115.8098626987218 141.18139589996508 168.2316680354725 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_857" - uuid: 9269201177686883623 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 6 - rotation: 121.61423901071747 88.67791555329056 83.483289189722 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_858" - uuid: 7586488466165002555 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 9 - rotation: 165.11602700956297 25.592538532525467 163.15279189829693 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_859" - uuid: 3275810412662216543 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 12 - rotation: 154.074642005439 138.40847006100458 131.01849512548057 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_860" - uuid: 1181151272846173692 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 15 - rotation: 75.48741628969016 116.86059955233475 96.11652935212734 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_861" - uuid: 6923697963534906073 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 18 - rotation: 143.4144481778772 122.83889968299871 68.14211438664304 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_862" - uuid: 352568976427063210 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 21 - rotation: 86.38884574313171 20.429786408747322 60.055182093852565 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_863" - uuid: 6549829189628597078 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 24 - rotation: 56.71876564002015 66.47879851115187 131.89563042222002 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_864" - uuid: 6667795974985515304 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 27 - rotation: 175.89946414978738 130.80539289887818 118.61630329941296 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_865" - uuid: 9970716516280770665 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 30 - rotation: 86.22048738517448 142.15961752900662 51.52846803493449 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_866" - uuid: 3769486752738121717 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 33 - rotation: 157.3396635985772 26.894126350509843 126.0616144627549 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_867" - uuid: 8057608904691963946 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 36 - rotation: 79.51247471434617 116.02117867241678 13.312106231804233 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_868" - uuid: 6619938628490940877 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 39 - rotation: 56.125335016321785 109.47571083796043 132.37293470266323 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_869" - uuid: 2966879034086251476 - parent: 13626177115197044525 - type: Object - transform: - translation: 39 0 42 - rotation: 114.5888697961351 150.2015988616368 101.22731567355275 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_870" - uuid: 7925199437124172915 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -45 - rotation: 24.991886691599316 78.99589585077169 93.18976042955781 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_871" - uuid: 6266774986781808592 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -42 - rotation: 138.05592995004147 169.26101933759924 31.236817752505207 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_872" - uuid: 1541578412897319972 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -39 - rotation: 159.51400364019136 32.553840576465944 58.97816142346912 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_873" - uuid: 4663382468257678401 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -36 - rotation: 152.35709490789114 39.1321226566348 127.46489257518873 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_874" - uuid: 7109905982891865597 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -33 - rotation: 98.29118732701966 141.43260964795178 57.0752908503405 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_875" - uuid: 9839224930859384467 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -30 - rotation: 90.50432208270699 107.04101293731023 112.90276820360626 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_876" - uuid: 2443561762705544300 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -27 - rotation: 148.4780008138566 91.40118031704515 8.222660562185558 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_877" - uuid: 9921920776600245114 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -24 - rotation: 69.36409983255926 110.84804528470787 140.5002822860333 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_878" - uuid: 622498118934144531 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -21 - rotation: 33.218727290389964 125.84283425099233 20.978088188622447 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_879" - uuid: 5399051542807138303 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -18 - rotation: 17.185795531752007 129.56031583807206 173.9645805653297 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_880" - uuid: 800438503260844079 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -15 - rotation: 88.44871193306723 150.06611414064025 20.072703161913417 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_881" - uuid: 6372801211140081663 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -12 - rotation: 79.81344396022882 120.24869122343061 85.5105649281104 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_882" - uuid: 3968121954176651149 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -9 - rotation: 122.01667182469492 44.763966348693295 65.25958136340806 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_883" - uuid: 958162915371841064 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -6 - rotation: 47.31322331376406 53.94567702591186 73.20023067693565 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_884" - uuid: 5835778335142202285 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 -3 - rotation: 107.28186790948004 80.64664386863666 3.853775261102237 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_885" - uuid: 4609671569644423249 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 0 - rotation: 118.92129447689193 128.79470904760933 136.11715743779556 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_886" - uuid: 6593502529313179667 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 3 - rotation: 133.4356025449387 175.10262257693103 146.73649714032211 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_887" - uuid: 9260069925317825778 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 6 - rotation: 100.52040032940518 128.69702880689618 171.59372188397867 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_888" - uuid: 132110678165432749 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 9 - rotation: 109.83947286317702 53.11999171219723 169.85852930555583 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_889" - uuid: 7420169069902514158 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 12 - rotation: 100.39693877327255 136.4976571435764 51.96210143830518 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_890" - uuid: 515990152321046265 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 15 - rotation: 80.7218306415555 25.81103205757676 7.372840514934966 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_891" - uuid: 9738530331002741477 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 18 - rotation: 135.49941294802113 5.714335312194994 57.46099804503641 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_892" - uuid: 7866387199349182499 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 21 - rotation: 85.32129520049347 116.4115697827052 179.262667912944 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_893" - uuid: 1740606396949150806 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 24 - rotation: 22.55644787985849 19.087603795755097 76.16703770308354 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" - - name: "suzanne_auto_894" - uuid: 6843617243352381452 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 27 - rotation: 126.6806421761918 96.7064805188079 95.89825986736354 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_3" - - name: "suzanne_auto_895" - uuid: 571172300237361116 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 30 - rotation: 144.48346712771814 82.6195004835794 32.26986798249924 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_896" - uuid: 9133874438968181446 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 33 - rotation: 71.62547971431042 9.636115353181285 73.92548228847814 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_897" - uuid: 3810455667991828421 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 36 - rotation: 5.718706540722877 109.66912069402575 156.2953010915896 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_898" - uuid: 3568105304632116645 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 39 - rotation: 147.77851805311187 167.37574031270458 142.51139732199124 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_2" - - name: "suzanne_auto_899" - uuid: 6023155238462196204 - parent: 13626177115197044525 - type: Object - transform: - translation: 42 0 42 - rotation: 162.09688756034964 151.46753279515912 22.76070818884637 - scale: 0.1 0.1 0.1 - properties: - - class: ScenePropMeshStatic - model: "res://models/suzanne_1" + properties: [] \ No newline at end of file