Changeset 328


Ignore:
Timestamp:
09/02/14 03:38:18 (11 years ago)
Author:
epyon
Message:
  • support for basic gui element skinning (WIP)
  • window_manager fix for gui_test
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/core/position.hh

    r319 r328  
    197197                 */
    198198                rectangle shrinked( int value ) { position p(value,value); return rectangle(ul+p, lr-p); }
    199                
     199
     200                rectangle shrinked( dimension value ) { return rectangle(ul+value, lr-value); }
     201
    200202                /**
    201203                 * Shifts the rectangle by a given amount.
  • trunk/nv/gui/gui_renderer.hh

    r319 r328  
    4040                };
    4141
     42                struct image_info
     43                {
     44                        vec2 t1;
     45                        vec2 t2;
     46                        ivec2 size;
     47
     48                        image_info() {}
     49                        image_info( const nv::vec2 tex1, const nv::vec2 tex2, const nv::ivec2 s )
     50                                : t1( tex1 ), t2( tex2 ), size( s ) {}
     51                };
     52
    4253                class renderer
    4354                {
     
    4556                        renderer( window* w );
    4657                        texture_font* get_font( size_t name ) const;
    47                         vec4 get_image( size_t name ) const;
     58                        const image_info* get_image( size_t name ) const;
    4859                        void load_style( const std::string& filename );
    4960                        size_t load_font( const std::string& filename, size_t size );
     
    5667                        typedef std::unordered_map< std::string, size_t > names;
    5768                        typedef std::vector< texture_font* >              font_vector;
    58                         typedef std::vector< vec4 >                       image_vector;
     69                        typedef std::vector< image_info >                 image_vector;
    5970
    6071                        context*      m_context;
  • trunk/src/gui/gui_renderer.cc

    r322 r328  
    3838        "}\n";
    3939
     40
    4041using namespace nv;
    4142using namespace nv::gui;
     43
     44const ivec2 atlas_size = ivec2( 1024, 1024 );
    4245
    4346struct gui_quad
     
    121124        : m_window(w)
    122125        , m_style()
    123         , m_atlas( glm::ivec2( 1024, 1024 ), 4 )
     126        , m_atlas( atlas_size, 4 )
    124127        , m_reupload( true )
    125128{
     
    164167}
    165168
    166 nv::vec4 renderer::get_image( size_t name ) const
    167 {
    168         if ( name >= m_images.size() ) return nv::vec4();
    169         return m_images[ name ];
     169const image_info* renderer::get_image( size_t name ) const
     170{
     171        if ( name >= m_images.size() ) return nullptr;
     172        return &m_images[ name ];
    170173}
    171174
     
    201204        region r = m_atlas.get_region( data->get_size() );
    202205        m_atlas.set_region( r, data->get_data() );
     206        m_images.emplace_back( vec2( r.pos ) / vec2( atlas_size ), vec2( r.size + r.pos ) / vec2( atlas_size ), r.size );
    203207        delete data;
    204208        m_reupload = true;
     
    228232        if ( e->m_absolute != m_area )
    229233        {
    230                 int border;
     234                int border = 0;
    231235                vec4 color;
    232236                std::string path;
    233237                std::string text;
    234                 if ( m_style.get( e, "border", border ) && m_style.get( e, "border_color", color ) )
     238
     239                if ( m_style.get( e, "skin", path ) )
    235240                {
    236                         rectangle inner = abs.shrinked( border );
    237                         qvec.emplace_back( abs.ul, inner.ul, inner.ur(), abs.ur(), color );
    238                         qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
    239                         qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
    240                         qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
    241                         abs = inner;
     241                        size_t image_id = load_image( path );
     242                        const image_info* image  = get_image( image_id );
     243                        if ( image )
     244                        {
     245                                color = vec4( 2, 2, 2, 1 );
     246                                ivec2 isize3  = image->size / 3;
     247                                ivec2 isize3x = ivec2( isize3.x, 0 );
     248                                ivec2 isize3y = ivec2( 0, isize3.y );
     249                                vec2 tsize    = ( image->t2 - image->t1 );
     250                                vec2 tsize3   = ( image->t2 - image->t1 ) / 3.0f;
     251                                vec2 tsize32  = ( image->t2 - image->t1 ) * ( 2.0f / 3.0f );
     252                                vec2 tsizex   = vec2( tsize.x, 0.0f );
     253                                vec2 tsizey   = vec2( 0.0f, tsize.y );
     254                                vec2 tsize3x  = vec2( tsize3.x, 0.0f );
     255                                vec2 tsize3y  = vec2( 0.0f, tsize3.y );
     256                                vec2 tsize3x2 = vec2( tsize32.x, 0.0f );
     257                                vec2 tsize3y2 = vec2( 0.0f, tsize32.y );
     258
     259                                rectangle inner = abs.shrinked( isize3 );
     260                                qvec.emplace_back( abs.ul, inner.ul, color, image->t1, image->t1+tsize3 );
     261                                qvec.emplace_back( abs.ul+isize3x, inner.ur(), color, image->t1+tsize3x, image->t1+tsize3x2+tsize3y);
     262                                qvec.emplace_back( abs.ur()-isize3x, inner.ur()+isize3x, color, image->t1+tsize3x2, image->t1+tsizex+tsize3y );
     263
     264                                qvec.emplace_back( abs.ul+isize3y, inner.ll(), color, image->t1+tsize3y, image->t1+tsize3y2+tsize3x );
     265                                qvec.emplace_back( inner.ul, inner.lr, color, image->t1+tsize3, image->t1+tsize32 );
     266                                qvec.emplace_back( inner.ur(), inner.lr+isize3x, color, image->t1+tsize3+tsize3x, image->t1+tsize32+tsize3x );
     267
     268
     269                                qvec.emplace_back( abs.ll()-isize3y, inner.ll()+isize3y, color, image->t1+tsize3y2, image->t1+tsize3y2+tsize3 );
     270                                qvec.emplace_back( inner.ll(), abs.lr-isize3x, color, image->t1+tsize3y2+tsize3x, image->t1+tsize32+tsize3y );
     271                                qvec.emplace_back( inner.lr, abs.lr, color, image->t1+tsize32, image->t1+tsize );
     272
     273       
     274//                              qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
     275//                              qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
     276//                              qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
     277                                abs = inner;
     278
     279                        }
     280
    242281                }
    243 
    244                 if ( m_style.get( e, "background_color", color ) )
     282                else
    245283                {
    246                         qvec.emplace_back( abs.ul, abs.lr, color );
     284
     285                        if ( m_style.get( e, "border", border ) && m_style.get( e, "border_color", color ) )
     286                        {
     287                                rectangle inner = abs.shrinked( border );
     288                                qvec.emplace_back( abs.ul, inner.ul, inner.ur(), abs.ur(), color );
     289                                qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
     290                                qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
     291                                qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
     292                                abs = inner;
     293                        }
     294
     295                        if ( m_style.get( e, "background_color", color ) )
     296                        {
     297                                qvec.emplace_back( abs.ul, abs.lr, color );
     298                        }
    247299                }
    248300
  • trunk/tests/gui_test/gui_test.lua

    r321 r328  
    44        includedirs { "../../" }
    55        targetname "nv_gui_test"
    6         links { "nv-core", "nv-gl", "nv-gui" }
     6        links { "nv-core", "nv-gl", "nv-gui", "nv-sdl" }
    77        targetdir "../../bin"   
    88 
  • trunk/tests/gui_test/nv_gui_test.cc

    r321 r328  
    11#include <nv/gl/gl_device.hh>
    22#include <nv/gui/gui_environment.hh>
     3#include <nv/sdl/sdl_window_manager.hh>
    34#include <nv/interface/context.hh>
     5#include <nv/interface/window_manager.hh>
    46#include <nv/core/logging.hh>
    57#include <nv/core/logger.hh>
     
    1820        ~application();
    1921protected:
     22        nv::window_manager* m_wm;
    2023        nv::device* m_device;
    2124        nv::window* m_window;
     
    2831{
    2932        m_device = new nv::gl_device();
    30         m_window = m_device->create_window( 800, 600, false );
     33        m_wm     = new nv::sdl::window_manager;
     34        m_window = m_wm->create_window( m_device, 800, 600, false );
    3135        m_clear_state.buffers = nv::clear_state::COLOR_AND_DEPTH_BUFFER;
    3236        m_guienv = new nv::gui::environment( m_window );
  • trunk/tests/gui_test/test.style.lua

    r127 r328  
    66
    77        window = {
    8                 border = 2,
    9                 border_color = { 0.2, 0.2, 0.4, 1.0 },
     8                --border = 2,
     9                --border_color = { 0.2, 0.2, 0.4, 1.0 },
     10                skin = "button.png",
    1011        }
    1112}
Note: See TracChangeset for help on using the changeset viewer.