Revision: 76327
http://sourceforge.net/p/brlcad/code/76327
Author: starseeker
Date: 2020-07-14 18:47:49 +0000 (Tue, 14 Jul 2020)
Log Message:
-----------
Group bu and bn lib functions into their own files
Modified Paths:
--------------
brlcad/trunk/src/libtclcad/CMakeLists.txt
brlcad/trunk/src/libtclcad/libfuncs.c
Added Paths:
-----------
brlcad/trunk/src/libtclcad/bn_funcs.c
brlcad/trunk/src/libtclcad/bu_funcs.c
Modified: brlcad/trunk/src/libtclcad/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/libtclcad/CMakeLists.txt 2020-07-14 16:34:25 UTC (rev
76326)
+++ brlcad/trunk/src/libtclcad/CMakeLists.txt 2020-07-14 18:47:49 UTC (rev
76327)
@@ -1,4 +1,6 @@
set(LIBTCLCAD_SRCS
+ bu_funcs.c
+ bn_funcs.c
libfuncs.c
tclcad.c
tclcadAutoPath.c
Added: brlcad/trunk/src/libtclcad/bn_funcs.c
===================================================================
--- brlcad/trunk/src/libtclcad/bn_funcs.c (rev 0)
+++ brlcad/trunk/src/libtclcad/bn_funcs.c 2020-07-14 18:47:49 UTC (rev
76327)
@@ -0,0 +1,1378 @@
+/* B N _ F U N C S . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2004-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This program 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 program 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.
+ *
+ */
+/** @file libtclcad/bn_funcs.c
+ *
+ * BRL-CAD's Tcl wrappers for libbn.
+ *
+ */
+
+#include "common.h"
+
+#define RESOURCE_INCLUDED 1
+#include <tcl.h>
+#ifdef HAVE_TK
+# include <tk.h>
+#endif
+
+#include "string.h" /* for strchr */
+
+#include "vmath.h"
+#include "bu.h"
+#include "bn.h"
+#include "tclcad.h"
+
+
+/* Private headers */
+#include "brlcad_version.h"
+#include "tclcad_private.h"
+
+void
+bn_quat_distance_wrapper(double *dp, mat_t q1, mat_t q2)
+{
+ *dp = quat_distance(q1, q2);
+}
+
+
+static void
+bn_mat4x3vec(fastf_t *o, mat_t m, vect_t i)
+{
+ MAT4X3VEC(o, m, i);
+}
+
+
+static void
+bn_hdivide(fastf_t *o, const mat_t i)
+{
+ HDIVIDE(o, i);
+}
+
+static int
+tclcad_bn_dist_pnt2_lseg2(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ point_t ptA, ptB, pca;
+ point_t pt;
+ fastf_t dist;
+ int ret;
+ static const struct bn_tol tol = {
+ BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
+ };
+
+ if (argc != 4) {
+ bu_vls_printf(&result,
+ "Usage: bn_dist_pnt2_lseg2 pntA pntB pnt (%d args specified)",
argc-1);
+ goto error;
+ }
+
+ if (bn_decode_vect(ptA, argv[1]) < 2) {
+ bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pntA: %s\n", argv[0]);
+ goto error;
+ }
+
+ if (bn_decode_vect(ptB, argv[2]) < 2) {
+ bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pntB: %s\n", argv[0]);
+ goto error;
+ }
+
+ if (bn_decode_vect(pt, argv[3]) < 2) {
+ bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pnt: %s\n", argv[0]);
+ goto error;
+ }
+
+ ret = bn_dist_pnt2_lseg2(&dist, pca, ptA, ptB, pt, &tol);
+ switch (ret) {
+ case 0:
+ case 1:
+ case 2:
+ dist = 0.0;
+ break;
+ default:
+ break;
+ }
+
+ bu_vls_printf(&result, "%g", dist);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+
+}
+
+static int
+tclcad_bn_isect_line2_line2(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ fastf_t dist[2];
+ point_t pt = VINIT_ZERO;
+ point_t a = VINIT_ZERO;
+ vect_t dir = VINIT_ZERO;
+ vect_t c = VINIT_ZERO;
+ int i;
+ static const struct bn_tol tol = {
+ BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
+ };
+
+ if (argc != 5) {
+ bu_vls_printf(&result,
+ "Usage: bn_isect_line2_line2 pt dir pt dir (%d args specified)",
+ argc-1);
+ goto error;
+ }
+
+ /* i = bn_isect_line2_line2 {0 0} {1 0} {1 1} {0 -1} */
+
+ if (bn_decode_vect(pt, argv[1]) < 2) {
+ bu_vls_printf(&result, "bn_isect_line2_line2 no pt: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(dir, argv[2]) < 2) {
+ bu_vls_printf(&result, "bn_isect_line2_line2 no dir: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(a, argv[3]) < 2) {
+ bu_vls_printf(&result, "bn_isect_line2_line2 no a pt: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(c, argv[4]) < 2) {
+ bu_vls_printf(&result, "bn_isect_line2_line2 no c dir: %s\n", argv[0]);
+ goto error;
+ }
+ i = bn_isect_line2_line2(dist, pt, dir, a, c, &tol);
+ if (i != 1) {
+ bu_vls_printf(&result, "bn_isect_line2_line2 no intersection: %s\n",
argv[0]);
+ goto error;
+ }
+
+ VJOIN1(a, pt, dist[0], dir);
+ bu_vls_printf(&result, "%g %g", V2INTCLAMPARGS(a));
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_isect_line3_line3(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ fastf_t t, u;
+ point_t pt, a;
+ vect_t dir, c;
+ int i;
+ static const struct bn_tol tol = {
+ BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
+ };
+ if (argc != 5) {
+ bu_vls_printf(&result,
+ "Usage: bn_isect_line3_line3 pt dir pt dir (%d args specified)",
+ argc-1);
+ goto error;
+ }
+
+ if (bn_decode_vect(pt, argv[1]) < 3) {
+ bu_vls_printf(&result, "bn_isect_line3_line3 no pt: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(dir, argv[2]) < 3) {
+ bu_vls_printf(&result, "bn_isect_line3_line3 no dir: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(a, argv[3]) < 3) {
+ bu_vls_printf(&result, "bn_isect_line3_line3 no a pt: %s\n", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(c, argv[4]) < 3) {
+ bu_vls_printf(&result, "bn_isect_line3_line3 no c dir: %s\n", argv[0]);
+ goto error;
+ }
+ i = bn_isect_line3_line3(&t, &u, pt, dir, a, c, &tol);
+ if (i != 1) {
+ bu_vls_printf(&result, "bn_isect_line3_line3 no intersection: %s\n",
argv[0]);
+ goto error;
+ }
+
+ VJOIN1(a, pt, t, dir);
+ bn_encode_vect(&result, a, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_inv(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ mat_t o, a;
+
+ if (argc < 2 || bn_decode_mat(a, argv[1]) < 16) {
+ bu_vls_printf(&result, "usage: %s mat", argv[0]);
+ goto error;
+ }
+ bn_mat_inv(o, a);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_trn(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ mat_t o, a;
+
+ if (argc < 2 || bn_decode_mat(a, argv[1]) < 16) {
+ bu_vls_printf(&result, "usage: %s mat", argv[0]);
+ goto error;
+ }
+ bn_mat_trn(o, a);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_matXvec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ mat_t m;
+ hvect_t i, o;
+ if (argc < 3 || bn_decode_mat(m, argv[1]) < 16 ||
+ bn_decode_hvect(i, argv[2]) < 4) {
+ bu_vls_printf(&result, "usage: %s mat hvect", argv[0]);
+ goto error;
+ }
+ bn_matXvec(o, m, i);
+ bn_encode_hvect(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_mat4x3vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t m;
+ vect_t i, o;
+ MAT_ZERO(m);
+ if (argc < 3 || bn_decode_mat(m, argv[1]) < 16 ||
+ bn_decode_vect(i, argv[2]) < 3) {
+ bu_vls_printf(&result, "usage: %s mat vect", argv[0]);
+ goto error;
+ }
+ bn_mat4x3vec(o, m, i);
+ bn_encode_vect(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_hdivide(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ hvect_t i;
+ vect_t o;
+ if (argc < 2 || bn_decode_hvect(i, argv[1]) < 4) {
+ bu_vls_printf(&result, "usage: %s hvect", argv[0]);
+ goto error;
+ }
+ bn_hdivide(o, i);
+ bn_encode_vect(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_vjoin1(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ point_t o;
+ point_t b, d;
+ double c;
+
+ if (argc < 4) {
+ bu_vls_printf(&result, "usage: %s pnt scale dir", argv[0]);
+ goto error;
+ }
+ if (bn_decode_vect(b, argv[1]) < 3) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
+ if (bn_decode_vect(d, argv[3]) < 3) goto error;
+
+ VJOIN1(o, b, c, d); /* bn_vjoin1(o, b, c, d) */
+ bn_encode_vect(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_vblend(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ point_t a, c, e;
+ double b, d;
+
+ if (argc < 5) {
+ bu_vls_printf(&result, "usage: %s scale pnt scale pnt", argv[0]);
+ goto error;
+ }
+
+ if (Tcl_GetDouble(interp, argv[1], &b) != TCL_OK) goto error;
+ if (bn_decode_vect(c, argv[2]) < 3) goto error;
+ if (Tcl_GetDouble(interp, argv[3], &d) != TCL_OK) goto error;
+ if (bn_decode_vect(e, argv[4]) < 3) goto error;
+
+ VBLEND2(a, b, c, d, e);
+ bn_encode_vect(&result, a, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_ae_vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ fastf_t az, el;
+ vect_t v;
+
+ if (argc < 2 || bn_decode_vect(v, argv[1]) < 3) {
+ bu_vls_printf(&result, "usage: %s vect", argv[0]);
+ goto error;
+ }
+
+ bn_ae_vec(&az, &el, v);
+ bu_vls_printf(&result, "%g %g", az, el);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_aet_vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ double acc;
+ fastf_t az, el, twist, accuracy;
+ vect_t vec_ae, vec_twist;
+
+ if (argc < 4 || bn_decode_vect(vec_ae, argv[1]) < 3 ||
+ bn_decode_vect(vec_twist, argv[2]) < 3 ||
+ sscanf(argv[3], "%lf", &acc) < 1) {
+ bu_vls_printf(&result, "usage: %s vec_ae vec_twist accuracy",
+ argv[0]);
+ goto error;
+ }
+ accuracy = acc;
+
+ bn_aet_vec(&az, &el, &twist, vec_ae, vec_twist, accuracy);
+ bu_vls_printf(&result, "%g %g %g", az, el, twist);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_mat_angles(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ double alpha, beta, ggamma;
+
+ if (argc < 4) {
+ bu_vls_printf(&result, "usage: %s alpha beta gamma", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[1], &alpha) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &beta) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[3], &ggamma) != TCL_OK) goto error;
+
+ bn_mat_angles(o, alpha, beta, ggamma);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_eigen2x2(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ fastf_t val1, val2;
+ vect_t vec1, vec2;
+ double a, b, c;
+
+ if (argc < 4) {
+ bu_vls_printf(&result, "usage: %s a b c", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[1], &a) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[3], &b) != TCL_OK) goto error;
+
+ bn_eigen2x2(&val1, &val2, vec1, vec2, (fastf_t)a, (fastf_t)b,
+ (fastf_t)c);
+ bu_vls_printf(&result, "%g %g {%g %g %g} {%g %g %g}", INTCLAMP(val1),
INTCLAMP(val2),
+ V3INTCLAMPARGS(vec1), V3INTCLAMPARGS(vec2));
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_mat_fromto(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ vect_t from, to;
+ static const struct bn_tol tol = {
+ BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
+ };
+
+ if (argc < 3 || bn_decode_vect(from, argv[1]) < 3 ||
+ bn_decode_vect(to, argv[2]) < 3) {
+ bu_vls_printf(&result, "usage: %s vecFrom vecTo", argv[0]);
+ goto error;
+ }
+ bn_mat_fromto(o, from, to, &tol);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_xrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ double s, c;
+
+ if (argc < 3) {
+ bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
+
+ bn_mat_xrot(o, s, c);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_yrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ double s, c;
+
+ if (argc < 3) {
+ bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
+
+ bn_mat_yrot(o, s, c);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_zrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ double s, c;
+
+ if (argc < 3) {
+ bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
+ if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
+
+ bn_mat_zrot(o, s, c);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_lookat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ vect_t dir;
+ int yflip;
+ if (argc < 3 || bn_decode_vect(dir, argv[1]) < 3) {
+ bu_vls_printf(&result, "usage: %s dir yflip", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetBoolean(interp, argv[2], &yflip) != TCL_OK) goto error;
+
+ bn_mat_lookat(o, dir, yflip);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_vec_ortho(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ vect_t ov, vec;
+
+ if (argc < 2 || bn_decode_vect(vec, argv[1]) < 3) {
+ bu_vls_printf(&result, "usage: %s vec", argv[0]);
+ goto error;
+ }
+
+ bn_vec_ortho(ov, vec);
+ bn_encode_vect(&result, ov, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_vec_perp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ vect_t ov, vec;
+
+ if (argc < 2 || bn_decode_vect(vec, argv[1]) < 3) {
+ bu_vls_printf(&result, "usage: %s vec", argv[0]);
+ goto error;
+ }
+
+ bn_vec_perp(ov, vec);
+ bn_encode_vect(&result, ov, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_xform_about_pnt(ClientData UNUSED(clientData), Tcl_Interp
*interp, int argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o, xform;
+ vect_t v;
+
+ if (argc < 3 || bn_decode_mat(xform, argv[1]) < 16 ||
+ bn_decode_vect(v, argv[2]) < 3) {
+ bu_vls_printf(&result, "usage: %s xform pt", argv[0]);
+ goto error;
+ }
+
+ bn_mat_xform_about_pnt(o, xform, v);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_mat_arb_rot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t o;
+ point_t pt;
+ vect_t dir;
+ double angle;
+
+ if (argc < 4 || bn_decode_vect(pt, argv[1]) < 3 ||
+ bn_decode_vect(dir, argv[2]) < 3) {
+ bu_vls_printf(&result, "usage: %s pt dir angle", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[3], &angle) != TCL_OK)
+ return TCL_ERROR;
+
+ bn_mat_arb_rot(o, pt, dir, (fastf_t)angle);
+ bn_encode_mat(&result, o, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_quat_mat2quat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t mat;
+ quat_t quat;
+
+ if (argc < 2 || bn_decode_mat(mat, argv[1]) < 16) {
+ bu_vls_printf(&result, "usage: %s mat", argv[0]);
+ goto error;
+ }
+
+ quat_mat2quat(quat, mat);
+ bn_encode_quat(&result, quat, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_quat_quat2mat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ mat_t mat;
+ quat_t quat;
+
+ if (argc < 2 || bn_decode_quat(quat, argv[1]) < 4) {
+ bu_vls_printf(&result, "usage: %s quat", argv[0]);
+ goto error;
+ }
+
+ quat_quat2mat(mat, quat);
+ bn_encode_mat(&result, mat, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_quat_distance(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t q1, q2;
+ double d;
+
+ if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
+ bn_decode_quat(q2, argv[2]) < 4) {
+ bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
+ goto error;
+ }
+
+ bn_quat_distance_wrapper(&d, q1, q2);
+ bu_vls_printf(&result, "%g", d);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_quat_double(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t oqot, q1, q2;
+
+ if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
+ bn_decode_quat(q2, argv[2]) < 4) {
+ bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
+ goto error;
+ }
+
+ quat_double(oqot, q1, q2);
+ bn_encode_quat(&result, oqot, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+
+static int
+tclcad_bn_quat_bisect(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t oqot, q1, q2;
+
+ if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
+ bn_decode_quat(q2, argv[2]) < 4) {
+ bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
+ goto error;
+ }
+
+ quat_bisect(oqot, q1, q2);
+ bn_encode_quat(&result, oqot, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+
+static int
+tclcad_bn_quat_make_nearest(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t oqot, q1;
+
+ if (argc < 2 || bn_decode_quat(oqot, argv[1]) < 4) {
+ bu_vls_printf(&result, "usage: %s orig_quat", argv[0]);
+ goto error;
+ }
+
+ quat_make_nearest(q1, oqot);
+ bn_encode_quat(&result, q1, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+static int
+tclcad_bn_quat_slerp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t oq, q1, q2;
+ double d;
+
+ if (argc < 4 || bn_decode_quat(q1, argv[1]) < 4 ||
+ bn_decode_quat(q2, argv[2]) < 4) {
+ bu_vls_printf(&result, "usage: %s quat1 quat2 factor", argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[3], &d) != TCL_OK) goto error;
+
+ quat_slerp(oq, q1, q2, d);
+ bn_encode_quat(&result, oq, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+
+static int
+tclcad_bn_quat_sberp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t oq, q1, qa, qb, q2;
+ double d;
+
+ if (argc < 6 || bn_decode_quat(q1, argv[1]) < 4 ||
+ bn_decode_quat(qa, argv[2]) < 4 || bn_decode_quat(qb, argv[3]) < 4
||
+ bn_decode_quat(q2, argv[4]) < 4) {
+ bu_vls_printf(&result, "usage: %s quat1 quatA quatB quat2 factor",
+ argv[0]);
+ goto error;
+ }
+ if (Tcl_GetDouble(interp, argv[5], &d) != TCL_OK) goto error;
+
+ quat_sberp(oq, q1, qa, qb, q2, d);
+ bn_encode_quat(&result, oq, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+
+static int
+tclcad_bn_quat_exp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t qout, qin;
+
+ if (argc < 2 || bn_decode_quat(qin, argv[1]) < 4) {
+ bu_vls_printf(&result, "usage: %s quat", argv[0]);
+ goto error;
+ }
+
+ quat_exp(qout, qin);
+ bn_encode_quat(&result, qout, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+static int
+tclcad_bn_quat_log(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
+{
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+ quat_t qout, qin;
+
+ if (argc < 2 || bn_decode_quat(qin, argv[1]) < 4) {
+ bu_vls_printf(&result, "usage: %s quat", argv[0]);
+ goto error;
+ }
+
+ quat_log(qout, qin);
+ bn_encode_quat(&result, qout, 1);
+
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_OK;
+
+error:
+ Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
+ bu_vls_free(&result);
+ return TCL_ERROR;
+}
+
+
+#define BN_FUNC_TCL_CAST(_func) ((int (*)(ClientData clientData, Tcl_Interp
*interp, int argc, const char *const *argv))_func)
+
+static struct math_func_link {
+ const char *name;
+ int (*func)(ClientData clientData, Tcl_Interp *interp, int argc, const
char *const *argv);
+} math_funcs[] = {
+ /* FIXME: migrate these all to libged */
+ {"bn_dist_pnt2_lseg2", BN_FUNC_TCL_CAST(tclcad_bn_dist_pnt2_lseg2) },
+ {"bn_isect_line2_line2", BN_FUNC_TCL_CAST(tclcad_bn_isect_line2_line2)
},
+ {"bn_isect_line3_line3", BN_FUNC_TCL_CAST(tclcad_bn_isect_line3_line3)
},
+ {"mat_inv", BN_FUNC_TCL_CAST(tclcad_bn_mat_inv) },
+ {"mat_trn", BN_FUNC_TCL_CAST(tclcad_bn_mat_trn) },
+ {"matXvec", BN_FUNC_TCL_CAST(tclcad_bn_matXvec) },
+ {"mat4x3vec", BN_FUNC_TCL_CAST(tclcad_bn_mat4x3vec) },
+ {"hdivide", BN_FUNC_TCL_CAST(tclcad_bn_hdivide) },
+ {"vjoin1", BN_FUNC_TCL_CAST(tclcad_bn_vjoin1) },
+ {"vblend", BN_FUNC_TCL_CAST(tclcad_bn_vblend) },
+ {"mat_ae_vec", BN_FUNC_TCL_CAST(tclcad_bn_ae_vec) },
+ {"mat_aet_vec", BN_FUNC_TCL_CAST(tclcad_bn_aet_vec) },
+ {"mat_angles", BN_FUNC_TCL_CAST(tclcad_bn_mat_angles) },
+ {"mat_eigen2x2", BN_FUNC_TCL_CAST(tclcad_bn_eigen2x2) },
+ {"mat_fromto", BN_FUNC_TCL_CAST(tclcad_bn_mat_fromto) },
+ {"mat_xrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_xrot) },
+ {"mat_yrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_yrot) },
+ {"mat_zrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_zrot) },
+ {"mat_lookat", BN_FUNC_TCL_CAST(tclcad_bn_mat_lookat) },
+ {"mat_vec_ortho", BN_FUNC_TCL_CAST(tclcad_bn_vec_ortho) },
+ {"mat_vec_perp", BN_FUNC_TCL_CAST(tclcad_bn_vec_perp) },
+ {"mat_xform_about_pnt",
BN_FUNC_TCL_CAST(tclcad_bn_mat_xform_about_pnt) },
+ {"mat_arb_rot", BN_FUNC_TCL_CAST(tclcad_bn_mat_arb_rot) },
+ {"quat_mat2quat", BN_FUNC_TCL_CAST(tclcad_bn_quat_mat2quat) },
+ {"quat_quat2mat", BN_FUNC_TCL_CAST(tclcad_bn_quat_quat2mat) },
+ {"quat_distance", BN_FUNC_TCL_CAST(tclcad_bn_quat_distance) },
+ {"quat_double", BN_FUNC_TCL_CAST(tclcad_bn_quat_double) },
+ {"quat_bisect", BN_FUNC_TCL_CAST(tclcad_bn_quat_bisect) },
+ {"quat_make_nearest", BN_FUNC_TCL_CAST(tclcad_bn_quat_make_nearest)
},
+ {"quat_slerp", BN_FUNC_TCL_CAST(tclcad_bn_quat_slerp) },
+ {"quat_sberp", BN_FUNC_TCL_CAST(tclcad_bn_quat_sberp) },
+ {"quat_exp", BN_FUNC_TCL_CAST(tclcad_bn_quat_exp) },
+ {"quat_log", BN_FUNC_TCL_CAST(tclcad_bn_quat_log) },
+ {0, 0}
+};
+
+int
+bn_cmd_noise_perlin(ClientData UNUSED(clientData),
+ Tcl_Interp *interp,
+ int argc,
+ char **argv)
+{
+ point_t pt;
+ double v;
+
+ if (argc != 4) {
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ argv[0], " X Y Z \"",
+ NULL);
+ return TCL_ERROR;
+ }
+
+ pt[X] = atof(argv[1]);
+ pt[Y] = atof(argv[2]);
+ pt[Z] = atof(argv[3]);
+
+ v = bn_noise_perlin(pt);
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(v));
+
+ return TCL_OK;
+}
+
+
+/*
+ * usage: bn_noise_fbm X Y Z h_val lacunarity octaves
+ *
+ */
+int
+bn_cmd_noise(ClientData UNUSED(clientData),
+ Tcl_Interp *interp,
+ int argc,
+ char **argv)
+{
+ point_t pt;
+ double h_val;
+ double lacunarity;
+ double octaves;
+ double val;
+
+ if (argc != 7) {
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ argv[0], " X Y Z h_val lacunarity octaves\"",
+ NULL);
+ return TCL_ERROR;
+ }
+
+ pt[0] = atof(argv[1]);
+ pt[1] = atof(argv[2]);
+ pt[2] = atof(argv[3]);
+
+ h_val = atof(argv[4]);
+ lacunarity = atof(argv[5]);
+ octaves = atof(argv[6]);
+
+
+ if (BU_STR_EQUAL("bn_noise_turb", argv[0])) {
+ val = bn_noise_turb(pt, h_val, lacunarity, octaves);
+
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
+ } else if (BU_STR_EQUAL("bn_noise_fbm", argv[0])) {
+ val = bn_noise_fbm(pt, h_val, lacunarity, octaves);
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
+ } else {
+ Tcl_AppendResult(interp, "Unknown noise type \"",
+ argv[0], "\"", NULL);
+ return TCL_ERROR;
+ }
+ return TCL_OK;
+}
+
+
+/**
+ * @brief
+ * usage: noise_slice xdim ydim inv h_val lac octaves dX dY dZ sX [sY sZ]
+ *
+ * The idea here is to get a whole slice of noise at once, thereby
+ * avoiding the overhead of doing this in Tcl.
+ */
+int
+bn_cmd_noise_slice(ClientData UNUSED(clientData),
+ Tcl_Interp *interp,
+ int argc,
+ char **argv)
+{
+ double h_val;
+ double lacunarity;
+ double octaves;
+
+ vect_t delta; /* translation to noise space */
+ vect_t scale; /* scale to noise space */
+ unsigned xdim; /* # samples X direction */
+ unsigned ydim; /* # samples Y direction */
+ unsigned xval, yval;
+#define NOISE_FBM 0
+#define NOISE_TURB 1
+
+#define COV186_UNUSED_CODE 0
+#if COV186_UNUSED_CODE
+ int noise_type = NOISE_FBM;
+#endif
+ double val;
+ point_t pt;
+
+ if (argc != 7) {
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ argv[0], " Xdim Ydim Zval h_val lacunarity octaves\"",
+ NULL);
+ return TCL_ERROR;
+ }
+
+ xdim = atoi(argv[0]);
+ ydim = atoi(argv[1]);
+ VSETALL(delta, 0.0);
+ VSETALL(scale, 1.);
+ pt[Z] = delta[Z] = atof(argv[2]);
+ h_val = atof(argv[3]);
+ lacunarity = atof(argv[4]);
+ octaves = atof(argv[5]);
+
+#define COV186_UNUSED_CODE 0
+ /* Only NOISE_FBM is possible at this time, so comment out the switching
for
+ * NOISE_TURB. This may need to be deleted. */
+#if COV186_UNUSED_CODE
+ switch (noise_type) {
+ case NOISE_FBM:
+#endif
+ for (yval = 0; yval < ydim; yval++) {
+
+ pt[Y] = yval * scale[Y] + delta[Y];
+
+ for (xval = 0; xval < xdim; xval++) {
+ pt[X] = xval * scale[X] + delta[X];
+
+ bn_noise_fbm(pt, h_val, lacunarity, octaves);
+
+ }
+ }
+#if COV186_UNUSED_CODE
+ break;
+ case NOISE_TURB:
+ for (yval = 0; yval < ydim; yval++) {
+
+ pt[Y] = yval * scale[Y] + delta[Y];
+
+ for (xval = 0; xval < xdim; xval++) {
+ pt[X] = xval * scale[X] + delta[X];
+
+ val = bn_noise_turb(pt, h_val, lacunarity, octaves);
+
+ }
+ }
+ break;
+ }
+#endif
+
+
+ pt[0] = atof(argv[1]);
+ pt[1] = atof(argv[2]);
+ pt[2] = atof(argv[3]);
+
+ h_val = atof(argv[4]);
+ lacunarity = atof(argv[5]);
+ octaves = atof(argv[6]);
+
+
+ if (BU_STR_EQUAL("bn_noise_turb", argv[0])) {
+ val = bn_noise_turb(pt, h_val, lacunarity, octaves);
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
+ } else if (BU_STR_EQUAL("bn_noise_fbm", argv[0])) {
+ val = bn_noise_fbm(pt, h_val, lacunarity, octaves);
+ Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
+ } else {
+ Tcl_AppendResult(interp, "Unknown noise type \"",
+ argv[0], "\"", NULL);
+ return TCL_ERROR;
+ }
+ return TCL_OK;
+}
+
+
+int
+bn_cmd_random(ClientData UNUSED(clientData),
+ Tcl_Interp *interp,
+ int argc,
+ char **argv)
+{
+ int val;
+ const char *str;
+ double rnd;
+ char buf[32];
+
+ if (argc != 2) {
+ Tcl_AppendResult(interp, "Wrong # args: Should be \"",
+ argv[0], " varname\"", NULL);
+ return TCL_ERROR;
+ }
+
+ str=Tcl_GetVar(interp, argv[1], 0);
+ if (!str) {
+ Tcl_AppendResult(interp, "Error getting variable ",
+ argv[1], NULL);
+ return TCL_ERROR;
+ }
+ val = atoi(str);
+
+ V_MAX(val, 0);
+
+ rnd = BN_RANDOM(val);
+
+ snprintf(buf, 32, "%d", val);
+
+ if (!Tcl_SetVar(interp, argv[1], buf, 0)) {
+ Tcl_AppendResult(interp, "Error setting variable ",
+ argv[1], NULL);
+ return TCL_ERROR;
+ }
+
+ snprintf(buf, 32, "%g", rnd);
+ Tcl_AppendResult(interp, buf, NULL);
+ return TCL_OK;
+}
+
+
+void
+tclcad_bn_mat_print(Tcl_Interp *interp,
+ const char *title,
+ const mat_t m)
+{
+ char obuf[1024]; /* snprintf may be non-PARALLEL */
+
+ bn_mat_print_guts(title, m, obuf, 1024);
+ Tcl_AppendResult(interp, obuf, "\n", (char *)NULL);
+}
+
+
+void
+tclcad_bn_setup(Tcl_Interp *interp)
+{
+ struct math_func_link *mp;
+
+ for (mp = math_funcs; mp->name != NULL; mp++) {
+ (void)Tcl_CreateCommand(interp, mp->name,
+ (Tcl_CmdProc *)mp->func,
+ (ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+ }
+
+ (void)Tcl_CreateCommand(interp, "bn_noise_perlin",
+ (Tcl_CmdProc *)bn_cmd_noise_perlin,
(ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+
+ (void)Tcl_CreateCommand(interp, "bn_noise_turb",
+ (Tcl_CmdProc *)bn_cmd_noise, (ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+
+ (void)Tcl_CreateCommand(interp, "bn_noise_fbm",
+ (Tcl_CmdProc *)bn_cmd_noise, (ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+
+ (void)Tcl_CreateCommand(interp, "bn_noise_slice",
+ (Tcl_CmdProc *)bn_cmd_noise_slice, (ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+
+ (void)Tcl_CreateCommand(interp, "bn_random",
+ (Tcl_CmdProc *)bn_cmd_random, (ClientData)NULL,
+ (Tcl_CmdDeleteProc *)NULL);
+}
+
+
+int
+Bn_Init(Tcl_Interp *interp)
+{
+ tclcad_bn_setup(interp);
+ return TCL_OK;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
Property changes on: brlcad/trunk/src/libtclcad/bn_funcs.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: brlcad/trunk/src/libtclcad/bu_funcs.c
===================================================================
--- brlcad/trunk/src/libtclcad/bu_funcs.c (rev 0)
+++ brlcad/trunk/src/libtclcad/bu_funcs.c 2020-07-14 18:47:49 UTC (rev
76327)
@@ -0,0 +1,501 @@
+/* B U _ F U N C S . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2004-2020 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * This program 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 program 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.
+ *
+ */
+/** @file libtclcad/bu_funcs.c
+ *
+ * BRL-CAD's Tcl wrappers for libbu.
+ *
+ */
+
+#include "common.h"
+
+#define RESOURCE_INCLUDED 1
+#include <tcl.h>
+#ifdef HAVE_TK
+# include <tk.h>
+#endif
+
+#include "string.h" /* for strchr */
+
+#include "vmath.h"
+#include "bu.h"
+#include "vmath.h"
+#include "tclcad.h"
+
+
+/* Private headers */
+#include "brlcad_version.h"
+#include "tclcad_private.h"
+
+static int
+lwrapper_func(ClientData data, Tcl_Interp *interp, int argc, const char
*argv[])
+{
+ struct bu_cmdtab *ctp = (struct bu_cmdtab *)data;
+
+ return ctp->ct_func(interp, argc, argv);
+}
+
+
+
+#define TINYBUFSIZ 32
+#define SMALLBUFSIZ 256
+
+/**
+ * A wrapper for bu_prmem. Prints map of memory currently in use, to
+ * stderr.
+ *
+ * \@param clientData - UNUSED, present for signature matching
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_prmem(void *UNUSED(clientData),
+ int argc,
+ const char **argv)
+{
+ if (argc != 2) {
+ bu_log("Usage: bu_prmem title\n");
+ return BRLCAD_ERROR;
+ }
+
+ bu_prmem(argv[1]);
+ return BRLCAD_OK;
+}
+
+
+/**
+ * Given arguments of alternating keywords and values and a specific
+ * keyword ("Iwant"), return the value associated with that keyword.
+ *
+ * example: bu_get_value_by_keyword Iwant az 35 elev 25 temp 9.6
+ *
+ * If only one argument is given after the search keyword, it is
+ * interpreted as a list in the same format.
+ *
+ * example: bu_get_value_by_keyword Iwant {az 35 elev 25 temp 9.6}
+ *
+ * Search order is left-to-right, only first match is returned.
+ *
+ * Sample use:
+ * bu_get_value_by_keyword V8 [concat type [.inmem get box.s]]
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_get_value_by_keyword(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ int i = 0;
+ int listc = 0;
+ const char *iwant = (const char *)NULL;
+ const char **listv = (const char **)NULL;
+ const char **tofree = (const char **)NULL;
+
+ if (argc < 3) {
+ char buf[TINYBUFSIZ];
+ snprintf(buf, TINYBUFSIZ, "%d", argc);
+ bu_log("bu_get_value_by_keyword: wrong # of args (%s).\n"
+ "Usage: bu_get_value_by_keyword iwant {list}\n"
+ "Usage: bu_get_value_by_keyword iwant key1 val1 key2 val2 ...
keyN valN\n", buf);
+ return BRLCAD_ERROR;
+ }
+
+ iwant = argv[1];
+
+ if (argc == 3) {
+ if (Tcl_SplitList(interp, argv[2], &listc, (const char ***)&listv) !=
TCL_OK) {
+ bu_log("bu_get_value_by_keyword: iwant='%s', unable to split
'%s'\n", iwant, argv[2]);
+ return BRLCAD_ERROR;
+ }
+ tofree = listv;
+ } else {
+ /* Take search list from remaining arguments */
+ listc = argc - 2;
+ listv = argv + 2;
+ }
+
+ if ((listc & 1) != 0) {
+ char buf[TINYBUFSIZ];
+ snprintf(buf, TINYBUFSIZ, "%d", listc);
+ bu_log("bu_get_value_by_keyword: odd # of items in list (%s).\n", buf);
+
+ if (tofree)
+ Tcl_Free((char *)tofree); /* not bu_free() */
+ return BRLCAD_ERROR;
+ }
+
+ for (i=0; i < listc; i += 2) {
+ if (BU_STR_EQUAL(iwant, listv[i])) {
+ /* If value is a list, don't nest it in another list */
+ if (listv[i+1][0] == '{') {
+ struct bu_vls str = BU_VLS_INIT_ZERO;
+
+ /* Skip leading { */
+ bu_vls_strcat(&str, &listv[i+1][1]);
+ /* Trim trailing } */
+ bu_vls_trunc(&str, -1);
+ Tcl_AppendResult(interp, bu_vls_addr(&str), NULL);
+ bu_vls_free(&str);
+ } else {
+ Tcl_AppendResult(interp, listv[i+1], NULL);
+ }
+
+ if (tofree)
+ Tcl_Free((char *)tofree); /* not bu_free() */
+ return BRLCAD_OK;
+ }
+ }
+
+ /* Not found */
+
+ if (tofree)
+ Tcl_Free((char *)tofree); /* not bu_free() */
+ return BRLCAD_ERROR;
+}
+
+
+/**
+ * A wrapper for bu_rgb_to_hsv.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_rgb_to_hsv(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ int rgb_int[3];
+ unsigned char rgb[3];
+ fastf_t hsv[3];
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ if (argc != 4) {
+ bu_log("Usage: bu_rgb_to_hsv R G B\n");
+ return BRLCAD_ERROR;
+ }
+ if (sscanf(argv[1], "%d", &rgb_int[0]) != 1
+ || sscanf(argv[2], "%d", &rgb_int[1]) != 1
+ || sscanf(argv[3], "%d", &rgb_int[2]) != 1
+ || (rgb_int[0] < 0) || (rgb_int[0] > 255)
+ || (rgb_int[1] < 0) || (rgb_int[1] > 255)
+ || (rgb_int[2] < 0) || (rgb_int[2] > 255)) {
+ bu_vls_printf(&result, "bu_rgb_to_hsv: Bad RGB (%s, %s, %s)\n",
+ argv[1], argv[2], argv[3]);
+ bu_log("ERROR: %s", bu_vls_addr(&result));
+ bu_vls_free(&result);
+ return BRLCAD_ERROR;
+ }
+ rgb[0] = rgb_int[0];
+ rgb[1] = rgb_int[1];
+ rgb[2] = rgb_int[2];
+
+ bu_rgb_to_hsv(rgb, hsv);
+ bu_vls_printf(&result, "%g %g %g", hsv[0], hsv[1], hsv[2]);
+ Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
+ bu_vls_free(&result);
+ return BRLCAD_OK;
+
+}
+
+
+/**
+ * A wrapper for bu_hsv_to_rgb.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_hsv_to_rgb(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+
+ double vals[3];
+ fastf_t hsv[3];
+ unsigned char rgb[3];
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ if (argc != 4) {
+ bu_log("Usage: bu_hsv_to_rgb H S V\n");
+ return BRLCAD_ERROR;
+ }
+ if (sscanf(argv[1], "%lf", &vals[0]) != 1
+ || sscanf(argv[2], "%lf", &vals[1]) != 1
+ || sscanf(argv[3], "%lf", &vals[2]) != 1)
+ {
+ bu_log("Bad HSV parsing (%s, %s, %s)\n", argv[1], argv[2], argv[3]);
+ return BRLCAD_ERROR;
+ }
+
+ VMOVE(hsv, vals);
+ if (bu_hsv_to_rgb(hsv, rgb) == 0) {
+ bu_log("HSV to RGB conversion failed (%s, %s, %s)\n", argv[1], argv[2],
argv[3]);
+ return BRLCAD_ERROR;
+ }
+
+ bu_vls_printf(&result, "%d %d %d", rgb[0], rgb[1], rgb[2]);
+ Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
+ bu_vls_free(&result);
+ return BRLCAD_OK;
+
+}
+
+const char *
+_tclcad_bu_dir_print(const char *dirkey, int fail_quietly)
+{
+ static char result[MAXPATHLEN] = {0};
+ if (BU_STR_EQUIV(dirkey, "curr") || BU_STR_EQUIV(dirkey, "cwd") ||
+ BU_STR_EQUAL(dirkey, "BU_DIR_CURR")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CURR, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "init") || BU_STR_EQUIV(dirkey, "iwd") ||
+ BU_STR_EQUAL(dirkey, "BU_DIR_INIT")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_INIT, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "bin") || BU_STR_EQUAL(dirkey, "BU_DIR_BIN")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_BIN, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "lib") || BU_STR_EQUAL(dirkey, "BU_DIR_LIB")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIB, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "libexec") || BU_STR_EQUAL(dirkey,
"BU_DIR_LIBEXEC")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIBEXEC,
NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "include") || BU_STR_EQUAL(dirkey,
"BU_DIR_INCLUDE")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_INCLUDE,
NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "data") || BU_STR_EQUIV(dirkey, "share") ||
+ BU_STR_EQUAL(dirkey, "BU_DIR_DATA")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_DATA, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "doc") || BU_STR_EQUAL(dirkey, "BU_DIR_DOC")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_DOC, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "man") || BU_STR_EQUAL(dirkey, "BU_DIR_MAN")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_MAN, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "temp") || BU_STR_EQUAL(dirkey, "BU_DIR_TEMP")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_TEMP, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "home") || BU_STR_EQUAL(dirkey, "BU_DIR_HOME")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_HOME, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "cache") || BU_STR_EQUAL(dirkey, "BU_DIR_CACHE"))
{
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CACHE, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "config") || BU_STR_EQUAL(dirkey,
"BU_DIR_CONFIG")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CONFIG,
NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "ext") || BU_STR_EQUAL(dirkey, "BU_DIR_EXT")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_EXT, NULL));
+ return result;
+ }
+ if (BU_STR_EQUIV(dirkey, "libext") || BU_STR_EQUAL(dirkey,
"BU_DIR_LIBEXT")) {
+ snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIBEXT,
NULL));
+ return result;
+ }
+ if (!fail_quietly) {
+ snprintf(result, MAXPATHLEN, "Unknown directory key %s", dirkey);
+ return result;
+ }
+ return NULL;
+}
+
+/**
+ * A wrapper for bu_dir.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_dir(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ if (argc != 2) {
+ bu_log("Usage: bu_dir
[curr|init|bin|lib|libexec|include|data|doc|man|temp|home|cache|config|ext|libext]\n");
+ return BRLCAD_ERROR;
+ }
+ Tcl_AppendResult(interp, _tclcad_bu_dir_print(argv[1],1), NULL);
+ return BRLCAD_OK;
+}
+
+/**
+ * A wrapper for bu_brlcad_dir.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_brlcad_dir(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ if (argc != 2) {
+ bu_log("Usage: bu_brlcad_dir dirkey\n");
+ return BRLCAD_ERROR;
+ }
+ Tcl_AppendResult(interp, bu_brlcad_dir(argv[1], 1), NULL);
+ return BRLCAD_OK;
+}
+
+/**
+ * A wrapper for bu_brlcad_root.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_brlcad_root(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ if (argc != 2) {
+ bu_log("Usage: bu_brlcad_root subdir\n");
+ return BRLCAD_ERROR;
+ }
+ Tcl_AppendResult(interp, bu_brlcad_root(argv[1], 1), NULL);
+ return BRLCAD_OK;
+}
+
+
+/**
+ * A wrapper for bu_units_conversion.
+ *
+ * @param clientData - associated data/state
+ * @param argc - number of elements in argv
+ * @param argv - command name and arguments
+ *
+ * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
+ */
+HIDDEN int
+tcl_bu_units_conversion(void *clientData,
+ int argc,
+ const char **argv)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)clientData;
+ double conv_factor;
+ struct bu_vls result = BU_VLS_INIT_ZERO;
+
+ if (argc != 2) {
+ bu_log("Usage: bu_units_conversion units_string\n");
+ return BRLCAD_ERROR;
+ }
+
+ conv_factor = bu_units_conversion(argv[1]);
+ if (conv_factor <= 0.0) {
+ bu_log("ERROR: bu_units_conversion: Unrecognized units string: %s\n",
argv[1]);
+ return BRLCAD_ERROR;
+ }
+
+ bu_vls_printf(&result, "%.12e", conv_factor);
+ Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
+ bu_vls_free(&result);
+ return BRLCAD_OK;
+}
+
+
+static void
+register_cmds(Tcl_Interp *interp, struct bu_cmdtab *cmds)
+{
+ struct bu_cmdtab *ctp = NULL;
+
+ for (ctp = cmds; ctp->ct_name != (char *)NULL; ctp++) {
+ (void)Tcl_CreateCommand(interp, ctp->ct_name, lwrapper_func,
(ClientData)ctp, (Tcl_CmdDeleteProc *)NULL);
+ }
+}
+
+
+int
+Bu_Init(void *p)
+{
+ Tcl_Interp *interp = (Tcl_Interp *)p;
+
+ static struct bu_cmdtab cmds[] = {
+ {"bu_units_conversion", tcl_bu_units_conversion},
+ {"bu_dir", tcl_bu_dir},
+ {"bu_brlcad_dir", tcl_bu_brlcad_dir},
+ {"bu_brlcad_root", tcl_bu_brlcad_root},
+ {"bu_prmem", tcl_bu_prmem},
+ {"bu_get_value_by_keyword", tcl_bu_get_value_by_keyword},
+ {"bu_rgb_to_hsv", tcl_bu_rgb_to_hsv},
+ {"bu_hsv_to_rgb", tcl_bu_hsv_to_rgb},
+ {(const char *)NULL, BU_CMD_NULL}
+ };
+
+ register_cmds(interp, cmds);
+
+ Tcl_SetVar(interp, "BU_DEBUG_FORMAT", BU_DEBUG_FORMAT, TCL_GLOBAL_ONLY);
+ Tcl_LinkVar(interp, "bu_debug", (char *)&bu_debug, TCL_LINK_INT);
+
+ return BRLCAD_OK;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */
Property changes on: brlcad/trunk/src/libtclcad/bu_funcs.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified: brlcad/trunk/src/libtclcad/libfuncs.c
===================================================================
--- brlcad/trunk/src/libtclcad/libfuncs.c 2020-07-14 16:34:25 UTC (rev
76326)
+++ brlcad/trunk/src/libtclcad/libfuncs.c 2020-07-14 18:47:49 UTC (rev
76327)
@@ -48,1777 +48,7 @@
#include "brlcad_version.h"
#include "tclcad_private.h"
-static int
-lwrapper_func(ClientData data, Tcl_Interp *interp, int argc, const char
*argv[])
-{
- struct bu_cmdtab *ctp = (struct bu_cmdtab *)data;
- return ctp->ct_func(interp, argc, argv);
-}
-
-
-
-#define TINYBUFSIZ 32
-#define SMALLBUFSIZ 256
-
-/**
- * A wrapper for bu_prmem. Prints map of memory currently in use, to
- * stderr.
- *
- * \@param clientData - UNUSED, present for signature matching
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_prmem(void *UNUSED(clientData),
- int argc,
- const char **argv)
-{
- if (argc != 2) {
- bu_log("Usage: bu_prmem title\n");
- return BRLCAD_ERROR;
- }
-
- bu_prmem(argv[1]);
- return BRLCAD_OK;
-}
-
-
-/**
- * Given arguments of alternating keywords and values and a specific
- * keyword ("Iwant"), return the value associated with that keyword.
- *
- * example: bu_get_value_by_keyword Iwant az 35 elev 25 temp 9.6
- *
- * If only one argument is given after the search keyword, it is
- * interpreted as a list in the same format.
- *
- * example: bu_get_value_by_keyword Iwant {az 35 elev 25 temp 9.6}
- *
- * Search order is left-to-right, only first match is returned.
- *
- * Sample use:
- * bu_get_value_by_keyword V8 [concat type [.inmem get box.s]]
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_get_value_by_keyword(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- int i = 0;
- int listc = 0;
- const char *iwant = (const char *)NULL;
- const char **listv = (const char **)NULL;
- const char **tofree = (const char **)NULL;
-
- if (argc < 3) {
- char buf[TINYBUFSIZ];
- snprintf(buf, TINYBUFSIZ, "%d", argc);
- bu_log("bu_get_value_by_keyword: wrong # of args (%s).\n"
- "Usage: bu_get_value_by_keyword iwant {list}\n"
- "Usage: bu_get_value_by_keyword iwant key1 val1 key2 val2 ...
keyN valN\n", buf);
- return BRLCAD_ERROR;
- }
-
- iwant = argv[1];
-
- if (argc == 3) {
- if (Tcl_SplitList(interp, argv[2], &listc, (const char ***)&listv) !=
TCL_OK) {
- bu_log("bu_get_value_by_keyword: iwant='%s', unable to split
'%s'\n", iwant, argv[2]);
- return BRLCAD_ERROR;
- }
- tofree = listv;
- } else {
- /* Take search list from remaining arguments */
- listc = argc - 2;
- listv = argv + 2;
- }
-
- if ((listc & 1) != 0) {
- char buf[TINYBUFSIZ];
- snprintf(buf, TINYBUFSIZ, "%d", listc);
- bu_log("bu_get_value_by_keyword: odd # of items in list (%s).\n", buf);
-
- if (tofree)
- Tcl_Free((char *)tofree); /* not bu_free() */
- return BRLCAD_ERROR;
- }
-
- for (i=0; i < listc; i += 2) {
- if (BU_STR_EQUAL(iwant, listv[i])) {
- /* If value is a list, don't nest it in another list */
- if (listv[i+1][0] == '{') {
- struct bu_vls str = BU_VLS_INIT_ZERO;
-
- /* Skip leading { */
- bu_vls_strcat(&str, &listv[i+1][1]);
- /* Trim trailing } */
- bu_vls_trunc(&str, -1);
- Tcl_AppendResult(interp, bu_vls_addr(&str), NULL);
- bu_vls_free(&str);
- } else {
- Tcl_AppendResult(interp, listv[i+1], NULL);
- }
-
- if (tofree)
- Tcl_Free((char *)tofree); /* not bu_free() */
- return BRLCAD_OK;
- }
- }
-
- /* Not found */
-
- if (tofree)
- Tcl_Free((char *)tofree); /* not bu_free() */
- return BRLCAD_ERROR;
-}
-
-
-/**
- * A wrapper for bu_rgb_to_hsv.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_rgb_to_hsv(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- int rgb_int[3];
- unsigned char rgb[3];
- fastf_t hsv[3];
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- if (argc != 4) {
- bu_log("Usage: bu_rgb_to_hsv R G B\n");
- return BRLCAD_ERROR;
- }
- if (sscanf(argv[1], "%d", &rgb_int[0]) != 1
- || sscanf(argv[2], "%d", &rgb_int[1]) != 1
- || sscanf(argv[3], "%d", &rgb_int[2]) != 1
- || (rgb_int[0] < 0) || (rgb_int[0] > 255)
- || (rgb_int[1] < 0) || (rgb_int[1] > 255)
- || (rgb_int[2] < 0) || (rgb_int[2] > 255)) {
- bu_vls_printf(&result, "bu_rgb_to_hsv: Bad RGB (%s, %s, %s)\n",
- argv[1], argv[2], argv[3]);
- bu_log("ERROR: %s", bu_vls_addr(&result));
- bu_vls_free(&result);
- return BRLCAD_ERROR;
- }
- rgb[0] = rgb_int[0];
- rgb[1] = rgb_int[1];
- rgb[2] = rgb_int[2];
-
- bu_rgb_to_hsv(rgb, hsv);
- bu_vls_printf(&result, "%g %g %g", hsv[0], hsv[1], hsv[2]);
- Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
- bu_vls_free(&result);
- return BRLCAD_OK;
-
-}
-
-
-/**
- * A wrapper for bu_hsv_to_rgb.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_hsv_to_rgb(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
-
- double vals[3];
- fastf_t hsv[3];
- unsigned char rgb[3];
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- if (argc != 4) {
- bu_log("Usage: bu_hsv_to_rgb H S V\n");
- return BRLCAD_ERROR;
- }
- if (sscanf(argv[1], "%lf", &vals[0]) != 1
- || sscanf(argv[2], "%lf", &vals[1]) != 1
- || sscanf(argv[3], "%lf", &vals[2]) != 1)
- {
- bu_log("Bad HSV parsing (%s, %s, %s)\n", argv[1], argv[2], argv[3]);
- return BRLCAD_ERROR;
- }
-
- VMOVE(hsv, vals);
- if (bu_hsv_to_rgb(hsv, rgb) == 0) {
- bu_log("HSV to RGB conversion failed (%s, %s, %s)\n", argv[1], argv[2],
argv[3]);
- return BRLCAD_ERROR;
- }
-
- bu_vls_printf(&result, "%d %d %d", rgb[0], rgb[1], rgb[2]);
- Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
- bu_vls_free(&result);
- return BRLCAD_OK;
-
-}
-
-const char *
-_tclcad_bu_dir_print(const char *dirkey, int fail_quietly)
-{
- static char result[MAXPATHLEN] = {0};
- if (BU_STR_EQUIV(dirkey, "curr") || BU_STR_EQUIV(dirkey, "cwd") ||
- BU_STR_EQUAL(dirkey, "BU_DIR_CURR")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CURR, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "init") || BU_STR_EQUIV(dirkey, "iwd") ||
- BU_STR_EQUAL(dirkey, "BU_DIR_INIT")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_INIT, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "bin") || BU_STR_EQUAL(dirkey, "BU_DIR_BIN")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_BIN, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "lib") || BU_STR_EQUAL(dirkey, "BU_DIR_LIB")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIB, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "libexec") || BU_STR_EQUAL(dirkey,
"BU_DIR_LIBEXEC")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIBEXEC,
NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "include") || BU_STR_EQUAL(dirkey,
"BU_DIR_INCLUDE")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_INCLUDE,
NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "data") || BU_STR_EQUIV(dirkey, "share") ||
- BU_STR_EQUAL(dirkey, "BU_DIR_DATA")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_DATA, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "doc") || BU_STR_EQUAL(dirkey, "BU_DIR_DOC")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_DOC, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "man") || BU_STR_EQUAL(dirkey, "BU_DIR_MAN")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_MAN, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "temp") || BU_STR_EQUAL(dirkey, "BU_DIR_TEMP")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_TEMP, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "home") || BU_STR_EQUAL(dirkey, "BU_DIR_HOME")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_HOME, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "cache") || BU_STR_EQUAL(dirkey, "BU_DIR_CACHE"))
{
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CACHE, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "config") || BU_STR_EQUAL(dirkey,
"BU_DIR_CONFIG")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_CONFIG,
NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "ext") || BU_STR_EQUAL(dirkey, "BU_DIR_EXT")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_EXT, NULL));
- return result;
- }
- if (BU_STR_EQUIV(dirkey, "libext") || BU_STR_EQUAL(dirkey,
"BU_DIR_LIBEXT")) {
- snprintf(result, MAXPATHLEN, "%s", bu_dir(NULL, 0, BU_DIR_LIBEXT,
NULL));
- return result;
- }
- if (!fail_quietly) {
- snprintf(result, MAXPATHLEN, "Unknown directory key %s", dirkey);
- return result;
- }
- return NULL;
-}
-
-/**
- * A wrapper for bu_dir.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_dir(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- if (argc != 2) {
- bu_log("Usage: bu_dir
[curr|init|bin|lib|libexec|include|data|doc|man|temp|home|cache|config|ext|libext]\n");
- return BRLCAD_ERROR;
- }
- Tcl_AppendResult(interp, _tclcad_bu_dir_print(argv[1],1), NULL);
- return BRLCAD_OK;
-}
-
-/**
- * A wrapper for bu_brlcad_dir.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_brlcad_dir(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- if (argc != 2) {
- bu_log("Usage: bu_brlcad_dir dirkey\n");
- return BRLCAD_ERROR;
- }
- Tcl_AppendResult(interp, bu_brlcad_dir(argv[1], 1), NULL);
- return BRLCAD_OK;
-}
-
-/**
- * A wrapper for bu_brlcad_root.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_brlcad_root(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- if (argc != 2) {
- bu_log("Usage: bu_brlcad_root subdir\n");
- return BRLCAD_ERROR;
- }
- Tcl_AppendResult(interp, bu_brlcad_root(argv[1], 1), NULL);
- return BRLCAD_OK;
-}
-
-
-/**
- * A wrapper for bu_units_conversion.
- *
- * @param clientData - associated data/state
- * @param argc - number of elements in argv
- * @param argv - command name and arguments
- *
- * @return BRLCAD_OK if successful, otherwise, BRLCAD_ERROR.
- */
-HIDDEN int
-tcl_bu_units_conversion(void *clientData,
- int argc,
- const char **argv)
-{
- Tcl_Interp *interp = (Tcl_Interp *)clientData;
- double conv_factor;
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- if (argc != 2) {
- bu_log("Usage: bu_units_conversion units_string\n");
- return BRLCAD_ERROR;
- }
-
- conv_factor = bu_units_conversion(argv[1]);
- if (conv_factor <= 0.0) {
- bu_log("ERROR: bu_units_conversion: Unrecognized units string: %s\n",
argv[1]);
- return BRLCAD_ERROR;
- }
-
- bu_vls_printf(&result, "%.12e", conv_factor);
- Tcl_AppendResult(interp, bu_vls_addr(&result), NULL);
- bu_vls_free(&result);
- return BRLCAD_OK;
-}
-
-
-static void
-register_cmds(Tcl_Interp *interp, struct bu_cmdtab *cmds)
-{
- struct bu_cmdtab *ctp = NULL;
-
- for (ctp = cmds; ctp->ct_name != (char *)NULL; ctp++) {
- (void)Tcl_CreateCommand(interp, ctp->ct_name, lwrapper_func,
(ClientData)ctp, (Tcl_CmdDeleteProc *)NULL);
- }
-}
-
-
-int
-Bu_Init(void *p)
-{
- Tcl_Interp *interp = (Tcl_Interp *)p;
-
- static struct bu_cmdtab cmds[] = {
- {"bu_units_conversion", tcl_bu_units_conversion},
- {"bu_dir", tcl_bu_dir},
- {"bu_brlcad_dir", tcl_bu_brlcad_dir},
- {"bu_brlcad_root", tcl_bu_brlcad_root},
- {"bu_prmem", tcl_bu_prmem},
- {"bu_get_value_by_keyword", tcl_bu_get_value_by_keyword},
- {"bu_rgb_to_hsv", tcl_bu_rgb_to_hsv},
- {"bu_hsv_to_rgb", tcl_bu_hsv_to_rgb},
- {(const char *)NULL, BU_CMD_NULL}
- };
-
- register_cmds(interp, cmds);
-
- Tcl_SetVar(interp, "BU_DEBUG_FORMAT", BU_DEBUG_FORMAT, TCL_GLOBAL_ONLY);
- Tcl_LinkVar(interp, "bu_debug", (char *)&bu_debug, TCL_LINK_INT);
-
- return BRLCAD_OK;
-}
-
-
-void
-bn_quat_distance_wrapper(double *dp, mat_t q1, mat_t q2)
-{
- *dp = quat_distance(q1, q2);
-}
-
-
-static void
-bn_mat4x3vec(fastf_t *o, mat_t m, vect_t i)
-{
- MAT4X3VEC(o, m, i);
-}
-
-
-static void
-bn_hdivide(fastf_t *o, const mat_t i)
-{
- HDIVIDE(o, i);
-}
-
-static int
-tclcad_bn_dist_pnt2_lseg2(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- point_t ptA, ptB, pca;
- point_t pt;
- fastf_t dist;
- int ret;
- static const struct bn_tol tol = {
- BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
- };
-
- if (argc != 4) {
- bu_vls_printf(&result,
- "Usage: bn_dist_pnt2_lseg2 pntA pntB pnt (%d args specified)",
argc-1);
- goto error;
- }
-
- if (bn_decode_vect(ptA, argv[1]) < 2) {
- bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pntA: %s\n", argv[0]);
- goto error;
- }
-
- if (bn_decode_vect(ptB, argv[2]) < 2) {
- bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pntB: %s\n", argv[0]);
- goto error;
- }
-
- if (bn_decode_vect(pt, argv[3]) < 2) {
- bu_vls_printf(&result, "bn_dist_pnt2_lseg2 no pnt: %s\n", argv[0]);
- goto error;
- }
-
- ret = bn_dist_pnt2_lseg2(&dist, pca, ptA, ptB, pt, &tol);
- switch (ret) {
- case 0:
- case 1:
- case 2:
- dist = 0.0;
- break;
- default:
- break;
- }
-
- bu_vls_printf(&result, "%g", dist);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-
-}
-
-static int
-tclcad_bn_isect_line2_line2(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- fastf_t dist[2];
- point_t pt = VINIT_ZERO;
- point_t a = VINIT_ZERO;
- vect_t dir = VINIT_ZERO;
- vect_t c = VINIT_ZERO;
- int i;
- static const struct bn_tol tol = {
- BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
- };
-
- if (argc != 5) {
- bu_vls_printf(&result,
- "Usage: bn_isect_line2_line2 pt dir pt dir (%d args specified)",
- argc-1);
- goto error;
- }
-
- /* i = bn_isect_line2_line2 {0 0} {1 0} {1 1} {0 -1} */
-
- if (bn_decode_vect(pt, argv[1]) < 2) {
- bu_vls_printf(&result, "bn_isect_line2_line2 no pt: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(dir, argv[2]) < 2) {
- bu_vls_printf(&result, "bn_isect_line2_line2 no dir: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(a, argv[3]) < 2) {
- bu_vls_printf(&result, "bn_isect_line2_line2 no a pt: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(c, argv[4]) < 2) {
- bu_vls_printf(&result, "bn_isect_line2_line2 no c dir: %s\n", argv[0]);
- goto error;
- }
- i = bn_isect_line2_line2(dist, pt, dir, a, c, &tol);
- if (i != 1) {
- bu_vls_printf(&result, "bn_isect_line2_line2 no intersection: %s\n",
argv[0]);
- goto error;
- }
-
- VJOIN1(a, pt, dist[0], dir);
- bu_vls_printf(&result, "%g %g", V2INTCLAMPARGS(a));
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_isect_line3_line3(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- fastf_t t, u;
- point_t pt, a;
- vect_t dir, c;
- int i;
- static const struct bn_tol tol = {
- BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
- };
- if (argc != 5) {
- bu_vls_printf(&result,
- "Usage: bn_isect_line3_line3 pt dir pt dir (%d args specified)",
- argc-1);
- goto error;
- }
-
- if (bn_decode_vect(pt, argv[1]) < 3) {
- bu_vls_printf(&result, "bn_isect_line3_line3 no pt: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(dir, argv[2]) < 3) {
- bu_vls_printf(&result, "bn_isect_line3_line3 no dir: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(a, argv[3]) < 3) {
- bu_vls_printf(&result, "bn_isect_line3_line3 no a pt: %s\n", argv[0]);
- goto error;
- }
- if (bn_decode_vect(c, argv[4]) < 3) {
- bu_vls_printf(&result, "bn_isect_line3_line3 no c dir: %s\n", argv[0]);
- goto error;
- }
- i = bn_isect_line3_line3(&t, &u, pt, dir, a, c, &tol);
- if (i != 1) {
- bu_vls_printf(&result, "bn_isect_line3_line3 no intersection: %s\n",
argv[0]);
- goto error;
- }
-
- VJOIN1(a, pt, t, dir);
- bn_encode_vect(&result, a, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_inv(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- mat_t o, a;
-
- if (argc < 2 || bn_decode_mat(a, argv[1]) < 16) {
- bu_vls_printf(&result, "usage: %s mat", argv[0]);
- goto error;
- }
- bn_mat_inv(o, a);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_trn(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- mat_t o, a;
-
- if (argc < 2 || bn_decode_mat(a, argv[1]) < 16) {
- bu_vls_printf(&result, "usage: %s mat", argv[0]);
- goto error;
- }
- bn_mat_trn(o, a);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_matXvec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
-
- mat_t m;
- hvect_t i, o;
- if (argc < 3 || bn_decode_mat(m, argv[1]) < 16 ||
- bn_decode_hvect(i, argv[2]) < 4) {
- bu_vls_printf(&result, "usage: %s mat hvect", argv[0]);
- goto error;
- }
- bn_matXvec(o, m, i);
- bn_encode_hvect(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_mat4x3vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t m;
- vect_t i, o;
- MAT_ZERO(m);
- if (argc < 3 || bn_decode_mat(m, argv[1]) < 16 ||
- bn_decode_vect(i, argv[2]) < 3) {
- bu_vls_printf(&result, "usage: %s mat vect", argv[0]);
- goto error;
- }
- bn_mat4x3vec(o, m, i);
- bn_encode_vect(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_hdivide(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- hvect_t i;
- vect_t o;
- if (argc < 2 || bn_decode_hvect(i, argv[1]) < 4) {
- bu_vls_printf(&result, "usage: %s hvect", argv[0]);
- goto error;
- }
- bn_hdivide(o, i);
- bn_encode_vect(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_vjoin1(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- point_t o;
- point_t b, d;
- double c;
-
- if (argc < 4) {
- bu_vls_printf(&result, "usage: %s pnt scale dir", argv[0]);
- goto error;
- }
- if (bn_decode_vect(b, argv[1]) < 3) goto error;
- if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
- if (bn_decode_vect(d, argv[3]) < 3) goto error;
-
- VJOIN1(o, b, c, d); /* bn_vjoin1(o, b, c, d) */
- bn_encode_vect(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_vblend(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- point_t a, c, e;
- double b, d;
-
- if (argc < 5) {
- bu_vls_printf(&result, "usage: %s scale pnt scale pnt", argv[0]);
- goto error;
- }
-
- if (Tcl_GetDouble(interp, argv[1], &b) != TCL_OK) goto error;
- if (bn_decode_vect(c, argv[2]) < 3) goto error;
- if (Tcl_GetDouble(interp, argv[3], &d) != TCL_OK) goto error;
- if (bn_decode_vect(e, argv[4]) < 3) goto error;
-
- VBLEND2(a, b, c, d, e);
- bn_encode_vect(&result, a, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_ae_vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- fastf_t az, el;
- vect_t v;
-
- if (argc < 2 || bn_decode_vect(v, argv[1]) < 3) {
- bu_vls_printf(&result, "usage: %s vect", argv[0]);
- goto error;
- }
-
- bn_ae_vec(&az, &el, v);
- bu_vls_printf(&result, "%g %g", az, el);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_aet_vec(ClientData UNUSED(clientData), Tcl_Interp *interp, int argc,
char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- double acc;
- fastf_t az, el, twist, accuracy;
- vect_t vec_ae, vec_twist;
-
- if (argc < 4 || bn_decode_vect(vec_ae, argv[1]) < 3 ||
- bn_decode_vect(vec_twist, argv[2]) < 3 ||
- sscanf(argv[3], "%lf", &acc) < 1) {
- bu_vls_printf(&result, "usage: %s vec_ae vec_twist accuracy",
- argv[0]);
- goto error;
- }
- accuracy = acc;
-
- bn_aet_vec(&az, &el, &twist, vec_ae, vec_twist, accuracy);
- bu_vls_printf(&result, "%g %g %g", az, el, twist);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_mat_angles(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- double alpha, beta, ggamma;
-
- if (argc < 4) {
- bu_vls_printf(&result, "usage: %s alpha beta gamma", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[1], &alpha) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[2], &beta) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[3], &ggamma) != TCL_OK) goto error;
-
- bn_mat_angles(o, alpha, beta, ggamma);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_eigen2x2(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- fastf_t val1, val2;
- vect_t vec1, vec2;
- double a, b, c;
-
- if (argc < 4) {
- bu_vls_printf(&result, "usage: %s a b c", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[1], &a) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[3], &b) != TCL_OK) goto error;
-
- bn_eigen2x2(&val1, &val2, vec1, vec2, (fastf_t)a, (fastf_t)b,
- (fastf_t)c);
- bu_vls_printf(&result, "%g %g {%g %g %g} {%g %g %g}", INTCLAMP(val1),
INTCLAMP(val2),
- V3INTCLAMPARGS(vec1), V3INTCLAMPARGS(vec2));
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_mat_fromto(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- vect_t from, to;
- static const struct bn_tol tol = {
- BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST*BN_TOL_DIST, 1e-6, 1-1e-6
- };
-
- if (argc < 3 || bn_decode_vect(from, argv[1]) < 3 ||
- bn_decode_vect(to, argv[2]) < 3) {
- bu_vls_printf(&result, "usage: %s vecFrom vecTo", argv[0]);
- goto error;
- }
- bn_mat_fromto(o, from, to, &tol);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_xrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- double s, c;
-
- if (argc < 3) {
- bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
-
- bn_mat_xrot(o, s, c);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_yrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- double s, c;
-
- if (argc < 3) {
- bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
-
- bn_mat_yrot(o, s, c);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_zrot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- double s, c;
-
- if (argc < 3) {
- bu_vls_printf(&result, "usage: %s sinAngle cosAngle", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[1], &s) != TCL_OK) goto error;
- if (Tcl_GetDouble(interp, argv[2], &c) != TCL_OK) goto error;
-
- bn_mat_zrot(o, s, c);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_lookat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- vect_t dir;
- int yflip;
- if (argc < 3 || bn_decode_vect(dir, argv[1]) < 3) {
- bu_vls_printf(&result, "usage: %s dir yflip", argv[0]);
- goto error;
- }
- if (Tcl_GetBoolean(interp, argv[2], &yflip) != TCL_OK) goto error;
-
- bn_mat_lookat(o, dir, yflip);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_vec_ortho(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- vect_t ov, vec;
-
- if (argc < 2 || bn_decode_vect(vec, argv[1]) < 3) {
- bu_vls_printf(&result, "usage: %s vec", argv[0]);
- goto error;
- }
-
- bn_vec_ortho(ov, vec);
- bn_encode_vect(&result, ov, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_vec_perp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- vect_t ov, vec;
-
- if (argc < 2 || bn_decode_vect(vec, argv[1]) < 3) {
- bu_vls_printf(&result, "usage: %s vec", argv[0]);
- goto error;
- }
-
- bn_vec_perp(ov, vec);
- bn_encode_vect(&result, ov, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_xform_about_pnt(ClientData UNUSED(clientData), Tcl_Interp
*interp, int argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o, xform;
- vect_t v;
-
- if (argc < 3 || bn_decode_mat(xform, argv[1]) < 16 ||
- bn_decode_vect(v, argv[2]) < 3) {
- bu_vls_printf(&result, "usage: %s xform pt", argv[0]);
- goto error;
- }
-
- bn_mat_xform_about_pnt(o, xform, v);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_mat_arb_rot(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t o;
- point_t pt;
- vect_t dir;
- double angle;
-
- if (argc < 4 || bn_decode_vect(pt, argv[1]) < 3 ||
- bn_decode_vect(dir, argv[2]) < 3) {
- bu_vls_printf(&result, "usage: %s pt dir angle", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[3], &angle) != TCL_OK)
- return TCL_ERROR;
-
- bn_mat_arb_rot(o, pt, dir, (fastf_t)angle);
- bn_encode_mat(&result, o, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_quat_mat2quat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t mat;
- quat_t quat;
-
- if (argc < 2 || bn_decode_mat(mat, argv[1]) < 16) {
- bu_vls_printf(&result, "usage: %s mat", argv[0]);
- goto error;
- }
-
- quat_mat2quat(quat, mat);
- bn_encode_quat(&result, quat, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_quat_quat2mat(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- mat_t mat;
- quat_t quat;
-
- if (argc < 2 || bn_decode_quat(quat, argv[1]) < 4) {
- bu_vls_printf(&result, "usage: %s quat", argv[0]);
- goto error;
- }
-
- quat_quat2mat(mat, quat);
- bn_encode_mat(&result, mat, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_quat_distance(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t q1, q2;
- double d;
-
- if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
- bn_decode_quat(q2, argv[2]) < 4) {
- bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
- goto error;
- }
-
- bn_quat_distance_wrapper(&d, q1, q2);
- bu_vls_printf(&result, "%g", d);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_quat_double(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t oqot, q1, q2;
-
- if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
- bn_decode_quat(q2, argv[2]) < 4) {
- bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
- goto error;
- }
-
- quat_double(oqot, q1, q2);
- bn_encode_quat(&result, oqot, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-
-static int
-tclcad_bn_quat_bisect(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t oqot, q1, q2;
-
- if (argc < 3 || bn_decode_quat(q1, argv[1]) < 4 ||
- bn_decode_quat(q2, argv[2]) < 4) {
- bu_vls_printf(&result, "usage: %s quatA quatB", argv[0]);
- goto error;
- }
-
- quat_bisect(oqot, q1, q2);
- bn_encode_quat(&result, oqot, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-
-static int
-tclcad_bn_quat_make_nearest(ClientData UNUSED(clientData), Tcl_Interp *interp,
int argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t oqot, q1;
-
- if (argc < 2 || bn_decode_quat(oqot, argv[1]) < 4) {
- bu_vls_printf(&result, "usage: %s orig_quat", argv[0]);
- goto error;
- }
-
- quat_make_nearest(q1, oqot);
- bn_encode_quat(&result, q1, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-static int
-tclcad_bn_quat_slerp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t oq, q1, q2;
- double d;
-
- if (argc < 4 || bn_decode_quat(q1, argv[1]) < 4 ||
- bn_decode_quat(q2, argv[2]) < 4) {
- bu_vls_printf(&result, "usage: %s quat1 quat2 factor", argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[3], &d) != TCL_OK) goto error;
-
- quat_slerp(oq, q1, q2, d);
- bn_encode_quat(&result, oq, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-
-static int
-tclcad_bn_quat_sberp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t oq, q1, qa, qb, q2;
- double d;
-
- if (argc < 6 || bn_decode_quat(q1, argv[1]) < 4 ||
- bn_decode_quat(qa, argv[2]) < 4 || bn_decode_quat(qb, argv[3]) < 4
||
- bn_decode_quat(q2, argv[4]) < 4) {
- bu_vls_printf(&result, "usage: %s quat1 quatA quatB quat2 factor",
- argv[0]);
- goto error;
- }
- if (Tcl_GetDouble(interp, argv[5], &d) != TCL_OK) goto error;
-
- quat_sberp(oq, q1, qa, qb, q2, d);
- bn_encode_quat(&result, oq, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-
-static int
-tclcad_bn_quat_exp(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t qout, qin;
-
- if (argc < 2 || bn_decode_quat(qin, argv[1]) < 4) {
- bu_vls_printf(&result, "usage: %s quat", argv[0]);
- goto error;
- }
-
- quat_exp(qout, qin);
- bn_encode_quat(&result, qout, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-static int
-tclcad_bn_quat_log(ClientData UNUSED(clientData), Tcl_Interp *interp, int
argc, char **argv)
-{
- struct bu_vls result = BU_VLS_INIT_ZERO;
- quat_t qout, qin;
-
- if (argc < 2 || bn_decode_quat(qin, argv[1]) < 4) {
- bu_vls_printf(&result, "usage: %s quat", argv[0]);
- goto error;
- }
-
- quat_log(qout, qin);
- bn_encode_quat(&result, qout, 1);
-
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_OK;
-
-error:
- Tcl_AppendResult(interp, bu_vls_addr(&result), (char *)NULL);
- bu_vls_free(&result);
- return TCL_ERROR;
-}
-
-
-#define BN_FUNC_TCL_CAST(_func) ((int (*)(ClientData clientData, Tcl_Interp
*interp, int argc, const char *const *argv))_func)
-
-static struct math_func_link {
- const char *name;
- int (*func)(ClientData clientData, Tcl_Interp *interp, int argc, const
char *const *argv);
-} math_funcs[] = {
- /* FIXME: migrate these all to libged */
- {"bn_dist_pnt2_lseg2", BN_FUNC_TCL_CAST(tclcad_bn_dist_pnt2_lseg2) },
- {"bn_isect_line2_line2", BN_FUNC_TCL_CAST(tclcad_bn_isect_line2_line2)
},
- {"bn_isect_line3_line3", BN_FUNC_TCL_CAST(tclcad_bn_isect_line3_line3)
},
- {"mat_inv", BN_FUNC_TCL_CAST(tclcad_bn_mat_inv) },
- {"mat_trn", BN_FUNC_TCL_CAST(tclcad_bn_mat_trn) },
- {"matXvec", BN_FUNC_TCL_CAST(tclcad_bn_matXvec) },
- {"mat4x3vec", BN_FUNC_TCL_CAST(tclcad_bn_mat4x3vec) },
- {"hdivide", BN_FUNC_TCL_CAST(tclcad_bn_hdivide) },
- {"vjoin1", BN_FUNC_TCL_CAST(tclcad_bn_vjoin1) },
- {"vblend", BN_FUNC_TCL_CAST(tclcad_bn_vblend) },
- {"mat_ae_vec", BN_FUNC_TCL_CAST(tclcad_bn_ae_vec) },
- {"mat_aet_vec", BN_FUNC_TCL_CAST(tclcad_bn_aet_vec) },
- {"mat_angles", BN_FUNC_TCL_CAST(tclcad_bn_mat_angles) },
- {"mat_eigen2x2", BN_FUNC_TCL_CAST(tclcad_bn_eigen2x2) },
- {"mat_fromto", BN_FUNC_TCL_CAST(tclcad_bn_mat_fromto) },
- {"mat_xrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_xrot) },
- {"mat_yrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_yrot) },
- {"mat_zrot", BN_FUNC_TCL_CAST(tclcad_bn_mat_zrot) },
- {"mat_lookat", BN_FUNC_TCL_CAST(tclcad_bn_mat_lookat) },
- {"mat_vec_ortho", BN_FUNC_TCL_CAST(tclcad_bn_vec_ortho) },
- {"mat_vec_perp", BN_FUNC_TCL_CAST(tclcad_bn_vec_perp) },
- {"mat_xform_about_pnt",
BN_FUNC_TCL_CAST(tclcad_bn_mat_xform_about_pnt) },
- {"mat_arb_rot", BN_FUNC_TCL_CAST(tclcad_bn_mat_arb_rot) },
- {"quat_mat2quat", BN_FUNC_TCL_CAST(tclcad_bn_quat_mat2quat) },
- {"quat_quat2mat", BN_FUNC_TCL_CAST(tclcad_bn_quat_quat2mat) },
- {"quat_distance", BN_FUNC_TCL_CAST(tclcad_bn_quat_distance) },
- {"quat_double", BN_FUNC_TCL_CAST(tclcad_bn_quat_double) },
- {"quat_bisect", BN_FUNC_TCL_CAST(tclcad_bn_quat_bisect) },
- {"quat_make_nearest", BN_FUNC_TCL_CAST(tclcad_bn_quat_make_nearest)
},
- {"quat_slerp", BN_FUNC_TCL_CAST(tclcad_bn_quat_slerp) },
- {"quat_sberp", BN_FUNC_TCL_CAST(tclcad_bn_quat_sberp) },
- {"quat_exp", BN_FUNC_TCL_CAST(tclcad_bn_quat_exp) },
- {"quat_log", BN_FUNC_TCL_CAST(tclcad_bn_quat_log) },
- {0, 0}
-};
-
-int
-bn_cmd_noise_perlin(ClientData UNUSED(clientData),
- Tcl_Interp *interp,
- int argc,
- char **argv)
-{
- point_t pt;
- double v;
-
- if (argc != 4) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " X Y Z \"",
- NULL);
- return TCL_ERROR;
- }
-
- pt[X] = atof(argv[1]);
- pt[Y] = atof(argv[2]);
- pt[Z] = atof(argv[3]);
-
- v = bn_noise_perlin(pt);
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(v));
-
- return TCL_OK;
-}
-
-
-/*
- * usage: bn_noise_fbm X Y Z h_val lacunarity octaves
- *
- */
-int
-bn_cmd_noise(ClientData UNUSED(clientData),
- Tcl_Interp *interp,
- int argc,
- char **argv)
-{
- point_t pt;
- double h_val;
- double lacunarity;
- double octaves;
- double val;
-
- if (argc != 7) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " X Y Z h_val lacunarity octaves\"",
- NULL);
- return TCL_ERROR;
- }
-
- pt[0] = atof(argv[1]);
- pt[1] = atof(argv[2]);
- pt[2] = atof(argv[3]);
-
- h_val = atof(argv[4]);
- lacunarity = atof(argv[5]);
- octaves = atof(argv[6]);
-
-
- if (BU_STR_EQUAL("bn_noise_turb", argv[0])) {
- val = bn_noise_turb(pt, h_val, lacunarity, octaves);
-
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
- } else if (BU_STR_EQUAL("bn_noise_fbm", argv[0])) {
- val = bn_noise_fbm(pt, h_val, lacunarity, octaves);
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
- } else {
- Tcl_AppendResult(interp, "Unknown noise type \"",
- argv[0], "\"", NULL);
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-
-/**
- * @brief
- * usage: noise_slice xdim ydim inv h_val lac octaves dX dY dZ sX [sY sZ]
- *
- * The idea here is to get a whole slice of noise at once, thereby
- * avoiding the overhead of doing this in Tcl.
- */
-int
-bn_cmd_noise_slice(ClientData UNUSED(clientData),
- Tcl_Interp *interp,
- int argc,
- char **argv)
-{
- double h_val;
- double lacunarity;
- double octaves;
-
- vect_t delta; /* translation to noise space */
- vect_t scale; /* scale to noise space */
- unsigned xdim; /* # samples X direction */
- unsigned ydim; /* # samples Y direction */
- unsigned xval, yval;
-#define NOISE_FBM 0
-#define NOISE_TURB 1
-
-#define COV186_UNUSED_CODE 0
-#if COV186_UNUSED_CODE
- int noise_type = NOISE_FBM;
-#endif
- double val;
- point_t pt;
-
- if (argc != 7) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " Xdim Ydim Zval h_val lacunarity octaves\"",
- NULL);
- return TCL_ERROR;
- }
-
- xdim = atoi(argv[0]);
- ydim = atoi(argv[1]);
- VSETALL(delta, 0.0);
- VSETALL(scale, 1.);
- pt[Z] = delta[Z] = atof(argv[2]);
- h_val = atof(argv[3]);
- lacunarity = atof(argv[4]);
- octaves = atof(argv[5]);
-
-#define COV186_UNUSED_CODE 0
- /* Only NOISE_FBM is possible at this time, so comment out the switching
for
- * NOISE_TURB. This may need to be deleted. */
-#if COV186_UNUSED_CODE
- switch (noise_type) {
- case NOISE_FBM:
-#endif
- for (yval = 0; yval < ydim; yval++) {
-
- pt[Y] = yval * scale[Y] + delta[Y];
-
- for (xval = 0; xval < xdim; xval++) {
- pt[X] = xval * scale[X] + delta[X];
-
- bn_noise_fbm(pt, h_val, lacunarity, octaves);
-
- }
- }
-#if COV186_UNUSED_CODE
- break;
- case NOISE_TURB:
- for (yval = 0; yval < ydim; yval++) {
-
- pt[Y] = yval * scale[Y] + delta[Y];
-
- for (xval = 0; xval < xdim; xval++) {
- pt[X] = xval * scale[X] + delta[X];
-
- val = bn_noise_turb(pt, h_val, lacunarity, octaves);
-
- }
- }
- break;
- }
-#endif
-
-
- pt[0] = atof(argv[1]);
- pt[1] = atof(argv[2]);
- pt[2] = atof(argv[3]);
-
- h_val = atof(argv[4]);
- lacunarity = atof(argv[5]);
- octaves = atof(argv[6]);
-
-
- if (BU_STR_EQUAL("bn_noise_turb", argv[0])) {
- val = bn_noise_turb(pt, h_val, lacunarity, octaves);
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
- } else if (BU_STR_EQUAL("bn_noise_fbm", argv[0])) {
- val = bn_noise_fbm(pt, h_val, lacunarity, octaves);
- Tcl_SetObjResult(interp, Tcl_NewDoubleObj(val));
- } else {
- Tcl_AppendResult(interp, "Unknown noise type \"",
- argv[0], "\"", NULL);
- return TCL_ERROR;
- }
- return TCL_OK;
-}
-
-
-int
-bn_cmd_random(ClientData UNUSED(clientData),
- Tcl_Interp *interp,
- int argc,
- char **argv)
-{
- int val;
- const char *str;
- double rnd;
- char buf[32];
-
- if (argc != 2) {
- Tcl_AppendResult(interp, "Wrong # args: Should be \"",
- argv[0], " varname\"", NULL);
- return TCL_ERROR;
- }
-
- str=Tcl_GetVar(interp, argv[1], 0);
- if (!str) {
- Tcl_AppendResult(interp, "Error getting variable ",
- argv[1], NULL);
- return TCL_ERROR;
- }
- val = atoi(str);
-
- V_MAX(val, 0);
-
- rnd = BN_RANDOM(val);
-
- snprintf(buf, 32, "%d", val);
-
- if (!Tcl_SetVar(interp, argv[1], buf, 0)) {
- Tcl_AppendResult(interp, "Error setting variable ",
- argv[1], NULL);
- return TCL_ERROR;
- }
-
- snprintf(buf, 32, "%g", rnd);
- Tcl_AppendResult(interp, buf, NULL);
- return TCL_OK;
-}
-
-
-void
-tclcad_bn_mat_print(Tcl_Interp *interp,
- const char *title,
- const mat_t m)
-{
- char obuf[1024]; /* snprintf may be non-PARALLEL */
-
- bn_mat_print_guts(title, m, obuf, 1024);
- Tcl_AppendResult(interp, obuf, "\n", (char *)NULL);
-}
-
-
-void
-tclcad_bn_setup(Tcl_Interp *interp)
-{
- struct math_func_link *mp;
-
- for (mp = math_funcs; mp->name != NULL; mp++) {
- (void)Tcl_CreateCommand(interp, mp->name,
- (Tcl_CmdProc *)mp->func,
- (ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
- }
-
- (void)Tcl_CreateCommand(interp, "bn_noise_perlin",
- (Tcl_CmdProc *)bn_cmd_noise_perlin,
(ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
-
- (void)Tcl_CreateCommand(interp, "bn_noise_turb",
- (Tcl_CmdProc *)bn_cmd_noise, (ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
-
- (void)Tcl_CreateCommand(interp, "bn_noise_fbm",
- (Tcl_CmdProc *)bn_cmd_noise, (ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
-
- (void)Tcl_CreateCommand(interp, "bn_noise_slice",
- (Tcl_CmdProc *)bn_cmd_noise_slice, (ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
-
- (void)Tcl_CreateCommand(interp, "bn_random",
- (Tcl_CmdProc *)bn_cmd_random, (ClientData)NULL,
- (Tcl_CmdDeleteProc *)NULL);
-}
-
-
-int
-Bn_Init(Tcl_Interp *interp)
-{
- tclcad_bn_setup(interp);
- return TCL_OK;
-}
-
-
#define RT_FUNC_TCL_CAST(_func) ((int (*)(ClientData clientData, Tcl_Interp
*interp, int argc, const char *const *argv))_func)
static int tclcad_rt_shootray(ClientData clientData, Tcl_Interp *interp, int
argc, const char *const *argv);
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