Example of Rendering UI done.
This commit is contained in:
@ -12,52 +12,66 @@
|
||||
using namespace Dawn;
|
||||
|
||||
void UICanvas::onInit() {
|
||||
|
||||
mesh = std::make_shared<Mesh>();
|
||||
mesh->createBuffers(
|
||||
QUAD_VERTICE_COUNT * UI_SHADER_QUAD_COUNT,
|
||||
QUAD_INDICE_COUNT * UI_SHADER_QUAD_COUNT
|
||||
);
|
||||
|
||||
for(int32_t i = 0; i < UI_SHADER_QUAD_COUNT; i++) {
|
||||
QuadMesh::bufferWithIndex(
|
||||
mesh,
|
||||
glm::vec4(0, 0, 1, 1),
|
||||
glm::vec4(0, 0, 1, 1),
|
||||
i * QUAD_VERTICE_COUNT,
|
||||
i * QUAD_INDICE_COUNT,
|
||||
i * QUAD_VERTICE_COUNT
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void UICanvas::onDispose() {
|
||||
|
||||
mesh = nullptr;
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<IRenderPass>> UICanvas::getPasses(
|
||||
struct RenderPassContext &ctx
|
||||
) {
|
||||
std::vector<std::shared_ptr<IRenderPass>> passes;
|
||||
|
||||
auto selfTransform = this->getItem()->getWorldTransform();
|
||||
|
||||
auto mesh = std::make_shared<Mesh>();
|
||||
mesh->createBuffers(QUAD_VERTICE_COUNT, QUAD_INDICE_COUNT);
|
||||
QuadMesh::buffer(mesh, glm::vec4(0, 0, 32, 32), glm::vec4(0, 0, 1, 1), 0, 0);
|
||||
std::unordered_map<shadertexturebinding_t, std::shared_ptr<Texture>> textures;
|
||||
UIShaderData data = {
|
||||
.projection = ctx.camera->getProjection(),
|
||||
.view = ctx.camera->getItem()->getWorldTransform(),
|
||||
.model = selfTransform
|
||||
.model = this->getItem()->getWorldTransform()
|
||||
};
|
||||
|
||||
data.test.first = COLOR_RED;
|
||||
data.test.random = glm::vec3(0, 1, 0);
|
||||
data.test.second = COLOR_BLUE;
|
||||
|
||||
auto pass = createRenderPass<UIShader, UIShaderData>(
|
||||
std::ref(*this),
|
||||
data,
|
||||
std::unordered_map<shadertexturebinding_t, std::shared_ptr<Texture>>(),
|
||||
mesh,
|
||||
MeshDrawMode::TRIANGLES,
|
||||
0, -1
|
||||
);
|
||||
passes.push_back(pass);
|
||||
|
||||
size_t quadCount = 0;
|
||||
auto itComponents = components.begin();
|
||||
while(itComponents != components.end()) {
|
||||
auto component = *itComponents;
|
||||
|
||||
// Get this components' quads.
|
||||
auto quads = component->getQuads(selfTransform);
|
||||
|
||||
auto quads = component->getQuads(glm::mat4(1.0));
|
||||
for(auto quad : quads) {
|
||||
data.quads[quadCount++] = quad;
|
||||
assertTrue(quadCount <= UI_SHADER_QUAD_COUNT, "Too many UI quads!");
|
||||
}
|
||||
++itComponents;
|
||||
}
|
||||
|
||||
// No render passes if no quads.
|
||||
if(quadCount == 0) return passes;
|
||||
|
||||
auto pass = createRenderPass<UIShader, UIShaderData>(
|
||||
std::ref(*this),
|
||||
data,
|
||||
textures,
|
||||
mesh,
|
||||
MeshDrawMode::TRIANGLES,
|
||||
0, quadCount * QUAD_INDICE_COUNT
|
||||
);
|
||||
passes.push_back(pass);
|
||||
|
||||
|
||||
return passes;
|
||||
}
|
@ -14,6 +14,8 @@ namespace Dawn {
|
||||
public IRenderableComponent
|
||||
{
|
||||
protected:
|
||||
std::shared_ptr<Mesh> mesh;
|
||||
|
||||
virtual void onInit() override;
|
||||
virtual void onDispose() override;
|
||||
|
||||
|
Reference in New Issue
Block a user