Ignore:
Timestamp:
06/12/13 09:38:06 (12 years ago)
Author:
epyon
Message:
  • vertex_buffer - fixes to index buffered vertex_arrays
  • cached_buffer - added indexed_buffer_slice and indexed_cached_buffer
  • nv_cachebuf_test - compile define for indexed or regular arrays
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/cachebuf_test/nv_cachebuf_test.cc

    r118 r119  
    1919#include <nv/gfx/cached_buffer.hh>
    2020
     21#define INDEXED_TEST
     22
    2123struct vertex
    2224{
     
    2830};
    2931
     32#ifndef INDEXED_TEST
    3033struct quad
    3134{
     
    6366
    6467};
     68#endif
     69
     70#ifdef INDEXED_TEST
     71typedef nv::indexed_cached_buffer<vertex> gcache;
     72typedef nv::indexed_buffer_slice<vertex> gslice;
     73#else
     74typedef nv::cached_buffer<quad> gcache;
     75typedef nv::buffer_slice<quad> gslice;
     76#endif
    6577
    6678struct app_window
    6779{
    68         app_window( nv::cached_buffer<quad>* cache, const glm::ivec2& a, const glm::ivec2& b, const glm::vec4& color )
    69                 : m_slice( cache ), m_a( a ), m_b( b ), m_c( color )
     80        app_window( gcache* cache, const glm::ivec2& a, const glm::ivec2& b, const glm::vec4& color )
     81                : m_slice( cache ), m_simple( false ), m_a( a ), m_b( b ), m_c( color )
    7082        {
    7183                create_complex();
     
    7688                m_c = color;
    7789                glm::vec4 dcolor( color.x * 0.5, color.y * 0.5, color.z * 0.5, 1.0 );
     90                #ifdef INDEXED_TEST
     91                std::vector<vertex>& v = m_slice.lock_vertices();
     92                size_t size   = v.size();
     93                size_t dcount = 8;
     94                size_t dmin   = 8;
     95                size_t count  = size;
     96                #else
    7897                std::vector<quad>& v = m_slice.lock();
     98                size_t size   = v.size();
     99                size_t dcount = (size - 1) * 6;
     100                size_t dmin   = 1;
     101                size_t count  = size * 6;
     102                #endif
    79103                vertex* vtx = (vertex*)v.data();
    80                 if ( v.size() > 1 )
    81                 {
    82                         for (size_t i = 0; i < (v.size() - 1) * 6; ++i )
     104                if ( size > dmin )
     105                {
     106                        for (size_t i = 0; i < dcount; ++i )
    83107                                vtx[i].color = dcolor;
    84                         for (size_t i = (v.size() - 1) * 6; i < (v.size()) * 6; ++i )
     108                        for (size_t i = dcount; i < count; ++i )
    85109                                vtx[i].color = color;
    86110                }
    87111                else
    88112                {
    89                         for (size_t i = 0; i < 6; ++i )
     113                        for (size_t i = 0; i < count; ++i )
    90114                                vtx[i].color = color;
    91115                }
     
    94118        void simplify_toggle()
    95119        {
    96                 if ( m_slice.data().size() > 1 )
     120                if ( !m_simple )
    97121                {
    98122                        NV_LOG( nv::LOG_INFO, "Simplifing" );
     
    108132        void create_simple()
    109133        {
     134                #ifdef INDEXED_TEST
     135                std::vector<vertex>& v     = m_slice.lock_vertices();
     136                std::vector<nv::uint16>& i = m_slice.lock_indices();
     137                v.clear();
     138                i.clear();
     139                v.emplace_back( m_a, m_c );
     140                v.emplace_back( nv::ivec2( m_a.x, m_b.y ), m_c );
     141                v.emplace_back( m_b, m_c );
     142                v.emplace_back( nv::ivec2( m_b.x, m_a.y ), m_c );
     143                nv::uint16 tmp[] = { 0, 1, 2, 2, 3, 0 };
     144                i.insert( i.end(), tmp, std::end( tmp ) );
     145                #else
    110146                std::vector<quad>& v = m_slice.lock();
    111147                v.clear();
    112148                v.emplace_back( m_a, m_b, m_c );
     149                #endif
     150                m_simple = true;
    113151        }
    114152
     
    116154        {
    117155                glm::vec4 dcolor( m_c.x * 0.5, m_c.y * 0.5, m_c.z * 0.5, 1.0 );
    118                 std::vector<quad>& v = m_slice.lock();
    119                 v.clear();
    120156                nv::ivec2 a2( m_a.x, m_b.y );
    121157                nv::ivec2 b2( m_b.x, m_a.y );
    122158                nv::ivec2 t1( 10, 10 );
    123159                nv::ivec2 t2( -10, 10 );
     160                #ifdef INDEXED_TEST
     161                std::vector<vertex>& v     = m_slice.lock_vertices();
     162                std::vector<nv::uint16>& i = m_slice.lock_indices();
     163                v.clear();
     164                i.clear();
     165                v.emplace_back( m_a- t1, dcolor ); // 0
     166                v.emplace_back( a2 + t2, dcolor ); // 1
     167                v.emplace_back( m_b+ t1, dcolor ); // 2
     168                v.emplace_back( b2 - t2, dcolor ); // 3
     169
     170                v.emplace_back( m_a, dcolor ); // 4
     171                v.emplace_back( a2, dcolor );  // 5
     172                v.emplace_back( m_b, dcolor ); // 6
     173                v.emplace_back( b2, dcolor );  // 7
     174                nv::uint16 tmp[] = {
     175                        0, 4, 7, 7, 3, 0,
     176                        0, 1, 5, 5, 4, 0,
     177                        1, 2, 6, 6, 5, 1,
     178                        2, 3, 7, 7, 6, 2,
     179                };
     180                i.insert( i.end(), tmp, std::end( tmp ) );
     181
     182                v.emplace_back( m_a, m_c );    // 8
     183                v.emplace_back( a2, m_c );     // 9
     184                v.emplace_back( m_b, m_c );    // 10
     185                v.emplace_back( b2, m_c );     // 11
     186                nv::uint16 tmp2[] = { 8, 9, 10, 10, 11, 8 };
     187                i.insert( i.end(), tmp2, std::end( tmp2 ) );
     188
     189                #else
     190                std::vector<quad>& v = m_slice.lock();
     191                v.clear();
    124192                v.emplace_back( m_a - t1, m_a,       b2, b2 - t2, dcolor );
    125193                v.emplace_back( m_a - t1, a2 + t2, a2, m_a,       dcolor );
     
    127195                v.emplace_back( m_b + t1, b2 - t2, b2, m_b, dcolor );
    128196                v.emplace_back( m_a, m_b, m_c );
     197                #endif
     198                m_simple = false;
    129199        }
    130200
     
    134204        }
    135205
    136         nv::buffer_slice<quad> m_slice;
     206        gslice m_slice;
     207        bool m_simple;
    137208        nv::ivec2 m_a;
    138209        nv::ivec2 m_b;
     
    157228        nv::render_state m_render_state;
    158229       
    159         nv::cached_buffer<quad>* m_quad_cache;
     230        gcache* m_quad_cache;
    160231        std::vector<app_window>  m_windows;
    161232
     
    185256{
    186257        {
    187                 m_program = m_device->create_program( nv::slurp( "cachebuf.vert" ), nv::slurp( "cachebuf.frag" ) );
    188                 m_va      = m_device->create_vertex_array();
    189 
    190                 m_quad_cache = new nv::cached_buffer<quad>( m_device, nv::DYNAMIC_DRAW, 20, true );
    191                 m_coord_loc  = m_program->get_attribute("coord")->get_location();
    192                 m_color_loc  = m_program->get_attribute("color")->get_location();
    193 
    194                 m_va->add_vertex_buffer( m_coord_loc, (nv::vertex_buffer*)m_quad_cache->get_buffer(), nv::INT,   2, 0, sizeof( vertex ), false );
    195                 m_va->add_vertex_buffer( m_color_loc, (nv::vertex_buffer*)m_quad_cache->get_buffer(), nv::FLOAT, 4, offset_of( &vertex::color ), sizeof( vertex ), false );
     258                m_program   = m_device->create_program( nv::slurp( "cachebuf.vert" ), nv::slurp( "cachebuf.frag" ) );
     259                m_coord_loc = m_program->get_attribute("coord")->get_location();
     260                m_color_loc = m_program->get_attribute("color")->get_location();
     261                m_va        = m_device->create_vertex_array();
     262
     263                #ifdef INDEXED_TEST
     264                m_quad_cache = new gcache( m_device, nv::DYNAMIC_DRAW, 200, 200 );
     265                m_va->set_index_buffer( m_quad_cache->get_index_buffer(), nv::USHORT, false );
     266                nv::vertex_buffer* buffer = m_quad_cache->get_vertex_buffer();
     267                #else
     268                m_quad_cache = new gcache( m_device, nv::DYNAMIC_DRAW, 20, true );
     269                nv::vertex_buffer* buffer = (nv::vertex_buffer*)m_quad_cache->get_buffer();
     270                #endif
     271
     272                m_va->add_vertex_buffer( m_coord_loc, buffer, nv::INT,   2, 0, sizeof( vertex ), false );
     273                m_va->add_vertex_buffer( m_color_loc, buffer, nv::FLOAT, 4, offset_of( &vertex::color ), sizeof( vertex ), false );
    196274        }
    197275        return true;
     
    213291                if (m_quad_cache->commit() )
    214292                {
    215                         m_va->update_vertex_buffer( m_coord_loc, (nv::vertex_buffer*)m_quad_cache->get_buffer(), false );
    216                         m_va->update_vertex_buffer( m_color_loc, (nv::vertex_buffer*)m_quad_cache->get_buffer(), false );
     293                        #ifdef INDEXED_TEST
     294                        m_va->set_index_buffer( m_quad_cache->get_index_buffer() );
     295                        nv::vertex_buffer* buffer = m_quad_cache->get_vertex_buffer();
     296                        #else
     297                        nv::vertex_buffer* buffer = (nv::vertex_buffer*)m_quad_cache->get_buffer();
     298                        #endif
     299                        m_va->update_vertex_buffer( m_coord_loc, buffer, false );
     300                        m_va->update_vertex_buffer( m_color_loc, buffer, false );
    217301                }
    218302
     
    220304                m_program->bind();
    221305//              m_program->set_uniform( "tex", 0 );
    222                 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_program, m_va, m_quad_cache->get_size() * 6 );
     306                #ifdef INDEXED_TEST
     307                size_t draw_size = m_quad_cache->get_index_size();
     308                #else
     309                size_t draw_size = m_quad_cache->get_size() * 6;
     310                #endif
     311                m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_program, m_va, draw_size );
    223312                m_window->swap_buffers();
    224313
Note: See TracChangeset for help on using the changeset viewer.