Switching SceneItems to smarts
This commit is contained in:
		@@ -34,30 +34,17 @@ void Scene::update() {
 | 
			
		||||
  if(!game->timeManager.isPaused) this->eventSceneUnpausedUpdate.invoke(game->timeManager.delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SceneItem * Scene::createSceneItem() {
 | 
			
		||||
std::shared_ptr<SceneItem> Scene::createSceneItem() {
 | 
			
		||||
  return this->createSceneItemOfType<SceneItem>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Scene::~Scene() {
 | 
			
		||||
  delete this->physics;
 | 
			
		||||
 | 
			
		||||
  // Early cleanup without disposing.
 | 
			
		||||
  // Invoke cleanup.
 | 
			
		||||
  auto it = this->items.begin();
 | 
			
		||||
  while(it != this->items.end()) {
 | 
			
		||||
    it->second->destroy();
 | 
			
		||||
    ++it;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Now dispose everything.
 | 
			
		||||
  it = this->items.begin();
 | 
			
		||||
  while(it != this->items.end()) {
 | 
			
		||||
    delete it->second;
 | 
			
		||||
    ++it;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  auto it2 = this->itemsNotInitialized.begin();
 | 
			
		||||
  while(it2 != this->itemsNotInitialized.end()) {
 | 
			
		||||
    delete it2->second;
 | 
			
		||||
    ++it2;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -20,16 +20,18 @@ namespace Dawn {
 | 
			
		||||
  typedef int32_t sceneitemid_t;
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  std::shared_ptr<T> _sceneForwardGetComponent(SceneItem *item);
 | 
			
		||||
  std::shared_ptr<T> _sceneForwardGetComponent(std::shared_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  std::vector<std::shared_ptr<T>> _sceneForwardGetComponents(SceneItem *item);
 | 
			
		||||
  std::vector<std::shared_ptr<T>> _sceneForwardGetComponents(
 | 
			
		||||
    std::shared_ptr<SceneItem> item
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  class Scene : public StateOwner, public std::enable_shared_from_this<Scene> {
 | 
			
		||||
    private:
 | 
			
		||||
      sceneitemid_t nextId;
 | 
			
		||||
      std::map<sceneitemid_t, SceneItem*> items;
 | 
			
		||||
      std::map<sceneitemid_t, SceneItem*> itemsNotInitialized;
 | 
			
		||||
      std::map<sceneitemid_t, std::shared_ptr<SceneItem>> items;
 | 
			
		||||
      std::map<sceneitemid_t, std::shared_ptr<SceneItem>> itemsNotInitialized;
 | 
			
		||||
    
 | 
			
		||||
    public:
 | 
			
		||||
      std::weak_ptr<DawnGame> game;
 | 
			
		||||
@@ -56,10 +58,10 @@ namespace Dawn {
 | 
			
		||||
       * @return A shared pointer to the created SceneItem.
 | 
			
		||||
       */
 | 
			
		||||
      template<class T>
 | 
			
		||||
      T * createSceneItemOfType() {
 | 
			
		||||
      std::shared_ptr<T> createSceneItemOfType() {
 | 
			
		||||
        sceneitemid_t id = this->nextId++;
 | 
			
		||||
        auto item = new T(weak_from_this(), id);
 | 
			
		||||
        assertNotNull(item, "Scene::createSceneItemOfType: Failed to create SceneItem (Memory Filled?)");
 | 
			
		||||
        auto item = std::make_shared<T>(weak_from_this(), id);
 | 
			
		||||
        assertNotNull(item, "Failed to create SceneItem (Memory Filled?)");
 | 
			
		||||
        this->itemsNotInitialized[id] = item;
 | 
			
		||||
        return item;
 | 
			
		||||
      }
 | 
			
		||||
@@ -69,7 +71,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @return A shared pointer to the created SceneItem.
 | 
			
		||||
       */
 | 
			
		||||
      SceneItem * createSceneItem();
 | 
			
		||||
      std::shared_ptr<SceneItem> createSceneItem();
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the required assets for this scene. Assets required are meant
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,7 @@ namespace Dawn {
 | 
			
		||||
       */
 | 
			
		||||
      template<class T>
 | 
			
		||||
      std::shared_ptr<T> addComponent() {
 | 
			
		||||
        auto component = std::make_shared<T>(this);
 | 
			
		||||
        auto component = std::make_shared<T>(weak_from_this());
 | 
			
		||||
        this->components.push_back(component);
 | 
			
		||||
        return component;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,8 +10,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SceneItemComponent::SceneItemComponent(SceneItem *item) {
 | 
			
		||||
  assertNotNull(item, "SceneItemComponent::SceneItemComponent: Item cannot be null");
 | 
			
		||||
SceneItemComponent::SceneItemComponent(std::weak_ptr<SceneItem> item) {
 | 
			
		||||
  this->item = item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -25,7 +24,7 @@ std::vector<std::shared_ptr<SceneItemComponent>> SceneItemComponent::getDependen
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<Scene> SceneItemComponent::getScene() {
 | 
			
		||||
  auto scene = this->item->scene.lock();
 | 
			
		||||
  auto scene = this->item.lock()->scene.lock();
 | 
			
		||||
  assertNotNull(scene, "Scene cannot be null!");
 | 
			
		||||
  return scene;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
  class SceneItemComponent : public StateOwner {
 | 
			
		||||
    public:
 | 
			
		||||
      SceneItem *item;
 | 
			
		||||
      std::weak_ptr<SceneItem> item;
 | 
			
		||||
      bool_t hasInitialized = false;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
@@ -23,7 +23,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Scene Item thsi component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      SceneItemComponent(SceneItem *item);
 | 
			
		||||
      SceneItemComponent(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      
 | 
			
		||||
      /**
 | 
			
		||||
       * Requested on the first frame that the parent scene item has become
 | 
			
		||||
@@ -78,12 +78,16 @@ namespace Dawn {
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  std::shared_ptr<T>  _sceneForwardGetComponent(SceneItem *item) {
 | 
			
		||||
  std::shared_ptr<T> _sceneForwardGetComponent(
 | 
			
		||||
    std::shared_ptr<SceneItem> item
 | 
			
		||||
  ) {
 | 
			
		||||
    return item->getComponent<T>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  std::shared_ptr<T> _sceneForwardGetComponents(SceneItem *item) {
 | 
			
		||||
  std::shared_ptr<T> _sceneForwardGetComponents(
 | 
			
		||||
    std::shared_ptr<SceneItem> item
 | 
			
		||||
  ) {
 | 
			
		||||
    return item->getComponents<T>();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
FPSLabelComponent::FPSLabelComponent(SceneItem *item) :
 | 
			
		||||
FPSLabelComponent::FPSLabelComponent(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ namespace Dawn {
 | 
			
		||||
      /* @optional */
 | 
			
		||||
      UILabel *label = nullptr;
 | 
			
		||||
      
 | 
			
		||||
      FPSLabelComponent(SceneItem *item);
 | 
			
		||||
      FPSLabelComponent(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -1,32 +0,0 @@
 | 
			
		||||
// Copyright (c) 2022 Dominic Masters
 | 
			
		||||
// 
 | 
			
		||||
// This software is released under the MIT License.
 | 
			
		||||
// https://opensource.org/licenses/MIT
 | 
			
		||||
 | 
			
		||||
#include "AnimationController.hpp"
 | 
			
		||||
#include "game/DawnGame.hpp"
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
AnimationController::AnimationController(SceneItem *item) :
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AnimationController::addAnimation(Animation *animation) {
 | 
			
		||||
  assertNotNull(animation, "AnimationController::addAnimation: Animation cannot be null");
 | 
			
		||||
  this->animations.push_back(animation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AnimationController::onStart() {
 | 
			
		||||
  SceneItemComponent::onStart();
 | 
			
		||||
 | 
			
		||||
  useEvent([&](float_t delta){
 | 
			
		||||
    auto it = this->animations.begin();
 | 
			
		||||
    while(it != this->animations.end()) {
 | 
			
		||||
      (*it)->tick(delta);
 | 
			
		||||
      ++it;
 | 
			
		||||
    }
 | 
			
		||||
  }, getScene()->eventSceneUnpausedUpdate);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,27 +0,0 @@
 | 
			
		||||
// Copyright (c) 2022 Dominic Masters
 | 
			
		||||
// 
 | 
			
		||||
// This software is released under the MIT License.
 | 
			
		||||
// https://opensource.org/licenses/MIT
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "scene/SceneItemComponent.hpp"
 | 
			
		||||
#include "display/animation/Animation.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class AnimationController : public SceneItemComponent {
 | 
			
		||||
    private:
 | 
			
		||||
      std::vector<Animation*> animations;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      AnimationController(SceneItem *item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Add an animation to this controller.
 | 
			
		||||
       * 
 | 
			
		||||
       * @param animation Pointer to the animation to add.
 | 
			
		||||
       */
 | 
			
		||||
      void addAnimation(Animation *animation);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -6,7 +6,6 @@
 | 
			
		||||
# Sources
 | 
			
		||||
target_sources(${DAWN_TARGET_NAME}
 | 
			
		||||
  PRIVATE
 | 
			
		||||
    AnimationController.cpp
 | 
			
		||||
    Camera.cpp
 | 
			
		||||
    Material.cpp
 | 
			
		||||
    PixelPerfectCamera.cpp
 | 
			
		||||
 
 | 
			
		||||
@@ -8,9 +8,9 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
Camera::Camera(SceneItem *item) :
 | 
			
		||||
Camera::Camera(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  renderTarget(item->scene.lock()->game.lock()->renderManager->getBackBuffer()),
 | 
			
		||||
  renderTarget(this->getGame()->renderManager->getBackBuffer()),
 | 
			
		||||
  fov(0.785398f),// 45 degrees,
 | 
			
		||||
  type(CAMERA_TYPE_PERSPECTIVE),
 | 
			
		||||
  orthoLeft(-0.5f),
 | 
			
		||||
@@ -66,7 +66,7 @@ glm::vec3 Camera::getRayDirectionFromScreenSpace(glm::vec2 screenSpace) {
 | 
			
		||||
  glm::vec4 eyeCoords = inverseProjectionMatrix * clipCoords;
 | 
			
		||||
  eyeCoords = glm::vec4(eyeCoords.x, eyeCoords.y, -1.0f, 0.0f);
 | 
			
		||||
 | 
			
		||||
  glm::mat4 inverseViewMatrix = glm::inverse(item->getWorldTransform());
 | 
			
		||||
  glm::mat4 inverseViewMatrix = glm::inverse(item.lock()->getWorldTransform());
 | 
			
		||||
  glm::vec4 t = inverseViewMatrix * eyeCoords;
 | 
			
		||||
 | 
			
		||||
  return glm::normalize(glm::vec3(t.x, t.y, t.z));
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item SceneItem that this component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      Camera(SceneItem *item);
 | 
			
		||||
      Camera(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the current projection matrix.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CameraTexture::CameraTexture(SceneItem *item) :
 | 
			
		||||
CameraTexture::CameraTexture(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  camera(nullptr)
 | 
			
		||||
{
 | 
			
		||||
@@ -15,7 +15,7 @@ CameraTexture::CameraTexture(SceneItem *item) :
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CameraTexture::onStart() {
 | 
			
		||||
  if(this->camera == nullptr) this->camera = item->getComponent<Camera>();
 | 
			
		||||
  if(this->camera == nullptr) this->camera = item.lock()->getComponent<Camera>();
 | 
			
		||||
 | 
			
		||||
  useEffect([&]{
 | 
			
		||||
    if(this->camera == nullptr) return;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ namespace Dawn {
 | 
			
		||||
      StateProperty<std::shared_ptr<Camera>> camera;
 | 
			
		||||
      std::shared_ptr<TextureRenderTarget> renderTarget;
 | 
			
		||||
 | 
			
		||||
      CameraTexture(SceneItem *item);
 | 
			
		||||
      CameraTexture(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
Material::Material(SceneItem *item) : SceneItemComponent(item) {
 | 
			
		||||
Material::Material(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ShaderManager & Material::getShaderManager() {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Scene Item this component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      Material(SceneItem *item);
 | 
			
		||||
      Material(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the shader manager for the game.
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,8 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
PixelPerfectCamera::PixelPerfectCamera(SceneItem *i) :
 | 
			
		||||
  SceneItemComponent(i),
 | 
			
		||||
PixelPerfectCamera::PixelPerfectCamera(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  scale(1.0f),
 | 
			
		||||
  camera(nullptr)
 | 
			
		||||
{
 | 
			
		||||
@@ -33,7 +33,7 @@ void PixelPerfectCamera::updateDimensions() {
 | 
			
		||||
      break;
 | 
			
		||||
    
 | 
			
		||||
    case CAMERA_TYPE_PERSPECTIVE:
 | 
			
		||||
      item->lookAtPixelPerfect(
 | 
			
		||||
      item.lock()->lookAtPixelPerfect(
 | 
			
		||||
        glm::vec3(0, 0, 0),
 | 
			
		||||
        glm::vec3(0, 0, 0),
 | 
			
		||||
        target->getHeight() / this->scale,
 | 
			
		||||
@@ -48,7 +48,7 @@ void PixelPerfectCamera::updateDimensions() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PixelPerfectCamera::onStart() {
 | 
			
		||||
  if(camera == nullptr) camera = item->getComponent<Camera>();
 | 
			
		||||
  if(camera == nullptr) camera = item.lock()->getComponent<Camera>();
 | 
			
		||||
  
 | 
			
		||||
  useEffect([&]{
 | 
			
		||||
    this->updateDimensions();
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Item that this component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      PixelPerfectCamera(SceneItem *item);
 | 
			
		||||
      PixelPerfectCamera(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SimpleRenderTargetQuad::SimpleRenderTargetQuad(SceneItem *i) :
 | 
			
		||||
SimpleRenderTargetQuad::SimpleRenderTargetQuad(std::weak_ptr<SceneItem> i) :
 | 
			
		||||
  SceneItemComponent(i),
 | 
			
		||||
  renderTarget(nullptr)
 | 
			
		||||
{
 | 
			
		||||
@@ -15,7 +15,7 @@ SimpleRenderTargetQuad::SimpleRenderTargetQuad(SceneItem *i) :
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> SimpleRenderTargetQuad::getDependencies() {
 | 
			
		||||
  return {
 | 
			
		||||
    (this->meshHost = this->item->getComponent<MeshHost>())
 | 
			
		||||
    (this->meshHost = this->item.lock()->getComponent<MeshHost>())
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Item that this component is attached to.
 | 
			
		||||
       */
 | 
			
		||||
      SimpleRenderTargetQuad(SceneItem *item);
 | 
			
		||||
      SimpleRenderTargetQuad(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
TiledSprite::TiledSprite(SceneItem *item) :
 | 
			
		||||
TiledSprite::TiledSprite(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  tile(-1),
 | 
			
		||||
  tileset(nullptr),
 | 
			
		||||
@@ -22,7 +22,7 @@ TiledSprite::TiledSprite(SceneItem *item) :
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> TiledSprite::getDependencies() {
 | 
			
		||||
  if(this->meshHost == nullptr) {
 | 
			
		||||
    this->meshHost = this->item->getComponent<QuadMeshHost>();
 | 
			
		||||
    this->meshHost = item.lock()->getComponent<QuadMeshHost>();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { this->meshHost._realValue };
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<float_t> size;
 | 
			
		||||
 | 
			
		||||
      TiledSprite(SceneItem *item);
 | 
			
		||||
      TiledSprite(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies();
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CapsuleMeshHost::CapsuleMeshHost(SceneItem *item) :
 | 
			
		||||
CapsuleMeshHost::CapsuleMeshHost(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  MeshHost(item),
 | 
			
		||||
  radius(0.5f),
 | 
			
		||||
  height(1.0f)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<float> height;
 | 
			
		||||
 | 
			
		||||
      CapsuleMeshHost(SceneItem *item);
 | 
			
		||||
      CapsuleMeshHost(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CubeMeshHost::CubeMeshHost(SceneItem *item) :
 | 
			
		||||
CubeMeshHost::CubeMeshHost(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  MeshHost(item),
 | 
			
		||||
  size(glm::vec3(1,1,1))
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<glm::vec3> size;
 | 
			
		||||
 | 
			
		||||
      CubeMeshHost(SceneItem *item);
 | 
			
		||||
      CubeMeshHost(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
MeshHost::MeshHost(SceneItem *item) :
 | 
			
		||||
MeshHost::MeshHost(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  mesh(),
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,6 @@ namespace Dawn {
 | 
			
		||||
    public:
 | 
			
		||||
      Mesh mesh;
 | 
			
		||||
 | 
			
		||||
      MeshHost(SceneItem *item);
 | 
			
		||||
      MeshHost(std::weak_ptr<SceneItem> item);
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -9,12 +9,12 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
MeshRenderer::MeshRenderer(SceneItem *item) : SceneItemComponent(item) {
 | 
			
		||||
MeshRenderer::MeshRenderer(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> MeshRenderer::getDependencies() {
 | 
			
		||||
  return {
 | 
			
		||||
    this->meshHost = this->item->getComponent<MeshHost>()
 | 
			
		||||
    meshHost = item.lock()->getComponent<MeshHost>()
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Scene Item this mesh renderer belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      MeshRenderer(SceneItem *item);
 | 
			
		||||
      MeshRenderer(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
QuadMeshHost::QuadMeshHost(SceneItem *item) :
 | 
			
		||||
QuadMeshHost::QuadMeshHost(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  xy0(glm::vec2(-0.5f, -0.5f)), xy1(glm::vec2(0.5f, 0.5f)),
 | 
			
		||||
  uv0(glm::vec2(0, 0)), uv1(glm::vec2(1, 1)),
 | 
			
		||||
  MeshHost(item)
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<glm::vec2> uv1;
 | 
			
		||||
 | 
			
		||||
      QuadMeshHost(SceneItem *item);
 | 
			
		||||
      QuadMeshHost(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SceneItem * ExampleSpin::create(Scene *scene) {
 | 
			
		||||
std::shared_ptr<SceneItem> ExampleSpin::create(Scene *scene) {
 | 
			
		||||
  auto item = scene->createSceneItem();
 | 
			
		||||
  auto mr = item->addComponent<MeshRenderer>();
 | 
			
		||||
  mr->mesh = new Mesh();
 | 
			
		||||
@@ -22,17 +22,18 @@ SceneItem * ExampleSpin::create(Scene *scene) {
 | 
			
		||||
  return item;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ExampleSpin::ExampleSpin(SceneItem *item) :
 | 
			
		||||
ExampleSpin::ExampleSpin(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ExampleSpin::onStart() {
 | 
			
		||||
  useEvent([&](float_t delta){
 | 
			
		||||
    auto quat = item->getLocalRotation();
 | 
			
		||||
    auto i = item.lock();
 | 
			
		||||
    auto quat = i->getLocalRotation();
 | 
			
		||||
    quat = glm::rotate(quat, delta, glm::vec3(0, 1, 0));
 | 
			
		||||
    quat = glm::rotate(quat, delta / 2.0f, glm::vec3(1, 0, 0));
 | 
			
		||||
    quat = glm::rotate(quat, delta / 4.0f, glm::vec3(0, 0, 1));
 | 
			
		||||
    item->setLocalRotation(quat);
 | 
			
		||||
    i->setLocalRotation(quat);
 | 
			
		||||
  }, getScene()->eventSceneUnpausedUpdate);
 | 
			
		||||
}
 | 
			
		||||
@@ -10,9 +10,9 @@
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class ExampleSpin : public SceneItemComponent {
 | 
			
		||||
    public:
 | 
			
		||||
      static SceneItem * create(Scene *scene);
 | 
			
		||||
      static std::shared_ptr<SceneItem> create(Scene *scene);
 | 
			
		||||
 | 
			
		||||
      ExampleSpin(SceneItem *item);
 | 
			
		||||
      ExampleSpin(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
BoxCollider::BoxCollider(SceneItem *i) : Collider2D(i) {
 | 
			
		||||
BoxCollider::BoxCollider(std::weak_ptr<SceneItem> item) : Collider2D(item) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      glm::vec2 max = glm::vec2( 0.5f,  0.5f);
 | 
			
		||||
 | 
			
		||||
      BoxCollider(SceneItem *item);
 | 
			
		||||
      BoxCollider(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      enum Collider2DType getColliderType() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CharacterController2D::CharacterController2D(SceneItem *i) :
 | 
			
		||||
CharacterController2D::CharacterController2D(std::weak_ptr<SceneItem> i) :
 | 
			
		||||
  SceneItemComponent(i)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
@@ -17,6 +17,7 @@ void CharacterController2D::onStart() {
 | 
			
		||||
    // if(velocity == glm::vec2(0, 0)) return;
 | 
			
		||||
 | 
			
		||||
    // Common variables
 | 
			
		||||
    auto item = this->item.lock();
 | 
			
		||||
    auto myCollider = item->getComponent<Collider2D>();
 | 
			
		||||
 | 
			
		||||
    // Friction
 | 
			
		||||
@@ -38,7 +39,8 @@ void CharacterController2D::onStart() {
 | 
			
		||||
      while(itColliders != allColliders.end()) {
 | 
			
		||||
        auto c = *itColliders;
 | 
			
		||||
        ++itColliders;
 | 
			
		||||
        if(c->item == this->item || c->item->isChildOf(item->shared_from_this())) continue;
 | 
			
		||||
        auto cItem = c->item.lock();
 | 
			
		||||
        if(cItem == item || cItem->isChildOf(item)) continue;
 | 
			
		||||
        result = c->getCollidingResult(
 | 
			
		||||
          velocity,
 | 
			
		||||
          myCollider,
 | 
			
		||||
@@ -76,7 +78,8 @@ void CharacterController2D::onStart() {
 | 
			
		||||
    while(itTriggers != allTriggers.end()) {
 | 
			
		||||
      auto c = *itTriggers;
 | 
			
		||||
      ++itTriggers;
 | 
			
		||||
      if(c->item == this->item || c->item->isChildOf(item->shared_from_this())) continue;
 | 
			
		||||
      auto cItem = c->item.lock();
 | 
			
		||||
      if(cItem == item || cItem->isChildOf(item)) continue;
 | 
			
		||||
      if(c->getCollidingResult(myCollider)) {
 | 
			
		||||
        c->eventTriggerEnter.invoke(this);
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
      StateEvent<struct CharacterController2DCollisionEventInfo> eventCollision;
 | 
			
		||||
      
 | 
			
		||||
      CharacterController2D(SceneItem *i);
 | 
			
		||||
      CharacterController2D(std::weak_ptr<SceneItem> i);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -8,6 +8,6 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
Collider2D::Collider2D(SceneItem *i) : SceneItemComponent(i) {
 | 
			
		||||
Collider2D::Collider2D(std::weak_ptr<SceneItem> i) : SceneItemComponent(i) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
@@ -22,7 +22,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
  class Collider2D : public SceneItemComponent {
 | 
			
		||||
    public:
 | 
			
		||||
      Collider2D(SceneItem *item);
 | 
			
		||||
      Collider2D(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns which type of collider this is.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,12 +7,12 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SolidController2D::SolidController2D(SceneItem *item) : SceneItemComponent(item) {
 | 
			
		||||
SolidController2D::SolidController2D(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> SolidController2D::getDependencies() {
 | 
			
		||||
  return {
 | 
			
		||||
    (this->collider = item->getComponent<Collider2D>())
 | 
			
		||||
    (this->collider = item.lock()->getComponent<Collider2D>())
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +29,7 @@ bool_t SolidController2D::getCollidingResult(
 | 
			
		||||
  assertNotNull(movingObject, "SolidController2D::getCollidingResult: Moving object cannot be null");
 | 
			
		||||
  if(movement.x == 0 && movement.y == 0) return false;
 | 
			
		||||
 | 
			
		||||
  auto myPos = physics3Dto2D(movingObject->item->getWorldPosition());
 | 
			
		||||
  auto myPos = physics3Dto2D(movingObject->item.lock()->getWorldPosition());
 | 
			
		||||
 | 
			
		||||
  // Check what the moving object is
 | 
			
		||||
  switch(movingObject->getColliderType()) {
 | 
			
		||||
@@ -42,7 +42,7 @@ bool_t SolidController2D::getCollidingResult(
 | 
			
		||||
        case COLLIDER2D_TYPE_BOX: {
 | 
			
		||||
          auto box2 = std::static_pointer_cast<BoxCollider>(this->collider);
 | 
			
		||||
          assertNotNull(box2, "SolidController2D::getCollidingResult: Collider is not a BoxCollider");
 | 
			
		||||
          auto otherPos = physics3Dto2D(box2->item->getWorldPosition());
 | 
			
		||||
          auto otherPos = physics3Dto2D(box2->item.lock()->getWorldPosition());
 | 
			
		||||
 | 
			
		||||
          return boxCheckCollision(
 | 
			
		||||
            myPos, box1->min, box1->max,
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ namespace Dawn {
 | 
			
		||||
    public:
 | 
			
		||||
      std::shared_ptr<Collider2D> collider;
 | 
			
		||||
 | 
			
		||||
      SolidController2D(SceneItem *item);
 | 
			
		||||
      SolidController2D(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
 
 | 
			
		||||
@@ -7,13 +7,13 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
TriggerController2D::TriggerController2D(SceneItem *i) : SceneItemComponent(i) {
 | 
			
		||||
TriggerController2D::TriggerController2D(std::weak_ptr<SceneItem> i) : SceneItemComponent(i) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> TriggerController2D::getDependencies() {
 | 
			
		||||
  return {
 | 
			
		||||
    (this->collider = this->item->getComponent<Collider2D>())
 | 
			
		||||
    (this->collider = this->item.lock()->getComponent<Collider2D>())
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -32,8 +32,8 @@ bool_t TriggerController2D::getCollidingResult(std::shared_ptr<Collider2D> movin
 | 
			
		||||
          auto box2 = std::static_pointer_cast<BoxCollider>(collider);
 | 
			
		||||
          assertNotNull(box2, "TriggerController2D::getCollidingResult: Collider is not a BoxCollider");
 | 
			
		||||
          return boxIsBoxColliding(
 | 
			
		||||
            physics3Dto2D(box1->item->getWorldPosition()), box1->min, box1->max,
 | 
			
		||||
            physics3Dto2D(box2->item->getWorldPosition()), box2->min, box2->max
 | 
			
		||||
            physics3Dto2D(box1->item.lock()->getWorldPosition()), box1->min, box1->max,
 | 
			
		||||
            physics3Dto2D(box2->item.lock()->getWorldPosition()), box2->min, box2->max
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ namespace Dawn {
 | 
			
		||||
      std::shared_ptr<Collider2D> collider;
 | 
			
		||||
      StateEvent<CharacterController2D*> eventTriggerEnter;
 | 
			
		||||
 | 
			
		||||
      TriggerController2D(SceneItem *i);
 | 
			
		||||
      TriggerController2D(std::weak_ptr<SceneItem> i);
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CapsuleCollider::CapsuleCollider(SceneItem *item) : Collider3D(item) {
 | 
			
		||||
CapsuleCollider::CapsuleCollider(std::weak_ptr<SceneItem> item) : Collider3D(item) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -22,7 +22,7 @@ bool_t CapsuleCollider::performRaycast(
 | 
			
		||||
    {
 | 
			
		||||
      .height = this->height,
 | 
			
		||||
      .radius = this->radius,
 | 
			
		||||
      .origin = item->getWorldPosition()
 | 
			
		||||
      .origin = item.lock()->getWorldPosition()
 | 
			
		||||
    },
 | 
			
		||||
    &result->point,
 | 
			
		||||
    &result->normal,
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      float_t radius = 0.5f;
 | 
			
		||||
 | 
			
		||||
      CapsuleCollider(SceneItem *item);
 | 
			
		||||
      CapsuleCollider(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      enum Collider3DType getColliderType() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CharacterController3D::CharacterController3D(SceneItem *item) :
 | 
			
		||||
CharacterController3D::CharacterController3D(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -15,6 +15,8 @@ CharacterController3D::CharacterController3D(SceneItem *item) :
 | 
			
		||||
 | 
			
		||||
void CharacterController3D::onStart() {
 | 
			
		||||
  useEvent([&](float_t delta){
 | 
			
		||||
    auto item = this->item.lock();
 | 
			
		||||
 | 
			
		||||
    // Friction
 | 
			
		||||
    velocity -= glm::vec3(velocity.x, 0, velocity.z) * friction * delta;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      float_t friction = 12.0f;
 | 
			
		||||
 | 
			
		||||
      CharacterController3D(SceneItem *item);
 | 
			
		||||
      CharacterController3D(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
Collider3D::Collider3D(SceneItem *item) : SceneItemComponent(item) {
 | 
			
		||||
Collider3D::Collider3D(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ namespace Dawn {
 | 
			
		||||
      ) = 0;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      Collider3D(SceneItem *item);
 | 
			
		||||
      Collider3D(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Perform a raycast against this collider.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
CubeCollider::CubeCollider(SceneItem *item) : Collider3D(item) {
 | 
			
		||||
CubeCollider::CubeCollider(std::weak_ptr<SceneItem> item) : Collider3D(item) {
 | 
			
		||||
  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -20,7 +20,7 @@ bool_t CubeCollider::performRaycast(
 | 
			
		||||
  return Dawn::raytestCube(
 | 
			
		||||
    ray,
 | 
			
		||||
    { .min = this->min, .max = this->max },
 | 
			
		||||
    item->getWorldTransform(),
 | 
			
		||||
    item.lock()->getWorldTransform(),
 | 
			
		||||
    &result->point,
 | 
			
		||||
    &result->normal,
 | 
			
		||||
    &result->distance
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      glm::vec3 max = glm::vec3(0.5f, 0.5f, 0.5f);
 | 
			
		||||
 | 
			
		||||
      CubeCollider(SceneItem *item);
 | 
			
		||||
      CubeCollider(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      enum Collider3DType getColliderType() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SphereCollider::SphereCollider(SceneItem *item) : Collider3D(item) {
 | 
			
		||||
SphereCollider::SphereCollider(std::weak_ptr<SceneItem> item) : Collider3D(item) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +23,7 @@ bool_t SphereCollider::performRaycast(
 | 
			
		||||
 | 
			
		||||
  return raytestSphere(
 | 
			
		||||
    ray,
 | 
			
		||||
    { .center = item->getLocalPosition(), .radius = this->radius },
 | 
			
		||||
    { .center = item.lock()->getLocalPosition(), .radius = this->radius },
 | 
			
		||||
    &result->point,
 | 
			
		||||
    &result->normal,
 | 
			
		||||
    &result->distance
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      float_t radius = 1.0f;
 | 
			
		||||
      
 | 
			
		||||
      SphereCollider(SceneItem *item);
 | 
			
		||||
      SphereCollider(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      enum Collider3DType getColliderType() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SubSceneCameraAlign::SubSceneCameraAlign(SceneItem *i) :
 | 
			
		||||
SubSceneCameraAlign::SubSceneCameraAlign(std::weak_ptr<SceneItem> i) :
 | 
			
		||||
  SceneItemComponent(i),
 | 
			
		||||
  camera(nullptr),
 | 
			
		||||
  renderTarget(nullptr)
 | 
			
		||||
@@ -23,7 +23,7 @@ void SubSceneCameraAlign::realign() {
 | 
			
		||||
  float_t myRatio = this->camera->getAspect();
 | 
			
		||||
  
 | 
			
		||||
  this->camera->type = CAMERA_TYPE_ORTHONOGRAPHIC;
 | 
			
		||||
  this->camera->item->lookAt(glm::vec3(0, 0, 10), glm::vec3(0, 0, 0));
 | 
			
		||||
  this->camera->item.lock()->lookAt(glm::vec3(0, 0, 10), glm::vec3(0, 0, 0));
 | 
			
		||||
 | 
			
		||||
  if(ratio > myRatio) {
 | 
			
		||||
    // My Ratio is narrower
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Scene Item that this component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      SubSceneCameraAlign(SceneItem *item);
 | 
			
		||||
      SubSceneCameraAlign(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
SubSceneController::SubSceneController(SceneItem *i)  : SceneItemComponent(i) {
 | 
			
		||||
SubSceneController::SubSceneController(std::weak_ptr<SceneItem> i)  : SceneItemComponent(i) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      bool_t onlyUpdateUnpaused = false;
 | 
			
		||||
 | 
			
		||||
      SubSceneController(SceneItem *item);
 | 
			
		||||
      SubSceneController(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIBorder::UIBorder(SceneItem *item) :
 | 
			
		||||
UIBorder::UIBorder(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  texture(nullptr),
 | 
			
		||||
  borderSize(glm::vec2(8, 8)),
 | 
			
		||||
  UIComponentRenderable(item)
 | 
			
		||||
@@ -37,7 +37,7 @@ std::vector<struct ShaderPassItem> UIBorder::getUIRenderPasses() {
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = COLOR_WHITE;
 | 
			
		||||
  item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->item->getWorldTransform();
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->item.lock()->getWorldTransform();
 | 
			
		||||
  if(this->texture == nullptr) {
 | 
			
		||||
    item.boolValues[shader->paramHasTexture] = false;
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -45,7 +45,7 @@ std::vector<struct ShaderPassItem> UIBorder::getUIRenderPasses() {
 | 
			
		||||
    item.textureSlots[0] = this->texture;
 | 
			
		||||
    item.textureValues[shader->paramTexture] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  item.w = this->item->getWorldPosition().z;
 | 
			
		||||
  item.w = this->item.lock()->getWorldPosition().z;
 | 
			
		||||
  item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
 | 
			
		||||
  item.mesh = &mesh;
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<Texture*> texture;
 | 
			
		||||
 | 
			
		||||
      UIBorder(SceneItem *item);
 | 
			
		||||
      UIBorder(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ std::shared_ptr<UICanvas> UICanvas::create(Scene *scene) {
 | 
			
		||||
  return item->addComponent<UICanvas>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
UICanvas::UICanvas(SceneItem *item) :
 | 
			
		||||
UICanvas::UICanvas(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  camera(nullptr)
 | 
			
		||||
{
 | 
			
		||||
@@ -26,7 +26,7 @@ void UICanvas::rebufferShaderParameters() {
 | 
			
		||||
  switch(this->drawType) {
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_ABSOLUTE:
 | 
			
		||||
      data.projection = camera->getProjection();
 | 
			
		||||
      data.view = camera->item->getWorldTransform();
 | 
			
		||||
      data.view = camera->item.lock()->getWorldTransform();
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
 | 
			
		||||
@@ -91,7 +91,7 @@ void UICanvas::onStart() {
 | 
			
		||||
      this->h = h / this->getScale();
 | 
			
		||||
      this->rebufferShaderParameters();
 | 
			
		||||
      
 | 
			
		||||
      auto comps = this->item->findChildren<UIComponent>();
 | 
			
		||||
      auto comps = this->item.lock()->findChildren<UIComponent>();
 | 
			
		||||
      auto itComps = comps.begin();
 | 
			
		||||
      while(itComps != comps.end()) {
 | 
			
		||||
        (*itComps)->alignmentNeedsUpdating = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ namespace Dawn {
 | 
			
		||||
       * 
 | 
			
		||||
       * @param item Item that this canvas item belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      UICanvas(SceneItem *item);
 | 
			
		||||
      UICanvas(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the scale of this canvas.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIComponent::UIComponent(SceneItem *item) :
 | 
			
		||||
UIComponent::UIComponent(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  alignment(glm::vec4(0, 0, 128, 128)),
 | 
			
		||||
  alignUnitLeft(UI_COMPONENT_ALIGN_UNIT_SCALE),
 | 
			
		||||
@@ -22,7 +22,7 @@ UIComponent::UIComponent(SceneItem *item) :
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<UIComponentDimensional> UIComponent::getParentDimensional() {
 | 
			
		||||
  auto parent = item->getParent();
 | 
			
		||||
  auto parent = item.lock()->getParent();
 | 
			
		||||
  if(parent == nullptr) return nullptr;
 | 
			
		||||
  auto dimensional = parent->getComponent<UIComponentDimensional>();
 | 
			
		||||
  assertNotNull(dimensional, "UIComponent::getParentDimensional: Parent must have a UIComponentDimensional");
 | 
			
		||||
@@ -34,7 +34,7 @@ void UIComponent::updateAlignment() {
 | 
			
		||||
  
 | 
			
		||||
  auto align = (glm::vec4)this->alignment;
 | 
			
		||||
  auto dimensional = this->getParentDimensional();
 | 
			
		||||
  auto translate = item->getLocalPosition();
 | 
			
		||||
  auto translate = item.lock()->getLocalPosition();
 | 
			
		||||
 | 
			
		||||
  assertNotNull(dimensional, "UIComponent::updateAlignment: Parent must have a UIComponentDimensional");
 | 
			
		||||
 | 
			
		||||
@@ -99,7 +99,7 @@ void UIComponent::updateAlignment() {
 | 
			
		||||
  translate.x += dimensional->getChildOffsetX();
 | 
			
		||||
  translate.y += dimensional->getChildOffsetY();
 | 
			
		||||
 | 
			
		||||
  item->setLocalPosition(translate);
 | 
			
		||||
  item.lock()->setLocalPosition(translate);
 | 
			
		||||
  this->alignmentNeedsUpdating = false;
 | 
			
		||||
  this->eventAlignmentUpdated.invoke();
 | 
			
		||||
}
 | 
			
		||||
@@ -240,7 +240,7 @@ void UIComponent::calculateDimensions(
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<UICanvas> UIComponent::getCanvas() {
 | 
			
		||||
  // TODO: Cache this on first hit.
 | 
			
		||||
  auto parent = item->getParent();
 | 
			
		||||
  auto parent = item.lock()->getParent();
 | 
			
		||||
  while(parent) {
 | 
			
		||||
    auto canvas = parent->getComponent<UICanvas>();
 | 
			
		||||
    if(canvas != nullptr) return canvas;
 | 
			
		||||
@@ -274,7 +274,7 @@ void UIComponent::onStart() {
 | 
			
		||||
  useEffect([&]{
 | 
			
		||||
    this->updateAlignment();
 | 
			
		||||
 | 
			
		||||
    auto child = this->item->findChildren<UIComponent>();
 | 
			
		||||
    auto child = this->item.lock()->findChildren<UIComponent>();
 | 
			
		||||
    auto itChild = child.begin();
 | 
			
		||||
    while(itChild != child.end()) {
 | 
			
		||||
      (*itChild)->alignmentNeedsUpdating = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -123,7 +123,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<glm::vec4> alignment;
 | 
			
		||||
 | 
			
		||||
      UIComponent(SceneItem *item);
 | 
			
		||||
      UIComponent(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the canvas that this UI element is belonging to.
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIComponentRenderable::UIComponentRenderable(SceneItem *i) : UIComponent(i) {
 | 
			
		||||
UIComponentRenderable::UIComponentRenderable(std::weak_ptr<SceneItem> i) : UIComponent(i) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class UIComponentRenderable : public UIComponent, public IRenderable {
 | 
			
		||||
    public:
 | 
			
		||||
      UIComponentRenderable(SceneItem *item);
 | 
			
		||||
      UIComponentRenderable(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      std::vector<struct ShaderPassItem> getRenderPasses(
 | 
			
		||||
        struct IRenderableContext &context
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIEmpty::UIEmpty(SceneItem *item) : UIComponent(item) { }
 | 
			
		||||
UIEmpty::UIEmpty(std::weak_ptr<SceneItem> item) : UIComponent(item) { }
 | 
			
		||||
 | 
			
		||||
float_t UIEmpty::getContentWidth() {
 | 
			
		||||
  return this->getWidthFromAlignment();
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class UIEmpty : public UIComponent {
 | 
			
		||||
    public:
 | 
			
		||||
      UIEmpty(SceneItem *item);
 | 
			
		||||
      UIEmpty(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
      float_t getChildOffsetX() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIImage::UIImage(SceneItem *item) :
 | 
			
		||||
UIImage::UIImage(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  texture(nullptr),
 | 
			
		||||
  UIComponentRenderable(item),
 | 
			
		||||
  uvs(glm::vec4(0, 1, 1, 0))
 | 
			
		||||
@@ -32,7 +32,7 @@ std::vector<struct ShaderPassItem> UIImage::getUIRenderPasses() {
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = this->color;
 | 
			
		||||
  item.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->item->getWorldTransform();
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->item.lock()->getWorldTransform();
 | 
			
		||||
  if(this->texture == nullptr) {
 | 
			
		||||
    item.boolValues[shader->paramHasTexture] = false;
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -40,7 +40,7 @@ std::vector<struct ShaderPassItem> UIImage::getUIRenderPasses() {
 | 
			
		||||
    item.textureSlots[0] = this->texture;
 | 
			
		||||
    item.textureValues[shader->paramTexture] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  item.w = this->item->getWorldPosition().z;
 | 
			
		||||
  item.w = this->item.lock()->getWorldPosition().z;
 | 
			
		||||
  item.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
 | 
			
		||||
  item.mesh = &mesh;
 | 
			
		||||
  return { item };
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<glm::vec4> uvs;
 | 
			
		||||
 | 
			
		||||
      UIImage(SceneItem *item);
 | 
			
		||||
      UIImage(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIMesh::UIMesh(SceneItem *i) :
 | 
			
		||||
UIMesh::UIMesh(std::weak_ptr<SceneItem> i) :
 | 
			
		||||
  texture(nullptr),
 | 
			
		||||
  UIComponentRenderable(i)
 | 
			
		||||
{
 | 
			
		||||
@@ -31,7 +31,7 @@ std::vector<struct ShaderPassItem> UIMesh::getUIRenderPasses() {
 | 
			
		||||
  shaderItem.shader = shader;
 | 
			
		||||
  shaderItem.colorValues[shader->paramColor] = this->color;
 | 
			
		||||
  shaderItem.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
 | 
			
		||||
  shaderItem.matrixValues[shader->paramModel] = item->getWorldTransform();
 | 
			
		||||
  shaderItem.matrixValues[shader->paramModel] = item.lock()->getWorldTransform();
 | 
			
		||||
  if(this->texture == nullptr) {
 | 
			
		||||
    shaderItem.boolValues[shader->paramHasTexture] = false;
 | 
			
		||||
  } else {
 | 
			
		||||
@@ -39,7 +39,7 @@ std::vector<struct ShaderPassItem> UIMesh::getUIRenderPasses() {
 | 
			
		||||
    shaderItem.textureSlots[0] = this->texture;
 | 
			
		||||
    shaderItem.textureValues[shader->paramTexture] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  shaderItem.w = item->getWorldPosition().z;
 | 
			
		||||
  shaderItem.w = item.lock()->getWorldPosition().z;
 | 
			
		||||
  shaderItem.renderFlags = RENDER_MANAGER_RENDER_FLAG_BLEND;
 | 
			
		||||
  shaderItem.mesh = &mesh;
 | 
			
		||||
  return { shaderItem };
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<Texture*> texture;
 | 
			
		||||
 | 
			
		||||
      UIMesh(SceneItem *item);
 | 
			
		||||
      UIMesh(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getUIRenderPasses() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIMenuController::UIMenuController(SceneItem *item) :
 | 
			
		||||
UIMenuController::UIMenuController(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item),
 | 
			
		||||
  active(true),
 | 
			
		||||
  menuX(0),
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ namespace Dawn {
 | 
			
		||||
      StateEvent<int32_t, int32_t> eventItemSelected;
 | 
			
		||||
      StateEvent<> eventMenuCancel;
 | 
			
		||||
 | 
			
		||||
      UIMenuController(SceneItem *item);
 | 
			
		||||
      UIMenuController(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UISimpleMenu::UISimpleMenu(SceneItem *item) :
 | 
			
		||||
UISimpleMenu::UISimpleMenu(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  SceneItemComponent(item)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -16,8 +16,8 @@ UISimpleMenu::UISimpleMenu(SceneItem *item) :
 | 
			
		||||
 | 
			
		||||
std::vector<std::shared_ptr<SceneItemComponent>> UISimpleMenu::getDependencies() {
 | 
			
		||||
  return {
 | 
			
		||||
    (this->menu = this->item->getComponent<UIMenuController>()),
 | 
			
		||||
    (this->canvas == nullptr ? (this->canvas = this->item->getComponent<UICanvas>()) : nullptr)
 | 
			
		||||
    (this->menu = this->item.lock()->getComponent<UIMenuController>()),
 | 
			
		||||
    (this->canvas == nullptr ? (this->canvas = this->item.lock()->getComponent<UICanvas>()) : nullptr)
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +26,7 @@ void UISimpleMenu::onStart() {
 | 
			
		||||
 | 
			
		||||
  assertNotNull(this->menu, "UISimpleMenu::onStart: Menu cannot be null");
 | 
			
		||||
  assertNotNull(this->canvas, "UISimpleMenu::onStart: Canvas cannot be null");
 | 
			
		||||
  menuItems = this->item->findChildren<UISimpleMenuItem>();
 | 
			
		||||
  menuItems = this->item.lock()->findChildren<UISimpleMenuItem>();
 | 
			
		||||
 | 
			
		||||
  auto updateSimpleMenuPos = [&](int32_t x, int32_t y) {
 | 
			
		||||
    if(currentlySelected != nullptr) {
 | 
			
		||||
@@ -75,7 +75,7 @@ void UISimpleMenu::onStart() {
 | 
			
		||||
          case UI_DRAW_TYPE_WORLD_ABSOLUTE:
 | 
			
		||||
            mouse *= 2.0f;
 | 
			
		||||
            mouse -= glm::vec2(1, 1);
 | 
			
		||||
            ray.origin = canvas->camera->item->getWorldPosition();
 | 
			
		||||
            ray.origin = canvas->camera->item.lock()->getWorldPosition();
 | 
			
		||||
            ray.direction = canvas->camera->getRayDirectionFromScreenSpace(mouse);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
@@ -107,7 +107,7 @@ void UISimpleMenu::onStart() {
 | 
			
		||||
          if(!raytestQuad(
 | 
			
		||||
            ray, 
 | 
			
		||||
            glm::vec2(0, 0), size,
 | 
			
		||||
            highlight->item->getWorldTransform(),
 | 
			
		||||
            highlight->item.lock()->getWorldTransform(),
 | 
			
		||||
            &point,
 | 
			
		||||
            &normal,
 | 
			
		||||
            &distance
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ namespace Dawn {
 | 
			
		||||
      std::vector<std::shared_ptr<UISimpleMenuItem>> menuItems;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      UISimpleMenu(SceneItem *item);
 | 
			
		||||
      UISimpleMenu(std::weak_ptr<SceneItem> item);
 | 
			
		||||
      std::vector<std::shared_ptr<SceneItemComponent>> getDependencies() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,11 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UISimpleMenuItem::UISimpleMenuItem(SceneItem *item) : SceneItemComponent(item) {
 | 
			
		||||
UISimpleMenuItem::UISimpleMenuItem(std::weak_ptr<SceneItem> item) : SceneItemComponent(item) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<UIComponent> UISimpleMenuItem::getComponentForHighlighting() {
 | 
			
		||||
  if(uiComponent == nullptr) uiComponent = item->getComponent<UIComponent>();
 | 
			
		||||
  if(uiComponent == nullptr) uiComponent = item.lock()->getComponent<UIComponent>();
 | 
			
		||||
  return uiComponent;
 | 
			
		||||
}
 | 
			
		||||
@@ -17,7 +17,7 @@ namespace Dawn {
 | 
			
		||||
      int32_t menuY = 0;
 | 
			
		||||
      std::shared_ptr<UIComponent> uiComponent = nullptr;
 | 
			
		||||
 | 
			
		||||
      UISimpleMenuItem(SceneItem *item);
 | 
			
		||||
      UISimpleMenuItem(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the UI component that this simple UI menu item uses to figure
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UILabel::UILabel(SceneItem *item) :
 | 
			
		||||
UILabel::UILabel(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  UIComponentRenderable(item),
 | 
			
		||||
  lineHeight(1.0f),
 | 
			
		||||
  textAlign(UI_LABEL_TEXT_ALIGN_LEFT)
 | 
			
		||||
@@ -90,7 +90,7 @@ std::vector<struct ShaderPassItem> UILabel::getUIRenderPasses() {
 | 
			
		||||
  auto shader = getGame()->renderManager->fontShader;
 | 
			
		||||
 | 
			
		||||
  // Translate
 | 
			
		||||
  glm::mat4 model = item->getWorldTransform();
 | 
			
		||||
  glm::mat4 model = item.lock()->getWorldTransform();
 | 
			
		||||
  model = glm::translate(model, glm::vec3(this->textOffset, 0.0f));
 | 
			
		||||
 | 
			
		||||
  struct ShaderPassItem item;
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<enum UILabelTextAlign> textAlign;
 | 
			
		||||
 | 
			
		||||
      UILabel(SceneItem *item);
 | 
			
		||||
      UILabel(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getUIRenderPasses() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UIRichTextLabel::UIRichTextLabel(SceneItem *item) :
 | 
			
		||||
UIRichTextLabel::UIRichTextLabel(std::weak_ptr<SceneItem> item) :
 | 
			
		||||
  UILabel(item)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ namespace Dawn {
 | 
			
		||||
      // @innerXml
 | 
			
		||||
      StateProperty<std::string> richText;
 | 
			
		||||
 | 
			
		||||
      UIRichTextLabel(SceneItem *item);
 | 
			
		||||
      UIRichTextLabel(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
using namespace Dawn;
 | 
			
		||||
 | 
			
		||||
UISimpleLabel::UISimpleLabel(SceneItem *i) :
 | 
			
		||||
UISimpleLabel::UISimpleLabel(std::weak_ptr<SceneItem> i) :
 | 
			
		||||
  UILabel(i),
 | 
			
		||||
  text("Hello World"),
 | 
			
		||||
  font(nullptr),
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ namespace Dawn {
 | 
			
		||||
      // @optional
 | 
			
		||||
      StateProperty<struct Color> color;
 | 
			
		||||
      
 | 
			
		||||
      UISimpleLabel(SceneItem *item);
 | 
			
		||||
      UISimpleLabel(std::weak_ptr<SceneItem> item);
 | 
			
		||||
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user