From: Matthias B. <mb...@us...> - 2004-08-05 20:42:56
|
Update of /cvsroot/pyode/pyode/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19168 Modified Files: declarations.pyx geoms.pyx space.pyx trimesh.pyx Log Message: Split the Space class into 3 separate classes: SimpleSpace, HashSpace and QuadTreeSpace that each derive from SpaceBase. To remain backwards compatible there's a factory function called Space() that returns an appropriate space object. Index: space.pyx =================================================================== RCS file: /cvsroot/pyode/pyode/src/space.pyx,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** space.pyx 3 Aug 2004 07:19:13 -0000 1.3 --- space.pyx 5 Aug 2004 20:42:45 -0000 1.4 *************** *** 1,4 **** ! # Space ! cdef class Space(GeomObject): """Space class (container for geometry objects). --- 1,4 ---- ! # SpaceBase ! cdef class SpaceBase(GeomObject): """Space class (container for geometry objects). *************** *** 25,43 **** # cdef object geom_dict ! def __new__(self, type=0): ! if type==0: ! self.sid = dSimpleSpaceCreate(0) ! else: ! self.sid = dHashSpaceCreate(0) ! ! # Copy the ID ! self.gid = <dGeomID>self.sid ! ! dSpaceSetCleanup(self.sid, 0) ! _geom_c2py_lut[<long>self.sid]=self ! ! def __init__(self, type=0): pass ! # self.geom_dict = {} def __dealloc__(self): --- 25,33 ---- # cdef object geom_dict ! def __new__(self, *a, **kw): pass ! ! def __init__(self, *a, **kw): ! raise NotImplementedError, "The SpaceBase class can't be used directly." def __dealloc__(self): *************** *** 174,175 **** --- 164,320 ---- g2=_geom_c2py_lut[id2] callback(arg,g1,g2) + + + # SimpleSpace + cdef class SimpleSpace(SpaceBase): + """Simple space. + + This does not do any collision culling - it simply checks every + possible pair of geoms for intersection, and reports the pairs + whose AABBs overlap. The time required to do intersection testing + for n objects is O(n**2). This should not be used for large numbers + of objects, but it can be the preferred algorithm for a small + number of objects. This is also useful for debugging potential + problems with the collision system. + """ + + def __new__(self, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + + parentid = NULL + if space!=None: + sp = space + parentid = sp.sid + + self.sid = dSimpleSpaceCreate(parentid) + + # Copy the ID + self.gid = <dGeomID>self.sid + + dSpaceSetCleanup(self.sid, 0) + _geom_c2py_lut[<long>self.sid]=self + + def __init__(self, space=None): + pass + + # HashSpace + cdef class HashSpace(SpaceBase): + """Multi-resolution hash table space. + + This uses an internal data structure that records how each geom + overlaps cells in one of several three dimensional grids. Each + grid has cubical cells of side lengths 2**i, where i is an integer + that ranges from a minimum to a maximum value. The time required + to do intersection testing for n objects is O(n) (as long as those + objects are not clustered together too closely), as each object + can be quickly paired with the objects around it. + """ + + def __new__(self, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + + parentid = NULL + if space!=None: + sp = space + parentid = sp.sid + + self.sid = dHashSpaceCreate(parentid) + + # Copy the ID + self.gid = <dGeomID>self.sid + + dSpaceSetCleanup(self.sid, 0) + _geom_c2py_lut[<long>self.sid]=self + + def __init__(self, space=None): + pass + + def setLevels(self, int minlevel, int maxlevel): + """setLevels(minlevel, maxlevel) + + Sets the size of the smallest and largest cell used in the + hash table. The actual size will be 2^minlevel and 2^maxlevel + respectively. + """ + + if minlevel>maxlevel: + raise ValueError, "minlevel (%d) must be less than or equal to maxlevel (%d)"%(minlevel, maxlevel) + + dHashSpaceSetLevels(self.sid, minlevel, maxlevel) + + def getLevels(self): + """getLevels() -> (minlevel, maxlevel) + + Gets the size of the smallest and largest cell used in the + hash table. The actual size is 2^minlevel and 2^maxlevel + respectively. + """ + + cdef int minlevel + cdef int maxlevel + dHashSpaceGetLevels(self.sid, &minlevel, &maxlevel) + return (minlevel, maxlevel) + + + # QuadTreeSpace + cdef class QuadTreeSpace(SpaceBase): + """Quadtree space. + + This uses a pre-allocated hierarchical grid-based AABB tree to + quickly cull collision checks. It's exceptionally quick for large + amounts of objects in landscape-shaped worlds. The amount of + memory used is 4**depth * 32 bytes. + + Currently getGeom() is not implemented for the quadtree space. + """ + + def __new__(self, center, extents, depth, space=None): + cdef SpaceBase sp + cdef dSpaceID parentid + cdef dVector3 c + cdef dVector3 e + + parentid = NULL + if space!=None: + sp = space + parentid = sp.sid + + c[0] = center[0] + c[1] = center[1] + c[2] = center[2] + e[0] = extents[0] + e[1] = extents[1] + e[2] = extents[2] + self.sid = dQuadTreeSpaceCreate(parentid, c, e, depth) + + # Copy the ID + self.gid = <dGeomID>self.sid + + dSpaceSetCleanup(self.sid, 0) + _geom_c2py_lut[<long>self.sid]=self + + def __init__(self, center, extents, depth, space=None): + pass + + + def Space(type=0): + """Space factory function. + + Depending on the type argument this function either returns a + SimpleSpace (type=0) or a HashSpace (type=1). + + This function is provided to remain compatible with previous + versions of PyODE where there was only one Space class. + + >>> space = Space(type=0) # Create a SimpleSpace + >>> space = Space(type=1) # Create a HashSpace + """ + if type==0: + return SimpleSpace() + elif type==1: + return HashSpace() + else: + raise ValueError, "Unknown space type (%d)"%type + Index: geoms.pyx =================================================================== RCS file: /cvsroot/pyode/pyode/src/geoms.pyx,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** geoms.pyx 3 Aug 2004 07:17:25 -0000 1.9 --- geoms.pyx 5 Aug 2004 20:42:45 -0000 1.10 *************** *** 13,17 **** def __new__(self, space=None, radius=1.0): ! cdef Space sp cdef dSpaceID sid --- 13,17 ---- def __new__(self, space=None, radius=1.0): ! cdef SpaceBase sp cdef dSpaceID sid *************** *** 82,86 **** def __new__(self, space=None, lengths=(1.0, 1.0, 1.0)): ! cdef Space sp cdef dSpaceID sid --- 82,86 ---- def __new__(self, space=None, lengths=(1.0, 1.0, 1.0)): ! cdef SpaceBase sp cdef dSpaceID sid *************** *** 146,150 **** def __new__(self, space=None, normal=(0,0,1), dist=0): ! cdef Space sp cdef dSpaceID sid --- 146,150 ---- def __new__(self, space=None, normal=(0,0,1), dist=0): ! cdef SpaceBase sp cdef dSpaceID sid *************** *** 206,210 **** def __new__(self, space=None, radius=0.5, length=1.0): ! cdef Space sp cdef dSpaceID sid --- 206,210 ---- def __new__(self, space=None, radius=0.5, length=1.0): ! cdef SpaceBase sp cdef dSpaceID sid *************** *** 269,273 **** def __new__(self, space=None, rlen=1.0): ! cdef Space sp cdef dSpaceID sid --- 269,273 ---- def __new__(self, space=None, rlen=1.0): ! cdef SpaceBase sp cdef dSpaceID sid *************** *** 324,328 **** def __new__(self, space=None): ! cdef Space sp cdef dSpaceID sid --- 324,328 ---- def __new__(self, space=None): ! cdef SpaceBase sp cdef dSpaceID sid Index: declarations.pyx =================================================================== RCS file: /cvsroot/pyode/pyode/src/declarations.pyx,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** declarations.pyx 3 Aug 2004 07:19:13 -0000 1.9 --- declarations.pyx 5 Aug 2004 20:42:45 -0000 1.10 *************** *** 292,299 **** # Space ! dSpaceID dSimpleSpaceCreate(int space) ! dSpaceID dHashSpaceCreate(int space) ! # dSpaceID dSimpleSpaceCreate(dSpaceID space) ! # dSpaceID dHashSpaceCreate(dSpaceID space) void dSpaceDestroy (dSpaceID) --- 292,301 ---- # Space ! # dSpaceID dSimpleSpaceCreate(int space) ! # dSpaceID dHashSpaceCreate(int space) ! dSpaceID dSimpleSpaceCreate(dSpaceID space) ! dSpaceID dHashSpaceCreate(dSpaceID space) ! dSpaceID dQuadTreeSpaceCreate (dSpaceID space, dVector3 Center, ! dVector3 Extents, int Depth) void dSpaceDestroy (dSpaceID) *************** *** 304,307 **** --- 306,310 ---- void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel) + void dHashSpaceGetLevels (dSpaceID space, int *minlevel, int *maxlevel) void dSpaceSetCleanup (dSpaceID space, int mode) Index: trimesh.pyx =================================================================== RCS file: /cvsroot/pyode/pyode/src/trimesh.pyx,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** trimesh.pyx 29 Jul 2004 20:57:38 -0000 1.2 --- trimesh.pyx 5 Aug 2004 20:42:45 -0000 1.3 *************** *** 21,25 **** def __new__(self, TriMeshData data not None, space=None): ! cdef Space sp cdef dSpaceID sid --- 21,25 ---- def __new__(self, TriMeshData data not None, space=None): ! cdef SpaceBase sp cdef dSpaceID sid |