2002-10-12 11:37:38 +00:00
|
|
|
/**
|
|
|
|
* $Id$
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2008-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*/
|
|
|
|
#ifndef __RAS_MATERIALBUCKET
|
|
|
|
#define __RAS_MATERIALBUCKET
|
|
|
|
|
|
|
|
#include "RAS_TexVert.h"
|
|
|
|
#include "GEN_Map.h"
|
|
|
|
#include "STR_HashedString.h"
|
|
|
|
|
|
|
|
#include "MT_Transform.h"
|
|
|
|
#include "RAS_IPolygonMaterial.h"
|
2008-07-10 12:47:20 +00:00
|
|
|
#include "RAS_IRasterizer.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "RAS_Deformer.h" // __NLA
|
|
|
|
#include <vector>
|
|
|
|
#include <map>
|
|
|
|
#include <set>
|
|
|
|
using namespace std;
|
|
|
|
|
2004-05-04 09:34:02 +00:00
|
|
|
/**
|
|
|
|
* KX_VertexIndex
|
|
|
|
*/
|
2002-10-12 11:37:38 +00:00
|
|
|
struct KX_VertexIndex {
|
|
|
|
public:
|
|
|
|
KX_VertexIndex(int size);
|
2004-07-17 05:23:17 +00:00
|
|
|
void SetIndex(short loc,unsigned int index);
|
2005-01-16 06:02:06 +00:00
|
|
|
|
|
|
|
// The vertex array
|
2002-10-12 11:37:38 +00:00
|
|
|
short m_vtxarray;
|
2005-01-16 06:02:06 +00:00
|
|
|
// An index into the vertex array for up to 4 verticies
|
2004-07-17 05:23:17 +00:00
|
|
|
unsigned short m_indexarray[4];
|
2002-10-12 11:37:38 +00:00
|
|
|
short m_size;
|
|
|
|
};
|
|
|
|
|
2006-04-02 21:04:20 +00:00
|
|
|
/**
|
|
|
|
* KX_ListSlot.
|
|
|
|
*/
|
|
|
|
class KX_ListSlot
|
|
|
|
{
|
2008-03-09 22:02:32 +00:00
|
|
|
protected:
|
|
|
|
int m_refcount;
|
2006-04-02 21:04:20 +00:00
|
|
|
public:
|
2008-03-09 22:02:32 +00:00
|
|
|
KX_ListSlot(){ m_refcount=1; }
|
|
|
|
virtual ~KX_ListSlot() {}
|
|
|
|
virtual int Release() {
|
|
|
|
if (--m_refcount > 0)
|
|
|
|
return m_refcount;
|
|
|
|
delete this;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
virtual KX_ListSlot* AddRef() {
|
|
|
|
m_refcount++;
|
|
|
|
return this;
|
|
|
|
}
|
2006-04-02 21:04:20 +00:00
|
|
|
virtual void SetModified(bool mod)=0;
|
|
|
|
};
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2004-05-04 09:34:02 +00:00
|
|
|
/**
|
|
|
|
* KX_MeshSlot.
|
|
|
|
*/
|
2002-10-12 11:37:38 +00:00
|
|
|
class KX_MeshSlot
|
|
|
|
{
|
|
|
|
public:
|
2006-04-02 21:04:20 +00:00
|
|
|
void* m_clientObj;
|
2004-07-17 05:23:17 +00:00
|
|
|
RAS_Deformer* m_pDeformer; // __NLA
|
2006-04-02 21:04:20 +00:00
|
|
|
double* m_OpenGLMatrix;
|
|
|
|
class RAS_MeshObject* m_mesh;
|
2004-07-17 05:23:17 +00:00
|
|
|
mutable bool m_bVisible; // for visibility
|
2006-04-02 21:04:20 +00:00
|
|
|
mutable bool m_bObjectColor;
|
2004-07-17 05:23:17 +00:00
|
|
|
mutable MT_Vector4 m_RGBAcolor;
|
2006-04-02 21:04:20 +00:00
|
|
|
mutable KX_ListSlot* m_DisplayList; // for lists
|
2004-07-17 05:23:17 +00:00
|
|
|
KX_MeshSlot() :
|
|
|
|
m_pDeformer(NULL),
|
2006-04-02 21:04:20 +00:00
|
|
|
m_bVisible(true),
|
|
|
|
m_DisplayList(0)
|
2004-07-17 05:23:17 +00:00
|
|
|
{
|
|
|
|
}
|
2008-03-09 22:02:32 +00:00
|
|
|
~KX_MeshSlot();
|
2002-10-12 11:37:38 +00:00
|
|
|
bool Less(const KX_MeshSlot& lhs) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator <( const KX_MeshSlot& rhs,const KX_MeshSlot& lhs)
|
|
|
|
{
|
|
|
|
return ( rhs.Less(lhs));
|
|
|
|
}
|
|
|
|
|
2004-05-04 09:34:02 +00:00
|
|
|
/**
|
|
|
|
* Contains a list of meshs with the same material properties.
|
|
|
|
*/
|
2002-10-12 11:37:38 +00:00
|
|
|
class RAS_MaterialBucket
|
|
|
|
{
|
2004-05-21 08:55:12 +00:00
|
|
|
public:
|
2002-10-12 11:37:38 +00:00
|
|
|
typedef std::set<KX_MeshSlot> T_MeshSlotList;
|
|
|
|
|
|
|
|
RAS_MaterialBucket(RAS_IPolyMaterial* mat);
|
|
|
|
virtual ~RAS_MaterialBucket() {}
|
|
|
|
|
|
|
|
void Render(const MT_Transform& cameratrans,
|
|
|
|
class RAS_IRasterizer* rasty,
|
|
|
|
class RAS_IRenderTools* rendertools);
|
|
|
|
|
2004-05-04 09:34:02 +00:00
|
|
|
RAS_IPolyMaterial* GetPolyMaterial() const;
|
2008-07-29 15:48:31 +00:00
|
|
|
bool IsAlpha() const;
|
|
|
|
bool IsZSort() const;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
static void StartFrame();
|
|
|
|
static void EndFrame();
|
|
|
|
|
|
|
|
void SetMeshSlot(KX_MeshSlot& ms);
|
|
|
|
void RemoveMeshSlot(KX_MeshSlot& ms);
|
|
|
|
void MarkVisibleMeshSlot(KX_MeshSlot& ms,
|
|
|
|
bool visible,
|
|
|
|
bool color,
|
|
|
|
const MT_Vector4& rgbavec);
|
2006-02-13 05:45:32 +00:00
|
|
|
|
2004-05-21 08:55:12 +00:00
|
|
|
void RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
2008-07-10 12:47:20 +00:00
|
|
|
RAS_IRenderTools* rendertools, const KX_MeshSlot &ms, RAS_IRasterizer::DrawMode drawmode);
|
2005-01-16 06:02:06 +00:00
|
|
|
bool ActivateMaterial(const MT_Transform& cameratrans, RAS_IRasterizer* rasty,
|
2008-07-10 12:47:20 +00:00
|
|
|
RAS_IRenderTools *rendertools, RAS_IRasterizer::DrawMode& drawmode);
|
2004-05-21 08:55:12 +00:00
|
|
|
|
|
|
|
unsigned int NumMeshSlots();
|
|
|
|
T_MeshSlotList::iterator msBegin();
|
|
|
|
T_MeshSlotList::iterator msEnd();
|
|
|
|
|
2004-05-04 09:34:02 +00:00
|
|
|
struct less
|
|
|
|
{
|
|
|
|
bool operator()(const RAS_MaterialBucket* x, const RAS_MaterialBucket* y) const
|
|
|
|
{
|
|
|
|
return *x->GetPolyMaterial() < *y->GetPolyMaterial();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef set<RAS_MaterialBucket*, less> Set;
|
2004-05-21 08:55:12 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
T_MeshSlotList m_meshSlots;
|
|
|
|
bool m_bModified;
|
|
|
|
RAS_IPolyMaterial* m_material;
|
|
|
|
double* m_pOGLMatrix;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif //__KX_BUCKET
|
2002-10-30 02:07:20 +00:00
|
|
|
|