Horizontal rendering
This commit is contained in:
@@ -88,7 +88,7 @@ void Display::SetPixel(int x, int y, uint32_t p) {
|
||||
}
|
||||
|
||||
void Display::SetPixel(int x, int y, glm::vec3 p) {
|
||||
Pixel pixel{ (uint8_t)p.x, (uint8_t)p.y, (uint8_t)p.z };
|
||||
Pixel pixel{ (uint8_t)p.r, (uint8_t)p.g, (uint8_t)p.b };
|
||||
m_framebufferMutex.lock();
|
||||
Framebuffer[y * this->XRes + x] = pixel.rgb();
|
||||
m_framebufferMutex.unlock();
|
||||
@@ -112,7 +112,7 @@ void Display::SetPixelSafe(int x, int y, uint32_t p) {
|
||||
|
||||
void Display::SetPixelSafe(int x, int y, glm::vec3 p) {
|
||||
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
|
||||
Pixel pixel{ (uint8_t)p.x, (uint8_t)p.y, (uint8_t)p.z };
|
||||
Pixel pixel{ (uint8_t)p.r, (uint8_t)p.g, (uint8_t)p.b };
|
||||
m_framebufferMutex.lock();
|
||||
Framebuffer[y * this->XRes + x] = pixel.rgb();
|
||||
m_framebufferMutex.unlock();
|
||||
|
||||
@@ -33,22 +33,18 @@ void ProgressiveRenderer::Input() {
|
||||
|
||||
ImGui::NewFrame();
|
||||
ImGui::Begin("Debug");
|
||||
ImGui::Text("Hello, world %d", 123);
|
||||
if (ImGui::Button("Save")) {}
|
||||
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
|
||||
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void workerThread(ProgressiveRenderer* renderer, int idd, int xStart, int xRange) {
|
||||
void workerThread(ProgressiveRenderer* renderer, int idd, int yStart, int yRange) {
|
||||
while (!renderer->Ready) {
|
||||
std::chrono::milliseconds dura(10);
|
||||
std::this_thread::sleep_for(dura);
|
||||
}
|
||||
|
||||
while (renderer->Ready) {
|
||||
for (int x = xStart; x < xStart + xRange; x++)
|
||||
for (int y = 0; y < renderer->m_scene->h; y++) {
|
||||
for (int y = yStart; y < yStart + yRange; y++)
|
||||
for (int x = 0; x < renderer->m_scene->w; x++) {
|
||||
Ray ray = renderer->m_scene->camera->CastRay(x, y);
|
||||
glm::vec3 col = renderer->m_engine->GetColour(ray, 0);
|
||||
renderer->m_interface->SetPixelSafe(x, y, col);
|
||||
@@ -57,20 +53,37 @@ void workerThread(ProgressiveRenderer* renderer, int idd, int xStart, int xRange
|
||||
}
|
||||
|
||||
void ProgressiveRenderer::Render() {
|
||||
int frames = 0;
|
||||
auto startTime = std::chrono::high_resolution_clock::now();
|
||||
|
||||
/*
|
||||
New design is needed
|
||||
as follows is pretty
|
||||
good
|
||||
|
||||
class threadpool {
|
||||
vector thread* threads
|
||||
vector bool status
|
||||
vector uint32 buffers
|
||||
void merge()
|
||||
}
|
||||
|
||||
maybe
|
||||
|
||||
class thread {
|
||||
framebuffer
|
||||
}
|
||||
*/
|
||||
|
||||
// Allocates threads with ranges to render
|
||||
for (int i = 0; i < m_workerMax; i++) {
|
||||
if (i == m_workerMax - 1) {
|
||||
m_workers.push_back(new std::thread(workerThread, this, i,
|
||||
(m_scene->w / m_workerMax) * i,
|
||||
-((m_scene->w / m_workerMax) * i - m_scene->w)
|
||||
(m_scene->h / m_workerMax) * i,
|
||||
-((m_scene->h / m_workerMax) * i - m_scene->h)
|
||||
));
|
||||
} else {
|
||||
m_workers.push_back(new std::thread(workerThread, this, i,
|
||||
(m_scene->w / m_workerMax) * i,
|
||||
(m_scene->w / m_workerMax) * (i + 1) - (m_scene->w / m_workerMax) * i
|
||||
(m_scene->h / m_workerMax) * i,
|
||||
(m_scene->h / m_workerMax) * (i + 1) - (m_scene->h / m_workerMax) * i
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -90,22 +103,6 @@ void ProgressiveRenderer::Render() {
|
||||
for (auto& thread : m_workers) {
|
||||
thread->join();
|
||||
}
|
||||
|
||||
// auto frameStartTime = std::chrono::high_resolution_clock::now();
|
||||
|
||||
// auto endTime = std::chrono::high_resolution_clock::now();
|
||||
|
||||
// frames++;
|
||||
// std::cout << "Frame: " << frames << std::endl;
|
||||
// std::cout << "Frame Time: " << std::chrono::duration_cast<std::chrono::seconds>(endTime - frameStartTime).count()
|
||||
// << ":" << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - frameStartTime).count() << "s" << std::endl;
|
||||
// std::cout << "Avg Frame Time: " << std::chrono::duration_cast<std::chrono::seconds>(endTime - startTime).count() / frames
|
||||
// << ":" << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count() / frames << "s"
|
||||
// << std::endl << std::endl;
|
||||
|
||||
// Swap framebuffers
|
||||
// m_interface->Update();
|
||||
// m_interface->ClearFramebuffer();
|
||||
}
|
||||
|
||||
void ProgressiveRenderer::RenderProgressive() {
|
||||
|
||||
@@ -41,6 +41,6 @@ private:
|
||||
char* buf = ""; float f = 0.0f;
|
||||
};
|
||||
|
||||
void workerThread(ProgressiveRenderer* renderer, int idd, int xStart, int xRange);
|
||||
void workerThread(ProgressiveRenderer* renderer, int idd, int yStart, int yRange);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#include "tonemap.hpp"
|
||||
|
||||
// Need to map a vector of floats to a buffer. need to rework engine first
|
||||
void MapHRDLDRBasic(uint32_t* buffer, int w, int h) {
|
||||
|
||||
for (int x = 0; x < w; x++)
|
||||
for (int y = 0; y < h; y++) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int index(int x, int y, int w) {
|
||||
return (y * w + x);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef INFERNO_ENGINE_TONEMAP_H_
|
||||
#define INFERNO_ENGINE_TONEMAP_H_
|
||||
|
||||
#include "../common.hpp"
|
||||
|
||||
void MapHRDLDRBasic(uint32_t* buffer, int w, int h);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -24,17 +24,17 @@ int main(int argc, char** argv) {
|
||||
// object->Translate({ 0.0f, -5.0f, -20.0f });
|
||||
|
||||
// std::vector<Triangle*> tris = LoadTrianglesBasic("/home/ben/programming/inferno/resources/lucy-normals.obj");
|
||||
//std::vector<Triangle*> tris = LoadTrianglesBasic("E:/Projects/Inferno/resources/lucy-normals.obj");
|
||||
//for (const auto& object : tris)
|
||||
// object->Translate({ 0.0f, -3.9f, -10.6f });
|
||||
// std::vector<Triangle*> tris = LoadTrianglesBasic("E:/Projects/Inferno/resources/lucy-normals.obj");
|
||||
// for (const auto& object : tris)
|
||||
// object->Translate({ 0.0f, -3.9f, -10.6f });
|
||||
|
||||
//std::vector<Triangle*> tris = LoadTrianglesBasic("/home/ben/programming/inferno/resources/cornell.obj");
|
||||
std::vector<Triangle*> tris = LoadTrianglesBasic("E:/Projects/Inferno/resources/cornell.obj");
|
||||
for (const auto& object : tris)
|
||||
object->Translate({ 0.0f, -0.9f, -3.0f });
|
||||
object->Translate({ 0.0f, -0.9f, -3.0f });
|
||||
|
||||
Mesh* mesh = new Mesh(tris);
|
||||
//mesh->Optimise();
|
||||
mesh->Optimise();
|
||||
scene->meshs.push_back(mesh);
|
||||
|
||||
inferno.SetScene(scene);
|
||||
|
||||
Reference in New Issue
Block a user