Commit: 98e5beabb5076a7e8a4cf08031955cc2353617ae
Author: Jonathan deWerd
Date:   Thu Jul 31 16:45:36 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rB98e5beabb5076a7e8a4cf08031955cc2353617ae

Fixed bug that turned all booleans into bool_SUB, added code to get trims from 
Blender into 3dm viz for debug.

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

M       source/blender/blenkernel/intern/curve.cpp
M       source/blender/blenkernel/intern/surf_gridmesh.cpp
M       source/blender/blenkernel/intern/surf_gridmesh.h
M       tests/interactive/nurbs_trimtess.cpp

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

diff --git a/source/blender/blenkernel/intern/curve.cpp 
b/source/blender/blenkernel/intern/curve.cpp
index dad428c..a2a964d 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -41,6 +41,7 @@ extern "C" {
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_polyfill2d.h"
+#include "BLI_threads.h"
 
 #include "DNA_curve_types.h"
 #include "DNA_material_types.h"
@@ -636,6 +637,11 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
                newnu->bp = (BPoint *)MEM_mallocN(pntsu * pntsv * 
sizeof(BPoint), "copyNurb3");
        }
        
+       newnu->trims.first = newnu->trims.last = NULL;
+       for (NurbTrim *nt = (NurbTrim*)src->trims.first; nt; nt=nt->next) {
+               NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
+               BLI_addtail(&newnu->trims, dup_nt);
+       }
        BKE_nurb_clear_cached_UV_mesh(newnu,false);
 
        return newnu;
@@ -644,6 +650,7 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
 NurbTrim *BKE_nurbTrim_duplicate(NurbTrim *nt) {
        NurbTrim *ret = (NurbTrim*)MEM_callocN(sizeof(NurbTrim), 
"duplicateNurbTrim");
        BKE_nurbList_duplicate(&ret->nurb_list, &nt->nurb_list);
+       ret->type = nt->type;
        return ret;
 }
 
@@ -669,7 +676,6 @@ int BKE_nurbTrim_tess(struct NurbTrim *nt, int resolution, 
float (**uv_out)[2])
                        BKE_nurbs_curve_eval(u, U, pntsu, orderu, bp, 1, 0, 
&pt);
                        uv[i][0] = pt.vec[0];
                        uv[i][1] = pt.vec[1];
-                       printf("uv(%i/%i): %f 
%f\n",int(uv+i-*uv_out),tot_tess_pts,pt.vec[0],pt.vec[1]);
                }
                uv += tess_pts;
        }
@@ -4078,6 +4084,7 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
        
        // Trim
        if (nu->resol_trim<1) nu->resol_trim = 1;
+       //gm->begin_recording();
        for (NurbTrim *nt=(NurbTrim*)nu->trims.first; nt; nt=nt->next) {
                float (*trim_uv_pts)[2];
                int num_trimpts = BKE_nurbTrim_tess(nt, nu->resol_trim, 
&trim_uv_pts);
@@ -4087,11 +4094,22 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
                                gm->bool_AND(trim_poly);
                                break;
                        case CU_TRIM_INTERIOR:
+                               gm->bool_SUB(trim_poly);
+                               break;
                        default:
+                               fprintf(stderr,"WARNING: invalid trim type 
%i!\n",nt->type);
                                gm->bool_SUB(trim_poly);
                }
                MEM_freeN(trim_uv_pts);
        }
+//     static ThreadMutex *mutex = NULL;
+//     if (!mutex) {
+//             mutex = (ThreadMutex*)MEM_callocN(sizeof(ThreadMutex), 
"ThreadMutex");
+//             BLI_mutex_init(mutex);
+//     }
+//     BLI_mutex_lock(mutex);
+//     gm->dump_recording();
+//     BLI_mutex_unlock(mutex);
        
        // Extract the results
        std::map<int,int> *used_idxs;
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.cpp 
b/source/blender/blenkernel/intern/surf_gridmesh.cpp
index b43595f..119cdd7 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.cpp
+++ b/source/blender/blenkernel/intern/surf_gridmesh.cpp
@@ -63,6 +63,8 @@ GridMesh::GridMesh() {
        coords_len = coords_reserved_len = 0;
        mallocN = NULL;
        reallocN = NULL;
+       recorded_AND = NULL;
+       recorded_SUB = NULL;
 }
 
 GridMesh::~GridMesh() {
@@ -358,6 +360,51 @@ std::pair<int,int> GridMesh::cell_for_vert(int vert) {
        return std::make_pair(x,y);
 }
 
+void GridMesh::begin_recording() {
+       recorded_AND = new std::vector<int>();
+       recorded_SUB = new std::vector<int>();
+}
+
+void GridMesh::dump_poly(int poly) {
+       printf("{");
+       int vert=poly; do {
+               int next_v = v[vert].next;
+               GridMeshCoord &gmc = coords[v[vert].coord_idx];
+               printf((next_v==poly)?"%f,%f}":"%f,%f, ", gmc.x, gmc.y);
+               vert = next_v;
+       } while (vert!=poly);
+}
+
+void GridMesh::dump_recording() {
+       puts("#if defined(GRIDMESH_GEOM_TEST_6)");
+       if (recorded_AND->size()) {
+               printf("std::vector<float> clip_verts = ");
+               dump_poly(recorded_AND->at(0));
+               printf(";\n");
+       } else {
+               printf("std::vector<float> clip_verts = {.2,.2,  1.8,.2,  
1.8,1.8,  .2,1.8};\n");
+       }
+       int num_SUB = (int)recorded_SUB->size();
+       for (int i=0; i<num_SUB; i++) {
+               printf("std::vector<float> subj%i = ",i);
+               dump_poly(recorded_SUB->at(i));
+               printf(";\n");
+       }
+       printf("std::vector<std::vector<float>> subj_polys = {");
+       for (int i=0; i<num_SUB; i++) {
+               printf((i==num_SUB-1)?"subj%i}":"subj%i,",i);
+       }
+       printf(";\n");
+       printf("float gm_llx=%f,gm_lly=%f,gm_urx=%f,gm_ury=%f; // GridMesh 
params\n",llx,lly,urx,ury);
+       printf("int gm_nx=%i, gm_ny=%i;\n",nx,ny);
+       puts("std::vector<float> inout_pts = {};");
+       puts("bool clip_cyclic = true; // Required for initialization");
+       puts("bool subj_cyclic = true;");
+       puts("#endif");
+       delete recorded_AND;
+       delete recorded_SUB;
+}
+
 void GridMesh::poly_grid_BB(int poly, int *bb) { //int bb[4] = 
{minx,maxx,miny,maxy}
        int first = poly_first_vert(poly);
        int vert = first;
@@ -599,6 +646,7 @@ int GridMesh::insert_vert(int poly1left,
 
 // gridmesh -> gridmesh (intersection) poly2
 void GridMesh::bool_AND(int poly2) {
+       if (recorded_AND) {recorded_AND->push_back(poly2); return;}
        int bb[4];
        poly_grid_BB(poly2, bb);
        int num_v, num_e; insert_vert_poly_gridmesh(poly2, &num_v, &num_e);
@@ -627,6 +675,7 @@ void GridMesh::bool_AND(int poly2) {
 
 // gridmesh -> gridmesh (intersection) ~poly2
 void GridMesh::bool_SUB(int poly2) {
+       if (recorded_SUB) {recorded_SUB->push_back(poly2); return;}
        int bb[4];
        poly_grid_BB(poly2, bb);
        int num_v, num_e; insert_vert_poly_gridmesh(poly2, &num_v, &num_e);
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.h 
b/source/blender/blenkernel/intern/surf_gridmesh.h
index be327b4..6b9d6c6 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.h
+++ b/source/blender/blenkernel/intern/surf_gridmesh.h
@@ -113,6 +113,12 @@ struct GridMesh {
        int gridpt_for_cell(int x, int y) {return (0<=x&&x<=nx&&0<=y&y<=ny)? 
1+(y*(nx+1)+x) : 0;}
        std::pair<int,int> cell_for_vert(int vert);
        std::pair<float,float> cell_ll_corner(int x, int y) {return 
std::make_pair(llx+x*dx,lly+y*dy);}
+       
+       // Record & Debug Dump
+       std::vector<int> *recorded_AND, *recorded_SUB;
+       void begin_recording();
+       void dump_recording(); // Dumps the trim setup to stdout for copy/paste 
into tests/interactive/nurbs_trimtess.cpp
+       void dump_poly(int poly);
 
        // Vert manipulation
        int vert_new();
diff --git a/tests/interactive/nurbs_trimtess.cpp 
b/tests/interactive/nurbs_trimtess.cpp
index 5f54640..788b957 100644
--- a/tests/interactive/nurbs_trimtess.cpp
+++ b/tests/interactive/nurbs_trimtess.cpp
@@ -25,7 +25,7 @@ float intersect_check_tol = .001; //Maximum Euclidean dist 
between intersect pts
 /***************************** DEFAULT SCENE *****************************/
 GridMesh *gm;
 int max_drawn_edges=0; // Number of edges to draw per poly (for figuring out 
order). 0 disables.
-#define GRIDMESH_GEOM_TEST_4
+#define GRIDMESH_GEOM_TEST_6
 //#define RASTER_VIZ
 
 #if defined(GRIDMESH_GEOM_TEST_1)
@@ -83,6 +83,18 @@ float gm_llx=0,gm_lly=0,gm_urx=1,gm_ury=1; // GridMesh params
 int gm_nx=4, gm_ny=4;
 #endif
 
+#if defined(GRIDMESH_GEOM_TEST_6)
+std::vector<float> clip_verts = {.2,.2,  1.8,.2,  1.8,1.8,  .2,1.8};
+std::vector<float> subj0 = {0.514511,0.414239, 0.523301,0.450285, 
0.528555,0.488884, 0.530239,0.528780, 0.528320,0.568703, 0.522822,0.607224, 
0.513837,0.642949, 0.501466,0.674509, 0.486715,0.699252, 0.470538,0.716298, 
0.453106,0.725810, 0.434947,0.727231, 0.416720,0.720083, 0.399999,0.705064, 
0.385356,0.683360, 0.373093,0.656088, 0.363256,0.623353, 0.356413,0.586497, 
0.352959,0.547796, 0.352904,0.508460, 0.356259,0.469699, 0.362995,0.432781, 
0.373023,0.399094, 0.386249,0.370032, 0.401601 [...]
+std::vector<std::vector<float>> subj_polys = {subj0};
+float gm_llx=0.000000,gm_lly=0.000000,gm_urx=1.000000,gm_ury=1.000000; // 
GridMesh params
+int gm_nx=10, gm_ny=10;
+std::vector<float> inout_pts = {};
+bool clip_cyclic = true; // Required for initialization
+bool subj_cyclic = true;
+#endif
+
+
 #if defined(GRIDMESH_TIME_TEST)
 // Use this for timing runs
 bool clip_cyclic = true; // Required for initialization

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

Reply via email to