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

Last change on this file since 474 was 474, checked in by epyon, 10 years ago
  • resource manager updates
File size: 2.1 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
[474]18nv::res_id nv::program_manager::load_resource( lua::table_guard& table )
[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
[474]38        nv::program* program = new nv::program( m_context->get_device()->create_program( vsource, fsource ) );
[316]39        return add( program );
40}
41
[474]42void nv::program_manager::release( program* p )
[316]43{
[474]44        m_context->get_device()->release( *p );
45        delete p;
[316]46}
47
[438]48nv::string_buffer nv::program_manager::load_source( lua::table_guard& table, const string_view& append )
[316]49{
[438]50        c_file_system fs;
51        string_buffer out( append );
[317]52        if ( table.is_string( "files" ) )
[316]53        {
[438]54                out.append( fs.slurp( table.get_string( "files" ) ) );
[316]55        }
[317]56        else if ( table.is_table( "files" ) )
57        {
58                lua::table_guard inctable( table, "files" );
59                uint32 count = inctable.get_size();
60                for ( uint32 i = 1; i <= count; ++i )
61                {
[438]62                        const_string include( inctable.get<const_string,uint32>(i) );
63                        if ( i == count ) out.append( "#line 1\n" );
64                        out.append( fs.slurp( include ) );
[317]65                }
66        }
[316]67
68        if ( table.is_string( "file" ) )
69        {
[438]70                const_string data = fs.slurp( table.get_string( "file" ) );
71                out.append( "#line 1\n" + data );
[316]72        }
[317]73
74        if ( table.is_string( "source" ) )
[316]75        {
[438]76                out.append( table.get_string( "source" ) );
[316]77        }
[438]78        return out;
[316]79}
Note: See TracBrowser for help on using the repository browser.