Ghost Context Refactor
[blender-staging.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
39 #ifdef WITH_CXX_GUARDEDALLOC
40 #include "MEM_guardedalloc.h"
41 #endif
42
43 class RAS_IRasterizer;
44 struct MTFace;
45 struct Material;
46 struct Image;
47 struct Scene;
48 class SCA_IScene;
49 struct GameSettings;
50
51 enum MaterialProps
52 {
53         RAS_ZSORT               =1,
54         RAS_TRANSPARENT =2,
55         RAS_TRIANGLE    =4,
56         RAS_MULTITEX    =8,
57         RAS_MULTILIGHT  =16,
58         RAS_BLENDERMAT  =32,
59         RAS_GLSHADER    =64,
60         RAS_AUTOGEN             =128,
61         RAS_NORMAL              =256,
62         RAS_DEFMULTI    =512,
63         RAS_BLENDERGLSL =1024,
64         RAS_CASTSHADOW  =2048,
65         RAS_ONLYSHADOW  =4096,
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 MTFace*         GetMTFace() const;
171         virtual unsigned int* GetMCol() const;
172         virtual Scene*          GetBlenderScene() const;
173         virtual void            ReleaseMaterial();
174         virtual void            GetMaterialRGBAColor(unsigned char *rgba) const;
175         virtual bool            UsesLighting(RAS_IRasterizer *rasty) const;
176         virtual bool            UsesObjectColor() const;
177         virtual bool            CastsShadows() const;
178         virtual bool            OnlyShadow() const;
179
180         virtual void            Replace_IScene(SCA_IScene *val) {} /* overridden by KX_BlenderMaterial */
181
182         /**
183          * \return the equivalent drawing mode for the material settings (equivalent to old TexFace tface->mode).
184          */
185         int                                     ConvertFaceMode(struct GameSettings *game, bool image) const;
186
187         /*
188          * PreCalculate texture gen
189          */
190         virtual void OnConstruction() {}
191
192
193 #ifdef WITH_CXX_GUARDEDALLOC
194         MEM_CXX_CLASS_ALLOC_FUNCS("GE:RAS_IPolyMaterial")
195 #endif
196 };
197
198 inline  bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
199 {
200         return ( rhs.Equals(lhs));
201 }
202
203 inline  bool operator < ( const RAS_IPolyMaterial & lhs, const RAS_IPolyMaterial & rhs)
204 {
205         return lhs.Less(rhs);
206 }
207
208 #endif  /* __RAS_IPOLYGONMATERIAL_H__ */