Moved a few things to shader buffers, added some bugs that I have to fix
This commit is contained in:
		@@ -26,17 +26,11 @@ float_t UIBorder::getContentHeight() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = COLOR_WHITE;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
  item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
 | 
			
		||||
  if(this->texture == nullptr) {
 | 
			
		||||
    item.boolValues[shader->paramHasTexture] = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,32 @@ UICanvas::UICanvas(SceneItem *item) :
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UICanvas::rebufferShaderParameters() {
 | 
			
		||||
  struct UICanvasShaderParameterBufferData data;
 | 
			
		||||
 | 
			
		||||
  switch(this->drawType) {
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_ABSOLUTE:
 | 
			
		||||
      data.projection = camera->getProjection();
 | 
			
		||||
      data.view = camera->transform->getWorldTransform();
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
 | 
			
		||||
      data.projection = glm::ortho(
 | 
			
		||||
        0.0f,
 | 
			
		||||
        camera->getRenderTarget()->getWidth(),
 | 
			
		||||
        camera->getRenderTarget()->getHeight(),
 | 
			
		||||
        0.0f
 | 
			
		||||
      );
 | 
			
		||||
      data.view = glm::mat4(1.0f);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      assertUnreachable();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  this->shaderBuffer.buffer(&data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float_t UICanvas::getWidth() {
 | 
			
		||||
  return w;
 | 
			
		||||
}
 | 
			
		||||
@@ -36,41 +62,22 @@ float_t UICanvas::getContentHeight() {
 | 
			
		||||
  return this->getHeight();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UICanvas::getProjectionAndView(glm::mat4 *proj, glm::mat4 *view) {
 | 
			
		||||
  assertNotNull(proj);
 | 
			
		||||
  assertNotNull(view);
 | 
			
		||||
  
 | 
			
		||||
  switch(this->drawType) {
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_ABSOLUTE:
 | 
			
		||||
      *proj = camera->getProjection();
 | 
			
		||||
      *view = camera->transform->getWorldTransform();
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
 | 
			
		||||
      *proj = glm::ortho(
 | 
			
		||||
        0.0f,
 | 
			
		||||
        camera->getRenderTarget()->getWidth(),
 | 
			
		||||
        camera->getRenderTarget()->getHeight(),
 | 
			
		||||
        0.0f
 | 
			
		||||
      );
 | 
			
		||||
      *view = glm::mat4(1.0f);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      assertUnreachable();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UICanvas::onStart() {
 | 
			
		||||
  if(camera == nullptr) camera = getScene()->findComponent<Camera>();
 | 
			
		||||
 | 
			
		||||
  this->shaderBuffer.init();
 | 
			
		||||
  this->rebufferShaderParameters();
 | 
			
		||||
 | 
			
		||||
  useEffectWithTeardown([&]{
 | 
			
		||||
    if(camera == nullptr) return evtRenderResize = [&] {};
 | 
			
		||||
    this->w = camera->getRenderTarget()->getWidth();
 | 
			
		||||
    this->h = camera->getRenderTarget()->getHeight();
 | 
			
		||||
    this->rebufferShaderParameters();
 | 
			
		||||
 | 
			
		||||
    return evtRenderResize = useEvent([&](float_t w, float_t h){
 | 
			
		||||
      this->w = w;
 | 
			
		||||
      this->h = h;
 | 
			
		||||
      this->rebufferShaderParameters();
 | 
			
		||||
      
 | 
			
		||||
      auto comps = this->item->findChildren<UIComponent>();
 | 
			
		||||
      auto itComps = comps.begin();
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
#include "scene/SceneItemComponent.hpp"
 | 
			
		||||
#include "display/RenderTarget.hpp"
 | 
			
		||||
#include "scene/components/display/Camera.hpp"
 | 
			
		||||
#include "display/shader/shaders/UIShader.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class UIComponentDimensional {
 | 
			
		||||
@@ -52,7 +53,15 @@ namespace Dawn {
 | 
			
		||||
      float_t w = 1;
 | 
			
		||||
      float_t h = 1;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Rebuffers all of the necessary shader buffer data for this canvas to 
 | 
			
		||||
       * the GPU.
 | 
			
		||||
       */
 | 
			
		||||
      void rebufferShaderParameters();
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      UICanvasShaderParameterBuffer shaderBuffer;
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Creates a UI Canvas Scene Item Element, and attaches it to the provided
 | 
			
		||||
       * scene.
 | 
			
		||||
@@ -73,14 +82,6 @@ namespace Dawn {
 | 
			
		||||
       */
 | 
			
		||||
      UICanvas(SceneItem *item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Return the type of projection and view matrixes are used.
 | 
			
		||||
       * 
 | 
			
		||||
       * @param proj Projection matrix output.
 | 
			
		||||
       * @param view View matrix ouput.
 | 
			
		||||
       */
 | 
			
		||||
      void getProjectionAndView(glm::mat4 *proj, glm::mat4 *view);
 | 
			
		||||
 | 
			
		||||
      float_t getWidth() override;
 | 
			
		||||
      float_t getHeight() override;
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -169,6 +169,7 @@ UICanvas * UIComponent::getCanvas() {
 | 
			
		||||
    if(canvas != nullptr) return canvas;
 | 
			
		||||
    parent = parent->getParent();
 | 
			
		||||
  }
 | 
			
		||||
  assertUnreachable();
 | 
			
		||||
  return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,17 +26,11 @@ float_t UIImage::getContentHeight() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = this->color;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
  item.parameterBuffers[shader->bufferUiCanvas] = &this->getCanvas()->shaderBuffer;
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
 | 
			
		||||
  if(this->texture == nullptr) {
 | 
			
		||||
    item.boolValues[shader->paramHasTexture] = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -71,17 +71,11 @@ 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;
 | 
			
		||||
  auto shader = getGame()->renderManager.uiShader;
 | 
			
		||||
  item.shader = shader;
 | 
			
		||||
  item.colorValues[shader->paramColor] = textColor;
 | 
			
		||||
  item.matrixValues[shader->paramProjection] = proj;
 | 
			
		||||
  item.matrixValues[shader->paramView] = view;
 | 
			
		||||
  item.parameterBuffers[shader->bufferUiCanvas] = &getCanvas()->shaderBuffer;
 | 
			
		||||
  item.matrixValues[shader->paramModel] = this->transform->getWorldTransform();
 | 
			
		||||
  item.textureSlots[0] = this->font->getTexture();
 | 
			
		||||
  item.textureValues[shader->paramTexture] = 0;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user