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

Last change on this file since 514 was 505, checked in by epyon, 9 years ago
  • several STL updates
  • several minor fixes
File size: 2.4 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
18bool nv::program_manager::load_resource( lua::table_guard& table, shash64 id )
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        add( id, m_context->create_program( vsource, fsource ) );
39        return true;
40}
41
42void nv::program_manager::release( program p )
43{
44        m_context->release( p );
45}
46
47nv::const_string nv::program_manager::file_to_string( const string_view& path )
48{
49        c_file_system fs;
50        stream* fstream = open_stream( fs, path );
51        if ( !fstream ) return const_string();
52        uint32 size = fstream->size();
53        const_string result( nullptr, size );
54        fstream->read( const_cast<char*>( result.data() ), size, 1 );
55        delete fstream;
56        return result;
57}
58
59nv::string_buffer nv::program_manager::load_source( lua::table_guard& table, const string_view& append )
60{
61        c_file_system fs;
62        string_buffer out( append );
63        if ( table.is_string( "files" ) )
64        {
65                out.append( file_to_string( table.get_string( "files" ) ) );
66        }
67        else if ( table.is_table( "files" ) )
68        {
69                lua::table_guard inctable( table, "files" );
70                uint32 count = inctable.get_size();
71                for ( uint32 i = 1; i <= count; ++i )
72                {
73                        const_string include( inctable.get<const_string,uint32>(i) );
74                        if ( i == count ) out.append( "#line 1\n" );
75                        out.append( file_to_string( include ) );
76                }
77        }
78
79        if ( table.is_string( "file" ) )
80        {
81                const_string data = file_to_string( table.get_string( "file" ) );
82                out.append( "#line 1\n" + data );
83        }
84
85        if ( table.is_string( "source" ) )
86        {
87                out.append( table.get_string( "source" ) );
88        }
89        return out;
90}
Note: See TracBrowser for help on using the repository browser.