Add Font BoundingBox calculation
This commit is contained in:
@@ -201,6 +201,7 @@
|
||||
<ClCompile Include="src\copium\pipeline\DescriptorPool.cpp" />
|
||||
<ClCompile Include="src\copium\pipeline\DescriptorSet.cpp" />
|
||||
<ClCompile Include="src\copium\sampler\Font.cpp" />
|
||||
<ClCompile Include="src\copium\util\BoundingBox.cpp" />
|
||||
<ClCompile Include="src\copium\util\RuntimeException.cpp" />
|
||||
<ClCompile Include="src\copium\util\FileSystem.cpp" />
|
||||
<ClCompile Include="src\copium\buffer\Framebuffer.cpp" />
|
||||
@@ -260,6 +261,7 @@
|
||||
<ClInclude Include="src\copium\buffer\CommandBuffer.h" />
|
||||
<ClInclude Include="src\copium\sampler\Font.h" />
|
||||
<ClInclude Include="src\copium\sampler\Glyph.h" />
|
||||
<ClInclude Include="src\copium\util\BoundingBox.h" />
|
||||
<ClInclude Include="src\copium\util\Common.h" />
|
||||
<ClInclude Include="src\copium\core\DebugMessenger.h" />
|
||||
<ClInclude Include="src\copium\pipeline\DescriptorSet.h" />
|
||||
|
||||
@@ -183,6 +183,9 @@
|
||||
<ClCompile Include="src\copium\sampler\Font.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\copium\util\BoundingBox.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\copium\sampler\DepthAttachment.h">
|
||||
@@ -374,5 +377,8 @@
|
||||
<ClInclude Include="src\copium\util\Enum.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\copium\util\BoundingBox.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,3 +1,3 @@
|
||||
[Font]
|
||||
filepath=res/fonts/Roboto-Thin.ttf
|
||||
filepath=res/fonts/Roboto-Regular.ttf
|
||||
uuid=3e9ef1a2-59ba-2e4d-b2cd-f5efaa531af7
|
||||
@@ -223,7 +223,10 @@ namespace Copium
|
||||
renderer->Quad(glm::vec2{ 0.1, -0.4}, glm::vec2{0.8, 0.8}, AssetManager::GetAsset<Font>(font));
|
||||
renderer->Quad(mousePos - glm::vec2(0.1), glm::vec2{0.2}, AssetManager::GetAsset<Texture2D>(texture2D2));
|
||||
std::string s = std::to_string(fps) + " fps";
|
||||
renderer->Text(s, glm::vec2{-aspect + 0.01, 0.94}, AssetManager::GetAsset<Font>(font), 0.06, glm::vec3{0.3, 0.2, 0.8});
|
||||
BoundingBox boundingBox = AssetManager::GetAsset<Font>(font).GetTextBoundingBox(s, 0.06);
|
||||
glm::vec2 pos = glm::vec2{-aspect + 0.01, 0.94};
|
||||
renderer->Quad(pos + boundingBox.lb, boundingBox.GetSize());
|
||||
renderer->Text(s, pos, AssetManager::GetAsset<Font>(font), 0.06, glm::vec3{0.0f});
|
||||
renderer->End();
|
||||
|
||||
fb.Unbind(*commandBuffer);
|
||||
|
||||
@@ -74,10 +74,10 @@ namespace Copium
|
||||
const Glyph& glyph = font.GetGlyph(c);
|
||||
AllocateQuad();
|
||||
int texIndex = AllocateSampler(font);
|
||||
AddVertex(offset + glm::vec2{glyph.pos1.x * size, glyph.pos1.y * size}, color, texIndex, glyph.texCoord1, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.pos2.x * size, glyph.pos1.y * size}, color, texIndex, glm::vec2{glyph.texCoord2.x, glyph.texCoord1.y}, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.pos2.x * size, glyph.pos2.y * size}, color, texIndex, glyph.texCoord2, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.pos1.x * size, glyph.pos2.y * size}, color, texIndex, glm::vec2{glyph.texCoord1.x, glyph.texCoord2.y}, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.boundingBox.l * size, glyph.boundingBox.b * size}, color, texIndex, glyph.texCoordBoundingBox.lb, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.b * size}, color, texIndex, glm::vec2{glyph.texCoordBoundingBox.r, glyph.texCoordBoundingBox.b}, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.t * size}, color, texIndex, glyph.texCoordBoundingBox.rt, RendererVertex::TYPE_TEXT);
|
||||
AddVertex(offset + glm::vec2{glyph.boundingBox.l * size, glyph.boundingBox.t * size}, color, texIndex, glm::vec2{glyph.texCoordBoundingBox.l, glyph.texCoordBoundingBox.t}, RendererVertex::TYPE_TEXT);
|
||||
offset.x += glyph.advance * size;
|
||||
}
|
||||
return offset;
|
||||
|
||||
@@ -60,11 +60,9 @@ namespace Copium
|
||||
glyph.advance = glyphGeom.getAdvance();
|
||||
double l, b, r, t;
|
||||
glyphGeom.getQuadPlaneBounds(l, b, r, t);
|
||||
glyph.pos1 = glm::vec2{l, b};
|
||||
glyph.pos2 = glm::vec2{r, t};
|
||||
glyph.boundingBox = BoundingBox{(float)l, (float)b, (float)r, (float)t};
|
||||
glyphGeom.getQuadAtlasBounds(l, b, r, t);
|
||||
glyph.texCoord1 = glm::vec2{l / width, b / height};
|
||||
glyph.texCoord2 = glm::vec2{r / width, t / height};
|
||||
glyph.texCoordBoundingBox = BoundingBox{(float)l / width, (float)b / height, (float)r / width, (float)t / height};
|
||||
this->glyphs.emplace((char)glyphGeom.getCodepoint(), glyph);
|
||||
}
|
||||
lineHeight = fontGeometry.getMetrics().lineHeight;
|
||||
@@ -101,6 +99,42 @@ namespace Copium
|
||||
return lineHeight;
|
||||
}
|
||||
|
||||
BoundingBox Font::GetTextBoundingBox(const std::string& str, float size) const
|
||||
{
|
||||
BoundingBox boundingBox{0.0f};
|
||||
glm::vec2 offset{0.0f};
|
||||
for (auto c : str)
|
||||
{
|
||||
if(c == ' ')
|
||||
{
|
||||
const Glyph& glyph = GetGlyph(c);
|
||||
offset.x += glyph.advance;
|
||||
continue;
|
||||
}
|
||||
else if (c == '\t')
|
||||
{
|
||||
const Glyph& glyph = GetGlyph(' ');
|
||||
offset.x += glyph.advance * 4;
|
||||
continue;
|
||||
}
|
||||
else if (c == '\n')
|
||||
{
|
||||
boundingBox.r = std::max(boundingBox.r, offset.x);
|
||||
offset.y -= GetLineHeight();
|
||||
offset.x = 0.0f;
|
||||
continue;
|
||||
}
|
||||
const Glyph& glyph = GetGlyph(c);
|
||||
boundingBox.l = std::min(boundingBox.l, offset.x + glyph.boundingBox.l);
|
||||
boundingBox.t = std::max(boundingBox.t, offset.y + glyph.boundingBox.t);
|
||||
offset.x += glyph.advance;
|
||||
boundingBox.b = std::min(boundingBox.b, offset.y + glyph.boundingBox.b);
|
||||
}
|
||||
boundingBox.r = std::max(boundingBox.r, offset.x);
|
||||
boundingBox.lbrt *= size;
|
||||
return boundingBox;
|
||||
}
|
||||
|
||||
void Font::InitializeTextureImageFromData(const uint8_t* rgbaData, int width, int height)
|
||||
{
|
||||
VkDeviceSize bufferSize = width * height * 4;
|
||||
|
||||
@@ -2,16 +2,13 @@
|
||||
|
||||
#include "copium/sampler/Sampler.h"
|
||||
#include "copium/sampler/Glyph.h"
|
||||
#include "copium/util/BoundingBox.h"
|
||||
|
||||
namespace Copium
|
||||
{
|
||||
class Font : public Sampler
|
||||
{
|
||||
CP_DELETE_COPY_AND_MOVE_CTOR(Font);
|
||||
struct GlyphData
|
||||
{
|
||||
|
||||
};
|
||||
private:
|
||||
VkImage image;
|
||||
VkDeviceMemory imageMemory;
|
||||
@@ -27,6 +24,8 @@ namespace Copium
|
||||
|
||||
const Glyph& GetGlyph(char c) const;
|
||||
float GetLineHeight() const;
|
||||
|
||||
BoundingBox GetTextBoundingBox(const std::string& str, float size) const;
|
||||
private:
|
||||
void InitializeTextureImageFromFile(const std::string& filename);
|
||||
void InitializeTextureImageFromData(const uint8_t* rgbaData, int width, int height);
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include "copium/util/BoundingBox.h"
|
||||
|
||||
namespace Copium
|
||||
{
|
||||
struct Glyph
|
||||
{
|
||||
float advance;
|
||||
glm::vec2 pos1;
|
||||
glm::vec2 pos2;
|
||||
glm::vec2 texCoord1;
|
||||
glm::vec2 texCoord2;
|
||||
BoundingBox boundingBox;
|
||||
BoundingBox texCoordBoundingBox;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#include "copium/util/BoundingBox.h"
|
||||
|
||||
namespace Copium
|
||||
{
|
||||
BoundingBox::BoundingBox()
|
||||
: l{0.0f}, b{0.0f}, r{0.0f}, t{0.0f}
|
||||
{}
|
||||
|
||||
BoundingBox::BoundingBox(float all)
|
||||
: l{all}, b{all}, r{all}, t{all}
|
||||
{}
|
||||
|
||||
BoundingBox::BoundingBox(float l, float b, float r, float t)
|
||||
: l{l}, b{b}, r{r}, t{t}
|
||||
{}
|
||||
|
||||
BoundingBox::BoundingBox(glm::vec2 lb, glm::vec2 rt)
|
||||
: lb{lb}, rt{rt}
|
||||
{}
|
||||
|
||||
glm::vec2 BoundingBox::GetSize() const
|
||||
{
|
||||
return rt - lb;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
namespace Copium
|
||||
{
|
||||
struct BoundingBox
|
||||
{
|
||||
union
|
||||
{
|
||||
struct { float l; float b; float r; float t; };
|
||||
struct { glm::vec2 lb; glm::vec2 rt; };
|
||||
struct { glm::vec4 lbrt; };
|
||||
};
|
||||
BoundingBox();
|
||||
BoundingBox(float all);
|
||||
BoundingBox(float l, float b, float r, float t);
|
||||
BoundingBox(glm::vec2 lb, glm::vec2 rt);
|
||||
|
||||
glm::vec2 GetSize() const;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user