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 "libcacaoformats.hpp"

#include <memory>
#include <optional>

namespace Cacao {
    class CACAO_API World final : public Resource {
      public:
        static std::shared_ptr<World> Create(const std::string& addr) {
            return std::shared_ptr<World>(new World(addr));
        }

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

        std::shared_ptr<Camera> cam;

        std::shared_ptr<Cubemap> skyboxTex;

        void MakeToplevel(ActorRef actor);

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

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

        ~World();

        struct Impl;

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

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

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