00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_MATERIAL_H__
00021 #define __CS_MATERIAL_H__
00022
00023 #include "csgfx/rgbpixel.h"
00024 #include "csutil/csobject.h"
00025 #include "csutil/nobjvec.h"
00026 #include "ivideo/material.h"
00027 #include "iengine/material.h"
00028
00029 struct iTextureWrapper;
00030 struct iTextureManager;
00031
00032
00033 SCF_VERSION (csMaterialWrapper, 0, 0, 1);
00034
00038 class csMaterial : public iMaterial
00039 {
00040 private:
00042 csRGBcolor flat_color;
00044 iTextureWrapper *texture;
00046 int num_texture_layers;
00048 csTextureLayer texture_layers[4];
00050 iTextureWrapper* texture_layer_wrappers[4];
00051
00053 float diffuse;
00055 float ambient;
00057 float reflection;
00058
00059 public:
00063 csMaterial ();
00067 csMaterial (iTextureWrapper *txt);
00068
00072 virtual ~csMaterial ();
00073
00075 csRGBcolor& GetFlatColor () { return flat_color; }
00076
00078 float GetDiffuse () const { return diffuse; }
00080 void SetDiffuse (float val) { diffuse = val; }
00081
00083 float GetAmbient () const { return ambient; }
00085 void SetAmbient (float val) { ambient = val; }
00086
00088 float GetReflection () const { return reflection; }
00090 void SetReflection (float val) { reflection = val; }
00091
00093 iTextureWrapper *GetTextureWrapper () const { return texture; }
00095 void SetTextureWrapper (iTextureWrapper *tex);
00096
00098 void AddTextureLayer (iTextureWrapper* txtwrap, uint mode,
00099 float uscale, float vscale, float ushift, float vshift);
00100
00101
00102
00104 virtual iTextureHandle* GetTexture ();
00106 virtual int GetTextureLayerCount ();
00108 virtual csTextureLayer* GetTextureLayer (int idx);
00110 virtual void GetFlatColor (csRGBpixel &oColor);
00112 virtual void SetFlatColor (const csRGBcolor& col) { flat_color = col; }
00114 virtual void GetReflection (float &oDiffuse, float &oAmbient,
00115 float &oReflection);
00117 virtual void SetReflection (float oDiffuse, float oAmbient,
00118 float oReflection)
00119 {
00120 diffuse = oDiffuse;
00121 ambient = oAmbient;
00122 reflection = oReflection;
00123 }
00124
00125 SCF_DECLARE_IBASE;
00126 };
00127
00132 class csMaterialWrapper : public csObject
00133 {
00134 private:
00136 iMaterial* material;
00138 iMaterialHandle* handle;
00139
00140 private:
00142 virtual ~csMaterialWrapper ();
00143
00144 public:
00146 csMaterialWrapper (iMaterial* Image);
00148 csMaterialWrapper (iMaterialHandle *ith);
00150 csMaterialWrapper (csMaterialWrapper &);
00151
00156 void SetMaterialHandle (iMaterialHandle *mat);
00158 iMaterialHandle* GetMaterialHandle () { return handle; }
00159
00164 void SetMaterial (iMaterial* material);
00166 iMaterial* GetMaterial () { return material; }
00167
00169 void Register (iTextureManager *txtmng);
00170
00176 void Visit ();
00177
00178 SCF_DECLARE_IBASE_EXT (csObject);
00179
00180
00181 struct MaterialWrapper : public iMaterialWrapper
00182 {
00183 SCF_DECLARE_EMBEDDED_IBASE (csMaterialWrapper);
00184 virtual csMaterialWrapper* GetPrivateObject ()
00185 { return (csMaterialWrapper*)scfParent; }
00186 virtual iObject *QueryObject()
00187 { return scfParent; }
00188 virtual iMaterialWrapper *Clone () const
00189 { return &(new csMaterialWrapper (*scfParent))->scfiMaterialWrapper; }
00190 virtual void SetMaterialHandle (iMaterialHandle *mat)
00191 { scfParent->SetMaterialHandle (mat); }
00192 virtual iMaterialHandle* GetMaterialHandle ()
00193 { return scfParent->GetMaterialHandle (); }
00194 virtual void SetMaterial (iMaterial* material)
00195 { scfParent->SetMaterial (material); }
00196 virtual iMaterial* GetMaterial ()
00197 { return scfParent->GetMaterial (); }
00198 virtual void Register (iTextureManager *txtmng)
00199 { scfParent->Register (txtmng); }
00200 virtual void Visit ()
00201 { scfParent->Visit (); }
00202 } scfiMaterialWrapper;
00203 friend struct MaterialWrapper;
00204 };
00205
00206 CS_DECLARE_OBJECT_VECTOR (csMaterialListHelper, iMaterialWrapper);
00207
00211 class csMaterialList : public csMaterialListHelper
00212 {
00213 public:
00215 csMaterialList ();
00216
00218 iMaterialWrapper* NewMaterial (iMaterial* material);
00219
00224 iMaterialWrapper* NewMaterial (iMaterialHandle *ith);
00225
00226 SCF_DECLARE_IBASE;
00227
00228
00229 class MaterialList : public iMaterialList
00230 {
00231 public:
00232 SCF_DECLARE_EMBEDDED_IBASE (csMaterialList);
00233
00234 virtual iMaterialWrapper* NewMaterial (iMaterial* material);
00235 virtual iMaterialWrapper* NewMaterial (iMaterialHandle *ith);
00236 virtual int GetCount () const;
00237 virtual iMaterialWrapper *Get (int n) const;
00238 virtual int Add (iMaterialWrapper *obj);
00239 virtual bool Remove (iMaterialWrapper *obj);
00240 virtual bool Remove (int n);
00241 virtual void RemoveAll ();
00242 virtual int Find (iMaterialWrapper *obj) const;
00243 virtual iMaterialWrapper *FindByName (const char *Name) const;
00244 } scfiMaterialList;
00245 };
00246
00247 #endif // __CS_MATERIAL_H__