6d90d260a231ae3094f0a0cb67b00a148dafd70a
[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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 #ifndef __RAS_IPOLYGONMATERIAL
30 #define __RAS_IPOLYGONMATERIAL
31
32 #include "STR_HashedString.h"
33
34 /**
35  * Polygon Material on which the material buckets are sorted
36  *
37  */
38 #include "MT_Vector3.h"
39 #include "STR_HashedString.h"
40
41 class RAS_IRasterizer;
42
43 enum MaterialProps
44 {
45         RAS_ZSORT               =1,
46         RAS_TRANSPARENT =2,
47         RAS_TRIANGLE    =4,
48         RAS_MULTITEX    =8,
49         RAS_MULTILIGHT  =16,
50         RAS_BLENDERMAT  =32,
51         RAS_GLSHADER    =64,
52         RAS_AUTOGEN             =128,
53         RAS_NORMAL              =256,
54         RAS_DEFMULTI    =512,
55         RAS_FORCEALPHA  =1024
56 };
57
58 /**
59  * Material properties.
60  */
61 class RAS_IPolyMaterial
62 {
63         //todo: remove these variables from this interface/protocol class
64 protected:
65         STR_HashedString                m_texturename;
66         STR_HashedString                m_materialname; //also needed for touchsensor  
67         int                                             m_tile;
68         int                                             m_tilexrep,m_tileyrep;
69         int                                             m_drawingmode;  // tface->mode
70         bool                                    m_transparant;
71         bool                                    m_zsort;
72         int                                             m_lightlayer;
73         bool                                    m_bIsTriangle;
74         
75         unsigned int                    m_polymatid;
76         static unsigned int             m_newpolymatid;
77
78         // will move...
79         unsigned int                    m_flag;//MaterialProps
80         int                                             m_multimode; // sum of values
81 public:
82
83         MT_Vector3                      m_diffuse;
84         float                           m_shininess;
85         MT_Vector3                      m_specular;
86         float                           m_specularity;
87         
88         /** Used to store caching information for materials. */
89         typedef void* TCachingInfo;
90
91         // care! these are taken from blender polygonflags, see file DNA_mesh_types.h for #define TF_BILLBOARD etc.
92         enum MaterialFlags
93         {
94                 BILLBOARD_SCREENALIGNED = 256,
95                 BILLBOARD_AXISALIGNED = 4096,
96                 SHADOW                            =8192
97         };
98
99         RAS_IPolyMaterial(const STR_String& texname,
100                                           const STR_String& matname,
101                                           int tile,
102                                           int tilexrep,
103                                           int tileyrep,
104                                           int mode,
105                                           bool transparant,
106                                           bool zsort,
107                                           int lightlayer,
108                                           bool bIsTriangle,
109                                           void* clientobject);
110         virtual ~RAS_IPolyMaterial() {};
111  
112         /**
113          * Returns the caching information for this material,
114          * This can be used to speed up the rasterizing process.
115          * @return The caching information.
116          */
117         virtual TCachingInfo GetCachingInfo(void) const { return 0; }
118
119         /**
120          * Activates the material in the rasterizer.
121          * On entry, the cachingInfo contains info about the last activated material.
122          * On exit, the cachingInfo should contain updated info about this material.
123          * @param rasty                 The rasterizer in which the material should be active.
124          * @param cachingInfo   The information about the material used to speed up rasterizing.
125          */
126         virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const 
127         { 
128                 return false; 
129         }
130         virtual void ActivateMeshSlot(const class KX_MeshSlot & ms, RAS_IRasterizer* rasty) const {}
131
132         virtual bool                            Equals(const RAS_IPolyMaterial& lhs) const;
133         bool                            Less(const RAS_IPolyMaterial& rhs) const;
134         int                                     GetLightLayer() const;
135         bool                            IsTransparant() const;
136         bool                            IsZSort() const;
137         bool                            UsesTriangles() const;
138         unsigned int            hash() const;
139         int                                     GetDrawingMode() const;
140         const STR_String&       GetMaterialName() const;
141         dword                           GetMaterialNameHash() const;
142         const STR_String&       GetTextureName() const;
143         const unsigned int      GetFlag() const;
144
145         virtual bool            UsesLighting(RAS_IRasterizer *rasty) const;
146         
147         /*
148          * PreCalculate texture gen
149          */
150         virtual void OnConstruction(){}
151 };
152
153 inline  bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
154 {
155         return ( rhs.Equals(lhs));
156 }
157
158 inline  bool operator < ( const RAS_IPolyMaterial & lhs, const RAS_IPolyMaterial & rhs)
159 {
160         return lhs.Less(rhs);
161 }
162
163 #endif //__RAS_IPOLYGONMATERIAL
164