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

Last change on this file since 505 was 505, checked in by epyon, 9 years ago
  • several STL updates
  • several minor fixes
File size: 2.4 KB
RevLine 
[395]1// Copyright (C) 2014-2015 ChaosForge Ltd
[316]2// http://chaosforge.org/
3//
[395]4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
[316]6
7#include "nv/engine/program_manager.hh"
[368]8#include "nv/stl/range.hh"
[365]9#include "nv/core/logging.hh"
[316]10#include "nv/lua/lua_nova.hh"
[438]11#include "nv/io/c_file_system.hh"
[316]12
13nv::program_manager::program_manager( context* a_context ) : m_context( a_context )
14{
[438]15        m_shader_head = a_context->get_device()->get_shader_header();
[316]16}
17
[477]18bool nv::program_manager::load_resource( lua::table_guard& table, shash64 id )
[316]19{
[365]20        NV_LOG_DEBUG( table.get_string("id") );
[438]21        string_buffer vsource;
22        string_buffer fsource;
23        string_buffer header( m_shader_head );
[316]24        if ( table.is_table("common") )
25        {
26                lua::table_guard common( table, "common" );
[438]27                header.append( "\n" + load_source( common, "" ) + "\n" );
[316]28        }
29        {
30                lua::table_guard vtable( table, "vertex" );
[438]31                vsource = load_source( vtable, header );
[316]32        }
33        {
34                lua::table_guard ftable( table, "fragment" );
[438]35                fsource = load_source( ftable, header );
[316]36        }
37
[501]38        add( id, m_context->create_program( vsource, fsource ) );
[477]39        return true;
[316]40}
41
[477]42void nv::program_manager::release( program p )
[316]43{
[501]44        m_context->release( p );
[316]45}
46
[505]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
[438]59nv::string_buffer nv::program_manager::load_source( lua::table_guard& table, const string_view& append )
[316]60{
[438]61        c_file_system fs;
62        string_buffer out( append );
[317]63        if ( table.is_string( "files" ) )
[316]64        {
[505]65                out.append( file_to_string( table.get_string( "files" ) ) );
[316]66        }
[317]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                {
[438]73                        const_string include( inctable.get<const_string,uint32>(i) );
74                        if ( i == count ) out.append( "#line 1\n" );
[505]75                        out.append( file_to_string( include ) );
[317]76                }
77        }
[316]78
79        if ( table.is_string( "file" ) )
80        {
[505]81                const_string data = file_to_string( table.get_string( "file" ) );
[438]82                out.append( "#line 1\n" + data );
[316]83        }
[317]84
85        if ( table.is_string( "source" ) )
[316]86        {
[438]87                out.append( table.get_string( "source" ) );
[316]88        }
[438]89        return out;
[316]90}
Note: See TracBrowser for help on using the repository browser.