Revision: 76251
          http://sourceforge.net/p/brlcad/code/76251
Author:   starseeker
Date:     2020-07-01 18:14:45 +0000 (Wed, 01 Jul 2020)
Log Message:
-----------
Move more polygon code below libged

Modified Paths:
--------------
    brlcad/trunk/include/dm/bview_util.h
    brlcad/trunk/src/libdm/bview_polygon.cpp
    brlcad/trunk/src/libged/polyclip.cpp
    brlcad/trunk/src/libtclcad/tclcad_obj.c

Modified: brlcad/trunk/include/dm/bview_util.h
===================================================================
--- brlcad/trunk/include/dm/bview_util.h        2020-07-01 17:59:11 UTC (rev 
76250)
+++ brlcad/trunk/include/dm/bview_util.h        2020-07-01 18:14:45 UTC (rev 
76251)
@@ -42,8 +42,11 @@
 
 DM_EXPORT fastf_t find_polygon_area(bview_polygon *gpoly, fastf_t sf, matp_t 
model2view, fastf_t size);
 DM_EXPORT int polygons_overlap(bview_polygon *polyA, bview_polygon *polyB, 
matp_t model2view, struct bn_tol *tol, fastf_t iscale);
+DM_EXPORT bview_polygon *
+clip_polygon(ClipType op, bview_polygon *subj, bview_polygon *clip, fastf_t 
sf, matp_t model2view, matp_t view2model);
+DM_EXPORT bview_polygon *
+clip_polygons(ClipType op, bview_polygons *subj, bview_polygons *clip, fastf_t 
sf, matp_t model2view, matp_t view2model);
 
-
 __END_DECLS
 
 /** @} */

Modified: brlcad/trunk/src/libdm/bview_polygon.cpp
===================================================================
--- brlcad/trunk/src/libdm/bview_polygon.cpp    2020-07-01 17:59:11 UTC (rev 
76250)
+++ brlcad/trunk/src/libdm/bview_polygon.cpp    2020-07-01 18:14:45 UTC (rev 
76251)
@@ -31,6 +31,7 @@
 #include "clipper.hpp"
 
 #include "vmath.h"
+#include "bu/log.h"
 #include "bu/malloc.h"
 #include "bn/mat.h"
 #include "bn/plane.h"
@@ -437,8 +438,205 @@
 }
 
 
+typedef struct {
+    ClipperLib::long64 x;
+    ClipperLib::long64 y;
+} clipper_vertex;
 
+
+static fastf_t
+load_polygon(ClipperLib::Clipper &clipper, ClipperLib::PolyType ptype, 
bview_polygon *gpoly, fastf_t sf, matp_t mat)
+{
+    size_t j, k, n;
+    ClipperLib::Polygon curr_poly;
+    fastf_t vZ = 1.0;
+
+    for (j = 0; j < gpoly->gp_num_contours; ++j) {
+       n = gpoly->gp_contour[j].gpc_num_points;
+       curr_poly.resize(n);
+       for (k = 0; k < n; k++) {
+           point_t vpoint;
+
+           /* Convert to view coordinates */
+           MAT4X3PNT(vpoint, mat, gpoly->gp_contour[j].gpc_point[k]);
+           vZ = vpoint[Z];
+
+           curr_poly[k].X = (ClipperLib::long64)(vpoint[X] * sf);
+           curr_poly[k].Y = (ClipperLib::long64)(vpoint[Y] * sf);
+       }
+
+       try {
+           clipper.AddPolygon(curr_poly, ptype);
+       } catch (...) {
+           bu_log("Exception thrown by clipper\n");
+       }
+    }
+
+    return vZ;
+}
+
+static fastf_t
+load_polygons(ClipperLib::Clipper &clipper, ClipperLib::PolyType ptype, 
bview_polygons *subj, fastf_t sf, matp_t mat)
+{
+    size_t i;
+    fastf_t vZ = 1.0;
+
+    for (i = 0; i < subj->gp_num_polygons; ++i)
+       vZ = load_polygon(clipper, ptype, &subj->gp_polygon[i], sf, mat);
+
+    return vZ;
+}
+
 /*
+ * Process/extract the clipper_polys into a bview_polygon.
+ */
+static bview_polygon *
+extract(ClipperLib::ExPolygons &clipper_polys, fastf_t sf, matp_t mat, fastf_t 
vZ)
+{
+    size_t i, j, k, n;
+    size_t num_contours = 0;
+    bview_polygon *result_poly;
+
+    /* Count up the number of contours. */
+    for (i = 0; i < clipper_polys.size(); ++i)
+       /* Add the outer and the holes */
+       num_contours += clipper_polys[i].holes.size() + 1;
+
+    BU_ALLOC(result_poly, bview_polygon);
+    result_poly->gp_num_contours = num_contours;
+
+    if (num_contours < 1)
+       return result_poly;
+
+    result_poly->gp_hole = (int *)bu_calloc(num_contours, sizeof(int), 
"gp_hole");
+    result_poly->gp_contour = (bview_poly_contour *)bu_calloc(num_contours, 
sizeof(bview_poly_contour), "gp_contour");
+
+    n = 0;
+    for (i = 0; i < clipper_polys.size(); ++i) {
+       point_t vpoint;
+
+       result_poly->gp_hole[n] = 0;
+       result_poly->gp_contour[n].gpc_num_points = 
clipper_polys[i].outer.size();
+       result_poly->gp_contour[n].gpc_point =
+           (point_t *)bu_calloc(result_poly->gp_contour[n].gpc_num_points,
+                                sizeof(point_t), "gpc_point");
+
+       for (j = 0; j < result_poly->gp_contour[n].gpc_num_points; ++j) {
+           VSET(vpoint, (fastf_t)(clipper_polys[i].outer[j].X) * sf, 
(fastf_t)(clipper_polys[i].outer[j].Y) * sf, vZ);
+
+           /* Convert to model coordinates */
+           MAT4X3PNT(result_poly->gp_contour[n].gpc_point[j], mat, vpoint);
+       }
+
+       ++n;
+       for (j = 0; j < clipper_polys[i].holes.size(); ++j) {
+           result_poly->gp_hole[n] = 1;
+           result_poly->gp_contour[n].gpc_num_points = 
clipper_polys[i].holes[j].size();
+           result_poly->gp_contour[n].gpc_point =
+               (point_t *)bu_calloc(result_poly->gp_contour[n].gpc_num_points,
+                                    sizeof(point_t), "gpc_point");
+
+           for (k = 0; k < result_poly->gp_contour[n].gpc_num_points; ++k) {
+               VSET(vpoint, (fastf_t)(clipper_polys[i].holes[j][k].X) * sf, 
(fastf_t)(clipper_polys[i].holes[j][k].Y) * sf, vZ);
+
+               /* Convert to model coordinates */
+               MAT4X3PNT(result_poly->gp_contour[n].gpc_point[k], mat, vpoint);
+           }
+
+           ++n;
+       }
+    }
+
+    return result_poly;
+}
+
+
+bview_polygon *
+clip_polygon(ClipType op, bview_polygon *subj, bview_polygon *clip, fastf_t 
sf, matp_t model2view, matp_t view2model)
+{
+    fastf_t inv_sf;
+    fastf_t vZ;
+    ClipperLib::Clipper clipper;
+    ClipperLib::ExPolygons result_clipper_polys;
+    ClipperLib::ClipType ctOp;
+
+    /* need to scale the points up/down and then convert to/from long64 */
+    /* need a matrix to rotate into a plane */
+    /* need the inverse of the matrix above to put things back after clipping 
*/
+
+    /* Load subject polygon into clipper */
+    load_polygon(clipper, ClipperLib::ptSubject, subj, sf, model2view);
+
+    /* Load clip polygon into clipper */
+    vZ = load_polygon(clipper, ClipperLib::ptClip, clip, sf, model2view);
+
+    /* Convert op from BRL-CAD to Clipper */
+    switch (op) {
+    case gctIntersection:
+       ctOp = ClipperLib::ctIntersection;
+       break;
+    case gctUnion:
+       ctOp = ClipperLib::ctUnion;
+       break;
+    case gctDifference:
+       ctOp = ClipperLib::ctDifference;
+       break;
+    default:
+       ctOp = ClipperLib::ctXor;
+       break;
+    }
+
+    /* Clip'em */
+    clipper.Execute(ctOp, result_clipper_polys, ClipperLib::pftEvenOdd, 
ClipperLib::pftEvenOdd);
+
+    inv_sf = 1.0/sf;
+    return extract(result_clipper_polys, inv_sf, view2model, vZ);
+}
+
+
+bview_polygon *
+clip_polygons(ClipType op, bview_polygons *subj, bview_polygons *clip, fastf_t 
sf, matp_t model2view, matp_t view2model)
+{
+    fastf_t inv_sf;
+    fastf_t vZ;
+    ClipperLib::Clipper clipper;
+    ClipperLib::ExPolygons result_clipper_polys;
+    ClipperLib::ClipType ctOp;
+
+    /* need to scale the points up/down and then convert to/from long64 */
+    /* need a matrix to rotate into a plane */
+    /* need the inverse of the matrix above to put things back after clipping 
*/
+
+    /* Load subject polygons into clipper */
+    load_polygons(clipper, ClipperLib::ptSubject, subj, sf, model2view);
+
+    /* Load clip polygons into clipper */
+    vZ = load_polygons(clipper, ClipperLib::ptClip, clip, sf, model2view);
+
+    /* Convert op from BRL-CAD to Clipper */
+    switch (op) {
+    case gctIntersection:
+       ctOp = ClipperLib::ctIntersection;
+       break;
+    case gctUnion:
+       ctOp = ClipperLib::ctUnion;
+       break;
+    case gctDifference:
+       ctOp = ClipperLib::ctDifference;
+       break;
+    default:
+       ctOp = ClipperLib::ctXor;
+       break;
+    }
+
+    /* Clip'em */
+    clipper.Execute(ctOp, result_clipper_polys, ClipperLib::pftEvenOdd, 
ClipperLib::pftEvenOdd);
+
+    inv_sf = 1.0/sf;
+    return extract(result_clipper_polys, inv_sf, view2model, vZ);
+}
+
+/*
  * Local Variables:
  * tab-width: 8
  * mode: C

Modified: brlcad/trunk/src/libged/polyclip.cpp
===================================================================
--- brlcad/trunk/src/libged/polyclip.cpp        2020-07-01 17:59:11 UTC (rev 
76250)
+++ brlcad/trunk/src/libged/polyclip.cpp        2020-07-01 18:14:45 UTC (rev 
76251)
@@ -28,225 +28,10 @@
 
 #include "common.h"
 
-#include "clipper.hpp"
-
 #include "bu/sort.h"
 #include "dm/bview_util.h"
 #include "ged.h"
 
-
-typedef struct {
-    ClipperLib::long64 x;
-    ClipperLib::long64 y;
-} clipper_vertex;
-
-struct segment_node {
-    struct bu_list l;
-    int reverse;
-    int used;
-    void *segment;
-};
-
-struct contour_node {
-    struct bu_list l;
-    struct bu_list head;
-};
-
-
-static fastf_t
-load_polygon(ClipperLib::Clipper &clipper, ClipperLib::PolyType ptype, 
bview_polygon *gpoly, fastf_t sf, matp_t mat)
-{
-    size_t j, k, n;
-    ClipperLib::Polygon curr_poly;
-    fastf_t vZ = 1.0;
-
-    for (j = 0; j < gpoly->gp_num_contours; ++j) {
-       n = gpoly->gp_contour[j].gpc_num_points;
-       curr_poly.resize(n);
-       for (k = 0; k < n; k++) {
-           point_t vpoint;
-
-           /* Convert to view coordinates */
-           MAT4X3PNT(vpoint, mat, gpoly->gp_contour[j].gpc_point[k]);
-           vZ = vpoint[Z];
-
-           curr_poly[k].X = (ClipperLib::long64)(vpoint[X] * sf);
-           curr_poly[k].Y = (ClipperLib::long64)(vpoint[Y] * sf);
-       }
-
-       try {
-           clipper.AddPolygon(curr_poly, ptype);
-       } catch (...) {
-           bu_log("Exception thrown by clipper\n");
-       }
-    }
-
-    return vZ;
-}
-
-static fastf_t
-load_polygons(ClipperLib::Clipper &clipper, ClipperLib::PolyType ptype, 
bview_polygons *subj, fastf_t sf, matp_t mat)
-{
-    size_t i;
-    fastf_t vZ = 1.0;
-
-    for (i = 0; i < subj->gp_num_polygons; ++i)
-       vZ = load_polygon(clipper, ptype, &subj->gp_polygon[i], sf, mat);
-
-    return vZ;
-}
-
-
-/*
- * Process/extract the clipper_polys into a bview_polygon.
- */
-static bview_polygon *
-extract(ClipperLib::ExPolygons &clipper_polys, fastf_t sf, matp_t mat, fastf_t 
vZ)
-{
-    size_t i, j, k, n;
-    size_t num_contours = 0;
-    bview_polygon *result_poly;
-
-    /* Count up the number of contours. */
-    for (i = 0; i < clipper_polys.size(); ++i)
-       /* Add the outer and the holes */
-       num_contours += clipper_polys[i].holes.size() + 1;
-
-    BU_ALLOC(result_poly, bview_polygon);
-    result_poly->gp_num_contours = num_contours;
-
-    if (num_contours < 1)
-       return result_poly;
-
-    result_poly->gp_hole = (int *)bu_calloc(num_contours, sizeof(int), 
"gp_hole");
-    result_poly->gp_contour = (bview_poly_contour *)bu_calloc(num_contours, 
sizeof(bview_poly_contour), "gp_contour");
-
-    n = 0;
-    for (i = 0; i < clipper_polys.size(); ++i) {
-       point_t vpoint;
-
-       result_poly->gp_hole[n] = 0;
-       result_poly->gp_contour[n].gpc_num_points = 
clipper_polys[i].outer.size();
-       result_poly->gp_contour[n].gpc_point =
-           (point_t *)bu_calloc(result_poly->gp_contour[n].gpc_num_points,
-                                sizeof(point_t), "gpc_point");
-
-       for (j = 0; j < result_poly->gp_contour[n].gpc_num_points; ++j) {
-           VSET(vpoint, (fastf_t)(clipper_polys[i].outer[j].X) * sf, 
(fastf_t)(clipper_polys[i].outer[j].Y) * sf, vZ);
-
-           /* Convert to model coordinates */
-           MAT4X3PNT(result_poly->gp_contour[n].gpc_point[j], mat, vpoint);
-       }
-
-       ++n;
-       for (j = 0; j < clipper_polys[i].holes.size(); ++j) {
-           result_poly->gp_hole[n] = 1;
-           result_poly->gp_contour[n].gpc_num_points = 
clipper_polys[i].holes[j].size();
-           result_poly->gp_contour[n].gpc_point =
-               (point_t *)bu_calloc(result_poly->gp_contour[n].gpc_num_points,
-                                    sizeof(point_t), "gpc_point");
-
-           for (k = 0; k < result_poly->gp_contour[n].gpc_num_points; ++k) {
-               VSET(vpoint, (fastf_t)(clipper_polys[i].holes[j][k].X) * sf, 
(fastf_t)(clipper_polys[i].holes[j][k].Y) * sf, vZ);
-
-               /* Convert to model coordinates */
-               MAT4X3PNT(result_poly->gp_contour[n].gpc_point[k], mat, vpoint);
-           }
-
-           ++n;
-       }
-    }
-
-    return result_poly;
-}
-
-
-bview_polygon *
-ged_clip_polygon(ClipType op, bview_polygon *subj, bview_polygon *clip, 
fastf_t sf, matp_t model2view, matp_t view2model)
-{
-    fastf_t inv_sf;
-    fastf_t vZ;
-    ClipperLib::Clipper clipper;
-    ClipperLib::ExPolygons result_clipper_polys;
-    ClipperLib::ClipType ctOp;
-
-    /* need to scale the points up/down and then convert to/from long64 */
-    /* need a matrix to rotate into a plane */
-    /* need the inverse of the matrix above to put things back after clipping 
*/
-
-    /* Load subject polygon into clipper */
-    load_polygon(clipper, ClipperLib::ptSubject, subj, sf, model2view);
-
-    /* Load clip polygon into clipper */
-    vZ = load_polygon(clipper, ClipperLib::ptClip, clip, sf, model2view);
-
-    /* Convert op from BRL-CAD to Clipper */
-    switch (op) {
-    case gctIntersection:
-       ctOp = ClipperLib::ctIntersection;
-       break;
-    case gctUnion:
-       ctOp = ClipperLib::ctUnion;
-       break;
-    case gctDifference:
-       ctOp = ClipperLib::ctDifference;
-       break;
-    default:
-       ctOp = ClipperLib::ctXor;
-       break;
-    }
-
-    /* Clip'em */
-    clipper.Execute(ctOp, result_clipper_polys, ClipperLib::pftEvenOdd, 
ClipperLib::pftEvenOdd);
-
-    inv_sf = 1.0/sf;
-    return extract(result_clipper_polys, inv_sf, view2model, vZ);
-}
-
-
-bview_polygon *
-ged_clip_polygons(ClipType op, bview_polygons *subj, bview_polygons *clip, 
fastf_t sf, matp_t model2view, matp_t view2model)
-{
-    fastf_t inv_sf;
-    fastf_t vZ;
-    ClipperLib::Clipper clipper;
-    ClipperLib::ExPolygons result_clipper_polys;
-    ClipperLib::ClipType ctOp;
-
-    /* need to scale the points up/down and then convert to/from long64 */
-    /* need a matrix to rotate into a plane */
-    /* need the inverse of the matrix above to put things back after clipping 
*/
-
-    /* Load subject polygons into clipper */
-    load_polygons(clipper, ClipperLib::ptSubject, subj, sf, model2view);
-
-    /* Load clip polygons into clipper */
-    vZ = load_polygons(clipper, ClipperLib::ptClip, clip, sf, model2view);
-
-    /* Convert op from BRL-CAD to Clipper */
-    switch (op) {
-    case gctIntersection:
-       ctOp = ClipperLib::ctIntersection;
-       break;
-    case gctUnion:
-       ctOp = ClipperLib::ctUnion;
-       break;
-    case gctDifference:
-       ctOp = ClipperLib::ctDifference;
-       break;
-    default:
-       ctOp = ClipperLib::ctXor;
-       break;
-    }
-
-    /* Clip'em */
-    clipper.Execute(ctOp, result_clipper_polys, ClipperLib::pftEvenOdd, 
ClipperLib::pftEvenOdd);
-
-    inv_sf = 1.0/sf;
-    return extract(result_clipper_polys, inv_sf, view2model, vZ);
-}
-
-
 int
 ged_export_polygon(struct ged *gedp, bview_data_polygon_state *gdpsp, size_t 
polygon_i, const char *sname)
 {
@@ -345,6 +130,19 @@
 }
 
 
+struct segment_node {
+    struct bu_list l;
+    int reverse;
+    int used;
+    void *segment;
+};
+
+
+struct contour_node {
+    struct bu_list l;
+    struct bu_list head;
+};
+
 bview_polygon *
 ged_import_polygon(struct ged *gedp, const char *sname)
 {

Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-01 17:59:11 UTC (rev 
76250)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-01 18:14:45 UTC (rev 
76251)
@@ -4373,7 +4373,7 @@
        else if (bu_sscanf(argv[4], "%d", &op) != 1 || op > gctXor)
            goto bad;
 
-       gpp = ged_clip_polygon((ClipType)op,
+       gpp = clip_polygon((ClipType)op,
                               &gdpsp->gdps_polygons.gp_polygon[i],
                               &gdpsp->gdps_polygons.gp_polygon[j],
                               CLIPPER_MAX,

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to