1111#include < bx/string.h>
1212#include < bimg/bimg.h>
1313#include < glm/gtc/type_ptr.hpp>
14+ #include < glm/gtx/component_wise.hpp>
1415#include < glm/gtc/random.hpp>
1516#include < spdlog/sinks/basic_file_sink.h>
1617#include < thread>
@@ -49,11 +50,33 @@ int Cluster::run(int argc, char* argv[])
4950
5051void Cluster::initialize (int _argc, char * _argv[])
5152{
52- // is _mt (thread safe) necessary?
53- spdlog::sink_ptr fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(config->logFile , true );
54- fileSink->set_level (spdlog::level::trace);
55- fileSink->set_pattern (" [%H:%M:%S][%l] %v" );
56- Sinks->add_sink (fileSink);
53+ if (!ForwardRenderer::supported ())
54+ {
55+ Log->error (" Forward renderer not supported on this hardware" );
56+ close ();
57+ return ;
58+ }
59+ if (!DeferredRenderer::supported ())
60+ {
61+ Log->error (" Deferred renderer not supported on this hardware" );
62+ close ();
63+ return ;
64+ }
65+ if (!ClusteredRenderer::supported ())
66+ {
67+ Log->error (" Clustered renderer not supported on this hardware" );
68+ close ();
69+ return ;
70+ }
71+
72+ if (config->writeLog )
73+ {
74+ // is _mt (thread safe) necessary?
75+ spdlog::sink_ptr fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(config->logFile , true );
76+ fileSink->set_level (spdlog::level::trace);
77+ fileSink->set_pattern (" [%H:%M:%S][%l] %v" );
78+ Sinks->add_sink (fileSink);
79+ }
5780
5881 Log->flush_on (spdlog::level::info);
5982 Log->set_level (spdlog::level::trace);
@@ -71,13 +94,6 @@ void Cluster::initialize(int _argc, char* _argv[])
7194 renderer->initialize ();
7295 ui->initialize ();
7396
74- if (!ForwardRenderer::supported ())
75- Log->warn (" Forward renderer not supported on this hardware" );
76- if (!DeferredRenderer::supported ())
77- Log->warn (" Deferred renderer not supported on this hardware" );
78- if (!ClusteredRenderer::supported ())
79- Log->warn (" Clustered renderer not supported on this hardware" );
80-
8197 Scene::init ();
8298 // TODO multithreaded
8399 // textures still have to be loaded from main thread
@@ -88,6 +104,17 @@ void Cluster::initialize(int _argc, char* _argv[])
88104 close ();
89105 return ;
90106 }
107+
108+ /*
109+ scene->pointLights.lights = {
110+ // pos, flux (color)
111+ { { -5.0f, 1.1f, 0.0f }, { 1.0f, 0.0f, 1.0f } },
112+ { { 0.0f, 1.1f, 0.0f }, { 0.0f, 1.0f, 1.0f } },
113+ { { 5.0f, 1.1f, 0.0f }, { 1.0f, 1.0f, 0.0f } }
114+ };
115+ scene->pointLights.update();
116+ */
117+ generateLights (config->lights );
91118}
92119
93120void Cluster::onReset ()
@@ -358,3 +385,26 @@ void Cluster::saveFrameBuffer(bgfx::FrameBufferHandle frameBuffer, const char* n
358385 }
359386 }
360387}
388+
389+ void Cluster::generateLights (unsigned int count)
390+ {
391+ // TODO normalize flux
392+
393+ auto & lights = scene->pointLights .lights ;
394+
395+ size_t keep = lights.size ();
396+ if (count < keep)
397+ keep = count;
398+
399+ lights.resize (count);
400+
401+ glm::vec3 scale = glm::abs (scene->maxBounds - scene->minBounds );
402+
403+ for (size_t i = keep; i < count; i++)
404+ {
405+ lights[i].position = glm::linearRand (-scale * glm::vec3 (0 .5f , 0 .0f , 0 .5f ), glm::vec3 (scale * 0 .5f ));
406+ lights[i].flux = glm::linearRand (glm::vec3 (0 .001f ), glm::vec3 (0 .003f ));
407+ }
408+
409+ scene->pointLights .update ();
410+ }
0 commit comments