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