Revision: 47173
          http://brlcad.svn.sourceforge.net/brlcad/?rev=47173&view=rev
Author:   abhi2011
Date:     2011-10-10 00:23:30 +0000 (Mon, 10 Oct 2011)
Log Message:
-----------
Added ray shooting in the X direction in the manifold generator to query the 
overlap area(of the AABBs) of 2 regions

Modified Paths:
--------------
    brlcad/trunk/src/libged/simulate/simrt.c
    brlcad/trunk/src/libged/simulate/simrt.h
    brlcad/trunk/src/libged/simulate/simulate.c
    brlcad/trunk/src/libged/simulate/simutils.c
    brlcad/trunk/src/libged/simulate/simutils.h

Modified: brlcad/trunk/src/libged/simulate/simrt.c
===================================================================
--- brlcad/trunk/src/libged/simulate/simrt.c    2011-10-09 16:29:28 UTC (rev 
47172)
+++ brlcad/trunk/src/libged/simulate/simrt.c    2011-10-10 00:23:30 UTC (rev 
47173)
@@ -63,6 +63,12 @@
                }
        }
 
+       overlap_list.forw = overlap_list.backw = &overlap_list;
+       hit_list.forw = hit_list.backw = &hit_list;
+
+       overlap_list.index = 0;
+       hit_list.index = 0;
+
        return GED_OK;
 }
 
@@ -143,7 +149,10 @@
                                   pp->pt_outseg->seg_stp->st_name );
 
                        /* Insert solid data into list node */
-                       new_hit_regp->reg_name = pp->pt_regionp->reg_name;
+                       if(pp->pt_regionp->reg_name[0] == '/')
+                               new_hit_regp->reg_name = 
(pp->pt_regionp->reg_name) + 1;
+                       else
+                               new_hit_regp->reg_name = 
pp->pt_regionp->reg_name;
                        new_hit_regp->in_stp   = pp->pt_inseg->seg_stp;
                        new_hit_regp->out_stp  = pp->pt_outseg->seg_stp;
 
@@ -228,6 +237,7 @@
                        new_hit_regp->backw = &hit_list;
                        new_hit_regp->forw->backw = new_hit_regp;
                        hit_list.forw = new_hit_regp;
+                       new_hit_regp->index = (new_hit_regp->forw->index) + 1;
 
                }
        }
@@ -270,7 +280,13 @@
                new_ovlp->backw = &overlap_list;
                new_ovlp->forw->backw = new_ovlp;
                overlap_list.forw = new_ovlp;
+               new_ovlp->index = (new_ovlp->forw->index) + 1;
 
+               if(new_ovlp->reg1->reg_name[0] == '/')
+                       new_ovlp->reg1->reg_name++;
+
+               if(new_ovlp->reg2->reg_name[0] == '/')
+                                       new_ovlp->reg2->reg_name++;
        }
 
        bu_log("if_overlap: Entering at (%f,%f,%f) at distance of %f",
@@ -352,11 +368,120 @@
        overlap_list.forw = overlap_list.backw = &overlap_list;
        hit_list.forw = hit_list.backw = &hit_list;
 
+       overlap_list.index = 0;
+       hit_list.index = 0;
+
        return GED_OK;
 }
 
 
+/**
+ * Traverse the hit list and overlap list, drawing the ray segments
+ */
 int
+traverse_lists(struct ged *gedp, struct simulation_params *sim_params,
+               point_t pt, point_t dir)
+{
+       struct overlap *ovp;
+       struct hit_reg *hrp;
+       struct bu_vls reg_vls = BU_VLS_INIT_ZERO;
+
+       /* quellage */
+       bu_log("Starting from : (%f,%f,%f), towards(%f,%f,%f)", V3ARGS(pt),  
V3ARGS(dir));
+
+       /* Draw all the hit regions */
+       if (overlap_list.forw != &overlap_list) {
+
+               ovp = overlap_list.forw;
+               while (ovp != &overlap_list) {
+
+                       bu_vls_sprintf(&reg_vls, 
"ray_overlap_%s_%s_%d_%f_%f_%f_%f_%f_%f",
+                                       ovp->reg1->reg_name,
+                                       ovp->reg2->reg_name,
+                                       ovp->index,
+                                       V3ARGS(pt), V3ARGS(dir));
+                       line(gedp, bu_vls_addr(&reg_vls),
+                                       ovp->in_point,
+                                       ovp->out_point,
+                                       0, 210, 0);
+
+                       add_to_comb(gedp, sim_params->sim_comb_name, 
bu_vls_addr(&reg_vls));
+                       ovp = ovp->forw;
+               }
+       }
+
+       /* Draw all the overlap regions */
+       if (hit_list.forw != &hit_list) {
+
+               hrp = hit_list.forw;
+
+               while (hrp != &hit_list) {
+                       bu_vls_sprintf(&reg_vls, 
"ray_hit_%s_%d_%f_%f_%f_%f_%f_%f",
+                               hrp->reg_name,
+                               hrp->index,
+                               V3ARGS(pt), V3ARGS(dir));
+                       line(gedp, bu_vls_addr(&reg_vls),
+                                       hrp->in_point,
+                                       hrp->out_point,
+                                       0, 210, 0);
+
+                       add_to_comb(gedp, sim_params->sim_comb_name, 
bu_vls_addr(&reg_vls));
+                       hrp = hrp->forw;
+               }
+       }
+
+        bu_vls_free(&reg_vls);
+
+       return GED_OK;
+}
+
+
+int
+shoot_x_rays(
+               struct ged *gedp,
+               struct sim_manifold *current_manifold,
+               struct simulation_params *sim_params,
+               struct rt_i *rtip,
+               vect_t overlap_min, vect_t overlap_max)
+{
+       point_t r_pt, r_dir;
+       fastf_t startz, starty, y, z;
+
+       /* Set direction as straight down X-axis */
+       VSET(r_dir, -1.0, 0.0, 0.0);
+
+       startz = overlap_min[Z];
+       starty = overlap_min[Y];
+
+       bu_log("Querying overlap between %s & %s",
+                       current_manifold->rbA->rb_namep,
+                       current_manifold->rbB->rb_namep);
+
+       for(z=startz; z<=overlap_max[Z]; z += TOL){
+               for(y=starty; y<=overlap_max[Y]; y += TOL){
+
+                       /* Shooting towards lower x, so start from max x 
outside of overlap box */
+                       VSET(r_pt, overlap_max[X], y, z);
+
+
+                       shoot_ray(rtip, r_pt, r_dir);
+
+                       /* Traverse the hit list and overlap list, drawing the 
ray segments */
+                       traverse_lists(gedp, sim_params, r_pt, r_dir);
+
+                       /* line(gedp, "ray_test", in_pt, out_pt, 0, 210, 0); */
+
+                       /* Cleanup the overlap and hit lists and free memory */
+                       cleanup_lists();
+
+               }
+
+       }
+
+       return GED_OK;
+}
+
+int
 generate_manifolds(struct ged *gedp, struct simulation_params *sim_params)
 {
        struct sim_manifold *current_manifold;
@@ -367,7 +492,6 @@
 
        /* Raytrace related stuff */
        struct rt_i *rtip;
-       point_t r_pt, r_dir;
 
        /* Make a new rt_i instance from the existing db_i structure */
        if ((rtip=rt_new_rti(gedp->ged_wdbp->dbip)) == RTI_NULL) {
@@ -378,19 +502,7 @@
 
        init_raytrace(sim_params, rtip);
 
-       VSET(r_pt, 1.0, 1.0, 0.0);
-       VSET(r_dir, -1.0, 0.0, 0.0);
 
-       shoot_ray(rtip, r_pt, r_dir);
-
-
-       /* Traverse the hit list and overlap list */
-       /* line(gedp, "ray_test", in_pt, out_pt, 0, 210, 0); */
-
-       /* Cleanup the overlap and hit lists and free memory */
-       cleanup_lists();
-
-
        /* Check all rigid bodies for overlaps using their manifold lists */
        for (rb = sim_params->head_node; rb != NULL; rb = rb->next) {
 
@@ -403,7 +515,7 @@
                                        overlap_max);
 
                        /* Prepare the overlap prim name */
-                       bu_vls_sprintf(&overlap_name, "%s_%s_%s",
+                       bu_vls_sprintf(&overlap_name, "%s%s_%s",
                                        prefix_overlap,
                                        current_manifold->rbA->rb_namep,
                                        current_manifold->rbB->rb_namep);
@@ -415,7 +527,14 @@
                        add_to_comb(gedp, sim_params->sim_comb_name, 
bu_vls_addr(&overlap_name));
 
                        /* Shoot rays right here as the pair of rigid_body ptrs 
are known, ignore volumes already shot */
+                       shoot_x_rays(gedp, current_manifold, sim_params, rtip, 
overlap_min, overlap_max);
 
+                       /* Shoot rays right here as the pair of rigid_body ptrs 
are known, ignore volumes already shot */
+                       /* shoot_y_rays(); */
+
+                       /* Shoot rays right here as the pair of rigid_body ptrs 
are known, ignore volumes already shot */
+                       /* shoot_z_rays(); */
+
                        /* Note down this volume as already covered, so no need 
to shoot rays through it again */
 
 

Modified: brlcad/trunk/src/libged/simulate/simrt.h
===================================================================
--- brlcad/trunk/src/libged/simulate/simrt.h    2011-10-09 16:29:28 UTC (rev 
47172)
+++ brlcad/trunk/src/libged/simulate/simrt.h    2011-10-10 00:23:30 UTC (rev 
47173)
@@ -49,7 +49,7 @@
  * Overlaps regions smaller than this will have only a single plane of rays 
slicing the
  * region in half, generating manifolds in a plane.
  */
-#define GRID_GRANULARITY 0.04
+#define TOL 0.1
 
 
 /*
@@ -57,7 +57,8 @@
  * of overlap regions: similar to the one in nirt/usrfrmt.h
  */
 struct overlap {
-    struct application *ap;
+    int index;
+       struct application *ap;
     struct partition *pp;
     struct region *reg1;
     struct region *reg2;
@@ -75,7 +76,8 @@
  * of hit regions, similar to struct hit from raytrace.h
  */
 struct hit_reg {
-    struct application *ap;
+    int index;
+       struct application *ap;
     struct partition *pp;
     const char *reg_name;
     struct soltab *in_stp;

Modified: brlcad/trunk/src/libged/simulate/simulate.c
===================================================================
--- brlcad/trunk/src/libged/simulate/simulate.c 2011-10-09 16:29:28 UTC (rev 
47172)
+++ brlcad/trunk/src/libged/simulate/simulate.c 2011-10-10 00:23:30 UTC (rev 
47173)
@@ -104,6 +104,12 @@
                continue;
            }
 
+           if (BU_STR_EMPTY(dp->d_namep)) {
+               bu_vls_printf(gedp->ged_result_str, "add_regions: Skipping 
\"%s\" due to empty name\n",
+                                 dp->d_namep);
+               continue;
+               }
+
            /* Duplicate the region */
            bu_vls_sprintf(&dp_name_vls, "%s%s", prefix, dp->d_namep);
 
@@ -146,7 +152,13 @@
 
     bu_vls_free(&dp_name_vls);
 
+    if(sim_params->num_bodies == 0){
+       bu_vls_printf(gedp->ged_result_str, "add_regions: ERROR No objects were 
added\n");
+       return GED_ERROR;
+    }
 
+
+
     /* Show list of objects to be added to the sim : keep for debugging as of 
now */
     /* bu_log("add_regions: The following %d regions will participate in the 
sim : \n", sim_params->num_bodies);
        for (current_node = sim_params->head_node; current_node != NULL; 
current_node = current_node->next) {

Modified: brlcad/trunk/src/libged/simulate/simutils.c
===================================================================
--- brlcad/trunk/src/libged/simulate/simutils.c 2011-10-09 16:29:28 UTC (rev 
47172)
+++ brlcad/trunk/src/libged/simulate/simutils.c 2011-10-10 00:23:30 UTC (rev 
47173)
@@ -200,7 +200,7 @@
            unsigned char b)
 {
     char *cmd_args[20];
-    int rv, i, argc = 19;
+    int rv, argc = 19;
     char buffer_str[MAX_FLOATING_POINT_STRLEN];
     char *suffix_reg = "_reg";
     struct bu_vls reg_vls = BU_VLS_INIT_ZERO;
@@ -257,6 +257,7 @@
 
     add_to_comb(gedp, bu_vls_addr(&reg_vls), name);
     apply_material(gedp, bu_vls_addr(&reg_vls), "plastic tr 0.9", r, g, b);
+    apply_color(gedp, bu_vls_addr(&reg_vls), r, g, b);
 
     return GED_OK;
 }
@@ -266,7 +267,7 @@
 arrow(struct ged *gedp, char* name, point_t from, point_t to)
 {
     char *cmd_args[20];
-    int rv, i, argc = 19;
+    int rv, argc = 19;
     char buffer_str[MAX_FLOATING_POINT_STRLEN];
     char *prefix_arrow_line = "arrow_line_";
     char *prefix_arrow_head = "arrow_head_";
@@ -469,6 +470,11 @@
        char buffer_str[MAX_FLOATING_POINT_STRLEN];
        char* cmd_args[28];
 
+       if (kill(gedp, name) != GED_OK) {
+               bu_log("line: ERROR Could not delete existing \"%s\"\n", name);
+               return GED_ERROR;
+       }
+
        cmd_args[0] = bu_strdup("in");
        cmd_args[1] = bu_strdup(name);
        cmd_args[2] = bu_strdup("rpp");
@@ -485,7 +491,7 @@
 
        cmd_args[9] = (char *)0;
 
-       rv = ged_in(gedp, 9, (const char **)cmd_args);
+       rv = ged_in(gedp, argc, (const char **)cmd_args);
        if (rv != GED_OK) {
                bu_log("make_rpp: WARNING Could not insert RPP %s (%f, %f, 
%f):(%f, %f, %f)\n",
                   name, V3ARGS(min), V3ARGS(max));
@@ -505,7 +511,7 @@
 {
     char* cmd_args[28];
     char buffer[MAX_FLOATING_POINT_STRLEN];
-    int rv, i, argc = 27;
+    int rv, argc = 27;
     char *prefix = "bb_";
     char *prefix_reg = "bb_reg_";
     char *prefixed_name, *prefixed_reg_name;

Modified: brlcad/trunk/src/libged/simulate/simutils.h
===================================================================
--- brlcad/trunk/src/libged/simulate/simutils.h 2011-10-09 16:29:28 UTC (rev 
47172)
+++ brlcad/trunk/src/libged/simulate/simutils.h 2011-10-10 00:23:30 UTC (rev 
47173)
@@ -105,6 +105,16 @@
 
 
 /**
+ * Draw a line from,to and color it
+ */
+int
+line(struct ged *gedp, char* name, point_t from, point_t to,
+               unsigned char r,
+           unsigned char g,
+           unsigned char b);
+
+
+/**
  * Draws an arrow from, to using the BOT primitive & TRC
  * Used to draw manifold normals
  * TODO: surely there is a simpler way!

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


------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to