// // Lol Engine - Graphing tutorial // // Copyright: (c) 2012-2013 Sam Hocevar // This program is free software; you can redistribute it and/or // modify it under the terms of the Do What The Fuck You Want To // Public License, Version 2, as published by Sam Hocevar. See // http://www.wtfpl.net/ for more details. // #if HAVE_CONFIG_H # include "config.h" #endif #include #include "loldebug.h" #include using namespace lol; class ShaderBuilderDemo : public WorldEntity { public: ShaderBuilderDemo() { } virtual void TickGame(float seconds) { WorldEntity::TickGame(seconds); } virtual void TickDraw(float seconds, Scene &scene) { WorldEntity::TickDraw(seconds, scene); File file; file.Open("13_shader_builder_export.txt", FileAccess::Write); //file.Open("13_shader_builder_export.txt", FileAccess::Read); String code; ShaderBuilder builder("red_blue_green", "120"); ShaderBlock nothing_vertex("NothingVertex"); ShaderBlock red_pixel("RedPixel"); ShaderBlock green_pixel("GreenPixel"); ShaderBlock blue_pixel("BluePixel"); String vertex_out = Shader::GetProgramOutVariableLocal(ShaderProgram::Vertex); String pixel_out = Shader::GetProgramOutVariableLocal(ShaderProgram::Pixel); String in_position = Shader::GetVariablePrefix(ShaderVariable::Attribute) + "position"; String in_color = Shader::GetVariablePrefix(ShaderVariable::Attribute) + "color"; String pass_color = Shader::GetVariablePrefix(ShaderVariable::Varying) + "color"; nothing_vertex.Add(ShaderVariable::Attribute, "vec3", "position"); nothing_vertex.Add(ShaderVariable::Attribute, "vec4", "color"); nothing_vertex.Add(ShaderVariable::Varying, "vec4", "color"); nothing_vertex.Add(ShaderVariable::InOut, "vec4", vertex_out); nothing_vertex.SetMainCode( String(" ") + pass_color + " = " + in_color + ";\n" + String(" ") + vertex_out + " = vec4(" + in_position + ", 0.f);\n" ); red_pixel.Add(ShaderVariable::Varying, "vec4", "color"); red_pixel.Add(ShaderVariable::InOut, "vec4", pixel_out); red_pixel.Add(ShaderVariable::InOut, "vec4", "ambient"); red_pixel.SetMainCode( String(" ") + pixel_out + " = " + pass_color + ";\n" + String(" ") + pixel_out + ".r = 1.0;\n" + String(" ") + "ambient = vec4(1.0);\n" ); green_pixel.Add(ShaderVariable::Varying, "vec4", "color"); green_pixel.Add(ShaderVariable::InOut, "vec4", pixel_out); green_pixel.Add(ShaderVariable::InOut, "vec4", "ambient"); green_pixel.SetMainCode( String(" ") + pixel_out + " = " + pass_color + ";\n" + String(" ") + pixel_out + ".g = 1.0;\n" + String(" ") + "ambient.r = 0.0;\n" ); blue_pixel.Add(ShaderVariable::Varying, "vec4", "color"); blue_pixel.Add(ShaderVariable::InOut, "vec4", pixel_out); blue_pixel.Add(ShaderVariable::InOut, "vec4", "ambient"); blue_pixel.SetCustomCode( String("void SetAmbient(inout vec4 ambient)\n{\n ambient = vec4(1.0, 1.0, 1.0, 1.0);\n}")); blue_pixel.SetMainCode( String(" ") + pixel_out + " = " + pass_color + ";\n" + String(" ") + pixel_out + ".b = 1.0;\n" + String(" ") + "SetAmbient(ambient);\n" + String(" ") + pixel_out + " *= ambient;\n" ); builder << ShaderProgram::Vertex << ¬hing_vertex << ShaderProgram::Pixel << &red_pixel << &green_pixel << &blue_pixel; builder.Build(code); file.WriteString(code); //code = file.ReadString(); file.Close(); Shader* shader = Shader::Create(builder.GetName(), code); Shader::Destroy(shader); Ticker::Shutdown(); } }; int main(int argc, char **argv) { System::Init(argc, argv); Application app("Tutorial 13: Shader Builder", ivec2(1280, 720), 60.0f); new ShaderBuilderDemo(); app.Run(); return EXIT_SUCCESS; }