Program Listing for File World.hpp

↰ Return to documentation for file (engine/include/Cacao/World.hpp)

#pragma once

#include "Cubemap.hpp"
#include "DllHelper.hpp"
#include "Camera.hpp"
#include "Actor.hpp"
#include "Resource.hpp"

#include "libcacaoasset.hpp"

#include <memory>
#include <optional>

namespace Cacao {
    class CACAO_API World final : public Resource {
      public:
        static std::shared_ptr<World> Create(bool useOrthographicCamera, const std::string& addr);

        static std::shared_ptr<World> Create(const libcacaoasset::World& world, const std::string& addr);

        void MakeToplevel(ActorRef actor);

        std::vector<ActorRef> GetToplevelActors() const;

        ActorRef CreateActor(const std::string& name, ActorRef parent = {});

        template<typename P>
            requires std::is_invocable_r_v<bool, P, ActorRef>
        std::vector<ActorRef> FindActors(P predicate) const {
            //Invoke internal search function with wrapped predicate
            return _FindActors([&predicate](ActorRef ref) { return predicate(ref); });
        }

        glm::quat GetSkyboxRotation() const {
            return skyRot;
        }

        glm::vec3 GetSkyboxRotationEuler() const {
            return glm::degrees(glm::eulerAngles(skyRot));
        }

        void SetSkyboxRotation(glm::quat rot) {
            skyRot = glm::normalize(rot);
        }

        void SetSkyboxRotationEuler(glm::vec3 rot) {
            skyRot = glm::normalize(glm::quat(glm::radians(rot)));
        }

        std::shared_ptr<Camera> cam;
        std::shared_ptr<Cubemap> skyboxTex;

        ~World();

        struct Impl;

      private:
        World(bool useOrthographicCamera, const std::string& addr);
        friend class ResourceManager;

        std::unique_ptr<Impl> impl;
        friend class ImplAccessor;

        //Internal function for actually running a actor search
        std::vector<ActorRef> _FindActors(std::function<bool(ActorRef)> predicate) const;

        glm::quat skyRot;
    };
}