Move skies to WorldRender | Update World.cpp, World.h, and 4 more files...

This commit is contained in:
Skarn
2022-01-05 18:37:01 +03:00
parent 893c92eeef
commit a137fe9cb9
6 changed files with 58 additions and 68 deletions

View File

@@ -83,16 +83,11 @@ World::World(const std::string& name, int map_id, Noggit::NoggitRenderContext co
, horizon(name, &mapIndex)
, mWmoFilename("")
, mWmoEntry(ENTRY_MODF())
, ol(nullptr)
, animtime(0)
, time(1450)
, basename(name)
, fogdistance(777.0f)
, culldistance(fogdistance)
, skies(nullptr)
, _current_selection()
, _settings(new QSettings())
, _view_distance(_settings->value("view_distance", 1000.f).toFloat())
, _context(context)
{
LogDebug << "Loading world \"" << name << "\"." << std::endl;

View File

@@ -61,7 +61,6 @@ protected:
std::unordered_map<std::string, std::vector<ModelInstance*>> _models_by_filename;
Noggit::world_model_instances_storage _model_instance_storage;
Noggit::world_tile_update_queue _tile_update_queue;
std::mutex _guard;
public:
MapIndex mapIndex;
@@ -71,10 +70,8 @@ public:
std::string mWmoFilename;
ENTRY_MODF mWmoEntry;
// The lighting used.
std::unique_ptr<OutdoorLighting> ol;
unsigned int getMapID();
// Time of the day.
float animtime;
float time;
@@ -82,12 +79,6 @@ public:
//! \brief Name of this map.
std::string basename;
// Dynamic distances for rendering. Actually, these should be the same..
float fogdistance;
float culldistance;
std::unique_ptr<Skies> skies;
explicit World(const std::string& name, int map_id, Noggit::NoggitRenderContext context, bool create_empty = false);
void setBasename(const std::string& name);

View File

@@ -16,6 +16,8 @@ WorldRender::WorldRender(World* world)
: BaseRender()
, _world(world)
, _liquid_texture_manager(world->_context)
, _view_distance(world->_settings->value("view_distance", 1000.f).toFloat())
, _cull_distance(0.f)
{
}
@@ -191,7 +193,7 @@ void WorldRender::draw (glm::mat4x4 const& model_view
, camera_pos
, m2_shader
, frustum
, _world->culldistance
, _cull_distance
, _world->animtime
, draw_model_animations
, wmo.extents[0]
@@ -207,25 +209,25 @@ void WorldRender::draw (glm::mat4x4 const& model_view
if (!hadSky)
{
_world->skies->draw( model_view
_skies->draw( model_view
, projection
, camera_pos
, m2_shader
, frustum
, _world->culldistance
, _cull_distance
, _world->animtime
, _outdoor_light_stats
);
}
}
_world->culldistance = draw_fog ? _world->fogdistance : _world->_view_distance;
_cull_distance= draw_fog ? _skies->fog_distance_end() : _world->_view_distance;
// Draw verylowres heightmap
if (draw_fog && draw_terrain)
{
ZoneScopedN("World::draw() : Draw horizon");
_horizon_render->draw (model_view, projection, &_world->mapIndex, _world->skies->color_set[FOG_COLOR], _world->culldistance, frustum, camera_pos, display);
_horizon_render->draw (model_view, projection, &_world->mapIndex, _skies->color_set[FOG_COLOR], _cull_distance, frustum, camera_pos, display);
}
gl.enable(GL_DEPTH_TEST);
@@ -359,7 +361,7 @@ void WorldRender::draw (glm::mat4x4 const& model_view
// early dist check
// TODO: optional
if (tile->camDist() > _world->culldistance)
if (tile->camDist() > _cull_distance)
continue;
for (auto& pair : tile->getObjectInstances())
@@ -393,7 +395,7 @@ void WorldRender::draw (glm::mat4x4 const& model_view
auto m2_instance = static_cast<ModelInstance*>(instance);
if ((tile->objects_frustum_cull_test > 1 || m2_instance->isInFrustum(frustum)) && m2_instance->isInRenderDist(_world->culldistance, camera_pos, display))
if ((tile->objects_frustum_cull_test > 1 || m2_instance->isInFrustum(frustum)) && m2_instance->isInRenderDist(_cull_distance, camera_pos, display))
{
instances.push_back(m2_instance->transformMatrix());
}
@@ -456,14 +458,14 @@ void WorldRender::draw (glm::mat4x4 const& model_view
, model_view
, projection
, frustum
, _world->culldistance
, _cull_distance
, camera_pos
, is_hidden
, draw_wmo_doodads
, draw_fog
, _world->current_selection()
, _world->animtime
, _world->skies->hasSkies()
, _skies->hasSkies()
, display
);
}
@@ -580,7 +582,7 @@ void WorldRender::draw (glm::mat4x4 const& model_view
, m2_shader
, model_render_state
, frustum
, _world->culldistance
, _cull_distance
, camera_pos
, _world->animtime
, draw_models_with_box
@@ -669,7 +671,7 @@ void WorldRender::draw (glm::mat4x4 const& model_view
continue;
auto model = static_cast<ModelInstance*>(obj);
if (model->isInFrustum(frustum) && model->isInRenderDist(_world->culldistance, camera_pos, display))
if (model->isInFrustum(frustum) && model->isInRenderDist(_cull_distance, camera_pos, display))
{
model->draw_box(model_view, projection, false); // make optional!
}
@@ -860,7 +862,7 @@ void WorldRender::upload()
_horizon_render = std::make_unique<Noggit::map_horizon::render>(_world->horizon);
}
_world->skies = std::make_unique<Skies> (_world->mapIndex._map_id, _world->_context);
_skies = std::make_unique<Skies>(_world->mapIndex._map_id, _world->_context);
_outdoor_lighting = std::make_unique<OutdoorLighting>();
@@ -1098,7 +1100,7 @@ void WorldRender::unload()
_liquid_texture_manager.unload();
_world->skies->unload();
_skies->unload();
_buffers.unload();
_vertex_arrays.unload();
@@ -1123,26 +1125,26 @@ void WorldRender::updateLightingUniformBlock(bool draw_fog, glm::vec3 const& cam
int daytime = static_cast<int>(_world->time) % 2880;
_world->skies->update_sky_colors(camera_pos, daytime);
_skies->update_sky_colors(camera_pos, daytime);
_outdoor_light_stats = _outdoor_lighting->getLightStats(static_cast<int>(_world->time));
glm::vec3 diffuse = _world->skies->color_set[LIGHT_GLOBAL_DIFFUSE];
glm::vec3 ambient = _world->skies->color_set[LIGHT_GLOBAL_AMBIENT];
glm::vec3 fog_color = _world->skies->color_set[FOG_COLOR];
glm::vec3 ocean_color_light = _world->skies->color_set[OCEAN_COLOR_LIGHT];
glm::vec3 ocean_color_dark = _world->skies->color_set[OCEAN_COLOR_DARK];
glm::vec3 river_color_light = _world->skies->color_set[RIVER_COLOR_LIGHT];
glm::vec3 river_color_dark = _world->skies->color_set[RIVER_COLOR_DARK];
glm::vec3 diffuse = _skies->color_set[LIGHT_GLOBAL_DIFFUSE];
glm::vec3 ambient = _skies->color_set[LIGHT_GLOBAL_AMBIENT];
glm::vec3 fog_color = _skies->color_set[FOG_COLOR];
glm::vec3 ocean_color_light = _skies->color_set[OCEAN_COLOR_LIGHT];
glm::vec3 ocean_color_dark = _skies->color_set[OCEAN_COLOR_DARK];
glm::vec3 river_color_light = _skies->color_set[RIVER_COLOR_LIGHT];
glm::vec3 river_color_dark = _skies->color_set[RIVER_COLOR_DARK];
_lighting_ubo_data.DiffuseColor_FogStart = {diffuse.x,diffuse.y,diffuse.z, _world->skies->fog_distance_start()};
_lighting_ubo_data.AmbientColor_FogEnd = {ambient.x,ambient.y,ambient.z, _world->skies->fog_distance_end()};
_lighting_ubo_data.DiffuseColor_FogStart = {diffuse.x,diffuse.y,diffuse.z, _skies->fog_distance_start()};
_lighting_ubo_data.AmbientColor_FogEnd = {ambient.x,ambient.y,ambient.z, _skies->fog_distance_end()};
_lighting_ubo_data.FogColor_FogOn = {fog_color.x,fog_color.y,fog_color.z, static_cast<float>(draw_fog)};
_lighting_ubo_data.LightDir_FogRate = {_outdoor_light_stats.dayDir.x, _outdoor_light_stats.dayDir.y, _outdoor_light_stats.dayDir.z, _world->skies->fogRate()};
_lighting_ubo_data.OceanColorLight = { ocean_color_light.x,ocean_color_light.y,ocean_color_light.z, _world->skies->ocean_shallow_alpha()};
_lighting_ubo_data.OceanColorDark = { ocean_color_dark.x,ocean_color_dark.y,ocean_color_dark.z, _world->skies->ocean_deep_alpha()};
_lighting_ubo_data.RiverColorLight = { river_color_light.x,river_color_light.y,river_color_light.z, _world->skies->river_shallow_alpha()};
_lighting_ubo_data.RiverColorDark = { river_color_dark.x,river_color_dark.y,river_color_dark.z, _world->skies->river_deep_alpha()};
_lighting_ubo_data.LightDir_FogRate = {_outdoor_light_stats.dayDir.x, _outdoor_light_stats.dayDir.y, _outdoor_light_stats.dayDir.z, _skies->fogRate()};
_lighting_ubo_data.OceanColorLight = { ocean_color_light.x,ocean_color_light.y,ocean_color_light.z, _skies->ocean_shallow_alpha()};
_lighting_ubo_data.OceanColorDark = { ocean_color_dark.x,ocean_color_dark.y,ocean_color_dark.z, _skies->ocean_deep_alpha()};
_lighting_ubo_data.RiverColorLight = { river_color_light.x,river_color_light.y,river_color_light.z, _skies->river_shallow_alpha()};
_lighting_ubo_data.RiverColorDark = { river_color_dark.x,river_color_dark.y,river_color_dark.z, _skies->river_deep_alpha()};
gl.bindBuffer(GL_UNIFORM_BUFFER, _lighting_ubo);
gl.bufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(OpenGL::LightingUniformBlock), &_lighting_ubo_data);
@@ -1158,7 +1160,7 @@ void WorldRender::updateLightingUniformBlockMinimap(MinimapRenderSettings* setti
_lighting_ubo_data.DiffuseColor_FogStart = { diffuse, 0 };
_lighting_ubo_data.AmbientColor_FogEnd = { ambient, 0 };
_lighting_ubo_data.FogColor_FogOn = { 0, 0, 0, 0 };
_lighting_ubo_data.LightDir_FogRate = { _outdoor_light_stats.dayDir.x, _outdoor_light_stats.dayDir.y, _outdoor_light_stats.dayDir.z, _world->skies->fogRate() };
_lighting_ubo_data.LightDir_FogRate = { _outdoor_light_stats.dayDir.x, _outdoor_light_stats.dayDir.y, _outdoor_light_stats.dayDir.z, _skies->fogRate() };
_lighting_ubo_data.OceanColorLight = settings->ocean_color_light;
_lighting_ubo_data.OceanColorDark = settings->ocean_color_dark;
_lighting_ubo_data.RiverColorLight = settings->river_color_light;

View File

@@ -78,8 +78,7 @@ namespace Noggit::Rendering
void updateTerrainParamsUniformBlock();
void markTerrainParamsUniformBlockDirty() { _need_terrain_params_ubo_update = true; };
[[nodiscard]]
LiquidTextureManager* getLiquidTextureManager() { return &_liquid_texture_manager; };
[[nodiscard]] std::unique_ptr<Skies>& skies() { return _skies; };
private:
@@ -102,6 +101,8 @@ namespace Noggit::Rendering
void setupLiquidChunkBuffers();
World* _world;
float _cull_distance;
float _view_distance;
// shaders
std::unique_ptr<OpenGL::program> _mcnk_program;;
@@ -119,6 +120,7 @@ namespace Noggit::Rendering
std::unique_ptr<Noggit::map_horizon::render> _horizon_render;
std::unique_ptr<OutdoorLighting> _outdoor_lighting;
OutdoorLightStats _outdoor_light_stats;
std::unique_ptr<Skies> _skies;
// cursor
Noggit::CursorRender _cursor_render;

View File

@@ -205,9 +205,9 @@ namespace Noggit
}
}
if (draw_skies() && world()->skies)
if (draw_skies() && _world->renderer()->skies())
{
foreach (Sky sky, world()->skies->skies)
foreach (Sky sky, _world->renderer()->skies()->skies)
{
//! \todo Get actual color from sky.
//! \todo Get actual radius.

View File

@@ -35,14 +35,14 @@ namespace OpenGL
};
template<GLenum cap>
bool_setter<cap, GL_TRUE>::bool_setter()
: _was_enabled (gl.isEnabled (cap) == GL_TRUE)
bool_setter<cap, GL_TRUE>::bool_setter()
: _was_enabled (gl.isEnabled (cap) == GL_TRUE)
{
gl.enable (cap);
}
template<GLenum cap>
bool_setter<cap, GL_TRUE>::~bool_setter()
bool_setter<cap, GL_TRUE>::~bool_setter()
{
if (_was_enabled != GL_TRUE)
{
@@ -51,14 +51,14 @@ namespace OpenGL
}
template<GLenum cap>
bool_setter<cap, GL_FALSE>::bool_setter()
: _was_enabled (gl.isEnabled (cap) == GL_TRUE)
bool_setter<cap, GL_FALSE>::bool_setter()
: _was_enabled (gl.isEnabled (cap) == GL_TRUE)
{
gl.disable (cap);
}
template<GLenum cap>
bool_setter<cap, GL_FALSE>::~bool_setter()
bool_setter<cap, GL_FALSE>::~bool_setter()
{
if (_was_enabled == GL_TRUE)
{
@@ -67,14 +67,14 @@ namespace OpenGL
}
template<GLboolean value>
depth_mask_setter<value>::depth_mask_setter()
depth_mask_setter<value>::depth_mask_setter()
{
gl.getBooleanv (GL_DEPTH_WRITEMASK, &_was_enabled);
gl.depthMask (value);
}
template<GLboolean value>
depth_mask_setter<value>::~depth_mask_setter()
depth_mask_setter<value>::~depth_mask_setter()
{
gl.depthMask (_was_enabled);
}
@@ -90,7 +90,7 @@ namespace OpenGL
}
template<GLenum type>
buffer_binder<type>::buffer_binder (GLuint buffer)
buffer_binder<type>::buffer_binder (GLuint buffer)
{
//! \todo commented out targets not supported on macOS due to
//! old OpenGL. If we ever need them, find workaround.
@@ -113,7 +113,7 @@ namespace OpenGL
gl.bindBuffer (type, buffer);
}
template<GLenum type>
buffer_binder<type>::~buffer_binder()
buffer_binder<type>::~buffer_binder()
{
gl.bindBuffer (type, _old);
}
@@ -128,7 +128,7 @@ namespace OpenGL
}
template<std::size_t count>
void deferred_upload_buffers<count>::upload()
void deferred_upload_buffers<count>::upload()
{
gl.genBuffers (count, _buffers);
_buffer_generated = true;
@@ -142,7 +142,7 @@ namespace OpenGL
}
template<std::size_t count>
deferred_upload_buffers<count>::~deferred_upload_buffers()
deferred_upload_buffers<count>::~deferred_upload_buffers()
{
if (_buffer_generated)
{
@@ -151,31 +151,31 @@ namespace OpenGL
}
template<std::size_t count>
GLuint const& deferred_upload_buffers<count>::operator[] (std::size_t i) const
GLuint const& deferred_upload_buffers<count>::operator[] (std::size_t i) const
{
return _buffers[i];
}
template<std::size_t count>
buffers<count>::buffers()
buffers<count>::buffers()
{
_impl.upload();
}
template<std::size_t count>
GLuint const& buffers<count>::operator[] (std::size_t i) const
GLuint const& buffers<count>::operator[] (std::size_t i) const
{
return _impl[i];
}
template<std::size_t count>
bool deferred_upload_vertex_arrays<count>::buffer_generated() const
bool deferred_upload_vertex_arrays<count>::buffer_generated() const
{
return _buffer_generated;
}
template<std::size_t count>
void deferred_upload_vertex_arrays<count>::upload()
void deferred_upload_vertex_arrays<count>::upload()
{
gl.genVertexArrays (count, _vertex_arrays);
_buffer_generated = true;
@@ -189,7 +189,7 @@ namespace OpenGL
}
template<std::size_t count>
deferred_upload_vertex_arrays<count>::~deferred_upload_vertex_arrays()
deferred_upload_vertex_arrays<count>::~deferred_upload_vertex_arrays()
{
if (_buffer_generated)
{
@@ -198,7 +198,7 @@ namespace OpenGL
}
template<std::size_t count>
GLuint const& deferred_upload_vertex_arrays<count>::operator[] (std::size_t i) const
GLuint const& deferred_upload_vertex_arrays<count>::operator[] (std::size_t i) const
{
return _vertex_arrays[i];
}
@@ -241,7 +241,7 @@ namespace OpenGL
//
template<std::size_t count>
vertex_arrays<count>::vertex_arrays()
vertex_arrays<count>::vertex_arrays()
{
_impl.upload();
}