Revision: 41362
http://brlcad.svn.sourceforge.net/brlcad/?rev=41362&view=rev
Author: brlcad
Date: 2010-11-15 22:13:15 +0000 (Mon, 15 Nov 2010)
Log Message:
-----------
move the statics variables out of file scope and into the function that uses
them. reorder functions to avoid forward declarations.
Modified Paths:
--------------
brlcad/trunk/src/libged/solids_on_ray.c
Modified: brlcad/trunk/src/libged/solids_on_ray.c
===================================================================
--- brlcad/trunk/src/libged/solids_on_ray.c 2010-11-15 22:09:50 UTC (rev
41361)
+++ brlcad/trunk/src/libged/solids_on_ray.c 2010-11-15 22:13:15 UTC (rev
41362)
@@ -38,126 +38,6 @@
#include "./ged_private.h"
-static char **ged_skewer_solids(struct ged *gedp, int argc, const char **argv,
fastf_t *ray_orig, fastf_t *ray_dir, int full_path);
-
-static char **solids_on_ray_cmd_vec;
-static int solids_on_ray_cmd_vec_len;
-
-int
-ged_solids_on_ray(struct ged *gedp, int argc, const char *argv[])
-{
- size_t args;
- char **snames;
- int h = 0;
- int v = 0;
- int i; /* Dummy loop index */
- double t;
- double t_in;
- point_t ray_orig;
- vect_t ray_dir;
- point_t extremum[2];
- vect_t unit_H, unit_V;
- static const char *usage = "[h v]";
-
- GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
- GED_CHECK_READ_ONLY(gedp, GED_ERROR);
- GED_CHECK_DRAWABLE(gedp, GED_ERROR);
- GED_CHECK_VIEW(gedp, GED_ERROR);
- GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
-
- /* initialize result */
- bu_vls_trunc(&gedp->ged_result_str, 0);
-
- /* must be wanting help */
- if (argc == 1) {
- bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
- return GED_HELP;
- }
-
- if (argc != 1 && argc != 3) {
- bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
- return GED_ERROR;
- }
-
- if (argc == 3 &&
- (sscanf(argv[1], "%d", &h) != 1 ||
- sscanf(argv[2], "%d", &v) != 1)) {
- bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
- return GED_ERROR;
- }
-
- if ((int)GED_VMIN > h || h > (int)GED_VMAX || (int)GED_VMIN > v || v >
(int)GED_VMAX) {
- bu_vls_printf(&gedp->ged_result_str, "Screen coordinates out of
range\nMust be between +/-2048");
- return GED_ERROR;
- }
-
- VSET(ray_orig, -gedp->ged_gvp->gv_center[MDX],
- -gedp->ged_gvp->gv_center[MDY], -gedp->ged_gvp->gv_center[MDZ]);
- /*
- * Compute bounding box of all objects displayed.
- * Borrowed from size_reset() in chgview.c
- */
- for (i = 0; i < 3; ++i) {
- extremum[0][i] = INFINITY;
- extremum[1][i] = -INFINITY;
- }
-
- VMOVEN(ray_dir, gedp->ged_gvp->gv_rotation + 8, 3);
- VSCALE(ray_dir, ray_dir, -1.0);
- for (i = 0; i < 3; ++i)
- if (NEAR_ZERO(ray_dir[i], 1e-10))
- ray_dir[i] = 0.0;
- if ((ray_orig[X] >= extremum[0][X])
- && (ray_orig[X] <= extremum[1][X])
- && (ray_orig[Y] >= extremum[0][Y])
- && (ray_orig[Y] <= extremum[1][Y])
- && (ray_orig[Z] >= extremum[0][Z])
- && (ray_orig[Z] <= extremum[1][Z]))
- {
- t_in = -INFINITY;
- for (i = 0; i < 6; ++i) {
- if (ray_dir[i%3] == 0)
- continue;
- t = (extremum[i/3][i%3] - ray_orig[i%3]) /
- ray_dir[i%3];
- if ((t < 0) && (t > t_in))
- t_in = t;
- }
- VJOIN1(ray_orig, ray_orig, t_in, ray_dir);
- }
-
- VMOVEN(unit_H, gedp->ged_gvp->gv_model2view, 3);
- VMOVEN(unit_V, gedp->ged_gvp->gv_model2view + 4, 3);
- VJOIN1(ray_orig, ray_orig, h * gedp->ged_gvp->gv_scale * INV_GED_V,
unit_H);
- VJOIN1(ray_orig, ray_orig, v * gedp->ged_gvp->gv_scale * INV_GED_V,
unit_V);
-
- /* allocate space for display top-levels */
- args = 2 + ged_count_tops(gedp);
- solids_on_ray_cmd_vec = bu_calloc(1, sizeof(char *) * args, "alloca
solids_on_ray_cmd_vec");
-
- /*
- * Build a list of all the top-level objects currently displayed
- */
- solids_on_ray_cmd_vec_len = ged_build_tops(gedp,
&solids_on_ray_cmd_vec[0], &solids_on_ray_cmd_vec[args]);
-
- snames = ged_skewer_solids(gedp, solids_on_ray_cmd_vec_len, (const char
**)solids_on_ray_cmd_vec, ray_orig, ray_dir, 1);
-
- bu_free(solids_on_ray_cmd_vec, "free solids_on_ray_cmd_vec");
-
- if (snames == 0) {
- bu_vls_printf(&gedp->ged_result_str, "Error executing
ged_skewer_solids: ");
- return GED_ERROR;
- }
-
- for (i = 0; snames[i] != 0; ++i)
- bu_vls_printf(&gedp->ged_result_str, " %s", snames[i]);
-
- bu_free((genptr_t) snames, "solid names");
-
- return GED_OK;
-}
-
-
/*
* G E D _ N O _ O P
*
@@ -298,6 +178,124 @@
}
+int
+ged_solids_on_ray(struct ged *gedp, int argc, const char *argv[])
+{
+ static char **solids_on_ray_cmd_vec = NULL;
+ static int solids_on_ray_cmd_vec_len = 0;
+
+ size_t args;
+ char **snames;
+ int h = 0;
+ int v = 0;
+ int i; /* Dummy loop index */
+ double t;
+ double t_in;
+ point_t ray_orig;
+ vect_t ray_dir;
+ point_t extremum[2];
+ vect_t unit_H, unit_V;
+ static const char *usage = "[h v]";
+
+ GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
+ GED_CHECK_READ_ONLY(gedp, GED_ERROR);
+ GED_CHECK_DRAWABLE(gedp, GED_ERROR);
+ GED_CHECK_VIEW(gedp, GED_ERROR);
+ GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
+
+ /* initialize result */
+ bu_vls_trunc(&gedp->ged_result_str, 0);
+
+ /* must be wanting help */
+ if (argc == 1) {
+ bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+ return GED_HELP;
+ }
+
+ if (argc != 1 && argc != 3) {
+ bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+ return GED_ERROR;
+ }
+
+ if (argc == 3 &&
+ (sscanf(argv[1], "%d", &h) != 1 ||
+ sscanf(argv[2], "%d", &v) != 1)) {
+ bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+ return GED_ERROR;
+ }
+
+ if ((int)GED_VMIN > h || h > (int)GED_VMAX || (int)GED_VMIN > v || v >
(int)GED_VMAX) {
+ bu_vls_printf(&gedp->ged_result_str, "Screen coordinates out of
range\nMust be between +/-2048");
+ return GED_ERROR;
+ }
+
+ VSET(ray_orig, -gedp->ged_gvp->gv_center[MDX],
+ -gedp->ged_gvp->gv_center[MDY], -gedp->ged_gvp->gv_center[MDZ]);
+ /*
+ * Compute bounding box of all objects displayed.
+ * Borrowed from size_reset() in chgview.c
+ */
+ for (i = 0; i < 3; ++i) {
+ extremum[0][i] = INFINITY;
+ extremum[1][i] = -INFINITY;
+ }
+
+ VMOVEN(ray_dir, gedp->ged_gvp->gv_rotation + 8, 3);
+ VSCALE(ray_dir, ray_dir, -1.0);
+ for (i = 0; i < 3; ++i)
+ if (NEAR_ZERO(ray_dir[i], 1e-10))
+ ray_dir[i] = 0.0;
+ if ((ray_orig[X] >= extremum[0][X])
+ && (ray_orig[X] <= extremum[1][X])
+ && (ray_orig[Y] >= extremum[0][Y])
+ && (ray_orig[Y] <= extremum[1][Y])
+ && (ray_orig[Z] >= extremum[0][Z])
+ && (ray_orig[Z] <= extremum[1][Z]))
+ {
+ t_in = -INFINITY;
+ for (i = 0; i < 6; ++i) {
+ if (ray_dir[i%3] == 0)
+ continue;
+ t = (extremum[i/3][i%3] - ray_orig[i%3]) /
+ ray_dir[i%3];
+ if ((t < 0) && (t > t_in))
+ t_in = t;
+ }
+ VJOIN1(ray_orig, ray_orig, t_in, ray_dir);
+ }
+
+ VMOVEN(unit_H, gedp->ged_gvp->gv_model2view, 3);
+ VMOVEN(unit_V, gedp->ged_gvp->gv_model2view + 4, 3);
+ VJOIN1(ray_orig, ray_orig, h * gedp->ged_gvp->gv_scale * INV_GED_V,
unit_H);
+ VJOIN1(ray_orig, ray_orig, v * gedp->ged_gvp->gv_scale * INV_GED_V,
unit_V);
+
+ /* allocate space for display top-levels */
+ args = 2 + ged_count_tops(gedp);
+ solids_on_ray_cmd_vec = bu_calloc(1, sizeof(char *) * args, "alloca
solids_on_ray_cmd_vec");
+
+ /*
+ * Build a list of all the top-level objects currently displayed
+ */
+ solids_on_ray_cmd_vec_len = ged_build_tops(gedp,
&solids_on_ray_cmd_vec[0], &solids_on_ray_cmd_vec[args]);
+
+ snames = ged_skewer_solids(gedp, solids_on_ray_cmd_vec_len, (const char
**)solids_on_ray_cmd_vec, ray_orig, ray_dir, 1);
+
+ bu_free(solids_on_ray_cmd_vec, "free solids_on_ray_cmd_vec");
+
+ if (snames == 0) {
+ bu_vls_printf(&gedp->ged_result_str, "Error executing
ged_skewer_solids: ");
+ return GED_ERROR;
+ }
+
+ for (i = 0; snames[i] != 0; ++i)
+ bu_vls_printf(&gedp->ged_result_str, " %s", snames[i]);
+
+ bu_free((genptr_t) snames, "solid names");
+
+ return GED_OK;
+}
+
+
/*
* Local Variables:
* tab-width: 8
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Centralized Desktop Delivery: Dell and VMware Reference Architecture
Simplifying enterprise desktop deployment and management using
Dell EqualLogic storage and VMware View: A highly scalable, end-to-end
client virtualization framework. Read more!
http://p.sf.net/sfu/dell-eql-dev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits