Improved OpenGL Shader Language support for game engine. The python interface is...
[blender.git] / source / gameengine / Rasterizer / RAS_IPolygonMaterial.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32 #ifndef __RAS_IPOLYGONMATERIAL
33 #define __RAS_IPOLYGONMATERIAL
34
35 #include "STR_HashedString.h"
36
37 /**
38  * Polygon Material on which the material buckets are sorted
39  *
40  */
41 #include "MT_Vector3.h"
42 #include "STR_HashedString.h"
43
44 class RAS_IRasterizer;
45
46 enum MaterialProps
47 {
48         RAS_ZSORT               =1,
49         RAS_TRANSPARENT =2,
50         RAS_TRIANGLE    =4,
51         RAS_MULTITEX    =8,
52         RAS_MULTILIGHT  =16,
53         RAS_BLENDERMAT  =32,
54         RAS_GLSHADER    =64,
55         RAS_AUTOGEN             =128,
56         RAS_NORMAL              =256,
57         RAS_DEFMULTI    =512
58 };
59
60 /**
61  * Material properties.
62  */
63 class RAS_IPolyMaterial
64 {
65         //todo: remove these variables from this interface/protocol class
66 protected:
67         STR_HashedString                m_texturename;
68         STR_HashedString                m_materialname; //also needed for touchsensor  
69         int                                             m_tile;
70         int                                             m_tilexrep,m_tileyrep;
71         int                                             m_drawingmode;  // tface->mode
72         bool                                    m_transparant;
73         bool                                    m_zsort;
74         int                                             m_lightlayer;
75         bool                                    m_bIsTriangle;
76         
77         unsigned int                    m_polymatid;
78         static unsigned int             m_newpolymatid;
79
80         // will move...
81         unsigned int                    m_flag;//MaterialProps
82         unsigned int                    m_enabled;// enabled for this mat 
83         int                                             m_multimode; // sum of values
84 public:
85
86         MT_Vector3                      m_diffuse;
87         float                           m_shininess;
88         MT_Vector3                      m_specular;
89         float                           m_specularity;
90         
91         /** Used to store caching information for materials. */
92         typedef void* TCachingInfo;
93
94         // care! these are taken from blender polygonflags, see file DNA_mesh_types.h for #define TF_BILLBOARD etc.
95         enum MaterialFlags
96         {
97                 BILLBOARD_SCREENALIGNED = 256,
98                 BILLBOARD_AXISALIGNED = 4096,
99                 SHADOW                            =8192
100         };
101
102         RAS_IPolyMaterial(const STR_String& texname,
103                                           const STR_String& matname,
104                                           int tile,
105                                           int tilexrep,
106                                           int tileyrep,
107                                           int mode,
108                                           bool transparant,
109                                           bool zsort,
110                                           int lightlayer,
111                                           bool bIsTriangle,
112                                           void* clientobject);
113         virtual ~RAS_IPolyMaterial() {};
114  
115         /**
116          * Returns the caching information for this material,
117          * This can be used to speed up the rasterizing process.
118          * @return The caching information.
119          */
120         virtual TCachingInfo GetCachingInfo(void) const { return 0; }
121
122         /**
123          * Activates the material in the rasterizer.
124          * On entry, the cachingInfo contains info about the last activated material.
125          * On exit, the cachingInfo should contain updated info about this material.
126          * @param rasty                 The rasterizer in which the material should be active.
127          * @param cachingInfo   The information about the material used to speed up rasterizing.
128          */
129         virtual bool Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const 
130         { 
131                 return false; 
132         }
133         virtual void ActivateMeshSlot(const class KX_MeshSlot & ms, RAS_IRasterizer* rasty) const {}
134
135         virtual bool                            Equals(const RAS_IPolyMaterial& lhs) const;
136         bool                            Less(const RAS_IPolyMaterial& rhs) const;
137         int                                     GetLightLayer() const;
138         bool                            IsTransparant() const;
139         bool                            IsZSort() const;
140         bool                            UsesTriangles() const;
141         unsigned int            hash() const;
142         int                                     GetDrawingMode() const;
143         const STR_String&       GetMaterialName() const;
144         const STR_String&       GetTextureName() const;
145         const unsigned int      GetFlag() const;
146         const unsigned int      GetEnabled() const;
147         
148         /*
149          * PreCalculate texture gen
150          */
151         virtual void OnConstruction(){}
152 };
153
154 inline  bool operator ==( const RAS_IPolyMaterial & rhs,const RAS_IPolyMaterial & lhs)
155 {
156         return ( rhs.Equals(lhs));
157 }
158
159 inline  bool operator < ( const RAS_IPolyMaterial & lhs, const RAS_IPolyMaterial & rhs)
160 {
161         return lhs.Less(rhs);
162 }
163
164 #endif //__RAS_IPOLYGONMATERIAL
165