00001
00002
00003
00004
00005 #ifndef ps2gl_material_h
00006 #define ps2gl_material_h
00007
00008 #include "GL/gl.h"
00009
00010 #include "ps2s/cpu_vector.h"
00011
00012 #include "ps2gl/debug.h"
00013 #include "ps2gl/glcontext.h"
00014 #include "ps2gl/immgmanager.h"
00015 #include "ps2gl/dlgmanager.h"
00016
00017 class CGLContext;
00018
00019 class CMaterial {
00020 protected:
00021 CGLContext &GLContext;
00022
00023 public:
00024 CMaterial(CGLContext &context) : GLContext(context) {}
00025
00026 virtual void SetAmbient( cpu_vec_xyzw ambient ) = 0;
00027 virtual void SetDiffuse( cpu_vec_xyzw diffuse ) = 0;
00028 virtual void SetSpecular( cpu_vec_xyzw specular ) = 0;
00029 virtual void SetEmission( cpu_vec_xyzw emission ) = 0;
00030 virtual void SetShininess( float shine ) = 0;
00031 };
00032
00033 class CImmMaterial : public CMaterial {
00034 cpu_vec_xyzw Ambient, Diffuse, Specular, Emission;
00035 float Shininess;
00036
00037 inline void TellRendererMaterialChanged() {
00038 GLContext.CurMaterialChanged();
00039 }
00040 public:
00041 CImmMaterial( CGLContext &context );
00042
00043
00044 void SetAmbient( cpu_vec_xyzw ambient ) { Ambient = ambient; TellRendererMaterialChanged(); }
00045 void SetDiffuse( cpu_vec_xyzw diffuse ) { Diffuse = diffuse; TellRendererMaterialChanged(); }
00046 void SetSpecular( cpu_vec_xyzw specular );
00047 void SetEmission( cpu_vec_xyzw emission ) { Emission = emission; TellRendererMaterialChanged(); }
00048 void SetShininess( float shine ) { Shininess = shine; TellRendererMaterialChanged(); }
00049
00050 inline cpu_vec_xyzw GetAmbient() const { return Ambient; }
00051 inline cpu_vec_xyzw GetDiffuse() const { return Diffuse; }
00052 inline cpu_vec_xyzw GetSpecular() const { return Specular; }
00053 inline cpu_vec_xyzw GetEmission() const { return Emission; }
00054 inline float GetShininess() const { return Shininess; }
00055
00056 void LightsHaveSpecular();
00057 };
00058
00059 class CDListMaterial : public CMaterial {
00060 inline void TellRendererMaterialChanged() {
00061 GLContext.CurMaterialChanged();
00062 }
00063 public:
00064 CDListMaterial( CGLContext &context ) : CMaterial(context) {}
00065
00066 void SetAmbient( cpu_vec_xyzw ambient );
00067 void SetDiffuse( cpu_vec_xyzw diffuse );
00068 void SetSpecular( cpu_vec_xyzw specular );
00069 void SetEmission( cpu_vec_xyzw emission );
00070 void SetShininess( float shine );
00071 };
00072
00073 class CMaterialManager {
00074 CGLContext &GLContext;
00075
00076 CImmMaterial ImmMaterial;
00077 CDListMaterial DListMaterial;
00078 CMaterial *CurMaterial;
00079
00080 cpu_vec_xyzw CurColor;
00081 GLenum ColorMaterialMode;
00082 bool UseColorMaterial;
00083 bool InDListDef;
00084
00085 public:
00086 CMaterialManager( CGLContext &context )
00087 : GLContext(context),
00088 ImmMaterial(context), DListMaterial(context),
00089 CurMaterial(&ImmMaterial),
00090 CurColor(1, 1, 1, 1),
00091 ColorMaterialMode(GL_AMBIENT_AND_DIFFUSE),
00092 UseColorMaterial(false),
00093 InDListDef(false)
00094 {
00095 ImmMaterial.SetDiffuse( cpu_vec_xyzw(0.8f, 0.8f, 0.8f, 1.0f) );
00096 }
00097
00098 CMaterial& GetCurMaterial() { return *CurMaterial; }
00099 CImmMaterial& GetImmMaterial() { return ImmMaterial; }
00100 CDListMaterial& GetDListMaterial() { return DListMaterial; }
00101 cpu_vec_xyzw GetCurColor() const { return CurColor; }
00102 GLenum GetColorMaterialMode() const { return ColorMaterialMode; }
00103 bool GetColorMaterialEnabled() const { return UseColorMaterial; }
00104
00105 void Color( cpu_vec_xyzw color );
00106 void SetUseColorMaterial( bool yesNo );
00107 void SetColorMaterialMode( GLenum mode );
00108
00109 void BeginDListDef() { CurMaterial = &DListMaterial; InDListDef = true; }
00110 void EndDListDef() { CurMaterial = &ImmMaterial; InDListDef = false; }
00111 };
00112
00113 #endif // ps2gl_material_h