00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __MATERIAL__H__
00013 #define __MATERIAL__H__
00014
00015 #include <stdlib.h>
00016 #include <GL/glut.h>
00017 #include "image.h"
00018 #include "common.h"
00019 #include "shaderprogram.h"
00020
00021 namespace VRUT
00022 {
00024 struct Material
00025 {
00027 wxString uid;
00029 wxString name;
00031 VECTOR4 ambient;
00033 VECTOR4 diffuse;
00035 VECTOR4 specular;
00037 VECTOR4 emission;
00039 float shininess;
00041 GLuint depthFunc;
00043 float textureMix;
00045 enum FLAG
00046 {
00047 BLENDED = 0x00000001,
00048 DEPTH_TEST_DISABLE = 0x00000002,
00049 DEPTH_MASK_DISABLE = 0x00000004,
00050 DOUBLE_SIDED = 0x00000008,
00051 INVERT_ALPHA = 0x00000010,
00052 UNLIT = 0x00000020,
00053 };
00055 unsigned flags;
00056
00058 enum TEX_FLAG
00059 {
00060 TEX_UWRAP_REPEAT = 0x00000001,
00061 TEX_UWRAP_CLAMP = 0x00000002,
00062 TEX_VWRAP_REPEAT = 0x00000004,
00063 TEX_VWRAP_CLAMP = 0x00000008,
00064 TEX_MIN_FILTER_POINT = 0x00000010,
00065 TEX_MIN_FILTER_LINEAR = 0x00000020,
00066 TEX_MIN_FILTER_MIPMAP = 0x00000040,
00067 TEX_MAG_FILTER_POINT = 0x00000080,
00068 TEX_MAG_FILTER_LINEAR = 0x00000100,
00069
00070 TEX_ENV_MODULATE = 0x00000400,
00071 TEX_ENV_REPLACE = 0x00000800,
00072 TEX_ENV_DECAL = 0x00001000,
00073 TEX_ENV_BLEND = 0x00002000,
00074 TEX_ENV_ADD = 0x00004000,
00075 TEX_IGNORE_COLORS = 0x00008000,
00076
00077 TEX_GEN_FUNC_U_EYE = 0x00010000,
00078 TEX_GEN_FUNC_U_OBJECT = 0x00020000,
00079 TEX_GEN_FUNC_U_SPHERE = 0x00040000,
00080 TEX_GEN_FUNC_V_EYE = 0x00080000,
00081 TEX_GEN_FUNC_V_OBJECT = 0x00100000,
00082 TEX_GEN_FUNC_V_SPHERE = 0x00200000,
00083 TEX_GEN_ENABLED = 0x003f0000
00084 };
00086 unsigned texFlags;
00088 GLuint texBlendSrc;
00090 GLuint texBlendDst;
00092 wxString imageName;
00094 ShaderProgram * shader;
00095
00097 Material(const wxString & _name) : name(CloneWxString(_name))
00098 {
00099 depthFunc = GL_LEQUAL;
00100 shininess = 0.0f;
00101 textureMix = 1;
00102 texFlags = flags = 0;
00103 texBlendSrc = texBlendDst = GL_ID_NONE;
00104 shader = (ShaderProgram *)NULL;
00105 }
00106
00108 Material(const Material & m)
00109 : uid(CloneWxString(m.uid)), name(CloneWxString(m.name)), ambient(m.ambient),
00110 diffuse(m.diffuse), specular(m.specular), emission(m.emission),
00111 shininess(m.shininess), depthFunc(m.depthFunc), textureMix(m.textureMix),
00112 flags(m.flags), texFlags(m.texFlags), texBlendSrc(m.texBlendSrc),
00113 texBlendDst(m.texBlendDst), imageName(CloneWxString(m.imageName))
00114 {
00115 shader = ( m.shader ? m.shader->Clone() : (ShaderProgram *)NULL );
00116 }
00117
00119 ~Material()
00120 {
00121 SAFE_DELETE(shader);
00122 }
00123
00125 Material * Clone() const
00126 {
00127 return new Material(*this);
00128 }
00129
00131 bool IsSameAs(const Material & m, int fieldsMask) const
00132 {
00133
00134 if (fieldsMask & 1)
00135 if (name != m.name)
00136 return false;
00137
00138 if (fieldsMask & 2)
00139 if (uid != m.uid)
00140 return false;
00141
00142 if (fieldsMask & 4)
00143 if ((ambient != m.ambient) || (diffuse != m.diffuse) || (specular != m.specular) || (emission != m.emission)
00144 || (shininess != m.shininess) || (depthFunc != m.depthFunc) || (flags != m.flags))
00145 return false;
00146
00147 if (fieldsMask & 8)
00148 if ((textureMix != m.textureMix) || (texFlags != m.texFlags) || (texBlendSrc != m.texBlendSrc) || (texBlendDst != m.texBlendDst) || (imageName != m.imageName))
00149 return false;
00150
00151 if (fieldsMask & 16)
00152 if (shader)
00153 {
00154 if (!m.shader)
00155 return false;
00156 else
00157 {
00158 if (!shader->IsSameAs(*(m.shader), 3))
00159 return false;
00160 }
00161 }
00162 else
00163 {
00164 if (m.shader)
00165 return false;
00166 }
00167 return true;
00168 }
00169 };
00170 };
00171
00172
00173 #endif