source: trunk/src/engine/program_manager.cc @ 457

Last change on this file since 457 was 438, checked in by epyon, 10 years ago
  • massive amount of std::string removal
  • removed slurp, use filesystem::slurp instead
  • lua_values const_string support
  • several bugfixes
  • program_manager and shader loading without std::string/std::stream
File size: 2.1 KB
Line 
1// Copyright (C) 2014-2015 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
6
7#include "nv/engine/program_manager.hh"
8#include "nv/stl/range.hh"
9#include "nv/core/logging.hh"
10#include "nv/lua/lua_nova.hh"
11#include "nv/io/c_file_system.hh"
12
13nv::program_manager::program_manager( context* a_context ) : m_context( a_context )
14{
15        m_shader_head = a_context->get_device()->get_shader_header();
16}
17
18nv::resource_id nv::program_manager::load_resource( lua::table_guard& table )
19{
20        NV_LOG_DEBUG( table.get_string("id") );
21        string_buffer vsource;
22        string_buffer fsource;
23        string_buffer header( m_shader_head );
24        if ( table.is_table("common") )
25        {
26                lua::table_guard common( table, "common" );
27                header.append( "\n" + load_source( common, "" ) + "\n" );
28        }
29        {
30                lua::table_guard vtable( table, "vertex" );
31                vsource = load_source( vtable, header );
32        }
33        {
34                lua::table_guard ftable( table, "fragment" );
35                fsource = load_source( ftable, header );
36        }
37
38        nv::program program = m_context->get_device()->create_program( vsource, fsource );
39        return add( program );
40}
41
42void nv::program_manager::release( program p )
43{
44        m_context->get_device()->release( p );
45}
46
47nv::string_buffer nv::program_manager::load_source( lua::table_guard& table, const string_view& append )
48{
49        c_file_system fs;
50        string_buffer out( append );
51        if ( table.is_string( "files" ) )
52        {
53                out.append( fs.slurp( table.get_string( "files" ) ) );
54        }
55        else if ( table.is_table( "files" ) )
56        {
57                lua::table_guard inctable( table, "files" );
58                uint32 count = inctable.get_size();
59                for ( uint32 i = 1; i <= count; ++i )
60                {
61                        const_string include( inctable.get<const_string,uint32>(i) );
62                        if ( i == count ) out.append( "#line 1\n" );
63                        out.append( fs.slurp( include ) );
64                }
65        }
66
67        if ( table.is_string( "file" ) )
68        {
69                const_string data = fs.slurp( table.get_string( "file" ) );
70                out.append( "#line 1\n" + data );
71        }
72
73        if ( table.is_string( "source" ) )
74        {
75                out.append( table.get_string( "source" ) );
76        }
77        return out;
78}
Note: See TracBrowser for help on using the repository browser.