Brenta Engine 1.2
Loading...
Searching...
No Matches
transparent_pass.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/renderer/passes/transparent_pass.hpp>
7#include <brenta/renderer/opengl/gl.hpp>
8#include <brenta/renderer/material.hpp>
9#include <brenta/renderer/model.hpp>
10#include <brenta/renderer/point_light.hpp>
11#include <brenta/renderer/dir_light.hpp>
12#include <brenta/renderer/opengl/framebuffer.hpp>
13
14using namespace brenta;
15
16TransparentPass::TransparentPass(tenno::shared_ptr<FrameBuffer> fb,
17 bool clear, bool set_viewport)
18{
19 this->fb = fb;
20 this->clear = clear;
21 this->set_viewport = set_viewport;
22}
23
24void TransparentPass::begin()
25{
26 this->fb->bind();
27
28 if (this->set_viewport)
29 Gl::set_viewport(0, 0, this->fb->width, this->fb->height);
30
31 if (this->clear)
32 Gl::clear();
33}
34
35void TransparentPass::end()
36{
37 this->fb->unbind();
38}
39
40void TransparentPass::execute(const Renderer::RenderData& data)
41{
42 for (auto& command : data.transparent_queue)
43 {
44 auto material = command.model->material;
45 material->shader->use();
46
47 // Setup all lights
48 int lights_number = 0;
49 if (data.point_lights.size() > 0)
50 {
51 for (auto& point_light : data.point_lights)
52 {
53 point_light->apply(lights_number);
54 lights_number++;
55 }
56 }
57 material->shader->set_int("n_point_lights", lights_number);
58
59 if (data.dir_light)
60 data.dir_light.value()->apply();
61
62 material->shader->set_mat4("view", data.view);
63 material->shader->set_mat4("projection", data.projection);
64 material->shader->set_mat4("model",
65 // Node world position
66 command.world_matrix *
67 // Local transform
68 command.model->transform.get_model_matrix());
69 material->shader->set_vec3("view_pos", data.cam_position);
70
71 // Geometry
72 command.model->draw();
73 }
74}