diff --git a/openglgeometrybank.cpp b/openglgeometrybank.cpp index 89692b57..c1a7ca0a 100644 --- a/openglgeometrybank.cpp +++ b/openglgeometrybank.cpp @@ -75,9 +75,6 @@ opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry, gfx::stream chunk.vertices.data() ); chunkrecord.is_good = true; } - if( m_activestreams != Streams ) { - bind_streams( Units, Streams ); - } // ...render... if( chunkrecord.index_count > 0 ) { /* @@ -86,13 +83,28 @@ opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry, gfx::stream chunkrecord.index_count, GL_UNSIGNED_INT, reinterpret_cast( chunkrecord.index_offset * sizeof( gfx::basic_index ) ), chunkrecord.vertex_offset ); */ - ::glDrawRangeElementsBaseVertex( - chunk.type, - 0, chunkrecord.vertex_count, - chunkrecord.index_count, GL_UNSIGNED_INT, reinterpret_cast( chunkrecord.index_offset * sizeof( gfx::basic_index ) ), - chunkrecord.vertex_offset ); + if (GLAD_GL_VERSION_3_2 || GLAD_GL_ARB_draw_elements_base_vertex) { + if( m_activestreams != Streams ) { + bind_streams( Units, Streams ); + } + ::glDrawRangeElementsBaseVertex( + chunk.type, + 0, chunkrecord.vertex_count, + chunkrecord.index_count, GL_UNSIGNED_INT, reinterpret_cast( chunkrecord.index_offset * sizeof( gfx::basic_index ) ), + chunkrecord.vertex_offset ); + } + else { + bind_streams( Units, Streams, chunkrecord.vertex_offset ); + ::glDrawRangeElements( + chunk.type, + 0, chunkrecord.vertex_count, + chunkrecord.index_count, GL_UNSIGNED_INT, reinterpret_cast( chunkrecord.index_offset * sizeof( gfx::basic_index ) ) ); + } } else { + if( m_activestreams != Streams ) { + bind_streams( Units, Streams ); + } ::glDrawArrays( chunk.type, chunkrecord.vertex_offset, chunkrecord.vertex_count ); } // ...post-render cleanup @@ -211,10 +223,10 @@ opengl_vbogeometrybank::delete_buffer() { } void -opengl_vbogeometrybank::bind_streams( gfx::stream_units const &Units, unsigned int const Streams ) { +opengl_vbogeometrybank::bind_streams( gfx::stream_units const &Units, unsigned int const Streams, size_t offset ) { if( Streams & gfx::stream::position ) { - ::glVertexPointer( 3, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 0 ) ); + ::glVertexPointer( 3, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( sizeof( gfx::basic_vertex ) * offset ) ); ::glEnableClientState( GL_VERTEX_ARRAY ); } else { @@ -222,14 +234,14 @@ opengl_vbogeometrybank::bind_streams( gfx::stream_units const &Units, unsigned i } // NOTE: normal and color streams share the data, making them effectively mutually exclusive if( Streams & gfx::stream::normal ) { - ::glNormalPointer( GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 12 ) ); + ::glNormalPointer( GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 12 + sizeof( gfx::basic_vertex ) * offset ) ); ::glEnableClientState( GL_NORMAL_ARRAY ); } else { ::glDisableClientState( GL_NORMAL_ARRAY ); } if( Streams & gfx::stream::color ) { - ::glColorPointer( 3, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 12 ) ); + ::glColorPointer( 3, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 12 + sizeof( gfx::basic_vertex ) * offset ) ); ::glEnableClientState( GL_COLOR_ARRAY ); } else { @@ -238,7 +250,7 @@ opengl_vbogeometrybank::bind_streams( gfx::stream_units const &Units, unsigned i if( Streams & gfx::stream::texture ) { for( auto unit : Units.texture ) { ::glClientActiveTexture( GL_TEXTURE0 + unit ); - ::glTexCoordPointer( 2, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 24 ) ); + ::glTexCoordPointer( 2, GL_FLOAT, sizeof( gfx::basic_vertex ), reinterpret_cast( 24 + sizeof( gfx::basic_vertex ) * offset ) ); ::glEnableClientState( GL_TEXTURE_COORD_ARRAY ); } m_activetexturearrays = Units.texture; diff --git a/openglgeometrybank.h b/openglgeometrybank.h index 53843f55..7e1d243c 100644 --- a/openglgeometrybank.h +++ b/openglgeometrybank.h @@ -63,7 +63,7 @@ private: delete_buffer(); static void - bind_streams( gfx::stream_units const &Units, unsigned int const Streams ); + bind_streams(gfx::stream_units const &Units, unsigned int const Streams , size_t offset = 0); static void release_streams(); @@ -121,4 +121,4 @@ private: }; -} // namespace gfx \ No newline at end of file +} // namespace gfx diff --git a/ref/glad/include/glad/glad.h b/ref/glad/include/glad/glad.h index 6c80e5ec..5f7d0308 100644 --- a/ref/glad/include/glad/glad.h +++ b/ref/glad/include/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL, OpenGL ES loader generated by glad 0.1.34 on Wed Jan 20 19:37:38 2021. + OpenGL, OpenGL ES loader generated by glad 0.1.34 on Fri Jan 22 22:11:52 2021. Language/Generator: C/C++ Specification: gl @@ -9,6 +9,7 @@ Extensions: GL_ARB_clip_control, GL_ARB_direct_state_access, + GL_ARB_draw_elements_base_vertex, GL_ARB_multi_bind, GL_ARB_texture_filter_anisotropic, GL_EXT_clip_control, @@ -26,9 +27,9 @@ Reproducible: False Commandline: - --profile="compatibility" --api="gl=3.3,gles2=3.2" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_EXT_clip_control,GL_EXT_framebuffer_object,GL_EXT_geometry_shader,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_KHR_debug,GL_OES_draw_elements_base_vertex" + --profile="compatibility" --api="gl=3.3,gles2=3.2" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_draw_elements_base_vertex,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_EXT_clip_control,GL_EXT_framebuffer_object,GL_EXT_geometry_shader,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_KHR_debug,GL_OES_draw_elements_base_vertex" Online: - https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.2&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_EXT_clip_control&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_KHR_debug&extensions=GL_OES_draw_elements_base_vertex + https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.2&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_draw_elements_base_vertex&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_EXT_clip_control&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_KHR_debug&extensions=GL_OES_draw_elements_base_vertex */ @@ -4774,6 +4775,10 @@ typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buff GLAPI PFNGLGETQUERYBUFFEROBJECTUIVPROC glad_glGetQueryBufferObjectuiv; #define glGetQueryBufferObjectuiv glad_glGetQueryBufferObjectuiv #endif +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +GLAPI int GLAD_GL_ARB_draw_elements_base_vertex; +#endif #ifndef GL_ARB_multi_bind #define GL_ARB_multi_bind 1 GLAPI int GLAD_GL_ARB_multi_bind; diff --git a/ref/glad/src/glad.c b/ref/glad/src/glad.c index b0e9bde2..37e97449 100644 --- a/ref/glad/src/glad.c +++ b/ref/glad/src/glad.c @@ -1,6 +1,6 @@ /* - OpenGL, OpenGL ES loader generated by glad 0.1.34 on Wed Jan 20 19:37:38 2021. + OpenGL, OpenGL ES loader generated by glad 0.1.34 on Fri Jan 22 22:11:52 2021. Language/Generator: C/C++ Specification: gl @@ -9,6 +9,7 @@ Extensions: GL_ARB_clip_control, GL_ARB_direct_state_access, + GL_ARB_draw_elements_base_vertex, GL_ARB_multi_bind, GL_ARB_texture_filter_anisotropic, GL_EXT_clip_control, @@ -26,9 +27,9 @@ Reproducible: False Commandline: - --profile="compatibility" --api="gl=3.3,gles2=3.2" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_EXT_clip_control,GL_EXT_framebuffer_object,GL_EXT_geometry_shader,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_KHR_debug,GL_OES_draw_elements_base_vertex" + --profile="compatibility" --api="gl=3.3,gles2=3.2" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_clip_control,GL_ARB_direct_state_access,GL_ARB_draw_elements_base_vertex,GL_ARB_multi_bind,GL_ARB_texture_filter_anisotropic,GL_EXT_clip_control,GL_EXT_framebuffer_object,GL_EXT_geometry_shader,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,GL_EXT_texture_sRGB,GL_GREMEDY_string_marker,GL_KHR_debug,GL_OES_draw_elements_base_vertex" Online: - https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.2&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_EXT_clip_control&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_KHR_debug&extensions=GL_OES_draw_elements_base_vertex + https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.3&api=gles2%3D3.2&extensions=GL_ARB_clip_control&extensions=GL_ARB_direct_state_access&extensions=GL_ARB_draw_elements_base_vertex&extensions=GL_ARB_multi_bind&extensions=GL_ARB_texture_filter_anisotropic&extensions=GL_EXT_clip_control&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_geometry_shader&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=GL_EXT_texture_sRGB&extensions=GL_GREMEDY_string_marker&extensions=GL_KHR_debug&extensions=GL_OES_draw_elements_base_vertex */ #include @@ -985,6 +986,7 @@ PFNGLWINDOWPOS3SPROC glad_glWindowPos3s = NULL; PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv = NULL; int GLAD_GL_ARB_clip_control = 0; int GLAD_GL_ARB_direct_state_access = 0; +int GLAD_GL_ARB_draw_elements_base_vertex = 0; int GLAD_GL_ARB_multi_bind = 0; int GLAD_GL_ARB_texture_filter_anisotropic = 0; int GLAD_GL_EXT_clip_control = 0; @@ -2002,6 +2004,13 @@ static void load_GL_ARB_direct_state_access(GLADloadproc load) { glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)load("glGetQueryBufferObjectui64v"); glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)load("glGetQueryBufferObjectuiv"); } +static void load_GL_ARB_draw_elements_base_vertex(GLADloadproc load) { + if(!GLAD_GL_ARB_draw_elements_base_vertex) return; + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)load("glDrawElementsBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)load("glDrawRangeElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)load("glDrawElementsInstancedBaseVertex"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)load("glMultiDrawElementsBaseVertex"); +} static void load_GL_ARB_multi_bind(GLADloadproc load) { if(!GLAD_GL_ARB_multi_bind) return; glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)load("glBindBuffersBase"); @@ -2064,6 +2073,7 @@ static int find_extensionsGL(void) { if (!get_exts()) return 0; GLAD_GL_ARB_clip_control = has_ext("GL_ARB_clip_control"); GLAD_GL_ARB_direct_state_access = has_ext("GL_ARB_direct_state_access"); + GLAD_GL_ARB_draw_elements_base_vertex = has_ext("GL_ARB_draw_elements_base_vertex"); GLAD_GL_ARB_multi_bind = has_ext("GL_ARB_multi_bind"); GLAD_GL_ARB_texture_filter_anisotropic = has_ext("GL_ARB_texture_filter_anisotropic"); GLAD_GL_EXT_framebuffer_object = has_ext("GL_EXT_framebuffer_object"); @@ -2152,6 +2162,7 @@ int gladLoadGLLoader(GLADloadproc load) { if (!find_extensionsGL()) return 0; load_GL_ARB_clip_control(load); load_GL_ARB_direct_state_access(load); + load_GL_ARB_draw_elements_base_vertex(load); load_GL_ARB_multi_bind(load); load_GL_EXT_framebuffer_object(load); load_GL_GREMEDY_string_marker(load);