blender/source/gameengine/Rasterizer/RAS_MeshObject.h

267 lines
6.3 KiB
C
Raw Normal View History

2002-10-12 11:37:38 +00:00
/**
* $Id$
*
* ***** 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
* 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.
*
* ***** END GPL LICENSE BLOCK *****
2002-10-12 11:37:38 +00:00
*/
#ifndef __RAS_MESHOBJECT
#define __RAS_MESHOBJECT
#ifdef WIN32
// disable the STL warnings ("debug information length > 255")
#pragma warning (disable:4786)
#endif
#include <vector>
#include <set>
#include "RAS_Polygon.h"
#include "RAS_MaterialBucket.h"
2002-10-12 11:37:38 +00:00
#include "MT_Transform.h"
#include "GEN_HashedPtr.h"
struct Mesh;
/**
* This class holds an array of vertices and indicies.
*/
2002-10-12 11:37:38 +00:00
class KX_ArrayOptimizer
{
public:
KX_ArrayOptimizer(int index)
: m_index1(index)
{};
virtual ~KX_ArrayOptimizer();
vector<KX_VertexArray*> m_VertexArrayCache1;
vector<int> m_TriangleArrayCount;
vector<KX_IndexArray*> m_IndexArrayCache1;
/**
order in which they are stored into the mesh
*/
int m_index1;
};
/**
* This struct holds a triangle.
*/
2002-10-12 11:37:38 +00:00
struct RAS_TriangleIndex
{
public:
int m_index[3];
int m_array;
RAS_IPolyMaterial* m_matid;
2002-10-12 11:37:38 +00:00
bool m_collider;
};
/**
* This class looks horribly broken. Only m_matid is used, and
* m_matid is a (int) RAS_IPolyMaterial*.
* --> m_matid == lhs.m_matid should be *m_matid == *lhs.m_matid
*/
2002-10-12 11:37:38 +00:00
class RAS_MatArrayIndex
{
public:
int m_arrayindex1;
RAS_IPolyMaterial* m_matid;
2002-10-12 11:37:38 +00:00
int m_array;
int m_index;
/*
2002-10-12 11:37:38 +00:00
inline bool Less(const RAS_MatArrayIndex& lhs) const {
bool result =
( (m_matid < lhs.m_matid) ||
((m_matid == lhs.m_matid)&&(m_array < lhs.m_array)) ||
((m_matid == lhs.m_matid) && (m_array == lhs.m_array) &&
(m_index < lhs.m_index))
);
return result;
}
*/
2002-10-12 11:37:38 +00:00
};
/*
2002-10-12 11:37:38 +00:00
inline bool operator <( const RAS_MatArrayIndex& rhs,const RAS_MatArrayIndex& lhs)
{
return ( rhs.Less(lhs));
}*/
2002-10-12 11:37:38 +00:00
/**
* RAS_MeshObject stores mesh data for the renderer.
*/
2002-10-12 11:37:38 +00:00
class RAS_MeshObject
{
// GEN_Map<class RAS_IPolyMaterial,KX_ArrayOptimizer*> m_matVertexArrayS;
//vector<class RAS_IPolyMaterial*,KX_ArrayOptimizer> m_vertexArrays;
virtual KX_ArrayOptimizer* GetArrayOptimizer(RAS_IPolyMaterial* polymat);
//vector<RAS_Polygon*> m_polygons;
unsigned int m_debugcolor;
bool m_bModified;
int m_lightlayer;
vector<class RAS_Polygon*> m_Polygons;
STR_String m_name;
static STR_String s_emptyname;
bool m_zsort;
bool m_MeshMod;
struct polygonSlot;
struct backtofront;
struct fronttoback;
void SchedulePoly(
const KX_VertexIndex& idx,
int numverts,
RAS_IPolyMaterial* mat
);
void ScheduleWireframePoly(
const KX_VertexIndex& idx,
int numverts,
int edgecode,
RAS_IPolyMaterial* mat
);
2002-10-12 11:37:38 +00:00
protected:
enum { BUCKET_MAX_INDICES = 65535 };//2048};//8192};
enum { BUCKET_MAX_TRIANGLES = 65535 };
GEN_Map<GEN_HashedPtr,KX_ArrayOptimizer*> m_matVertexArrayS;
2002-10-12 11:37:38 +00:00
RAS_MaterialBucket::Set m_materials;
Mesh* m_mesh;
2002-10-12 11:37:38 +00:00
public:
// for now, meshes need to be in a certain layer (to avoid sorting on lights in realtime)
RAS_MeshObject(Mesh* mesh, int lightlayer);
2002-10-12 11:37:38 +00:00
virtual ~RAS_MeshObject();
vector<RAS_IPolyMaterial*> m_sortedMaterials;
vector<vector<RAS_MatArrayIndex> > m_xyz_index_to_vertex_index_mapping;
vector<RAS_TriangleIndex > m_triangle_indices;
int m_class;
2002-10-12 11:37:38 +00:00
unsigned int GetLightLayer();
2002-10-12 11:37:38 +00:00
int NumMaterials();
const STR_String& GetMaterialName(unsigned int matid);
RAS_MaterialBucket* GetMaterialBucket(unsigned int matid);
const STR_String& GetTextureName(unsigned int matid);
2002-10-12 11:37:38 +00:00
virtual void AddPolygon(RAS_Polygon* poly);
void UpdateMaterialList();
int NumPolygons();
BGE patch: KX_GameObject::rayCast() improvements to have X-Ray option, return true face normal and hit polygon information. rayCast(to,from,dist,prop,face,xray,poly): The face paremeter determines the orientation of the normal: 0 or omitted => hit normal is always oriented towards the ray origin (as if you casted the ray from outside) 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect) The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray. The prop and xray parameters interact as follow: prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray. prop off, xray on : idem. prop on, xray off: return closest hit if it matches prop, no hit otherwise. prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray. if poly is 0 or omitted, returns a 3-tuple with object reference, hit point and hit normal or (None,None,None) if no hit. if poly is 1, returns a 4-tuple with in addition a KX_PolyProxy as 4th element. The KX_PolyProxy object holds information on the polygon hit by the ray: the index of the vertex forming the poylgon, material, etc. Attributes (read-only): matname: The name of polygon material, empty if no material. material: The material of the polygon texture: The texture name of the polygon. matid: The material index of the polygon, use this to retrieve vertex proxy from mesh proxy v1: vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy v2: vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy v3: vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy v4: vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex use this to retrieve vertex proxy from mesh proxy visible: visible state of the polygon: 1=visible, 0=invisible collide: collide state of the polygon: 1=receives collision, 0=collision free. Methods: getMaterialName(): Returns the polygon material name with MA prefix getMaterial(): Returns the polygon material getTextureName(): Returns the polygon texture name getMaterialIndex(): Returns the material bucket index of the polygon. getNumVertex(): Returns the number of vertex of the polygon. isVisible(): Returns whether the polygon is visible or not isCollider(): Returns whether the polygon is receives collision or not getVertexIndex(vertex): Returns the mesh vertex index of a polygon vertex getMesh(): Returns a mesh proxy New methods of KX_MeshProxy have been implemented to retrieve KX_PolyProxy objects: getNumPolygons(): Returns the number of polygon in the mesh. getPolygon(index): Gets the specified polygon from the mesh. More details in PyDoc.
2008-08-27 19:34:19 +00:00
RAS_Polygon* GetPolygon(int num) const;
2002-10-12 11:37:38 +00:00
virtual void Bucketize(
double* oglmatrix,
void* clientobj,
bool useObjectColor,
const MT_Vector4& rgbavec
);
void RemoveFromBuckets(
double* oglmatrix,
void* clientobj
);
void MarkVisible(
double* oglmatrix,
void* clientobj,
bool visible,
bool useObjectColor,
const MT_Vector4& rgbavec
);
void DebugColor(unsigned int abgr);
void SetVertexColor(RAS_IPolyMaterial* mat,MT_Vector4 rgba);
2002-10-12 11:37:38 +00:00
/**
* Sorts the polygons by their transformed z values.
*/
void SortPolygons(const MT_Transform &transform);
void SchedulePolygons(int drawingmode);
2002-10-12 11:37:38 +00:00
void ClearArrayData();
RAS_MaterialBucket::Set::iterator GetFirstMaterial();
RAS_MaterialBucket::Set::iterator GetLastMaterial();
2002-10-12 11:37:38 +00:00
virtual RAS_TexVert* GetVertex(
short array,
unsigned int index,
2002-10-12 11:37:38 +00:00
RAS_IPolyMaterial* polymat
);
virtual int FindVertexArray(
int numverts,
RAS_IPolyMaterial* polymat
);
// find (and share) or add vertices
// for some speedup, only the last 20 added vertices are searched for equality
virtual int FindOrAddVertex(
int vtxarray,
const MT_Point3& xyz,
const MT_Point2& uv,
const MT_Point2& uv2,
const MT_Vector4& tangent,
2002-10-12 11:37:38 +00:00
const unsigned int rgbacolor,
const MT_Vector3& normal,
Merge of apricot branch game engine changes into trunk, excluding GLSL. GLEW ==== Added the GLEW opengl extension library into extern/, always compiled into Blender now. This is much nicer than doing this kind of extension management manually, and will be used in the game engine, for GLSL, and other opengl extensions. * According to the GLEW website it works on Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris. There might still be platform specific issues due to this commit, so let me know and I'll look into it. * This means also that all extensions will now always be compiled in, regardless of the glext.h on the platform where compilation happens. Game Engine =========== Refactoring of the use of opengl extensions and other drawing code in the game engine, and cleaning up some hacks related to GLSL integration. These changes will be merged into trunk too after this. The game engine graphics demos & apricot level survived my tests, but this could use some good testing of course. For users: please test with the options "Generate Display Lists" and "Vertex Arrays" enabled, these should be the fastest and are supposed to be "unreliable", but if that's the case that's probably due to bugs that can be fixed. * The game engine now also uses GLEW for extensions, replacing the custom opengl extensions code that was there. Removes a lot of #ifdef's, but the runtime checks stay of course. * Removed the WITHOUT_GLEXT environment variable. This was added to work around a specific bug and only disabled multitexturing anyway. It might also have caused a slowdown since it was retrieving the environment variable for every vertex in immediate mode (bug #13680). * Refactored the code to allow drawing skinned meshes with vertex arrays too, removing some specific immediate mode drawing functions for this that only did extra normal calculation. Now it always splits vertices of flat faces instead. * Refactored normal recalculation with some minor optimizations, required for the above change. * Removed some outdated code behind the __NLA_OLDDEFORM #ifdef. * Fixed various bugs in setting of multitexture coordinates and vertex attributes for vertex arrays. These were not being enabled/disabled correct according to the opengl spec, leading to crashes. Also tangent attributes used an immediate mode call for vertex arrays, which can't work. * Fixed use of uninitialized variable in RAS_TexVert. * Exporting skinned meshes was doing O(n^2) lookups for vertices and deform weights, now uses same trick as regular meshes.
2008-06-17 10:27:34 +00:00
bool flat,
2002-10-12 11:37:38 +00:00
RAS_IPolyMaterial* mat,
int origindex
2002-10-12 11:37:38 +00:00
);
vecVertexArray& GetVertexCache (RAS_IPolyMaterial* mat);
2002-10-12 11:37:38 +00:00
int GetVertexArrayLength(RAS_IPolyMaterial* mat);
RAS_TexVert* GetVertex(
unsigned int matid,
unsigned int index
2002-10-12 11:37:38 +00:00
);
const vecIndexArrays& GetIndexCache (RAS_IPolyMaterial* mat);
void SetName(STR_String name);
const STR_String& GetName();
bool MeshModified();
void SetMeshModified(bool v){m_MeshMod = v;}
Mesh* GetMesh() { return m_mesh; }
2002-10-12 11:37:38 +00:00
};
#endif //__RAS_MESHOBJECT