BoxPack2D example in epydocs, small cleanup on Geometry.c
authorCampbell Barton <ideasman42@gmail.com>
Tue, 20 Mar 2007 12:07:02 +0000 (12:07 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 20 Mar 2007 12:07:02 +0000 (12:07 +0000)
release/scripts/uvcalc_lightmap.py
release/scripts/uvcalc_smart_project.py
source/blender/python/api2_2x/Geometry.c
source/blender/python/api2_2x/Geometry.h
source/blender/python/api2_2x/doc/Geometry.py
source/blender/python/api2_2x/vector.h

index cfca465644498dbfa5a2cfe1eec5f5737d439a64..45ce2f85abcffb371ef9fe8227c578ba5b3fdc80 100644 (file)
@@ -38,9 +38,6 @@ from Blender import *
 import BPyMesh
 # reload(BPyMesh)
 
 import BPyMesh
 # reload(BPyMesh)
 
-# import boxpack2d
-# reload(boxpack2d) # for developing.
-
 from math import sqrt
 
 class prettyface(object):
 from math import sqrt
 
 class prettyface(object):
index 1bb6dc70ac9270599ffbf496c7143d3b7f232d29..205a2cc5dbef97fa023f5938ae5f520728f2d27b 100644 (file)
@@ -56,9 +56,6 @@ global USER_FILL_HOLES_QUALITY
 USER_FILL_HOLES = None
 USER_FILL_HOLES_QUALITY = None
 
 USER_FILL_HOLES = None
 USER_FILL_HOLES_QUALITY = None
 
-# import boxpack2d
-# reload(boxpack2d) # for developing.
-
 dict_matrix = {}
 
 def pointInTri2D(v, v1, v2, v3):
 dict_matrix = {}
 
 def pointInTri2D(v, v1, v2, v3):
index de522fd9348c984ae0c52cbd249de3f44543f9df..c1bdf47a3680c753492af8cc32cfd333438c272c 100644 (file)
@@ -44,8 +44,7 @@
 
 /* needed for EXPP_ReturnPyObjError and EXPP_check_sequence_consistency */
 #include "gen_utils.h"
 
 /* needed for EXPP_ReturnPyObjError and EXPP_check_sequence_consistency */
 #include "gen_utils.h"
-
-//#include "util.h" /* MIN2 and MAX2 */ 
 #include "BKE_utildefines.h"
 
 #define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
 #include "BKE_utildefines.h"
 
 #define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
@@ -305,7 +304,7 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
 #define SET_BOXTOP(b, f)       b->v[BL]->y = f - b->h; b->v[TR]->y = f; UPDATE_V34Y(b)
 #define BOXINTERSECT(b1, b2) (!(BOXLEFT(b1)+EUL>=BOXRIGHT(b2) || BOXBOTTOM(b1)+EUL>=BOXTOP(b2) || BOXRIGHT(b1)-EUL<=BOXLEFT(b2) || BOXTOP(b1)-EUL<=BOXBOTTOM(b2) ))
 
 #define SET_BOXTOP(b, f)       b->v[BL]->y = f - b->h; b->v[TR]->y = f; UPDATE_V34Y(b)
 #define BOXINTERSECT(b1, b2) (!(BOXLEFT(b1)+EUL>=BOXRIGHT(b2) || BOXBOTTOM(b1)+EUL>=BOXTOP(b2) || BOXRIGHT(b1)-EUL<=BOXLEFT(b2) || BOXTOP(b1)-EUL<=BOXBOTTOM(b2) ))
 
-#define BOXDEBUG(b) printf("\tBox Debug i %i, w:%.3f h:%.3f x:%.3f y:%.3f\n", b->index, b->w, b->h, b->x, b->y)
+/* #define BOXDEBUG(b) printf("\tBox Debug i %i, w:%.3f h:%.3f x:%.3f y:%.3f\n", b->index, b->w, b->h, b->x, b->y) */
 
 
 static int box_areasort(const void *p1, const void *p2)
 
 
 static int box_areasort(const void *p1, const void *p2)
@@ -315,7 +314,6 @@ static int box_areasort(const void *p1, const void *p2)
 
        a1 = BOXAREA(b1);
        a2 = BOXAREA(b2);
 
        a1 = BOXAREA(b1);
        a2 = BOXAREA(b2);
-       /*printf("a1 a2 %f %f\n", a1, a2);*/
        
        /* sort largest to smallest */
        if              ( a1 < a2 ) return  1;
        
        /* sort largest to smallest */
        if              ( a1 < a2 ) return  1;
@@ -336,20 +334,15 @@ static int vertex_sort(const void *p1, const void *p2)
        v1 = vertarray + ((int *) p1)[0];
        v2 = vertarray + ((int *) p2)[0];
        
        v1 = vertarray + ((int *) p1)[0];
        v2 = vertarray + ((int *) p2)[0];
        
-       // self.verts.sort(key = lambda b: max(b.x+w, b.y+h) ) # Reverse area sort
-       
        a1 = MAX2(v1->x+box_width, v1->y+box_height);
        a2 = MAX2(v2->x+box_width, v2->y+box_height);
        
        a1 = MAX2(v1->x+box_width, v1->y+box_height);
        a2 = MAX2(v2->x+box_width, v2->y+box_height);
        
-       /*printf("a1 a2 %f %f\n", a1, a2);*/
-       
        /* sort largest to smallest */
        if              ( a1 > a2 ) return  1;
        else if ( a1 < a2 ) return -1;
        return 0;
 }
 
        /* sort largest to smallest */
        if              ( a1 > a2 ) return  1;
        else if ( a1 < a2 ) return -1;
        return 0;
 }
 
-
 static void boxPackAll(boxPack *boxarray, int len, float *tot_width, float *tot_height)
 {
        boxVert *vert;
 static void boxPackAll(boxPack *boxarray, int len, float *tot_width, float *tot_height)
 {
        boxVert *vert;
@@ -544,14 +537,12 @@ static void boxPackAll(boxPack *boxarray, int len, float *tot_width, float *tot_
                                                        box->v[BL]->free &= ~(BRF|BLF);
                                                        box->v[BR]->free &= ~(BRF|BLF);
                                                }
                                                        box->v[BL]->free &= ~(BRF|BLF);
                                                        box->v[BR]->free &= ~(BRF|BLF);
                                                }
+                                               
                                                /* The following block of code does a logical
                                                 * check with 2 adjacent boxes, its possible to
                                                 * flag verts on one or both of the boxes 
                                                 * as being used by checking the width or
                                                 * height of both boxes */
                                                /* The following block of code does a logical
                                                 * check with 2 adjacent boxes, its possible to
                                                 * flag verts on one or both of the boxes 
                                                 * as being used by checking the width or
                                                 * height of both boxes */
-                                               
-                                               
-                                               
                                                if (vert->tlb && vert->trb && (box == vert->tlb || box == vert->trb)) {
                                                        if (vert->tlb->h > vert->trb->h) {
                                                                vert->trb->v[TL]->free &= ~(TLF|BLF);
                                                if (vert->tlb && vert->trb && (box == vert->tlb || box == vert->trb)) {
                                                        if (vert->tlb->h > vert->trb->h) {
                                                                vert->trb->v[TL]->free &= ~(TLF|BLF);
index a601d39f2743c33759aaad9148e95283370fe0f8..09a1a27800e7b39e0e44a1acb3de9fec98ebd968 100644 (file)
@@ -29,7 +29,7 @@
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
 */
  *
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
 */
-//Include this file for access to vector, quat, matrix, euler, etc...
+/*Include this file for access to vector, quat, matrix, euler, etc...*/
 
 #ifndef EXPP_Geometry_H
 #define EXPP_Geometry_H
 
 #ifndef EXPP_Geometry_H
 #define EXPP_Geometry_H
index 610582bd11028576829a809eaff1011927990edb..bd44484177ce153ba0b8a49bc996c5c6ae1dddca 100644 (file)
@@ -10,36 +10,36 @@ This new module provides access to a geometry function.
 """
 
 def PolyFill(polylines):
 """
 
 def PolyFill(polylines):
-  """
-  Takes a list of polylines and calculates triangles that would fill in the polylines.
-  Multiple lines can be used to make holes inside a polyline, or fill in 2 seperate lines at once.
-  @type polylines: List of lists containing vectors, each representing a closed polyline.
-  @rtype: list
-  @return: a list if tuples each a tuple of 3 ints representing a triangle indexing the points given.
-  @note: 2D Vectors will have an assumed Z axis of zero, 4D Vectors W axis is ignored.
-  @note: The order of points in a polyline effect the direction returned triangles face, reverse the order of a polyline to flip the normal of returned faces.
-
-  I{B{Example:}}
-
-  The example below creates 2 polylines and fills them in with faces, then makes a mesh in the current scene::
-    import Blender
-    Vector= Blender.Mathutils.Vector
-
-    # Outline of 5 points
-    polyline1= [Vector(-2.0, 1.0, 1.0), Vector(-1.0, 2.0, 1.0), Vector(1.0, 2.0, 1.0), Vector(1.0, -1.0, 1.0), Vector(-1.0, -1.0, 1.0)]
-    polyline2= [Vector(-1, 1, 1.0), Vector(0, 1, 1.0), Vector(0, 0, 1.0), Vector(-1.0, 0.0, 1.0)]
-    fill= Blender.Geometry.PolyFill([polyline1, polyline2])
-
-    # Make a new mesh and add the truangles into it
-    me= Blender.Mesh.New()
-    me.verts.extend(polyline1)
-    me.verts.extend(polyline2)
-    me.faces.extend(fill) # Add the faces, they reference the verts in polyline 1 and 2
-
-    scn = Blender.Scene.GetCurrent()
-    ob = scn.objects.new(me)
-    Blender.Redraw()
-  """
+       """
+       Takes a list of polylines and calculates triangles that would fill in the polylines.
+       Multiple lines can be used to make holes inside a polyline, or fill in 2 seperate lines at once.
+       @type polylines: List of lists containing vectors, each representing a closed polyline.
+       @rtype: list
+       @return: a list if tuples each a tuple of 3 ints representing a triangle indexing the points given.
+       @note: 2D Vectors will have an assumed Z axis of zero, 4D Vectors W axis is ignored.
+       @note: The order of points in a polyline effect the direction returned triangles face, reverse the order of a polyline to flip the normal of returned faces.
+
+       I{B{Example:}}
+
+       The example below creates 2 polylines and fills them in with faces, then makes a mesh in the current scene::
+               import Blender
+               Vector= Blender.Mathutils.Vector
+
+               # Outline of 5 points
+               polyline1= [Vector(-2.0, 1.0, 1.0), Vector(-1.0, 2.0, 1.0), Vector(1.0, 2.0, 1.0), Vector(1.0, -1.0, 1.0), Vector(-1.0, -1.0, 1.0)]
+               polyline2= [Vector(-1, 1, 1.0), Vector(0, 1, 1.0), Vector(0, 0, 1.0), Vector(-1.0, 0.0, 1.0)]
+               fill= Blender.Geometry.PolyFill([polyline1, polyline2])
+
+               # Make a new mesh and add the truangles into it
+               me= Blender.Mesh.New()
+               me.verts.extend(polyline1)
+               me.verts.extend(polyline2)
+               me.faces.extend(fill) # Add the faces, they reference the verts in polyline 1 and 2
+
+               scn = Blender.Scene.GetCurrent()
+               ob = scn.objects.new(me)
+               Blender.Redraw()
+       """
 
 def LineIntersect2D(vec1, vec2, vec3, vec4):
        """
 
 def LineIntersect2D(vec1, vec2, vec3, vec4):
        """
@@ -51,10 +51,31 @@ def LineIntersect2D(vec1, vec2, vec3, vec4):
 def BoxPack2D(boxlist):
        """
        Takes a list of 2D boxes and packs them into a square.
 def BoxPack2D(boxlist):
        """
        Takes a list of 2D boxes and packs them into a square.
-       
        Each box in boxlist must be a list of at least 4 items - [x,y,w,h], after running this script,
        the X and Y values in each box will be moved to packed, non overlapping locations.
        
        Each box in boxlist must be a list of at least 4 items - [x,y,w,h], after running this script,
        the X and Y values in each box will be moved to packed, non overlapping locations.
        
+       Example::
+
+               # Make 500 random boxes, pack them and make a mesh from it
+               from Blender import Geometry, Scene, Mesh
+               import random
+               boxes = []
+               for i in xrange(500):
+                       boxes.append( [0,0, random.random()+0.1, random.random()+0.1] )
+               boxsize = Geometry.BoxPack2D(boxes)
+               print 'BoxSize', boxsize
+               me = Mesh.New()
+               for x in boxes:
+                       me.verts.extend([(x[0],x[1], 0), (x[0],x[1]+x[3], 0), (x[0]+x[2],x[1]+x[3], 0), (x[0]+x[2],x[1], 0) ])
+                       v1= me.verts[-1]
+                       v2= me.verts[-2]
+                       v3= me.verts[-3]
+                       v4= me.verts[-4]
+                       me.faces.extend([(v1,v2,v3,v4)])
+               scn = Scene.GetCurrent()
+               scn.objects.new(me)
+       
+       @note: Each boxlist item can be longer then 4, the extra items are ignored and stay untouched.
        @rtype: tuple
        @return: a tuple pair - (width, height) of all the packed boxes.
        """
        @rtype: tuple
        @return: a tuple pair - (width, height) of all the packed boxes.
        """
index 8f8dda99a7f6334fca5f2102e54337ca1513a4cd..3f58d9fa6d5416b547c5cb0fb1684f657e32e3f6 100644 (file)
@@ -46,7 +46,7 @@ typedef struct {
        short wrapped;                  /* is wrapped data? */
 } VectorObject;
 
        short wrapped;                  /* is wrapped data? */
 } VectorObject;
 
-//prototypes
+/*prototypes*/
 PyObject *Vector_Zero( VectorObject * self );
 PyObject *Vector_Normalize( VectorObject * self );
 PyObject *Vector_Negate( VectorObject * self );
 PyObject *Vector_Zero( VectorObject * self );
 PyObject *Vector_Normalize( VectorObject * self );
 PyObject *Vector_Negate( VectorObject * self );