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(®_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(®_vls), + ovp->in_point, + ovp->out_point, + 0, 210, 0); + + add_to_comb(gedp, sim_params->sim_comb_name, bu_vls_addr(®_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(®_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(®_vls), + hrp->in_point, + hrp->out_point, + 0, 210, 0); + + add_to_comb(gedp, sim_params->sim_comb_name, bu_vls_addr(®_vls)); + hrp = hrp->forw; + } + } + + bu_vls_free(®_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(®_vls), name); apply_material(gedp, bu_vls_addr(®_vls), "plastic tr 0.9", r, g, b); + apply_color(gedp, bu_vls_addr(®_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