Revision: 75271
http://sourceforge.net/p/brlcad/code/75271
Author: starseeker
Date: 2020-04-06 15:05:36 +0000 (Mon, 06 Apr 2020)
Log Message:
-----------
Unless I'm missing something, libged's view_obj isn't used or exposed anywhere.
Modified Paths:
--------------
brlcad/trunk/src/libged/CMakeLists.txt
Removed Paths:
-------------
brlcad/trunk/src/libged/view_obj.c
Modified: brlcad/trunk/src/libged/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/libged/CMakeLists.txt 2020-04-06 14:42:25 UTC (rev
75270)
+++ brlcad/trunk/src/libged/CMakeLists.txt 2020-04-06 15:05:36 UTC (rev
75271)
@@ -349,7 +349,6 @@
view2model.c
view2model_lu.c
view2model_vec.c
- view_obj.c
viewdir.c
voxelize.c
vrot.c
Deleted: brlcad/trunk/src/libged/view_obj.c
===================================================================
--- brlcad/trunk/src/libged/view_obj.c 2020-04-06 14:42:25 UTC (rev 75270)
+++ brlcad/trunk/src/libged/view_obj.c 2020-04-06 15:05:36 UTC (rev 75271)
@@ -1,2805 +0,0 @@
-/* V I E W _ O B J . C
- * BRL-CAD
- *
- * Copyright (c) 1997-2020 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- */
-/** @addtogroup libged */
-/** @{ */
-/** @file libged/view_obj.c
- *
- * A view object contains the attributes and methods for controlling
- * viewing transformations.
- *
- */
-/** @} */
-
-#include "common.h"
-
-#include <string.h>
-#include <math.h>
-
-#include "tcl.h"
-
-
-#include "bn.h"
-#include "bu/cmd.h"
-#include "bu/units.h"
-#include "dm/bview.h"
-#include "vmath.h"
-#include "ged.h"
-
-#define GED_VIEW_OBJ_NULL ((struct view_obj *)0)
-
-
-/* FIXME: this should not exist. pass from application code, not
- * library global.
- */
-struct view_obj HeadViewObj; /* head of view object list */
-
-
-static void
-vo_deleteProc(void *clientData)
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- /* free observers */
- bu_observer_free(&vop->vo_observers);
-
- bu_vls_free(&vop->vo_name);
- BU_LIST_DEQUEUE(&vop->l);
- BU_PUT(vop, struct view_obj);
-}
-
-HIDDEN void
-_vo_eval(void *context, const char *cmd) {
- Tcl_Interp *interp = (Tcl_Interp *)context;
- Tcl_Eval(interp, cmd);
-}
-
-void
-vo_update(struct view_obj *vop,
- int oflag)
-{
- vect_t work, work1;
- vect_t temp, temp1;
-
- /* set up the view matrix */
- bn_mat_mul(vop->vo_model2view, vop->vo_rotation, vop->vo_center);
- vop->vo_model2view[15] = vop->vo_scale;
-
- /* XXX validation needs to occur before here to make sure we're
- * not attempting to invert a singular matrix.
- */
- bn_mat_inv(vop->vo_view2model, vop->vo_model2view);
-
- /* Find current azimuth, elevation, and twist angles */
- VSET(work, 0.0, 0.0, 1.0); /* view z-direction */
- MAT4X3VEC(temp, vop->vo_view2model, work);
- VSET(work1, 1.0, 0.0, 0.0); /* view x-direction */
- MAT4X3VEC(temp1, vop->vo_view2model, work1);
-
- /* calculate angles using accuracy of 0.005, since display
- * shows 2 digits right of decimal point */
- bn_aet_vec(&vop->vo_aet[0],
- &vop->vo_aet[1],
- &vop->vo_aet[2],
- temp, temp1, (fastf_t)0.005);
-
- /* Force azimuth range to be [0, 360] */
- if ((NEAR_EQUAL(vop->vo_aet[1], 90.0, (fastf_t)0.005) ||
- NEAR_EQUAL(vop->vo_aet[1], -90.0, (fastf_t)0.005)) &&
- vop->vo_aet[0] < 0 &&
- !NEAR_ZERO(vop->vo_aet[0], (fastf_t)0.005))
- vop->vo_aet[0] += 360.0;
- else if (NEAR_ZERO(vop->vo_aet[0], (fastf_t)0.005))
- vop->vo_aet[0] = 0.0;
-
- /* apply the perspective angle to model2view */
- bn_mat_mul(vop->vo_pmodel2view, vop->vo_pmat, vop->vo_model2view);
-
- if (vop->vo_callback)
- (*vop->vo_callback)(vop->vo_clientData, vop);
- else if (oflag)
- bu_observer_notify((void *)vop->interp, &vop->vo_observers,
bu_vls_addr(&vop->vo_name), &(_vo_eval));
-}
-
-
-void
-vo_mat_aet(struct view_obj *vop)
-{
- mat_t tmat;
- fastf_t twist;
- fastf_t c_twist;
- fastf_t s_twist;
-
- bn_mat_angles(vop->vo_rotation,
- 270.0 + vop->vo_aet[1],
- 0.0,
- 270.0 - vop->vo_aet[0]);
-
- twist = -vop->vo_aet[2] * DEG2RAD;
- c_twist = cos(twist);
- s_twist = sin(twist);
- bn_mat_zrot(tmat, s_twist, c_twist);
- bn_mat_mul2(tmat, vop->vo_rotation);
-}
-
-
-/*
- * Create an command/object named "oname".
- */
-struct view_obj *
-vo_open_cmd(const char *oname)
-{
- struct view_obj *vop;
-
- BU_GET(vop, struct view_obj);
-
- /* initialize view_obj */
- bu_vls_init(&vop->vo_name);
- bu_vls_strcpy(&vop->vo_name, oname);
- vop->vo_scale = 1.0;
- vop->vo_size = 2.0 * vop->vo_scale;
- vop->vo_invSize = 1.0 / vop->vo_size;
- vop->vo_local2base = 1.0; /* default units - mm */
- vop->vo_base2local = 1.0; /* default units - mm */
- VSET(vop->vo_eye_pos, 0.0, 0.0, 1.0);
- MAT_IDN(vop->vo_rotation);
- MAT_IDN(vop->vo_center);
- VSETALL(vop->vo_keypoint, 0.0);
- vop->vo_coord = 'v';
- vop->vo_rotate_about = 'v';
- vo_update(vop, 0);
- vop->vo_callback = (void (*)())0;
- vop->vo_eval = (void (*)(void *, const char *))0;
-
- /* append to list of view_obj's */
- BU_LIST_APPEND(&HeadViewObj.l, &vop->l);
-
- return vop;
-}
-
-
-/****************** View Object Methods ********************/
-
-
-void
-vo_size(struct view_obj *vop,
- fastf_t size)
-{
- vop->vo_size = vop->vo_local2base * size;
- if (vop->vo_size < SQRT_SMALL_FASTF)
- vop->vo_size = SQRT_SMALL_FASTF;
- if (vop->vo_size < RT_MINVIEWSIZE)
- vop->vo_size = RT_MINVIEWSIZE;
- vop->vo_invSize = 1.0 / vop->vo_size;
- vop->vo_scale = 0.5 * vop->vo_size;
- vo_update(vop, 1);
-}
-
-
-int
-vo_size_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* intentionally double for scan */
- double size;
-
- /* get view size */
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%g", vop->vo_size * vop->vo_base2local);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* set view size */
- if (argc == 2) {
- if (sscanf(argv[1], "%lf", &size) != 1 || size < SMALL_FASTF) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "bad size - ", argv[1],
(char *)NULL);
- return TCL_ERROR;
- }
-
- vo_size(vop, size);
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_size %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get or set the view size.
- *
- * Usage:
- * procname size [s]
- */
-static int
-vo_size_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_size_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_invSize_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%g", vop->vo_invSize * vop->vo_base2local);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_invSize %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get the inverse view size.
- *
- * Usage:
- * procname
- */
-static int
-vo_invSize_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_invSize_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_aet_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
- vect_t aet;
- int iflag = 0;
-
- if (argc == 1) {
- /* get aet */
- bu_vls_init(&vls);
- bn_encode_vect(&vls, vop->vo_aet, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* Check for -i option */
- if (argv[1][0] == '-' && argv[1][1] == 'i') {
- iflag = 1; /* treat arguments as incremental values */
- ++argv;
- --argc;
- }
-
- if (argc == 2) {
- /* set aet */
- int n;
-
- if ((n = bn_decode_vect(aet, argv[1])) == 2)
- aet[2] = 0;
- else if (n != 3)
- goto bad;
-
- if (iflag) {
- VADD2(vop->vo_aet, vop->vo_aet, aet);
- } else {
- VMOVE(vop->vo_aet, aet);
- }
- vo_mat_aet(vop);
- vo_update(vop, 1);
-
- return TCL_OK;
- }
-
- if (argc == 3 || argc == 4) {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_aet: bad azimuth -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_aet: bad elevation
- ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (argc == 4) {
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_aet: bad twist
- ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
- } else
- scan[Z] = 0.0;
-
- /* convert double to fastf_t */
- VMOVE(aet, scan);
-
- if (iflag) {
- VADD2(vop->vo_aet, vop->vo_aet, aet);
- } else {
- VMOVE(vop->vo_aet, aet);
- }
- vo_mat_aet(vop);
- vo_update(vop, 1);
-
- return TCL_OK;
- }
-
-bad:
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_aet %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get or set the azimuth, elevation and twist.
- *
- * Usage:
- * procname ae [[-i] az el [tw]]
- */
-static int
-vo_aet_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_aet_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_rmat_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
- mat_t rotation;
-
- if (argc == 1) {
- /* get rotation matrix */
- bu_vls_init(&vls);
- bn_encode_mat(&vls, vop->vo_rotation, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- } else if (argc == 2) {
- /* set rotation matrix */
- if (bn_decode_mat(rotation, argv[1]) != 16)
- return TCL_ERROR;
-
- MAT_COPY(vop->vo_rotation, rotation);
- vo_update(vop, 1);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_rmat %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get or set the rotation matrix.
- *
- * Usage:
- * procname
- */
-static int
-vo_rmat_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_rmat_cmd(vop, argc-1, argv+1);
-}
-
-
-void
-vo_center(struct view_obj *vop,
- point_t center)
-{
- VSCALE(center, center, vop->vo_local2base);
- MAT_DELTAS_VEC_NEG(vop->vo_center, center);
- vo_update(vop, 1);
-}
-
-
-int
-vo_center_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- point_t center;
- struct bu_vls vls;
-
-
- /* get view center */
- if (argc == 1) {
- MAT_DELTAS_GET_NEG(center, vop->vo_center);
- VSCALE(center, center, vop->vo_base2local);
- bu_vls_init(&vls);
- bn_encode_vect(&vls, center, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* set view center */
- if (argc == 2 || argc == 4) {
- if (argc == 2) {
- if (bn_decode_vect(center, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_center: bad X
value - ", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_center: bad Y
value - ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_center: bad Z
value - ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(center, scan);
- }
-
- vo_center(vop, center);
- return TCL_OK;
- }
-
-bad:
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_center %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get or set the view center.
- *
- * Usage:
- * procname
- */
-static int
-vo_center_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_center_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_model2view_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- if (argc == 1) {
- bu_vls_init(&vls);
- bn_encode_mat(&vls, vop->vo_model2view, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_model2view %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get the model2view matrix.
- *
- * Usage:
- * procname
- */
-static int
-vo_model2view_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_model2view_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_pmodel2view_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- if (argc == 1) {
- bu_vls_init(&vls);
- bn_encode_mat(&vls, vop->vo_pmodel2view, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_pmodel2view %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get the pmodel2view matrix.
- *
- * Usage:
- * procname pmodel2view
- */
-static int
-vo_pmodel2view_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_pmodel2view_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_view2model_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- if (argc == 1) {
- bu_vls_init(&vls);
- bn_encode_mat(&vls, vop->vo_view2model, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_view2model %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Usage:
- * procname view2model
- */
-static int
-vo_view2model_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_view2model_cmd(vop, argc-1, argv+1);
-}
-
-int
-vo_perspective_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* intentionally double for scan */
- double perspective;
-
- /* get the perspective angle */
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%g", vop->vo_perspective);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* set the perspective angle */
- if (argc == 2) {
- if (sscanf(argv[1], "%lf", &perspective) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "bad perspective angle
- ",
- argv[1], (char *)NULL);
- return TCL_ERROR;
- }
-
- vop->vo_perspective = perspective;
-
- /* This way works, with reasonable Z-clipping */
- persp_mat(vop->vo_pmat, vop->vo_perspective,
- 1.0, 0.01, 1.0e10, 1.0);
- vo_update(vop, 1);
-
- return TCL_OK;
- }
-
- /* Compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_perspective %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get/set the perspective angle.
- *
- * Usage:
- * procname perspective [angle]
- */
-static int
-vo_perspective_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_perspective_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_pmat_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- if (argc == 1) {
- bu_vls_init(&vls);
- bn_encode_mat(&vls, vop->vo_pmat, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_pmat %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Get the perspective matrix.
- *
- * Usage:
- * procname pmat
- */
-static int
-vo_pmat_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_pmat_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_eye_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- point_t eye_model;
- vect_t xlate;
- vect_t new_cent;
- struct bu_vls vls;
-
- /* get eye */
- if (argc == 1) {
- point_t eye;
-
- /* calculate eye point */
- VSET(xlate, 0.0, 0.0, 1.0);
- MAT4X3PNT(eye, vop->vo_view2model, xlate);
- VSCALE(eye, eye, vop->vo_base2local);
-
- bu_vls_init(&vls);
- bn_encode_vect(&vls, eye, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(eye_model, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye: bad Z value -
", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(eye_model, scan);
- }
-
- VSCALE(eye_model, eye_model, vop->vo_local2base);
-
- /* First step: put eye at view center (view 0, 0, 0) */
- MAT_DELTAS_VEC_NEG(vop->vo_center, eye_model);
- vo_update(vop, 0);
-
- /* Second step: put eye at view 0, 0, 1.
- * For eye to be at 0, 0, 1, the old 0, 0, -1 needs to become 0, 0, 0.
- */
- VSET(xlate, 0.0, 0.0, -1.0); /* correction factor */
- MAT4X3PNT(new_cent, vop->vo_view2model, xlate);
- MAT_DELTAS_VEC_NEG(vop->vo_center, new_cent);
- vo_update(vop, 1);
-
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_eye %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Get/set the eye point.
- *
- * Usage:
- * procname eye [eye_point]
- */
-static int
-vo_eye_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_eye_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_eye_pos_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- vect_t eye_pos;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(eye_pos, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye_pos: bad X
value - ", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye_pos: bad Y
value - ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_eye_pos: bad Z
value - ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(eye_pos, scan);
- }
-
- VSCALE(eye_pos, eye_pos, vop->vo_local2base);
- VMOVE(vop->vo_eye_pos, eye_pos);
-
- /* update perspective matrix */
- mike_persp_mat(vop->vo_pmat, vop->vo_eye_pos);
-
- /* update all other view related matrices */
- vo_update(vop, 1);
-
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_eye_pos %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Set the eye position.
- *
- * Usage:
- * procname eye_pos pos
- */
-static int
-vo_eye_pos_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_eye_pos_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_lookat_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- point_t look;
- point_t eye;
- point_t tmp;
- point_t new_center;
- vect_t dir;
- fastf_t new_az, new_el;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(look, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_lookat: bad X value
- ", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_lookat: bad Y value
- ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_lookat: bad Z value
- ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(look, scan);
- }
-
- VSCALE(look, look, vop->vo_local2base);
-
- VSET(tmp, 0.0, 0.0, 1.0);
- MAT4X3PNT(eye, vop->vo_view2model, tmp);
-
- VSUB2(dir, eye, look);
- VUNITIZE(dir);
- bn_ae_vec(&new_az, &new_el, dir);
-
- VSET(vop->vo_aet, new_az, new_el, vop->vo_aet[Z]);
- vo_mat_aet(vop);
-
- VJOIN1(new_center, eye, -vop->vo_scale, dir);
- MAT_DELTAS_VEC_NEG(vop->vo_center, new_center);
-
- vo_update(vop, 1);
-
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_lookat %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Set look-at point.
- *
- * Usage:
- * procname lookat lookat_point
- */
-static int
-vo_lookat_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_lookat_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_orientation_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- quat_t quat;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 5)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_quat(quat, argv[1]) != 4)
- goto bad;
- } else {
- int i;
-
- for (i = 1; i < 5; ++i) {
- double scan;
- if (sscanf(argv[i], "%lf", &scan) != 1)
- goto bad;
- quat[i-1] = scan;
- }
- }
-
- quat_quat2mat(vop->vo_rotation, quat);
- vo_update(vop, 1);
-
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_orient %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Usage:
- * procname orient quat
- */
-static int
-vo_orientation_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_orientation_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_zoom(struct view_obj *vop,
- fastf_t sf)
-{
- if (sf <= SMALL_FASTF || INFINITY < sf) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_zoom - scale factor out
of range\n", (char *)0);
- return TCL_ERROR;
- }
-
- vop->vo_scale /= sf;
- if (vop->vo_scale < RT_MINVIEWSCALE)
- vop->vo_scale = RT_MINVIEWSCALE;
- vop->vo_size = 2.0 * vop->vo_scale;
- vop->vo_invSize = 1.0 / vop->vo_size;
- vo_update(vop, 1);
-
- return TCL_OK;
-}
-
-
-int
-vo_zoom_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- double sf;
-
- if (argc != 2) {
- struct bu_vls vls;
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_zoom %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
- }
-
- if (sscanf(argv[1], "%lf", &sf) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "bad zoom value - ",
argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- return vo_zoom(vop, sf);
-}
-
-
-/*
- * Usage:
- * procname zoom scale_factor
- */
-static int
-vo_zoom_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_zoom_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_units_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* get units */
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%s", bu_units_string(vop->vo_local2base));
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
- /* set units */
- if (argc == 2) {
- double uval;
-
- uval = bu_units_conversion(argv[1]);
- if (ZERO(uval)) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "unrecognized unit type - %s\n", argv[1]);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls),
(char *)NULL);
- bu_vls_free(&vls);
-
- return TCL_ERROR;
- }
-
- vop->vo_local2base = uval;
- vop->vo_base2local = 1.0 / vop->vo_local2base;
-
- return TCL_OK;
- }
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_units %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Set/get local units.
- *
- * Usage:
- * procname units [unit_spec]
- */
-static int
-vo_units_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_units_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_base2local_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- bu_vls_init(&vls);
-
- if (argc != 1) {
- bu_vls_printf(&vls, "helplib_alias vo_base2local %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
- }
-
- bu_vls_printf(&vls, "%g", vop->vo_base2local);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
-}
-
-
-/*
- * Get base2local conversion factor.
- *
- * Usage:
- * procname base2local
- */
-static int
-vo_base2local_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_base2local_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_local2base_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- bu_vls_init(&vls);
-
- if (argc != 1) {
- bu_vls_printf(&vls, "helplib_alias vo_local2base %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
- }
-
- bu_vls_printf(&vls, "%g", vop->vo_local2base);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
-}
-
-
-/*
- * Get local2base conversion factor.
- *
- * Usage:
- * procname local2base
- */
-static int
-vo_local2base_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_local2base_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_rot(struct view_obj *vop,
- char coord,
- char rotate_about,
- mat_t rmat,
- int (*func)())
-{
- mat_t temp1, temp2;
-
- if (func != (int (*)())0)
- return (*func)(vop, coord, rotate_about, rmat);
-
- switch (coord) {
- case 'm':
- /* transform model rotations into view rotations */
- bn_mat_inv(temp1, vop->vo_rotation);
- bn_mat_mul(temp2, vop->vo_rotation, rmat);
- bn_mat_mul(rmat, temp2, temp1);
- break;
- case 'v':
- default:
- break;
- }
-
- /* Calculate new view center */
- if (rotate_about != 'v') {
- point_t rot_pt;
- point_t new_origin;
- mat_t viewchg, viewchginv;
- point_t new_cent_view;
- point_t new_cent_model;
-
- switch (rotate_about) {
- case 'e':
- VSET(rot_pt, 0.0, 0.0, 1.0);
- break;
- case 'k':
- MAT4X3PNT(rot_pt, vop->vo_model2view, vop->vo_keypoint);
- break;
- case 'm':
- /* rotate around model center (0, 0, 0) */
- VSET(new_origin, 0.0, 0.0, 0.0);
- MAT4X3PNT(rot_pt, vop->vo_model2view, new_origin);
- break;
- default: {
- struct bu_vls vls;
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "vo_rot_tcl: bad rotate_about - %c\n",
rotate_about);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls),
(char *)0);
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
- }
-
- bn_mat_xform_about_pnt(viewchg, rmat, rot_pt);
- bn_mat_inv(viewchginv, viewchg);
-
- /* Convert origin in new (viewchg) coords back to old view coords */
- VSET(new_origin, 0.0, 0.0, 0.0);
- MAT4X3PNT(new_cent_view, viewchginv, new_origin);
- MAT4X3PNT(new_cent_model, vop->vo_view2model, new_cent_view);
- MAT_DELTAS_VEC_NEG(vop->vo_center, new_cent_model);
- }
-
- /* pure rotation */
- bn_mat_mul2(rmat, vop->vo_rotation);
- vo_update(vop, 1);
-
- return TCL_OK;
-}
-
-
-int
-vo_rot_cmd(struct view_obj *vop,
- int argc,
- const char *argv[],
- int (*func)())
-{
- vect_t rvec;
- mat_t rmat;
- char coord = vop->vo_coord;
- struct bu_vls vls;
-
- if (argc < 2 || 5 < argc)
- goto bad;
-
- /* process coord flag */
- if (argv[1][0] == '-' && (argv[1][1] == 'v' || argv[1][1] == 'm') &&
argv[1][2] == '\0') {
- coord = argv[1][1];
- --argc;
- ++argv;
- }
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(rvec, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_rot: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_rot: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_rot: bad Z value -
", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(rvec, scan);
- }
-
- VSCALE(rvec, rvec, -1.0);
- bn_mat_angles(rmat, rvec[X], rvec[Y], rvec[Z]);
-
- return vo_rot(vop, coord, vop->vo_rotate_about, rmat, func);
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_rot %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Rotate the view according to xyz.
- *
- * Usage:
- * procname rot [-v|-m] xyz
- */
-static int
-vo_rot_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_rot_cmd(vop, argc-1, argv+1, (int (*)())0);
-}
-
-
-int
-vo_tra(struct view_obj *vop,
- char coord,
- vect_t tvec,
- int (*func)())
-{
- point_t delta;
- point_t work;
- point_t vc, nvc;
-
- if (func != (int (*)())0)
- return (*func)(vop, coord, tvec);
-
- switch (coord) {
- case 'm':
- VSCALE(delta, tvec, vop->vo_local2base);
- MAT_DELTAS_GET_NEG(vc, vop->vo_center);
- break;
- case 'v':
- default:
- VSCALE(tvec, tvec, -2.0*vop->vo_local2base*vop->vo_invSize);
- MAT4X3PNT(work, vop->vo_view2model, tvec);
- MAT_DELTAS_GET_NEG(vc, vop->vo_center);
- VSUB2(delta, work, vc);
- break;
- }
-
- VSUB2(nvc, vc, delta);
- MAT_DELTAS_VEC_NEG(vop->vo_center, nvc);
- vo_update(vop, 1);
-
- return TCL_OK;
-}
-
-
-int
-vo_tra_cmd(struct view_obj *vop,
- int argc,
- const char *argv[],
- int (*func)())
-{
- vect_t tvec;
- char coord = vop->vo_coord;
- struct bu_vls vls;
-
- if (argc < 2 || 5 < argc)
- goto bad;
-
- /* process coord flag */
- if (argv[1][0] == '-' && (argv[1][1] == 'v' || argv[1][1] == 'm') &&
argv[1][2] == '\0') {
- coord = argv[1][1];
- --argc;
- ++argv;
- }
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(tvec, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_tra: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_tra: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_tra: bad Z value -
", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(tvec, scan);
- }
-
- return vo_tra(vop, coord, tvec, func);
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_tra %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Translate the view according to xyz.
- *
- * Usage:
- * procname tra [-v|-m] xyz
- */
-static int
-vo_tra_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_tra_cmd(vop, argc-1, argv+1, (int (*)())0);
-}
-
-
-int
-vo_slew(struct view_obj *vop,
- vect_t svec)
-{
- point_t model_center;
-
- MAT4X3PNT(model_center, vop->vo_view2model, svec);
- MAT_DELTAS_VEC_NEG(vop->vo_center, model_center);
- vo_update(vop, 1);
-
- return TCL_OK;
-}
-
-
-int
-vo_slew_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
- vect_t svec;
-
- if (argc == 2) {
- int n;
-
- if ((n = bn_decode_vect(svec, argv[1])) != 3) {
- if (n != 2)
- goto bad;
-
- svec[Z] = 0.0;
- }
-
- return vo_slew(vop, svec);
- }
-
- if (argc == 3 || argc == 4) {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_slew: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_slew: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (argc == 4) {
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_slew: bad Z
value - ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
- } else
- scan[Z] = 0.0;
-
- /* convert double to scan */
- VMOVE(svec, scan);
-
- return vo_slew(vop, svec);
- }
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_slew %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Make xyz the new view center.
- *
- * Usage:
- * procname slew xy
- */
-static int
-vo_slew_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_slew_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_observer_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- if (argc < 2) {
- bu_log("ERROR: expecting two or more arguments\n");
- return TCL_ERROR;
- }
-
- return bu_observer_cmd((ClientData)&vop->vo_observers, argc-1, (const char
**)argv+1);
-}
-
-
-/*
- * Attach/detach observers to/from list.
- *
- * Usage:
- * procname observer cmd [args]
- */
-static int
-vo_observer_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_observer_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_coord_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* Get coord */
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%c", vop->vo_coord);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)0);
- bu_vls_free(&vls);
- return TCL_OK;
- }
-
- /* Set coord */
- if (argc == 2) {
- switch (argv[1][0]) {
- case 'm':
- case 'v':
- vop->vo_coord = argv[1][0];
- return TCL_OK;
- }
- }
-
- /* return help message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_coord %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Get/set the coordinate system.
- *
- * Usage:
- * procname coord [v|m]
- */
-static int
-vo_coord_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_coord_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_rotate_about_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* Get rotate_about */
- if (argc == 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%c", vop->vo_rotate_about);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)0);
- bu_vls_free(&vls);
- return TCL_OK;
- }
-
- /* Set rotate_about */
- if (argc == 2 && argv[1][1] == '\0') {
- switch (argv[1][0]) {
- case 'e':
- case 'k':
- case 'm':
- case 'v':
- vop->vo_rotate_about = argv[1][0];
- return TCL_OK;
- }
- }
-
- /* return help message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_rotate_about %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Get/set the rotate about point.
- *
- * Usage:
- * procname rotate_about [e|k|m|v]
- */
-static int
-vo_rotate_about_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_rotate_about_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_keypoint_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
- vect_t tvec = VINIT_ZERO;
-
- /* Get the keypoint */
- if (argc == 1) {
- bu_vls_init(&vls);
- VSCALE(tvec, vop->vo_keypoint, vop->vo_base2local);
- bn_encode_vect(&vls, tvec, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)0);
- bu_vls_free(&vls);
- return TCL_OK;
- }
-
- /* Set the keypoint */
- if (argc == 2) {
- if (bn_decode_vect(tvec, argv[1]) != 3)
- goto bad;
- } else if (argc == 4) {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_keypoint: bad X
value - ", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_keypoint: bad Y
value - ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_keypoint: bad Z
value - ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(tvec, scan);
- }
-
- VSCALE(vop->vo_keypoint, tvec, vop->vo_local2base);
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_keypoint %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Get/set the keypoint.
- *
- * Usage:
- * procname keypoint [point]
- */
-static int
-vo_keypoint_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_keypoint_cmd(vop, argc-1, argv+1);
-}
-
-
-/*
- * Set the view. Angles are DOUBLES, in degrees.
- *
- * Given that viewvec = scale . rotate . (xlate to view center) . modelvec,
- * we just replace the rotation matrix.
- * (This assumes rotation around the view center).
- */
-void
-vo_setview(struct view_obj *vop,
- vect_t rvec) /* DOUBLE angles, in degrees */
-{
- bn_mat_angles(vop->vo_rotation, rvec[X], rvec[Y], rvec[Z]);
- vo_update(vop, 1);
-}
-
-
-int
-vo_setview_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- vect_t rvec;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(rvec, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_setview_cmd: bad X
value - ", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_setview_cmd: bad Y
value - ", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_setview_cmd: bad Z
value - ", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(rvec, scan);
- }
-
- vo_setview(vop, rvec);
- return TCL_OK;
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_setview %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Usage:
- * procname setview x y z
- */
-static int
-vo_setview_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_setview_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_arot_cmd(struct view_obj *vop,
- int argc,
- const char *argv[],
- int (*func)())
-{
- mat_t newrot;
- point_t pt = VINIT_ZERO;
- vect_t axis;
-
- /* intentionally double for scan */
- double angle;
- double scan[3];
-
- if (argc != 5) {
- struct bu_vls vls;
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_arot %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_arot: bad X value - ",
argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_arot: bad Y value - ",
argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_arot: bad Z value - ",
argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(axis, scan);
-
- if (sscanf(argv[4], "%lf", &angle) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_arot: bad angle - ",
argv[4], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- VUNITIZE(axis);
-
- bn_mat_arb_rot(newrot, pt, axis, angle*DEG2RAD);
-
- return vo_rot(vop, vop->vo_coord, vop->vo_rotate_about, newrot, func);
-}
-
-
-/*
- * Usage:
- * procname arot x y z angle
- */
-static int
-vo_arot_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_arot_cmd(vop, argc-1, argv+1, (int (*)())0);
-}
-
-
-int
-vo_vrot_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- vect_t rvec;
- mat_t rmat;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(rvec, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_vrot: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_vrot: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_vrot: bad Z value -
", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(rvec, scan);
- }
-
- VSCALE(rvec, rvec, -1.0);
- bn_mat_angles(rmat, rvec[X], rvec[Y], rvec[Z]);
-
- return vo_rot(vop, 'v', vop->vo_rotate_about, rmat, (int (*)())0);
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_vrot %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Usage:
- * procname vrot x y z
- */
-static int
-vo_vrot_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_vrot_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_mrot_cmd(struct view_obj *vop,
- int argc,
- const char *argv[],
- int (*func)())
-{
- vect_t rvec;
- mat_t rmat;
- struct bu_vls vls;
-
- if (argc != 2 && argc != 4)
- goto bad;
-
- if (argc == 2) {
- if (bn_decode_vect(rvec, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_mrot: bad X value -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_mrot: bad Y value -
", argv[2], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) < 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_mrot: bad Z value -
", argv[3], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(rvec, scan);
- }
-
- VSCALE(rvec, rvec, -1.0);
- bn_mat_angles(rmat, rvec[X], rvec[Y], rvec[Z]);
-
- return vo_rot(vop, 'm', vop->vo_rotate_about, rmat, func);
-
-bad:
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_mrot %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
-}
-
-
-/*
- * Usage:
- * procname mrot x y z
- */
-static int
-vo_mrot_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_mrot_cmd(vop, argc-1, argv+1, (int (*)())0);
-}
-
-
-int
-vo_mrotPoint_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* Parse the incoming point */
- if (argc == 2 || argc == 4) {
- point_t viewPt;
- point_t modelPt;
- mat_t invRot;
-
- if (argc == 2) {
- if (bn_decode_vect(viewPt, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_mrotPoint: bad X value - ",
- argv[1],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_mrotPoint: bad Y value - ",
- argv[2],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_mrotPoint: bad Z value - ",
- argv[3],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(viewPt, scan);
- }
-
- bu_vls_init(&vls);
- bn_mat_inv(invRot, vop->vo_rotation);
- MAT4X3PNT(modelPt, invRot, viewPt);
- bn_encode_vect(&vls, modelPt, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
-bad:
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_mrotPoint %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Convert view point to a model point (rotation only).
- *
- * Usage:
- * procname mrotPoint vx vy vz
- */
-static int
-vo_mrotPoint_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_mrotPoint_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_m2vPoint_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* Parse the incoming point */
- if (argc == 2 || argc == 4) {
- point_t viewPt = VINIT_ZERO;
- /* intentionally using double for scan */
- double modelPt[3] = VINIT_ZERO;
-
- if (argc == 2) {
- if (bn_decode_vect(viewPt, argv[1]) != 3)
- goto bad;
- } else {
- if (sscanf(argv[1], "%lf", &modelPt[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_m2vPoint: bad X value - ",
- argv[1],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &modelPt[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_m2vPoint: bad Y value - ",
- argv[2],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &modelPt[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_m2vPoint: bad Z value - ",
- argv[3],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
- }
-
- bu_vls_init(&vls);
- MAT4X3PNT(viewPt, vop->vo_model2view, modelPt);
- bn_encode_vect(&vls, viewPt, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
-bad:
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_m2vPoint %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Convert model point to a view point.
- *
- * Usage:
- * procname m2vPoint vx vy vz
- */
-static int
-vo_m2vPoint_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_m2vPoint_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_v2mPoint_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- struct bu_vls vls;
-
- /* Parse the incoming point */
- if (argc == 2 || argc == 4) {
- point_t viewPt;
- point_t modelPt;
-
- if (argc == 2) {
- if (bn_decode_vect(viewPt, argv[1]) != 3)
- goto bad;
- } else {
- double scan[3];
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_v2mPoint: bad X value - ",
- argv[1],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &scan[Y]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_v2mPoint: bad Y value - ",
- argv[2],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp,
- "vo_v2mPoint: bad Z value - ",
- argv[3],
- "\n",
- (char *)0);
- return TCL_ERROR;
- }
-
- /* convert double to fastf_t */
- VMOVE(viewPt, scan);
- }
-
- bu_vls_init(&vls);
- MAT4X3PNT(modelPt, vop->vo_view2model, viewPt);
- bn_encode_vect(&vls, modelPt, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
- }
-
-bad:
- /* compose error message */
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_v2mPoint %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
-
- return TCL_ERROR;
-}
-
-
-/*
- * Convert view point to a model point.
- *
- * Usage:
- * procname v2mPoint vx vy vz
- */
-static int
-vo_v2mPoint_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_v2mPoint_cmd(vop, argc-1, argv+1);
-}
-
-
-int
-vo_sca(struct view_obj *vop,
- fastf_t sf,
- int (*func)())
-{
- if (func != (int (*)())0)
- return (*func)(vop, sf);
-
- if (sf <= SMALL_FASTF || INFINITY < sf)
- return TCL_OK;
-
- vop->vo_scale *= sf;
- if (vop->vo_scale < RT_MINVIEWSIZE)
- vop->vo_scale = RT_MINVIEWSIZE;
- vop->vo_size = 2.0 * vop->vo_scale;
- vop->vo_invSize = 1.0 / vop->vo_size;
- vo_update(vop, 1);
- return TCL_OK;
-}
-
-
-int
-vo_sca_cmd(struct view_obj *vop,
- int argc,
- const char *argv[],
- int (*func)())
-{
- /* intentionally using double for scan */
- double sf;
-
- if (argc != 2) {
- struct bu_vls vls;
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_sca %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[1], "%lf", &sf) != 1) {
- Tcl_AppendResult((Tcl_Interp *)vop->interp, "vo_sca: bad scale factor -
", argv[1], "\n", (char *)0);
- return TCL_ERROR;
- }
-
- return vo_sca(vop, sf, func);
-}
-
-
-/*
- * Usage:
- * procname sca [sf]
- */
-static int
-vo_sca_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_sca_cmd(vop, argc-1, argv+1, (int (*)())0);
-}
-
-
-int
-vo_viewDir_cmd(struct view_obj *vop,
- int argc,
- const char *argv[])
-{
- vect_t view;
- vect_t model;
- mat_t invRot;
- struct bu_vls vls;
- int iflag = 0;
-
- if (2 < argc) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_viewDir %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- /* Look for -i option */
- if (argc == 2 &&
- argv[1][0] == '-' &&
- argv[1][1] == 'i' &&
- argv[1][2] == '\0')
- iflag = 1;
-
- if (iflag) {
- VSET(view, 0.0, 0.0, -1.0);
- } else {
- VSET(view, 0.0, 0.0, 1.0);
- }
-
- bn_mat_inv(invRot, vop->vo_rotation);
- MAT4X3PNT(model, invRot, view);
-
- bu_vls_init(&vls);
- bn_encode_vect(&vls, model, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
-}
-
-
-/*
- * Usage:
- * procname viewDir[-i]
- */
-static int
-vo_viewDir_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_viewDir_cmd(vop, argc-1, argv+1);
-}
-
-
-/* skeleton functions for view_obj methods */
-int
-vo_ae2dir_cmd(struct view_obj *vop, int argc, const char *argv[])
-{
- vect_t dir;
- int iflag;
- struct bu_vls vls;
-
- /* intentionally using double for scan */
- double az, el;
-
- if (argc < 3 || 4 < argc) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_ae2dir %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- /* Look for -i option */
- if (argc == 4) {
- if (argv[1][0] != '-' ||
- argv[1][1] != 'i' ||
- argv[1][2] != '\0') {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_ae2dir %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- if (sscanf(argv[2], "%lf", &az) != 1 ||
- sscanf(argv[3], "%lf", &el) != 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_ae2dir %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- iflag = 1;
- } else {
- if (sscanf(argv[1], "%lf", &az) != 1 ||
- sscanf(argv[2], "%lf", &el) != 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_ae2dir %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- iflag = 0;
- }
-
- az *= DEG2RAD;
- el *= DEG2RAD;
- V3DIR_FROM_AZEL(dir, az, el);
-
- if (iflag)
- VSCALE(dir, dir, -1);
-
- bu_vls_init(&vls);
- bn_encode_vect(&vls, dir, 1);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
-}
-
-
-/*
- * Usage:
- * procname ae2dir [-i] az el
- */
-static int
-vo_ae2dir_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_ae2dir_cmd(vop, argc-1, argv+1);
-}
-
-
-/**
- * guts to the dir2ae command
- */
-int
-vo_dir2ae_cmd(struct view_obj *vop, int argc, const char *argv[])
-{
- fastf_t az, el;
- vect_t dir;
- int iflag = 0;
- struct bu_vls vls;
- double scan[3];
-
- if (argc < 4 || 5 < argc) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_dir2ae %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- /* Look for -i option */
- if (argc == 5) {
- if (argv[1][0] != '-' ||
- argv[1][1] != 'i' ||
- argv[1][2] != '\0') {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_dir2ae %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
- iflag = 1;
- argc--; argv++;
- }
-
- if (sscanf(argv[1], "%lf", &scan[X]) != 1 ||
- sscanf(argv[2], "%lf", &scan[Y]) != 1 ||
- sscanf(argv[3], "%lf", &scan[Z]) != 1) {
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "helplib_alias vo_dir2ae %s", argv[0]);
- Tcl_Eval((Tcl_Interp *)vop->interp, bu_vls_addr(&vls));
- bu_vls_free(&vls);
- return TCL_ERROR;
- }
-
- /* convert from double to fastf_t */
- VMOVE(dir, scan);
-
- AZEL_FROM_V3DIR(az, el, dir);
-
- if (iflag)
- VSCALE(dir, dir, -1);
-
- bu_vls_init(&vls);
- bu_vls_printf(&vls, "%lf %lf", az, el);
- Tcl_AppendResult((Tcl_Interp *)vop->interp, bu_vls_addr(&vls), (char
*)NULL);
- bu_vls_free(&vls);
-
- return TCL_OK;
-}
-
-
-/**
- * Usage:
- * procname dir2ae [-i] x y z
- */
-static int
-vo_dir2ae_tcl(void *clientData,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop = (struct view_obj *)clientData;
-
- return vo_dir2ae_cmd(vop, argc-1, argv+1);
-}
-
-
-static int
-vo_cmd(ClientData clientData,
- Tcl_Interp *UNUSED(interp),
- int argc,
- const char *argv[])
-{
- int ret;
-
- static struct bu_cmdtab vo_cmds[] = {
- {"ae", vo_aet_tcl},
- {"ae2dir", vo_ae2dir_tcl},
- {"arot", vo_arot_tcl},
- {"base2local", vo_base2local_tcl},
- {"center", vo_center_tcl},
- {"coord", vo_coord_tcl},
- {"dir2ae", vo_dir2ae_tcl},
- {"eye", vo_eye_tcl},
- {"eye_pos", vo_eye_pos_tcl},
- {"invSize", vo_invSize_tcl},
- {"keypoint", vo_keypoint_tcl},
- {"local2base", vo_local2base_tcl},
- {"lookat", vo_lookat_tcl},
- {"m2vPoint", vo_m2vPoint_tcl},
- {"model2view", vo_model2view_tcl},
- {"mrot", vo_mrot_tcl},
- {"mrotPoint", vo_mrotPoint_tcl},
- {"observer", vo_observer_tcl},
- {"orientation", vo_orientation_tcl},
- {"perspective", vo_perspective_tcl},
- {"pmat", vo_pmat_tcl},
- {"pmodel2view", vo_pmodel2view_tcl},
- {"rmat", vo_rmat_tcl},
- {"rot", vo_rot_tcl},
- {"rotate_about", vo_rotate_about_tcl},
- {"sca", vo_sca_tcl},
- {"setview", vo_setview_tcl},
- {"size", vo_size_tcl},
- {"slew", vo_slew_tcl},
- {"tra", vo_tra_tcl},
- {"units", vo_units_tcl},
- {"v2mPoint", vo_v2mPoint_tcl},
- {"view2model", vo_view2model_tcl},
- {"viewDir", vo_viewDir_tcl},
- {"vrot", vo_vrot_tcl},
- {"zoom", vo_zoom_tcl},
- {(const char *)NULL, BU_CMD_NULL}
- };
-
- if (bu_cmd(vo_cmds, argc, argv, 1, clientData, &ret) == BRLCAD_OK)
- return ret;
-
- bu_log("ERROR: '%s' command not found\n", argv[1]);
- return BRLCAD_ERROR;
-}
-
-
-/*
- * Open a view object.
- *
- * USAGE: v_open [name]
- */
-static int
-vo_open_tcl(ClientData UNUSED(clientData),
- Tcl_Interp *interp,
- int argc,
- const char *argv[])
-{
- struct view_obj *vop;
-
- if (argc == 1) {
- /* get list of view objects */
- for (BU_LIST_FOR(vop, view_obj, &HeadViewObj.l))
- Tcl_AppendResult(interp, bu_vls_addr(&vop->vo_name), " ", (char
*)NULL);
-
- return TCL_OK;
- }
-
- /* first, delete any commands by this name */
- (void)Tcl_DeleteCommand(interp, argv[1]);
-
- vop = vo_open_cmd(argv[1]);
- vop->interp = (void *)interp;
- (void)Tcl_CreateCommand(interp,
- bu_vls_addr(&vop->vo_name),
- (Tcl_CmdProc *)vo_cmd,
- (ClientData)vop,
- vo_deleteProc);
-
- /* Return new function name as result */
- Tcl_ResetResult(interp);
- Tcl_AppendResult(interp, bu_vls_addr(&vop->vo_name), (char *)NULL);
-
- return TCL_OK;
-}
-
-
-int
-Vo_Init(Tcl_Interp *interp)
-{
- BU_LIST_INIT(&HeadViewObj.l);
- (void)Tcl_CreateCommand(interp, "v_open", vo_open_tcl,
- (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
- return TCL_OK;
-}
-
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */
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