00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "common.h"
00038
00039
00040
00041 #include <stdio.h>
00042
00043 #ifdef HAVE_STRING_H
00044 #include <string.h>
00045 #else
00046 #include <strings.h>
00047 #endif
00048
00049 #include "machine.h"
00050 #include "bu.h"
00051 #include "vmath.h"
00052 #include "raytrace.h"
00053 #include "./qray.h"
00054
00055 static void qray_print_fmts(struct dg_obj *dgop, Tcl_Interp *interp);
00056 static void qray_print_vars(struct dg_obj *dgop, Tcl_Interp *interp);
00057 static int qray_get_fmt_index(struct dg_obj *dgop, char c);
00058
00059 static struct dg_qray_color def_qray_odd_color = { 0, 255, 255 };
00060 static struct dg_qray_color def_qray_even_color = { 255, 255, 0 };
00061 static struct dg_qray_color def_qray_void_color = { 255, 0, 255 };
00062 static struct dg_qray_color def_qray_overlap_color = { 255, 255, 255 };
00063
00064 static struct dg_qray_fmt_data def_qray_fmt_data[] = {
00065 {'r', "\"Origin (x y z) = (%.2f %.2f %.2f) (h v d) = (%.2f %.2f %.2f)\\nDirection (x y z) = (%.4f %.4f %.4f) (az el) = (%.2f %.2f)\\n\" x_orig y_orig z_orig h v d_orig x_dir y_dir z_dir a e"},
00066 {'h', "\" Region Name Entry (x y z) LOS Obliq_in\\n\""},
00067 {'p', "\"%-20s (%9.3f %9.3f %9.3f) %8.2f %8.3f\\n\" reg_name x_in y_in z_in los obliq_in"},
00068 {'f', "\"\""},
00069 {'m', "\"You missed the target\\n\""},
00070 {'o', "\"OVERLAP: '%s' and '%s' xyz_in=(%g %g %g) los=%g\\n\" ov_reg1_name ov_reg2_name ov_x_in ov_y_in ov_z_in ov_los"},
00071 {(char)NULL, (char *)NULL}
00072 };
00073
00074 static char qray_syntax[] = "\
00075 qray vars print a list of all variables (i.e. var = val)\n\
00076 qray basename [str] set or get basename for query ray prims\n\
00077 qray effects [t|g|b] set or get effects (i.e. text, graphical or both)\n\
00078 qray echo [0|1] set or get command echo\n\
00079 qray oddcolor [r g b] set or get color of odd partitions\n\
00080 qray evencolor [r g b] set or get color of even partitions\n\
00081 qray voidcolor [r g b] set or get color of void areas\n\
00082 qray overlapcolor [r g b] set or get color of overlap areas\n\
00083 qray fmt [r|h|p|f|m|o [str]] set or get format string(s)\n\
00084 qray script [str] set or get the nirt script string\n\
00085 qray [help] print this help message\n\
00086 ";
00087
00088 static void
00089 qray_print_fmts(struct dg_obj *dgop,
00090 Tcl_Interp *interp)
00091 {
00092 int i;
00093
00094 for (i = 0; dgop->dgo_qray_fmts[i].type != (char)NULL; ++i)
00095 Tcl_AppendResult(interp, bu_vls_addr(&dgop->dgo_qray_fmts[i].fmt),
00096 "\n", (char *)NULL);
00097 }
00098
00099 static void
00100 qray_print_vars(struct dg_obj *dgop,
00101 Tcl_Interp *interp)
00102 {
00103 struct bu_vls vls;
00104
00105 bu_vls_init(&vls);
00106 bu_vls_printf(&vls, "basename = %s\n", bu_vls_addr(&dgop->dgo_qray_basename));
00107 bu_vls_printf(&vls, "script = %s\n", bu_vls_addr(&dgop->dgo_qray_script));
00108 bu_vls_printf(&vls, "effects = %c\n", dgop->dgo_qray_effects);
00109 bu_vls_printf(&vls, "echo = %d\n", dgop->dgo_qray_cmd_echo);
00110 bu_vls_printf(&vls, "oddcolor = %d %d %d\n",
00111 dgop->dgo_qray_odd_color.r, dgop->dgo_qray_odd_color.g, dgop->dgo_qray_odd_color.b);
00112 bu_vls_printf(&vls, "evencolor = %d %d %d\n",
00113 dgop->dgo_qray_even_color.r, dgop->dgo_qray_even_color.g, dgop->dgo_qray_even_color.b);
00114 bu_vls_printf(&vls, "voidcolor = %d %d %d\n",
00115 dgop->dgo_qray_void_color.r, dgop->dgo_qray_void_color.g, dgop->dgo_qray_void_color.b);
00116 bu_vls_printf(&vls, "overlapcolor = %d %d %d\n",
00117 dgop->dgo_qray_overlap_color.r, dgop->dgo_qray_overlap_color.g, dgop->dgo_qray_overlap_color.b);
00118 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00119 bu_vls_free(&vls);
00120
00121 qray_print_fmts(dgop, interp);
00122 }
00123
00124 static int
00125 qray_get_fmt_index(struct dg_obj *dgop,
00126 char c)
00127 {
00128 int i;
00129
00130 for (i = 0; dgop->dgo_qray_fmts[i].type != (char)NULL; ++i)
00131 if (c == dgop->dgo_qray_fmts[i].type)
00132 return i;
00133
00134 return -1;
00135 }
00136
00137 int
00138 dgo_qray_cmd(struct dg_obj *dgop,
00139 Tcl_Interp *interp,
00140 int argc,
00141 char **argv)
00142 {
00143 struct bu_vls vls;
00144
00145 if (6 < argc) {
00146 bu_vls_init(&vls);
00147 bu_vls_printf(&vls, "helplib_alias dgo_qray %s", argv[0]);
00148 Tcl_Eval(interp, bu_vls_addr(&vls));
00149 bu_vls_free(&vls);
00150
00151 return TCL_ERROR;
00152 }
00153
00154
00155 if (argc == 1) {
00156 Tcl_AppendResult(interp, "Usage:\n", qray_syntax, (char *)NULL);
00157 return TCL_OK;
00158 }
00159
00160 if (strcmp(argv[1], "fmt") == 0) {
00161 int i;
00162
00163 if (argc == 2) {
00164 qray_print_fmts(dgop, interp);
00165 return TCL_OK;
00166 } else if (argc == 3) {
00167 if ((i = qray_get_fmt_index(dgop, *argv[2])) < 0) {
00168 Tcl_AppendResult(interp,
00169 "qray: unrecognized format type: '",
00170 argv[2], "'\nUsage:\n", qray_syntax, (char *)NULL);
00171 return TCL_ERROR;
00172 }
00173
00174 Tcl_AppendResult(interp, bu_vls_addr(&dgop->dgo_qray_fmts[i].fmt), (char *)NULL);
00175 return TCL_OK;
00176 } else if (argc == 4) {
00177 if ((i = qray_get_fmt_index(dgop, *argv[2])) < 0) {
00178 Tcl_AppendResult(interp,
00179 "qray: unrecognized format type: '",
00180 argv[2], "'\nUsage:\n", qray_syntax, (char *)NULL);
00181 return TCL_ERROR;
00182 }
00183
00184 bu_vls_trunc(&dgop->dgo_qray_fmts[i].fmt, 0);
00185 bu_vls_printf(&dgop->dgo_qray_fmts[i].fmt, "%s", argv[3]);
00186 return TCL_OK;
00187 }
00188
00189 Tcl_AppendResult(interp,
00190 "The 'qray fmt' command accepts 0, 1, or 2 arguments\n",
00191 (char *)NULL);
00192 return TCL_ERROR;
00193 }
00194
00195 if (strcmp(argv[1], "basename") == 0) {
00196 if (argc == 2) {
00197 Tcl_AppendResult(interp, bu_vls_addr(&dgop->dgo_qray_basename), (char *)NULL);
00198
00199 return TCL_OK;
00200 } else if (argc == 3) {
00201 bu_vls_strcpy(&dgop->dgo_qray_basename, argv[2]);
00202 return TCL_OK;
00203 }
00204
00205 Tcl_AppendResult(interp,
00206 "The 'qray basename' command accepts 0 or 1 argument\n",
00207 (char *)NULL);
00208 return TCL_ERROR;
00209 }
00210
00211 if (strcmp(argv[1], "script") == 0) {
00212 if (argc == 2) {
00213 Tcl_AppendResult(interp, bu_vls_addr(&dgop->dgo_qray_script), (char *)NULL);
00214
00215 return TCL_OK;
00216 } else if (argc == 3) {
00217 bu_vls_strcpy(&dgop->dgo_qray_script, argv[2]);
00218 return TCL_OK;
00219 }
00220
00221 Tcl_AppendResult(interp,
00222 "The 'qray script' command accepts 0 or 1 argument\n",
00223 (char *)NULL);
00224 return TCL_ERROR;
00225 }
00226
00227 if (strcmp(argv[1], "effects") == 0) {
00228 if (argc == 2) {
00229 bu_vls_init(&vls);
00230 bu_vls_printf(&vls, "%c", dgop->dgo_qray_effects);
00231 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00232 bu_vls_free(&vls);
00233
00234 return TCL_OK;
00235 } else if (argc == 3) {
00236 if (*argv[2] != 't' && *argv[2] != 'g' && *argv[2] != 'b') {
00237 bu_vls_init(&vls);
00238 bu_vls_printf(&vls, "qray effects: bad value - %s", argv[2]);
00239 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00240 bu_vls_free(&vls);
00241
00242 return TCL_ERROR;
00243 }
00244
00245 dgop->dgo_qray_effects = *argv[2];
00246
00247 return TCL_OK;
00248 }
00249
00250 Tcl_AppendResult(interp,
00251 "The 'qray effects' command accepts 0 or 1 argument\n",
00252 (char *)NULL);
00253 return TCL_ERROR;
00254 }
00255
00256 if (strcmp(argv[1], "echo") == 0) {
00257 if (argc == 2) {
00258 if (dgop->dgo_qray_cmd_echo)
00259 Tcl_AppendResult(interp, "1", (char *)NULL);
00260 else
00261 Tcl_AppendResult(interp, "0", (char *)NULL);
00262
00263 return TCL_OK;
00264 } else if (argc == 3) {
00265 int ival;
00266
00267 if (sscanf(argv[2], "%d", &ival) < 1) {
00268 bu_vls_init(&vls);
00269 bu_vls_printf(&vls, "qray echo: bad value - %s", argv[2]);
00270 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00271 bu_vls_free(&vls);
00272
00273 return TCL_ERROR;
00274 }
00275
00276 if (ival)
00277 dgop->dgo_qray_cmd_echo = 1;
00278 else
00279 dgop->dgo_qray_cmd_echo = 0;
00280
00281 return TCL_OK;
00282 }
00283
00284 Tcl_AppendResult(interp,
00285 "The 'qray echo' command accepts 0 or 1 argument\n",
00286 (char *)NULL);
00287 return TCL_ERROR;
00288 }
00289
00290 if (strcmp(argv[1], "oddcolor") == 0) {
00291 if (argc == 2) {
00292 bu_vls_init(&vls);
00293 bu_vls_printf(&vls, "%d %d %d",
00294 dgop->dgo_qray_odd_color.r, dgop->dgo_qray_odd_color.g, dgop->dgo_qray_odd_color.b);
00295 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00296 bu_vls_free(&vls);
00297
00298 return TCL_OK;
00299 } else if (argc == 5) {
00300 int r, g, b;
00301
00302 if (sscanf(argv[2], "%d", &r) != 1 ||
00303 sscanf(argv[3], "%d", &g) != 1 ||
00304 sscanf(argv[4], "%d", &b) != 1 ||
00305 r < 0 || g < 0 || b < 0 ||
00306 255 < r || 255 < g || 255 < b){
00307 bu_vls_init(&vls);
00308 bu_vls_printf(&vls, "qray oddcolor %s %s %s - bad value",
00309 argv[2], argv[3], argv[4]);
00310 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00311 bu_vls_free(&vls);
00312 }
00313
00314 dgop->dgo_qray_odd_color.r = r;
00315 dgop->dgo_qray_odd_color.g = g;
00316 dgop->dgo_qray_odd_color.b = b;
00317
00318 return TCL_OK;
00319 }
00320
00321 Tcl_AppendResult(interp,
00322 "The 'qray oddcolor' command accepts 0 or 3 arguments\n",
00323 (char *)NULL);
00324 return TCL_ERROR;
00325 }
00326
00327 if (strcmp(argv[1], "evencolor") == 0) {
00328 if (argc == 2) {
00329 bu_vls_init(&vls);
00330 bu_vls_printf(&vls, "%d %d %d",
00331 dgop->dgo_qray_even_color.r, dgop->dgo_qray_even_color.g, dgop->dgo_qray_even_color.b);
00332 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00333 bu_vls_free(&vls);
00334
00335 return TCL_OK;
00336 } else if (argc == 5) {
00337 int r, g, b;
00338
00339 if (sscanf(argv[2], "%d", &r) != 1 ||
00340 sscanf(argv[3], "%d", &g) != 1 ||
00341 sscanf(argv[4], "%d", &b) != 1 ||
00342 r < 0 || g < 0 || b < 0 ||
00343 255 < r || 255 < g || 255 < b) {
00344 bu_vls_init(&vls);
00345 bu_vls_printf(&vls, "qray evencolor %s %s %s - bad value",
00346 argv[2], argv[3], argv[4]);
00347 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00348 bu_vls_free(&vls);
00349 }
00350
00351 dgop->dgo_qray_even_color.r = r;
00352 dgop->dgo_qray_even_color.g = g;
00353 dgop->dgo_qray_even_color.b = b;
00354
00355 return TCL_OK;
00356 }
00357
00358 Tcl_AppendResult(interp,
00359 "The 'qray evencolor' command accepts 0 or 3 arguments\n",
00360 (char *)NULL);
00361 return TCL_ERROR;
00362 }
00363
00364 if (strcmp(argv[1], "voidcolor") == 0) {
00365 if (argc == 2) {
00366 bu_vls_init(&vls);
00367 bu_vls_printf(&vls, "%d %d %d",
00368 dgop->dgo_qray_void_color.r, dgop->dgo_qray_void_color.g, dgop->dgo_qray_void_color.b);
00369 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00370 bu_vls_free(&vls);
00371
00372 return TCL_OK;
00373 } else if (argc == 5) {
00374 int r, g, b;
00375
00376 if (sscanf(argv[2], "%d", &r) != 1 ||
00377 sscanf(argv[3], "%d", &g) != 1 ||
00378 sscanf(argv[4], "%d", &b) != 1 ||
00379 r < 0 || g < 0 || b < 0 ||
00380 255 < r || 255 < g || 255 < b) {
00381 bu_vls_init(&vls);
00382 bu_vls_printf(&vls, "qray voidcolor %s %s %s - bad value",
00383 argv[2], argv[3], argv[4]);
00384 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00385 bu_vls_free(&vls);
00386 }
00387
00388 dgop->dgo_qray_void_color.r = r;
00389 dgop->dgo_qray_void_color.g = g;
00390 dgop->dgo_qray_void_color.b = b;
00391
00392 return TCL_OK;
00393 }
00394
00395 Tcl_AppendResult(interp,
00396 "The 'qray voidcolor' command accepts 0 or 3 arguments\n",
00397 (char *)NULL);
00398 return TCL_ERROR;
00399 }
00400
00401 if (strcmp(argv[1], "overlapcolor") == 0) {
00402 if (argc == 2) {
00403 bu_vls_init(&vls);
00404 bu_vls_printf(&vls, "%d %d %d",
00405 dgop->dgo_qray_overlap_color.r, dgop->dgo_qray_overlap_color.g, dgop->dgo_qray_overlap_color.b);
00406 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00407 bu_vls_free(&vls);
00408
00409 return TCL_OK;
00410 } else if (argc == 5) {
00411 int r, g, b;
00412
00413 if (sscanf(argv[2], "%d", &r) != 1 ||
00414 sscanf(argv[3], "%d", &g) != 1 ||
00415 sscanf(argv[4], "%d", &b) != 1 ||
00416 r < 0 || g < 0 || b < 0 ||
00417 255 < r || 255 < g || 255 < b){
00418 bu_vls_init(&vls);
00419 bu_vls_printf(&vls, "qray overlapcolor %s %s %s - bad value",
00420 argv[2], argv[3], argv[4]);
00421 Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL);
00422 bu_vls_free(&vls);
00423 }
00424
00425 dgop->dgo_qray_overlap_color.r = r;
00426 dgop->dgo_qray_overlap_color.g = g;
00427 dgop->dgo_qray_overlap_color.b = b;
00428
00429 return TCL_OK;
00430 }
00431
00432 Tcl_AppendResult(interp,
00433 "The 'qray overlapcolor' command accepts 0 or 3 arguments\n",
00434 (char *)NULL);
00435 return TCL_ERROR;
00436 }
00437
00438 if (strcmp(argv[1], "vars") == 0) {
00439 qray_print_vars(dgop, interp);
00440 return TCL_OK;
00441 }
00442
00443 if (strcmp(argv[1], "help") == 0) {
00444 Tcl_AppendResult(interp, "Usage:\n", qray_syntax, (char *)NULL);
00445 return TCL_OK;
00446 }
00447
00448 Tcl_AppendResult(interp, "qray: unrecognized command: '",
00449 argv[1], "'\nUsage:\n", qray_syntax, (char *)NULL);
00450 return TCL_ERROR;
00451 }
00452
00453 void
00454 dgo_init_qray(struct dg_obj *dgop)
00455 {
00456 register int i;
00457 register int n = 0;
00458 struct dg_qray_fmt_data *qfdp;
00459
00460 bu_vls_init(&dgop->dgo_qray_basename);
00461 bu_vls_strcpy(&dgop->dgo_qray_basename, DG_QRAY_BASENAME);
00462 bu_vls_init(&dgop->dgo_qray_script);
00463
00464 dgop->dgo_qray_effects = 'b';
00465 dgop->dgo_qray_cmd_echo = 0;
00466 dgop->dgo_qray_odd_color = def_qray_odd_color;
00467 dgop->dgo_qray_even_color = def_qray_even_color;
00468 dgop->dgo_qray_void_color = def_qray_void_color;
00469 dgop->dgo_qray_overlap_color = def_qray_overlap_color;
00470
00471
00472 for(qfdp = def_qray_fmt_data; qfdp->fmt != (char *)NULL; ++qfdp)
00473 ++n;
00474
00475 dgop->dgo_qray_fmts = (struct dg_qray_fmt *)bu_malloc(sizeof(struct dg_qray_fmt) * n + 1, "qray_fmts");
00476
00477 for (i = 0; i < n; ++i) {
00478 dgop->dgo_qray_fmts[i].type = def_qray_fmt_data[i].type;
00479 bu_vls_init(&dgop->dgo_qray_fmts[i].fmt);
00480 bu_vls_strcpy(&dgop->dgo_qray_fmts[i].fmt, def_qray_fmt_data[i].fmt);
00481 }
00482
00483 dgop->dgo_qray_fmts[i].type = (char)NULL;
00484 }
00485
00486 void
00487 dgo_free_qray(struct dg_obj *dgop)
00488 {
00489 register int i;
00490
00491 bu_vls_free(&dgop->dgo_qray_basename);
00492 bu_vls_free(&dgop->dgo_qray_script);
00493 for (i = 0; dgop->dgo_qray_fmts[i].type != (char)NULL; ++i)
00494 bu_vls_free(&dgop->dgo_qray_fmts[i].fmt);
00495 bu_free(dgop->dgo_qray_fmts, "dgo_free_qray");
00496 }
00497
00498 void
00499 dgo_qray_data_to_vlist(struct dg_obj *dgop,
00500 struct bn_vlblock *vbp,
00501 struct dg_qray_dataList *headp,
00502 vect_t dir,
00503 int do_overlaps)
00504 {
00505 register int i = 1;
00506 register struct bu_list *vhead;
00507 register struct dg_qray_dataList *ndlp;
00508 vect_t in_pt, out_pt;
00509 vect_t last_out_pt;
00510
00511 for (BU_LIST_FOR(ndlp, dg_qray_dataList, &headp->l)) {
00512 if (do_overlaps)
00513 vhead = rt_vlblock_find(vbp,
00514 dgop->dgo_qray_overlap_color.r,
00515 dgop->dgo_qray_overlap_color.g,
00516 dgop->dgo_qray_overlap_color.b);
00517 else if(i % 2)
00518 vhead = rt_vlblock_find(vbp,
00519 dgop->dgo_qray_odd_color.r,
00520 dgop->dgo_qray_odd_color.g,
00521 dgop->dgo_qray_odd_color.b);
00522 else
00523 vhead = rt_vlblock_find(vbp,
00524 dgop->dgo_qray_even_color.r,
00525 dgop->dgo_qray_even_color.g,
00526 dgop->dgo_qray_even_color.b);
00527
00528 VSET(in_pt, ndlp->x_in, ndlp->y_in, ndlp->z_in);
00529 VJOIN1(out_pt, in_pt, ndlp->los, dir);
00530 VSCALE(in_pt, in_pt, dgop->dgo_wdbp->dbip->dbi_local2base);
00531 VSCALE(out_pt, out_pt, dgop->dgo_wdbp->dbip->dbi_local2base);
00532 RT_ADD_VLIST( vhead, in_pt, RT_VLIST_LINE_MOVE );
00533 RT_ADD_VLIST( vhead, out_pt, RT_VLIST_LINE_DRAW );
00534
00535 if (!do_overlaps && i > 1 && !VAPPROXEQUAL(last_out_pt,in_pt,SQRT_SMALL_FASTF)) {
00536 vhead = rt_vlblock_find(vbp,
00537 dgop->dgo_qray_void_color.r,
00538 dgop->dgo_qray_void_color.g,
00539 dgop->dgo_qray_void_color.b);
00540 RT_ADD_VLIST( vhead, last_out_pt, RT_VLIST_LINE_MOVE );
00541 RT_ADD_VLIST( vhead, in_pt, RT_VLIST_LINE_DRAW );
00542 }
00543
00544 VMOVE(last_out_pt, out_pt);
00545 ++i;
00546 }
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558