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