Revision: 44639
http://brlcad.svn.sourceforge.net/brlcad/?rev=44639&view=rev
Author: starseeker
Date: 2011-05-20 00:44:52 +0000 (Fri, 20 May 2011)
Log Message:
-----------
Take a stab at switching from bu_mro (??) to bu_attribute_value_set - this will
need a lot more testing (certainly of nirt and raytracing) to make sure nothing
got busted.
Modified Paths:
--------------
brlcad/trunk/include/bu.h
brlcad/trunk/include/magic.h
brlcad/trunk/include/raytrace.h
brlcad/trunk/src/libbu/CMakeLists.txt
brlcad/trunk/src/libbu/magic.c
brlcad/trunk/src/librt/prep.c
brlcad/trunk/src/librt/tree.c
brlcad/trunk/src/librtserver/rtserver.c
brlcad/trunk/src/nirt/if.c
brlcad/trunk/src/rt/rtshot.c
Removed Paths:
-------------
brlcad/trunk/src/libbu/mro.c
Modified: brlcad/trunk/include/bu.h
===================================================================
--- brlcad/trunk/include/bu.h 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/include/bu.h 2011-05-20 00:44:52 UTC (rev 44639)
@@ -1698,44 +1698,7 @@
BU_EXPORT extern int bu_setjmp_valid; /* !0 = bu_jmpbuf is valid */
BU_EXPORT extern jmp_buf bu_jmpbuf; /* for BU_SETJMP() */
/** @} */
-/*-------------------------------------------------------------------------*/
-/** @addtogroup mro */
-/** @{ */
-/**
- * B U _ M R O
- *
- * Support for Multiply Represented Objects
- */
-struct bu_mro {
- unsigned long magic;
- struct bu_vls string_rep;
- char long_rep_is_valid;
- long long_rep;
- char double_rep_is_valid;
- double double_rep;
-};
-
-#define BU_CK_MRO(_vp) BU_CKMAG(_vp, BU_MRO_MAGIC, "bu_mro")
-
-#define BU_MRO_INVALIDATE(_p) {\
- _p->long_rep_is_valid = '\0';\
- _p->double_rep_is_valid = '\0';\
-}
-
-#define BU_MRO_GETDOUBLE(_p) (_p->double_rep_is_valid ? _p->double_rep : \
- (_p->double_rep = strtod(bu_vls_addr(&_p->string_rep), NULL), \
- (_p->double_rep_is_valid='y', _p->double_rep)))
-
-#define BU_MRO_GETLONG(_p) (_p->long_rep_is_valid ? _p->long_rep : \
- (_p->long_rep = strtol(bu_vls_addr(&_p->string_rep), NULL, 10), \
- (_p->long_rep_is_valid='y', _p->long_rep)))
-
-#define BU_MRO_GETSTRING(_p) bu_vls_addr(&_p->string_rep)
-
-#define BU_MRO_STRLEN(_p) bu_vls_strlen(&_p->string_rep)
-/** @} */
-
/*----------------------------------------------------------------------*/
/**
* @addtogroup bu_debug Debugging
@@ -5883,28 +5846,6 @@
/** @} */
-/** @addtogroup mro */
-/** @{ */
-/** @file mro.c
- *
- * @brief
- * The Multiply Represented Object package.
- *
- */
-
-BU_EXPORT BU_EXTERN(void bu_mro_init_with_string,
- (struct bu_mro *mrop, const char *string));
-BU_EXPORT BU_EXTERN(void bu_mro_set,
- (struct bu_mro *mrop,
- const char *string));
-BU_EXPORT BU_EXTERN(void bu_mro_init,
- (struct bu_mro *mrop));
-BU_EXPORT BU_EXTERN(void bu_mro_free,
- (struct bu_mro *mrop));
-
-
-/** @} */
-
/** @addtogroup bu_hash */
/** @{ */
/** @file hash.c
Modified: brlcad/trunk/include/magic.h
===================================================================
--- brlcad/trunk/include/magic.h 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/include/magic.h 2011-05-20 00:44:52 UTC (rev 44639)
@@ -72,7 +72,6 @@
#define BU_IMAGE_FILE_MAGIC 0x6269666d /**< bifm */
#define BU_LIST_HEAD_MAGIC 0x01016580
#define BU_MAPPED_FILE_MAGIC 0x4d617066 /**< Mapf */
-#define BU_MRO_MAGIC 0x4D524F4F /**< MROO */
#define BU_PTBL_MAGIC 0x7074626c /**< ptbl */
#define BU_RB_LIST_MAGIC 0x72626c73
#define BU_RB_NODE_MAGIC 0x72626e6f
Modified: brlcad/trunk/include/raytrace.h
===================================================================
--- brlcad/trunk/include/raytrace.h 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/include/raytrace.h 2011-05-20 00:44:52 UTC (rev 44639)
@@ -582,9 +582,7 @@
#define REGION_NON_FASTGEN 0
#define REGION_FASTGEN_PLATE 1
#define REGION_FASTGEN_VOLUME 2
- struct bu_mro ** attr_values; /**< @brief Null terminated array of
MRO structs
- * Each containing a value for the
corresponding
- * attribute name passed to
rt_gettrees_and_attrs() */
+ struct bu_attribute_value_set attr_values; /**< @brief Attribute/value set
*/
};
#define REGION_NULL ((struct region *)0)
#define RT_CK_REGION(_p) BU_CKMAG(_p, RT_REGION_MAGIC, "struct region")
Modified: brlcad/trunk/src/libbu/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/libbu/CMakeLists.txt 2011-05-19 22:19:55 UTC (rev
44638)
+++ brlcad/trunk/src/libbu/CMakeLists.txt 2011-05-20 00:44:52 UTC (rev
44639)
@@ -46,7 +46,6 @@
malloc.c
mappedfile.c
mread.c
- mro.c
observer.c
parallel.c
parse.c
Modified: brlcad/trunk/src/libbu/magic.c
===================================================================
--- brlcad/trunk/src/libbu/magic.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/libbu/magic.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -57,8 +57,6 @@
return "bu_list";
case BU_MAPPED_FILE_MAGIC:
return "bu_mapped_file";
- case BU_MRO_MAGIC:
- return "bu_mro";
case BU_PTBL_MAGIC:
return "bu_ptbl";
case BU_RB_LIST_MAGIC:
Deleted: brlcad/trunk/src/libbu/mro.c
===================================================================
--- brlcad/trunk/src/libbu/mro.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/libbu/mro.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -1,78 +0,0 @@
-/* M R O . C
- * BRL-CAD
- *
- * Copyright (c) 2001-2011 United States Government as represented by
- * the U.S. Army Research Laboratory.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this file; see the file named COPYING for more
- * information.
- */
-
-#include "common.h"
-
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "bu.h"
-
-
-void
-bu_mro_init(struct bu_mro *mrop)
-{
- mrop->magic = BU_MRO_MAGIC;
- bu_vls_init(&mrop->string_rep);
- BU_MRO_INVALIDATE(mrop);
-}
-
-
-void
-bu_mro_free(struct bu_mro *mrop)
-{
- BU_CK_MRO(mrop);
-
- bu_vls_free(&mrop->string_rep);
- BU_MRO_INVALIDATE(mrop);
-}
-
-
-void
-bu_mro_set(struct bu_mro *mrop, const char *string)
-{
- BU_CK_MRO(mrop);
-
- bu_vls_trunc(&mrop->string_rep, 0);
- bu_vls_strcpy(&mrop->string_rep, string);
- BU_MRO_INVALIDATE(mrop);
-}
-
-
-void
-bu_mro_init_with_string(struct bu_mro *mrop, const char *string)
-{
- mrop->magic = BU_MRO_MAGIC;
- bu_vls_init(&mrop->string_rep);
- bu_vls_strcpy(&mrop->string_rep, string);
- BU_MRO_INVALIDATE(mrop);
-}
-
-/*
- * Local Variables:
- * mode: C
- * tab-width: 8
- * indent-tabs-mode: t
- * c-file-style: "stroustrup"
- * End:
- * ex: shiftwidth=4 tabstop=8
- */
Modified: brlcad/trunk/src/librt/prep.c
===================================================================
--- brlcad/trunk/src/librt/prep.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/librt/prep.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -941,15 +941,7 @@
bu_free((genptr_t)regp->reg_mater.ma_shader, "ma_shader");
regp->reg_mater.ma_shader = (char *)NULL;
}
- if (regp->attr_values) {
- i = 0;
- while (regp->attr_values[i]) {
- bu_mro_free(regp->attr_values[i]);
- bu_free(regp->attr_values[i], "rp->attr_values[i]");
- i++;
- }
- bu_free((char *)regp->attr_values, "regp->attr_values");
- }
+ bu_avs_free(&(regp->attr_values));
bu_free((genptr_t)regp, "struct region");
}
rtip->nregions = 0;
@@ -1104,14 +1096,7 @@
delregp->reg_treetop = TREE_NULL;
bu_free((char *)delregp->reg_name, "region name str");
delregp->reg_name = (char *)0;
- if (delregp->attr_values) {
- int i=0;
- while (delregp->attr_values[i]) {
- bu_mro_free(delregp->attr_values[i]);
- i++;
- }
- bu_free((char *)delregp->attr_values, "delregp->attr_values");
- }
+ bu_avs_free(&(delregp->attr_values));
bu_free((char *)delregp, "struct region");
return 0;
}
@@ -1202,7 +1187,6 @@
}
-
/**
* R T _ L O A D _ A T T R S
*
@@ -1221,76 +1205,47 @@
const char *reg_name;
const char *attr;
int attr_count=0;
- int mro_count;
- int did_set;
int region_count=0;
- int i;
+ int did_set, i;
RT_CHECK_RTI(rtip);
RT_CK_DBI(rtip->rti_dbip);
if (db_version(rtip->rti_dbip) < 5)
- return 0;
+ return 0;
while (attrs[attr_count])
- attr_count++;
+ attr_count++;
for (BU_LIST_FOR(regp, region, &(rtip->HeadRegion))) {
- RT_CK_REGION(regp);
+ RT_CK_REGION(regp);
did_set = 0;
- mro_count = 0;
- while (regp->attr_values[mro_count])
- mro_count++;
+ if ((reg_name=strrchr(regp->reg_name, '/')) == NULL)
+ reg_name = regp->reg_name;
+ else
+ reg_name++;
- if (mro_count < attr_count) {
- /* don't have enough to store all the values */
- for (i=0; i<mro_count; i++) {
- bu_mro_free(regp->attr_values[i]);
- bu_free((char *)regp->attr_values[i], "regp->attr_values[i]");
- }
- if (mro_count)
- bu_free((char *)regp->attr_values, "regp->attr_values");
- regp->attr_values = (struct bu_mro **)bu_calloc(attr_count + 1,
- sizeof(struct
bu_mro *), "regp->attr_values");
- for (i=0; i<attr_count; i++) {
- regp->attr_values[i] = bu_malloc(sizeof(struct bu_mro),
- "regpp->attr_values[i]");
- bu_mro_init(regp->attr_values[i]);
- }
- } else if (mro_count > attr_count) {
- /* just reuse what we have */
- for (i=attr_count; i<mro_count; i++) {
- bu_mro_free(regp->attr_values[i]);
- bu_free((char *)regp->attr_values[i], "regp->attr_values[i]");
- }
- regp->attr_values[attr_count] = (struct bu_mro *)NULL;
- }
+ if ((dp=db_lookup(rtip->rti_dbip, reg_name, LOOKUP_NOISY)) ==
RT_DIR_NULL)
+ continue;
- if ((reg_name=strrchr(regp->reg_name, '/')) == NULL)
- reg_name = regp->reg_name;
- else
- reg_name++;
+ bu_avs_init_empty(&avs);
+ if (db5_get_attributes(rtip->rti_dbip, &avs, dp)) {
+ bu_log("rt_load_attrs: Failed to get attributes for region %s\n",
reg_name);
+ continue;
+ }
- if ((dp=db_lookup(rtip->rti_dbip, reg_name, LOOKUP_NOISY)) ==
RT_DIR_NULL)
- continue;
-
- bu_avs_init_empty(&avs);
- if (db5_get_attributes(rtip->rti_dbip, &avs, dp)) {
- bu_log("rt_load_attrs: Failed to get attributes for region %s\n",
reg_name);
- continue;
- }
-
+ bu_avs_init_empty(&(regp->attr_values));
for (i=0; i<attr_count; i++) {
- if ((attr = bu_avs_get(&avs, attrs[i])) == NULL)
- continue;
+ if ((attr = bu_avs_get(&avs, attrs[i])) == NULL)
+ continue;
- bu_mro_set(regp->attr_values[i], attr);
- did_set = 1;
+ bu_avs_add(&(regp->attr_values), attrs[i], attr);
+ did_set = 1;
}
if (did_set)
- region_count++;
+ region_count++;
bu_avs_free(&avs);
}
@@ -1708,14 +1663,7 @@
bu_free((genptr_t)rp->reg_mater.ma_shader, "ma_shader");
rp->reg_mater.ma_shader = (char *)NULL;
}
- if (rp->attr_values) {
- i = 0;
- while (rp->attr_values[i]) {
- bu_mro_free(rp->attr_values[i]);
- i++;
- }
- bu_free((char *)rp->attr_values, "rp->attr_values");
- }
+ bu_avs_free(&(rp->attr_values));
bu_free((genptr_t)rp, "struct region");
}
Modified: brlcad/trunk/src/librt/tree.c
===================================================================
--- brlcad/trunk/src/librt/tree.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/librt/tree.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -154,7 +154,6 @@
struct directory *dp;
size_t shader_len=0;
struct rt_i *rtip;
- size_t i;
Tcl_HashTable *tbl = (Tcl_HashTable *)client_data;
Tcl_HashEntry *entry;
matp_t inv_mat;
@@ -179,16 +178,9 @@
rp->reg_gmater = tsp->ts_gmater;
rp->reg_los = tsp->ts_los;
+ bu_avs_init_empty(&(rp->attr_values));
if (tsp->ts_attrs.count && tsp->ts_attrs.avp) {
- rp->attr_values = (struct bu_mro **)bu_calloc(tsp->ts_attrs.count+1,
- sizeof(struct bu_mro *),
"regp->attr_values");
- for (i=0; i<(size_t)tsp->ts_attrs.count; i++) {
- rp->attr_values[i] = bu_malloc(sizeof(struct bu_mro),
- "rp->attr_values[i]");
- bu_mro_init_with_string(rp->attr_values[i],
tsp->ts_attrs.avp[i].value);
- }
- } else {
- rp->attr_values = (struct bu_mro **)NULL;
+ bu_avs_merge(&(rp->attr_values), &(tsp->ts_attrs));
}
rp->reg_mater = tsp->ts_mater; /* struct copy */
@@ -752,11 +744,8 @@
*
* rtip - RT instance pointer
*
- * attrs - array of pointers (NULL terminated) to strings (attribute
- * names). A corresponding array of "bu_mro" objects containing the
- * attribute values will be attached to region structures
- * ("attr_values")
- *
+ * attrs - attribute value set
+ *
* argc - number of trees to get
*
* argv - array of char pointers to the names of the tree tops
@@ -802,33 +791,34 @@
tree_state.ts_rtip = rtip;
tree_state.ts_resp = NULL; /* sanity. Needs to be updated */
- if (attrs) {
- if (db_version(rtip->rti_dbip) < 5) {
- bu_log("WARNING: requesting attributes from an old database
version (ignored)\n");
- bu_avs_init_empty(&tree_state.ts_attrs);
- } else {
- while (attrs[num_attrs]) {
- num_attrs++;
- }
- if (num_attrs) {
- bu_avs_init(&tree_state.ts_attrs,
- num_attrs,
- "avs in tree_state");
- num_attrs = 0;
- while (attrs[num_attrs]) {
- bu_avs_add(&tree_state.ts_attrs,
- attrs[num_attrs],
- NULL);
- num_attrs++;
- }
- } else {
- bu_avs_init_empty(&tree_state.ts_attrs);
- }
- }
- } else {
- bu_avs_init_empty(&tree_state.ts_attrs);
- }
+ if (attrs) {
+ if (db_version(rtip->rti_dbip) < 5) {
+ bu_log("WARNING: requesting attributes from an old database
version (ignored)\n");
+ bu_avs_init_empty(&tree_state.ts_attrs);
+ } else {
+ while (attrs[num_attrs]) {
+ num_attrs++;
+ }
+ if (num_attrs) {
+ bu_avs_init(&tree_state.ts_attrs,
+ num_attrs,
+ "avs in tree_state");
+ num_attrs = 0;
+ while (attrs[num_attrs]) {
+ bu_avs_add(&tree_state.ts_attrs,
+ attrs[num_attrs],
+ NULL);
+ num_attrs++;
+ }
+ } else {
+ bu_avs_init_empty(&tree_state.ts_attrs);
+ }
+ }
+ } else {
+ bu_avs_init_empty(&tree_state.ts_attrs);
+ }
+
i = db_walk_tree(rtip->rti_dbip, argc, argv, ncpus,
&tree_state,
_rt_gettree_region_start,
Modified: brlcad/trunk/src/librtserver/rtserver.c
===================================================================
--- brlcad/trunk/src/librtserver/rtserver.c 2011-05-19 22:19:55 UTC (rev
44638)
+++ brlcad/trunk/src/librtserver/rtserver.c 2011-05-20 00:44:52 UTC (rev
44639)
@@ -201,20 +201,22 @@
/* visit each region in this rt_i */
for ( j=0; j<rtip->nregions; j++ ) {
struct region *rp=rtip->Regions[j];
- struct bu_mro *attrs=rp->attr_values[0];
int new;
+ const char *attrget;
CLIENTDATA_INT idx=0;
- if ( !rp || BU_MRO_STRLEN(attrs) < 1 ) {
+ attrget = bu_avs_get(&(rp->attr_values), "MUVES_Component");
+
+ if ( attrget == NULL ) {
/* not a region, or does not have a MUVES_Component attribute */
continue;
}
/* create an entry for this MUVES_Component name */
- name_entry = Tcl_CreateHashEntry( &name_tbl, BU_MRO_GETSTRING(
attrs ), &new );
+ name_entry = Tcl_CreateHashEntry( &name_tbl, attrget, &new );
if ( verbose ) {
fprintf( stderr, "region %s, name = %s\n",
- rp->reg_name, BU_MRO_GETSTRING( attrs ) );
+ rp->reg_name, attrget );
}
/* set value to next index */
if ( new ) {
Modified: brlcad/trunk/src/nirt/if.c
===================================================================
--- brlcad/trunk/src/nirt/if.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/nirt/if.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -65,8 +65,8 @@
fastf_t get_obliq(fastf_t *ray, fastf_t *normal);
struct bu_vls *vls;
struct bu_vls attr_vls;
- struct bu_mro **attr_values;
char regionPN[512] = {0};
+ struct bu_attribute_value_pair *avpp;
/* quellage */
finished_segs = finished_segs;
@@ -184,16 +184,10 @@
/* format up the attribute strings into a single string */
bu_vls_init(&attr_vls);
- attr_values = part->pt_regionp->attr_values;
- for (i=0; i < a_tab.attrib_use; i++) {
-
- BU_CK_MRO(attr_values[i]);
- vls = &attr_values[i]->string_rep;
-
- if (bu_vls_strlen(vls) > 0) {
- /* XXX only print attributes that actually were set */
- bu_vls_printf(&attr_vls, "%s=%V ", a_tab.attrib[i], vls);
- }
+ for (BU_AVS_FOR(avpp, &(part->pt_regionp->attr_values))) {
+ if (avpp->value)
+ if (strlen(avpp->value) != 0)
+ bu_vls_printf(&attr_vls, "%s=%s", avpp->name,
avpp->value);
}
ValTab[VTI_ATTRIBUTES].value.sval = bu_vls_addr(&attr_vls);
Modified: brlcad/trunk/src/rt/rtshot.c
===================================================================
--- brlcad/trunk/src/rt/rtshot.c 2011-05-19 22:19:55 UTC (rev 44638)
+++ brlcad/trunk/src/rt/rtshot.c 2011-05-20 00:44:52 UTC (rev 44639)
@@ -49,7 +49,7 @@
void
usage(const char *argv0)
{
- bu_log("Usage: rtshot [options] model.g objects...\n", argv0);
+ bu_log("Usage: %s [options] model.g objects...\n", argv0);
bu_log(" -U # Set reporting of air regions (default=1)\n");
bu_log(" -u # Set libbu debug flag\n");
bu_log(" -x # Set librt debug flags\n");
@@ -539,14 +539,14 @@
if (ap->attrs) {
bu_log("\tattribute values:\n");
i = 0;
- while (ap->attrs[i] && regp->attr_values[i]) {
+ while (ap->attrs[i] && regp->attr_values.count) {
bu_log("\t\t%s:\n", ap->attrs[i]);
bu_log("\t\t\tstring rep = %s\n",
- BU_MRO_GETSTRING(regp->attr_values[i]));
- bu_log("\t\t\tlong rep = %d\n",
+ bu_avs_get(&(regp->attr_values), ap->attrs[i]));
+ /* bu_log("\t\t\tlong rep = %d\n",
BU_MRO_GETLONG(regp->attr_values[i]));
bu_log("\t\t\tdouble rep = %f\n",
- BU_MRO_GETDOUBLE(regp->attr_values[i]));
+ BU_MRO_GETDOUBLE(regp->attr_values[i]));*/
i++;
}
}
@@ -696,18 +696,18 @@
int i;
if (pl->ap->attrs) {
- bu_log("\tattribute values:\n");
- i = 0;
- while (pl->ap->attrs[i] && regp->attr_values[i]) {
- bu_log("\t\t%s:\n", pl->ap->attrs[i]);
- bu_log("\t\t\tstring rep = %s\n", BU_MRO_GETSTRING(
- regp->attr_values[i]));
- bu_log("\t\t\tlong rep = %d\n", BU_MRO_GETLONG(
- regp->attr_values[i]));
- bu_log("\t\t\tdouble rep = %f\n", BU_MRO_GETDOUBLE(
- regp->attr_values[i]));
- i++;
- }
+ bu_log("\tattribute values:\n");
+ i = 0;
+ while (pl->ap->attrs[i] && regp->attr_values.count) {
+ bu_log("\t\t%s:\n", pl->ap->attrs[i]);
+ bu_log("\t\t\tstring rep = %s\n",
+
bu_avs_get(&(regp->attr_values), pl->ap->attrs[i]));
+ /* bu_log("\t\t\tlong rep = %d\n",
+ BU_MRO_GETLONG(regp->attr_values[i]));
+ bu_log("\t\t\tdouble rep = %f\n",
+ BU_MRO_GETDOUBLE(regp->attr_values[i]));*/
+ i++;
+ }
}
}
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its
next-generation tools to help Windows* and Linux* C/C++ and Fortran
developers boost performance applications - including clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits