Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

material.h

Go to the documentation of this file.
00001 /*           Copyright (C) 2001 Sony Computer Entertainment America
00002                               All Rights Reserved
00003                                SCEA Confidential                                */
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

ps2gl version 0.2