Fixed several bugs: python refcounting related and Bullet related (basic add/remove...
[blender.git] / extern / bullet / Bullet / CollisionShapes / StridingMeshInterface.h
1 /*
2  * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
3  *
4  * Permission to use, copy, modify, distribute and sell this software
5  * and its documentation for any purpose is hereby granted without fee,
6  * provided that the above copyright notice appear in all copies.
7  * Erwin Coumans makes no representations about the suitability 
8  * of this software for any purpose.  
9  * It is provided "as is" without express or implied warranty.
10 */
11 #ifndef STRIDING_MESHINTERFACE_H
12 #define STRIDING_MESHINTERFACE_H
13
14 #include "SimdVector3.h"
15 #include "TriangleCallback.h"
16
17 /// PHY_ScalarType enumerates possible scalar types.
18 /// See the StridingMeshInterface for its use
19 typedef enum PHY_ScalarType {
20         PHY_FLOAT,
21         PHY_DOUBLE,
22         PHY_INTEGER,
23         PHY_SHORT,
24         PHY_FIXEDPOINT88
25 } PHY_ScalarType;
26
27 ///     StridingMeshInterface is the interface class for high performance access to triangle meshes
28 /// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory.
29 class  StridingMeshInterface
30 {
31         protected:
32         
33                 SimdVector3 m_scaling;
34
35         public:
36                 StridingMeshInterface() :m_scaling(1.f,1.f,1.f)
37                 {
38
39                 }
40
41                 virtual ~StridingMeshInterface();
42
43
44
45                 void    InternalProcessAllTriangles(InternalTriangleIndexCallback* callback,const SimdVector3& aabbMin,const SimdVector3& aabbMax) const;
46
47
48                 /// get read and write access to a subpart of a triangle mesh
49                 /// this subpart has a continuous array of vertices and indices
50                 /// in this way the mesh can be handled as chunks of memory with striding
51                 /// very similar to OpenGL vertexarray support
52                 /// make a call to unLockVertexBase when the read and write access is finished  
53                 virtual void    getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0)=0;
54                 
55                 virtual void    getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,const unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) const=0;
56         
57                 /// unLockVertexBase finishes the access to a subpart of the triangle mesh
58                 /// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished
59                 virtual void    unLockVertexBase(int subpart)=0;
60
61                 virtual void    unLockReadOnlyVertexBase(int subpart) const=0;
62
63
64                 /// getNumSubParts returns the number of seperate subparts
65                 /// each subpart has a continuous array of vertices and indices
66                 virtual int             getNumSubParts() const=0;
67
68                 virtual void    preallocateVertices(int numverts)=0;
69                 virtual void    preallocateIndices(int numindices)=0;
70
71                 const SimdVector3&      getScaling() const {
72                         return m_scaling;
73                 }
74                 void    setScaling(const SimdVector3& scaling)
75                 {
76                         m_scaling = scaling;
77                 }
78
79
80 };
81
82 #endif //STRIDING_MESHINTERFACE_H