Commit: c5644bc7666f38f30a6442a91ceaa5b3276dede5
Author: Jonathan deWerd
Date:   Wed Jul 9 22:44:02 2014 -0400
https://developer.blender.org/rBc5644bc7666f38f30a6442a91ceaa5b3276dede5

Timing code (TODO: REMOVE, it's platform-specific), reorganization of coords 
(now stored apart from verts) for compatibility with tess code.

===================================================================

M       source/blender/blenkernel/intern/displist.c
M       source/blender/editors/curve/CMakeLists.txt
M       source/blender/editors/curve/GridMesh.cpp
M       source/blender/editors/curve/GridMesh.h
M       source/blender/editors/curve/GridMesh_GLUT_debug_tool.cpp
A       source/blender/editors/curve/surf_tess.cpp
A       source/blender/editors/curve/surf_tess.h
M       source/blender/editors/io/io_rhino_import.cpp

===================================================================

diff --git a/source/blender/blenkernel/intern/displist.c 
b/source/blender/blenkernel/intern/displist.c
index cf894e7..1997a9d 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -63,6 +63,10 @@
 
 #include "BLI_sys_types.h" // for intptr_t support
 
+#include <CoreServices/CoreServices.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+
 static void boundbox_displist_object(Object *ob);
 
 void BKE_displist_elem_free(DispList *dl)
@@ -1197,6 +1201,7 @@ void BKE_displist_make_surf(Scene *scene, Object *ob, 
ListBase *dispbase,
        DispList *dl;
        float *data;
        int len;
+       uint64_t timer_start = mach_absolute_time();
 
        if (!for_render && cu->editnurb) {
                BKE_nurbList_duplicate(&nubase, BKE_curve_editNurbs_get(cu));
@@ -1246,7 +1251,7 @@ void BKE_displist_make_surf(Scene *scene, Object *ob, 
ListBase *dispbase,
 
                                dl = MEM_callocN(sizeof(DispList), 
"makeDispListsurf");
                                dl->verts = MEM_mallocN(len * sizeof(float[3]), 
"dlverts");
-                               BLI_addtail(dispbase, dl);
+                               BLI_addtail(dispbase, dl); // <----- WHERE MESH 
GETS OUTPUTTED TO CALLER
 
                                dl->col = nu->mat_nr;
                                dl->charidx = nu->charidx;
@@ -1276,6 +1281,10 @@ void BKE_displist_make_surf(Scene *scene, Object *ob, 
ListBase *dispbase,
                                          for_render, use_render_resolution);
        }
 
+       uint64_t timer_stop = mach_absolute_time();
+       int t = timer_stop-timer_start;
+       nu = nubase.first;
+       printf("%i %i %i %i\n",len,nu->pntsu*nu->resolu,nu->pntsv*nu->resolv,t);
        BKE_nurbList_free(&nubase);
 }
 
diff --git a/source/blender/editors/curve/CMakeLists.txt 
b/source/blender/editors/curve/CMakeLists.txt
index 0b449c4..30781ca 100644
--- a/source/blender/editors/curve/CMakeLists.txt
+++ b/source/blender/editors/curve/CMakeLists.txt
@@ -39,8 +39,10 @@ set(SRC
        editcurve_add.c
        editfont.c
        lorem.c
+       surf_tess.cpp
 
        curve_intern.h
+       surf_tess.h
 )
 
 if(WITH_INTERNATIONAL)
diff --git a/source/blender/editors/curve/GridMesh.cpp 
b/source/blender/editors/curve/GridMesh.cpp
index 8056c5e..1cbf727 100644
--- a/source/blender/editors/curve/GridMesh.cpp
+++ b/source/blender/editors/curve/GridMesh.cpp
@@ -63,50 +63,58 @@ void GridMesh::set_ll_ur(double lowerleft_x, double 
lowerleft_y,
        inv_dy = 1.0/dy;
 }
 
+GridMeshVert::GridMeshVert() : next(0), prev(0),
+                                                               next_poly(0), 
neighbor(0), first(0),
+                                                               
is_intersection(false), is_interior(true), is_entry(false),
+                                                               is_used(false), 
corner(0), tmp(0), is_pristine(0),
+                                                               owns_coords(0), 
coord_idx(0)
+{}
+
 GridMesh::GridMesh(double lowerleft_x, double lowerleft_y,
                                   double upperright_x, double upperright_y,
                                   int num_x_cells, int num_y_cells) {
        nx = num_x_cells; ny = num_y_cells;
        set_ll_ur(lowerleft_x, lowerleft_y, upperright_x, upperright_y);
-       v_capacity = nx*ny*4 + 256;
-       v_count = nx*ny*4+1;
-       v = (GreinerV2f*)malloc(sizeof(GreinerV2f)*v_capacity);
-       new (v) GreinerV2f();
-       v->x = v->y = -1234;
+       coords.resize((nx+1)*(ny+1)*2);
+       for (int j=0; j<ny+1; j++) {
+               for (int i=0; i<nx+1; i++) {
+                       GridMeshCoord& c = coords[gridpt_for_cell(i,j)];
+                       c.x = llx + i*dx;
+                       c.y = lly + j*dy;
+                       c.z = 0;
+               }
+       }
+       v.resize(nx*ny*4*2);
+       ie_grid.resize(nx*ny+1,false);
+       ie_isect_right.resize(nx*ny+1,false);
+       ie_isect_up.resize(nx*ny+1,false);
+       vert_set_coord(0, -1234, -1234, -1234);
        for (int j=0; j<ny; j++) {
-               double b = lly + j*dy;
-               double t = (j==ny-1)? ury : lly + (j+1)*dy;
                for (int i=0; i<nx; i++) {
-                       double l = llx + i*dx;
-                       double r = (i==nx-1)? urx : llx + (i+1)*dx;
-                       GreinerV2f *v1 = &v[poly_for_cell(i, j)];
-                       GreinerV2f *v2 = v1+1;
-                       GreinerV2f *v3 = v1+2;
-                       GreinerV2f *v4 = v1+3;
-                       new (v1) GreinerV2f(); v1->x=l; v1->y=b;
-                       new (v2) GreinerV2f(); v2->x=r; v2->y=b;
-                       new (v3) GreinerV2f(); v3->x=r; v3->y=t;
-                       new (v4) GreinerV2f(); v4->x=l; v4->y=t;
-                       int iv1 = vert_id(v1);
-                       int iv2 = iv1+1;
-                       int iv3 = iv1+2;                                 // 13  
 + 1
-                       int iv4 = iv1+3;                                 // 02
+                       int iv1=poly_for_cell(i, j), iv1c=gridpt_for_cell(i, j);
+                       int iv2=iv1+1, iv2c=iv1c+1;
+                       int iv3=iv1+2, iv3c=iv1c+nx+2;
+                       int iv4=iv1+3, iv4c=iv1c+nx+1;
+                       GridMeshVert *v1 = &v[iv1];
+                       GridMeshVert *v2 = v1+1;
+                       GridMeshVert *v3 = v1+2;
+                       GridMeshVert *v4 = v1+3;
+                       v1->coord_idx = iv1c;
+                       v2->coord_idx = iv2c;
+                       v3->coord_idx = iv3c;
+                       v4->coord_idx = iv4c;
                        v1->next = iv2; v2->prev = iv1; v1->first = iv1; 
v1->corner = 1;
                        v2->next = iv3; v3->prev = iv2; v2->first = iv1; 
v2->corner = 3;
                        v3->next = iv4; v4->prev = iv3; v3->first = iv1; 
v3->corner = 4;
                        v4->next = iv1; v1->prev = iv4; v4->first = iv1; 
v4->corner = 2;
+                       v1->is_pristine = 1;
                }
        }
 }
 
 int GridMesh::vert_new() {
-       if (v_count>=v_capacity) {
-               long newcap = v_capacity*2;
-               v = (GreinerV2f*)realloc(v, newcap*sizeof(GreinerV2f));
-               v_capacity = newcap;
-       }
-       new (v+v_count) GreinerV2f();
-       return int(v_count++);
+       v.push_back(GridMeshVert());
+       return int(v.size()-1);
 }
 
 int GridMesh::vert_new(int prev, int next) {
@@ -124,6 +132,43 @@ int GridMesh::vert_new(int prev, int next) {
        return ret;
 }
 
+int GridMesh::vert_dup(int vert) {
+       int ret = vert_new();
+       new (&v[ret]) GridMeshVert(v[vert]);
+       return ret;
+}
+
+void GridMesh::vert_set_coord(int vert, double x, double y, double z) {
+       if (v[vert].owns_coords) {
+               GridMeshCoord& xyz = coords[v[vert].coord_idx];
+               xyz.x=x; xyz.y=y; xyz.z=z;
+               return;
+       }
+       coords.push_back(GridMeshCoord(x,y,z));
+       v[vert].coord_idx = int(coords.size()-1);
+       v[vert].owns_coords = 1;
+}
+
+void GridMesh::vert_get_coord(int vert, double* xyz) {
+       GridMeshCoord *gmc = &coords[v[vert].coord_idx];
+       xyz[0] = gmc->x;
+       xyz[1] = gmc->y;
+       xyz[2] = gmc->z;
+}
+
+
+int GridMesh::poly_new(const std::vector<float>& packed_coords) {
+       size_t num_verts = packed_coords.size()/2;
+       int last=0, first=0;
+       for (int i=0; i<num_verts; i++) {
+               int vert = vert_new(last,0);
+               if (!first) first=vert;
+               v[vert].first = first;
+               vert_set_coord(vert, packed_coords[2*i+0], 
packed_coords[2*i+1], 0);
+               last = vert;
+       }
+       return first;
+}
 
 int GridMesh::poly_first_vert(int vert) {
        int v2 = vert;
@@ -162,6 +207,12 @@ void GridMesh::poly_set_cyclic(int poly, bool cyc) {
        }
 }
 
+int GridMesh::gridpt_for_cell(int x, int y) {
+       if (x<0||x>=nx+1) return 0;
+       if (y<0||y>=ny+1) return 0;
+       return 1+(y*(nx+1)+x);
+}
+
 int GridMesh::poly_for_cell(int x, int y) {
        if (x<0||x>=nx) return 0;
        if (y<0||y>=ny) return 0;
@@ -191,7 +242,8 @@ int GridMesh::poly_num_edges(int poly) {
 int GridMesh::poly_vert_at(int anyvert, float x, float y) {
        bool first_iter = true;
        for(int vert = poly_first_vert(anyvert); vert; vert=v[vert].next) {
-               if (fabs(x-v[vert].x)+fabs(y-v[vert].y)<tolerance) return vert;
+               double vc[3];
+               if (fabs(x-vc[0])+fabs(y-vc[1])<tolerance) return vert;
                if (first_iter) {
                        first_iter = false;
                } else {
@@ -250,12 +302,12 @@ void GridMesh::poly_grid_BB(int poly, int *bb) { //int 
bb[4] = {minx,maxx,miny,m
        float minx=std::numeric_limits<float>::max(), 
maxx=std::numeric_limits<float>::min();
        float miny=std::numeric_limits<float>::max(), 
maxy=std::numeric_limits<float>::min();
        do {
-               GreinerV2f& g = v[vert];
-               minx = fmin(g.x,minx);
-               maxx = fmax(g.x,maxx);
-               miny = fmin(g.y,miny);
-               maxy = fmax(g.y,maxy);
-               vert = g.next;
+               double xyz[3]; vert_get_coord(vert, xyz);
+               minx = fmin(xyz[0],minx);
+               maxx = fmax(xyz[0],maxx);
+               miny = fmin(xyz[1],miny);
+               maxy = fmax(xyz[1],maxy);
+               vert = v[vert].next;
        } while (vert && vert!=first);
        bb[0] = xs_FloorToInt((minx-llx)*inv_dx);
        bb[1] = xs_FloorToInt((maxx-llx)*inv_dx);
@@ -283,8 +335,9 @@ void GridMesh::poly_center(int poly, float *cx, float *cy) {
        double sum_x=0, sum_y=0;
        int n=0;
        do {
-               sum_x += v[vert].x;
-               sum_y += v[vert].y;
+               double xyz[3]; vert_get_coord(vert, xyz);
+               sum_x += xyz[0];
+               sum_y += xyz[1];
                n += 1;
                vert = v[vert].next;
        } while (vert && vert!=poly && vert!=v[poly].first);
@@ -320,8 +373,10 @@ void GridMesh::poly_draw(int poly, float shrinkby, int 
maxedges) {
                do {
                        int v2 = v[v1].next;
                        NURBS_TESS_PRINTF("%i-%i, ",v1,v2);
-                       glVertex2f((1-shrinkby)*v[v1].x+shrinkby*cx, 
(1-shrinkby)*v[v1].y+shrinkby*cy);
-                       glVertex2f((1-shrinkby)*v[v2].x+shrinkby*cx, 
(1-shrinkby)*v[v2].y+shrinkby*cy);
+                       double v1xyz[3]; vert_get_coord(v1, v1xyz);
+                       double v2xyz[3]; vert_get_coord(v2, v2xyz);
+                       glVertex2f((1-shrinkby)*v1xyz[0]+shrinkby*cx, 
(1-shrinkby)*v1xyz[1]+shrinkby*cy);
+                       glVertex2f((1-shrinkby)*v2xyz[0]+shrinkby*cx, 
(1-shrinkby)*v2xyz[1]+shrinkby*cy);
                        ++num_drawn_edges;
                        if (maxedges && num_drawn_edges>=maxedges)
                                break;
@@ -340,7 +395,8 @@ void GridMesh::poly_draw(int poly, float shrinkby, int 
maxedges) {
                        } else {
                                glColor3ub(0,0,255);
                        }
-                       float x=v[v1].x, y=v[v1].y;
+                       double v1xyz[3]; vert_get_coord(v1, v1xyz);
+                       float x=v1xyz[0], y=v1xyz[1];
                        float cx, cy; poly_center(v[v1].first, &cx, &cy);
                        x = (1.0-shrinkby)*x + shrinkby*cx;
                        y = (1.0-shrinkby)*y + shrinkby*cy;
@@ -465,14 +521,12 @@ int GridMesh::insert_vert(int poly1left,
                                                  ) {
        // Insert an intersection vertex into polygon 1
        int newv1 = vert_new(poly1left,poly1right);
-       v[newv1].x = x1;
-       v[newv1].y = y1;
+       vert_set_coord(newv1, x1, y1, 0);
        v[newv1].is_intersection = true;
        
        // Insert an intersection vertex into polygon 2
        int newv2 = vert_new(poly2left,poly2right);
-       v[newv2].x = x1;
-       v[newv2].y = y1;
+       vert_set_coord(newv2, x1, y1, 0);
        v[newv2].is_intersection = true;
        
        // Tell the intersection vertices that they're stacked on top of one 
another
@@ -487,12 +541,12 @@ void GridMesh::bool_AND(int poly2) {
        poly_grid_BB(poly2, bb);
        int num_v, num_e; insert_vert_poly_gridmesh(poly2, &num_v, &num_e);
        bool add_poly_after_end = false;
+       double p2xyz[3]; vert_get_coord(poly2, p2xyz);
        if (num_v==0 && num_e==0) {
-               int p = poly_for_cell(v[poly2].x, v[poly2].y);
+               int p = poly_for_cell((float)p2xyz[0], (float)p2xyz[1]);
                if (p) {
-                       double p2x=v[poly2].x, p2y=v[poly2].y;
                        for (int subpoly=p; subpoly; 
subpoly=v[subpoly].next_poly) {
-                               if (point_in_polygon(p2x, p2y, subpoly)) {
+                               if (point_in_polygon(p2xyz[0], 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to