Compare commits

..
30 Commits
Author SHA1 Message Date
Clifford Yapp de83ba5d30 Bump to dev revision after tagging 7.46.0. We already have enough changes pending for another minor - if 7.46 needs a patch release it will come from the rel-7-46 branch. 2026-10-12 10:37:59 -04:00
Clifford Yapp 31470287a1 Update ChangeLog, set release date 2026-10-12 10:28:55 -04:00
Clifford Yapp 342d8a9152 Improve distcheck bext path handling 2026-10-10 20:03:02 -04:00
Clifford Yapp 9e030edd60 Update bext logic to make URL modular 2026-10-10 11:39:21 -04:00
Clifford Yapp b5bf1683a2 move extern definition 2026-10-08 16:34:31 -04:00
Clifford Yapp eb7e9cb38c no-tk and goto adjustments for FreeBSD building 2026-10-08 16:31:46 -04:00
Clifford Yapp 84be85a74d Make github.com bext sha1 query non-interactive
This is an optional check, so we never want it to go interactive if
anything is weird with upstream.

`credential.helper=` prevents credential-manager/browser prompts,
`credential.interactive=false` disables Git credential interaction, and
the `GIT_TERMINAL_PROMPT=0` environment variable blocks terminal
prompting and helps with older Git versions
2026-10-07 11:05:52 -04:00
Clifford Yapp 3fd9ec8f4b Isolate GCV regression outputs
Give each GCV regression target a distinct output path so parallel
tests cannot remove one another's results. Validate and clean every
input immediately, and update companion-file cleanup paths.
2026-10-06 18:21:05 +00:00
Clifford Yapp 7d2392d754 Fix conditional datetime conversion constant
Derive nanoseconds per microsecond from the existing unit constants.

This avoids an unused file-scope constant in clock_gettime builds.
2026-10-06 18:20:41 +00:00
Clifford Yapp 757bb76203 Update log with commits being incorporated into rel-7-46-0 2026-10-06 01:47:38 -04:00
Clifford Yapp c70bab52c4 Update version numbers 2026-10-06 01:45:41 -04:00
Clifford Yapp 7929a747ad Fix Archer saving window sizes before they're ready 2026-10-06 01:42:31 -04:00
Clifford Yapp eac0f4d265 Adjustments for Archer/Itcl 2026-10-06 00:57:13 -04:00
Clifford Yapp d6ae424de0 Correct Archer plugin setup 2026-10-06 00:47:05 -04:00
Clifford Yapp 27ba3c4880 Be more aggressive about making sure the install rpath setup is our standard one. 2026-10-05 21:29:34 +00:00
Clifford Yapp 7ade8db130 Got the test backwards 2026-10-05 15:30:29 -04:00
Clifford Yapp e91023f354 Disable rtcmp tests for a BRLCAD_ENABLE_RUNTIME_DEBUG=OFF build
rtcmp logging in librt is in the hot loop for rt_shootray, so
even the enabled/disabled conditional check imposes about 1.5%
performance overhead in an optimized build configuration.  Since
that isn't acceptable when we're disabling debugging support for
maximum performance, disable the tests in that particular case.
2026-10-05 13:50:34 -04:00
Clifford Yapp 303b90f7f1 librt: handle empty and instanced trees during bounds traversal
rt_gettree can succeed for an empty combination with no primitives,
leaving its imported tree null.  The old traversal reached
RT_CK_TREE.  With runtime checks enabled, that bombs and facetize's
setjmp catches it.  Builds with runtime checks disabled compile out
the magic check and dereference null instead.  This explains the
different outcomes across build configurations.

Return an error for null or NOP trees at every recursion level, so
nested empty combinations also fail without a bomb.  Carry each
member's accumulated transform when selecting a prepared solid;
matching only the name chose the wrong instance when one primitive
appeared at multiple locations.  Release imported combinations
after recursion, use a stack tree for direct primitives, and return
lookup errors instead of exiting the process.

Cover empty and nested combinations, direct primitives, repeated
transformed instances, and transforms through nested combinations.
2026-10-05 16:45:33 +00:00
Clifford Yapp 875091f78a Check for null tree before doing rt_traverse_tree 2026-10-05 11:49:40 -04:00
Christopher Sean Morrison 0716e4c842 Revert "add a test to get regions"
This reverts commit d3e037a760.
2026-10-05 10:22:25 -04:00
Christopher Sean Morrison ee6e1bebdc write up a preamble for 7.46 2026-10-05 03:31:45 -04:00
Christopher Sean Morrison 9d4f5bb124 consolidate the list a little bit combining related changes and being a little more user-vis critical 2026-10-05 03:21:22 -04:00
Christopher Sean Morrison 21f442a4ad upper on cmd names outside summaries is jarring and inconsistent 2026-10-05 02:11:21 -04:00
Christopher Sean Morrison 24d6f6f4cb add data dir to the doc search paths also 2026-10-05 01:44:15 -04:00
Christopher Sean Morrison d3e037a760 add a test to get regions 2026-10-05 01:27:54 -04:00
Christopher Sean Morrison 5a38423677 release prep for 7.46.0 2026-10-04 23:34:49 -04:00
Christopher Sean Morrison 38113b1de7 nearly ready 2026-10-04 23:34:12 -04:00
Clifford Yapp fec9d07d43 See if we can update CI to macos-15 2026-10-04 15:32:50 -04:00
Clifford Yapp 4b09d6227f Try to shorten some of the NEWS lines 2026-10-02 19:22:07 -04:00
Clifford Yapp eab1e82de2 Update NEWS for post-7.44 user-visible changes
Add missing user-visible release notes from the 7.44-to-7.46
development range.  Remove Itcl 4-only migration fixes, narrow the
MGED editing claim to the ARB5 bug present in 7.44, and correct the
historical PNTS attribution.

Added item to source commit mapping:

- shared OpenGL display-list state: 85de3929e5
- MGED fallback manual viewer: 0a8c6d8bc2, a00efd15c6
- GIST subprocess diagnostics: 0d6cc34a13, 06c8ab6204
- GQA density validation and exit status: 6d142b62e7, cd55562c46
- ARBN inside support: 7b1898d9fd
- HYP edit label: e4d297893e
- MGED BoT face selection: 0173dd8c40
- MGED view-mode panning and edit queries: 5e873e5081
- MGED middle-click rotation behavior: 3beed70eb8
- transactional rejected primitive edits: 13b0699349, 58ab0d5496
- MGED startup prompt focus: 03b36c1b61
- Windows binary temporary files: 7358e90b54
- DSP, PNTS, and BoT ray intersections:
  8f81f27d92, 5c8092b4e6, de09372b73
- submodel transforms: c45fb38aea, 5c6563e2e2
- VOL data lookup and prep handling:
  641a1fea5e, 259e20ac56, e2cdfa3a6a
- MGED NIRT output and subprocess cleanup: 0d6cc34a13
- Windows subprocess argument preservation: bcaebb24e1
- Windows drive-letter paths: d4b902c599, c523397c03
- MGED gqa and rtcheck overlap plots: 75ef43ac37
- procedural tree use-after-free: fa687de934
- gaia Earth generator and textures:
  2f5be2c414, 9e10743773, fee67ac743
- redirected Windows fbcolor input: 01c4a39932
- bwstat median and input errors: 2307575ef1
- NIRT trailing whitespace: b5e03710eb, 730b448973
- GIST hierarchy overflow rendering: 58b3c9c9c0
- MGED gqa option parsing: da430b14d8
- rtxray grayscale output: 4608347774, f9055f240e
- submodel empty-file ASCII conversion: c0059383e0
- PNTS get/adjust/form and ASCII conversion: 71cbe6ed71
- annotation get/adjust and ASCII conversion: 604be9f454

Corrections to existing items:

- remove Itcl 4-only application-fix claims: e78d0530f3
- retain the baseline ARB5 fix but drop pipe and sketch claims:
  df19156341, 6c092182a6, be97d86e4e
- move PNTS conversion support from 7.44 to 7.46: 71cbe6ed71

Reorder the existing facetize and pnts export entries to retain the
newest-first organization of the release section.
2026-10-02 19:10:21 -04:00
44 changed files with 9628 additions and 10422 deletions
+2 -2
View File
@@ -384,7 +384,7 @@ jobs:
osx:
name: macOS Clang
needs: [linux]
runs-on: macos-14
runs-on: macos-15
strategy:
fail-fast: true
steps:
@@ -403,7 +403,7 @@ jobs:
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: macos-14-${{ runner.arch }}-release
platform-channel: macos-15-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
+1 -1
View File
@@ -177,7 +177,7 @@ jobs:
osx_bext:
name: macOS - BRL-CAD bext build
needs: [linux_bext]
runs-on: macos-14
runs-on: macos-15
strategy:
fail-fast: true
if: ${{ !cancelled() }}
+5 -4
View File
@@ -231,7 +231,7 @@ set(CMAKE_FIND_USE_PACKAGE_REGISTRY FALSE)
# Prepare to manage and build BRL-CAD's external dependencies. Specifies a
# specific commit hash to use in the 'bext' repository.
include(BRLCAD_ExternalDeps)
brlcad_bext_init(0682795bcfe34644c17e5a4bdd0225c76f6bdc98)
brlcad_bext_init(42d8d7ca57f9d2f61192b41f0b41a731f1ba6c47)
#---------------------------------------------------------------------
# Define various utilities.
@@ -352,9 +352,10 @@ set(CMAKE_SKIP_BUILD_RPATH FALSE)
# it should only be set to the installation value when actually installed.
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
# Add the automatically determined parts of the RPATH which point to
# directories outside the build tree to the install RPATH
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
# Installed runtime paths are defined explicitly below. Do not append
# directories discovered on the build host, since those paths may not exist
# or may resolve to unrelated libraries on the installed system.
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
# The following logic is what allows binaries to run successfully in the build
# directory AND install directory.
+8737 -10014
View File
File diff suppressed because it is too large Load Diff
+39 -5
View File
@@ -151,10 +151,13 @@ recommended for serious developers.
Various useful configurations for working with bext:
* Get a git clone that has everything which might be needed (large,
but useful for offline building)
* Acquire bext and its dependencies from another repository host
git clone --recurse-submodules https://github.com/BRL-CAD/brlcad
cmake .. -DBRLCAD_REPOSITORY_ROOT=https://git.example.org/brlcad
* Acquire bext and its dependencies from local bare Git mirrors
cmake .. "-DBRLCAD_REPOSITORY_ROOT=/path/to/mirror/BRL-CAD"
* Have prebuilt bext outputs to reuse - BRL-CAD will simply copy and prepare
the pre-existing files
@@ -398,10 +401,40 @@ Aliases: ENABLE_RUNTIME_DEBUG, ENABLE_RUN_TIME_DEBUG, ENABLE_RUNTIME_DEBUGGING
ENABLE_RUN_TIME_DEBUGGING
--- BRLCAD_REPOSITORY_ROOT ---
Repository URL or local directory containing bext and its dependency
repositories. Defaults to https://github.com/BRL-CAD. The root directly
contains repositories such as bext.git and astyle.git; BRL-CAD does not
append BRL-CAD to the root.
Remote Git URLs (including SSH), native paths, and file:// URLs are supported.
Relative native paths are resolved against the BRL-CAD source directory.
Quote the entire -D argument for paths containing spaces. The setting is
cached and is also passed as BEXT_REPOSITORY_ROOT when BRL-CAD configures
bext, including when BRLCAD_EXT_SOURCE_DIR supplies an existing checkout.
Alternate roots require bext sources with BEXT_REPOSITORY_ROOT support.
Local roots restrict CMake-driven Git acquisition and queries to file
transport, with no online fallback. Mirrors must contain all required pinned
commits and recursive submodules. Dependencies outside bext's canonical URL
prefix require their own Git URL mappings. This setting does not restrict
network access by dependency build scripts or change persistent Git settings.
BRLCAD_EXT_DIR still selects prebuilt outputs, and changing the repository
root alone does not force those outputs to be rebuilt.
To return to the default source:
cmake .. -DBRLCAD_REPOSITORY_ROOT=https://github.com/BRL-CAD
--- BRLCAD_EXT_DIR ---
If specified, BRL-CAD will look in this directory for bext compiled outputs to
bundle and use during the build.
bundle and use during the build. Relative paths are resolved against the
BRL-CAD source directory. Distcheck subconfigures reuse this resolved output
directory and preserve BRLCAD_REPOSITORY_ROOT, BRLCAD_EXT_SOURCE_DIR, and
BRLCAD_EXT_PARALLEL when specified.
--- BRLCAD_EXT_SOURCE_DIR ---
@@ -409,7 +442,8 @@ bundle and use during the build.
If specified, BRL-CAD will look in this directory for bext source files. Use
this when you have a pre-existing bext clone and don't want BRL-CAD's configure
process to pull down another copy, but are still looking to have the BRL-CAD
configure process manage producing bext build outputs.
configure process manage producing bext build outputs. Relative paths are
resolved against the BRL-CAD source directory.
--- BRLCAD_EXT_PARALLEL ---
+89 -48
View File
@@ -10,82 +10,112 @@ descriptive text that emphasizes or further describes significant
changes made. See document footer for additional details.
----------------------------------------------------------------------
--- 20XX-XX-XX Release 7.46.0 ---
--- 202X-XX-XX Release 7.48.0 ---
----------------------------------------------------------------------
----------------------------------------------------------------------
--- 2026-10-12 Release 7.46.0 ---
----------------------------------------------------------------------
This release expands geometry conversion and improves modeling
reliability. STEP support adds AP203e2, AP214, and AP242
import/export, native CSG round trips, and AP242 product and
manufacturing information (PMI) import. IGES and JT conversion is
expanded, and new OpenSCAD CSG import/export tools are available.
Facetization is more reliable, NMG solid ray tracing is 10-20 times
faster, CSG ray tracing is faster, and BoT, DSP, and point-cloud ray
intersections are corrected. MGED gains numerous fixes to primitive,
sketch, and combination editing, drawing, dialogs, and preferences.
New tools support object nesting with arrange, building generation
with mkbuilding, annotation editing, and primitive repair. Geometry
analysis, image utilities, Windows support, documentation, and bundled
dependencies also receive substantial updates.
* corrected Archer logic for saving window size - Cliff Yapp
* fixed inside BoT rays, DSP surface normals, PNTS bounds - Cliff Yapp
* improved mged fallback HTML manual viewer - Cliff Yapp
* fixed gqa undefined densities and exit status - Chris McGregor
* added ARBN support to the mged inside command - Cliff Yapp
* improved HYP neck-ratio labels and BoT face selection - Cliff Yapp
* fixed mged view panning, edit rotation, & ray queries - Cliff Yapp
* preserved ARB, CLINE, TGC, & extrusion geometry edits - Cliff Yapp
* restored mged command prompt focus at GUI startup - Cliff Yapp
* improved pixscale & bwscale scaling and image piping - Sean Morrison
* restored pixdiff behavior on .pix, added -b for .bw - Sean Morrison
* updated MGED and Archer for Tcl 8.6.18 and Itcl/Itk 4 - Cliff Yapp
* improved facetize fallback methods and reliability - Cliff Yapp
* updated mged and Archer for Tcl 8.6.18 and Itcl/Itk 4 - Cliff Yapp
* fixed writes to fileless geometry databases - Cliff Yapp
* fixed nastran-g handling of large property IDs - Rupesh, Cliff Yapp
* fixed dxf-g invalid polyface index crashes - Meghna45-code, Cliff Yapp
* fixed Archer primitive editors under Itcl 4 - Cliff Yapp
* fixed Archer shutdown menu cleanup errors - Cliff Yapp
* fixed MGED Build Pattern dialog under Itcl 4 - Cliff Yapp
* fixed dxf-g invalid polyface idx crash - Meghna45-code, Cliff Yapp
* fixed TclCAD framebuffer listing and deletion - Cliff Yapp
* fixed MGED Build Pattern progress updates - Cliff Yapp
* fixed MGED search -exec reentry and Ctrl-C crashes - Cliff Yapp
* fixed MGED asynchronous commands and clone progress - Cliff Yapp
* accelerated large and repeated MGED path drawing - Cliff Yapp
* fixed mged Build Pattern progress updates - Cliff Yapp
* fixed mged search -exec reentry and Ctrl-C crashes - Cliff Yapp
* fixed mged asynchronous commands and clone progress - Cliff Yapp
* accelerated large and repeated mged path drawing - Cliff Yapp
* fixed ARB7 inside solid construction - Cliff Yapp
* fixed direct ARB face and edge-direction editing - Cliff Yapp
* fixed rtwizard startup with framebuffer contention - Cliff Yapp
* fixed Archer annotation line display updates - Cliff Yapp
* fixed Archer sketch scale drift in non-mm databases - Cliff Yapp
* fixed toggle arrow callbacks during setup - Cliff Yapp
* fixed Tcl dialogs with multi-word titles and messages - Cliff Yapp
* fixed Tcl dialogs with multi-word titles and msgs - Cliff Yapp
* fixed Archer Tank Wizard gun generation - Cliff Yapp
* fixed MGED and Archer sketch arc tangency editing - Cliff Yapp
* fixed mged and Archer sketch arc tangency editing - Cliff Yapp
* fixed Archer ARB4 point 3 editing - Cliff Yapp
* fixed ARB4 storage from make and mk_arb4 - Cliff Yapp
* fixed ARB4 and ARB6 center point calculations - Cliff Yapp
* fixed concurrent MGED and rtwizard framebuffer use - Cliff Yapp
* fixed MGED ShotVis editing and reload failures - Cliff Yapp
* fixed concurrent mged and rtwizard framebuffer use - Cliff Yapp
* fixed mged ShotVis editing and reload failures - Cliff Yapp
* fixed Tcl widget geometry and selection defects - Cliff Yapp
* fixed MGED BoT editor property handling - Cliff Yapp
* fixed MGED LOD dialog and adaptive BoT wireframes - Cliff Yapp
* fixed MGED Plot, PostScript, and manual launch tools - Cliff Yapp
* fixed MGED Overlap Tool multi-object result handling - Cliff Yapp
* fixed mged BoT editor property handling - Cliff Yapp
* fixed mged LOD dialog and adaptive BoT wireframes - Cliff Yapp
* fixed mged Plot, PostScript, and manual launch tools - Cliff Yapp
* fixed mged Overlap Tool multi-object result handling - Cliff Yapp
* eliminated 16-fold redundant gchecker grid analysis - Cliff Yapp
* fixed Archer tree handling for object names with spaces - Cliff Yapp
* fixed submodel transforms & relative database paths - Sean Morrison
* fixed Archer tree handling for names with spaces - Cliff Yapp
* fixed RtWizard multi-object edge occlusion handling - Cliff Yapp
* fixed RtWizard title, About, and preference handling - Cliff Yapp
* fixed MGED startup file false legacy-syntax warnings - Cliff Yapp
* fixed MGED saved-view deletion and collaboration sync - Cliff Yapp
* fixed MGED font preferences apply and persistence - Cliff Yapp
* fixed mged startup file false legacy-syntax warnings - Cliff Yapp
* fixed mged saved-view deletion and collaboration sync - Cliff Yapp
* fixed mged font preferences apply and persistence - Cliff Yapp
* fixed Archer combination edits changing Boolean trees - Cliff Yapp
* fixed Archer command-line help startup crash - Cliff Yapp
* fixed MGED Geometry Browser menu and close behavior - Cliff Yapp
* fixed MGED collaboration view unshare crash - Cliff Yapp
* added an override for Archer's preference file location - Cliff Yapp
* fixed mged Geometry Browser menu and close behavior - Cliff Yapp
* fixed mged collaboration view unshare crash - Cliff Yapp
* added override for Archer's preference file location - Cliff Yapp
* fixed embedded Archer display and mode menus - Cliff Yapp
* added Archer -h and --help command-line options - Cliff Yapp
* fixed Archer Help opening the documentation menu - Sean Morrison
* improved fallback methodologies for facetize pipeline - Cliff Yapp
* improved facetize pipeline robustness - Cliff Yapp
* added arrange nest command for packing database objects - Sean Morrison
* new mkbuilding tool for parametric/OSM/CityJSON models - Sean Morrison
* added arrange nest command for packing db objects - Sean Morrison
* added mkbuilding for parametric/OSM/CityJSON models - Sean Morrison
* cross-platform BINUNIF and DSP byte-order handling - Sean Morrison
* improved several cv default behaviors (s, 32, 64, n) - Sean Morrison
* improved several cv default behaviors (s,32,64,n) - Sean Morrison
* fixed invalid bot handling bug applying matrices - Sean Morrison
* improved glTF import robustness via gcv - Sean Morrison
* fixed bot dump glTF/GLB export; -F is now rejected - Cliff Yapp
* faster NMG solid ray tracing (10-20x faster) - Sean Morrison
* preserved primitive colors in shaded BoT and B-Rep drawing - Cliff Yapp
* preserved B-Rep attributes through in-place geometry edits - Cliff Yapp
* fixed gcv filter arguments containing one-character values - Cliff Yapp
* preserved prim colors in shaded BoT and B-Rep drawing - Cliff Yapp
* preserved B-Rep attrs through in-place geometry edits - Cliff Yapp
* fixed gcv filter arguments w/ one-character values - Cliff Yapp
* improved iges-g importer robustness - Cliff Yapp
* expanded g-iges native CSG and B-Rep export support - Cliff Yapp
* added IGES import and export support to gcv - Cliff Yapp
* rt -b query option now supports a single value index - Sean Morrison
* rt -b query option now supports a single value idx - Sean Morrison
* fixed .dpix file format portability and icv support - Sean Morrison
* expanded pixscale support for piped image data - Sean Morrison
* fixed HYP volume and ARBN totals reported by analyze - Cliff Yapp
* corrected rtarea sampling and exposed-area calculations - Cliff Yapp
* fixed VOL data-file lookup and missing-data errors - Chris McGregor
* corrected rtarea sampling/exposed-area calculations - Cliff Yapp
* bot split now groups results and preserves mesh data - Cliff Yapp
* bot decimate now preserves normals, UVs, and plate data - Cliff Yapp
* bot decimate now preserves nrmls, UVs, and plate data - Cliff Yapp
* added raytracing support for annotation objects - Cliff Yapp
* fixed MGED X embedded framebuffer display manager crash - Cliff Yapp
* fixed Windows subprocess quoting and empty arguments - Cliff Yapp
* fixed mged X embedded framebuffer display manager crash - Cliff Yapp
* fixed Windows drive-letter path handling - Cliff Yapp
* added annotate command for managing annotation objects - Cliff Yapp
* added repair command for supported invalid primitives - Cliff Yapp
* changed default new-region material code from 1 to 0 - Keith Bowman
@@ -107,26 +137,34 @@ changes made. See document footer for additional details.
* added option validation to image & framebuffer tools - Sean Morrison
* added contributor, API, command, & raytracing guides - Sean Morrison
* added and updated command and library manual pages - Sean Morrison
* added pnts write -f xyz export option - Chris McGregor
* fixed mged ARB5 point editing - Cliff Yapp
* fixed mged gqa and rtcheck stale overlap plots - Cliff Yapp
* fixed procedural tree generator crashes - Sean Morrison, Cliff Yapp
* added gaia Earth models with day/dusk/night textures - Sean Morrison
* fixed fbcolor ramps & Windows input - Cliff Yapp, Sean Morrison
* added parashot gravity trajectory path generator - Sean Morrison
* added metaball point scaling (via metaball_move_pnt) - Sean Morrison
* added metaball pnt scaling (via metaball_move_pnt) - Sean Morrison
* all raytracing apps now report object prep failures - Sean Morrison
* improved fast4-g robustness and error reporting - Cliff Yapp
* improved robustness of g-vrml plate mode handling - Cliff Yapp
* fixed MGED ARB5 point, pipe, and sketch editing - Cliff Yapp
* added pnts write -f xyz export option - Chris McGregor
* added support for tick drawing on MGED model axis - Cliff Yapp
* added support for tick drawing on mged model axis - Cliff Yapp
* added naca456 left and paired wing generation - Cliff Yapp
* added patch-g -j option, specify object thicknesses - Sean Morrison
* fixed fbcolor color ramp bug drawing the last color - Sean Morrison
* corrected bwstat median and input error handling - Sean Morrison
* fixed gist -Q quick preview option - Sean Morrison
* rt preserves eye_pt setting in command scripts - Sean Morrison
* removed trailing whitespace from nirt output - Sean Morrison
* rt -l8 heat graphs now measure CPU time - Sean Morrison
* documented gqa centroid & moments of inertia options - Sean Morrison
* pixdiff now calculates pixel differences on bw files - Sean Morrison
* fixed bwcrop single-axis crops and pixembed edge fill - Sean Morrison
* fixed bwcrop single-axis crops & pixembed edge fill - Sean Morrison
* fixed isize in non-mm databases - Josh Baker
* fixed metaball adjust clearing points on errors - Sean Morrison
* fixed benchmark+pixcmp correctness validation bug - Sean Morrison
* fixed mged gqa option and value parsing - Sean Morrison
* improved gist hierarchy overflow rendering - Chris McGregor
* fixed rtxray -o grayscale/BW output - Sean Morrison
* fbhelp writes help to stdout and rest to stderr - Sean Morrison
* FB now supports /dev/stdout and /dev/stderr devices - Sean Morrison
* fixed mged rt -C + -o background color to file bug - Sean Morrison
@@ -135,7 +173,7 @@ changes made. See document footer for additional details.
* added rtsil -o support for bw output - Sean Morrison
* added cutting plane animation generation to rtwizard - Cliff Yapp
* fixed pixdiff bug on Windows - Sean Morrison
* fixed MGED startup window placement on Windows - Chris McGregor
* fixed mged startup window placement on Windows - Chris McGregor
* fixed pixborder utility right-side edge bug - Sean Morrison
* fixed 'wavelet' image processing tool on Windows - Sean Morrison
* quieted mged killtree spurious lookup failure output - Sean Morrison
@@ -146,14 +184,16 @@ changes made. See document footer for additional details.
* new doc guide, a visual overview of BRL-CAD objects - Sean Morrison
* improved triangle quality produced by bot remesh - Cliff Yapp
* updated numerous manpage command references - Josh Baker
* fixed submodel paths relative to parent databases - Sean Morrison
* improved performance making huge combinations - Sean Morrison
* added PNTS get, adjust, form, & g2asc/asc2g support - Chris McGregor
* fixed ANNOT get, adjust, & g2asc/asc2g support - Chris McGregor
* added make -t primitive type listing - Chris McGregor
* added gcv import conversion support for vrml/wrl 1.0 - Sean Morrison
* fixed gcv appending to existing geometry databases - Sean Morrison
* added CSS names, hex, HSL/HSV to libbu color parsing - Sean Morrison
* improved OpenNURBS B-Rep import and adjustment safety - Cliff Yapp
* improved Debian application menus and MIME associations - Jordi Sayol
* improved Debian application menus/MIME associations - Jordi Sayol
* updated Tcl/Tk dependency to v8.6.18 using bundled Itcl - Cliff Yapp
* updated Clipper2 dependency to v1.5.4 - Cliff Yapp
* updated Eigen dependency to v5.0.1 - Cliff Yapp
* updated GDAL dependency to v3.13.3 - Cliff Yapp
@@ -165,7 +205,6 @@ changes made. See document footer for additional details.
* updated OpenNURBS dependency to v8.34.26223.11001 - Cliff Yapp
* updated PROJ dependency to v9.8.1 - Cliff Yapp
* updated PoissonRecon dependency to v18.75 - Cliff Yapp
* updated Tcl/Tk dependency to v8.6.18, using bundled Itcl - Cliff Yapp
* updated libjpeg-turbo dependency to v3.2.0 - Cliff Yapp
* updated libosmesa dependency to SHA1 bfa90de - Cliff Yapp
* updated libpng dependency to v1.6.58 - Cliff Yapp
@@ -274,7 +313,7 @@ and extensively improving existing docs.
* added metadata-aware image diff & nirt analysis - Cliff Yapp
* added basic PNTS point-cloud ray tracing - Sean Morrison
* improved nirt behavior in Windows bash consoles - Cliff Yapp
* added g2asc/asc2g support for PNTS, DSP, and EBM - Sean Morrison
* added g2asc/asc2g support for DSP and EBM - Sean Morrison
* updated gct mesh decimation dependency to mmesh - Cliff Yapp
* added procedural wing, propeller & tree generators - Cliff Yapp
* added ISO tire dimensions & named tread presets - Cliff Yapp
@@ -546,6 +585,7 @@ for more information.
----------------------------------------------------------------------
--- 2023-11-06 Release 7.38.0 ---
----------------------------------------------------------------------
This major release of BRL-CAD introduces significant improvements to
the robustness of the facetize command by leveraging the Manifold
library for boolean evaluation of meshes. Facetization is an operation
@@ -584,6 +624,7 @@ processing high level assemblies in BRL-CAD's example geometry files:
----------------------------------------------------------------------
--- 2023-07-26 Release 7.36.0 ---
----------------------------------------------------------------------
This major release of BRL-CAD introduces significant updates to
geometry conversion support. The update includes modernization for
NURBS importing and interaction, BoT manipulation, and incorporates
+1 -1
View File
@@ -1,5 +1,5 @@
BRL-CAD
Release 7.44.2
Release 7.46.0
http://brlcad.org/
BRL-CAD is a powerful cross-platform open source combinatorial
+1 -1
View File
@@ -1 +1 @@
45
47
+62 -38
View File
@@ -30,6 +30,7 @@
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
include(CMakeParseArguments)
include("${CMAKE_CURRENT_LIST_DIR}/BRLCAD_Repository.cmake")
# Try to locate a usable git executable. On Windows, Visual Studio may
# provide git in non-standard locations; try common Program Files and
@@ -88,6 +89,15 @@ function(brlcad_bext_init BEXT_SHA1)
set(BRLCAD_EXT_DIR "${BRLCAD_EXT_DIR_ENV}")
endif(BRLCAD_EXT_DIR_ENV AND NOT DEFINED BRLCAD_EXT_DIR)
# Resolve paths before probing them so later subconfigures use the same
# directories even when launched from a different working directory.
foreach(_brlcad_ext_path_var BRLCAD_EXT_DIR BRLCAD_EXT_SOURCE_DIR)
if(DEFINED ${_brlcad_ext_path_var} AND NOT "${${_brlcad_ext_path_var}}" STREQUAL "")
get_filename_component(${_brlcad_ext_path_var} "${${_brlcad_ext_path_var}}" ABSOLUTE BASE_DIR "${CMAKE_SOURCE_DIR}")
set(${_brlcad_ext_path_var} "${${_brlcad_ext_path_var}}" PARENT_SCOPE)
endif()
endforeach()
set(_brlcad_ext_dir_specified FALSE)
set(_brlcad_ext_dir_managed FALSE)
@@ -148,14 +158,14 @@ function(brlcad_bext_init BEXT_SHA1)
elseif(NOT _brlcad_ext_dir_specified)
message(
WARNING
"External dependencies will be downloaded, configured, and built automatically as-needed. Set BRLCAD_EXT_DIR to specify instead."
"External dependencies will be acquired from ${_BRLCAD_REPOSITORY_ROOT}, configured, and built automatically as-needed. Set BRLCAD_EXT_DIR to specify instead."
)
endif()
message(
STATUS
"BRLCAD_EXT_DIR specifies prebuilt external dependencies directory\n"
"containing 'install' and 'noinstall' folders, outputs from installing\n"
"https://github.com/BRL-CAD/bext.\n"
"${_BRLCAD_BEXT_REPOSITORY}.\n"
)
endif(NOT BRLCAD_EXT_NOINSTALL_DIR OR NOT BRLCAD_EXT_INSTALL_DIR)
@@ -211,28 +221,24 @@ function(brlcad_rel_version BRLCAD_REL)
set(${BRLCAD_REL} "rel-${VMAJOR}-${VMINOR}-${VPATCH}" PARENT_SCOPE)
endfunction()
# Look up branch or tag SHA1 hashes from primary github.com repo
# Branch/tag queries are advisory; an unavailable source cannot validate them.
function(remote_sha1 SHA1_VAR BRANCH)
set(${SHA1_VAR} "" PARENT_SCOPE)
if(NOT GIT_EXEC)
set(${SHA1_VAR} "" PARENT_SCOPE)
return()
endif()
# This needs a working internet connection to succeed (and GitHub
# must be up and working as well.)
brlcad_repository_git_command(git_command)
execute_process(
COMMAND ${GIT_EXEC} ls-remote https://github.com/BRL-CAD/bext.git ${BRANCH}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE LS_REMOTE_STATUS
OUTPUT_VARIABLE LS_REMOTE_STR
ERROR_VARIABLE LS_REMOTE_STR
)
if(NOT LS_REMOTE_STATUS AND LS_REMOTE_STR)
string(REPLACE " " ";" LS_REMOTE_STR "${LS_REMOTE_STR}")
string(REPLACE "\t" ";" LS_REMOTE_STR "${LS_REMOTE_STR}")
list(GET LS_REMOTE_STR 0 REMOTE_SHA1)
set(${SHA1_VAR} "${REMOTE_SHA1}" PARENT_SCOPE)
else()
set(${SHA1_VAR} "" PARENT_SCOPE)
COMMAND "${CMAKE_COMMAND}" -E env GIT_TERMINAL_PROMPT=0 --
${git_command} -c credential.helper= -c credential.interactive=false
ls-remote "${_BRLCAD_BEXT_REPOSITORY}" "${BRANCH}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE git_result
OUTPUT_VARIABLE remote_refs
ERROR_QUIET
)
if(git_result STREQUAL "0" AND remote_refs MATCHES "^([0-9a-f]+)[ \t]")
set(${SHA1_VAR} "${CMAKE_MATCH_1}" PARENT_SCOPE)
endif()
endfunction()
@@ -367,24 +373,29 @@ function(setup_bext_dir)
# no pre-existing sources, so we're cloning into the build dir
set(BRLCAD_EXT_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/bext")
# Write current SHA1 for subsequent processing
brlcad_repository_git_command(git_command)
message(STATUS "Cloning bext from ${_BRLCAD_BEXT_REPOSITORY}")
execute_process(
COMMAND ${git_command} clone "${_BRLCAD_BEXT_REPOSITORY}" "${BRLCAD_EXT_SOURCE_DIR}"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
RESULT_VARIABLE git_result
)
if(NOT git_result STREQUAL "0")
message(FATAL_ERROR "Unable to clone bext from ${_BRLCAD_BEXT_REPOSITORY} (${git_result})")
endif()
execute_process(
COMMAND ${git_command} -c advice.detachedHead=false checkout "${BEXT_SHA1}"
WORKING_DIRECTORY "${BRLCAD_EXT_SOURCE_DIR}"
RESULT_VARIABLE git_result
)
if(NOT git_result STREQUAL "0")
message(FATAL_ERROR "Unable to check out pinned bext commit ${BEXT_SHA1} from ${_BRLCAD_BEXT_REPOSITORY} (${git_result}); ensure the repository contains this commit")
endif()
# Record the pin only after checkout succeeds.
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/bext.sha1" "${BEXT_SHA1}")
distclean("${CMAKE_CURRENT_BINARY_DIR}/bext.sha1")
# Clone
message("BRL-CAD bext clone command: ${GIT_EXEC} clone https://github.com/BRL-CAD/bext.git")
execute_process(
COMMAND ${GIT_EXEC} clone https://github.com/BRL-CAD/bext.git
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND_ERROR_IS_FATAL ANY
)
message("BRL-CAD bext checkout command: ${GIT_EXEC} -c advice.detachedHead=false checkout ${BEXT_SHA1}")
execute_process(
COMMAND ${GIT_EXEC} -c advice.detachedHead=false checkout ${BEXT_SHA1}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bext
COMMAND_ERROR_IS_FATAL ANY
)
# Configure process will need to clean up bext
if (BRLCAD_BEXT_CLEANUP)
set(BEXT_SRC_CLEANUP TRUE PARENT_SCOPE)
@@ -425,6 +436,12 @@ function(brlcad_ext_setup)
message(FATAL_ERROR "Invalid bext directory: ${BRLCAD_EXT_SOURCE_DIR}")
endif()
if(NOT _BRLCAD_REPOSITORY_ROOT STREQUAL "${_BRLCAD_REPOSITORY_DEFAULT_ROOT}/"
AND NOT EXISTS "${BRLCAD_EXT_SOURCE_DIR}/CMake/BextGit.cmake")
message(FATAL_ERROR
"bext sources in ${BRLCAD_EXT_SOURCE_DIR} do not support BEXT_REPOSITORY_ROOT; update bext before building with BRLCAD_REPOSITORY_ROOT=${BRLCAD_REPOSITORY_ROOT}")
endif()
# We do allow the user to specify a build dir to be reused, however
# this is unpredictable and may cause unexpected results depending
# on what is or isn't rebuilt - use with care.
@@ -463,11 +480,18 @@ function(brlcad_ext_setup)
endif(BRLCAD_ENABLE_APPLESEED)
# Define CMake arguments we'll need regardless of mode
set(bext_shallow_clone ON)
if(_BRLCAD_REPOSITORY_LOCAL)
set(bext_shallow_clone OFF)
endif()
set(CMAKE_CMD_ARGS
-S ${BRLCAD_EXT_SOURCE_DIR} -B ${BRLCAD_EXT_BUILD_DIR} -DGIT_SHALLOW_CLONE=ON
-DENABLE_ALL=${BEXT_ENABLE_ALL} -DUSE_GDAL=${BEXT_USE_GDAL} -DUSE_QT=${BEXT_USE_QT} -DUSE_TCL=${BEXT_USE_TCL}
-DUSE_APPLESEED=${BEXT_USE_APPLESEED} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX=${BRLCAD_EXT_INSTALL_DIR}
-S "${BRLCAD_EXT_SOURCE_DIR}" -B "${BRLCAD_EXT_BUILD_DIR}"
"-DBEXT_REPOSITORY_ROOT:STRING=${_BRLCAD_REPOSITORY_ROOT}"
"-DGIT_SHALLOW_CLONE:BOOL=${bext_shallow_clone}"
"-DENABLE_ALL=${BEXT_ENABLE_ALL}" "-DUSE_GDAL=${BEXT_USE_GDAL}"
"-DUSE_QT=${BEXT_USE_QT}" "-DUSE_TCL=${BEXT_USE_TCL}"
"-DUSE_APPLESEED=${BEXT_USE_APPLESEED}" "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
"-DCMAKE_INSTALL_PREFIX=${BRLCAD_EXT_INSTALL_DIR}"
)
if(BRLCAD_X11_PROVIDER_RESOLVED STREQUAL "XMIN" AND BRLCAD_XMIN_ROOT)
list(APPEND CMAKE_CMD_ARGS
+20 -15
View File
@@ -1108,9 +1108,9 @@ function(brlcad_install_strclear_replace stamp_dir strclear source install_file
endif()
endfunction()
function(brlcad_install_binary_postprocess stamp_dir strclear source install_file install_type mode rpath_tool install_rpath build_lib_path rel_rpath use_selective_rpath verbose)
function(brlcad_install_binary_postprocess stamp_dir strclear source install_file install_type mode rpath_tool install_rpath build_lib_path rel_rpath verbose)
set(_brlcad_physical_file "$ENV{DESTDIR}${install_file}")
set(_brlcad_signature "binary-postprocess|${install_type}|${mode}|${rpath_tool}|${install_rpath}|${build_lib_path}|${rel_rpath}|${use_selective_rpath}|${strclear}")
set(_brlcad_signature "binary-postprocess|${install_type}|${mode}|${rpath_tool}|${install_rpath}|${build_lib_path}|${rel_rpath}|${strclear}")
_brlcad_postprocess_needed(_brlcad_needed "${stamp_dir}" "${source}" "${_brlcad_physical_file}" "${_brlcad_signature}")
if(NOT _brlcad_needed)
return()
@@ -1121,32 +1121,41 @@ function(brlcad_install_binary_postprocess stamp_dir strclear source install_fil
message(FATAL_ERROR "Post-install copy did not create ${_brlcad_physical_file}")
endif()
set(_brlcad_result 0)
set(_brlcad_rpath_output)
set(_brlcad_rpath_error)
if("${mode}" STREQUAL "RPATH_TOOL")
set(_brlcad_selective_rpath_args)
if(use_selective_rpath)
set(_brlcad_selective_rpath_args --set-rpath-if-needed --set-rpath-if-needed-prepend --stale-rpath-prefix "${build_lib_path}")
endif()
# Install the exact project-defined search order. A selective update can
# leave an existing relative-only RPATH without the canonical install path.
execute_process(
COMMAND "${rpath_tool}" --set-rpath "${install_rpath}" ${_brlcad_selective_rpath_args} "${_brlcad_physical_file}"
COMMAND "${rpath_tool}" --set-rpath "${install_rpath}" "${_brlcad_physical_file}"
RESULT_VARIABLE _brlcad_result
OUTPUT_VARIABLE _brlcad_rpath_output
ERROR_VARIABLE _brlcad_rpath_error
)
elseif("${mode}" STREQUAL "APPLE")
execute_process(
COMMAND install_name_tool -delete_rpath "${build_lib_path}" "${_brlcad_physical_file}"
RESULT_VARIABLE _brlcad_result
OUTPUT_VARIABLE _brlcad_output
ERROR_VARIABLE _brlcad_error
OUTPUT_VARIABLE _brlcad_rpath_output
ERROR_VARIABLE _brlcad_rpath_error
)
if(_brlcad_result EQUAL 0)
execute_process(
COMMAND install_name_tool -add_rpath "${rel_rpath}" "${_brlcad_physical_file}"
RESULT_VARIABLE _brlcad_result
OUTPUT_VARIABLE _brlcad_rpath_output
ERROR_VARIABLE _brlcad_rpath_error
)
endif()
endif()
if(NOT _brlcad_result EQUAL 0)
message(WARNING "Post-install RPATH update failed for ${_brlcad_physical_file}")
message(
WARNING
"Post-install RPATH update failed for ${_brlcad_physical_file}\n"
"stdout: ${_brlcad_rpath_output}\n"
"stderr: ${_brlcad_rpath_error}"
)
return()
endif()
@@ -1840,13 +1849,9 @@ endfunction()
elseif(APPLE)
set(_brlcad_install_postprocess_mode "APPLE")
endif(P_RPATH_EXECUTABLE)
set(_brlcad_install_use_selective_rpath FALSE)
if(P_RPATH_SUPPORTS_SET_IF_NEEDED_PREPEND)
set(_brlcad_install_use_selective_rpath TRUE)
endif(P_RPATH_SUPPORTS_SET_IF_NEEDED_PREPEND)
install(
CODE
"include(\"${BRLCAD_EXT_INSTALL_POSTPROCESS_SCRIPT}\")\nbrlcad_install_binary_postprocess(\"${BRLCAD_EXT_INSTALL_POSTPROCESS_STAMP_DIR}\" \"${STRCLEAR_EXECUTABLE}\" \"${CMAKE_BINARY_DIR}/${tf}\" \"\${CMAKE_INSTALL_PREFIX}/${tf}\" \"PROGRAM\" \"${_brlcad_install_postprocess_mode}\" \"${_brlcad_install_postprocess_tool}\" \"${_brlcad_install_postprocess_rpath}\" \"${CMAKE_BINARY_DIR}/${LIB_DIR}\" \"${REL_RPATH}\" \"${_brlcad_install_use_selective_rpath}\" \"${BRLCAD_VERBOSE}\")"
"include(\"${BRLCAD_EXT_INSTALL_POSTPROCESS_SCRIPT}\")\nbrlcad_install_binary_postprocess(\"${BRLCAD_EXT_INSTALL_POSTPROCESS_STAMP_DIR}\" \"${STRCLEAR_EXECUTABLE}\" \"${CMAKE_BINARY_DIR}/${tf}\" \"\${CMAKE_INSTALL_PREFIX}/${tf}\" \"PROGRAM\" \"${_brlcad_install_postprocess_mode}\" \"${_brlcad_install_postprocess_tool}\" \"${_brlcad_install_postprocess_rpath}\" \"${CMAKE_BINARY_DIR}/${LIB_DIR}\" \"${REL_RPATH}\" \"${BRLCAD_VERBOSE}\")"
)
continue()
endif("${tf}" IN_LIST ALL_BINARY_FILES)
+108
View File
@@ -0,0 +1,108 @@
# Copyright (c) 2026 United States Government as represented by
# the U.S. Army Research Laboratory.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# 3. The name of the author may not be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
include_guard(GLOBAL)
set(_BRLCAD_REPOSITORY_DEFAULT_ROOT "https://github.com/BRL-CAD")
set(BRLCAD_REPOSITORY_ROOT "${_BRLCAD_REPOSITORY_DEFAULT_ROOT}" CACHE STRING
"Repository URL or local mirror directory containing bext and its dependency repositories")
function(brlcad_repository_root out_root out_local)
set(root "${BRLCAD_REPOSITORY_ROOT}")
set(local FALSE)
if(root STREQUAL "")
message(FATAL_ERROR "BRLCAD_REPOSITORY_ROOT must be a repository URL or local mirror directory")
endif()
# Match bext's URL handling, but resolve relative paths against BRL-CAD.
# Drive paths must be checked before scp-style SSH locations.
if(root MATCHES "^file://")
set(local TRUE)
string(REPLACE "=" "%3D" root "${root}")
elseif(root MATCHES "^[A-Za-z]:[/\\\\]" OR
NOT (root MATCHES "^[A-Za-z][A-Za-z0-9+.-]*://" OR root MATCHES "^[^/]+:.+"))
set(local TRUE)
string(REPLACE "\\" "/" root "${root}")
if(WIN32 OR NOT root MATCHES "^[A-Za-z]:/")
get_filename_component(root "${root}" ABSOLUTE BASE_DIR "${CMAKE_SOURCE_DIR}")
endif()
# Escape literal percent signs first so native paths cannot introduce
# URL escapes. An equals sign also has meaning in Git's -c assignments.
string(REPLACE "%" "%25" root "${root}")
string(REPLACE " " "%20" root "${root}")
string(REPLACE "#" "%23" root "${root}")
string(REPLACE "?" "%3F" root "${root}")
string(REPLACE "=" "%3D" root "${root}")
if(root MATCHES "^[A-Za-z]:/")
set(root "file:///${root}")
elseif(root MATCHES "^//")
set(root "file:${root}")
else()
set(root "file://${root}")
endif()
endif()
if(NOT root MATCHES "^file:///*$")
string(REGEX REPLACE "/+$" "" root "${root}")
string(APPEND root "/")
else()
set(root "file:///")
endif()
set(${out_root} "${root}" PARENT_SCOPE)
set(${out_local} "${local}" PARENT_SCOPE)
endfunction()
function(brlcad_repository_git_command out_command)
set(git_command "${GIT_EXEC}")
if(WIN32)
list(APPEND git_command -c core.longpaths=true)
endif()
if(_BRLCAD_REPOSITORY_LOCAL)
list(APPEND git_command -c protocol.file.allow=always)
# This also constrains recursive Git processes and user URL rewrites.
list(PREPEND git_command "${CMAKE_COMMAND}" -E env GIT_ALLOW_PROTOCOL=file --)
endif()
set(${out_command} "${git_command}" PARENT_SCOPE)
endfunction()
brlcad_repository_root(_BRLCAD_REPOSITORY_ROOT _BRLCAD_REPOSITORY_LOCAL)
set(_BRLCAD_BEXT_REPOSITORY "${_BRLCAD_REPOSITORY_ROOT}bext.git")
message(STATUS "BRL-CAD repository root: ${_BRLCAD_REPOSITORY_ROOT}")
if(_BRLCAD_REPOSITORY_LOCAL)
message(STATUS "BRL-CAD Git acquisition: file transport only")
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+1
View File
@@ -15,6 +15,7 @@ set(
BRLCAD_Options.cmake
BRLCAD_Probe_Validation.cmake
BRLCAD_Regress_Util.cmake
BRLCAD_Repository.cmake
BRLCAD_Summary.cmake
BRLCAD_Targets.cmake
BRLCAD_Test_Wrappers.cmake
+31 -1
View File
@@ -95,6 +95,33 @@ add_custom_target(
)
set_target_properties(distcheck-source_archives PROPERTIES FOLDER "BRL-CAD Distribution Checking")
# Dependency paths must survive CMake, build-tool, and shell parsing. Load
# their values from a cache file rather than embedding them in command text.
set(distcheck_dependency_cache "${CMAKE_CURRENT_BINARY_DIR}/CMakeTmp/distcheck_dependencies.cmake")
set(distcheck_dependency_vars BRLCAD_REPOSITORY_ROOT BRLCAD_EXT_DIR)
foreach(distcheck_optional_var BRLCAD_EXT_SOURCE_DIR BRLCAD_EXT_PARALLEL)
if(DEFINED ${distcheck_optional_var})
list(APPEND distcheck_dependency_vars ${distcheck_optional_var})
endif()
endforeach()
file(WRITE "${distcheck_dependency_cache}" "")
foreach(distcheck_var IN LISTS distcheck_dependency_vars)
set(distcheck_value "${${distcheck_var}}")
if(distcheck_var STREQUAL "BRLCAD_REPOSITORY_ROOT")
set(distcheck_value "${_BRLCAD_REPOSITORY_ROOT}")
endif()
set(distcheck_type STRING)
if(distcheck_var MATCHES "_DIR$")
set(distcheck_type PATH)
endif()
string(REPLACE "\\" "\\\\" distcheck_value "${distcheck_value}")
string(REPLACE "\"" "\\\"" distcheck_value "${distcheck_value}")
string(REPLACE "$" "\\$" distcheck_value "${distcheck_value}")
file(APPEND "${distcheck_dependency_cache}"
"set(${distcheck_var} \"${distcheck_value}\" CACHE ${distcheck_type} \"Inherited dependency setting\" FORCE)\n")
endforeach()
distclean("${distcheck_dependency_cache}")
# Utility function for defining individual distcheck targets
macro(
create_distcheck
@@ -120,7 +147,10 @@ macro(
# Need to set these locally so configure_file will pick them up...
set(TARGET_SUFFIX ${TARGET_SUFFIX})
set(CMAKE_OPTS ${CMAKE_OPTS_IN})
# Keep machine-specific settings out of the options saved for CI above.
# The shared cache replaces each variant's unquoted output argument.
string(REPLACE "-DBRLCAD_EXT_DIR=${BRLCAD_EXT_DIR}" "" CMAKE_OPTS "${CMAKE_OPTS_IN}")
string(APPEND CMAKE_OPTS " -C \"${distcheck_dependency_cache}\"")
# For configure_file, need to set these as variables not just input parameters
set(source_dir "${source_dir}")
+6
View File
@@ -1,3 +1,9 @@
brlcad (7.46.0-0) unstable; urgency=low
* update brlcad version
-- Cliff Yapp <cyapp@brlcad.org> Thu, 07 Oct 2026 20:24:00 +0000
brlcad (7.44.0-0) unstable; urgency=low
* update brlcad version
+1 -1
View File
@@ -11,7 +11,7 @@
\f0\i\b\fs72 \cf0 README
\fs36 \
\f1\i0\b0\fs28 This is BRL-CAD 7.44.0 for Mac OS X. Please send any bugs, comments, questions, or suggestions to the project website.\
\f1\i0\b0\fs28 This is BRL-CAD 7.46.0 for Mac OS X. Please send any bugs, comments, questions, or suggestions to the project website.\
\fs22 \
+1 -1
View File
@@ -4,7 +4,7 @@
\margl1440\margr1440\vieww8020\viewh6280\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
\f0\fs22 \cf0 This installer will guide you through the installation of BRL-CAD 7.44.0 for Mac OS X and Darwin.\
\f0\fs22 \cf0 This installer will guide you through the installation of BRL-CAD 7.46.0 for Mac OS X and Darwin.\
\
This distribution of BRL-CAD requires approximately 500 MB of available disk space and does not include source code.\
\
+13 -17
View File
@@ -79,7 +79,9 @@ endif(NOT EXISTS \"\${GCV_EXEC}\")\n"
# setup conversion tests
foreach(in_file ${INPUT_FILES})
get_filename_component(curr_in_basename ${in_file} NAME_WLE)
set(out_path "${CMAKE_CURRENT_BINARY_DIR}/conv-${curr_in_basename}")
# Tests in the same directory may run concurrently, so their output paths
# must not overlap.
set(out_path "${CMAKE_CURRENT_BINARY_DIR}/conv-${TARGET_DIRECTION}-${curr_in_basename}")
# need to split suffix so we can distinguish from different converters
if(${fmt}_EXPORTER)
@@ -120,7 +122,7 @@ endif(NOT EXISTS \"\${GCV_EXEC}\")\n"
)
endif(${fmt}_GCV_OPTIONS)
set(out_distclean ${out_distclean}} "${out_path}-${out_fmt}${out_suffix}")
set(out_distclean ${out_distclean} "${out_path}-${out_fmt}${out_suffix}")
set(expected_output_files "${expected_output_files} \"${out_path}-${out_fmt}${out_suffix}\"")
endforeach(out_fmt ${${fmt}_CONVERTERS})
@@ -162,19 +164,8 @@ execute_process(
file(APPEND \"\${LOGFILE}\" \"\${log_msg}\\n\")
unset(log_msg)
"
)
set(OUTPUT_FILES ${OUTPUT_FILES} ${out_distclean})
unset(expected_output_files)
unset(out_distclean)
endforeach(in_file ${INPUT_FILES})
file(
APPEND
${cmake_in_path}
"
# check output files exists and are a reasonable size
# check output files exist and are a reasonable size
foreach(out_file \${ofiles})
if(NOT EXISTS \"\${out_file}\")
file(APPEND \"\${LOGFILE}\" \"FAILURE: \${curr_result}, \${out_file} not found.\")
@@ -191,13 +182,18 @@ foreach(out_file \${ofiles})
file(APPEND \"\${LOGFILE}\" \"FAILURE: \${curr_result} file size is \${file_size} for \${out_file}\\n Expecting ${EXPECTED_FILE_SIZE} with delta ${FILE_SIZE_DELTA}\")
message(FATAL_ERROR \"[gcv] Failure while converting ${in_file}, see \${LOGFILE} for more info.\")
endif(\"\${size_delta}\" GREATER \"${FILE_SIZE_DELTA}\")
endif(NOT EXISTS \"\${out_file}\")\n
endif(NOT EXISTS \"\${out_file}\")
# cleanup file from build dir
file(REMOVE \"\${out_file}\")
endforeach(out_file \${ofiles})
"
)
"
)
set(OUTPUT_FILES ${OUTPUT_FILES} ${out_distclean})
unset(expected_output_files)
unset(out_distclean)
endforeach(in_file ${INPUT_FILES})
# assume the fmt is the gcv dependency unless specified
if(${fmt}_DEPS)
+1 -1
View File
@@ -2,7 +2,7 @@ if(TARGET gcv-assetimport)
gcv_regress_util("gltf" "tetra-gltf2.0.gltf;tetra-glb2.0.glb" DEPS "gcv;gcv-assetimport" GCV_OPTIONS "--input-format=assetimport")
gcv_regress_util("glb" "tetra.g" DEPS "gcv;gcv-assetimport" GCV_OPTIONS "--output-format=assetimport" EXPECTED_FILE_SIZE "1476" EXPORTER)
gcv_regress_util("gltf" "tetra.g" DEPS "gcv;gcv-assetimport" GCV_OPTIONS "--output-format=assetimport" EXPECTED_FILE_SIZE "3356" EXPORTER)
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-tetra.bin")
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-regress-g-gltf-tetra.bin")
endif(TARGET gcv-assetimport)
if(TARGET gcv-gltf)
+2 -2
View File
@@ -1,7 +1,7 @@
if(TARGET gcv-assetimport)
set(dep_str DEPS "gcv;gcv-obj;gcv-assetimport" CONVERTERS "assetimport")
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-tetra-assetimport.mtl") # hard to track companion files
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-regress-g-obj-tetra-assetimport.mtl") # hard to track companion files
else()
set(dep_str "")
endif(TARGET gcv-assetimport)
@@ -9,7 +9,7 @@ endif(TARGET gcv-assetimport)
gcv_regress_util("obj" "tetra.obj" ${dep_str})
gcv_regress_util("obj_unnamed_group" "tetra-unnamed-group.obj" DEPS "gcv;gcv-obj")
gcv_regress_util("obj" "tetra.g" ${dep_str} EXPORTER)
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-tetra.mtl")
distclean("${CMAKE_CURRENT_BINARY_DIR}/conv-regress-g-obj-tetra.mtl")
cmakefiles(
CMakeLists.txt
+13
View File
@@ -144,6 +144,18 @@ if(BRLCAD_X11_PROVIDER_RESOLVED STREQUAL "XMIN" AND
)
brlcad_regression_test(regress-archer-embedded-xmin-gui
"archer;bwish" STAND_ALONE TEST_DEFINED)
brlcad_add_gui_test(
NAME regress-archer-geometry-xmin-gui
TIMEOUT 120
ENVIRONMENT ${_gui_smoke_environment}
"GUI_TEST_LIBRARY=${_gui_test_library}"
COMMAND "${SH_EXEC}" "${_gui_tcl_runner}" archer-geometry
$<TARGET_FILE:bwish>
"${CMAKE_CURRENT_SOURCE_DIR}/archer_geometry_xmin_gui.tcl"
)
brlcad_regression_test(regress-archer-geometry-xmin-gui
"archer;bwish" STAND_ALONE TEST_DEFINED)
endif()
endif()
@@ -201,6 +213,7 @@ cmakefiles(
archer_action.sh
archer_smoke.sh
archer_embedded_xmin_gui.tcl
archer_geometry_xmin_gui.tcl
archer_menu_manifest.txt
archer_xmin_gui.tcl
qged_action.sh
+134
View File
@@ -0,0 +1,134 @@
# A R C H E R _ G E O M E T R Y _ X M I N _ G U I . T C L
# BRL-CAD
#
# Copyright (c) 2026 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.
#
###
if {![info exists ::env(GUI_TEST_LIBRARY)]} {
puts stderr "GUI_TEST_LIBRARY is required"
exit 2
}
source $::env(GUI_TEST_LIBRARY)
set ::env(ARCHER_PREFS_FILE) [file join $::env(GUI_TEST_DIR) .archerrc]
proc archer_geometry_preferences {{geometry ""}} {
set channel [open $::env(ARCHER_PREFS_FILE) w]
if {$geometry ne ""} {
puts $channel [list set mWindowGeometry $geometry]
}
close $channel
}
proc archer_geometry_saved {} {
set channel [open $::env(ARCHER_PREFS_FILE) r]
set contents [read $channel]
close $channel
if {[regexp -line {^set mWindowGeometry (.+)$} $contents -> geometry]} {
return $geometry
}
return ""
}
proc archer_geometry_settle {} {
# Allow MapNotify and the deferred geometry restore to reach the event loop.
set settle_delay_ms 100
after $settle_delay_ms [list set ::archer_geometry_settled 1]
vwait ::archer_geometry_settled
update
::gui::test::require_no_background_errors
}
if {[catch {
package require Archer 1.0
::gui::test::capture_background_errors
wm withdraw .
set saved_geometry 900x650+120+90
set startup_geometry 1000x700+20+30
set updated_geometry 950x680+60+70
set default_geometry 920x660+40+50
archer_geometry_preferences $saved_geometry
Archer .unmapped
::gui::test::require {[wm state .unmapped] eq "withdrawn"} \
"startup fixture unexpectedly showed its window"
::itcl::delete object .unmapped
archer_geometry_settle
::gui::test::require {[archer_geometry_saved] eq $saved_geometry} \
"closing an unmapped Archer replaced its saved geometry"
archer_geometry_preferences
Archer .unmapped_new
::itcl::delete object .unmapped_new
archer_geometry_settle
::gui::test::require {[archer_geometry_saved] eq ""} \
"closing an unmapped Archer saved an unfinished layout size"
archer_geometry_preferences $saved_geometry
Archer .restore
.restore configure -geometry $startup_geometry
wm geometry .restore $startup_geometry
event generate [.restore component hpane] <Map>
archer_geometry_settle
::gui::test::require {[wm geometry .restore] eq $startup_geometry} \
"a child Map event restored the main window's geometry prematurely"
wm deiconify .restore
archer_geometry_settle
::gui::test::require {[wm geometry .restore] eq $saved_geometry} \
"mapping the main window did not restore its saved geometry"
wm geometry .restore $updated_geometry
event generate [.restore component hpane] <Map>
archer_geometry_settle
::gui::test::require {[wm geometry .restore] eq $updated_geometry} \
"a later child Map event reset the resized main window"
wm withdraw .restore
::itcl::delete object .restore
archer_geometry_settle
::gui::test::require {[archer_geometry_saved] eq $updated_geometry} \
"closing a previously mapped window did not save its latest geometry"
archer_geometry_preferences
Archer .default
wm geometry .default $default_geometry
wm deiconify .default
archer_geometry_settle
::gui::test::require {[wm geometry .default] eq $default_geometry} \
"an empty geometry option reset the window to its layout size"
wm withdraw .default
::itcl::delete object .default
archer_geometry_settle
} message options]} {
puts stderr $message
if {[dict exists $options -errorinfo]} {
puts stderr [dict get $options -errorinfo]
}
puts "FAIL: Archer window geometry regression"
exit 1
}
puts "PASS: Archer window geometry restoration and startup cancellation"
exit 0
# Local Variables:
# tab-width: 8
# mode: Tcl
# tcl-indent-level: 4
# indent-tabs-mode: t
# End:
# ex: shiftwidth=4 tabstop=8
+7 -9
View File
@@ -72,17 +72,15 @@ set(archer_wizard_FILES
)
if(BRLCAD_ENABLE_TCL)
brlcad_adddata(archer_utility_FILES plugins/archer/Utility)
brlcad_adddata(archer_wizard_FILES plugins/archer/Wizards)
# Archer scans only the plugin category directories for registration scripts.
# Keep class definitions in their subdirectories so they are not sourced twice.
foreach(plugin_file IN LISTS archer_utility_FILES archer_wizard_FILES)
get_filename_component(plugin_dir "${plugin_file}" DIRECTORY)
file(RELATIVE_PATH plugin_dir "${CMAKE_CURRENT_SOURCE_DIR}/plugins" "${CMAKE_CURRENT_SOURCE_DIR}/${plugin_dir}")
brlcad_adddata("${plugin_file}" "plugins/archer/${plugin_dir}")
endforeach()
brlcad_adddata(plugins/Commands/README plugins/archer/Command)
brlcad_adddata(plugins/Core/README plugins/archer/Core)
brlcad_adddata(plugins/Utility/attrGroupsDisplayUtilityP/AttrGroupsDisplayUtilityP.tcl plugins/archer/Utility/attrGroupsDisplayUtilityP)
brlcad_adddata(plugins/Utility/botUtilityP/BotUtilityP.tcl plugins/archer/Utility/botUtilityP)
brlcad_adddata(plugins/Utility/lodUtilityP/LODUtilityP.tcl plugins/archer/Utility/lodUtilityP)
brlcad_adddata(plugins/Wizards/humanwizard/HumanWizard.tcl plugins/archer/Wizards/humanwizard)
brlcad_adddata(plugins/Wizards/tankwizard/TankWizard.tcl plugins/archer/Wizards/tankwizard)
brlcad_adddata(plugins/Wizards/tankwizard/images/tank.png plugins/archer/Wizards/tankwizardIA/images)
brlcad_adddata(plugins/Wizards/tirewizard/TireWizard.tcl plugins/archer/Wizards/tirewizard)
endif(BRLCAD_ENABLE_TCL)
set(
+2 -3
View File
@@ -63,7 +63,6 @@ extern int gettimeofday(struct timeval *, void *);
static constexpr int64_t usec_per_sec = 1000000;
static constexpr int64_t nsec_per_sec = 1000000000;
static constexpr int64_t nsec_per_usec = 1000;
#if defined(HAVE_GETPROCESSTIMES) || defined(HAVE_GETTHREADTIMES)
static constexpr int64_t nsec_per_windows_tick = 100;
#endif
@@ -107,7 +106,7 @@ timer_rusage(const struct rusage *usage)
+ (int64_t)usage->ru_stime.tv_sec * usec_per_sec
+ (int64_t)usage->ru_stime.tv_usec;
return usec * nsec_per_usec;
return usec * (nsec_per_sec / usec_per_sec);
}
@@ -149,7 +148,7 @@ static int64_t
timer_mach_time_val(const time_value_t *time_val)
{
return ((int64_t)time_val->seconds * nsec_per_sec
+ (int64_t)time_val->microseconds * nsec_per_usec);
+ (int64_t)time_val->microseconds * (nsec_per_sec / usec_per_sec));
}
static int64_t
+9 -3
View File
@@ -254,9 +254,15 @@ qtgl_open(void *ctx, void *UNUSED(interp), int argc, const char **argv)
if (bu_vls_strlen(&dmp->i->dm_pathName) == 0)
bu_vls_printf(&dmp->i->dm_pathName, ".dm_qtgl%d", count);
++count;
/* The supplied QOpenGLWidget determines the Qt display. Keep dm_dName
* empty unless the caller supplied -d; DISPLAY is an X11 setting and
* cannot identify a Qt context on every supported platform. */
if (bu_vls_strlen(&dmp->i->dm_dName) == 0) {
char *dp;
dp = getenv("DISPLAY");
if (dp)
bu_vls_strcpy(&dmp->i->dm_dName, dp);
else
bu_vls_strcpy(&dmp->i->dm_dName, ":0.0");
}
/* initialize dm specific variables */
pubvars->devmotionnotify = 0;
+9 -3
View File
@@ -246,9 +246,15 @@ swrast_open(void *ctx, void *UNUSED(interp), int argc, const char **argv)
if (bu_vls_strlen(&dmp->i->dm_pathName) == 0)
bu_vls_printf(&dmp->i->dm_pathName, ".dm_swrast%d", count);
++count;
/* OSMesa is offscreen and has no display to discover. Leave dm_dName
* empty unless the caller supplied -d; a window-system wrapper can then
* select its own initialized display without inheriting X11 state. */
if (bu_vls_strlen(&dmp->i->dm_dName) == 0) {
char *dp;
dp = getenv("DISPLAY");
if (dp)
bu_vls_strcpy(&dmp->i->dm_dName, dp);
else
bu_vls_strcpy(&dmp->i->dm_dName, ":0.0");
}
/* initialize dm specific variables */
pubvars->devmotionnotify = 0;
-10
View File
@@ -464,16 +464,6 @@ tkswrast_open(void *ctx, void *vinterp, int argc, const char **argv)
tv->orig_configureWin = dmp->i->dm_configureWin;
tv->orig_close = dmp->i->dm_close;
/* The wrapped offscreen backend deliberately has no default display.
* For this Tk presentation layer, use the display Tk actually opened.
* This remains correct for X11, Win32, and Aqua even when the process
* inherited an unrelated DISPLAY value. An explicit -d remains intact
* and is validated below by Tk_CreateWindowFromPath. */
if (bu_vls_strlen(&dmp->i->dm_dName) == 0) {
bu_vls_printf(&dmp->i->dm_dName, "%s.%d", Tk_DisplayName(tkwin),
Tk_ScreenNumber(tkwin));
}
char *cp = strrchr(bu_vls_addr(&dmp->i->dm_pathName), '.');
if (dmp->i->dm_top) {
tv->xtkwin = Tk_CreateWindowFromPath(interp, tkwin,
+7 -5
View File
@@ -1040,11 +1040,13 @@ wgl_open(void *UNUSED(ctx), void *vinterp, int argc, const char *argv[])
++count;
if (bu_vls_strlen(&dmp->i->dm_dName) == 0) {
/* DISPLAY names an X server and is not meaningful to WGL. Unix-like
* shells on Windows may nevertheless export it, so use the screen of
* the Tk window that supplies the native HWND. */
bu_vls_printf(&dmp->i->dm_dName, "%s.%d", Tk_DisplayName(tkwin),
Tk_ScreenNumber(tkwin));
char *dp;
dp = getenv("DISPLAY");
if (dp)
bu_vls_strcpy(&dmp->i->dm_dName, dp);
else
bu_vls_strcpy(&dmp->i->dm_dName, ":0.0");
}
/* initialize dm specific variables */
+90 -70
View File
@@ -247,19 +247,41 @@ rt_in_rpp(struct xray *rp,
}
/* A name alone cannot distinguish transformed instances of a solid. */
static struct soltab *
rt_find_solid_with_mat(const struct rt_i *rtip,
const struct directory *dp, const mat_t mat)
{
struct soltab *stp;
RT_VISIT_ALL_SOLTABS_START(stp, (struct rt_i *)rtip) {
if (stp->st_dp != dp)
continue;
const fastf_t *st_mat = stp->st_matp ?
stp->st_matp : bn_mat_identity;
if (bn_mat_is_equal(mat, st_mat, &rtip->rti_tol))
return stp;
} RT_VISIT_ALL_SOLTABS_END;
return NULL;
}
/**
* Traverse the passed tree using rt_db_internals to show the way
* This function supports rt_bound_internal and is internal to librt
* Traverse the original database tree while tracking member transforms.
*
* Returns -
* 0 success
* -1 failure (tree_min and tree_max may have been altered)
* Returns 0 on success, -1 if no bounds can be computed.
*/
int
rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fastf_t *tree_max)
static int
rt_traverse_tree_mat(struct rt_i *rtip, const union tree *tp,
fastf_t *tree_min, fastf_t *tree_max,
const mat_t mat)
{
vect_t r_min, r_max; /* rpp for right side of tree */
if (!tp)
return -1;
RT_CK_TREE(tp);
switch (tp->tr_op) {
@@ -269,6 +291,8 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
const struct soltab *stp;
stp = tp->tr_a.tu_stp;
if (!stp)
return -1;
RT_CK_SOLTAB(stp);
if (stp->st_aradius <= 0) {
bu_log("rt_traverse_tree: encountered dead solid '%s'\n",
@@ -293,16 +317,20 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
case OP_XOR:
case OP_UNION:
/* BINARY type -- expand to contain both */
if (rt_traverse_tree(rtip, tp->tr_b.tb_left, tree_min, tree_max) < 0 ||
rt_traverse_tree(rtip, tp->tr_b.tb_right, r_min, r_max) < 0)
if (rt_traverse_tree_mat(rtip, tp->tr_b.tb_left,
tree_min, tree_max, mat) < 0 ||
rt_traverse_tree_mat(rtip, tp->tr_b.tb_right,
r_min, r_max, mat) < 0)
return -1;
VMIN(tree_min, r_min);
VMAX(tree_max, r_max);
break;
case OP_INTERSECT:
/* BINARY type -- find common area only */
if (rt_traverse_tree(rtip, tp->tr_b.tb_left, tree_min, tree_max) < 0 ||
rt_traverse_tree(rtip, tp->tr_b.tb_right, r_min, r_max) < 0)
if (rt_traverse_tree_mat(rtip, tp->tr_b.tb_left,
tree_min, tree_max, mat) < 0 ||
rt_traverse_tree_mat(rtip, tp->tr_b.tb_right,
r_min, r_max, mat) < 0)
return -1;
/* min = largest min, max = smallest max */
VMAX(tree_min, r_min);
@@ -313,7 +341,8 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
* rt_gettree's subtractor shaker may have already discarded a
* disjoint B (and its soltab) from the prepared tree, while this
* routine may be walking the original database tree. */
if (rt_traverse_tree(rtip, tp->tr_b.tb_left, tree_min, tree_max) < 0)
if (rt_traverse_tree_mat(rtip, tp->tr_b.tb_left,
tree_min, tree_max, mat) < 0)
return -1;
break;
@@ -324,6 +353,8 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
case OP_DB_LEAF:
{
const struct soltab *stp;
struct directory *dp;
mat_t leaf_mat;
if (rtip == NULL) {
bu_log("rt_traverse_tree: A valid rtip was not passed for calculating bounds of '%s'\n",
@@ -331,60 +362,44 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
return -1;
}
/* Good to go */
MAT_COPY(leaf_mat, mat);
if (tp->tr_l.tl_mat)
bn_mat_mul(leaf_mat, mat, tp->tr_l.tl_mat);
/* Attempt to get a solid pointer, will fail for combs */
stp = rt_find_solid(rtip, tp->tr_l.tl_name);
dp = db_lookup(rtip->rti_dbip, tp->tr_l.tl_name,
LOOKUP_QUIET);
if (dp == RT_DIR_NULL)
return -1;
stp = rt_find_solid_with_mat(rtip, dp, leaf_mat);
if (stp == NULL) {
/* It was a comb! get an internal format and
* repeat the whole thing that got us here in the
* 1st place
*/
/* Recurse through combinations using their original
* trees. A primitive without a matching prepared
* instance has no valid bounds. */
struct rt_db_internal intern;
struct directory *dp;
struct rt_comb_internal *combp;
/* Get the directory pointer */
if ((dp=db_lookup(rtip->rti_dbip, tp->tr_l.tl_name, LOOKUP_QUIET)) == RT_DIR_NULL) {
bu_log("rt_traverse_tree: db_lookup(%s) failed", tp->tr_l.tl_name);
return -1;
}
/* Why does recursion work with the internal
* format ? The internal format does have the
* boolean op for a comb in the tr_a.tu_op field
* in the root node, even though it has no prims
* at the leaves. So recursive calls to load the
* prim further down the tree, will return the
* correct bb as we are going through the proper
* switch case in each step down the tree
*/
if (!rt_db_lookup_internal(rtip->rti_dbip, tp->tr_l.tl_name, &dp, &intern, LOOKUP_NOISY)) {
bu_log("rt_traverse_tree: rt_db_lookup_internal(%s) failed to get the internal form",
tp->tr_l.tl_name);
return -1;
}
/* The passed rt_db_internal should be a comb,
* prepare a rt_comb_internal
*/
if (intern.idb_minor_type == ID_COMBINATION) {
combp = (struct rt_comb_internal *)intern.idb_ptr;
} else {
/* if it's not a comb, then something else is
* cooking.
*/
bu_log("rt_traverse_tree: WARNING : rt_db_lookup_internal(%s) got the internal form of a primitive when it should not, the bounds may not be correct", tp->tr_l.tl_name);
if (intern.idb_minor_type != ID_COMBINATION) {
bu_log("rt_traverse_tree: no prepared instance"
" for '%s'\n", tp->tr_l.tl_name);
rt_db_free_internal(&intern);
return -1;
}
combp = (struct rt_comb_internal *)intern.idb_ptr;
RT_CK_COMB(combp);
/* further down the rabbit hole */
if (rt_traverse_tree(rtip, combp->tree, tree_min, tree_max)) {
bu_log("rt_traverse_tree: rt_bound_tree() failed\n");
int ret = rt_traverse_tree_mat(rtip, combp->tree,
tree_min, tree_max, leaf_mat);
rt_db_free_internal(&intern);
if (ret)
return -1;
}
} else {
/* Got a solid pointer, get bounds and return */
RT_CK_SOLTAB(stp);
@@ -408,13 +423,24 @@ rt_traverse_tree(struct rt_i *rtip, const union tree *tp, fastf_t *tree_min, fas
}
case OP_NOP:
/* Implies that this tree has nothing in it */
break;
/* An empty tree has no bounds to return. */
return -1;
}
return 0;
}
int
rt_traverse_tree(struct rt_i *rtip, const union tree *tp,
fastf_t *tree_min, fastf_t *tree_max)
{
mat_t mat;
MAT_IDN(mat);
return rt_traverse_tree_mat(rtip, tp, tree_min, tree_max, mat);
}
int
rt_bound_instance(point_t *bmin, point_t *bmax,
struct directory *dp,
@@ -472,7 +498,8 @@ rt_bound_internal(struct db_i *dbip, struct directory *dp,
struct rt_db_internal intern;
struct rt_comb_internal *combp;
vect_t tree_min, tree_max;
union tree *tp;
const union tree *tp;
union tree primitive_tree;
/* Initialize RPP bounds */
VSETALL(rpp_min, MAX_FASTF);
@@ -494,7 +521,8 @@ rt_bound_internal(struct db_i *dbip, struct directory *dp,
if (!rt_db_lookup_internal(dbip, dp->d_namep, &dp, &intern, LOOKUP_NOISY)) {
bu_exit(1, "rt_bound_internal: rt_db_lookup_internal(%s) failed to get the internal form", dp->d_namep);
bu_log("rt_bound_internal: lookup failed for '%s'\n",
dp->d_namep);
rt_i_destroy(rtip);
return -1;
}
@@ -504,26 +532,18 @@ rt_bound_internal(struct db_i *dbip, struct directory *dp,
*/
if (intern.idb_minor_type == ID_COMBINATION) {
combp = (struct rt_comb_internal *)intern.idb_ptr;
RT_CK_COMB(combp);
tp = combp->tree;
} else {
/* A primitive was passed, construct a struct rt_comb_internal
* with a single leaf node.
*/
BU_ALLOC(combp, struct rt_comb_internal);
RT_COMB_INTERNAL_INIT(combp);
combp->region_flag = 0;
BU_GET(tp, union tree);
RT_TREE_INIT(tp);
tp->tr_l.tl_op = OP_SOLID;
tp->tr_l.tl_name = bu_strdup("dummy");
tp->tr_l.tl_mat = (matp_t)NULL;
tp->tr_a.tu_stp = rt_find_solid(rtip, dp->d_namep);
combp->tree = tp;
/* A primitive uses its prepared solid directly. */
RT_TREE_INIT(&primitive_tree);
primitive_tree.tr_l.tl_op = OP_SOLID;
primitive_tree.tr_a.tu_stp = rt_find_solid(rtip, dp->d_namep);
tp = &primitive_tree;
}
RT_CK_COMB(combp);
if (rt_traverse_tree(rtip, combp->tree, tree_min, tree_max)) {
bu_log("rt_bound_internal: rt_bound_tree() failed\n");
if (rt_traverse_tree(rtip, tp, tree_min, tree_max)) {
bu_log("rt_bound_internal: tree traversal failed\n");
rt_db_free_internal(&intern);
rt_i_destroy(rtip);
return -1;
+20 -14
View File
@@ -72,10 +72,15 @@ brlcad_add_test(NAME rt_tree_prune COMMAND rt_tree_prune)
brlcad_addexec(rt_reprep_prune reprep_prune.c "librt;libwdb;libbu;${M_LIBRARY}" TEST)
brlcad_addexec(rt_rtcmp_capture rtcmp_capture.c "librt;libwdb;libbu;${M_LIBRARY}" TEST)
brlcad_add_test(NAME rt_rtcmp_capture COMMAND rt_rtcmp_capture)
brlcad_add_test(NAME rt_rtcmp_capture_primitives COMMAND rt_rtcmp_capture primitives)
brlcad_add_test(NAME rt_reprep_prune COMMAND rt_reprep_prune)
# Note - this feature is not available in a BRLCAD_ENABLE_RUNTIME_DEBUG=OFF
# build, since it has an unavoidable performance overhead in the hot loop to
# check if the setting is enabled.
if (BRLCAD_ENABLE_RUNTIME_DEBUG)
brlcad_addexec(rt_rtcmp_capture rtcmp_capture.c "librt;libwdb;libbu;${M_LIBRARY}" TEST)
brlcad_add_test(NAME rt_rtcmp_capture COMMAND rt_rtcmp_capture)
brlcad_add_test(NAME rt_rtcmp_capture_primitives COMMAND rt_rtcmp_capture primitives)
brlcad_add_test(NAME rt_reprep_prune COMMAND rt_reprep_prune)
endif()
brlcad_addexec(rt_submodel_xform submodel_xform.c "librt;libwdb;libbu;${M_LIBRARY}" TEST)
brlcad_add_test(NAME rt_submodel_xform COMMAND rt_submodel_xform)
@@ -212,36 +217,37 @@ brlcad_add_test(NAME rt_metaball_adjust COMMAND rt_metaball_adjust)
set(
distcheck_files
CMakeLists.txt
ars_inside.c
arb_intersect.g
ars_inside.c
binary_attribute.c
binunif.c
brep_io.cpp
bound_internal.c
brep_boolean_tests.g
brep_io.cpp
crofton.c
cyclic_tests.g
datum_annot_semantics.c
db_name.c
default_object.c
datum_annot_semantics.c
dsp_raytrace_check.c
dsp_sa_vol_check.c
primitive_brep.cpp
reprep_prune.c
brep_boolean_tests.g
cyclic_tests.g
extreme_ssi_test.g
invalid_inmem.c
lcomb_large.c
matrix_tests.g
metaball_adjust.c
nurbs_surfaces.g
pnts_bounds.c
prim_tess.c
primitive_brep.cpp
reprep_prune.c
rt_datum.c
rt_perturb.c
rtcmp_capture.c
search_stress.c
static_init.cpp
sketch.g
static_init.cpp
submodel_xform.c
prim_tess.c
pnts_bounds.c
tess_timing.c
tree_prune.c
vds_tree.c
+63
View File
@@ -37,6 +37,7 @@ main(int UNUSED(argc), const char **argv)
point_t bmin, bmax;
point_t expected_min = {-1.0, -1.0, -1.0};
point_t expected_max = { 1.0, 1.0, 1.0};
mat_t translated;
int ret = 1;
bu_setprogname(argv[0]);
@@ -75,6 +76,68 @@ main(int UNUSED(argc), const char **argv)
if (!VNEAR_EQUAL(bmax, expected_max, BN_TOL_DIST))
goto done;
dp = db_lookup(dbip, "left.s", LOOKUP_QUIET);
if (dp == RT_DIR_NULL || rt_bound_internal(dbip, dp, bmin, bmax))
goto done;
if (!VNEAR_EQUAL(bmin, expected_min, BN_TOL_DIST) ||
!VNEAR_EQUAL(bmax, expected_max, BN_TOL_DIST))
goto done;
BU_LIST_INIT(&wm.l);
if (mk_comb(wdbp, "empty.c", &wm.l, 0, NULL, NULL, NULL,
0, 0, 0, 0, 0, 0, 0))
goto done;
dp = db_lookup(dbip, "empty.c", LOOKUP_QUIET);
if (dp == RT_DIR_NULL ||
rt_bound_internal(dbip, dp, bmin, bmax) == 0)
goto done;
BU_LIST_INIT(&wm.l);
if (!mk_addmember("empty.c", &wm.l, NULL, WMOP_UNION))
goto done;
if (mk_lcomb(wdbp, "nested.c", &wm, 0, NULL, NULL, NULL, 0))
goto done;
dp = db_lookup(dbip, "nested.c", LOOKUP_QUIET);
if (dp == RT_DIR_NULL ||
rt_bound_internal(dbip, dp, bmin, bmax) == 0)
goto done;
MAT_IDN(translated);
MAT_DELTAS(translated, 20.0, 0.0, 0.0);
BU_LIST_INIT(&wm.l);
if (!mk_addmember("left.s", &wm.l, NULL, WMOP_UNION) ||
!mk_addmember("left.s", &wm.l, translated, WMOP_UNION))
goto done;
if (mk_lcomb(wdbp, "instanced.r", &wm, 1, NULL, NULL, NULL, 0))
goto done;
dp = db_lookup(dbip, "instanced.r", LOOKUP_QUIET);
if (dp == RT_DIR_NULL || rt_bound_internal(dbip, dp, bmin, bmax))
goto done;
VSET(expected_max, 21.0, 1.0, 1.0);
if (!VNEAR_EQUAL(bmin, expected_min, BN_TOL_DIST) ||
!VNEAR_EQUAL(bmax, expected_max, BN_TOL_DIST))
goto done;
BU_LIST_INIT(&wm.l);
if (!mk_addmember("left.s", &wm.l, translated, WMOP_UNION))
goto done;
if (mk_lcomb(wdbp, "child.c", &wm, 0, NULL, NULL, NULL, 0))
goto done;
MAT_DELTAS(translated, 10.0, 0.0, 0.0);
BU_LIST_INIT(&wm.l);
if (!mk_addmember("child.c", &wm.l, translated, WMOP_UNION))
goto done;
if (mk_lcomb(wdbp, "parent.r", &wm, 1, NULL, NULL, NULL, 0))
goto done;
dp = db_lookup(dbip, "parent.r", LOOKUP_QUIET);
if (dp == RT_DIR_NULL || rt_bound_internal(dbip, dp, bmin, bmax))
goto done;
VSET(expected_min, 29.0, -1.0, -1.0);
VSET(expected_max, 31.0, 1.0, 1.0);
if (!VNEAR_EQUAL(bmin, expected_min, BN_TOL_DIST) ||
!VNEAR_EQUAL(bmax, expected_max, BN_TOL_DIST))
goto done;
ret = 0;
done:
+64
View File
@@ -85,6 +85,69 @@ proc exercise_object_lifecycle {class object args} {
}
}
proc exercise_panedwindow_bindings {} {
set pane_size 200
set drag_distance 20
set native_motion_binding [bind Panedwindow <Motion>]
toplevel .panes
foreach orientation {horizontal vertical} {
set pane .panes.$orientation
iwidgets::panedwindow $pane -orient $orientation \
-width $pane_size -height $pane_size -showhandle 0
$pane add first -minimum 0 -margin 0
$pane add second -minimum 0 -margin 0
pack $pane -side left -fill both -expand yes
}
panedwindow .panes.native -width $pane_size -height $pane_size
foreach name {first second} {
frame .panes.native.$name
.panes.native add .panes.native.$name
}
pack .panes.native -side left -fill both -expand yes
update
# Hull events must not invoke native Tk handlers on Iwidgets objects.
foreach pane {.panes.horizontal .panes.vertical .panes.native} {
foreach event {
<Motion> <Leave>
<ButtonPress-1> <B1-Motion> <ButtonRelease-1>
<ButtonPress-2> <B2-Motion> <ButtonRelease-2>
} {
event generate $pane $event -x 1 -y 1
}
update
assert_equal "$pane pointer events" $::background_errors {}
}
assert_equal "native panedwindow motion binding" \
[bind Panedwindow <Motion>] $native_motion_binding
# Removing the hull's class tag must retain Iwidgets' sash dragging.
foreach orientation {horizontal vertical} {
set pane .panes.$orientation
set before [$pane fraction]
set sash [$pane component sash1]
set x 0
set y 0
if {$orientation eq "horizontal"} {
set y $drag_distance
} else {
set x $drag_distance
}
event generate $sash <ButtonPress-1> -x 0 -y 0
event generate $sash <B1-Motion> -x $x -y $y
event generate $sash <B1-ButtonRelease-1> -x $x -y $y
update
if {[lindex [$pane fraction] 0] <= [lindex $before 0]} {
fail "$orientation panedwindow sash did not move"
}
assert_equal "$orientation sash events" $::background_errors {}
}
destroy .panes
update
}
proc require_at_least {package minimum} {
set version [package require $package $minimum]
if {[package vcompare $version $minimum] < 0} {
@@ -102,6 +165,7 @@ set tk_version [require_at_least Tk 8.6]
set itcl_version [require_at_least Itcl 4.3.0]
set itk_version [require_at_least Itk 4.2.3]
set iwidgets_version [require_at_least Iwidgets 4.1.1]
exercise_panedwindow_bindings
interp alias {} Hierarchy {} ::iwidgets::Hierarchy
interp alias {} scrolledlistbox {} ::iwidgets::scrolledlistbox
+1 -1
View File
@@ -87,7 +87,7 @@ if(BRLCAD_ENABLE_TCL)
if(TK_LIBRARY)
target_compile_definitions(mged PRIVATE HAVE_TK=1)
endif(TK_LIBRARY)
target_include_directories(mged BEFORE PRIVATE ${MGED_INCLUDE_DIRS})
brlcad_include_dirs(mged MGED_INCLUDE_DIRS PRIVATE)
add_target_deps(mged Tkhtml Tktable itcl_pkgIndex itk_pkgIndex TclIndexBld dm_plugins)
# MGED needs the tclIndex and pkgIndex files set up correctly
+11 -93
View File
@@ -340,26 +340,6 @@ f_attach(ClientData clientData, Tcl_Interp *interpreter, int argc, const char *a
}
#ifdef HAVE_TK
static int
mged_restore_display_env(Tcl_Interp *interp, Tcl_Obj *saved_display)
{
int status;
if (saved_display != NULL) {
status = (Tcl_SetVar2Ex(interp, "env", "DISPLAY", saved_display,
TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) != NULL) ? TCL_OK : TCL_ERROR;
Tcl_DecrRefCount(saved_display);
return status;
}
status = Tcl_UnsetVar2(interp, "env", "DISPLAY",
TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG);
return status;
}
#endif
int
gui_setup(struct mged_state *s, const char *dstr)
{
@@ -368,7 +348,6 @@ gui_setup(struct mged_state *s, const char *dstr)
#ifdef HAVE_TK
Tk_GenericProc *handler = doEvent;
Tcl_Obj *saved_display = NULL;
#endif
/* initialize only once */
if (tkwin != NULL)
@@ -376,83 +355,24 @@ gui_setup(struct mged_state *s, const char *dstr)
Tcl_ResetResult(s->interp);
#ifdef HAVE_TK
/* Tk has no display-name argument in its C initialization API. For an
* explicit MGED -d/loadtk argument, env(DISPLAY) is therefore the only
* portable way to select an X11 display before Tk_Init. Do not do this
* for ambient process state: X11 Tk already reads DISPLAY itself, and
* native Win32/Aqua Tk deliberately ignores that X11-only variable. */
if (dstr != NULL) {
saved_display = Tcl_GetVar2Ex(s->interp, "env", "DISPLAY",
TCL_GLOBAL_ONLY);
if (saved_display != NULL)
Tcl_IncrRefCount(saved_display);
if (Tcl_SetVar2(s->interp, "env", "DISPLAY", dstr,
TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL) {
if (saved_display != NULL)
Tcl_DecrRefCount(saved_display);
return TCL_ERROR;
}
/* set DISPLAY to dstr */
if (dstr != (char *)NULL) {
Tcl_SetVar(s->interp, "env(DISPLAY)", dstr, TCL_GLOBAL_ONLY);
}
#ifdef HAVE_TK
/* This runs the tk.tcl script */
if (Tk_Init(s->interp) == TCL_ERROR) {
const char *result = Tcl_GetStringResult(s->interp);
/* hack to avoid a stupid Tk error */
if (bu_strncmp(result, "this isn't a Tk applicationcouldn't", 35) == 0) {
Tcl_SetObjResult(s->interp, Tcl_NewStringObj(result + 27, -1));
}
if (dstr != NULL) {
Tcl_SavedResult init_result;
/* Environment restoration is cleanup on this path; retain Tk's
* diagnostic even if an unusual Tcl environment trace rejects it. */
Tcl_SaveResult(s->interp, &init_result);
(void)mged_restore_display_env(s->interp, saved_display);
Tcl_RestoreResult(s->interp, &init_result);
result = (result + 27);
Tcl_ResetResult(s->interp);
Tcl_AppendResult(s->interp, result, (char *)NULL);
}
return TCL_ERROR;
}
if (dstr != NULL) {
int is_x11;
if (Tcl_Eval(s->interp, "tk windowingsystem") != TCL_OK) {
Tcl_SavedResult windowing_result;
Tcl_SaveResult(s->interp, &windowing_result);
(void)mged_restore_display_env(s->interp, saved_display);
Tcl_RestoreResult(s->interp, &windowing_result);
return TCL_ERROR;
}
is_x11 = BU_STR_EQUAL(Tcl_GetStringResult(s->interp), "x11");
Tcl_ResetResult(s->interp);
if (is_x11) {
/* X11 may use the explicit display for subsequently created
* toplevels and display managers, so keep it in the environment. */
if (saved_display != NULL)
Tcl_DecrRefCount(saved_display);
} else {
Tk_Window display_probe;
/* Win32 and Aqua cannot be redirected by DISPLAY. Restore the
* caller's environment, then let Tk validate whether the explicit
* name denotes the already initialized native screen. This accepts
* native aliases such as :0/:0.0 but reports unsupported alternate
* displays instead of silently opening a different screen. */
if (mged_restore_display_env(s->interp, saved_display) != TCL_OK)
return TCL_ERROR;
display_probe = Tk_CreateWindowFromPath(s->interp,
Tk_MainWindow(s->interp), ".__mged_display_probe", dstr);
if (display_probe == NULL)
return TCL_ERROR;
Tk_DestroyWindow(display_probe);
Tcl_ResetResult(s->interp);
}
}
/* Initialize [incr Tk] */
if (Tcl_Eval(s->interp, "package require Itk") != TCL_OK) {
return TCL_ERROR;
@@ -465,10 +385,6 @@ gui_setup(struct mged_state *s, const char *dstr)
}
#endif
#ifndef HAVE_TK
(void)dstr;
#endif
/* Initialize the Iwidgets package */
if (Tcl_Eval(s->interp, "package require Iwidgets") != TCL_OK) {
return TCL_ERROR;
@@ -509,6 +425,8 @@ mged_attach(struct mged_state *s, const char *wp_name, int argc, const char *arg
{
int opt_argc;
char **opt_argv;
const char *dm_name;
const char *dm_lname;
struct mged_dm *o_dm;
if (!wp_name) {
@@ -579,8 +497,8 @@ mged_attach(struct mged_state *s, const char *wp_name, int argc, const char *arg
mged_link_vars(s->mged_curr_dm);
Tcl_ResetResult(s->interp);
const char *dm_name = dm_get_dm_name(DMP);
const char *dm_lname = dm_get_dm_lname(DMP);
dm_name = dm_get_dm_name(DMP);
dm_lname = dm_get_dm_lname(DMP);
if (dm_name && dm_lname) {
Tcl_AppendResult(s->interp, "ATTACHING ", dm_name, " (", dm_lname, ")\n", (char *)NULL);
}
+2 -1
View File
@@ -86,6 +86,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[
struct rt_arb_internal *arb;
struct rt_arb_internal *arbo;
plane_t planes[6];
int arb_type;
int status;
struct bu_vls error_msg;
@@ -125,7 +126,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[
RT_ARB_CK_MAGIC(arb);
/* find new planes to account for any editing */
int arb_type = rt_arb_std_type(&MEDIT(s)->es_int, MEDIT(s)->tol);
arb_type = rt_arb_std_type(&MEDIT(s)->es_int, MEDIT(s)->tol);
if (rt_arb_calc_planes(&error_msg, arb, arb_type, planes, &s->tol.tol)) {
Tcl_AppendResult(interp, bu_vls_addr(&error_msg),
"Unable to determine plane equations\n", (char *)NULL);
+16 -33
View File
@@ -113,9 +113,6 @@ extern struct _mged_variables default_mged_variables;
/* defined in color_scheme.c */
extern struct _color_scheme default_color_scheme;
/* defined in grid.c */
extern struct bv_grid_state default_grid_state;
/* defined in axes.c */
extern struct _axes_state default_axes_state;
@@ -2446,29 +2443,6 @@ apply_cli_overrides(struct mged_state *s, struct mged_cli_overrides *cl)
if (cli_dbl_is_set(cl->eye_sep_dist)) CLI_SETVAR_DBL("eye_sep_dist", cl->eye_sep_dist);
/* --- Tcl mged_default array entries ---------------------------------- */
if (cl->dpy_string) {
const char *display = cl->dpy_string;
#ifdef HAVE_TK
struct bu_vls tk_screen = BU_VLS_INIT_ZERO;
Tk_Window main_window = Tk_MainWindow(s->interp);
/* Apply -d after .mgedrc just like the other command-line overrides.
* Once Tk is initialized, store its canonical screen name rather than
* the spelling used to select it (for example, :0 and :0.0 may denote
* the same native screen). Classic/headless mode retains the original
* value for a later display-manager attach. */
if (main_window != NULL) {
bu_vls_printf(&tk_screen, "%s.%d", Tk_DisplayName(main_window),
Tk_ScreenNumber(main_window));
display = bu_vls_cstr(&tk_screen);
}
#endif
Tcl_SetVar2(s->interp, "mged_default", "display", display,
TCL_GLOBAL_ONLY);
#ifdef HAVE_TK
bu_vls_free(&tk_screen);
#endif
}
if (cl->dm_type)
Tcl_SetVar2(s->interp, "mged_default", "dm_type", cl->dm_type, TCL_GLOBAL_ONLY);
if (cl->geom)
@@ -2717,7 +2691,7 @@ main(int argc, char *argv[])
struct bu_opt_desc opt_defs[54];
/* ---- Existing short options, now with long aliases ---- */
BU_OPT(opt_defs[0], "a", "attach", "type", bu_opt_str, &cl.attach, "display manager attach target");
BU_OPT(opt_defs[1], "d", "display", "screen", bu_opt_str, &cl.dpy_string, "Tk display and screen name");
BU_OPT(opt_defs[1], "d", "display", "string", bu_opt_str, &cl.dpy_string, "X display string");
BU_OPT(opt_defs[2], "r", "read-only", "", NULL, &cl.read_only, "open database read-only");
BU_OPT(opt_defs[3], "p", "pipe", "", NULL, &cl.pipe_mode, "pipe mode (emit CMD_DONE sentinels)");
BU_OPT(opt_defs[4], "c", "classic", "", NULL, &cl.classic_mode, "classic text-only mode");
@@ -3067,6 +3041,9 @@ main(int argc, char *argv[])
(void)Tcl_Eval(s->interp, bu_vls_addr(&s->input_str));
bu_vls_trunc(&s->input_str, 0);
if (!s->dpy_string)
s->dpy_string = getenv("DISPLAY");
/* show ourselves */
if (s->interactive) {
if (s->classic_mged) {
@@ -3088,17 +3065,23 @@ main(int argc, char *argv[])
/* start up the gui */
int status;
struct bu_vls vls = BU_VLS_INIT_ZERO;
struct bu_vls error = BU_VLS_INIT_ZERO;
(void)Tcl_Eval(s->interp, "set mged_console_mode gui");
/* An unset -d is deliberately passed as NULL. Tk already knows how
* to select its platform display: X11 consults DISPLAY, while the
* Win32 and Aqua backends select their native display. Treating an
* inherited DISPLAY value as an explicit request breaks native Tk
* when Unix-like shells export an X11 placeholder. */
status = gui_setup(s, s->dpy_string);
bu_vls_strcpy(&vls, "loadtk");
if (s->dpy_string)
bu_vls_printf(&vls, " %s", s->dpy_string);
status = Tcl_Eval(s->interp, bu_vls_addr(&vls));
bu_vls_strcpy(&error, Tcl_GetStringResult(s->interp));
bu_vls_free(&vls);
if (status != TCL_OK && !s->dpy_string) {
/* failed to load tk, try localhost X11 if DISPLAY was not set */
status = Tcl_Eval(s->interp, "loadtk :0");
}
if (status != TCL_OK) {
if (!run_in_foreground && use_pipe) {
+1
View File
@@ -575,6 +575,7 @@ void pr_beep(void);
void pr_prompt(struct mged_state *s);
/* grid.c */
extern struct bv_grid_state default_grid_state;
extern void round_to_grid(struct mged_state *s, fastf_t *view_dx, fastf_t *view_dy);
extern void snap_keypoint_to_grid(struct mged_state *s);
extern void snap_view_center_to_grid(struct mged_state *s);
+29 -10
View File
@@ -226,7 +226,7 @@ package provide Archer 1.0
method buildViewAxesPreferences {}
method doAboutArcher {}
method doarcherHelp {}
method handleMap {}
method handleMap {_window}
method handleBindingModeChange {_name1 _name2 _op}
method overrideBindingMode {_mode}
method updateOverrideBindingMode {_keysym}
@@ -427,6 +427,7 @@ package provide Archer 1.0
private {
variable mInstanceInit 1
variable mWindowMapped 0
}
}
@@ -528,7 +529,7 @@ package provide Archer 1.0
}
# resize and position window after it's drawn
bind [namespace tail $this] <Map> [::itcl::code $this handleMap]
bind [namespace tail $this] <Map> [::itcl::code $this handleMap %W]
}
@@ -4263,18 +4264,26 @@ proc title_node_handler {node} {
}
::itcl::body Archer::handleMap {} {
if {$mWindowGeometry != ""} {
after idle "wm geometry [namespace tail $this] $mWindowGeometry"
} else {
after idle "wm geometry [namespace tail $this] $itk_option(-geometry)"
::itcl::body Archer::handleMap {_window} {
# Child windows also dispatch Map events through the toplevel's tag.
if {$_window ne [namespace tail $this]} {
return
}
set mWindowMapped 1
set geometry $mWindowGeometry
if {$geometry eq ""} {
set geometry $itk_option(-geometry)
}
if {$geometry ne ""} {
after idle [list wm geometry $_window $geometry]
}
if {$mSeparateCommandWindow && $mCmdWindowGeometry != ""} {
after idle [::itcl::code wm geometry $itk_component(sepcmdT) $mCmdWindowGeometry]
after idle [list wm geometry $itk_component(sepcmdT) $mCmdWindowGeometry]
}
bind [namespace tail $this] <Map> {}
bind $_window <Map> {}
}
::itcl::body Archer::handleDisplayEscape {_dm} {
@@ -9351,7 +9360,17 @@ proc title_node_handler {node} {
puts $_pfile "set mVPaneToggle3 $mVPaneToggle3"
puts $_pfile "set mVPaneToggle5 $mVPaneToggle5"
puts $_pfile "set mWindowGeometry [winfo geometry [namespace tail $this]]"
# Before the first map, the hull's size only reflects unfinished layout.
if {$mWindowMapped} {
if {$ArcherCore::inheritFromToplevel} {
set mWindowGeometry [wm geometry [namespace tail $this]]
} else {
set mWindowGeometry [winfo geometry [namespace tail $this]]
}
}
if {$mWindowGeometry ne ""} {
puts $_pfile [list set mWindowGeometry $mWindowGeometry]
}
if {$mSeparateCommandWindow} {
puts $_pfile "set mCmdWindowGeometry [winfo geometry $itk_component(sepcmdT)]"
+3 -3
View File
@@ -1090,9 +1090,9 @@ namespace delete ::ArcherCoreBootstrap
wm withdraw [namespace tail $this]
}
# Tk has already selected its X11, Win32, or Aqua display. DISPLAY is an
# X11 input to that initialization, not portable application state; in
# particular, synthesizing :0 here can misdirect native Tk child windows.
if {![info exists env(DISPLAY)]} {
set env(DISPLAY) ":0"
}
set mImgDir [file join [bu_dir data] tclscripts archer images]
+1 -2
View File
@@ -165,8 +165,7 @@ proc secErrorDialog {root title text default args} {
update idletasks
# First frame consists of error icon and message
frame $base.frame\#1 \
-class Panedwindow
frame $base.frame\#1
pack $base.frame\#1 -fill x -anchor w
canvas $base.frame\#1.bitmap \
+5 -1
View File
@@ -25,7 +25,11 @@
#
if ![info exists mged_default(display)] {
set mged_default(display) [winfo screen .]
if [info exists env(DISPLAY)] {
set mged_default(display) $env(DISPLAY)
} else {
set mged_default(display) :0
}
}
if ![info exists mged_gui(mged,screen)] {
+5 -1
View File
@@ -24,7 +24,11 @@
#
if ![info exists mged_default(display)] {
set mged_default(display) [winfo screen .]
if [info exists env(DISPLAY)] {
set mged_default(display) $env(DISPLAY)
} else {
set mged_default(display) :0
}
}
if ![info exists mged_gui(mged,screen)] {
+6 -1
View File
@@ -27,6 +27,10 @@ if ![info exists mged_players] {
set mged_players {}
}
if ![info exists env(DISPLAY)] {
set env(DISPLAY) ":0"
}
#==============================================================================
# Ensure that tk.tcl has been loaded already via mged command 'loadtk'.
#==============================================================================
@@ -43,10 +47,11 @@ if { [info exists tk_strictMotif] == 0 } {
# MGED html manual directory search order precedence should be:
# MGED_HTML_DIR
# [bu_dir data]/html/manuals/mged
# [bu_dir doc]/html/manuals/mged
if ![info exists mged_default(html_dir)] {
set mged_default(html_dir) [file normalize [file join [bu_dir doc] html manuals mged]]
set mged_default(html_dir) [file normalize [file join [bu_dir data] html manuals mged]]
if {![file exists $mged_default(html_dir)]} {
set mged_default(html_dir) [file normalize [file join [bu_dir doc] html manuals mged]]
}
+2 -1
View File
@@ -154,7 +154,8 @@ proc dump_mged_state {fd} {
puts $fd "# Determines the border width in the geometry window"
puts $fd "set mged_default(bd) $mged_default(bd)"
puts $fd ""
puts $fd "# Tk screen name used for the GUI's windows"
puts $fd "# X display string used to determine the screen"
puts $fd "# on which to display the GUI's windows"
puts $fd "set mged_default(display) $mged_default(display)"
puts $fd ""
puts $fd "# Configures the GUI. Note - this is only"
+7 -6
View File
@@ -108,12 +108,13 @@ if {![info exists mged_default(config)]} {
set mged_default(config) b
}
# DISPLAY is an X11 connection setting, not a portable Tk screen name. Tk is
# initialized before this script runs, so its canonical screen is authoritative
# on X11, Win32, and Aqua alike. Preserve a value supplied explicitly through
# .mgedrc or the gui command for multi-display X11 use.
if {![info exists mged_default(display)]} {
set mged_default(display) [winfo screen .]
if {[info exists env(DISPLAY)]} {
set mged_default(display) $env(DISPLAY)
} else {
if {![info exists mged_default(display)]} {
set mged_default(display) :0
}
set env(DISPLAY) $mged_default(display)
}
if {![info exists mged_default(gdisplay)]} {