Added UI Scaling support
This commit is contained in:
		@@ -32,8 +32,8 @@ void UICanvas::rebufferShaderParameters() {
 | 
			
		||||
    case UI_DRAW_TYPE_WORLD_CAMERA_RELATIVE:
 | 
			
		||||
      data.projection = glm::ortho(
 | 
			
		||||
        0.0f,
 | 
			
		||||
        camera->getRenderTarget()->getWidth(),
 | 
			
		||||
        camera->getRenderTarget()->getHeight(),
 | 
			
		||||
        camera->getRenderTarget()->getWidth() / this->getScale(),
 | 
			
		||||
        camera->getRenderTarget()->getHeight() / this->getScale(),
 | 
			
		||||
        0.0f
 | 
			
		||||
      );
 | 
			
		||||
      data.view = glm::mat4(1.0f);
 | 
			
		||||
@@ -46,6 +46,10 @@ void UICanvas::rebufferShaderParameters() {
 | 
			
		||||
  this->shaderBuffer.buffer(&data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float_t UICanvas::getScale() {
 | 
			
		||||
  return this->camera->getRenderTarget()->getScale();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float_t UICanvas::getWidth() {
 | 
			
		||||
  return w;
 | 
			
		||||
}
 | 
			
		||||
@@ -78,13 +82,13 @@ void UICanvas::onStart() {
 | 
			
		||||
 | 
			
		||||
  useEffectWithTeardown([&]{
 | 
			
		||||
    if(camera == nullptr) return evtRenderResize = [&] {};
 | 
			
		||||
    this->w = camera->getRenderTarget()->getWidth();
 | 
			
		||||
    this->h = camera->getRenderTarget()->getHeight();
 | 
			
		||||
    this->w = camera->getRenderTarget()->getWidth() / this->getScale();
 | 
			
		||||
    this->h = camera->getRenderTarget()->getHeight() / this->getScale();
 | 
			
		||||
    this->rebufferShaderParameters();
 | 
			
		||||
 | 
			
		||||
    return evtRenderResize = useEvent([&](float_t w, float_t h){
 | 
			
		||||
      this->w = w;
 | 
			
		||||
      this->h = h;
 | 
			
		||||
      this->w = w / this->getScale();
 | 
			
		||||
      this->h = h / this->getScale();
 | 
			
		||||
      this->rebufferShaderParameters();
 | 
			
		||||
      
 | 
			
		||||
      auto comps = this->item->findChildren<UIComponent>();
 | 
			
		||||
 
 | 
			
		||||
@@ -96,6 +96,13 @@ namespace Dawn {
 | 
			
		||||
       */
 | 
			
		||||
      UICanvas(SceneItem *item);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Returns the scale of this canvas.
 | 
			
		||||
       * 
 | 
			
		||||
       * @return The scale of the canvas, where 1 is default scaling.
 | 
			
		||||
       */
 | 
			
		||||
      float_t getScale();
 | 
			
		||||
 | 
			
		||||
      float_t getWidth() override;
 | 
			
		||||
      float_t getHeight() override;
 | 
			
		||||
      float_t getContentWidth() override;
 | 
			
		||||
 
 | 
			
		||||
@@ -130,8 +130,8 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
  quadCountTotal = 0;
 | 
			
		||||
  quadCount = -1;
 | 
			
		||||
  std::vector<struct UILabelText> realNewTexts;
 | 
			
		||||
 | 
			
		||||
  float_t maxWidth = this->width;
 | 
			
		||||
  float_t canvasScale = this->getCanvas()->getScale();
 | 
			
		||||
 | 
			
		||||
  // Reset
 | 
			
		||||
  lines.clear();
 | 
			
		||||
@@ -141,7 +141,7 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
  // Determine font dimensions.
 | 
			
		||||
  auto itText = newTexts.begin();
 | 
			
		||||
  while(itText != newTexts.end()) {
 | 
			
		||||
    position.y = mathMax<float_t>(position.y, itText->style.size/* this->lineHeight - THIS PART WOULD TAKE THE LINE HEIGHT INTO CONSIDERATION ON THE FIRST/INITIAL LINE */);
 | 
			
		||||
    position.y = mathMax<float_t>(position.y, itText->style.size);
 | 
			
		||||
    ++itText;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -163,7 +163,7 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
    // Lock the font
 | 
			
		||||
    assertNotNull(text.style.font, "UILabel::rebufferQuads: Font cannot be null");
 | 
			
		||||
    realText.lockId = text.style.font->lock(TrueTypeFaceTextureStyle{
 | 
			
		||||
      text.style.size,
 | 
			
		||||
      (uint32_t)(text.style.size * canvasScale),// Scale for resolution.
 | 
			
		||||
      text.style.style
 | 
			
		||||
    });
 | 
			
		||||
    assertTrue(realText.lockId != -1, "UILabel::rebufferQuads: Failed to lock font");
 | 
			
		||||
@@ -259,13 +259,27 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
 | 
			
		||||
      // Get font data.
 | 
			
		||||
      auto charInfo = realText.texture->getCharacterData(ch);
 | 
			
		||||
      
 | 
			
		||||
      // Now we scale down the char info here. This is because we fetch the 
 | 
			
		||||
      // texture of the font based on the canvas scale, but the sizes that we
 | 
			
		||||
      // render out need to be shrunk to match the original sizes.
 | 
			
		||||
      glm::vec2 charSize = glm::vec2(
 | 
			
		||||
        charInfo.bitmapSize.x / canvasScale, charInfo.bitmapSize.y / canvasScale
 | 
			
		||||
      );
 | 
			
		||||
      glm::vec2 charAdvance = glm::vec2(
 | 
			
		||||
        charInfo.advanceX / canvasScale, charInfo.advanceY / canvasScale
 | 
			
		||||
      );
 | 
			
		||||
      glm::vec2 charPos =  glm::vec2(
 | 
			
		||||
        charInfo.bitmapPosition.x / canvasScale,
 | 
			
		||||
        charInfo.bitmapPosition.y / canvasScale
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      // Word wrapping
 | 
			
		||||
      if(
 | 
			
		||||
        ch != ' ' &&
 | 
			
		||||
        lastSpaceCharacter != -1 &&
 | 
			
		||||
        maxWidth > charInfo.bitmapSize.x &&
 | 
			
		||||
        (position.x + charInfo.advanceX) > maxWidth
 | 
			
		||||
        maxWidth > charSize.x &&
 | 
			
		||||
        (position.x + charAdvance.x) > maxWidth
 | 
			
		||||
      ) {
 | 
			
		||||
        // Basically this rewinds everything we've done to the last space char,
 | 
			
		||||
        // changes it to a newline, and then moves the position along.
 | 
			
		||||
@@ -284,7 +298,7 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Buffer coordinates
 | 
			
		||||
      // Buffer coordinates, use original (non scaled) values.
 | 
			
		||||
      glm::vec4 uvs;
 | 
			
		||||
      uvs.x = 0.0f;
 | 
			
		||||
      uvs.y = charInfo.textureY / wh.y;
 | 
			
		||||
@@ -292,10 +306,10 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
      uvs.z = uvs.y + (charInfo.bitmapSize.y / wh.y);
 | 
			
		||||
      
 | 
			
		||||
      glm::vec4 vert;
 | 
			
		||||
      vert.x = position.x + charInfo.bitmapPosition.x;
 | 
			
		||||
      vert.y = position.y + charInfo.bitmapPosition.y;
 | 
			
		||||
      vert.w = vert.x + charInfo.bitmapSize.x;
 | 
			
		||||
      vert.z = vert.y + charInfo.bitmapSize.y;
 | 
			
		||||
      vert.x = position.x + charPos.x;
 | 
			
		||||
      vert.y = position.y + charPos.y;
 | 
			
		||||
      vert.w = vert.x + charSize.x;
 | 
			
		||||
      vert.z = vert.y + charSize.y;
 | 
			
		||||
      vertices.push_back(std::make_pair(vert, uvs));
 | 
			
		||||
 | 
			
		||||
      // Decorations
 | 
			
		||||
@@ -318,16 +332,16 @@ void UILabel::rebufferQuads(const std::vector<struct UILabelText> newTexts) {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Move the current position along.
 | 
			
		||||
      position.x += charInfo.advanceX;
 | 
			
		||||
      position.y += charInfo.advanceY;
 | 
			
		||||
      position.x += charAdvance.x;
 | 
			
		||||
      position.y += charAdvance.y;
 | 
			
		||||
 | 
			
		||||
      // Update the continuous dimensions
 | 
			
		||||
      if(ch == ' ') {
 | 
			
		||||
        lineWidth += wordWidth;
 | 
			
		||||
        lineWidth += charInfo.advanceX;
 | 
			
		||||
        lineWidth += charAdvance.x;
 | 
			
		||||
        wordWidth = 0.0f;
 | 
			
		||||
      } else {
 | 
			
		||||
        wordWidth += charInfo.advanceX;
 | 
			
		||||
        wordWidth += charAdvance.x;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Set the part index to the quad mappings
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user