2.50: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19323...
[blender.git] / source / gameengine / Rasterizer / RAS_MaterialBucket.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_MATERIALBUCKET
30 #define __RAS_MATERIALBUCKET
31
32 #include "RAS_TexVert.h"
33 #include "GEN_Map.h"
34 #include "STR_HashedString.h"
35
36 #include "MT_Transform.h"
37 #include "RAS_IPolygonMaterial.h"
38 #include "RAS_IRasterizer.h"
39 #include "RAS_Deformer.h"
40
41 #include <vector>
42 #include <set>
43 #include <list>
44 using namespace std;
45
46 /* Display List Slot */
47
48 class KX_ListSlot
49 {
50 protected:
51         int m_refcount;
52 public:
53         KX_ListSlot(){ m_refcount=1; }
54         virtual ~KX_ListSlot() {}
55         virtual int Release() { 
56                 if (--m_refcount > 0)
57                         return m_refcount;
58                 delete this;
59                 return 0;
60         }
61         virtual KX_ListSlot* AddRef() {
62                 m_refcount++;
63                 return this;
64         }
65         virtual void SetModified(bool mod)=0;
66 };
67
68 class RAS_DisplayArray;
69 class RAS_MeshSlot;
70 class RAS_MeshMaterial;
71 class RAS_MaterialBucket;
72
73 /* An array with data used for OpenGL drawing */
74
75 class RAS_DisplayArray
76 {
77 public:
78         vector<RAS_TexVert> m_vertex;
79         vector<unsigned short> m_index;
80         enum { LINE = 2, TRIANGLE = 3, QUAD = 4 } m_type;
81         //RAS_MeshSlot *m_origSlot;
82         int m_users;
83
84         enum { BUCKET_MAX_INDEX = 65535 };
85         enum { BUCKET_MAX_VERTEX = 65535 };
86 };
87
88 /* Entry of a RAS_MeshObject into RAS_MaterialBucket */
89 typedef std::vector<RAS_DisplayArray*>  RAS_DisplayArrayList;
90
91 class RAS_MeshSlot
92 {
93         friend class RAS_ListRasterizer;
94 private:
95         //  indices into display arrays
96         int                                                     m_startarray;
97         int                                                     m_endarray;
98         int                                                     m_startindex;
99         int                                                     m_endindex;
100         int                                                     m_startvertex;
101         int                                                     m_endvertex;
102         RAS_DisplayArrayList            m_displayArrays;
103
104         // for construction only
105         RAS_DisplayArray*                       m_currentArray;
106
107 public:
108         // for rendering
109         RAS_MaterialBucket*             m_bucket;
110         RAS_MeshObject*                 m_mesh;
111         void*                                   m_clientObj;
112         RAS_Deformer*                   m_pDeformer;
113         double*                                 m_OpenGLMatrix;
114         // visibility
115         bool                                    m_bVisible;
116         bool                                    m_bCulled;
117         // object color
118         bool                                    m_bObjectColor;
119         MT_Vector4                              m_RGBAcolor;
120         // display lists
121         KX_ListSlot*                    m_DisplayList;
122         bool                                    m_bDisplayList;
123         // joined mesh slots
124         RAS_MeshSlot*                   m_joinSlot;
125         MT_Matrix4x4                    m_joinInvTransform;
126         list<RAS_MeshSlot*>             m_joinedSlots;
127
128         RAS_MeshSlot();
129         RAS_MeshSlot(const RAS_MeshSlot& slot);
130         virtual ~RAS_MeshSlot();
131         
132         void init(RAS_MaterialBucket *bucket, int numverts);
133
134         struct iterator {
135                 RAS_DisplayArray *array;
136                 RAS_TexVert *vertex;
137                 unsigned short *index;
138                 size_t startvertex;
139                 size_t endvertex;
140                 size_t totindex;
141                 size_t arraynum;
142         };
143
144         void begin(iterator& it);
145         void next(iterator& it);
146         bool end(iterator& it);
147
148         /* used during construction */
149         void SetDisplayArray(int numverts);
150         RAS_DisplayArray *CurrentDisplayArray();
151
152         void AddPolygon(int numverts);
153         int AddVertex(const RAS_TexVert& tv);
154         void AddPolygonVertex(int offset);
155
156         /* optimization */
157         bool Split(bool force=false);
158         bool Join(RAS_MeshSlot *target, MT_Scalar distance);
159         bool Equals(RAS_MeshSlot *target);
160         bool IsCulled();
161         void SetCulled(bool culled) { m_bCulled = culled; }
162 };
163
164 /* Used by RAS_MeshObject, to point to it's slots in a bucket */
165
166 class RAS_MeshMaterial
167 {
168 public:
169         RAS_MeshSlot *m_baseslot;
170         class RAS_MaterialBucket *m_bucket;
171
172         GEN_Map<GEN_HashedPtr,RAS_MeshSlot*> m_slots;
173 };
174
175 /* Contains a list of display arrays with the same material,
176  * and a mesh slot for each mesh that uses display arrays in
177  * this bucket */
178
179 class RAS_MaterialBucket
180 {
181 public:
182         RAS_MaterialBucket(RAS_IPolyMaterial* mat);
183         virtual ~RAS_MaterialBucket();
184         
185         /* Bucket Sorting */
186         struct less;
187         typedef set<RAS_MaterialBucket*, less> Set;
188
189         /* Material Properties */
190         RAS_IPolyMaterial*              GetPolyMaterial() const;
191         bool                                    IsAlpha() const;
192         bool                                    IsZSort() const;
193                 
194         /* Rendering */
195         bool ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
196                 RAS_IRenderTools *rendertools);
197         void RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
198                 RAS_IRenderTools* rendertools, RAS_MeshSlot &ms);
199         
200         /* Mesh Slot Access */
201         list<RAS_MeshSlot>::iterator msBegin();
202         list<RAS_MeshSlot>::iterator msEnd();
203
204         class RAS_MeshSlot*     AddMesh(int numverts);
205         class RAS_MeshSlot* CopyMesh(class RAS_MeshSlot *ms);
206         void                            RemoveMesh(class RAS_MeshSlot* ms);
207         void                            Optimize(MT_Scalar distance);
208
209 private:
210         list<RAS_MeshSlot>                      m_meshSlots;
211         RAS_IPolyMaterial*                      m_material;
212         
213 };
214
215 #endif //__RAS_MATERIAL_BUCKET
216