3257682649f477b01fd55c8aeebae6cfa94e317b
[blender.git] / source / gameengine / Rasterizer / RAS_IPolygonMaterial.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file RAS_IPolygonMaterial.h
29  *  \ingroup bgerast
30  */
31
32 #ifndef __RAS_IPOLYGONMATERIAL_H__
33 #define __RAS_IPOLYGONMATERIAL_H__
34
35 #include "STR_HashedString.h"
36
37 #include "MT_Vector3.h"
38 #include "STR_HashedString.h"
39
40 #ifdef WITH_CXX_GUARDEDALLOC
41 #include "MEM_guardedalloc.h"
42 #endif
43
44 class RAS_IRasterizer;
45 struct MTFace;
46 struct Material;
47 struct Image;
48 struct Scene;
49 class SCA_IScene;
50 struct GameSettings;
51
52 enum MaterialProps
53 {
54         RAS_ZSORT               =1,
55         RAS_TRANSPARENT =2,
56         RAS_TRIANGLE    =4,
57         RAS_MULTITEX    =8,
58         RAS_MULTILIGHT  =16,
59         RAS_BLENDERMAT  =32,
60         RAS_GLSHADER    =64,
61         RAS_AUTOGEN             =128,
62         RAS_NORMAL              =256,
63         RAS_DEFMULTI    =512,
64         RAS_BLENDERGLSL =1024,
65         RAS_CASTSHADOW  =2048
66 };
67
68 /**
69  * Polygon Material on which the material buckets are sorted
70  *
71  */
72 class RAS_IPolyMaterial
73 {
74         //todo: remove these variables from this interface/protocol class
75 protected:
76         STR_HashedString                m_texturename;
77         STR_HashedString                m_materialname; //also needed for touchsensor  
78         int                                             m_tile;
79         int                                             m_tilexrep,m_tileyrep;
80         int                                             m_drawingmode;
81         int                                             m_alphablend;
82         bool                                    m_alpha;
83         bool                                    m_zsort;
84         bool                                    m_light;
85         int                                             m_materialindex;
86         
87         unsigned int                    m_polymatid;
88         static unsigned int             m_newpolymatid;
89
90         // will move...
91         unsigned int                    m_flag;//MaterialProps
92         int                                             m_multimode; // sum of values
93 public:
94         MT_Vector3                      m_diffuse;
95         float                           m_shininess;
96         MT_Vector3                      m_specular;
97         float                           m_specularity;
98         
99         /** Used to store caching information for materials. */
100         typedef void* TCachingInfo;
101
102         // care! these are taken from blender polygonflags, see file DNA_mesh_types.h for #define TF_BILLBOARD etc.
103         enum MaterialFlags
104         {
105                 BILLBOARD_SCREENALIGNED = 512,  /* GEMAT_HALO */
106                 BILLBOARD_AXISALIGNED   = 1024, /* GEMAT_BILLBOARD */
107                 SHADOW                  =2048   /* GEMAT_SHADOW */
108         };
109
110         RAS_IPolyMaterial();
111         RAS_IPolyMaterial(const STR_String& texname,
112                                           const STR_String& matname,
113                                           int materialindex,
114                                           int tile,
115                                           int tilexrep,
116                                           int tileyrep,
117                                           int transp,
118                                           bool alpha,
119                                           bool zsort);
120         void Initialize(const STR_String& texname,
121                                         const STR_String& matname,
122                                         int materialindex,
123                                         int tile,
124                                         int tilexrep,
125                                         int tileyrep,
126                                         int transp,
127                                         bool alpha,
128                                         bool zsort,
129                                         bool light,
130                                         bool image,
131                                         struct GameSettings* game);
132
133         virtual ~RAS_IPolyMaterial() {};
134  
135         /**
136          * Returns the caching information for this material,
137          * This can be used to speed up the rasterizing process.
138          * \return The caching information.
139          */
140         virtual TCachingInfo GetCachingInfo(void) const { return 0; }
141
142         /**
143          * Activates the material in the rasterizer.
144          * On entry, the cachingInfo contains info about the last activated material.
145          * On exit, the cachingInfo should contain updated info about this material.
146          * \param rasty                 The rasterizer in which the material should be active.
147          * \param cachingInfo   The information about the material used to speed up rasterizing.
148          */
149         virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const 
150         { 
151                 return false; 
152         }
153         virtual void ActivateMeshSlot(const class RAS_MeshSlot & ms, RAS_IRasterizer* rasty) const {}
154
155         virtual bool                            Equals(const RAS_IPolyMaterial& lhs) const;
156         bool                            Less(const RAS_IPolyMaterial& rhs) const;
157         //int                                   GetLightLayer() const;
158         bool                            IsAlpha() const;
159         bool                            IsZSort() const;
160         unsigned int            hash() const;
161         int                                     GetDrawingMode() const;
162         const STR_String&       GetMaterialName() const;
163         dword                           GetMaterialNameHash() const;
164         const STR_String&       GetTextureName() const;
165         unsigned int            GetFlag() const;
166         int                                     GetMaterialIndex() const;
167
168         virtual Material*   GetBlenderMaterial() const;
169         virtual Image*      GetBlenderImage() const;
170         virtual Scene*          GetBlenderScene() const;
171         virtual void            ReleaseMaterial();
172         virtual void            GetMaterialRGBAColor(unsigned char *rgba) const;
173         virtual bool            UsesLighting(RAS_IRasterizer *rasty) const;
174         virtual bool            UsesObjectColor() const;
175         virtual bool            CastsShadows() const;
176
177         virtual void            Replace_IScene(SCA_IScene *val) {}; /* overridden by KX_BlenderMaterial */
178
179         /**
180         * \return the equivalent drawing mode for the material settings (equivalent to old TexFace tface->mode).
181         */
182         int                                     ConvertFaceMode(struct GameSettings *game, bool image) const;
183
184         /*
185          * PreCalculate texture gen
186          */
187         virtual void OnConstruction(int layer){}
188                 
189                 
190 #ifdef WITH_CXX_GUARDEDALLOC
191 public:
192         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IPolyMaterial"); }
193         void operator delete( void *mem ) { MEM_freeN(mem); }
194 #endif
195 };
196
197 inline  bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
198 {
199         return ( rhs.Equals(lhs));
200 }
201
202 inline  bool operator < ( const RAS_IPolyMaterial & lhs, const RAS_IPolyMaterial & rhs)
203 {
204         return lhs.Less(rhs);
205 }
206
207 #endif //__RAS_IPOLYGONMATERIAL_H__
208