svn merge -r 16320:16369 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[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
90 class RAS_MeshSlot
91 {
92 private:
93         //  indices into display arrays
94         int                                                     m_startarray;
95         int                                                     m_endarray;
96         int                                                     m_startindex;
97         int                                                     m_endindex;
98         int                                                     m_startvertex;
99         int                                                     m_endvertex;
100         vector<RAS_DisplayArray*>       m_displayArrays;
101
102         // for construction only
103         RAS_DisplayArray*                       m_currentArray;
104
105 public:
106         // for rendering
107         RAS_MaterialBucket*             m_bucket;
108         RAS_MeshObject*                 m_mesh;
109         void*                                   m_clientObj;
110         RAS_Deformer*                   m_pDeformer;
111         double*                                 m_OpenGLMatrix;
112         // visibility
113         bool                                    m_bVisible;
114         bool                                    m_bCulled;
115         // object color
116         bool                                    m_bObjectColor;
117         MT_Vector4                              m_RGBAcolor;
118         // display lists
119         KX_ListSlot*                    m_DisplayList;
120         bool                                    m_bDisplayList;
121         // joined mesh slots
122         RAS_MeshSlot*                   m_joinSlot;
123         MT_Matrix4x4                    m_joinInvTransform;
124         list<RAS_MeshSlot*>             m_joinedSlots;
125
126         RAS_MeshSlot();
127         RAS_MeshSlot(const RAS_MeshSlot& slot);
128         virtual ~RAS_MeshSlot();
129         
130         void init(RAS_MaterialBucket *bucket, int numverts);
131
132         struct iterator {
133                 RAS_DisplayArray *array;
134                 RAS_TexVert *vertex;
135                 unsigned short *index;
136                 size_t startvertex;
137                 size_t endvertex;
138                 size_t totindex;
139                 size_t arraynum;
140         };
141
142         void begin(iterator& it);
143         void next(iterator& it);
144         bool end(iterator& it);
145
146         /* used during construction */
147         void SetDisplayArray(int numverts);
148         RAS_DisplayArray *CurrentDisplayArray();
149
150         void AddPolygon(int numverts);
151         int AddVertex(const RAS_TexVert& tv);
152         void AddPolygonVertex(int offset);
153
154         /* optimization */
155         bool Split(bool force=false);
156         bool Join(RAS_MeshSlot *target, MT_Scalar distance);
157         bool Equals(RAS_MeshSlot *target);
158         bool IsCulled();
159 };
160
161 /* Used by RAS_MeshObject, to point to it's slots in a bucket */
162
163 class RAS_MeshMaterial
164 {
165 public:
166         RAS_MeshSlot *m_baseslot;
167         class RAS_MaterialBucket *m_bucket;
168
169         GEN_Map<GEN_HashedPtr,RAS_MeshSlot*> m_slots;
170 };
171
172 /* Contains a list of display arrays with the same material,
173  * and a mesh slot for each mesh that uses display arrays in
174  * this bucket */
175
176 class RAS_MaterialBucket
177 {
178 public:
179         RAS_MaterialBucket(RAS_IPolyMaterial* mat);
180         virtual ~RAS_MaterialBucket();
181         
182         /* Bucket Sorting */
183         struct less;
184         typedef set<RAS_MaterialBucket*, less> Set;
185
186         /* Material Properties */
187         RAS_IPolyMaterial*              GetPolyMaterial() const;
188         bool                                    IsAlpha() const;
189         bool                                    IsZSort() const;
190                 
191         /* Rendering */
192         bool ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
193                 RAS_IRenderTools *rendertools);
194         void RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
195                 RAS_IRenderTools* rendertools, RAS_MeshSlot &ms);
196         
197         /* Mesh Slot Access */
198         list<RAS_MeshSlot>::iterator msBegin();
199         list<RAS_MeshSlot>::iterator msEnd();
200
201         class RAS_MeshSlot*     AddMesh(int numverts);
202         class RAS_MeshSlot* CopyMesh(class RAS_MeshSlot *ms);
203         void                            RemoveMesh(class RAS_MeshSlot* ms);
204         void                            Optimize(MT_Scalar distance);
205
206 private:
207         list<RAS_MeshSlot>                      m_meshSlots;
208         RAS_IPolyMaterial*                      m_material;
209         
210 };
211
212 #endif //__RAS_MATERIAL_BUCKET
213