Ignore:
Timestamp:
07/19/16 13:43:10 (9 years ago)
Author:
epyon
Message:
  • nv::engine upgrades
  • default_resource_manager implementation
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/engine/renderer.hh

    r507 r508  
    1818#include <nv/interface/device.hh>
    1919#include <nv/interface/context.hh>
     20#include <nv/engine/program_manager.hh>
     21#include <nv/engine/material_manager.hh>
     22#include <nv/engine/mesh_manager.hh>
     23#include <nv/engine/render_pass.hh>
    2024
    2125namespace nv
    2226{
    23         struct render_pass
     27
     28        struct renderer_element
    2429        {
    25                 render_state rstate;
    26                 clear_state  cstate;
    27                 framebuffer  fbuffer;
    28                 output_slot  output[8];
    29                 uint32       output_count;
     30                resource< gpu_mesh >     mesh;
     31                resource< gpu_material > mat;
     32                uint32                   layer;
     33                sint32                   bone_offset;
     34                transform                model;
     35                flags< 32 >              flags;
     36        };
    3037
     38        struct renderer_direct_element
     39        {
     40                vertex_array             va;
     41                uint32                   count;
     42                uint32                   instances;
     43                uint32                   first;
     44                resource< gpu_material > material;
     45                resource< program >      programs[4];
     46                transform                model;
     47                flags< 32 >              flags;
     48        };
     49
     50        struct renderer_element_compare
     51        {
     52                bool operator()( const renderer_element& l, const renderer_element& r )
     53                {
     54                        if ( l.layer < r.layer ) return true;
     55                        if ( l.layer > r.layer ) return false;
     56                        if ( *l.flags.data() < *r.flags.data() ) return true;
     57                        if ( *l.flags.data() > *r.flags.data() ) return false;
     58                        if ( l.mat < r.mat ) return true;
     59                        if ( l.mat > r.mat ) return false;
     60                        return false;
     61                }
    3162        };
    3263
    3364        class renderer
    3465        {
     66        public:
     67                enum stats
     68                {
     69                        DRAW_CALL,
     70                        TRIANGLE_COUNT,
     71                        MAX
     72                };
     73
     74                explicit renderer( context* ctx );
     75                void start_frame()
     76                {
     77                        for ( uint32& s : m_statistics ) s = 0;
     78                }
     79
     80                void push_element( const nv::renderer_element& element )
     81                {
     82                        m_elements.push_back( element );
     83                }
     84
     85                void sort();
     86                void render( const scene_state& ss, const render_pass& pass );
     87                void render( const scene_state& ss, const render_pass& pass, vertex_array va, uint32 va_count, uint32 program_idx = 0 );
     88                void render_quad( const scene_state& ss, const render_pass& pass, uint32 program_idx = 0 )
     89                {
     90                        render( ss, pass, m_quad, 6, program_idx );
     91                }
     92                void render_direct( const scene_state& ss, const render_pass& pass, const nv::array_view< renderer_direct_element >& elements, uint32 program_idx = 0 );
     93
     94                uint32 get_stat( stats s ) const { return m_statistics[s]; }
     95
     96                void end_frame()
     97                {
     98                        m_elements.clear();
     99                }
     100                void reset()
     101                {
     102                        m_elements.clear();
     103                }
     104
     105        protected:
     106                bool match( flags<32> f, const render_pass& pass )
     107                {
     108                        if ( ( f & pass.any ).empty() ) return false;
     109                        if ( ( f & pass.exclude ).any() ) return false;
     110                        return true;
     111                }
     112
     113                context*                    m_context;
     114                vertex_array                m_quad;
     115                vector< renderer_element >  m_elements;
     116                uint32                      m_statistics[MAX];
    35117
    36118        };
Note: See TracChangeset for help on using the changeset viewer.