2a5c6a179b61d41b02e51d2dfdff38090c93d025
[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
53 enum MaterialProps
54 {
55         RAS_ZSORT               =1,
56         RAS_TRANSPARENT =2,
57         RAS_TRIANGLE    =4,
58         RAS_MULTITEX    =8,
59         RAS_MULTILIGHT  =16,
60         RAS_BLENDERMAT  =32,
61         RAS_GLSHADER    =64,
62         RAS_AUTOGEN             =128,
63         RAS_NORMAL              =256,
64         RAS_DEFMULTI    =512,
65         RAS_BLENDERGLSL =1024,
66         RAS_CASTSHADOW  =2048
67 };
68
69 /**
70  * Polygon Material on which the material buckets are sorted
71  *
72  */
73 class RAS_IPolyMaterial
74 {
75         //todo: remove these variables from this interface/protocol class
76 protected:
77         STR_HashedString                m_texturename;
78         STR_HashedString                m_materialname; //also needed for touchsensor  
79         int                                             m_tile;
80         int                                             m_tilexrep,m_tileyrep;
81         int                                             m_drawingmode;  // tface->mode
82         int                                             m_transp;
83         bool                                    m_alpha;
84         bool                                    m_zsort;
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 = 256,
106                 BILLBOARD_AXISALIGNED = 4096,
107                 SHADOW                            =8192
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 mode,
118                                           int transp,
119                                           bool alpha,
120                                           bool zsort);
121         void Initialize(const STR_String& texname,
122                                         const STR_String& matname,
123                                         int materialindex,
124                                         int tile,
125                                         int tilexrep,
126                                         int tileyrep,
127                                         int mode,
128                                         int transp,
129                                         bool alpha,
130                                         bool zsort);
131         virtual ~RAS_IPolyMaterial() {};
132  
133         /**
134          * Returns the caching information for this material,
135          * This can be used to speed up the rasterizing process.
136          * @return The caching information.
137          */
138         virtual TCachingInfo GetCachingInfo(void) const { return 0; }
139
140         /**
141          * Activates the material in the rasterizer.
142          * On entry, the cachingInfo contains info about the last activated material.
143          * On exit, the cachingInfo should contain updated info about this material.
144          * @param rasty                 The rasterizer in which the material should be active.
145          * @param cachingInfo   The information about the material used to speed up rasterizing.
146          */
147         virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const 
148         { 
149                 return false; 
150         }
151         virtual void ActivateMeshSlot(const class RAS_MeshSlot & ms, RAS_IRasterizer* rasty) const {}
152
153         virtual bool                            Equals(const RAS_IPolyMaterial& lhs) const;
154         bool                            Less(const RAS_IPolyMaterial& rhs) const;
155         //int                                   GetLightLayer() const;
156         bool                            IsAlpha() const;
157         bool                            IsZSort() const;
158         unsigned int            hash() const;
159         int                                     GetDrawingMode() const;
160         const STR_String&       GetMaterialName() const;
161         dword                           GetMaterialNameHash() const;
162         const STR_String&       GetTextureName() const;
163         unsigned int            GetFlag() const;
164         int                                     GetMaterialIndex() const;
165
166         virtual Material*   GetBlenderMaterial() const;
167         virtual Image*      GetBlenderImage() const;
168         virtual Scene*          GetBlenderScene() const;
169         virtual void            ReleaseMaterial();
170         virtual void            GetMaterialRGBAColor(unsigned char *rgba) const;
171         virtual bool            UsesLighting(RAS_IRasterizer *rasty) const;
172         virtual bool            UsesObjectColor() const;
173         virtual bool            CastsShadows() const;
174
175         virtual void            Replace_IScene(SCA_IScene *val) {}; /* overridden by KX_BlenderMaterial */
176
177         /*
178          * PreCalculate texture gen
179          */
180         virtual void OnConstruction(int layer){}
181                 
182                 
183 #ifdef WITH_CXX_GUARDEDALLOC
184 public:
185         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_IPolyMaterial"); }
186         void operator delete( void *mem ) { MEM_freeN(mem); }
187 #endif
188 };
189
190 inline  bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
191 {
192         return ( rhs.Equals(lhs));
193 }
194
195 inline  bool operator < ( const RAS_IPolyMaterial & lhs, const RAS_IPolyMaterial & rhs)
196 {
197         return lhs.Less(rhs);
198 }
199
200 #endif //__RAS_IPOLYGONMATERIAL
201