00001 /* 00002 Copyright (c) 2010, The Barbarian Group 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that 00006 the following conditions are met: 00007 00008 * Redistributions of source code must retain the above copyright notice, this list of conditions and 00009 the following disclaimer. 00010 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 00011 the following disclaimer in the documentation and/or other materials provided with the distribution. 00012 00013 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 00014 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00015 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 00016 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00017 TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00018 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00019 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00020 POSSIBILITY OF SUCH DAMAGE. 00021 */ 00022 00023 #pragma once 00024 00025 #include <string> 00026 #include <sstream> 00027 #include <iostream> 00028 #include <fstream> 00029 #include <exception> 00030 #include <map> 00031 00032 #include "cinder/gl/gl.h" 00033 #include "cinder/Vector.h" 00034 #include "cinder/Color.h" 00035 #include "cinder/Matrix.h" 00036 #include "cinder/DataSource.h" 00037 00038 namespace cinder { namespace gl { 00039 00041 class GlslProg { 00042 public: 00043 GlslProg() {} 00044 GlslProg( DataSourceRef vertexShader, DataSourceRef fragmentShader = DataSourceRef(), DataSourceRef geometryShader = DataSourceRef(), 00045 GLint geometryInputType = GL_POINTS, GLint geometryOutputType = GL_TRIANGLES, GLint geometryOutputVertices = 0); 00046 00047 GlslProg( const char *vertexShader, const char *fragmentShader = 0, const char *geometryShader = 0, GLint geometryInputType = GL_POINTS, GLint geometryOutputType = GL_TRIANGLES, GLint geometryOutputVertices = 0); 00048 00049 void bind() const; 00050 static void unbind(); 00051 00052 GLuint getHandle() const { return mObj->mHandle; } 00053 00054 void uniform( const std::string &name, int data ); 00055 void uniform( const std::string &name, const Vec2i &data ); 00056 void uniform( const std::string &name, const int *data, int count ); 00057 void uniform( const std::string &name, const Vec2i *data, int count ); 00058 void uniform( const std::string &name, float data ); 00059 void uniform( const std::string &name, const Vec2f &data ); 00060 void uniform( const std::string &name, const Vec3f &data ); 00061 void uniform( const std::string &name, const Vec4f &data ); 00062 void uniform( const std::string &name, const Color &data ); 00063 void uniform( const std::string &name, const ColorA &data ); 00064 void uniform( const std::string &name, const Matrix44f &data, bool transpose = false ); 00065 void uniform( const std::string &name, const float *data, int count ); 00066 void uniform( const std::string &name, const Vec2f *data, int count ); 00067 void uniform( const std::string &name, const Vec3f *data, int count ); 00068 void uniform( const std::string &name, const Vec4f *data, int count ); 00069 00070 GLint getUniformLocation( const std::string &name ); 00071 GLint getAttribLocation( const std::string &name ); 00072 00073 std::string getShaderLog( GLuint handle ) const; 00074 00075 protected: 00076 void loadShader( Buffer shaderSourceBuffer, GLint shaderType ); 00077 void loadShader( const char *shaderSource, GLint shaderType ); 00078 void attachShaders(); 00079 void link(); 00080 00081 struct Obj { 00082 Obj() : mHandle( 0 ) {} 00083 ~Obj(); 00084 00085 GLuint mHandle; 00086 std::map<std::string,int> mUniformLocs; 00087 }; 00088 00089 std::shared_ptr<Obj> mObj; 00090 00091 public: 00093 00094 typedef std::shared_ptr<Obj> GlslProg::*unspecified_bool_type; 00095 operator unspecified_bool_type() const { return ( mObj.get() == 0 ) ? 0 : &GlslProg::mObj; } 00096 void reset() { mObj.reset(); } 00098 }; 00099 00100 class GlslProgCompileExc : public std::exception { 00101 public: 00102 GlslProgCompileExc( const std::string &log, GLint aShaderType ) throw(); 00103 virtual const char* what() const throw() 00104 { 00105 return mMessage; 00106 } 00107 00108 private: 00109 char mMessage[16001]; 00110 GLint mShaderType; 00111 }; 00112 00113 class GlslNullProgramExc : public std::exception { 00114 public: 00115 virtual const char* what() const throw() 00116 { 00117 return "Glsl: Attempt to use null shader"; 00118 } 00119 00120 }; 00121 00122 } } // namespace cinder::gl