mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
basic indexed geometry support, geometry data packing
This commit is contained in:
@@ -22,6 +22,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "application.h"
|
||||
#include "AnimModel.h"
|
||||
|
||||
//#define EU07_DEBUG_OPENGL
|
||||
|
||||
int const EU07_PICKBUFFERSIZE{ 1024 }; // size of (square) textures bound with the pick framebuffer
|
||||
int const EU07_REFLECTIONFIDELITYOFFSET { 250 }; // artificial increase of range for reflection pass detail reduction
|
||||
|
||||
@@ -324,7 +326,7 @@ bool opengl33_renderer::init_viewport(viewport_config &vp)
|
||||
|
||||
WriteLog("init viewport: " + std::to_string(vp.width) + " x " + std::to_string(vp.height));
|
||||
|
||||
glfwSwapInterval( Global.VSync ? 1 : 0 );
|
||||
// glfwSwapInterval( Global.VSync ? 1 : 0 );
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
@@ -470,9 +472,6 @@ bool opengl33_renderer::Render()
|
||||
glfwMakeContextCurrent(m_window);
|
||||
gl::buffer::unbind();
|
||||
m_current_viewport = &(*m_viewports.front());
|
||||
|
||||
m_drawcount = m_cellqueue.size();
|
||||
m_debugtimestext.clear();
|
||||
/*
|
||||
m_debugtimestext += "cpu: " + to_string(Timer::subsystem.gfx_color.average(), 2) + " ms (" + std::to_string(m_cellqueue.size()) + " sectors)\n" +=
|
||||
"cpu swap: " + to_string(Timer::subsystem.gfx_swap.average(), 2) + " ms\n" += "uilayer: " + to_string(Timer::subsystem.gfx_gui.average(), 2) + "ms\n" +=
|
||||
@@ -486,11 +485,48 @@ bool opengl33_renderer::Render()
|
||||
m_debugtimestext += "gpu: " + to_string((double)(m_gllasttime / 1000ULL) / 1000.0, 3) + "ms";
|
||||
*/
|
||||
}
|
||||
|
||||
// swapbuffers() could unbind current buffers so we prepare for it on our end
|
||||
gfx::opengl_vbogeometrybank::reset();
|
||||
++m_framestamp;
|
||||
SwapBuffers();
|
||||
Timer::subsystem.gfx_total.stop();
|
||||
|
||||
return true; // for now always succeed
|
||||
}
|
||||
|
||||
void opengl33_renderer::SwapBuffers()
|
||||
{
|
||||
Timer::subsystem.gfx_swap.start();
|
||||
|
||||
for (auto &viewport : m_viewports) {
|
||||
if (viewport->window)
|
||||
glfwSwapBuffers(viewport->window);
|
||||
}
|
||||
|
||||
Timer::subsystem.gfx_swap.stop();
|
||||
|
||||
m_debugtimestext.clear();
|
||||
m_debugtimestext =
|
||||
"cpu frame total: " + to_string( Timer::subsystem.gfx_color.average() + Timer::subsystem.gfx_shadows.average() + Timer::subsystem.gfx_swap.average(), 2 ) + " ms\n"
|
||||
+ " color: " + to_string( Timer::subsystem.gfx_color.average(), 2 ) + " ms (" + std::to_string( m_cellqueue.size() ) + " sectors)\n";
|
||||
if( Global.gfx_shadowmap_enabled ) {
|
||||
m_debugtimestext +=
|
||||
" shadows: " + to_string( Timer::subsystem.gfx_shadows.average(), 2 ) + " ms\n";
|
||||
}
|
||||
m_debugtimestext += " swap: " + to_string( Timer::subsystem.gfx_swap.average(), 2 ) + " ms\n";
|
||||
if( !Global.gfx_usegles ) {
|
||||
if (m_gllasttime)
|
||||
m_debugtimestext += "gpu frame total: " + to_string((double)(m_gllasttime / 1000ULL) / 1000.0, 3) + " ms\n";
|
||||
}
|
||||
m_debugtimestext += "uilayer: " + to_string( Timer::subsystem.gfx_gui.average(), 2 ) + " ms\n";
|
||||
if( DebugModeFlag )
|
||||
m_debugtimestext += m_textures.info();
|
||||
|
||||
debug_stats shadowstats;
|
||||
for( auto const &shadowpass : m_shadowpass ) {
|
||||
shadowstats += shadowpass.draw_stats;
|
||||
}
|
||||
|
||||
m_debugstatstext =
|
||||
"triangles: " + to_string( static_cast<int>(m_geometry.primitives_count()), 7 ) + "\n"
|
||||
+ "vehicles: " + to_string( m_colorpass.draw_stats.dynamics, 7 ) + " +" + to_string( shadowstats.dynamics, 7 )
|
||||
@@ -508,44 +544,6 @@ bool opengl33_renderer::Render()
|
||||
+ " traction: " + to_string( m_colorpass.draw_stats.traction, 7 ) + "\n"
|
||||
+ " lines: " + to_string( m_colorpass.draw_stats.lines, 7 ) + "\n"
|
||||
+ "particles: " + to_string( m_colorpass.draw_stats.particles, 7 );
|
||||
|
||||
++m_framestamp;
|
||||
|
||||
SwapBuffers();
|
||||
|
||||
Timer::subsystem.gfx_total.stop();
|
||||
|
||||
m_debugtimestext +=
|
||||
"cpu frame total: " + to_string( Timer::subsystem.gfx_color.average() + Timer::subsystem.gfx_shadows.average() + Timer::subsystem.gfx_swap.average(), 2 ) + " ms\n"
|
||||
+ " color: " + to_string( Timer::subsystem.gfx_color.average(), 2 ) + " ms (" + std::to_string( m_cellqueue.size() ) + " sectors)\n";
|
||||
if( Global.gfx_shadowmap_enabled ) {
|
||||
m_debugtimestext +=
|
||||
" shadows: " + to_string( Timer::subsystem.gfx_shadows.average(), 2 ) + " ms\n";
|
||||
}
|
||||
m_debugtimestext += " swap: " + to_string( Timer::subsystem.gfx_swap.average(), 2 ) + " ms\n";
|
||||
if( !Global.gfx_usegles ) {
|
||||
if (m_gllasttime)
|
||||
m_debugtimestext += "gpu frame total: " + to_string((double)(m_gllasttime / 1000ULL) / 1000.0, 3) + " ms\n";
|
||||
}
|
||||
m_debugtimestext += "uilayer: " + to_string( Timer::subsystem.gfx_gui.average(), 2 ) + " ms\n";
|
||||
if( DebugModeFlag )
|
||||
m_debugtimestext += m_textures.info();
|
||||
|
||||
return true; // for now always succeed
|
||||
}
|
||||
|
||||
void opengl33_renderer::SwapBuffers()
|
||||
{
|
||||
Timer::subsystem.gfx_swap.start();
|
||||
|
||||
for (auto &viewport : m_viewports) {
|
||||
if (viewport->window)
|
||||
glfwSwapBuffers(viewport->window);
|
||||
}
|
||||
|
||||
// swapbuffers() could unbind current buffers so we prepare for it on our end
|
||||
gfx::opengl_vbogeometrybank::reset();
|
||||
Timer::subsystem.gfx_swap.stop();
|
||||
}
|
||||
|
||||
void opengl33_renderer::draw_debug_ui()
|
||||
@@ -799,10 +797,13 @@ void opengl33_renderer::Render_pass(viewport_config &vp, rendermode const Mode)
|
||||
glEnable(GL_FRAMEBUFFER_SRGB);
|
||||
|
||||
glViewport(0, 0, target_size.x, target_size.y);
|
||||
m_pfx_tonemapping->apply(*vp.main2_tex, nullptr);
|
||||
|
||||
if( Global.gfx_postfx_chromaticaberration_enabled ) {
|
||||
m_pfx_chromaticaberration->apply( *vp.main2_tex, nullptr );
|
||||
m_pfx_tonemapping->apply( *vp.main2_tex, vp.main_fb.get() );
|
||||
m_pfx_chromaticaberration->apply( *vp.main_tex, nullptr );
|
||||
}
|
||||
else {
|
||||
m_pfx_tonemapping->apply( *vp.main2_tex, nullptr );
|
||||
}
|
||||
|
||||
opengl_texture::reset_unit_cache();
|
||||
@@ -1725,10 +1726,17 @@ gfx::geometrybank_handle opengl33_renderer::Create_Bank()
|
||||
return m_geometry.create_bank();
|
||||
}
|
||||
|
||||
// creates a new geometry chunk of specified type from supplied vertex data, in specified bank. returns: handle to the chunk or NULL
|
||||
// creates a new indexed geometry chunk of specified type from supplied data, in specified bank. returns: handle to the chunk or NULL
|
||||
gfx::geometry_handle opengl33_renderer::Insert( gfx::index_array &Indices, gfx::vertex_array &Vertices, gfx::geometrybank_handle const &Geometry, int const Type )
|
||||
{
|
||||
// NOTE: we expect indexed geometry to come with calculated tangents
|
||||
return m_geometry.create_chunk( Indices, Vertices, Geometry, Type );
|
||||
}
|
||||
|
||||
// creates a new geometry chunk of specified type from supplied data, in specified bank. returns: handle to the chunk or NULL
|
||||
gfx::geometry_handle opengl33_renderer::Insert(gfx::vertex_array &Vertices, gfx::geometrybank_handle const &Geometry, int const Type)
|
||||
{
|
||||
gfx::calculate_tangent(Vertices, Type);
|
||||
gfx::calculate_tangents(Vertices, Type);
|
||||
|
||||
return m_geometry.create_chunk(Vertices, Geometry, Type);
|
||||
}
|
||||
@@ -1736,7 +1744,7 @@ gfx::geometry_handle opengl33_renderer::Insert(gfx::vertex_array &Vertices, gfx:
|
||||
// replaces data of specified chunk with the supplied vertex data, starting from specified offset
|
||||
bool opengl33_renderer::Replace(gfx::vertex_array &Vertices, gfx::geometry_handle const &Geometry, int const Type, std::size_t const Offset)
|
||||
{
|
||||
gfx::calculate_tangent(Vertices, Type);
|
||||
gfx::calculate_tangents(Vertices, Type);
|
||||
|
||||
return m_geometry.replace(Vertices, Geometry, Offset);
|
||||
}
|
||||
@@ -1744,15 +1752,20 @@ bool opengl33_renderer::Replace(gfx::vertex_array &Vertices, gfx::geometry_handl
|
||||
// adds supplied vertex data at the end of specified chunk
|
||||
bool opengl33_renderer::Append(gfx::vertex_array &Vertices, gfx::geometry_handle const &Geometry, int const Type)
|
||||
{
|
||||
gfx::calculate_tangent(Vertices, Type);
|
||||
gfx::calculate_tangents(Vertices, Type);
|
||||
|
||||
return m_geometry.append(Vertices, Geometry);
|
||||
}
|
||||
|
||||
// provides direct access to index data of specfied chunk
|
||||
gfx::index_array const & opengl33_renderer::Indices(gfx::geometry_handle const &Geometry) const
|
||||
{
|
||||
return m_geometry.indices(Geometry);
|
||||
}
|
||||
|
||||
// provides direct access to vertex data of specfied chunk
|
||||
gfx::vertex_array const &opengl33_renderer::Vertices(gfx::geometry_handle const &Geometry) const
|
||||
{
|
||||
|
||||
return m_geometry.vertices(Geometry);
|
||||
}
|
||||
|
||||
@@ -1792,10 +1805,8 @@ void opengl33_renderer::Bind_Material( material_handle const Material, TSubModel
|
||||
|
||||
memcpy(&model_ubs.param[0], &material.params[0], sizeof(model_ubs.param));
|
||||
|
||||
for (size_t i = 0; i < material.params_state.size(); i++)
|
||||
for( auto const &entry : material.params_state )
|
||||
{
|
||||
gl::shader::param_entry entry = material.params_state[i];
|
||||
|
||||
glm::vec4 src(1.0f);
|
||||
|
||||
// submodel-based parameters
|
||||
@@ -1852,7 +1863,7 @@ void opengl33_renderer::Bind_Material( material_handle const Material, TSubModel
|
||||
|
||||
if( entry.size == 1 ) {
|
||||
// HACK: convert color to luminosity, if it's passed as single value
|
||||
src == glm::vec4 { colors::RGBtoHSV( glm::vec3 { src } ).s };
|
||||
src == glm::vec4 { colors::RGBtoHSV( glm::vec3 { src } ).z };
|
||||
}
|
||||
for (size_t j = 0; j < entry.size; j++)
|
||||
model_ubs.param[entry.location][entry.offset + j] = src[j];
|
||||
@@ -2881,7 +2892,7 @@ void opengl33_renderer::Render(TSubModel *Submodel)
|
||||
model_ubs.emission = Submodel->f4Emision.a;
|
||||
|
||||
// main draw call
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
|
||||
// post-draw reset
|
||||
model_ubs.emission = 0.0f;
|
||||
@@ -2901,13 +2912,13 @@ void opengl33_renderer::Render(TSubModel *Submodel)
|
||||
// również 0
|
||||
Bind_Material_Shadow(Submodel->m_material);
|
||||
}
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
break;
|
||||
}
|
||||
case rendermode::pickscenery:
|
||||
{
|
||||
m_pick_shader->bind();
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
break;
|
||||
}
|
||||
case rendermode::pickcontrols:
|
||||
@@ -2916,7 +2927,7 @@ void opengl33_renderer::Render(TSubModel *Submodel)
|
||||
// control picking applies individual colour for each submodel
|
||||
m_pickcontrolsitems.emplace_back(Submodel);
|
||||
model_ubs.param[0] = glm::vec4(pick_color(m_pickcontrolsitems.size()), 1.0f);
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -2942,7 +2953,7 @@ void opengl33_renderer::Render(TSubModel *Submodel)
|
||||
// main draw call
|
||||
model_ubs.param[1].x = m_pointsize;
|
||||
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3703,7 +3714,7 @@ void opengl33_renderer::Render_Alpha(TSubModel *Submodel)
|
||||
model_ubs.emission = Submodel->f4Emision.a;
|
||||
|
||||
// main draw call
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
|
||||
model_ubs.emission = 0.0f;
|
||||
break;
|
||||
@@ -3718,7 +3729,7 @@ void opengl33_renderer::Render_Alpha(TSubModel *Submodel)
|
||||
{
|
||||
Bind_Material_Shadow(Submodel->m_material);
|
||||
}
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -3841,7 +3852,7 @@ void opengl33_renderer::Render_Alpha(TSubModel *Submodel)
|
||||
model_ubs.param[1].x = pointsize * resolutionratio * fogfactor * 4.0f;
|
||||
model_ubs.param[0] = glm::vec4(glm::vec3(lightcolor), Submodel->fVisible * std::min(1.f, lightlevel) * 0.5f);
|
||||
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
}
|
||||
model_ubs.param[1].x = pointsize * resolutionratio * 4.0f;
|
||||
model_ubs.param[0] = glm::vec4(glm::vec3(lightcolor), Submodel->fVisible * std::min(1.f, lightlevel));
|
||||
@@ -3850,7 +3861,7 @@ void opengl33_renderer::Render_Alpha(TSubModel *Submodel)
|
||||
Submodel->occlusion_query.emplace(gl::query::ANY_SAMPLES_PASSED);
|
||||
Submodel->occlusion_query->begin();
|
||||
|
||||
draw(Submodel->m_geometry);
|
||||
draw(Submodel->m_geometry.handle);
|
||||
|
||||
Submodel->occlusion_query->end();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user