00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __SHADER_PROGRAM__H__
00013 #define __SHADER_PROGRAM__H__
00014
00015 #include "common.h"
00016 #include "image.h"
00017 #include <vector>
00018
00019
00020 namespace VRUT
00021 {
00023 struct ShaderParam
00024 {
00026 wxString name;
00028 enum PARAM_TYPE
00029 {
00030 FLOAT1,
00031 FLOAT2,
00032 FLOAT3,
00033 FLOAT4,
00034 SAMPLER
00035 } type;
00037 float fVals[4];
00039 wxString imageName;
00041 bool bVal;
00042
00044 ShaderParam() {}
00045
00047 ShaderParam & operator=(const ShaderParam & sp)
00048 {
00049 name = CloneWxString(sp.name);
00050 type = sp.type;
00051 fVals[0] = sp.fVals[0];
00052 fVals[1] = sp.fVals[1];
00053 fVals[2] = sp.fVals[2];
00054 fVals[3] = sp.fVals[3];
00055 imageName = CloneWxString(sp.imageName);
00056 bVal = sp.bVal;
00057 return *this;
00058 }
00060 bool IsSameAs(const ShaderParam & sp, int fieldsMask)
00061 {
00062
00063 if (fieldsMask & 1)
00064 if ((type != sp.type) || (name != sp.name))
00065 return false;
00066
00067 if (fieldsMask & 2)
00068 {
00069 switch (type)
00070 {
00071 case FLOAT4:
00072 if (fVals[3] != sp.fVals[3])
00073 return false;
00074 case FLOAT3:
00075 if (fVals[2] != sp.fVals[2])
00076 return false;
00077 case FLOAT2:
00078 if (fVals[1] != sp.fVals[1])
00079 return false;
00080 case FLOAT1:
00081 if (fVals[0] != sp.fVals[0])
00082 return false;
00083 break;
00084 case SAMPLER:
00085 if (imageName != sp.imageName)
00086 return false;
00087 break;
00088 default:
00089 LOGERROR(wxString::Format(wxT("ShaderParam type %i not supported."), type));
00090 }
00091 }
00092 return true;
00093 }
00094 };
00095
00097 struct ShaderProgram
00098 {
00100 enum SHADER_LANGUAGE
00101 {
00102 LANG_GLSL,
00103 LANG_OPENRT,
00104 LANG_NONE
00105 } type;
00107 wxString vsSource;
00109 wxString fsSource;
00111 wxString vsFileName;
00113 wxString fsFileName;
00115 std::vector<ShaderParam> paramList;
00116
00118 ShaderProgram() : type(LANG_NONE) {}
00120 ShaderProgram(const ShaderProgram & sp)
00121 : type(sp.type), vsSource(CloneWxString(sp.vsSource)), fsSource(CloneWxString(sp.fsSource))
00122 {
00123 paramList.assign(sp.paramList.begin(), sp.paramList.end());
00124 }
00126 ShaderProgram * Clone() const
00127 {
00128 return new ShaderProgram(*this);
00129 }
00131 bool IsSameAs(const ShaderProgram & sp, int fieldsMask)
00132 {
00133
00134 if (fieldsMask & 1)
00135 if ((type != sp.type) || (vsSource != sp.vsSource) || (fsSource != sp.fsSource))
00136 return false;
00137
00138 if (fieldsMask & 2)
00139 {
00140 if (paramList.size() != sp.paramList.size())
00141 return false;
00142
00143 for (size_t i=0; i<paramList.size(); i++)
00144 {
00145 if (paramList[i].IsSameAs(sp.paramList[i], 3))
00146 return false;
00147 }
00148 }
00149 return true;
00150 }
00151 };
00152 };
00153
00154
00155 #endif