Added IRenderable, removed shader programs and allow more nuanced control of render passes, UI items are now rendered same as other scene item components.
This commit is contained in:
		
							
								
								
									
										20
									
								
								src/dawn/scene/components/display/IRenderable.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/dawn/scene/components/display/IRenderable.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
// Copyright (c) 2023 Dominic Masters
 | 
			
		||||
// 
 | 
			
		||||
// This software is released under the MIT License.
 | 
			
		||||
// https://opensource.org/licenses/MIT
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "display/shader/Shader.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class IRenderable {
 | 
			
		||||
    public:
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the render passes for this renderable item, typically a scene
 | 
			
		||||
       * item component, e.g. a Material or a UI Item.
 | 
			
		||||
       * 
 | 
			
		||||
       * @return Array of renderable passes.
 | 
			
		||||
       */
 | 
			
		||||
      virtual std::vector<struct ShaderPassItem> getRenderPasses() = 0;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -6,9 +6,10 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "scene/SceneItemComponent.hpp"
 | 
			
		||||
#include "display/shader/ShaderManager.hpp"
 | 
			
		||||
#include "scene/components/display/IRenderable.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class Material : public SceneItemComponent {
 | 
			
		||||
  class Material : public SceneItemComponent, public IRenderable {
 | 
			
		||||
    public:
 | 
			
		||||
      /**
 | 
			
		||||
       * Material component constructor. 
 | 
			
		||||
@@ -16,12 +17,5 @@ namespace Dawn {
 | 
			
		||||
       * @param item Scene Item this component belongs to.
 | 
			
		||||
       */
 | 
			
		||||
      Material(SceneItem *item);
 | 
			
		||||
    
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the shader that this material uses.
 | 
			
		||||
       * 
 | 
			
		||||
       * @return Shader that belongs to this material.
 | 
			
		||||
       */
 | 
			
		||||
      virtual Shader * getShader() = 0;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -25,12 +25,15 @@ float_t UIBorder::getContentHeight() {
 | 
			
		||||
  return this->height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<struct ShaderPassItem> UIBorder::getPassItems(
 | 
			
		||||
  glm::mat4 proj, glm::mat4 view
 | 
			
		||||
) {
 | 
			
		||||
std::vector<struct ShaderPassItem> UIBorder::getRenderPasses() {
 | 
			
		||||
  glm::mat4 view, proj;
 | 
			
		||||
  auto canvas = this->getCanvas();
 | 
			
		||||
  assertNotNull(canvas);
 | 
			
		||||
  canvas->getProjectionAndView(&proj, &view);
 | 
			
		||||
 | 
			
		||||
  struct ShaderPassItem item;
 | 
			
		||||
  auto shader = &getGame()->renderManager.uiShader->program;
 | 
			
		||||
  item.shaderProgram = shader;
 | 
			
		||||
  auto shader = getGame()->renderManager.uiShader;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = COLOR_WHITE;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getPassItems(
 | 
			
		||||
        glm::mat4 proj, glm::mat4 view
 | 
			
		||||
      ) override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getRenderPasses() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -161,6 +161,17 @@ void UIComponent::calculateDimensions(
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
UICanvas * UIComponent::getCanvas() {
 | 
			
		||||
  // TODO: Cache this on first hit.
 | 
			
		||||
  auto parent = this->transform->getParent();
 | 
			
		||||
  while(parent != nullptr) {
 | 
			
		||||
    auto canvas = parent->item->getComponent<UICanvas>();
 | 
			
		||||
    if(canvas != nullptr) return canvas;
 | 
			
		||||
    parent = parent->getParent();
 | 
			
		||||
  }
 | 
			
		||||
  return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float_t UIComponent::getWidth() {
 | 
			
		||||
  return this->width;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "scene/SceneItemComponent.hpp"
 | 
			
		||||
#include "scene/components/display/IRenderable.hpp"
 | 
			
		||||
#include "UICanvas.hpp"
 | 
			
		||||
#include "util/mathutils.hpp"
 | 
			
		||||
 | 
			
		||||
@@ -21,7 +22,7 @@ namespace Dawn {
 | 
			
		||||
    UI_COMPONENT_ALIGN_UNIT_PERCENT
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  class UIComponentRenderable {
 | 
			
		||||
  class UIComponentRenderable : public IRenderable {
 | 
			
		||||
    public:
 | 
			
		||||
      /**
 | 
			
		||||
       * Implemented UI Components that have rendering should implement this and
 | 
			
		||||
@@ -32,10 +33,7 @@ namespace Dawn {
 | 
			
		||||
       * @param view Camera view, obtained from the canvas.
 | 
			
		||||
       * @return A list of renderable shader pass items for this renderable.
 | 
			
		||||
       */
 | 
			
		||||
      virtual std::vector<struct ShaderPassItem> getPassItems(
 | 
			
		||||
        glm::mat4 projection,
 | 
			
		||||
        glm::mat4 view
 | 
			
		||||
      ) = 0;
 | 
			
		||||
      virtual std::vector<struct ShaderPassItem> getRenderPasses() = 0;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  class UIComponent : public SceneItemComponent, public UIComponentDimensional {
 | 
			
		||||
@@ -114,6 +112,13 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
      UIComponent(SceneItem *item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the canvas that this UI element is belonging to.
 | 
			
		||||
       * 
 | 
			
		||||
       * @return Pointer to the UI Canvas this component is a child of.
 | 
			
		||||
       */
 | 
			
		||||
      UICanvas * getCanvas();
 | 
			
		||||
 | 
			
		||||
      float_t getWidth() override;
 | 
			
		||||
      float_t getHeight() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -25,12 +25,15 @@ float_t UIImage::getContentHeight() {
 | 
			
		||||
  return this->height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<struct ShaderPassItem> UIImage::getPassItems(
 | 
			
		||||
  glm::mat4 proj, glm::mat4 view
 | 
			
		||||
) {
 | 
			
		||||
std::vector<struct ShaderPassItem> UIImage::getRenderPasses() {
 | 
			
		||||
  glm::mat4 view, proj;
 | 
			
		||||
  auto canvas = this->getCanvas();
 | 
			
		||||
  assertNotNull(canvas);
 | 
			
		||||
  canvas->getProjectionAndView(&proj, &view);
 | 
			
		||||
  
 | 
			
		||||
  struct ShaderPassItem item;
 | 
			
		||||
  auto shader = &getGame()->renderManager.uiShader->program;
 | 
			
		||||
  item.shaderProgram = shader;
 | 
			
		||||
  auto shader = getGame()->renderManager.uiShader;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = this->color;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
 
 | 
			
		||||
@@ -22,9 +22,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getPassItems(
 | 
			
		||||
        glm::mat4 proj, glm::mat4 view
 | 
			
		||||
      ) override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getRenderPasses() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -67,15 +67,18 @@ void UILabel::updateMesh() {
 | 
			
		||||
  this->eventFontRebuffered.invoke();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<struct ShaderPassItem> UILabel::getPassItems(
 | 
			
		||||
  glm::mat4 proj, glm::mat4 view
 | 
			
		||||
) {
 | 
			
		||||
std::vector<struct ShaderPassItem> UILabel::getRenderPasses() {
 | 
			
		||||
  if(!this->hasText()) return {};
 | 
			
		||||
  this->updateMesh();
 | 
			
		||||
  
 | 
			
		||||
  glm::mat4 view, proj;
 | 
			
		||||
  auto canvas = this->getCanvas();
 | 
			
		||||
  assertNotNull(canvas);
 | 
			
		||||
  canvas->getProjectionAndView(&proj, &view);
 | 
			
		||||
 | 
			
		||||
  struct ShaderPassItem item;
 | 
			
		||||
  auto shader = &getGame()->renderManager.fontShader->program;
 | 
			
		||||
  item.shaderProgram = shader;
 | 
			
		||||
  auto shader = getGame()->renderManager.fontShader;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = textColor;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
 
 | 
			
		||||
@@ -53,9 +53,7 @@ namespace Dawn {
 | 
			
		||||
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
      float_t getContentHeight() override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getPassItems(
 | 
			
		||||
        glm::mat4 projection, glm::mat4 view
 | 
			
		||||
      ) override;
 | 
			
		||||
      std::vector<struct ShaderPassItem> getRenderPasses() override;
 | 
			
		||||
      void onStart() override;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user