mirror of
https://github.com/bailwillharr/engine.git
synced 2024-09-21 04:51:18 +00:00
Add stuff
This commit is contained in:
parent
e495183019
commit
69dae9ab42
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
#include "engine_api.h"
|
#include "engine_api.h"
|
||||||
|
|
||||||
#include "component.hpp"
|
#include "component.hpp"
|
||||||
@ -14,31 +12,32 @@
|
|||||||
|
|
||||||
namespace engine::components {
|
namespace engine::components {
|
||||||
|
|
||||||
class ENGINE_API UI : public Component {
|
class ENGINE_API UI : public Component {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UI(Object*);
|
UI(Object*);
|
||||||
~UI() override;
|
~UI() override;
|
||||||
|
|
||||||
// called every frame, do not call manually
|
// called every frame, do not call manually
|
||||||
void render(glm::mat4 transform);
|
void render(glm::mat4 transform, glm::mat4 view);
|
||||||
|
|
||||||
std::string m_text = "hello world";
|
std::string m_text = "hello world";
|
||||||
glm::vec3 m_color = {1.0f, 1.0f, 1.0f};
|
glm::vec3 m_color = { 1.0f, 1.0f, 1.0f };
|
||||||
|
|
||||||
|
enum class Alignment {
|
||||||
|
NONE = 0,
|
||||||
|
LEFT = 1,
|
||||||
|
RIGHT = 2
|
||||||
|
};
|
||||||
|
Alignment m_alignment = Alignment::LEFT;
|
||||||
|
bool m_scaled = true;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<resources::Font> m_font;
|
||||||
|
std::shared_ptr<resources::Shader> m_shader;
|
||||||
|
|
||||||
|
std::unique_ptr<resources::Mesh> m_atlasMesh;
|
||||||
|
|
||||||
enum class Alignment {
|
|
||||||
NONE = 0,
|
|
||||||
LEFT = 1,
|
|
||||||
RIGHT = 2
|
|
||||||
};
|
};
|
||||||
Alignment m_alignment = Alignment::LEFT;
|
|
||||||
bool m_scaled = true;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::shared_ptr<resources::Font> m_font;
|
|
||||||
std::shared_ptr<resources::Shader> m_shader;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
|
@ -29,7 +29,7 @@ namespace engine {
|
|||||||
void renderFrame();
|
void renderFrame();
|
||||||
|
|
||||||
// creates the equivalent of an OpenGL shader program & vertex attrib configuration
|
// creates the equivalent of an OpenGL shader program & vertex attrib configuration
|
||||||
gfx::Pipeline* createPipeline(const char* vertShaderPath, const char* fragShaderPath, const gfx::VertexFormat& vertexFormat, uint64_t uniformBufferSize);
|
gfx::Pipeline* createPipeline(const char* vertShaderPath, const char* fragShaderPath, const gfx::VertexFormat& vertexFormat, uint64_t uniformBufferSize, bool alphaBlending, bool backfaceCulling);
|
||||||
void destroyPipeline(const gfx::Pipeline* pipeline);
|
void destroyPipeline(const gfx::Pipeline* pipeline);
|
||||||
|
|
||||||
void updateUniformBuffer(const gfx::Pipeline* pipeline, void* data, size_t size, uint32_t offset);
|
void updateUniformBuffer(const gfx::Pipeline* pipeline, void* data, size_t size, uint32_t offset);
|
||||||
|
@ -16,19 +16,13 @@ class ENGINE_API Font : public Resource {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
struct Character {
|
|
||||||
gfx::Texture* texture;
|
|
||||||
glm::ivec2 size;
|
|
||||||
glm::ivec2 bearing; // offset from baseline to top-left of glyph
|
|
||||||
long advance; // offset to the next glyph
|
|
||||||
};
|
|
||||||
|
|
||||||
Font(const std::filesystem::path& resPath);
|
Font(const std::filesystem::path& resPath);
|
||||||
~Font() override;
|
~Font() override;
|
||||||
Character getChar(char c);
|
|
||||||
|
|
||||||
private:
|
const gfx::Texture* getAtlasTexture();
|
||||||
std::map<char, Character> m_characters;
|
|
||||||
|
private:
|
||||||
|
const gfx::Texture* m_atlas;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ namespace engine::components {
|
|||||||
|
|
||||||
Renderer::Renderer(Object* parent) : Component(parent, TypeEnum::RENDERER)
|
Renderer::Renderer(Object* parent) : Component(parent, TypeEnum::RENDERER)
|
||||||
{
|
{
|
||||||
m_shader = this->parent.res.get<resources::Shader>("shader.glsl");
|
m_shader = this->parent.res.get<resources::Shader>("shaders/texture.glsl");
|
||||||
m_texture = this->parent.res.get<resources::Texture>("textures/white.png");
|
m_texture = this->parent.res.get<resources::Texture>("textures/white.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#if 0
|
|
||||||
|
|
||||||
#include "components/text_ui_renderer.hpp"
|
#include "components/text_ui_renderer.hpp"
|
||||||
|
|
||||||
#include "object.hpp"
|
#include "object.hpp"
|
||||||
@ -14,76 +12,35 @@ UI::UI(Object* parent) : Component(parent, TypeEnum::UI)
|
|||||||
m_font = parent->res.get<resources::Font>(FONTFILE);
|
m_font = parent->res.get<resources::Font>(FONTFILE);
|
||||||
m_shader = parent->res.get<resources::Shader>("shaders/font.glsl");
|
m_shader = parent->res.get<resources::Shader>("shaders/font.glsl");
|
||||||
|
|
||||||
// glEnable(GL_BLEND);
|
m_atlasMesh = std::make_unique<resources::Mesh>(std::vector<Vertex>{
|
||||||
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
{ { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } },
|
||||||
|
{ { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f } },
|
||||||
|
{ { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f } },
|
||||||
|
{ { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } },
|
||||||
|
{ { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f } },
|
||||||
|
{ { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 1.0f, 1.0f } }
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UI::~UI()
|
UI::~UI()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UI::render(glm::mat4 transform)
|
void UI::render(glm::mat4 transform, glm::mat4 view)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
struct {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glm::mat4 m;
|
||||||
m_shader->setUniform_m4("modelMat", transform);
|
glm::vec2 offset;
|
||||||
|
glm::vec2 size;
|
||||||
|
} pushConsts{};
|
||||||
|
|
||||||
m_shader->setUniform_v3("textColor", m_color);
|
pushConsts.m = glm::mat4{1.0f};
|
||||||
m_shader->setUniform_i("textScaling", (int)m_scaled);
|
|
||||||
|
|
||||||
*/
|
gfxdev->draw(m_shader->getPipeline(), m_atlasMesh->vb, m_atlasMesh->ib, m_atlasMesh->m_indices.size(), &pushConsts, sizeof(pushConsts), m_font->getAtlasTexture());
|
||||||
|
|
||||||
std::vector<resources::Font::Character> glyphs;
|
|
||||||
for (char c : m_text) {
|
|
||||||
glyphs.push_back(m_font->getChar(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr float scale = 0.002f;
|
|
||||||
float x = 0.0f;
|
|
||||||
|
|
||||||
if (m_alignment == Alignment::RIGHT) {
|
|
||||||
|
|
||||||
// first find the length of the text
|
|
||||||
float len = 0.0f;
|
|
||||||
for (const auto& glyph : glyphs) {
|
|
||||||
len += (glyph.advance >> 6) * scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
x = -len;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& glyph : glyphs) {
|
|
||||||
|
|
||||||
float xpos = x + glyph.bearing.x * scale;
|
|
||||||
float ypos = (glyph.bearing.y - glyph.size.y) * scale;
|
|
||||||
|
|
||||||
float w = glyph.size.x * scale;
|
|
||||||
float h = glyph.size.y * scale;
|
|
||||||
|
|
||||||
/*
|
|
||||||
resources::Mesh mesh({
|
|
||||||
{{xpos, ypos + h, 0.0f}, {}, {0.0f, 0.0f}},
|
|
||||||
{{xpos, ypos , 0.0f}, {}, {0.0f, 1.0f}},
|
|
||||||
{{xpos + w, ypos, 0.0f}, {}, {1.0f, 1.0f}},
|
|
||||||
{{xpos, ypos + h, 0.0f}, {}, {0.0f, 0.0f}},
|
|
||||||
{{xpos + w, ypos, 0.0f}, {}, {1.0f, 1.0f}},
|
|
||||||
{{xpos + w, ypos + h, 0.0f}, {}, {1.0f, 0.0f}},
|
|
||||||
});*/
|
|
||||||
|
|
||||||
// glBindTexture(GL_TEXTURE_2D, glyph.textureID);
|
|
||||||
|
|
||||||
// mesh.drawMesh(*m_shader);
|
|
||||||
|
|
||||||
x += (glyph.advance >> 6) * scale;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
resources::Texture::invalidate();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
@ -1570,7 +1570,7 @@ namespace engine {
|
|||||||
renderPassInfo.renderArea.extent = pimpl->swapchain.extent;
|
renderPassInfo.renderArea.extent = pimpl->swapchain.extent;
|
||||||
|
|
||||||
std::array<VkClearValue, 2> clearValues{};
|
std::array<VkClearValue, 2> clearValues{};
|
||||||
clearValues[0].color = { {0.0f, 0.0f, 0.0f, 1.0f} };
|
clearValues[0].color = { {0.1f, 0.1f, 0.8f, 1.0f} };
|
||||||
clearValues[1].depthStencil = { 1.0f, 0 };
|
clearValues[1].depthStencil = { 1.0f, 0 };
|
||||||
renderPassInfo.clearValueCount = (uint32_t)clearValues.size();
|
renderPassInfo.clearValueCount = (uint32_t)clearValues.size();
|
||||||
renderPassInfo.pClearValues = clearValues.data();
|
renderPassInfo.pClearValues = clearValues.data();
|
||||||
@ -1666,7 +1666,7 @@ namespace engine {
|
|||||||
pimpl->FRAMECOUNT++;
|
pimpl->FRAMECOUNT++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx::Pipeline* GFXDevice::createPipeline(const char* vertShaderPath, const char* fragShaderPath, const gfx::VertexFormat& vertexFormat, uint64_t uniformBufferSize)
|
gfx::Pipeline* GFXDevice::createPipeline(const char* vertShaderPath, const char* fragShaderPath, const gfx::VertexFormat& vertexFormat, uint64_t uniformBufferSize, bool alphaBlending, bool backfaceCulling)
|
||||||
{
|
{
|
||||||
|
|
||||||
VkResult res;
|
VkResult res;
|
||||||
@ -1826,7 +1826,12 @@ namespace engine {
|
|||||||
rasterizer.rasterizerDiscardEnable = VK_FALSE;
|
rasterizer.rasterizerDiscardEnable = VK_FALSE;
|
||||||
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
|
rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
|
||||||
rasterizer.lineWidth = 1.0f;
|
rasterizer.lineWidth = 1.0f;
|
||||||
rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
|
if (backfaceCulling == true) {
|
||||||
|
rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rasterizer.cullMode = VK_CULL_MODE_NONE;
|
||||||
|
}
|
||||||
rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
||||||
rasterizer.depthBiasEnable = VK_FALSE;
|
rasterizer.depthBiasEnable = VK_FALSE;
|
||||||
rasterizer.depthBiasConstantFactor = 0.0f; // ignored
|
rasterizer.depthBiasConstantFactor = 0.0f; // ignored
|
||||||
@ -1848,13 +1853,18 @@ namespace engine {
|
|||||||
VK_COLOR_COMPONENT_G_BIT |
|
VK_COLOR_COMPONENT_G_BIT |
|
||||||
VK_COLOR_COMPONENT_B_BIT |
|
VK_COLOR_COMPONENT_B_BIT |
|
||||||
VK_COLOR_COMPONENT_A_BIT;
|
VK_COLOR_COMPONENT_A_BIT;
|
||||||
colorBlendAttachment.blendEnable = VK_FALSE;
|
if (alphaBlending) {
|
||||||
colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; // ignored
|
colorBlendAttachment.blendEnable = VK_TRUE;
|
||||||
colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; // ignored
|
colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
|
||||||
colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; // ignored
|
colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; // ignored
|
colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
|
||||||
colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; // ignored
|
colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
|
||||||
colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; // ignored
|
colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
|
||||||
|
colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
colorBlendAttachment.blendEnable = VK_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
VkPipelineColorBlendStateCreateInfo colorBlending{};
|
VkPipelineColorBlendStateCreateInfo colorBlending{};
|
||||||
colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
|
@ -123,8 +123,7 @@ namespace engine {
|
|||||||
compList.renderers.emplace_back(dynamic_cast<Renderer*>(comp), newTransform);
|
compList.renderers.emplace_back(dynamic_cast<Renderer*>(comp), newTransform);
|
||||||
break;
|
break;
|
||||||
case Component::TypeEnum::UI:
|
case Component::TypeEnum::UI:
|
||||||
// compList.uis.emplace_back(dynamic_cast<UI*>(comp), newTransform);
|
compList.uis.emplace_back(dynamic_cast<UI*>(comp), newTransform);
|
||||||
throw std::runtime_error("UI is currently not supported");
|
|
||||||
break;
|
break;
|
||||||
case Component::TypeEnum::CUSTOM:
|
case Component::TypeEnum::CUSTOM:
|
||||||
compList.customs.emplace_back(dynamic_cast<CustomComponent*>(comp), newTransform);
|
compList.customs.emplace_back(dynamic_cast<CustomComponent*>(comp), newTransform);
|
||||||
|
@ -14,63 +14,36 @@ Font::Font(const std::filesystem::path& resPath) : Resource(resPath, "font")
|
|||||||
{
|
{
|
||||||
|
|
||||||
// TODO: load font
|
// TODO: load font
|
||||||
auto fontBuffer = util::readBinaryFile(resPath);
|
auto fontBuffer = util::readBinaryFile(resPath.string());
|
||||||
|
|
||||||
stbtt_fontinfo info{};
|
constexpr int BITMAP_WIDTH = 1024;
|
||||||
int res = stbtt_InitFont(&info, fontBuffer->data(), 0);
|
constexpr int BITMAP_HEIGHT = 1024;
|
||||||
if (!res) {
|
auto pixels = std::make_unique<unsigned char[]>(BITMAP_WIDTH * BITMAP_HEIGHT);
|
||||||
throw std::runtime_error("Failed to read font file: " + resPath.string());
|
auto chardata = std::make_unique<stbtt_bakedchar[]>(96);
|
||||||
|
|
||||||
|
stbtt_BakeFontBitmap(fontBuffer->data(), 0, 128.0f, pixels.get(), BITMAP_WIDTH, BITMAP_HEIGHT, 32, 96, chardata.get());
|
||||||
|
|
||||||
|
auto textureData = std::make_unique<uint8_t[]>(BITMAP_WIDTH * BITMAP_HEIGHT * 4);
|
||||||
|
|
||||||
|
for (int i = 0; i < BITMAP_WIDTH * BITMAP_HEIGHT; i++) {
|
||||||
|
textureData[i * 4 + 0] = pixels[i];
|
||||||
|
textureData[i * 4 + 1] = pixels[i];
|
||||||
|
textureData[i * 4 + 2] = pixels[i];
|
||||||
|
textureData[i * 4 + 3] = pixels[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
float scale = stbtt_ScaleForPixelHeight(&info, 64);
|
m_atlas = gfxdev->createTexture(textureData.get(), BITMAP_WIDTH, BITMAP_HEIGHT, gfx::TextureFilter::LINEAR, gfx::TextureFilter::LINEAR);
|
||||||
|
|
||||||
for (unsigned char c = 0; c < 128; c++) {
|
|
||||||
|
|
||||||
// TODO: get character bitmap buffer, size, offsets, advance
|
|
||||||
int32_t advance = 0, xoff = 0;
|
|
||||||
stbtt_GetCodepointHMetrics(&info, c, &advance, &xoff);
|
|
||||||
|
|
||||||
int32_t w, h, yoff;
|
|
||||||
const uint8_t* bitmap = stbtt_GetCodepointBitmap(&info, scale, scale, c, &w, &h, &xoff, &yoff);
|
|
||||||
|
|
||||||
DEBUG("char width: {} char height: {}", w, h);
|
|
||||||
|
|
||||||
auto colorBuffer = std::make_unique<std::vector<uint32_t>>(w * h);
|
|
||||||
int i = 0;
|
|
||||||
for (uint32_t& col : *colorBuffer) {
|
|
||||||
if (bitmap[i] == 0) {
|
|
||||||
col = 0;
|
|
||||||
} else {
|
|
||||||
col = 0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate texture
|
|
||||||
gfx::Texture* texture = gfxdev->createTexture(colorBuffer->data(), w, h, gfx::TextureFilter::LINEAR, gfx::TextureFilter::LINEAR);
|
|
||||||
|
|
||||||
Character character = {
|
|
||||||
texture,
|
|
||||||
glm::ivec2{w, h}, // Size of Glyph
|
|
||||||
glm::ivec2{xoff, yoff}, // Offset from baseline (bottom-left) to top-left of glyph
|
|
||||||
advance
|
|
||||||
};
|
|
||||||
|
|
||||||
m_characters.insert(std::make_pair(c, character));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO clean up resources
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Font::~Font()
|
Font::~Font()
|
||||||
{
|
{
|
||||||
|
gfxdev->destroyTexture(m_atlas);
|
||||||
}
|
}
|
||||||
|
|
||||||
Font::Character Font::getChar(char c)
|
const gfx::Texture* Font::getAtlasTexture()
|
||||||
{
|
{
|
||||||
return m_characters.at(c);
|
return m_atlas;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,25 +4,7 @@
|
|||||||
|
|
||||||
#include "gfx_device.hpp"
|
#include "gfx_device.hpp"
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <fstream>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <span>
|
|
||||||
|
|
||||||
static std::unique_ptr<std::vector<char>> readFile(const char * path)
|
|
||||||
{
|
|
||||||
std::ifstream file(path, std::ios::binary | std::ios::ate);
|
|
||||||
//file.exceptions(std::ifstream::failbit); // throw exception if file cannot be opened
|
|
||||||
if (file.fail()) {
|
|
||||||
throw std::runtime_error("Failed to open file for reading: " + std::string(path));
|
|
||||||
}
|
|
||||||
size_t size = file.tellg();
|
|
||||||
file.seekg(0, std::ios::beg);
|
|
||||||
auto buf = std::make_unique<std::vector<char>>();
|
|
||||||
buf->resize(size);
|
|
||||||
file.rdbuf()->sgetn(buf->data(), size);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace engine::resources {
|
namespace engine::resources {
|
||||||
|
|
||||||
@ -38,7 +20,7 @@ Shader::Shader(const std::filesystem::path& resPath) : Resource(resPath, "shader
|
|||||||
const std::string vertexShaderPath = (resPath.parent_path()/std::filesystem::path(resPath.stem().string() + ".vert")).string();
|
const std::string vertexShaderPath = (resPath.parent_path()/std::filesystem::path(resPath.stem().string() + ".vert")).string();
|
||||||
const std::string fragmentShaderPath = (resPath.parent_path()/std::filesystem::path(resPath.stem().string() + ".frag")).string();
|
const std::string fragmentShaderPath = (resPath.parent_path()/std::filesystem::path(resPath.stem().string() + ".frag")).string();
|
||||||
|
|
||||||
m_pipeline = gfxdev->createPipeline(vertexShaderPath.c_str(), fragmentShaderPath.c_str(), vertexFormat, sizeof(UniformBuffer));
|
m_pipeline = gfxdev->createPipeline(vertexShaderPath.c_str(), fragmentShaderPath.c_str(), vertexFormat, sizeof(UniformBuffer), true, true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,16 +57,16 @@ namespace engine {
|
|||||||
ren->render(ren_t, view);
|
ren->render(ren_t, view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (const auto& [textRen, textRen_t] : compList.uis) {
|
||||||
|
textRen->render(textRen_t, view);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for (const auto& [c, t] : compList.uis) {
|
|
||||||
c->render(t);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneRoot::activateCam(int id)
|
void SceneRoot::activateCam(int id)
|
||||||
|
BIN
test/res/models/van/van.dae
(Stored with Git LFS)
Normal file
BIN
test/res/models/van/van.dae
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1,37 +0,0 @@
|
|||||||
#version 330
|
|
||||||
|
|
||||||
uniform float ambientStrength;
|
|
||||||
uniform vec3 ambientColor;
|
|
||||||
|
|
||||||
uniform vec3 lightColor;
|
|
||||||
uniform vec3 emission;
|
|
||||||
|
|
||||||
uniform vec3 baseColor;
|
|
||||||
uniform sampler2D tex;
|
|
||||||
|
|
||||||
in vec3 f_Pos;
|
|
||||||
in vec3 f_Norm;
|
|
||||||
in vec2 f_UV;
|
|
||||||
|
|
||||||
in vec3 f_lightPos;
|
|
||||||
|
|
||||||
out vec4 FragColor;
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
|
|
||||||
vec3 norm = normalize(f_Norm);
|
|
||||||
vec3 lightDir = normalize(f_lightPos - f_Pos);
|
|
||||||
|
|
||||||
vec3 diffuse = max(dot(norm, lightDir), 0.0) * lightColor;
|
|
||||||
vec3 ambient = ambientColor * ambientStrength;
|
|
||||||
|
|
||||||
vec3 viewDir = normalize(-f_Pos);
|
|
||||||
vec3 reflectDir = reflect(-lightDir, norm);
|
|
||||||
|
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
|
|
||||||
vec3 specular = 0.5 * spec * lightColor;
|
|
||||||
|
|
||||||
vec3 lighting = min(diffuse + ambient + specular, 1.0);
|
|
||||||
FragColor = min( ( vec4(baseColor, 1.0) * texture(tex, f_UV) ) * vec4(lighting + emission, 1.0), vec4(1.0));
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
#version 330
|
|
||||||
|
|
||||||
layout (location = 0) in vec3 v_Position;
|
|
||||||
layout (location = 1) in vec3 v_Norm;
|
|
||||||
layout (location = 2) in vec2 v_UV;
|
|
||||||
|
|
||||||
uniform mat4 modelMat;
|
|
||||||
uniform mat4 viewMat;
|
|
||||||
uniform mat4 projMat;
|
|
||||||
|
|
||||||
uniform vec3 lightPos;
|
|
||||||
|
|
||||||
out vec3 f_Pos;
|
|
||||||
out vec3 f_Norm;
|
|
||||||
out vec2 f_UV;
|
|
||||||
|
|
||||||
out vec3 f_lightPos;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
gl_Position = projMat * viewMat * modelMat * vec4(v_Position, 1.0);
|
|
||||||
f_Pos = vec3(viewMat * modelMat * vec4(v_Position, 1.0));
|
|
||||||
f_Norm = mat3(transpose(inverse(viewMat * modelMat))) * v_Norm;
|
|
||||||
f_UV = v_UV;
|
|
||||||
f_lightPos = vec3(viewMat * vec4(lightPos, 1.0));
|
|
||||||
}
|
|
@ -1,14 +1,12 @@
|
|||||||
#version 330
|
#version 450
|
||||||
|
|
||||||
uniform vec3 textColor;
|
layout(location = 0) in vec2 fragUV;
|
||||||
|
|
||||||
uniform sampler2D tex;
|
layout(location = 0) out vec4 outColor;
|
||||||
|
|
||||||
in vec2 f_UV;
|
layout(set = 1, binding = 0) uniform sampler2D texSampler;
|
||||||
|
|
||||||
out vec4 FragColor;
|
void main() {
|
||||||
|
outColor = texture(texSampler, fragUV);
|
||||||
void main()
|
|
||||||
{
|
|
||||||
FragColor = vec4(textColor, texture(tex, f_UV).r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +1,18 @@
|
|||||||
#version 330
|
#version 450
|
||||||
|
|
||||||
uniform vec2 windowSize;
|
layout( push_constant ) uniform Constants {
|
||||||
uniform bool textScaling; // true means keep text aspect ratio
|
mat4 model;
|
||||||
|
vec2 offset;
|
||||||
|
vec2 size;
|
||||||
|
} constants;
|
||||||
|
|
||||||
layout (location = 0) in vec3 v_Position;
|
layout(location = 0) in vec3 inPosition;
|
||||||
layout (location = 2) in vec2 v_UV;
|
layout(location = 1) in vec3 inNorm;
|
||||||
|
layout(location = 2) in vec2 inUV;
|
||||||
|
|
||||||
uniform mat4 modelMat;
|
layout(location = 0) out vec2 fragUV;
|
||||||
|
|
||||||
out vec2 f_UV;
|
void main() {
|
||||||
|
gl_Position = constants.model * vec4(inPosition, 1.0);
|
||||||
void main()
|
fragUV = inUV;
|
||||||
{
|
|
||||||
float aspect = windowSize.y / windowSize.x;
|
|
||||||
|
|
||||||
vec3 pos = v_Position;
|
|
||||||
|
|
||||||
if (textScaling) {
|
|
||||||
pos.x *= aspect;
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_Position = modelMat * vec4(pos, 1.0);
|
|
||||||
f_UV = v_UV;
|
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ void main() {
|
|||||||
// constants
|
// constants
|
||||||
vec3 lightColor = vec3(1.0, 1.0, 1.0);
|
vec3 lightColor = vec3(1.0, 1.0, 1.0);
|
||||||
vec3 ambientColor = vec3(1.0, 1.0, 1.0);
|
vec3 ambientColor = vec3(1.0, 1.0, 1.0);
|
||||||
float ambientStrength = 0.1;
|
float ambientStrength = 0.05;
|
||||||
vec3 baseColor = vec3(texture(texSampler, fragUV));
|
vec3 baseColor = vec3(texture(texSampler, fragUV));
|
||||||
vec3 emission = vec3(0.0, 0.0, 0.0);
|
vec3 emission = vec3(0.0, 0.0, 0.0);
|
||||||
|
|
@ -23,6 +23,6 @@ void main() {
|
|||||||
fragPos = vec3(constants.view * constants.model * vec4(inPosition, 1.0));
|
fragPos = vec3(constants.view * constants.model * vec4(inPosition, 1.0));
|
||||||
fragNorm = mat3(transpose(inverse(constants.view * constants.model))) * inNorm;
|
fragNorm = mat3(transpose(inverse(constants.view * constants.model))) * inNorm;
|
||||||
fragUV = inUV;
|
fragUV = inUV;
|
||||||
vec3 lightPos = vec3(-5.0, 20.0, 5.0);
|
vec3 lightPos = vec3(-500.0, 500.0, 40.0);
|
||||||
fragLightPos = vec3(constants.view * vec4(lightPos, 1.0));
|
fragLightPos = vec3(constants.view * vec4(lightPos, 1.0));
|
||||||
}
|
}
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "components/camera.hpp"
|
#include "components/camera.hpp"
|
||||||
#include "components/mesh_renderer.hpp"
|
#include "components/mesh_renderer.hpp"
|
||||||
|
#include "components/text_ui_renderer.hpp"
|
||||||
|
|
||||||
#include "resource_manager.hpp"
|
#include "resource_manager.hpp"
|
||||||
#include "resources/texture.hpp"
|
#include "resources/texture.hpp"
|
||||||
@ -73,6 +74,7 @@ void playGame()
|
|||||||
|
|
||||||
// FLOOR
|
// FLOOR
|
||||||
|
|
||||||
|
/*
|
||||||
constexpr float GRASS_DENSITY = 128.0f * 20.0f;
|
constexpr float GRASS_DENSITY = 128.0f * 20.0f;
|
||||||
auto floor = app.scene()->createChild("floor");
|
auto floor = app.scene()->createChild("floor");
|
||||||
auto floorRenderer = floor->createComponent<engine::components::Renderer>();
|
auto floorRenderer = floor->createComponent<engine::components::Renderer>();
|
||||||
@ -87,11 +89,12 @@ void playGame()
|
|||||||
{ { -16.0f, 0.0f, 16.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, GRASS_DENSITY } }
|
{ { -16.0f, 0.0f, 16.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, GRASS_DENSITY } }
|
||||||
});
|
});
|
||||||
floor->transform.scale = { 100.0f, 1.0f, 100.0f };
|
floor->transform.scale = { 100.0f, 1.0f, 100.0f };
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
auto cube = app.scene()->createChild("cube");
|
auto cube = app.scene()->createChild("cube");
|
||||||
auto cubeRen = cube->createComponent<engine::components::Renderer>();
|
auto cubeRen = cube->createComponent<engine::components::Renderer>();
|
||||||
cubeRen->setMesh("meshes/cube.mesh");
|
cubeRen->setMesh("meshes/cube.mesh");
|
||||||
|
|
||||||
cube->transform.position = glm::vec3{ -5.0f, 1.0f, 0.0f };
|
cube->transform.position = glm::vec3{ -5.0f, 1.0f, 0.0f };
|
||||||
class Spin : public engine::components::CustomComponent {
|
class Spin : public engine::components::CustomComponent {
|
||||||
|
|
||||||
@ -126,12 +129,13 @@ void playGame()
|
|||||||
|
|
||||||
};
|
};
|
||||||
app.scene()->getChild("cube")->createComponent<Spin>();
|
app.scene()->getChild("cube")->createComponent<Spin>();
|
||||||
|
*/
|
||||||
|
|
||||||
auto sphere = app.scene()->createChild("sphere");
|
/*auto sphere = app.scene()->createChild("sphere");
|
||||||
|
|
||||||
sphere->transform.position = { 10.0f, 5.0f, 10.0f };
|
sphere->transform.position = { 10.0f, 5.0f, 10.0f };
|
||||||
|
*/
|
||||||
|
|
||||||
auto sphereRenderer = sphere->createComponent<engine::components::Renderer>();
|
/*auto sphereRenderer = sphere->createComponent<engine::components::Renderer>();
|
||||||
sphereRenderer->m_mesh = genSphereMesh(5.0f, 100, false);
|
sphereRenderer->m_mesh = genSphereMesh(5.0f, 100, false);
|
||||||
sphereRenderer->setTexture("textures/cobble_stone.png");
|
sphereRenderer->setTexture("textures/cobble_stone.png");
|
||||||
|
|
||||||
@ -140,7 +144,13 @@ void playGame()
|
|||||||
auto boundsRen = bounds->createComponent<engine::components::Renderer>();
|
auto boundsRen = bounds->createComponent<engine::components::Renderer>();
|
||||||
boundsRen->m_mesh = genSphereMesh(100.0f, 36, true);
|
boundsRen->m_mesh = genSphereMesh(100.0f, 36, true);
|
||||||
boundsRen->setTexture("textures/metal.jpg");
|
boundsRen->setTexture("textures/metal.jpg");
|
||||||
|
*/
|
||||||
|
|
||||||
|
auto message = app.scene()->createChild("message");
|
||||||
|
message->transform.position = { 0.0f, 2.0f, 0.0f };
|
||||||
|
auto messageUI = message->createComponent<engine::components::UI>();
|
||||||
|
|
||||||
|
/*
|
||||||
auto myModel = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/pyramid/pyramid.dae").string());
|
auto myModel = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/pyramid/pyramid.dae").string());
|
||||||
myModel->transform.position = { -5.0f, 2.0f, 7.0f };
|
myModel->transform.position = { -5.0f, 2.0f, 7.0f };
|
||||||
|
|
||||||
@ -153,14 +163,12 @@ void playGame()
|
|||||||
|
|
||||||
auto plane = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/plane/plane.dae").string());
|
auto plane = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/plane/plane.dae").string());
|
||||||
plane->transform.position = { -30.0f, 2.0f, 10.0f };
|
plane->transform.position = { -30.0f, 2.0f, 10.0f };
|
||||||
|
*/
|
||||||
|
|
||||||
auto lego = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/lego/lego.dae").string());
|
auto lego = engine::util::loadAssimpMeshFromFile(app.scene(), app.resources()->getFilePath("models/lego/lego.dae").string());
|
||||||
lego->transform.position = { 30.0f, -2.0f, 30.0f };
|
lego->transform.position = { -30.0f, -33.0f, -30.0f };
|
||||||
lego->transform.scale = { 0.1f, 0.1f, 0.1f };
|
|
||||||
|
|
||||||
app.scene()->printTree();
|
app.scene()->printTree();
|
||||||
|
|
||||||
auto myFont = app.resources()->get<engine::resources::Font>("fonts/LiberationMono-Regular.ttf");
|
|
||||||
|
|
||||||
app.gameLoop();
|
app.gameLoop();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user