Compare commits

..
1 Commits
Author SHA1 Message Date
Clifford Yapp 0d8b619114 See if we can use Config.cmake approach to find_package for zlib and png.
Depends on the bext zlib CMake logic being patched to provide the
necessary files.  Once this proves out, we should be able to avoid
patching a lot of bext dependency builds to add custom FindZLIB.cmake
and FindPNG.cmake modules - instead we can just make sure
CMAKE_FIND_PACKAGE_PREFER_CONFIG is set to ON.
2026-07-09 18:39:44 +00:00
2424 changed files with 206730 additions and 598080 deletions
-260
View File
@@ -1,260 +0,0 @@
name: Prepare bext dependencies
description: Restore a compatible bext production artifact or build the pinned revision.
inputs:
platform-channel:
description: Published bext platform channel.
required: true
source-dir:
description: Absolute path to the BRL-CAD source tree.
required: true
output-dir:
description: Absolute path where the bext dependency tree will be prepared.
required: true
build-type:
description: BRL-CAD build configuration that will consume the dependency tree.
required: false
default: Release
artifact-token:
description: Token with Actions read access to BRL-CAD/bext.
required: false
outputs:
bext-sha:
description: The bext revision in the prepared dependency tree.
value: ${{ steps.result.outputs.bext-sha }}
source:
description: Whether preparation used a production artifact, cache, or local build.
value: ${{ steps.result.outputs.source }}
runs:
using: composite
steps:
- name: Resolve bext production artifact
id: resolve
shell: bash
env:
BEXT_BUILD_TYPE: ${{ inputs.build-type }}
BEXT_CHANNEL: ${{ inputs.platform-channel }}
BRLCAD_SOURCE_DIR: ${{ inputs.source-dir }}
GH_TOKEN: ${{ inputs.artifact-token }}
run: |
set -uo pipefail
source_dir="$BRLCAD_SOURCE_DIR"
if command -v cygpath >/dev/null 2>&1; then
source_dir="$(cygpath -u "$source_dir")"
fi
required_sha="$(awk -F'[()]' '/^[[:space:]]*brlcad_bext_init\([0-9a-fA-F]{40}\)/ { print tolower($2) }' "$source_dir/CMakeLists.txt")"
if [[ ! "$required_sha" =~ ^[0-9a-f]{40}$ ]]; then
echo "Expected exactly one brlcad_bext_init(<sha>) call in $source_dir/CMakeLists.txt" >&2
exit 1
fi
repository='BRL-CAD/bext'
marker_name="bext-production-$required_sha"
marker_info="$(gh api "repos/$repository/actions/artifacts?name=$marker_name&per_page=100" \
--jq '[.artifacts[] | select(.expired == false and .name == "'"$marker_name"'")] | sort_by(.created_at) | last | select(. != null) | [.name, .workflow_run.id] | @tsv' 2>/dev/null)" || marker_info=''
selected_sha=''
run_id=''
if [[ -n "$marker_info" ]]; then
selected_sha="$required_sha"
IFS=$'\t' read -r _ run_id <<< "$marker_info"
echo "Found complete bext production artifacts for pinned revision $required_sha."
else
marker_info="$(gh api "repos/$repository/actions/artifacts?per_page=100" \
--jq '[.artifacts[] | select(.expired == false and (.name | test("^bext-production-[0-9a-f]{40}$")))] | sort_by(.created_at) | last | select(. != null) | [.name, .workflow_run.id] | @tsv' 2>/dev/null)" || marker_info=''
if [[ -n "$marker_info" ]]; then
IFS=$'\t' read -r latest_marker run_id <<< "$marker_info"
selected_sha="${latest_marker#bext-production-}"
comparison="$(gh api "repos/$repository/compare/$required_sha...$selected_sha" --jq '.status' 2>/dev/null)" || comparison=''
if [[ "$comparison" == 'ahead' || "$comparison" == 'identical' ]]; then
echo "::warning::Using newer successful bext revision $selected_sha instead of BRL-CAD's pinned revision $required_sha."
else
selected_sha=''
run_id=''
fi
fi
fi
artifact_ready=false
artifact_name=''
if [[ "$RUNNER_OS" == 'Windows' && "$BEXT_BUILD_TYPE" == 'Debug' ]]; then
echo 'Windows Debug requires a Debug bext build; skipping Release production artifacts.'
selected_sha=''
run_id=''
elif [[ -n "$selected_sha" ]]; then
artifact_name="bext-$BEXT_CHANNEL-$selected_sha"
artifact_count="$(gh api "repos/$repository/actions/runs/$run_id/artifacts?name=$artifact_name&per_page=100" \
--jq '[.artifacts[] | select(.expired == false and .name == "'"$artifact_name"'")] | length' 2>/dev/null)" || artifact_count=0
if [[ "$artifact_count" == '1' ]]; then
artifact_ready=true
else
selected_sha=''
run_id=''
artifact_name=''
fi
fi
cache_schema=1
image_version="${ImageVersion:-unknown}"
runner_arch="${RUNNER_ARCH:-unknown}"
fallback_cache_key="bext-$cache_schema-$BEXT_CHANNEL-$BEXT_BUILD_TYPE-$required_sha-$image_version-$runner_arch"
production_cache_key="bext-$cache_schema-$BEXT_CHANNEL-Release-$selected_sha"
if [[ "$artifact_ready" != 'true' ]]; then
echo "No compatible production artifact is available; using the cache/build fallback for $required_sha."
fi
echo "required-sha=$required_sha" >> "$GITHUB_OUTPUT"
echo "selected-sha=$selected_sha" >> "$GITHUB_OUTPUT"
echo "run-id=$run_id" >> "$GITHUB_OUTPUT"
echo "artifact-name=$artifact_name" >> "$GITHUB_OUTPUT"
echo "artifact-ready=$artifact_ready" >> "$GITHUB_OUTPUT"
echo "production-cache-key=$production_cache_key" >> "$GITHUB_OUTPUT"
echo "fallback-cache-key=$fallback_cache_key" >> "$GITHUB_OUTPUT"
- name: Restore production artifact cache
if: steps.resolve.outputs.artifact-ready == 'true'
id: production-cache
uses: actions/cache/restore@v6
with:
path: ${{ inputs.output-dir }}
key: ${{ steps.resolve.outputs.production-cache-key }}
- name: Download bext production artifact
if: steps.resolve.outputs.artifact-ready == 'true' && steps.production-cache.outputs.cache-hit != 'true'
id: download
shell: bash
env:
ARTIFACT_NAME: ${{ steps.resolve.outputs.artifact-name }}
BEXT_CHANNEL: ${{ inputs.platform-channel }}
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
BEXT_RUN_ID: ${{ steps.resolve.outputs.run-id }}
GH_TOKEN: ${{ inputs.artifact-token }}
run: |
set -uo pipefail
output_dir="$BEXT_OUTPUT_DIR"
if command -v cygpath >/dev/null 2>&1; then
output_dir="$(cygpath -u "$output_dir")"
fi
download_dir="$RUNNER_TEMP/bext-download-$BEXT_RUN_ID-$BEXT_CHANNEL"
cmake -E rm -rf "$download_dir" "$output_dir"
cmake -E make_directory "$download_dir" "$output_dir"
ready=false
if gh run download "$BEXT_RUN_ID" --repo BRL-CAD/bext --name "$ARTIFACT_NAME" --dir "$download_dir"; then
archive="$download_dir/bext-$BEXT_CHANNEL.tar.gz"
if (cd "$output_dir" && cmake -E tar xzf "$archive") && \
[[ -d "$output_dir/install" && -d "$output_dir/noinstall" && -f "$output_dir/bext-install-manifest.json" ]]; then
ready=true
fi
fi
cmake -E rm -rf "$download_dir"
if [[ "$ready" != 'true' ]]; then
cmake -E rm -rf "$output_dir"
echo '::warning::Unable to download or validate the bext production artifact; using the pinned cache/build fallback.'
fi
echo "ready=$ready" >> "$GITHUB_OUTPUT"
- name: Restore fallback bext cache
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true'
id: fallback-cache
uses: actions/cache/restore@v6
with:
path: ${{ inputs.output-dir }}
key: ${{ steps.resolve.outputs.fallback-cache-key }}
- name: Build pinned bext revision
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true' && steps.fallback-cache.outputs.cache-hit != 'true'
shell: bash
env:
BEXT_BUILD_TYPE: ${{ inputs.build-type }}
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
BEXT_SHA: ${{ steps.resolve.outputs.required-sha }}
run: |
set -euo pipefail
output_dir="$BEXT_OUTPUT_DIR"
if command -v cygpath >/dev/null 2>&1; then
output_dir="$(cygpath -u "$output_dir")"
fi
source_dir="$RUNNER_TEMP/bext-src"
build_dir="$RUNNER_TEMP/bext-build"
cleanup() {
cmake -E rm -rf "$source_dir" "$build_dir"
}
trap cleanup EXIT
cleanup
cmake -E rm -rf "$output_dir"
git clone --filter=blob:none https://github.com/BRL-CAD/bext.git "$source_dir"
git -C "$source_dir" -c advice.detachedHead=false checkout "$BEXT_SHA"
configure_args=(-S "$source_dir" -B "$build_dir" -G Ninja -DENABLE_ALL=ON -DGIT_SHALLOW_CLONE=ON "-DCMAKE_BUILD_TYPE=$BEXT_BUILD_TYPE" "-DCMAKE_INSTALL_PREFIX=$output_dir")
if [[ "$RUNNER_OS" == 'Windows' ]]; then
configure_args+=(-DCMAKE_C_COMPILER=cl.exe -DCMAKE_CXX_COMPILER=cl.exe)
elif [[ "$RUNNER_OS" == 'macOS' ]]; then
export CC=clang
export CXX=clang++
fi
cmake "${configure_args[@]}"
cmake --build "$build_dir" --config "$BEXT_BUILD_TYPE" --parallel 2
- name: Validate bext dependency tree
shell: bash
env:
BEXT_OUTPUT_DIR: ${{ inputs.output-dir }}
run: |
set -euo pipefail
output_dir="$BEXT_OUTPUT_DIR"
if command -v cygpath >/dev/null 2>&1; then
output_dir="$(cygpath -u "$output_dir")"
fi
[[ -d "$output_dir/install" && -d "$output_dir/noinstall" && -f "$output_dir/bext-install-manifest.json" ]]
tool="$output_dir/noinstall/bin/strclear"
if [[ "$RUNNER_OS" == 'Windows' ]]; then
[[ -f "$tool.exe" ]]
else
[[ -x "$tool" ]]
fi
- name: Save production artifact cache
if: steps.download.outputs.ready == 'true'
uses: actions/cache/save@v6
with:
path: ${{ inputs.output-dir }}
key: ${{ steps.resolve.outputs.production-cache-key }}
- name: Save fallback bext cache
if: steps.production-cache.outputs.cache-hit != 'true' && steps.download.outputs.ready != 'true' && steps.fallback-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v6
with:
path: ${{ inputs.output-dir }}
key: ${{ steps.resolve.outputs.fallback-cache-key }}
- name: Report bext source
id: result
shell: bash
env:
ARTIFACT_READY: ${{ steps.resolve.outputs.artifact-ready }}
ARTIFACT_SHA: ${{ steps.resolve.outputs.selected-sha }}
DOWNLOAD_READY: ${{ steps.download.outputs.ready }}
FALLBACK_CACHE_HIT: ${{ steps.fallback-cache.outputs.cache-hit }}
PRODUCTION_CACHE_HIT: ${{ steps.production-cache.outputs.cache-hit }}
REQUIRED_SHA: ${{ steps.resolve.outputs.required-sha }}
run: |
if [[ "$PRODUCTION_CACHE_HIT" == 'true' ]]; then
source=production-cache
elif [[ "$DOWNLOAD_READY" == 'true' ]]; then
source=production-artifact
elif [[ "$FALLBACK_CACHE_HIT" == 'true' ]]; then
source=fallback-cache
else
source=local-build
fi
if [[ "$ARTIFACT_READY" == 'true' && ( "$PRODUCTION_CACHE_HIT" == 'true' || "$DOWNLOAD_READY" == 'true' ) ]]; then
sha="$ARTIFACT_SHA"
else
sha="$REQUIRED_SHA"
fi
echo "source=$source" >> "$GITHUB_OUTPUT"
echo "bext-sha=$sha" >> "$GITHUB_OUTPUT"
echo "Prepared bext $sha from $source."
+389 -258
View File
@@ -1,8 +1,9 @@
# BRL-CAD's primary distcheck target runs too long and does too much work to
# be suitable as a CI target, even occasionally. To achieve essentially the
# same result, we define individual jobs for each distcheck sub-target and
# distribute them across five serial queues. To avoid the target list going
# stale, this header is followed by jobs generated from the CMake logic.
# run them in singletons. To avoid the list of targets going stale, we
# define this header and then autogenerate the actual build target jobs
# to append to it from the CMake logic.
name: Distcheck
@@ -13,14 +14,21 @@ on:
jobs:
bext:
name: Prepare bext
runs-on: ubuntu-24.04
name: Prepare bext (cached)
runs-on: ubuntu-latest
env:
DEBIAN_FRONTEND: noninteractive
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -37,30 +45,54 @@ jobs:
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$(gcc --version | head -n 1)"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output
cmake --build bext_build --config Release -j 2
cmake -E rm -rf bext
cmake -E rm -rf bext_build
distcheck-default_build_type:
name: distcheck-default_build_type
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
needs: [bext]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -68,38 +100,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-default_build_type
- name: Configure
run: cmake -S brlcad -B build_distcheck-default_build_type -G Ninja -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-default_build_type -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-default_build_type --target distcheck-default_build_type
run: cmake --build build_distcheck-default_build_type --config Release --target distcheck-default_build_type
- name: Log
if: always()
run: cat build_distcheck-default_build_type/distcheck-default_build_type.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-debug:
name: distcheck-debug
runs-on: ubuntu-24.04
needs: [bext]
runs-on: ubuntu-latest
needs: [distcheck-default_build_type]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -107,38 +153,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-debug
- name: Configure
run: cmake -S brlcad -B build_distcheck-debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-debug -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-debug --config Debug --target distcheck-debug
run: cmake --build build_distcheck-debug --config Release --target distcheck-debug
- name: Log
if: always()
run: cat build_distcheck-debug/distcheck-debug.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-release:
name: distcheck-release
runs-on: ubuntu-24.04
needs: [bext]
runs-on: ubuntu-latest
needs: [distcheck-debug]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -146,116 +206,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-release
- name: Configure
run: cmake -S brlcad -B build_distcheck-release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-release --config Release --target distcheck-release
- name: Log
if: always()
run: cat build_distcheck-release/distcheck-release.log
distcheck-no_unity_debug:
name: distcheck-no_unity_debug
runs-on: ubuntu-24.04
needs: [bext]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Install apt dependencies
run: |
sudo apt-get update
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_unity_debug
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_unity_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_UNITY_BUILD=OFF
- name: Build
run: cmake --build build_distcheck-no_unity_debug --config Debug --target distcheck-no_unity_debug
- name: Log
if: always()
run: cat build_distcheck-no_unity_debug/distcheck-no_unity_debug.log
distcheck-no_unity_release:
name: distcheck-no_unity_release
runs-on: ubuntu-24.04
needs: [bext]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Install apt dependencies
run: |
sudo apt-get update
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_unity_release
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_unity_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_UNITY_BUILD=OFF
- name: Build
run: cmake --build build_distcheck-no_unity_release --config Release --target distcheck-no_unity_release
- name: Log
if: always()
run: cat build_distcheck-no_unity_release/distcheck-no_unity_release.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-enableall_debug:
name: distcheck-enableall_debug
runs-on: ubuntu-24.04
needs: [distcheck-default_build_type]
runs-on: ubuntu-latest
needs: [distcheck-release]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -263,38 +259,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-enableall_debug
- name: Configure
run: cmake -S brlcad -B build_distcheck-enableall_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DENABLE_ALL=ON -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-enableall_debug -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-enableall_debug --config Debug --target distcheck-enableall_debug
run: cmake --build build_distcheck-enableall_debug --config Release --target distcheck-enableall_debug
- name: Log
if: always()
run: cat build_distcheck-enableall_debug/distcheck-enableall_debug.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-enableall_release:
name: distcheck-enableall_release
runs-on: ubuntu-24.04
needs: [distcheck-debug]
runs-on: ubuntu-latest
needs: [distcheck-enableall_debug]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -302,38 +312,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-enableall_release
- name: Configure
run: cmake -S brlcad -B build_distcheck-enableall_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-enableall_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-enableall_release --config Release --target distcheck-enableall_release
- name: Log
if: always()
run: cat build_distcheck-enableall_release/distcheck-enableall_release.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-prepared_debug:
name: distcheck-prepared_debug
runs-on: ubuntu-24.04
needs: [distcheck-release]
runs-on: ubuntu-latest
needs: [distcheck-enableall_release]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -341,38 +365,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-prepared_debug
- name: Configure
run: cmake -S brlcad -B build_distcheck-prepared_debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-prepared_debug -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-prepared_debug --config Debug --target distcheck-prepared_debug
run: cmake --build build_distcheck-prepared_debug --config Release --target distcheck-prepared_debug
- name: Log
if: always()
run: cat build_distcheck-prepared_debug/distcheck-prepared_debug.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-prepared_release:
name: distcheck-prepared_release
runs-on: ubuntu-24.04
needs: [distcheck-no_unity_debug]
runs-on: ubuntu-latest
needs: [distcheck-prepared_debug]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -380,38 +418,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-prepared_release
- name: Configure
run: cmake -S brlcad -B build_distcheck-prepared_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-prepared_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-prepared_release --config Release --target distcheck-prepared_release
- name: Log
if: always()
run: cat build_distcheck-prepared_release/distcheck-prepared_release.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-no_tcl:
name: distcheck-no_tcl
runs-on: ubuntu-24.04
needs: [distcheck-no_unity_release]
runs-on: ubuntu-latest
needs: [distcheck-prepared_release]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -419,38 +471,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_tcl
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_tcl -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_TCL=OFF
run: cmake -S brlcad -B build_distcheck-no_tcl -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-no_tcl --config Debug --target distcheck-no_tcl
run: cmake --build build_distcheck-no_tcl --config Release --target distcheck-no_tcl
- name: Log
if: always()
run: cat build_distcheck-no_tcl/distcheck-no_tcl.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-no_tk:
name: distcheck-no_tk
runs-on: ubuntu-24.04
needs: [distcheck-enableall_debug]
runs-on: ubuntu-latest
needs: [distcheck-no_tcl]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -458,38 +524,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_tk
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_tk -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_TK=OFF
run: cmake -S brlcad -B build_distcheck-no_tk -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-no_tk --config Debug --target distcheck-no_tk
run: cmake --build build_distcheck-no_tk --config Release --target distcheck-no_tk
- name: Log
if: always()
run: cat build_distcheck-no_tk/distcheck-no_tk.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-no_strict:
name: distcheck-no_strict
runs-on: ubuntu-24.04
needs: [distcheck-enableall_release]
runs-on: ubuntu-latest
needs: [distcheck-no_tk]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -497,38 +577,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_strict
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_strict -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_STRICT=OFF
run: cmake -S brlcad -B build_distcheck-no_strict -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-no_strict --config Debug --target distcheck-no_strict
run: cmake --build build_distcheck-no_strict --config Release --target distcheck-no_strict
- name: Log
if: always()
run: cat build_distcheck-no_strict/distcheck-no_strict.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-no_object:
name: distcheck-no_object
runs-on: ubuntu-24.04
needs: [distcheck-prepared_debug]
runs-on: ubuntu-latest
needs: [distcheck-no_strict]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -536,38 +630,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-no_object
- name: Configure
run: cmake -S brlcad -B build_distcheck-no_object -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DUSE_OBJECT_LIBS=OFF
run: cmake -S brlcad -B build_distcheck-no_object -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-no_object --config Debug --target distcheck-no_object
run: cmake --build build_distcheck-no_object --config Release --target distcheck-no_object
- name: Log
if: always()
run: cat build_distcheck-no_object/distcheck-no_object.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-odd_pathnames:
name: distcheck-odd_pathnames
runs-on: ubuntu-24.04
needs: [distcheck-prepared_release]
runs-on: ubuntu-latest
needs: [distcheck-no_object]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -575,38 +683,52 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-odd_pathnames
- name: Configure
run: cmake -S brlcad -B build_distcheck-odd_pathnames -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-odd_pathnames -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-odd_pathnames --config Debug --target distcheck-odd_pathnames
run: cmake --build build_distcheck-odd_pathnames --config Release --target distcheck-odd_pathnames
- name: Log
if: always()
run: cat build_distcheck-odd_pathnames/distcheck-odd_pathnames.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
distcheck-in_src_dir:
name: distcheck-in_src_dir
runs-on: ubuntu-24.04
needs: [distcheck-no_tcl]
runs-on: ubuntu-latest
needs: [distcheck-odd_pathnames]
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Install apt dependencies
run: |
sudo apt-get update
@@ -614,24 +736,33 @@ jobs:
sudo apt-get install astyle re2c
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev libgl-dev libinput-dev
- name: Setup - bext
run: |
git clone https://github.com/BRL-CAD/bext.git
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
cd ..
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.bext-sha.outputs.sha }}
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: cmake -E make_directory build_distcheck-in_src_dir
- name: Configure
run: cmake -S brlcad -B build_distcheck-in_src_dir -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
run: cmake -S brlcad -B build_distcheck-in_src_dir -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
- name: Build
run: cmake --build build_distcheck-in_src_dir --config Debug --target distcheck-in_src_dir
run: cmake --build build_distcheck-in_src_dir --config Release --target distcheck-in_src_dir
- name: Log
if: always()
run: cat build_distcheck-in_src_dir/distcheck-in_src_dir.log
- name: Debug if failure
if: failure()
uses: mxschmitt/action-tmate@v3
+2 -2
View File
@@ -69,12 +69,12 @@ jobs:
- name: Configure
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
export PATH=$ENV{GITHUB_WORKSPACE}:$PATH
cmake -S . -G Ninja -B build_linux -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_COMPONENTS=libged -DBRLCAD_EXTRADOCS=OFF
- name: Build
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
export PATH=$ENV{GITHUB_WORKSPACE}:$PATH
cmake --build build_linux --config Release --target check
- name: Debugging - tmate session
+233 -163
View File
@@ -23,7 +23,7 @@ jobs:
linux:
name: Ubuntu GCC
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
strategy:
fail-fast: true
env:
@@ -33,6 +33,14 @@ jobs:
- name: Setup - CMake
uses: lukka/get-cmake@latest
# Cache apt package downloads (not installed pkgs)
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/push.yml') }}
# Install system dependencies
- name: Install apt dependencies
run: |
@@ -50,20 +58,44 @@ jobs:
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev
# Prepare bext cache key
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$(gcc --version | head -n 1)"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output
cmake --build bext_build --config Release -j 2
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: |
cmake -E make_directory ./build_linux
@@ -73,7 +105,7 @@ jobs:
- name: Configure
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
cmake -S brlcad -B build_linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
cmake -S brlcad -B build_linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output -DBRLCAD_ENABLE_QT=ON
- name: Build
id: build_parallel
@@ -94,7 +126,7 @@ jobs:
# repository integrity check and make sure we can build source archives.
archives:
name: Source Archives
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
needs: [linux]
strategy:
fail-fast: true
@@ -105,6 +137,13 @@ jobs:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/push.yml') }}
# Install system dependencies - we do the full setup here, even though
# source archives isn't intended to build the main BRL-CAD, in case
# this check is the one where the bext dependency cache check gets a miss.
@@ -126,83 +165,52 @@ jobs:
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$(gcc --version | head -n 1)"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output
cmake --build bext_build --config Release -j2
rm -rf bext
rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Build
run: |
cmake -E make_directory build_archives
cmake -S brlcad -B build_archives -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output
cmake -S brlcad -B build_archives -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output
cmake --build build_archives --config Release --target distcheck-source_archives
# A full bext build every time we push is too much, but we can exercise the
# basic bext mechanisms and also the BRLCAD_COMPONENTS subbuild at the same
# time if we do a local bext build of *just* the libbg subset of BRL-CAD. If
# the COMPONENTS mechanism works as it should it won't trigger a full bext
# build, and we'll only be compiling what libbg needs.
componentbext:
name: BRLCAD_COMPONENTS
runs-on: ubuntu-latest
strategy:
fail-fast: true
env:
DEBIAN_FRONTEND: noninteractive
if: github.event_name == 'push'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
# Install system dependencies - we do the full setup here, even though
# source archives isn't intended to build the main BRL-CAD, in case
# this check is the one where the bext dependency cache check gets a miss.
# In that case, this check will have to build bext to proceed - and it will
# need the bext environment set up to do so.
- name: Install apt dependencies
run: |
sudo apt-get update
# Install X/OpenGL dev pkgs
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
# Install tools
sudo apt-get install astyle re2c xsltproc libxml2-utils
# Install dependency dev pkgs
sudo apt-get install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libeigen3-dev libgdal-dev libassimp-dev libopencv-dev tcl-dev tk-dev
# Install XCB/OpenGL dev pkgs for Qt - see:
# https://wiki.qt.io/Building_Qt_6_from_Git
# https://doc.qt.io/qt-6/linux-requirements.html
sudo apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Directory setup
run: |
cmake -E make_directory build_components
cmake -E make_directory $HOME/.cache
cmake -E make_directory $HOME/.cache/BRL-CAD
- name: Build
run: |
cmake -S brlcad -B build_components -DCMAKE_BUILD_TYPE=Release -DBRLCAD_COMPONENTS=libbg
cmake --build build_components --config Release
windows:
name: MSVC - Ninja
runs-on: windows-2025
runs-on: windows-latest
strategy:
fail-fast: true
if: github.event_name == 'push'
@@ -211,7 +219,7 @@ jobs:
uses: lukka/get-cmake@latest
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v3
uses: microsoft/setup-msbuild@v2
- name: Add cl.exe to PATH
uses: ilammy/msvc-dev-cmd@v1
@@ -220,27 +228,66 @@ jobs:
shell: pwsh
run: Add-Content -Path $env:GITHUB_PATH -Value $env:GITHUB_WORKSPACE
- name: Clone bext
# Note - this will not check out any of the submodules unless we need
# them for building, so it should be a very small disk space hit.
# Consequently, we don't worry about deleting it unless we end up
# having to build it. The bext source directory is not one of the
# cached directories, so a straight git clone is fine - no need to
# worry about colliding with a previous clone.
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
shell: powershell
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $env:GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
clver=""
if command -v cl.exe &> /dev/null; then
clver="$(cl.exe 2>&1 | head -n 1)"
fi
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$clver"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}\bext_output
key: windows-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
shell: powershell
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\bext_output
cmake --build bext_build --config Release -j2
# If we have had to build, the submodules are populated and the build
# directory will have a lot in it. We only need the build ouputs
# (bext_output) after this point, so clean up to save space for the
# main BRL-CAD build.
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: windows-2025-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Build Directory setup
run: cmake -E make_directory ./build_winninja
- name: Configure
shell: powershell
run: |
cmake -S brlcad -B build_winninja -G Ninja -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -DBRLCAD_EXT_DIR=${{ runner.temp }}\bext_output -DCMAKE_BUILD_TYPE=Release -DBRLCAD_ENABLE_QT=ON
cmake -S brlcad -B build_winninja -G Ninja -DCMAKE_C_COMPILER="cl.exe" -DCMAKE_CXX_COMPILER="cl.exe" -DBRLCAD_EXT_DIR=${{ github.workspace }}\bext_output -DCMAKE_BUILD_TYPE=Release -DBRLCAD_ENABLE_QT=ON
- name: Build
id: build_parallel
@@ -272,7 +319,7 @@ jobs:
windows_std_tools:
name: MSVC - Standard Tools
needs: [windows]
runs-on: windows-2025
runs-on: windows-latest
strategy:
fail-fast: true
if: github.event_name == 'push'
@@ -280,88 +327,81 @@ jobs:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v3
- name: Clone bext
# Note - this will not check out any of the submodules unless we need
# them for building, so it should be a very small disk space hit.
# Consequently, we don't worry about deleting it unless we end up
# having to build it. The bext source directory is not one of the
# cached directories, so a straight git clone is fine - no need to
# worry about colliding with a previous clone.
#
# In theory we could rely on the windows Ninja test for this, since we
# depend on it, but we define each test to be potentially stand-alone
# in case we end up removing the other windows test(s) for any reason.
run: git clone https://github.com/BRL-CAD/bext.git
- name: Add cl.exe to PATH
uses: ilammy/msvc-dev-cmd@v1
- name: Get bext commit SHA
id: bext-sha
shell: pwsh
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $env:GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
clver=""
if command -v cl.exe &> /dev/null; then
clver="$(cl.exe 2>&1 | head -n 1)"
fi
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$clver"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}\bext_output
key: windows-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
# Note - most of windows_std_tools builds using cmd and avoids ninja,
# but for the bext build if we need to do it) we want to match the
# behavior of the ninja build so we have consistent inputs.
if: steps.cache-bext.outputs.cache-hit != 'true'
shell: powershell
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\bext_output
cmake --build bext_build --config Release -j2
# If we have had to build, the submodules are populated and the build
# directory will have a lot in it. We only need the build ouputs
# (bext_output) after this point, so clean up to save space for the
# main BRL-CAD build.
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: windows-2025-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Build Directory setup
run: |
cmake -E make_directory ./build_winstd
- name: MSVC and Ninja diagnostics
shell: cmd
run: |
where cmake
where ninja
where cl.exe
where msbuild
cmake --version
cl.exe
set INCLUDE
set LIB
set LIBPATH
- name: Configure
shell: cmd
run: |
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=%RUNNER_TEMP%\bext_output -DBRLCAD_ENABLE_QT=ON -DBRLCAD_CONFIG_PROBE_DIAGNOSTICS=ON -DBRLCAD_PROBE_SNAPSHOT_FILE=%GITHUB_WORKSPACE%\build_winstd\parallel-probes.txt
- name: Configure probe diagnostics
if: always()
shell: pwsh
run: |
$build = Join-Path $env:GITHUB_WORKSPACE 'build_winstd'
$diagnosticDir = Join-Path $build 'CMakeTmp/probe_diagnostics'
if (Test-Path $diagnosticDir) {
Get-ChildItem -Path $diagnosticDir -File | Sort-Object Name | ForEach-Object {
Write-Host "`n===== $($_.FullName) ====="
Get-Content -Path $_.FullName
}
} else {
Write-Host "No parallel-probe diagnostic directory was created."
}
$cmakeError = Join-Path $build 'CMakeFiles/CMakeError.log'
if (Test-Path $cmakeError) {
Write-Host "`n===== $cmakeError ====="
Get-Content -Path $cmakeError
}
$cache = Join-Path $build 'CMakeCache.txt'
if (Test-Path $cache) {
Write-Host "`n===== selected cache entries ====="
Select-String -Path $cache -Pattern '^(HAVE_CONIO_H|BRLCAD_PROBE_USE_NINJA|BRLCAD_PROBE_NINJA_EXE|BRLCAD_PROBE_VCVARS|BRLCAD_PROBE_VCVARS_ARCH):' | ForEach-Object { $_.Line }
}
- name: Rebuild conio probe verbosely
if: always()
shell: cmd
continue-on-error: true
run: |
if not exist build_winstd\CMakeTmp\INCLUDE_PROBE_build (
echo INCLUDE_PROBE mini-project was not configured.
exit /b 0
)
cmake --build build_winstd\CMakeTmp\INCLUDE_PROBE_build --config Release --target HAVE_CONIO_H --verbose
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=%GITHUB_WORKSPACE%\bext_output -DBRLCAD_ENABLE_QT=ON
- name: Build
id: build_parallel
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release -j2
continue-on-error: true
@@ -369,16 +409,18 @@ jobs:
if: steps.build_parallel.outcome == 'failure'
shell: cmd
run: |
cmake --build build_winstd --config Release --target mged
cmake --build build_winstd --config Release mged
- name: Check
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release --target check -j2
- name: Package
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release --target package -j2
osx:
@@ -395,20 +437,48 @@ jobs:
run: |
brew install xquartz --cask
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
xcodever="$(xcodebuild -version | head -n 1 | awk '{print $2}')"
clangver="$(clang --version | head -n 1)"
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$xcodever-$clangver"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: macos-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
export CC=clang
export CXX=clang++
# Right now on OSX we need ENABLE_ALL, because Mac system Tcl/Tk won't work
cmake -S bext -B bext_build -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output -DCMAKE_BUILD_TYPE=Release
cmake --build bext_build -j 2
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: macos-14-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Build Directory setup
run: |
cmake -E make_directory build_osx
@@ -420,7 +490,7 @@ jobs:
export PATH=$GITHUB_WORKSPACE:$PATH
export CC=clang
export CXX=clang++
cmake -S brlcad -B build_osx -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
cmake -S brlcad -B build_osx -DCMAKE_BUILD_TYPE=Release -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output -DBRLCAD_ENABLE_QT=ON
- name: Build
id: build_parallel
+105 -66
View File
@@ -25,10 +25,19 @@ jobs:
fail-fast: true
env:
DEBIAN_FRONTEND: noninteractive
if: github.event_name == 'schedule'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
# Cache apt package downloads (not installed pkgs)
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
# Install system dependencies
- name: Install apt dependencies
run: |
@@ -74,13 +83,13 @@ jobs:
runs-on: windows-latest
strategy:
fail-fast: true
if: ${{ !cancelled() }}
if: github.event_name == 'schedule'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v3
uses: microsoft/setup-msbuild@v2
- name: Add cl.exe to PATH
uses: ilammy/msvc-dev-cmd@v1
@@ -126,17 +135,11 @@ jobs:
runs-on: windows-latest
strategy:
fail-fast: true
if: ${{ !cancelled() }}
if: github.event_name == 'schedule'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v3
- name: Add cl.exe to PATH
uses: ilammy/msvc-dev-cmd@v1
- name: Add github workspace to path
shell: cmd
run: echo %GITHUB_WORKSPACE%>>"%GITHUB_PATH%"
@@ -153,25 +156,25 @@ jobs:
- name: Configure
shell: cmd
run: |
where cmake
where ninja
where cl.exe
where msbuild
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DCMAKE_BUILD_TYPE=Release -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake -S brlcad -B build_winstd -DBRLCAD_EXT_PARALLEL=1 -DBRLCAD_BUNDLED_LIBS=Bundled -DBRLCAD_EXT_PARALLEL=1 -DCMAKE_BUILD_TYPE=Release -DBRLCAD_BEXT_CLEANUP=ON -DBRLCAD_ENABLE_QT=ON
- name: Build
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release --target mged
- name: Check
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release --target check
- name: Package
shell: cmd
run: |
call "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
cmake --build build_winstd --config Release --target package
osx_bext:
@@ -180,7 +183,7 @@ jobs:
runs-on: macos-14
strategy:
fail-fast: true
if: ${{ !cancelled() }}
if: github.event_name == 'schedule'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
@@ -225,16 +228,23 @@ jobs:
linux_static:
name: Clang Static Analyser
needs: [linux_bext]
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
strategy:
fail-fast: true
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.event_name == 'schedule' && github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
# Setup hint from https://github.com/darktable-org/rawspeed/blob/develop/.github/workflows/ci-static-analysis.yml
- name: Clang Static Analyzer Setup
run: |
@@ -253,20 +263,43 @@ jobs:
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev # Cleanup
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$(gcc --version | head -n 1)"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output
cmake --build bext_build --config Release -j 2
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: |
cmake -E make_directory build_clangstatic
@@ -275,8 +308,6 @@ jobs:
working-directory: ${{ github.workspace }}/brlcad
- name: Run Analyzer
env:
BRLCAD_EXT_DIR: ${{ runner.temp }}/bext_output
run: |
export PATH=$GITHUB_WORKSPACE:/usr/share/clang/scan-build-18/bin:/usr/share/clang/scan-build-18/libexec:$PATH
cp $GITHUB_WORKSPACE/brlcad/misc/clang-static-analyzer-run.sh .
@@ -295,21 +326,28 @@ jobs:
linux_cov:
name: LCOV Coverage testing
needs: [linux_bext]
runs-on: ubuntu-24.04
runs-on: ubuntu-latest
strategy:
fail-fast: true
env:
DEBIAN_FRONTEND: noninteractive
if: ${{ !cancelled() && github.ref == 'refs/heads/main' }}
if: github.event_name == 'schedule' && github.ref == 'refs/heads/main'
steps:
- name: Setup - CMake
uses: lukka/get-cmake@latest
- name: Cache apt packages
uses: actions/cache@v4
with:
path: |
/var/cache/apt/archives
key: ${{ runner.os }}-apt-${{ hashFiles('.github/workflows/check.yml') }}
- name: Setup - System
run: |
sudo apt-get update
# Get the lcov tool and its dependencies
sudo apt-get install lcov gdb
sudo apt-get install lcov
# Install X/OpenGL dev pkgs
sudo apt-get install xserver-xorg-dev libx11-dev libxi-dev libxext-dev libglu1-mesa-dev libfontconfig-dev
# Install tools
@@ -323,20 +361,43 @@ jobs:
sudo apt-get install libgl-dev
sudo apt-get install libinput-dev
- name: Clone bext
run: git clone https://github.com/BRL-CAD/bext.git
- name: Get bext commit SHA
id: bext-sha
run: |
cd bext
echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
- name: Compute bext cache discriminator
id: cachekey
shell: bash
run: |
info="${{ steps.bext-sha.outputs.sha }}-$(uname -s)-$(uname -r)-$(gcc --version | head -n 1)"
echo "hash=$(echo -n "$info" | sha1sum | awk '{print $1}')" >> $GITHUB_OUTPUT
- name: Cache bext build outputs
id: cache-bext
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/bext_output
key: ${{ runner.os }}-bext-${{ steps.cachekey.outputs.hash }}
- name: Build bext (if cache miss)
if: steps.cache-bext.outputs.cache-hit != 'true'
run: |
cmake -E make_directory bext_build
cmake -S bext -B bext_build -DCMAKE_BUILD_TYPE=Release -DENABLE_ALL=ON -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/bext_output
cmake --build bext_build --config Release -j 2
cmake -E rm -rf bext
cmake -E rm -rf bext_build
- name: Checkout
uses: actions/checkout@v6
with:
path: brlcad
- name: Prepare bext dependencies
uses: ./brlcad/.github/actions/prepare-bext
with:
platform-channel: ubuntu-24.04-${{ runner.arch }}-release
source-dir: ${{ github.workspace }}/brlcad
output-dir: ${{ runner.temp }}/bext_output
build-type: Release
artifact-token: ${{ secrets.BEXT_ARTIFACT_TOKEN }}
- name: Directory setup
run: |
cmake -E make_directory build_lcov
@@ -346,46 +407,24 @@ jobs:
- name: Configure
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
cmake -S brlcad -B build_lcov -DBRLCAD_ENABLE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ runner.temp }}/bext_output -DBRLCAD_ENABLE_QT=ON
cmake -S brlcad -B build_lcov -DBRLCAD_ENABLE_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug -DBRLCAD_EXT_DIR=${{ github.workspace }}/bext_output -DBRLCAD_ENABLE_QT=ON
- name: Build
id: build_parallel
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
cmake --build build_lcov -j2
continue-on-error: true
- name: Build (serial for diagnostics)
if: steps.build_parallel.outcome == 'failure'
run: |
export PATH=$GITHUB_WORKSPACE:$PATH
cmake --build build_lcov -j1
continue-on-error: true
- name: Run Tests
id: coverage_tests
- name: Run Coverage Test
run: |
find . -name '*.gcda' -exec rm {} \;
cmake --build . --target check
working-directory: ${{ github.workspace }}/build_lcov
- name: Diagnose failed annotation test
if: failure() && steps.coverage_tests.outcome == 'failure'
continue-on-error: true
run: |
set +e
ctest -R '^rt_datum_annot_semantics$' -VV
cat Testing/Temporary/LastTest.log
if command -v gdb >/dev/null 2>&1; then
gdb --quiet --batch \
-ex 'set pagination off' \
-ex run \
-ex 'thread apply all bt full' \
--args ./src/librt/tests/rt_datum_annot_semantics
fi
working-directory: ${{ github.workspace }}/build_lcov
- name: Capture Coverage
run: |
make check
lcov --capture --directory . --output-file coverage.info
lcov -r coverage.info \*\/bext_output\/\* > coverage-2.info
lcov -r coverage-2.info \/usr\/\* > coverage_cad.info
-1
View File
@@ -36,6 +36,5 @@ CMakeLists.txt.user
# Misc
.clang-format
*__pycache__*
-32
View File
@@ -1,32 +0,0 @@
# Code Quality Standards
Write code as a senior engineer would for long-term maintenance. These are non-negotiable defaults, not suggestions to apply when asked.
## Principles
- **DRY.** Extract duplicate logic. Refactor. Once and only once.
- **Minimize surprises.** Preserve existing style and conventions. Test when you can.
- **No magic values.** Use named constants, enums, or configuration. Every literal needs justification.
- **Minimize scope.** Prefer tightest scope that works - local variables, parameters, encapsulation. Broader scope needs justification.
- **No dead code.** Delete commented-out code, unused variables, unreachable branches. Version control remembers.
- **Comments explain why.** Document intent, constraints, and non-obvious decisions. Use "what" summaries only for complex or non-obvious algorithms. If routine code needs a comment to explain it, the code should be clearer.
- **Clean up what you touch.** Improve code you are changing: rename unclear variables, extract functions, simplify conditionals. Do not mix unrelated cleanup with logic changes - separate concerns, separate commits.
- **Handle errors deliberately.** Whether failing loudly or quietly, make it an intentional choice. No accidental swallowing.
- **YAGNI.** Do not add speculative abstractions, unused parameters, or unplanned extension points. Build what is needed now. Refactor when requirements actually change.
- **Perfection is when there is nothing left to take away.** Prefer reduction over addition, simpler is better. Too clever to debug easily is too clever.
## Before Finishing
Review your changes for code smells, duplicated logic, hardcoded values, overly broad scope, unclear names, missing error handling, unnecessary complexity, etc. Fix issues in the same pass - do not defer cleanup.
## Git
Never commit without permission (ask every time). Never push to remote. Never use `codex`, `chatgpt`, `openai`, `gemini`, `antigravity`, `copilot`, `claude`, `llm`, `ai`, or similar terms in branch names, tag names, commits, PRs, comments, and other metadata. Do not add generated-by notices or otherwise indicate authorship unless user explicitly requests. Do not include specific machine information - full file system paths, machine names, IP addresses, or other identifiable information in commit messages, code, comments or documentation.
## Repository Coding Conventions
The HACKING file in the root of the source tree defines coding conventions specific to BRL-CAD, including versions of common functions that are used in our code base instead of raw standard functions. Review this file before writing code so your changes and additions adhere to BRL-CAD standards.
BRL-CAD code should typically use our ZERO and EQUAL macros rather than raw floating-point equality comparisons to avoid Werror=float-equal compilation failures on expressions such as a == 0.0 (should be ZERO(a)) or b != c (should be !EQUAL(b, c)).
When completing a code change (not for intermediate iterations, but when preparing to hand back a finalized change) use our regress-repository and regress-licenses build targets to check that the result satisfies our internal checkers.
-18
View File
@@ -393,11 +393,6 @@ Sieu, Jeff
2017 December
Open Source (GCI)
Baker, Josh
nicknames joshbaker22
2023 August
U.S. Army Research Laboratory
CODE CONTRIBUTIONS
------------------
@@ -1090,15 +1085,6 @@ Reel, Samuel (Sammy)
2024 March
Texas A&M University
Rupesh
nicknames rupes, rupeshca007
2026 March
Open Source
nicknames laithaldaeef
2026 March
Open Source
SPECIAL THANKS
--------------
@@ -1421,10 +1407,6 @@ nicknames r-ricci
2022 January
Open Source
nicknames Meghna45-code
2026 July
Open Source
CORPORATE AND ORGANIZATION SUPPORT
----------------------------------
+179
View File
@@ -21,9 +21,25 @@ Recent Bugs
Something is concatenating EXEPATH and/or fbserv silently fails with
return codes (e.g., when not specifying -F, only giving the port.)
* rt -H hypersample, -J jitter, and -j# for sub-grid-mode assumes a
framebuffer, causing pix data to get written to the -o file (e.g.,
even with -o file.png). See view_pixel() near src/rt/view.c:472 for
problem area with -j but there are likely call sites.. Need to
scrub all fb_write() and ideally make this a non-issue via icv API.
* obj-g and gcv converters choke and crash on obj with unnamed g line.
spec wording on whether that's valid is unclear, but encountered in
wild.
* recursive bu_parallel() failure, tbd whether cpp11 or pthread impl,
likely because IDs are exceeding MAX_PSW, causing mayhem and chaos.
* Archer was observed to mangle the structure of a comb tree when assigning
a color from the dialog panel. MGED is able to assign the color fine,
so there appears to be something specific to Archer's comb tree handling
that is flawed. Not all combs are handled incorrectly. Issue appears to
be long standing - observed as far back as at least version 7.28.
* rtcheck_handler_cleanup() throws 'invalid handle specified' on Windows
in closing of STDOUT (see FIXME comment). Does not affect normal running,
but a debug build complains.
@@ -52,12 +68,20 @@ Recent Bugs
Backtrace indicates write buffer is full, likely because no output
is going to terminal. (Observed on Mac)
* gcv on a glTF file (at least a binary .glb) crashes hard with a NULL
pointer bomb (workaround: gltf-g succeeds albeit incomplete
conversion). Takes out the entire Terminal app on Mac for some
reason (consistently).
* Running"mged -c test.g" exits automatically on default prompt:
...
Create new database (y|n)[n]?
Warning: no database is currently open!
morrison@Miniagua .build %
* TGC tess fails when we have a near-zero c axis and a larger d
axis, or vice versa.
* MGED crashes trying to open the repository file
doc/docbook/resources/other/standard/xsl/images/important.tif
It is mis-identified as a v4 .g file due to the file header's
@@ -78,6 +102,16 @@ Recent Bugs
> e -S -m1 boxes.r
box1 is not drawn
* When run inside mged, invalid syntax reported on "gqa -p prefix"
despite it being documented as the correct form (and working outside
mged). specifying gqa -pprefix appears to be workaround, though
unintuitive. specifying gqa -p"" annoyingly outputs ""exp_air.plot3
with quotes embedded in the name.
* rtweight/gqa volumes seem wrong with simple sphere test case, with
values consistently and quickly converging less than the actual
volume regardless of the grid size.
* raytracing a revolved sketch seems to work fine, but rtarea and gqa
seem to be crashing on that same revolve. curiously, the brep
revolve from the csgbrep proc-db has the same failure as well as the
@@ -88,12 +122,20 @@ Recent Bugs
* running archer "" at least on windows results in a file type dialog
and errors with "can't read "_conv_log": no such variable
* opening a database in archer with the same name as a command doesn't
work.
* in mged, running the 'attach' command (confirmed issues with X and
ogl), closing the window, and then issuing a 'draw' results in mged
crashing.
* killtree / crashes
* killtree reports spurious db_lookup failures saying object does not
exist as it previously deleted it. should keep track of what it
deletes to not output spuriously, or (better) delete transactionally
so it only attempts to lookup and delete once per object.
* object names with a / or \ in them make ls or underlying directory
parsing logic display them incorrectly.
@@ -109,9 +151,18 @@ Recent Bugs
* fbclear -c appears to hang indefinitely inside pkg_bwaitfor,
possible protocol mismatch or capability removed/changed in fbserv.
* dbupgrade -r produces an invalid rhc with the default v5 rhc produced
by MGED with "make rhc rhc"
* apparently all four BRL-CAD Tutorial Series volumes are missing from
our bibliography...
* Tessellating an ETO with a normal tolerance results in stack
smashing due to bad logic in recursive algorithm: set norm 2;
facetize my.eto my.bot;. Observed infinite recursion in both
make_ellipse4() in eto.c and (after adding max recursion test) in
paint_face() in manif.c:190
* mater -d information stored in the .g file doesn't survive a
garbage collection operation.
@@ -127,10 +178,36 @@ Recent Bugs
still being displayed. this causes 'rt' to fly into an infinite
loop, presumably trying to increment rays from the eye position.
* icv dpix support is not cross-platform (it writes out native, reads
in assuming same encoding). regression tests fail on big endian.
* creating an object with a slashes in the name (e.g., cp foo foo/R)
results in an object that cannot be deleted/renamed. bad behavior
presumably extends to any name with path separators.
* mirror command rejects brep solids and turns faces inside-out when
mirroring a comb with brep solids below it.
* rtsil command works if do what usage says and redirect output to
file, but mentions .pix when data is actually .bw; and using the -o
option results in a black image. it is also inconsistent, writing a
black silhouette on a white background, instead of black on white
and missing background color options.
* make sph sph
clone -i 1 -t 1000 0 0 -n 100 sph
kill sph
g line sph*
clone -i 1 -t 0 1000 0 -n 100 line
kill line
g square line*
clone -i 1 -t 0 0 1000 -n 100 square
... never returns ...
This should be merely 1M spheres, but something chokes. Could be
somewhere in the Tk layer. Maybe somewhere in the db layer. Maybe
something is corrupted by clone when it
* If we draw any form, then trace it using rt, then change of database
(by clicking file>open and selecting another database), badness
ensues. One report has quitting the rt window causing a segfault.
@@ -144,12 +221,31 @@ Recent Bugs
in ann3.s annot 0 0 0 1 10 10 3 1
# using numbers for a label results in no label
* make eto eto
tol norm 1
facetize eto.bot eto
[crashes due to excessive recursion]
* crash in rt_bot_xform() due to a bot being marked as having face
normals, but didn't. bot probably written wrong via conversion
to/from obj or asc. found importing teapot.
* rtedge with perspective is wrong. it fills in nearly entire faces,
vertically in particular. it's worse on small sized renders, and
gets better the larger the render size (indicating there's some
neighbor distance coming into play that is not affected by
max_dist). eoes not happen in non-perspective ray-traces.
* a character is (still) sometimes captured by the cursor box. steps
to reproduce:
1) write a word on the mged command prompt ("e.g. hello")
2) select the word to end of line with mouse
3) paste the word (e.g., middle mouse) and press enter
4) type "hello" again and press enter
you should now see an "o" in the yellow cursor box. sometimes
you'll see the "o" after step 3. running "clear" resets the cursor.
* get_regions tcl command doesn't respond well to situations where
child object names in combs have dashes (the "-" character) in
names. It tries to interpret the dash as an argument delimiter.
@@ -171,6 +267,13 @@ Recent Bugs
* Recursive submodel predictably goes infinite, need stack-based
db_walk_tree(): mged> in submodel submodel submodel grid test.g
* running rt -s20 -F file.pix ... does not result in an 20x20 image
being written out. it ends up being 512x512.
* running rt -C255/0/0 -o file.pix ... does not result in the
background color getting used. It does work with -F file.pix, going
through libfb instead of libicv.
* ogl display manager and framebuffer are creating windows with
transparent backgrounds (the glClear color is not being drawn) on
Linux. Presumably a driver-related issue, alpha channel, or expose
@@ -179,6 +282,9 @@ Recent Bugs
private memory -- looks like private memory is not initialized
(observed on Mac 10.6, Windows, and Ubuntu Linux using 7.26).
* pixdiff on Windows is reporting no differences with a pair of files
that pixcmp can see differences in.
* fblabel seems quite busted, at least talking to a /dev/X fbserv, in
that it only draws the first character and eventually displays
rem_read() failures when run in -d debug mode.
@@ -187,6 +293,12 @@ Recent Bugs
after doing an overlay render. it does draw, though, as confirmed
by a forced fb-fb refresh.
* pixborder doesn't account for an edge case where the right edge of
an image is expected to be colored (except for one pixel on the top
edge). Example:
pixborder -b "255 0 0" -t "255 255 255" < pix/moss.pix | pix-fb
* typing 'comb -f -r assembly_name' shuts down mged with the error:
ERROR: bad pointer 0000000000B4CA50: s/b bu_external(x768dbbd0), was bu_vls(x89333bbb), file ..\..\..\brlcad_src\src\libbu\parse.c, line 2443"
And on the mged command line:
@@ -200,6 +312,11 @@ Recent Bugs
* wgl framebuffer is not lingering on windows (regardless of using
wgll or default) when it should
* calling "attr set obj key value" should always result in key getting
set to value, no matter what, as it is the lowest-level attribute
management interface and what the command (correctly) documents.
example demonstrated to not work was: attr set obj rgb 123/123/123
* report of LIBBU not working when accessed by a multithreaded
application on Windows. reportedly due to some problem with the
debug memory queue.
@@ -247,6 +364,12 @@ Recent Bugs
book-keeping is fuxored or the db_lookup is returning NULL (or isn't
yet performed).
* src/librt/primitives/bot/g_bot_include.c:rt_bot_bbox() routine isn't
calculating the bbox correctly
* rtxray crashes if you specify a -o *.bw output file due to
assumptions in the rt front-end that all output files are .pix
* encountered a crash during rtarea on a (default) facetized version
of the hyp from the proc-db csgbrep tool.
@@ -261,6 +384,9 @@ Recent Bugs
* torus with a near zero inner diameter results in zero-length edges
during tessellation.
* bu_log() with a width specifier does not align like printf().
Example: bu_log("%24s", str);
* report that "keep" sometimes results in a .g file with unknown units;
dbconcat also is reported to set the units to unknown if concatting
a file with unknown units.
@@ -288,6 +414,10 @@ Recent Bugs
* rt -i -s4096 -H16 -F/dev/null boolean-ops.g all
* asc2g of a .asc file containing the first line as a "#" comment
results in a bu_malloc(0) bomb. comment lines should be valid in
.asc files.
* compilation reportedly fails when building Tcl if the path to the
source directory includes a space.
@@ -412,6 +542,11 @@ Recent Bugs
* running 'keep' on too many objects (hundreds is causing a usage
statement (and not doing the keep)
* rtwizard won't display a line overlay if you line object is obscured
by another. Example being to display a vehicle as ghost, crew as
solid, and crew as line. confirmed even when using the other line
occlusion settings.
* fbserv is receiving image data very slowly if the framebuffer is a
remote X24 interface. could reproduce on mac with the following:
@@ -471,6 +606,9 @@ Recent Bugs
ubuntu linux. key events go to the command window even with the
graphics window has focus.
* MGED File->Preferences->Fonts results in error "named font "button
_font" doesn't exist on Linux.
* mged tab-completion doesn't work if the object names have spaces
* Open dialog in MGED seems rather busted for scrolling and selection
@@ -508,6 +646,13 @@ Recent Bugs
* dsp primitive is going into what seems to be an unbounded memory
allocation loop during prep, inside dsp_layers().
* libfb cannot utilize standard output/error "device" files without
path trickery. it recognizes the /dev/ prefix and presumes it's a
libfb device instead of a filesystem device.
OK: rt -F/./dev/stdout
BAD: rt -F/dev/stdout
* libfb cannot open a file descriptor when piping/redirecting output.
OK: rt -F/./dev/stdout moss.g all.g
@@ -530,6 +675,8 @@ Recent Bugs
* triangulation of some pipe in toyjeep.g fails (rather reliably) on
some given bend. fails in nmg_triangulate model().
* fbhelp sends some of the output to stdout and some to stderr...
* debugbu 2 immediately reports a bu_vls_free() error.. apparently
been a problem since 4.5 days. this occurs because
bu_memdebug_add() is not called unless memory checking is enabled
@@ -546,6 +693,9 @@ Recent Bugs
* Create menu.. create "part" boo hiss..
* wavelet isn't working correctly on a simple image decomposition &
reconstruction.
* fbed is looking for /usr/lib/vfont/nonie.r.12
* mged doesn't check if html_dir does not exist when searching for
@@ -565,6 +715,11 @@ Recent Bugs
* concave arbs give correct wireframe but do not raytrace correctly.
* rtwizard/rtedge creates incorrect "fuzzy" edge overlay when creating
a "Ghost Image with Insert and Lines" that includes a light source
and object close to surface (e.g. moss.g; select plane, light, and
cone for ghost; select cone for insert and lines.)
* mged's solid illuminate doesn't work when Lighting is turned on
* raytrace of zoomed images (e.g., -s64) doesn't work for if_X24
@@ -606,9 +761,33 @@ Recent Bugs
* sketches extruded with non-square AB vectors results in inner sketch
components not getting scaled properly.
* rtcheck is ignoring fastgen tagged geometry since no multioverlap
handler is set.
* bot-bldxf fails in db_walk_tree(), interface may have changed
Older Bugs
----------
* X11 framebuffer often fails to display on certain middle bit depth
displays. (e.g. 15 or 16 bit depth)
* mk_lcomb fails on large combinations due to mk_tree_pure() building
a left-heavy tree and wdb_put_internal() then recursively performing
lookup and put calls.
Annoyances
----------
* matrix edits on objects in mged require you to select a primitive
for a coordinate system reference. this can be counterintuitive and
confusing.
* there are frequently modality errors when entering edit mode as
control and middle mouse rebind to model edit instead of view edit.
---
Bugs should be reported to the bug tracker on the project website at
http://sourceforge.net/tracker/?atid=640802&group_id=105292
+394 -1052
View File
File diff suppressed because it is too large Load Diff
+519 -10804
View File
File diff suppressed because it is too large Load Diff
+1 -30
View File
@@ -1263,17 +1263,6 @@ Release steps are as follows:
#####################################################################
# 01: Sync main to RELEASE branch.
TODO - we probably need to do a re-look at the RELEASE and STABLE setup.
With Git and modern workflows, I'm leaning more towards a temporary
working branch where we shake down for release, then tagging from that
working branch and merging that back into main once complete. For
minor releases we should create a X-XX branch from the X-XX-0 tag, and
any patch releases on that minor series will be handled in and tagged
from the branch. With AI driven change rates, it's unrealistic to
try and put main back into a state where we can call a tag off of it
a patch on an older minor. Needs more thought - should try to hash out
before the next minor release and update the workflow.
git clone git@github.com:BRL-CAD/brlcad.git
cd brlcad
git checkout RELEASE
@@ -1540,27 +1529,9 @@ before the next minor release and update the workflow.
# 18: Upload the source distributions and release notes. Use source
# tarballs to create binaries.
# NON-AUTO: Select the new tag at https://github.com/BRL-CAD/brlcad/releases/new
#
# Upload the NEWS entries and description for the web page's
# release notes. Attach the tar.gz, tar.bz2 and .zip files as
# the initial archives. Releases may be edited to add new files,
# so go ahead and publish the release to have our default webpage
# correctly reflect the most recent release.
------------- TODO - need new procedures for GitHub... ------------
TODO - It would be nice to have some curated scripts for binary creation.
For Linux I usually set up a fresh Rocky Linux image with a clean environment
and install just what is needed to try and get a "this will probably run
anywhere" binary, but as a manual process that's a pain - maybe there's a way
to script qemu to do the job for us...
Windows is still completely manual. The .msi installer depends on an older
version of WiX, and I don't know of another good solution there - we probably need
to investigate whether we could produce MSIX packages instead.
Mac - TODO.
#####################################################################
# 19: Notify binary platform maintainers:
+11 -37
View File
@@ -39,7 +39,7 @@ including instructions for building on Windows.
Required tools:
- Git must be 2.17 or later
- CMake must be 3.26 or later
- CMake must be 3.20 or later
- Compiler must be C++17-compliant
- If using Visual Studio, version 2019 (16.8+) or later
- If using GCC/G++, version 7 or later
@@ -111,8 +111,8 @@ path) as described in the Quick Installation section.
Validating checksums:
The integrity of distributed files can be verified using checksums that are
published with released files. Released files and their checksums are
available from the GitHub releases page (https://github.com/BRL-CAD/brlcad/releases). If you
published with released files. Files on SourceForge's file release system can
be found by clicking the 'i' button at the end of each file's name. If you
re-distribute BRL-CAD, checksums should be retained with the files so others
can validate origination.
@@ -350,35 +350,6 @@ if it is, default is to enable.
Aliases: ENABLE_OPENGL
--- BRLCAD_X11_PROVIDER ---
Selects the X11 implementation used by BRL-CAD, Tk, Qt, and OpenGL. Accepted
values are AUTO, SYSTEM, and XMIN. AUTO is the default and deliberately
resolves to SYSTEM so installing Xmin cannot change an existing build.
XMIN selects an installed Xmin client SDK for deterministic GUI testing
without a host X server. The SDK must provide Xmin::ToolkitX11; OpenGL builds
also need Xmin::GL. Set Xmin_ROOT to the SDK installation prefix. Tk and Qt
must be built for the same provider because their public X11 APIs conceal
provider-private state; mixing Xmin and system client libraries is not ABI
safe and is rejected during configuration.
When BRL-CAD manages bext, it derives the matching bext SDK prefix from the
selected Xmin package. Bext then applies its version-matched Tk and Qt patches
automatically to whichever bundled toolkits are selected. No external patch
paths are needed.
A typical Xmin configuration is:
cmake .. -DBRLCAD_X11_PROVIDER=XMIN \
-DXmin_ROOT=/path/to/xmin-prefix
Bext retains advanced TK_EXTRA_PATCHES, TK_CONFIGURE_ARGS, QT_EXTRA_PATCHES,
and QT_XMIN_ROOT controls for custom profiles. The standard BRL-CAD Xmin
configuration does not need them. Refer to bext's Xmin profile documentation
before changing the bundled Tk or Qt revision.
--- BRLCAD_COMPONENTS ---
Semicolon separated list of components to enable for building - see
@@ -467,10 +438,13 @@ Aliases: ENABLE_ALL_CXX
--- BRLCAD_EXTRADOCS ---
The core option that enables and disables building of BRL-CAD's
AsciiDoc based documentation (includes manuals and man pages for
commands, among other things). It is built with BRL-CAD's bundled
asciiquack processor into HTML and man-page (troff) formats. Defaults
to ON for a full build and OFF for reduced target sets.
DocBook based documentation (includes manuals and man pages for
commands, among other things). Defaults to ON, but only HTML and MAN
formats are enabled by default - PDF must be enabled separately by use
of this option or one of its aliases. Note that you may set
environment variable APACHE_FOP to point to your locally installed fop
executable file (which on Linux is usually a shell script with 0755
permissions).
Aliases: ENABLE_DOCS, ENABLE_EXTRA_DOCS
Aliases: ENABLE_DOCS, ENABLE_EXTRA_DOCS, ENABLE_DOCBOOK
+4 -226
View File
@@ -10,212 +10,12 @@ descriptive text that emphasizes or further describes significant
changes made. See document footer for additional details.
----------------------------------------------------------------------
--- 20XX-XX-XX Release 7.46.0 ---
--- 20XX-XX-XX Release 7.44.0 ---
----------------------------------------------------------------------
* 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 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 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 Archer Tank Wizard gun generation - 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 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
* eliminated 16-fold redundant gchecker grid analysis - Cliff Yapp
* fixed Archer tree handling for object 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 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 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
* added arrange nest command for packing database objects - Sean Morrison
* new mkbuilding tool 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
* 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
* 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
* 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
* bot split now groups results and preserves mesh data - Cliff Yapp
* bot decimate now preserves normals, UVs, and plate data - Cliff Yapp
* added raytracing support for annotation objects - Cliff Yapp
* fixed MGED X embedded framebuffer display manager crash - 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
* added comb support to bb -o oriented bounding boxes - Cliff Yapp
* added -t tight bounding box option to bb command - Cliff Yapp
* added az (-a) and el (-e) option implementations to gqa - Cliff Yapp
* added center command support for centering on an object - Cliff Yapp
* greatly expanded JT import and added basic JT export - Sean Morrison
* added csg-g/g-scad OpenSCAD CSG importer/exporter - Erik Greenwald
* improved art light, color, output, & region handling - Sean Morrison
* added preliminary OpenSCAD import support - Sean Morrison
* expanded IGES BREP/NURBS import and export support - Sean Morrison
* expanded STEP AP203 import support with faceted BREP - Sean Morrison
* added STEP AP203e2, AP214, and AP242 import/export - Cliff Yapp
* added STEP CSG round trips and AP242 PMI import - Cliff Yapp
* improved STEP assembly, topology repair, and reporting - Cliff Yapp
* new adrt CLI utility with path, spall, and cut modes - Sean Morrison
* new CLI+GUI prototype BRL-CAD application launcher - Sean Morrison
* 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 parashot gravity trajectory path generator - Sean Morrison
* added metaball point 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 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
* fixed gist -Q quick preview option - Sean Morrison
* rt preserves eye_pt setting in command scripts - 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 isize in non-mm databases - Josh Baker
* fixed metaball adjust clearing points on errors - Sean Morrison
* fixed benchmark+pixcmp correctness validation bug - 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
* fixed rt -C255/0/0 -o file.pix background color bug - Sean Morrison
* added rtsil foreground & background -c set options - Sean Morrison
* 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 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
* fixed ray tracing small images to disk framebuffers - Sean Morrison
* improved raytracing performance of CSG-heavy regions - Sean Morrison
* fixed OBJ conversion bug importing unnamed groups - Sean Morrison
* fixed k-g conversion of BoT vertex normals - laithaldaeef
* 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 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
* 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
* updated GeometricTools dependency to v8.2 - Cliff Yapp
* updated Itk dependency to v4.2.7 - Cliff Yapp
* updated LMDB dependency to v1.0.1 - Cliff Yapp
* updated Manifold dependency to v3.5.3 - Cliff Yapp
* updated OpenCV dependency to v5.0.0 - Cliff Yapp
* 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
* updated libtiff dependency to v4.7.2 - Cliff Yapp
* updated netpbm dependency to v10.86.50 - Cliff Yapp
* updated oneTBB dependency to v2023.1.0 - Cliff Yapp
* updated pugixml dependency to v1.16 - Cliff Yapp
* updated sqlite3 dependency to v3.53.4 - Cliff Yapp
* updated stepcode dependency to SHA1 ed686ee1d - Cliff Yapp
* updated tinygltf dependency to v3.0.1 - Cliff Yapp
* updated zlib dependency to v1.3.2 - Cliff Yapp
----------------------------------------------------------------------
--- 2026-07-23 Release 7.44.0 ---
----------------------------------------------------------------------
This release expands geometry processing, conversion, and rendering
capabilities including a new proximity search 'near' command, ARB
repair, BoT exterior extraction, Cauchy-Crofton validation in lint,
and more reliable facetization pipeline. Ray tracers now auto-select
a default object or report available top-levels when none is named.
Rendering advancements include perspective edge rendering, timing heat
maps, PNTS ray tracing, and faster opaque and lighting-heavy renders.
GCV adds preliminary import support for VTK ASCII, X3D BREP/NURBS, and
JT import support, while OBJ preserves material colors. Procedural
tools now generate shells, gears, lattices, terrain, propellers,
wings, trees, and parameterized tires with tread presets.
MGED gains full-text doc searching and more robust command I/O; gist
1-page reports are more informative; and ICV adds richer reporting,
animation, comparison, and image metadata features. DocBook
documentation was converted to AsciiDoc, adding over 220 manual pages
and extensively improving existing docs.
* fixed search -exec infinite looping with creations - Chris McGregor
* fixed NOCOS mode plate mode bot creation - Meghna45-code
* fixed search -exec multithreaded output - Cliff Yapp, Chris McGregor
* improved as2g importing speed for large inputs - Cliff Yapp
* gist pages now include file size in header - Sean Morrison
* added preliminary support for mirroring brep objects - Sean Morrison
* fixed dbupgrade corruption of RHC entities - Sean Morrison
* fixed archer bug opening database named same as cmd - Sean Morrison
* fixed mged bug where pasted text captured by prompt - Sean Morrison
* added -k/-K manpage full text keyword search options - Sean Morrison
* rm ged command now behaves like the system rm, kills objects&paths
- Cliff Yapp, Sean Morrison
* fixed gqa exactly symmetric volumetric estimates - Sean Morrison
* added support to rtedge for perspective renderings - Sean Morrison
* rt -l8 rendering time heat graphs - Stephen Kennedy, Sean Morrison
* added 'icv anim' for APNG and MJPEG animation files - Clifford Yapp
* added BREP/NURBS import support to gcv x3d importer - Sean Morrison
* added BRL-CAD Taxonomy article on naming conventions - Sean Morrison
* added new documentation on adrt rendering - Sean Morrison
* added snail & seashell procedural geometry generator - Sean Morrison
* additional 3D geometry model examples - Csanyi Pal, Lee Butler
@@ -260,41 +60,19 @@ and extensively improving existing docs.
* corrected the exposed region count report in rtarea - Cliff Yapp
* fixed icv support for RLE image format - Cliff Yapp
* added similarity grouping identification mode to gdiff - Cliff Yapp
* added preliminary JT mesh import support to gcv - Sean Morrison
* improved gcv asc v5 reader to handle brep input - Cliff Yapp
* improved DSP primitive's default facetize behavior - Cliff Yapp
* fixed gcv appending to existing databases - Sean Morrison
* improved NMG->bot conv speed for all triangle case - Cliff Yapp
* added SPSR meshing support to the pnts command - Cliff Yapp
* rt tools auto-select an object when none is given - Sean Morrison
* 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
* updated geogram dependency to v1.9.6 - Cliff Yapp
* 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
* added specimen, terrain, & voxelize proc-db tools - Sean Morrison
* added gear, helicoil, lattice, loftwing proc-db - Sean Morrison
* added authenticated IPC/TLS to fbserv & remrt/rtsrv - Cliff Yapp
* improved rtwizard concurrency & remrt on Windows - Cliff Yapp
* added simplification control options to bot extrude - Cliff Yapp
* added bot exterior subcommand - Cliff Yapp
* updated Manifold dependency to v3.2.1 - Cliff Yapp
* updated SPSR dependency to v18.74 - Cliff Yapp
* fixed 'search -type sph' not returning sph's - Chris McGregor
* fixed gist crashing with bad/unknown units - Chris McGregor
* add gist '-d' to allow user-specified density file - Chris McGregor
* added Cauchy-Crofton area/volume & lint validation - Cliff Yapp
* updated geogram dependency from v1.9.0 to v1.9.6 - Cliff Yapp
* updated Manifold dependency from v2.5.1 to v3.2.1 - Cliff Yapp
* updated SPSR dependency from v16.10 to v18.74 - Cliff Yapp
* updated Embree dependency from v4.3.2 to v4.4.1 - Sean Morrison
* updated ISPC dependency from v1.24.0 to v1.30.0 - Sean Morrison
* updated oneTBB dependency from v2021.12.0 to v2023.0.0 - Sean Morrison
* updated OSPRay dependency from v3.1.0 to v3.2.0 - Sean Morrison
* updated rkcommon dependency from v1.13.0 to v1.15.2 - Sean Morrison
* updated LIEF dependency from v0.15.1 to v0.17.6 - Cliff Yapp
* updated Qt dependency from v6.10.2 to v6.11.1 - Cliff Yapp
* added Bullet dependency v3.27 - Cliff Yapp
----------------------------------------------------------------------
+1 -1
View File
@@ -1,5 +1,5 @@
BRL-CAD
Release 7.44.2
Release 7.42.2
http://brlcad.org/
BRL-CAD is a powerful cross-platform open source combinatorial
+88 -35
View File
@@ -18,53 +18,39 @@ tasks as they are completed.
THESE TASKS SHOULD HAPPEN BEFORE THE NEXT RELEASE
-------------------------------------------------
* revert the pixdiff/pixcmp change back to grayscale
* rm foo bar vs rm -C foo bar and a safety guard that prevents
deleting foo accidentially.
* coordinate with bext to have it produce a manifest of what files
need strclear/plief processing of various types so we don't need to
redo the characterization pass every time we configure. We have
strclear and plief in bext, so that repo should be capable of doing
the work for us as a post build step whenever bext changes.
* verify MGED exit behavior on Windows - reports of non-zero exit
being returned.
* fix ARB5 move point 5 to actually move the point.
* need extensive testing of MGED CSG editing with the shift to librt
based editing logic.
* investigate gqa plotting display in MGED
* update change policy to 1) expand definition of minimally impacting
to allow an assuption of non-embedding in function calls (i.e., no
function or macro calls as function arguments), 2) migrate change
tracking to a doc subfolder, 3) split deprecation from minimally
impacting to separate docs, 4) invert minimally impacting list to be
a functional description of the change (e.g., "rename A -> B", "drop
arg 3 C", etc), 5) auto-generate and publish robust regular
expressions from the functional descriptions, 6) publish an
auto-update script that warns about deprecated use and/or applies
minimally impacting changes to a given file.
THESE TASKS SHOULD HAPPEN WITHIN TWO RELEASE ITERATIONS
-------------------------------------------------------
* DEFERRED mouse sweep rect
* DEFERRED apropos (view command
* fix ARB8 promotion to BoT, so calls between prep and shot don't get
inconsistent data (soltab needs to match).
* verify arb6 editing in cheese wedge tutorial
* rtarea is sometimes missing regions on summary reporting, at least
on Windows, possibly a threading issue setting up the results
container.
THESE ARE UNSCHEDULED BACKLOG TASKS
-----------------------------------
* reconcile VCOMB2, VBLEND2, and VADD2SCALE along with corresponding
3d/4d api consistency in vmath.h
* make sph sph
clone -i 1 -t 1000 0 0 -n 100 sph
kill sph
g line sph*
clone -i 1 -t 0 1000 0 -n 100 line
kill line
g square line*
clone -i 1 -t 0 0 1000 -n 100 square
... takes a crazy long time ...
This should be merely 1M spheres, but it chokes with non-linear time
increase. Appears to be excessively reading/writing objects and
getting slower as it progresses. Needs to be optimized.
* Add two-tiered option handling to tire, propeller and naca456
For most uses we'll want a few pre-baked high level settings -
those can be command line flags. For full control of the complex
@@ -80,6 +66,10 @@ THESE ARE UNSCHEDULED BACKLOG TASKS
binary interface to analytic routines. notable outliers include
nirt_* (including CLI handling..), voxelize*, rt_gen*, rectangular*
* ensure datum objects convert out via g2asc and back (currently
writes "a Tcl output routine for this type of object has not yet
been implemented")
* fix recursive bu_parallel() to not have a hard-coded limit on the
number of threads or to more aggressively abort when more that
supported are dispatched. currently supporting 64x64 threads and
@@ -343,6 +333,17 @@ lookup check to ensure none are missing.
error. code appears to be assuming both /dev/X framebuffer and uses
/dev/null redirect to sink output.
* rtwizard greys out the File->New and Open menu items when run with a
filename, which is very confusing. Either menu should remain usable
or there should be some other indication that a file was specified
and is open.
* the mged tutorials apparently do not mention the tops command (even
once), but really should as it's the starting point for discovering
what is in databases that are opened or imported.
* add metaball scaling feature (presently in a tclscript)
* ability to visualize metaball centerpoints and with/without
translucency.
@@ -353,8 +354,6 @@ lookup check to ensure none are missing.
* add script/command for changing metaball weights in masse
* add a proper 'metaball' command with subcommands
* gdiff in mged appears to be broken? get "no primitives found" on
second comb when specifying two combs (gdiff comb1 comb2). UPDATE -
this appears to be a consequence of how gdiff internally implements
@@ -364,6 +363,9 @@ lookup check to ensure none are missing.
comb2 is shared with comb1. A workaround is to keep out comb2 and
dbconcat it back in, then gdiff comb1 with the imported tree.
* pixscale doesn't seem to handle stdin (due to bu_seek) for very
long
* The embedded framebuffer for the X display manager is not working
with Tcl/Tk 8.6 - it brings down mged with an Xerror when it tries
to XFlush after X24_blit. Better solution is to replace the X dm/fb
@@ -488,6 +490,10 @@ lookup check to ensure none are missing.
* add unit tests for primitive callback routines (e.g., bbox).
* put bu_num_print() to use
* use bu_gettime() in rt -l8 heatgraph visualization mode
* fully implement analyze for all geometry objects
* move analyze logic into libanalyze (with respective primitive logic
@@ -588,6 +594,10 @@ lookup check to ensure none are missing.
libged command wrapper so it's consistent and available to any
command.
* mater command does not validate its arguments - fix that. Also
properly document using "." to skip specifying something - not in
the man page currently.
* bullet integration - need to expose restitution as an
object parameter so we can configure behavior:
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=&f=&t=3248
@@ -621,6 +631,8 @@ lookup check to ensure none are missing.
* closing the graphics window brings down X11 on Mac due to a bad
context. fix or revert recent close window behavior.
* V&V bwcrop, pixembed are behaving correctly, as documented
* implement unit tests for bu dirent / stat API
* convert src/util/terrain.c to src/shapes/terrain.c writing out the
@@ -636,6 +648,8 @@ lookup check to ensure none are missing.
get_eyemodel to eye_pt to result in no change, modulo unit
conversions.
* make rt -b accept a pixel index in addition to x,y pixel coordinates
* teach pixdiff and other tools that can/should support the capability
to read/write (as appropriate) pixel index values or x,y coordinates
and reproduce the ray fired to create that pixel. currently does -l
@@ -952,6 +966,11 @@ lookup check to ensure none are missing.
* test tgf-g conversion with "ring-mode" geometry
* fix metaball/adjust.. wipes out all metaball values with:
adjust metaball 1 1 1
just gives usage with:
adjust metaball 1 1
* test for -msse3 requirement for __SSE.*__ definition
* improve sse run-time detection so illegal instruction crashes are
@@ -970,6 +989,11 @@ lookup check to ensure none are missing.
[FAN-OUT: yes -- per-file/per-converter sweep with a verification
pass.]
* pixdiff reports bytes, but reports incorrect (off-by-one) bytes for
.bw input files. cause is due to tool assuming input is rgb
triplets (even though output is bytes, wtf?). should probably
report pixels and/or have a -b option for handling byte/bw input.
* investigate why epa primitive is so sensitive to coarse absolute
value changes (run csgbrep, tol abs=1, facetize and get 321k poly)
@@ -1070,6 +1094,12 @@ lookup check to ensure none are missing.
intersected with them) since, while bad practice, are valid
geometrically.
* make sure there are no getenv() non-NULL assumptions within the
code. might want to see if there's a pattern of variables being
checked such that a libbu interface would be warranted (e.g.,
instead of checking HOME, having a bu_find_directory(BU_USER_HOME)
routine or similar facility) for finding common resource locations.
* make db_open modes behave the same as the fopen() modes (i.e.,
create the .g if one doesn't exist when write mode)
@@ -1722,6 +1752,12 @@ ATTRIBUTES
* implement an option to "attr upgrade" for reading upgrade/downgrade
plugins/instructions from an external file for 3rd party use.
* prevent nirt from outputting a trailing space after values when
there are no attributes to be displayed. the problem is in the nirt
format strings where they use " %s" for displaying any attributes.
need to left-pad a space conditionally, perhaps by supporting %*s
and sizeof(var).
* add additional support for user-specified sorting for the attr
command when new attribute attributes are added (e.g., creation
date)
@@ -2540,6 +2576,8 @@ DOCUMENTATION
* Need ability to search manual pages
* rename MGED Help->Apropos to Help->Search Commands (apropos)
* BRL-CAD Primitives
An overview of the various primitive object types in BRL-CAD,
their range of features, and a description of their input
@@ -2556,6 +2594,10 @@ DOCUMENTATION
various image formats like png just by specifying an output file
extension.
* document gqa centroid and moments of inertia options
* document the new NURBS/BREP primitive, capabilities and limitations
Need to revisit utility of spherical mapping, used by sh_spm and
sh_points, used for environment mapping (e.g., stars):
@@ -2595,6 +2637,13 @@ DOCUMENTATION
tgf-g
* write up some documentation on other build tools besides make -
CMake supports other generators, wouldn't hurt to detail how to
trigger builds in them (MSVC is partially covered, make sure to
coverage is complete - others include Eclipse, XCode once we get the
kinks ironed out there, CodeBlocks. Ninja build tool and its
CMake support are worth documenting too.
* all of the rt* tracers share common code and common options, but do
not share common documentation. refactor documentation to use
include directives so that there is one place where all of the
@@ -2694,6 +2743,10 @@ DOCUMENTATION
* BRL-CAD Manifesto
Vision & Scope
* BRL-CAD Taxonomy
Description of the common terminology used throughout BRL-CAD,
conventions employed, and tool categorization.
* Implementing a BRL-CAD Primitive
How-To for creating a new primitive in BRL-CAD that can be
ray-traced, tessellated, plotted, and transformed seamlessly.
-7
View File
@@ -3,12 +3,6 @@ add_subdirectory(ref)
add_definitions(-DCONSOLE)
brlcad_addexec(pixcmp pixcmp.c libbu)
brlcad_add_test(
NAME bench_pixcmp_tolerance
COMMAND
${CMAKE_COMMAND} "-DPIXCMP=$<TARGET_FILE:pixcmp>" "-DTEST_DIR=${CMAKE_CURRENT_BINARY_DIR}"
-P "${CMAKE_CURRENT_SOURCE_DIR}/pixcmp_test.cmake"
)
set(BARK_SOURCES benchmark.c compute.c run.c clean.c)
brlcad_addexec(bark "${BARK_SOURCES}" "libbu;${M_LIBRARY}" NO_STRICT NO_INSTALL TEST_USESDATA)
@@ -44,7 +38,6 @@ file(
cmakefiles(
CMakeLists.txt
pixcmp_test.cmake
run.sh
try.sh
viewdiff.sh
+3 -5
View File
@@ -237,7 +237,7 @@ set_if_unset(void (*echo)(const char *, ...), void (*verbose)(const char *, ...)
}
setval = getenv(var);
echo("Using [%s] for %s\n", setval ? setval : "", var);
echo("Using [%s] for %s\n", setval, var);
}
@@ -589,7 +589,6 @@ main(int ac, char *av[])
{
struct bu_vls v = BU_VLS_INIT_ZERO;
char rfc2822[1024] = {0};
const char *logfile = getenv("LOGFILE");
#ifdef HAVE_SYS_UTSNAME_H
struct utsname n;
time_t t = time(NULL);
@@ -605,7 +604,7 @@ main(int ac, char *av[])
echo("B R L - C A D B E N C H M A R K\n");
echo("=================================\n");
echo("Running %s on %s\n", av[0], rfc2822);
echo("Logging output to %s\n", logfile ? logfile : "disabled");
echo("Logging output to %s\n", getenv("LOGFILE"));
echo("%s\n\n", bu_vls_addr(&v));
}
@@ -654,7 +653,6 @@ main(int ac, char *av[])
bu_setenv("PIX", bu_path_dirname(getenv("PIX")), 1);
}
const char *pix_env = getenv("PIX");
bu_vls_printf(&vp,
"%s "
"%s "
@@ -663,7 +661,7 @@ main(int ac, char *av[])
"%s/../../pix "
"%s/../../../pix "
"./pix",
pix_env ? pix_env : "", pix, thisp, thisp, thisp, thisp);
getenv("PIX"), pix, thisp, thisp, thisp, thisp);
bu_argv_from_string(argv, 32, bu_vls_addr(&vp));
look_for(verbose_echo, directory, "a benchmark reference log directory", "LOG", (const char **)argv);
bu_vls_trunc(&vp, 0);
+24 -18
View File
@@ -160,38 +160,44 @@ compare_rgb(int r1, int g1, int b1, int r2, int g2, int b2, size_t *matching, si
&& (b1 == b2 && b1 != -1))
{
result = MATCHING;
(*matching)++;
} else if (r1 == -1 || r2 == -1 || g1 == -1 || g2 == -1 || b1 == -1 || b2 == -1) {
/* image sizes don't match (or other I/O error) */
result = MISSING;
} else {
/* at least this */
result = OFF_BY_ONE;
/* but maybe more */
(*missing)++;
} else if (((r1 != r2) && (g1 == g2) && (b1 == b2))
|| ((r1 == r2) && (g1 != g2) && (b1 == b2))
|| ((r1 == r2) && (g1 == g2) && (b1 != b2)))
{
/* off by one channel */
if (r1 != r2) {
if ((r1 > r2 ? r1 - r2 : r2 - r1) > 1) {
result = OFF_BY_MANY;
(*offmany)++;
} else {
result = OFF_BY_ONE;
(*off1)++;
}
}
if (g1 != g2) {
} else if (g1 != g2) {
if ((g1 > g2 ? g1 - g2 : g2 - g1) > 1) {
result = OFF_BY_MANY;
(*offmany)++;
} else {
result = OFF_BY_ONE;
(*off1)++;
}
}
if (b1 != b2) {
} else if (b1 != b2) {
if ((b1 > b2 ? b1 - b2 : b2 - b1) > 1) {
result = OFF_BY_MANY;
(*offmany)++;
} else {
result = OFF_BY_ONE;
(*off1)++;
}
}
}
if (result == OFF_BY_ONE) {
(*off1)++;
} else if (result == OFF_BY_MANY) {
(*offmany)++;
} else if (result == MATCHING) {
(*matching)++;
} else {
(*missing)++;
result = OFF_BY_MANY;
(*offmany)++;
}
return result;
@@ -340,7 +346,7 @@ main(int argc, char *argv[])
bu_log("Warning - f2 fstat failed: %s\n", strerror(errno));
}
/* bu_log("FILE1_size(%zu) FILE1_skip(%zu) FILE2_size(%zu) FILE2_skip(%zu)\n", (size_t)sf1.st_size, f1_skip, (size_t)sf2.st_size, f2_skip); */
bu_log("FILE1_size(%zu) FILE1_skip(%zu) FILE2_size(%zu) FILE2_skip(%zu)\n", (size_t)sf1.st_size, f1_skip, (size_t)sf2.st_size, f2_skip);
if (!quiet && ((sf1.st_size - f1_skip) != (sf2.st_size - f2_skip))) {
bu_log("WARNING: Different image sizes detected\n");
-80
View File
@@ -1,80 +0,0 @@
# Exercise pixcmp's pixel tolerance and exit-status contract with small,
# deliberately readable byte streams.
if(NOT PIXCMP OR NOT TEST_DIR)
message(FATAL_ERROR "PIXCMP and TEST_DIR are required")
endif()
function(check_pixcmp name input1 input2 expected_status expected_summary)
set(file1 "${TEST_DIR}/pixcmp_${name}_1.pix")
set(file2 "${TEST_DIR}/pixcmp_${name}_2.pix")
file(WRITE "${file1}" "${input1}")
file(WRITE "${file2}" "${input2}")
execute_process(
COMMAND "${PIXCMP}" ${ARGN} "${file1}" "${file2}"
OUTPUT_VARIABLE output
ERROR_VARIABLE errors
RESULT_VARIABLE status
)
file(REMOVE "${file1}" "${file2}")
if(NOT "${status}" STREQUAL "${expected_status}")
message(
FATAL_ERROR
"${name}: pixcmp returned ${status}, expected ${expected_status}\nstdout: ${output}\nstderr: ${errors}"
)
endif()
string(REGEX REPLACE "[ \t\r\n]+" " " normalized_output "${output}")
string(STRIP "${normalized_output}" normalized_output)
string(FIND "${normalized_output}" "${expected_summary}" summary_position)
if(summary_position EQUAL -1)
message(
FATAL_ERROR
"${name}: expected summary '${expected_summary}'\nactual stdout: ${output}\nstderr: ${errors}"
)
endif()
endfunction()
set(exact_pixel "pixcmp pixels: 1 matching, 0 off by 1, 0 off by many")
set(tolerated_pixel "pixcmp pixels: 0 matching, 1 off by 1, 0 off by many")
set(rejected_pixel "pixcmp pixels: 0 matching, 0 off by 1, 1 off by many")
check_pixcmp(exact "ABC" "ABC" 0 "${exact_pixel}")
check_pixcmp(one_channel_within_tolerance "ABC" "BBC" 1 "${tolerated_pixel}")
check_pixcmp(two_channels_within_tolerance "ABC" "BCC" 1 "${tolerated_pixel}")
check_pixcmp(three_channels_within_tolerance "ABC" "@CB" 1 "${tolerated_pixel}")
# Keep the tolerated channel first in two cases to catch short-circuiting that
# would fail to inspect a later channel outside the tolerance.
check_pixcmp(red_outside_tolerance "ABC" "CCD" 2 "${rejected_pixel}")
check_pixcmp(green_outside_tolerance "ABC" "BDD" 2 "${rejected_pixel}")
check_pixcmp(blue_outside_tolerance "ABC" "BCE" 2 "${rejected_pixel}")
check_pixcmp(
missing_pixel
"ABC"
"ABCDEF"
2
"pixcmp pixels: 1 matching, 0 off by 1, 0 off by many, 1 missing"
)
check_pixcmp(
byte_within_tolerance
"A"
"B"
1
"pixcmp bytes: 0 matching, 1 off by 1, 0 off by many"
-b
)
check_pixcmp(
byte_outside_tolerance
"A"
"C"
2
"pixcmp bytes: 0 matching, 0 off by 1, 1 off by many"
-b
)
+20 -31
View File
@@ -750,9 +750,9 @@ run ( ) {
\"${DB}/${run_geomname}.g\" ${run_geometry} 1>&2 <<EOF
$run_view
EOF
run_retval=$?
$VERBOSE_ECHO "DEBUG: Running $RT returned $run_retval"
return $run_retval
retval=$?
$VERBOSE_ECHO "DEBUG: Running $RT returned $retval"
return $retval
}
@@ -986,7 +986,6 @@ bench ( ) {
bench_frame=0
bench_rtfms=""
bench_percent=100
bench_retval=0
bench_start_time="`date '+%H %M %S'`"
bench_overall_elapsed=-1
@@ -1010,10 +1009,7 @@ $bench_view
start $bench_frame;
end;
EOF
bench_raytrace_retval=$?
if test $bench_raytrace_retval != 0 ; then
bench_retval=$bench_raytrace_retval
fi
retval=$?
if test $bench_frame -ne 0 ; then
if test -f ${bench_testname}.pix.$bench_frame ; then
@@ -1087,7 +1083,7 @@ EOF
fi
# did we fail?
if test $bench_raytrace_retval != 0 ; then
if test $retval != 0 ; then
$ECHO "RAYTRACE ERROR"
break
fi
@@ -1152,34 +1148,27 @@ EOF
ls -la *.pix*
fi
$VERBOSE_ECHO "DEBUG: $CMP $PIX/${bench_testname}.pix ${bench_testname}.pix"
cmp_result="`eval \\\"${CMP}\\\" \\\"${PIX}/${bench_testname}.pix\\\" ${bench_testname}.pix 2>&1`"
bench_cmp_retval=$?
cmp_result="`eval \\\"${CMP}\\\" \\\"${PIX}/${bench_testname}.pix\\\" ${bench_testname}.pix 2>&1 | grep pixels`"
ret=$?
pixels_result="`echo \\\"$cmp_result\\\" | grep pixels`"
if test "x$pixels_result" = "x" ; then
$ECHO "$cmp_result"
else
$ECHO "$pixels_result"
fi
$ECHO "$cmp_result"
if test $bench_cmp_retval = 0 ; then
if test $ret = 0 ; then
# perfect match
$ECHO ${bench_testname}.pix: answers are RIGHT
elif test $bench_cmp_retval = 1 ; then
elif test $ret = 1 ; then
# off by one, acceptable
$ECHO ${bench_testname}.pix: answers are RIGHT
elif test $bench_cmp_retval = 2 ; then
elif test $ret = 2 ; then
# off by many, unacceptable
$ECHO ${bench_testname}.pix: WRONG WRONG WRONG WRONG WRONG WRONG
bench_retval=$bench_cmp_retval
else
# some other failure
$ECHO ${bench_testname}.pix: BENCHMARK COMPARISON FAILURE
bench_retval=$bench_cmp_retval
fi
$VERBOSE_ECHO "DEBUG: Done benchmark testing on $bench_testname"
return $bench_retval
return $retval
}
@@ -1327,7 +1316,7 @@ perf ( ) {
start="`date '+%H %M %S'`"
$ECHO "Running the BRL-CAD Benchmark tests... please wait ..."
$ECHO
benchmark_retval=0
ret=0
bench moss all.g $RTARGS << EOF
viewsize 1.572026215e+02;
@@ -1337,7 +1326,7 @@ viewrot -5.735764503e-01 8.191520572e-01 0.000000000e+00 0.000000000e+00
7.424039245e-01 5.198368430e-01 4.226182699e-01 0.000000000e+00
0.000000000e+00 0.000000000e+00 0.000000000e+00 1.000000000e+00 ;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
bench world all.g $RTARGS << EOF
viewsize 1.572026215e+02;
@@ -1347,7 +1336,7 @@ viewrot -5.735764503e-01 8.191520572e-01 0.000000000e+00 0.000000000e+00
7.424039245e-01 5.198368430e-01 4.226182699e-01 0.000000000e+00
0.000000000e+00 0.000000000e+00 0.000000000e+00 1.000000000e+00 ;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
bench star all $RTARGS << EOF
viewsize 2.500000000e+05;
@@ -1357,7 +1346,7 @@ viewrot -6.733560560e-01 6.130643360e-01 4.132114880e-01 0.000000000e+00
4.896120540e-01 7.885590550e-01 -3.720948210e-01 0.000000000e+00
0.000000000e+00 0.000000000e+00 0.000000000e+00 1.000000000e+00 ;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
bench bldg391 all.g $RTARGS << EOF
viewsize 1.800000000e+03;
@@ -1367,7 +1356,7 @@ viewrot -5.735764503e-01 8.191520572e-01 0.000000000e+00 0.000000000e+00
7.424039245e-01 5.198368430e-01 4.226182699e-01 0.000000000e+00
0.000000000e+00 0.000000000e+00 0.000000000e+00 1.000000000e+00;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
bench m35 all.g $RTARGS <<EOF
viewsize 6.787387985e+03;
@@ -1377,14 +1366,14 @@ viewrot -5.527838919e-01 8.332423558e-01 1.171090926e-02 0.000000000e+00
6.800964482e-01 4.429747496e-01 5.841593895e-01 0.000000000e+00
0.000000000e+00 0.000000000e+00 0.000000000e+00 1.000000000e+00 ;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
bench sphflake scene.r $RTARGS <<EOF
viewsize 2.556283261452611e+04;
orientation 4.406810841785839e-01 4.005093234738861e-01 5.226451688385938e-01 6.101102288499644e-01;
eye_pt 2.418500583758302e+04 -3.328563644344796e+03 8.489926952850350e+03;
EOF
benchmark_retval=`expr $benchmark_retval + $?`
ret=`expr $ret + $?`
$ECHO
$ECHO "... Done."
@@ -1392,7 +1381,7 @@ $ECHO
$ECHO "Total testing time elapsed: `eval \\\"$ELP\\\" $start`"
# see if we fail
if test ! "x$benchmark_retval" = "x0" ; then
if test ! "x$ret" = "x0" ; then
$ECHO
$ECHO "THE BENCHMARK ANALYSIS DID NOT COMPLETE SUCCESSFULLY."
$ECHO
-7
View File
@@ -1,7 +1,6 @@
function(G_TARGET in_model folder)
# Initialize
set(MODEL_TYPE "UNKNOWN")
set(CONV_SUCCESS_CODES 0)
# Regardless of what we decide, let CMake know about the file
cmakefiles(${CMAKE_CURRENT_SOURCE_DIR}/${in_model})
@@ -26,7 +25,6 @@ function(G_TARGET in_model folder)
# Find our output file and path
string(REPLACE "${CMAKE_SOURCE_DIR}/" "" rel_dir "${CMAKE_CURRENT_SOURCE_DIR}")
set(output_file ${DATA_DIR}/${rel_dir}/${in_model_root}.g)
set(CONV_OUTPUT_PATH "${CMAKE_BINARY_DIR}/${output_file}")
set(log_file ${CMAKE_CURRENT_BINARY_DIR}/${in_model_root}.log)
# Make sure the output db target directory is there
@@ -118,10 +116,6 @@ function(G_TARGET in_model folder)
return()
endif(NOT TARGET step-g)
set(CONV_ARGS "-O \"${CMAKE_BINARY_DIR}/${output_file}\" \"${CMAKE_CURRENT_SOURCE_DIR}/${in_model}\"")
# step-g uses status 1 for useful, deliberately published partial output.
# Installed sample databases should retain that geometry; statuses 2 and
# above, or a missing output file, remain build failures.
set(CONV_SUCCESS_CODES "0;1")
configure_file("${CMAKE_SOURCE_DIR}/db/to_g.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${in_model_root}.cmake" @ONLY)
distclean("${CMAKE_CURRENT_BINARY_DIR}/${in_model_root}.cmake")
# Custom command to generate the output
@@ -209,7 +203,6 @@ set(
demo.asc
die.asc
earth.asc
gaia.asc
galileo.asc
goliath.asc
havoc.asc
-78680
View File
File diff suppressed because it is too large Load Diff
+119 -358
View File
File diff suppressed because one or more lines are too long
+2 -4
View File
@@ -35,12 +35,10 @@ execute_process(
ERROR_VARIABLE conv_log
)
set(conv_success_codes "@CONV_SUCCESS_CODES@")
list(FIND conv_success_codes "${conv_result}" conv_result_index)
if(conv_result_index EQUAL -1 OR NOT EXISTS "@CONV_OUTPUT_PATH@")
if(conv_result)
set(CARGS @CONV_ARGS@)
message(FATAL_ERROR "[@in_model_root@] Failure: ${conv_result}\n${CONV_EXEC} ${CARGS}\"\n\n${conv_log}")
endif()
endif(conv_result)
# Cleanup
execute_process(
+2 -3
View File
@@ -13,6 +13,8 @@ set(
README.MacOSX
README.Windows
README.BSD
README.Solaris
README.VAX
checklist.txt
description.txt
optimization_ideas.adoc
@@ -27,7 +29,6 @@ set(
notes/editors.txt
notes/history.txt
notes/hypot.txt
notes/itcl4_migration.txt
notes/mater.txt
notes/matrix.txt
pre_BRL-CAD.bib
@@ -216,8 +217,6 @@ endif(TARGET mged)
cmakefiles(
CMakeLists.txt
README.Solaris
README.VAX
README.adoc
STARTERS
STRATEGY
-4
View File
@@ -1,7 +1,3 @@
*** ARCHIVED -- legacy platform, no longer supported (retained for
*** historical reference). This document is not installed and is kept
*** only to preserve the historical record.
BRL-CAD on Solaris README
=========================
There have been a variety of Solaris-style operating systems that appeared
-4
View File
@@ -1,7 +1,3 @@
*** ARCHIVED -- legacy platform, no longer supported (retained for
*** historical reference). This document is not installed and is kept
*** only to preserve the historical record.
BRL-CAD on VAX README
=====================
+2 -2
View File
@@ -33,7 +33,7 @@ toc::[]
=== Prerequisites
To build BRL-CAD from source, you will need:
* **CMake** (3.26+)
* **CMake** (3.14+)
* **C/C++ Compiler** (GCC, Clang, or MSVC)
* **Build Tools** (Make, Ninja, or Visual Studio)
@@ -53,7 +53,7 @@ For detailed installation instructions across different platforms, please refer
== Documentation
We have consolidated our extensive documentation (formerly a mix of DocBook/XML, MediaWiki, troff, plain text, and more) onto **AsciiDoc**, with the authoritative sources under `doc/asciidoc/`.
We are currently transitioning our extensive documentation (Docbook/XML + MediaWiki + troff + text + ...) to an **Antora-powered ecosystem**.
* **Tutorials:** link:{docs-url}/tutorials[Browse the Manuals]
* **Developer Guides:** link:{docs-url}/hacking and link:{repo-url}/blob/main/HACKING
-1
View File
@@ -1,6 +1,5 @@
include(${BRLCAD_CMAKE_DIR}/AsciiDoc.cmake)
verbose_add_subdirectory(asciidoc toplevel)
verbose_add_subdirectory(asciidoc system)
verbose_add_subdirectory(asciidoc articles)
verbose_add_subdirectory(asciidoc books)
+31 -19
View File
@@ -4,14 +4,15 @@
== Overview
This directory contains BRL-CAD documentation in AsciiDoc format. The `.adoc`
files here are the authoritative documentation sources and are committed to
version control. The one-time conversion from the original DocBook 5 XML
sources is complete, and those legacy XML sources have been removed; edit the
`.adoc` files directly.
This directory contains BRL-CAD documentation in AsciiDoc format, converted
from the original DocBook 5 XML sources in `../docbook/`. The conversion was
performed once using
link:../../misc/tools/db2adoc/db2adoc.xsl[db2adoc.xsl] (an XSLT stylesheet)
applied via `xsltproc`.
The `.adoc` files are built into HTML and man-page outputs at compile time
using **asciiquack**, BRL-CAD's self-contained AsciiDoc processor.
The `.adoc` files here are committed to version control as authoritative
sources. They are built into HTML and man-page outputs at compile time using
**asciiquack**, BRL-CAD's self-contained AsciiDoc processor.
== Directory Structure
@@ -42,17 +43,28 @@ When `BRLCAD_EXTRADOCS=ON` is set at CMake configuration time:
The build logic is in `brlcad/misc/CMake/AsciiDoc.cmake`.
== Authoritative Sources
== Re-running the Conversion
The `.adoc` files in this directory are the authoritative documentation
sources. The one-time conversion from the retired DocBook 5 XML sources is
complete, so there is no conversion step to re-run: make all documentation
changes by editing the `.adoc` files directly.
If the upstream DocBook sources change and you need to re-generate the AsciiDoc
files, run the XSLT stylesheet from the repository root:
[NOTE]
====
Documentation is built only when CMake is configured with
`BRLCAD_EXTRADOCS=ON`. With the default configuration the documentation
targets are skipped, so remember to enable this option when working on or
verifying documentation.
====
[source,bash]
----
BEXT=/path/to/bext_output
for f in $(find doc/docbook -name "*.xml" -not -path "*/resources/*"); do
rel=${f#doc/docbook/}
out=doc/asciidoc/${rel%.xml}.adoc
mkdir -p "$(dirname "$out")"
$BEXT/noinstall/bin/xsltproc -xinclude \
misc/tools/db2adoc/db2adoc.xsl "$f" > "$out"
done
----
Alternatively, use `db2adoc.py` (requires pandoc ≥ 2.0) for a Python-driven
approach with better round-trip fidelity for complex markup:
[source,bash]
----
python3 misc/tools/db2adoc/db2adoc.py
----
+9 -66
View File
@@ -13,14 +13,12 @@ set(
mged.adoc
mgedrc.adoc
nirt.adoc
object_types.adoc
oed.adoc
overlap_tool.adoc
pipes.adoc
procedural_geometry.adoc
projection_shader.adoc
renderer_showcase.adoc
taxonomy.adoc
tire.adoc
)
@@ -227,72 +225,20 @@ set(
images/renderer_gallery_rthide.png
images/renderer_gallery_rtdepth.png
images/renderer_gallery_rtxray.png
images/adrt_castle_path.png
images/adrt_castle_rt.png
images/adrt_castle_rt_ao.png
images/adrt_toyjeep_path.png
images/adrt_toyjeep_rt.png
images/adrt_toyjeep_rt_ao.png
images/adrt_toyjeep_phong.png
images/adrt_toyjeep_normal.png
images/adrt_toyjeep_depth.png
images/adrt_chess_path.png
images/adrt_chess_rt.png
images/adrt_chess_rt_ao.png
images/adrt_castle_path.png
images/adrt_castle_rt.png
images/adrt_castle_rt_ao.png
images/adrt_cornell_path.png
images/adrt_cornell_phong.png
images/adrt_toyjeep_depth.png
images/adrt_toyjeep_normal.png
images/adrt_toyjeep_path.png
images/adrt_toyjeep_phong.png
images/adrt_toyjeep_rt.png
images/adrt_toyjeep_rt_ao.png
images/adrt_toyjeep_spall.png
images/objtype_arb8.png
images/objtype_arb8_variety.png
images/objtype_arbn.png
images/objtype_arbn_variety.png
images/objtype_ars.png
images/objtype_bot.png
images/objtype_bot_variety.png
images/objtype_brep.png
images/objtype_cline.png
images/objtype_comb_variety.png
images/objtype_dsp.png
images/objtype_ebm.png
images/objtype_ehy.png
images/objtype_ehy_variety.png
images/objtype_ell.png
images/objtype_ell_variety.png
images/objtype_epa.png
images/objtype_epa_variety.png
images/objtype_eto.png
images/objtype_eto_variety.png
images/objtype_extrude.png
images/objtype_half.png
images/objtype_hrt.png
images/objtype_hrt_variety.png
images/objtype_hyp.png
images/objtype_hyp_variety.png
images/objtype_metaball.png
images/objtype_metaball_variety.png
images/objtype_nmg.png
images/objtype_part.png
images/objtype_part_variety.png
images/objtype_pipe.png
images/objtype_pipe_variety.png
images/objtype_pnts.png
images/objtype_rcc.png
images/objtype_rec.png
images/objtype_revolve.png
images/objtype_rhc.png
images/objtype_rhc_variety.png
images/objtype_rpc.png
images/objtype_rpc_variety.png
images/objtype_sph.png
images/objtype_submodel.png
images/objtype_superell.png
images/objtype_superell_variety.png
images/objtype_tgc.png
images/objtype_tgc_variety.png
images/objtype_tor.png
images/objtype_tor_variety.png
images/objtype_trc.png
images/objtype_vol.png
)
if(TARGET mged OR TARGET qged OR TARGET archer)
if(BRLCAD_EXTRADOCS)
@@ -471,9 +417,6 @@ cmakefiles(
gallery/inputs/moss64.pix
gallery/inputs/caffeine.pdb
gallery/inputs/mol-cube.dat
images/objtype_src/README.adoc
images/objtype_src/objtype_lib.py
images/objtype_src/gen_object_types.py
)
add_subdirectory(hy)
+3 -3
View File
@@ -71,11 +71,11 @@ More paragraphs...
[CAUTION]
====
There's a lot more you can do with AsciiDoc. Consult the reference documentation for syntax and examples:
There's a lot more you can do with Docbook/XML. Search the web for references and examples:
* https://docs.asciidoctor.org/asciidoc/latest/[AsciiDoc Language Documentation]
* https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/[AsciiDoc Syntax Quick Reference]
* http://www.docbook.org/tdg5/en/html/article.html[http://www.docbook.org/tdg5/en/html/article.html]
* http://www.openoffice.org/xml/xmerge/docbook/UserGuide.html[http://www.openoffice.org/xml/xmerge/docbook/UserGuide.html]
====
+1 -1
View File
@@ -43,7 +43,7 @@ part.s22 part.s22-1 part.s23 part.s24 part.s24+1 part.s24-1 part.s25,
....
one needs to determine the span. Note that the leftmost numbers in these primitives range from 22 to 25. The span is the count of distinct leftmost numbers taken inclusively, from the lowest through the highest: 22, 23, 24, and 25 -- four values in all. It is computed as (highest - lowest) + 1, that is, (25 - 22) + 1 = 4. If we use an increment of four, each leftmost number is shifted up by four (22 becomes 26, 23 becomes 27, and so on), and we will get the following set of primitives.
one needs to determine the span. Note that the leftmost numbers in these primitives range from 22–25.Thus, as shown in the following expression, the span is four (inclusively). *******NEED FIGURE HERE***** If we use an increment of four, we will get the following set of primitives.
....
+1 -1
View File
@@ -55,7 +55,7 @@ u wgn.s2 + wgn.s2+1 - wgn.s2-1
....
If we wanted to make a second subtraction from wgn.s2--say, for a drain hole in the corner of the wagon--we would name that primitive wgn.s2-2, as shown in <<build_region9>>. We can break this name down as follows: the root name `wgn` identifies the region; `.s2` is the base solid the operation applies to; and the trailing `-2` marks this as the second subtraction from that solid (the first having been `wgn.s2-1`).
If we wanted to make a second subtraction from wgn.s2--say, for a drain hole in the corner of the wagon--we would name that primitive wgn.s2-2 (see Figure F-3). We can break this name down as follows: *****NEED IMAGE HERE*****
[[build_region9]]
.The region and the subtraction primitives.
@@ -49,7 +49,7 @@ set(GALLERY_DEMO_14 [=[masonry_sheetrock|Architecture & structural|exec|masonry|
set(GALLERY_DEMO_15 [=[masonry_brick|Architecture & structural|exec|masonry|-t brick -u in -w 96,48 -n wall|@GLOB@|r.wall.b||ao|masonry wall generator, brick wall type (prototype brick).]=])
set(GALLERY_DEMO_16 [=[masonry_bm|Architecture & structural|exec|masonry|-t bm -u in -w 96,48 -m 0.25 -n wall|@GLOB@|r.wall.b||ao|masonry wall generator, mortar-brick wall type: brick with horizontal and vertical mortar joints.]=])
set(GALLERY_DEMO_17 [=[brickwall|Architecture & structural|tomged|brickwall||@OUT@|g.brick||ao|Builds a brick wall: emits mged commands that create RPP brick solids arranged in rows (with optional mortar slabs between them) to fill a specified wall width and height. Output is a stream of mged commands on stdout, not a .g directly.]=])
set(GALLERY_DEMO_18 [=[mkbuilding|Architecture & structural|exec|mkbuilding|@OUT@|@OUT@|house||ao|Generates a physically dimensioned building with material-separated walls, slabs, framed openings, roof, and optional structural members; JSON, OSM, and CityJSON specifications can produce full building catalogs.]=])
set(GALLERY_DEMO_18 [=[mkbuilding|Architecture & structural|exec|mkbuilding|@OUT@|@OUT@|all||ao|Procedurally builds a small building: a floor slab, four framed walls with openings, and an overhanging roof.]=])
set(GALLERY_DEMO_19 [=[cchannel|Architecture & structural|exec|cchannel|-f @OUT@ -H 0.2|@OUT@|channel.r||ao|Creates a section of fully configurable C-channel (structural metal beam). Default is a 1" diameter by 12" long section of American standard C-channel, here generated with a row of drilled holes.]=])
set(GALLERY_DEMO_20 [=[ringworld|Architecture & structural|exec|ringworld|-o @OUT@|@OUT@|all.g||ao|Generates a "ringworld" as imagined by Larry Niven: a central sun sphere and a large CSG ring (built from three RCCs) orbiting it, combined into a top-level group all.g.]=])
+7 -254
View File
@@ -49,66 +49,7 @@ The following code illustrates a basic use of GCV from within an application. No
.gcv_app.c
[example]
====
[source,c]
----
#include "common.h"
#include "bu/log.h"
#include "bu/mime.h"
#include "gcv.h"
/* Convert the file at 'in_path' to the file at 'out_path', selecting the
* first registered reader and writer filter that match the file types
* inferred from the two path extensions. Returns 0 on success. */
int
convert(const char *in_path, const char *out_path)
{
struct gcv_context context;
const struct gcv_filter *in_filter, *out_filter;
bu_mime_model_t in_type, out_type;
/* Infer the model file types from the filename extensions. */
in_type = (bu_mime_model_t)bu_file_mime(in_path, BU_MIME_MODEL);
out_type = (bu_mime_model_t)bu_file_mime(out_path, BU_MIME_MODEL);
/* A context holds the conversion state, including an in-memory
* database used for the intermediate representation. */
gcv_context_init(&context);
/* Look up a reader for the input type and a writer for the output
* type. find_filter() returns the first matching registered filter,
* or NULL if none is available. */
in_filter = find_filter(GCV_FILTER_READ, in_type, in_path, &context);
out_filter = find_filter(GCV_FILTER_WRITE, out_type, NULL, &context);
if (!in_filter || !out_filter) {
bu_log("No filter available for the requested conversion\n");
gcv_context_destroy(&context);
return 1;
}
/* Read the input into the context's in-memory database. Passing NULL
* for the options selects the defaults from gcv_opts_default(). The
* argc/argv pair would carry any filter-specific option strings.
* gcv_execute() returns 1 on success and 0 on failure. */
if (!gcv_execute(&context, in_filter, NULL, 0, NULL, in_path)) {
bu_log("Read filter '%s' failed for '%s'\n", in_filter->name, in_path);
gcv_context_destroy(&context);
return 1;
}
/* Write the in-memory database out through the selected writer. */
if (!gcv_execute(&context, out_filter, NULL, 0, NULL, out_path)) {
bu_log("Write filter '%s' failed for '%s'\n", out_filter->name, out_path);
gcv_context_destroy(&context);
return 1;
}
gcv_context_destroy(&context);
return 0;
}
----
TODO: embedded code
====
@@ -224,57 +165,7 @@ LIBGCV_ADD_PLUGIN(foo "foo_read.c" "librt;libbu")
.foo_read.c
[example]
====
[source,c]
----
#include "common.h"
#include "bu/log.h"
#include "bu/mime.h"
#include "gcv/api.h"
#include "wdb.h"
/* The reader callback. For a GCV_FILTER_READ filter, 'target' is the
* path of the input file, and geometry should be written into the
* in-memory database reachable through context->dbip. Return 1 on
* success and 0 on failure. */
static int
foo_read(struct gcv_context *context, const struct gcv_opts *gcv_options,
const void *UNUSED(options_data), const char *target)
{
struct rt_wdb *wdbp;
if (gcv_options->verbosity_level)
bu_log("Reading foo file: %s\n", target);
/* Open the context's in-memory database for writing. */
wdbp = wdb_dbopen(context->dbip, RT_WDB_TYPE_DB_INMEM);
mk_id_units(wdbp, "Converted from foo format", "mm");
/* ... parse 'target' and create objects with the wdb (mk_*) API,
* e.g. mk_sph(), mk_bot(), mk_lcomb() ... */
return 1;
}
/* Describe the filter: a unique name, its type, the model type it
* handles, and the callbacks. This reader defines no filter-specific
* options, so the create/free option hooks and data_supported are NULL. */
static const struct gcv_filter gcv_conv_foo_read = {
"FOO Reader", GCV_FILTER_READ, BU_MIME_MODEL_FOO, NULL,
NULL, NULL, foo_read
};
/* A plugin exports a NULL-terminated array of its filters ... */
static const struct gcv_filter * const filters[] = {&gcv_conv_foo_read, NULL};
/* ... referenced by a struct gcv_plugin ... */
static const struct gcv_plugin gcv_plugin_info_s = { filters };
/* ... which libgcv discovers by dlsym()-ing this exported entry point. */
COMPILER_DLLEXPORT const struct gcv_plugin *
gcv_plugin_info(void) { return &gcv_plugin_info_s; }
----
TODO: embedded code
====
@@ -301,89 +192,7 @@ The following example implements a filter that tessellates all geometry into BoT
.tessellation_statistics.c
[example]
====
[source,c]
----
#include "common.h"
#include "bu/log.h"
#include "bu/mime.h"
#include "nmg.h"
#include "rt/geom.h"
#include "raytrace.h"
#include "gcv/api.h"
#include "gcv/util.h"
/* State shared with the region-end callback. */
struct tess_stats {
size_t face_count;
};
/* Invoked once per region by gcv_region_end() after the region's leaf
* meshes have been Boolean-evaluated into a single NMG region 'r'. Here
* we simply tally the outward-facing (OT_SAME) faces. This routine must
* be prepared to run in parallel. */
static void
count_region_faces(struct nmgregion *r, const struct db_full_path *UNUSED(pathp),
struct db_tree_state *UNUSED(tsp), void *client_data)
{
struct tess_stats *stats = (struct tess_stats *)client_data;
struct shell *s;
NMG_CK_REGION(r);
for (BU_LIST_FOR(s, shell, &r->s_hd)) {
struct faceuse *fu;
for (BU_LIST_FOR(fu, faceuse, &s->fu_hd)) {
if (fu->orientation != OT_SAME)
continue;
bu_semaphore_acquire(BU_SEM_GENERAL);
stats->face_count++;
bu_semaphore_release(BU_SEM_GENERAL);
}
}
}
/* A GCV_FILTER_FILTER receives a NULL target and operates on the geometry
* already present in context->dbip. Return 1 on success, 0 on failure. */
static int
tessellation_statistics(struct gcv_context *context, const struct gcv_opts *gcv_options,
const void *UNUSED(options_data), const char *UNUSED(target))
{
struct tess_stats stats = {0};
struct gcv_region_end_data end_data;
struct db_tree_state tree_state;
struct model *the_model = nmg_mm();
/* Configure the tree-walk state: tolerances come from the conversion
* options, and ts_m provides the NMG model used during tessellation. */
RT_DBTS_INIT(&tree_state);
tree_state.ts_tol = &gcv_options->calculational_tolerance;
tree_state.ts_ttol = &gcv_options->tessellation_tolerance;
tree_state.ts_m = &the_model;
/* gcv_region_end() expects its client_data to point at this struct. */
end_data.write_region = count_region_faces;
end_data.vlfree = &rt_vlfree;
end_data.client_data = &stats;
/* Walk every top-level object. Leaves are tessellated to BoTs by
* rt_booltree_leaf_tess(); gcv_region_end() then Boolean-evaluates
* each region and invokes our callback with the result. */
(void)db_walk_tree(context->dbip, (int)gcv_options->num_objects,
(const char **)gcv_options->object_names, 1, &tree_state,
NULL, gcv_region_end, rt_booltree_leaf_tess, &end_data);
bu_log("Total faces after tessellation: %zu\n", stats.face_count);
return 1;
}
static const struct gcv_filter gcv_conv_tess_stats = {
"Tessellation Statistics", GCV_FILTER_FILTER, BU_MIME_MODEL_AUTO, NULL,
NULL, NULL, tessellation_statistics
};
----
TODO: embedded code
====
@@ -441,51 +250,7 @@ The following example will leverage the filter in the above plugin example, `tes
.gcv_embedded.c
[example]
====
[source,c]
----
#include "common.h"
#include "bu/log.h"
#include "bu/mime.h"
#include "gcv.h"
/* Defined in tessellation_statistics.c, above. */
extern const struct gcv_filter gcv_conv_tess_stats;
/* Load the geometry file at 'in_path' into a fresh context, then run the
* tessellation-statistics filter over it. A GCV_FILTER_FILTER operates
* on the geometry already in the context, so its target is NULL.
* Returns 0 on success. */
int
report_tessellation_stats(const char *in_path)
{
struct gcv_context context;
const struct gcv_filter *in_filter;
bu_mime_model_t in_type;
gcv_context_init(&context);
/* Import the input model into the context's in-memory database. */
in_type = (bu_mime_model_t)bu_file_mime(in_path, BU_MIME_MODEL);
in_filter = find_filter(GCV_FILTER_READ, in_type, in_path, &context);
if (!in_filter || !gcv_execute(&context, in_filter, NULL, 0, NULL, in_path)) {
bu_log("Failed to read '%s'\n", in_path);
gcv_context_destroy(&context);
return 1;
}
/* Run the filter; it tallies the faces and reports via bu_log(). */
if (!gcv_execute(&context, &gcv_conv_tess_stats, NULL, 0, NULL, NULL)) {
bu_log("Tessellation-statistics filter failed\n");
gcv_context_destroy(&context);
return 1;
}
gcv_context_destroy(&context);
return 0;
}
----
TODO: embedded code
====
@@ -703,7 +468,7 @@ At this time, the FASTGEN4 writer plugin does not make use of any filter-specifi
|`--constant-ident`
|Specify that the starting ident should remain constant.
|`--material=_code_`
|Specify the material code that will be assigned to all created regions (the default is `0`).
|Specify the material code that will be assigned to all created regions (the default is `1`).
|===
@@ -722,19 +487,7 @@ At this time, the FASTGEN4 writer plugin does not make use of any filter-specifi
=== VRML Reader
The native VRML reader accepts both VRML 1.0 and VRML97/2.0 files. VRML 1.0
imports preserve ordered property state, separator scoping, `DEF`/`USE`
instances, transformations, material colors, analytic cube, cone, cylinder,
and sphere geometry, and indexed polygon meshes. Concave polygons are
triangulated, and per-face material bindings are emitted as separate colored
regions.
VRML constructs that do not have a BRL-CAD equivalent or are not
implemented yet, including cameras, lights, textures, text, line sets,
and point sets, are accepted but do not produce objects. External
content referenced by `WWWInline` is not fetched during conversion.
The VRML reader plugin does not make use of any filter-specific options.
At this time, the VRML reader plugin does not make use of any filter-specific options.
=== VRML Writer
@@ -814,7 +567,7 @@ The Open Asset Import Library (assimp) is an open source library integrated into
|`--constant-ident`
|Specify that the starting ident should remain constant.
|`--material=_code_`
|Specify the material code that will be assigned to all created regions (the default is `0`).
|Specify the material code that will be assigned to all created regions (the default is `1`).
|`--format=_file_fmt_`
|Specify the file format for conversion. By default, this is inferred from the file extension.
|===
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

@@ -1,74 +0,0 @@
= Object-type catalog figure generator
This directory generates the figures used by
`doc/asciidoc/articles/object_types.adoc`. The `objtype_*.png` images in the
parent `images/` directory are a *committed snapshot*: the documentation build
consumes them like any other image, and this generator is the developer tool
that refreshes them from the actual built BRL-CAD tools.
Every pixel of every figure -- the shaded solids, the edge lines, and all the
on-image text -- is produced by BRL-CAD tools. No image-drawing library is
used.
== Pipeline
For each object the generator:
1. probes the object with `rt` (autoview) to learn the view and how much of the
frame the object fills, then picks a `viewsize` so it fills ~80% of the frame;
2. ray traces the shaded solid with `rt` into a disk framebuffer;
3. overlays silhouette + crease edges with `rtedge` (`overlay`,
`detect_distance`, `detect_normals`) so every shape reads clearly;
4. draws the parameter callouts (arrows, vectors, dimensions, labels) with
`fbline` and `fblabel`;
5. grabs the framebuffer to PNG with `fb-png`.
Variety montages render each cell the same way (with a `fblabel` caption burned
in) and then tile the finished cells into a grid.
Python is used only to orchestrate the tools, to project 3D parameter points to
2D pixels (reconstructed from the exact view `rt` reports, so callouts land on
the geometry), and for image I/O (measuring the object extent, tiling montage
cells).
== Files
* `objtype_lib.py` -- tool drivers, the projection/`View` helper, the
framebuffer drawing primitives, and `render` / `render_cell` / `montage`.
* `gen_object_types.py` -- one builder per object type plus a registry.
== Requirements
* A built BRL-CAD (`rt`, `rtedge`, `mged`, `fbline`, `fblabel`, `fb-png`,
`png-pix`, ...).
* Python 3 with `numpy` and `Pillow` (measurement / montage tiling only).
== Usage
[source,bash]
----
BRLCAD_BIN=/path/to/brlcad/bin python gen_object_types.py # rebuild all
BRLCAD_BIN=/path/to/brlcad/bin python gen_object_types.py ell tor # rebuild some
----
If `BRLCAD_BIN` is unset the script looks for a build under `out/build/...` or
`build/` relative to the repository root.
== Platform notes
* The disk framebuffer only behaves at dimensions >= 512, so cells are rendered
at 512 and downsampled.
* A framebuffer device name is always a bare relative name (a `D:\...` path is
misread as `host:port`), and the tools are run with their working directory
set to this scratch directory; data files (`dsp`, `ebm`, `vol`) are likewise
referenced by bare basename.
* `nmg` is a real facetize -n solid, ray traced single-threaded (`-P1`): the
NMG hitmiss freelist (`re_nmgfree`) is a process-global that is not
thread-safe, so parallel shooting races. Two libnmg init fixes
(`src/libnmg/isect.c`, in `nmg_isect_ray_model`) make the single-threaded
path correct.
* `submodel` is a real instanced submodel; a librt path-resolution fix
(`src/librt/primitives/submodel/submodel.c`, `rt_submodel_resolve_path`)
lets it find a relative `file=` next to the parent `.g`.
* `cline` is built with `put` (its tcl keys are `V H R T`).
* Scratch files (`_*`) are temporary and are not committed.
@@ -1,720 +0,0 @@
#!/usr/bin/env python3
"""
Generate every figure used by doc/asciidoc/articles/object_types.adoc.
Each renderable primitive gets:
* objtype_<key>.png - an annotated parameter diagram (the "hero"),
rt-shaded with rtedge silhouette/crease edges,
with parameter callouts drawn by fbline/fblabel
* objtype_<key>_variety.png - a montage of distinct parameterizations
All rendering and all on-image text is produced by BRL-CAD tools (rt, rtedge,
fbline, fblabel); see objtype_lib.py. Output lands in ../ (articles/images).
Usage:
python gen_object_types.py [key ...] # build all, or only the named keys
BRLCAD_BIN=/path/to/bin python gen_object_types.py
"""
import math
import os
import struct
import sys
import objtype_lib as L
from objtype_lib import FG
HERE = os.path.dirname(os.path.abspath(__file__))
IMG = os.path.dirname(HERE) # .../articles/images
def OUT(key):
return os.path.join(IMG, "objtype_%s.png" % key)
def VAR(key):
return os.path.join(IMG, "objtype_%s_variety.png" % key)
def scratch(name):
return os.path.join(HERE, "_%s" % name)
def put_data(name, data):
# Data files are referenced by bare basename and the tools run with cwd in
# this directory (a Windows "D:\..." path is misread as host:port / .\path).
path = scratch(name)
with open(path, "wb") as fh:
fh.write(bytes(data))
return os.path.basename(path)
def fresh(key):
g = scratch("%s.g" % key)
if os.path.exists(g):
os.remove(g)
return g
def add(v, w):
return tuple(a + b for a, b in zip(v, w))
# ---------------------------------------------------------------------------
# generic builders
# ---------------------------------------------------------------------------
def hero(key, gtype, params, anns, az=35, el=25, color=FG, fill=0.80):
g = fresh(key)
L.build(g, gtype, params, color=color)
L.render(g, "r", OUT(key), az=az, el=el, anns=anns, fill=fill)
print("hero", key)
def variety(key, entries, az=35, el=25, cols=None, fill=0.80):
"""entries: (caption, gtype, params) or (caption, gtype, params, color)."""
cells = []
for i, e in enumerate(entries):
cap, gt, pr = e[0], e[1], e[2]
col = e[3] if len(e) > 3 else FG
g = fresh("%s_v%d" % (key, i))
L.build(g, gt, pr, color=col)
png = scratch("%s_v%d.png" % (key, i))
L.render_cell(g, "r", png, size=360, caption=cap, az=az, el=el, fill=fill)
cells.append(png)
L.montage(cells, VAR(key), cols=cols)
print("variety", key)
# ===========================================================================
# Planar-faced
# ===========================================================================
def do_arb8():
pts = [0,0,0, 6,0,0, 6,4,0, 0,4,0, 0,0,3, 6,0,3, 6,4,3, 0,4,3]
def pt(i):
return tuple(pts[3*(i-1):3*i])
anns = [{"t": "pt", "p": pt(i), "label": str(i), "off": (10, -14)}
for i in (2, 3, 4, 5, 6, 7, 8)]
hero("arb8", "arb8", pts, anns)
# The full arb family as real arbs (arb4-arb8). Rotated off-axis so the
# tetrahedron and the others show three faces instead of a flat silhouette.
variety("arb8", [
("arb4 tetrahedron", "arb4", [0,0,0, 5,0,0, 2.5,4.5,0, 2.5,1.8,4]),
("arb5 pyramid", "arb5", [0,0,0, 5,0,0, 5,5,0, 0,5,0, 2.5,2.5,4.5]),
("arb6 prism", "arb6", [0,0,0, 5,0,0, 5,4,0, 0,4,0, 2.5,0,4, 2.5,4,4]),
("arb7", "arb7", [0,0,0, 5,0,0, 5,4,0, 0,4,0, 0,0,3, 5,0,3, 5,4,1.5]),
("arb8 box", "arb8",
[0,0,0, 4,0,0, 4,4,0, 0,4,0, 0,0,4, 4,0,4, 4,4,4, 0,4,4]),
], cols=5, fill=0.70, az=55, el=28)
def do_arbn():
R, Hh = 3.0, 2.2
planes = []
for k in range(6):
a = math.radians(60*k)
planes += [math.cos(a), math.sin(a), 0, R]
planes += [0,0,1, Hh, 0,0,-1, Hh]
params = [8] + planes
hero("arbn", "arbn", params, [
{"t": "seg", "a": (0,0,0), "b": (R,0,0)},
{"t": "pt", "p": (R,0,0), "label": "plane: n, d", "off": (58, -8)},
], az=25, el=32, fill=0.72)
# "hex prism" removed: it duplicates the highlight image above.
variety("arbn", [
("oct prism", "arbn",
[10] + [c for k in range(8)
for c in (math.cos(math.radians(45*k)),
math.sin(math.radians(45*k)), 0, 3)]
+ [0,0,1, 2, 0,0,-1, 2]),
("clipped box", "arbn",
[7, 1,0,0,3, -1,0,0,3, 0,1,0,3, 0,-1,0,3, 0,0,1,3, 0,0,-1,3,
1,1,1,4.2]),
], az=25, el=32, fill=0.70, cols=2)
def do_half():
g = fresh("half")
L.mged_batch(g, [
["in", "sp", "sph", 0,0,0, 3],
["in", "hf", "half", 0,0,1, 0],
["r", "r", "u", "sp", "-", "hf"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("half"), az=35, el=20, anns=[
{"t": "vec", "a": (0,0,0), "b": (0,0,3), "label": "N", "off": (22, 2)},
{"t": "pt", "p": (0,0,0), "label": "d", "off": (-26, -14)},
])
print("hero half")
# ===========================================================================
# Ellipsoids
# ===========================================================================
def do_ell():
V=(0,0,0); A=(5,0,0); B=(0,3,0); C=(0,0,2)
hero("ell", "ell", [*V,*A,*B,*C], [
{"t": "pt", "p": V, "label": "V", "off": (-34, 8)},
{"t": "vec", "a": V, "b": A, "label": "A", "off": (0, 22)},
{"t": "vec", "a": V, "b": B, "label": "B", "off": (16, -2)},
{"t": "vec", "a": V, "b": C, "label": "C", "off": (-14, 0)},
])
# "tri-axial" removed: the highlight image above is already tri-axial.
variety("ell", [
("sphere |A|=|B|=|C|", "ell", [0,0,0, 3,0,0, 0,3,0, 0,0,3]),
("flat disc |C| small", "ell", [0,0,0, 4,0,0, 0,4,0, 0,0,0.6]),
("spike |C| large", "ell", [0,0,0, 0.7,0,0, 0,0.7,0, 0,0,5]),
], cols=3)
def do_sph():
V=(0,0,0); r=3.0
hero("sph", "sph", [*V, r], [
{"t": "pt", "p": V, "label": "V", "off": (-30, 8)},
{"t": "dim", "a": V, "b": (r,0,0), "label": "r", "off": (0, 18)},
])
def do_superell():
V=(0,0,0); A=(3,0,0); B=(0,3,0); C=(0,0,3)
hero("superell", "superell", [*V,*A,*B,*C, 2.5, 2.5], [
{"t": "pt", "p": V, "label": "V", "off": (-32, 8)},
{"t": "vec", "a": V, "b": A, "label": "A", "off": (0, 20)},
{"t": "vec", "a": V, "b": B, "label": "B", "off": (16, -2)},
{"t": "vec", "a": V, "b": C, "label": "C", "off": (-14, 0)},
])
variety("superell", [
("n=e=1 ellipsoid", "superell", [0,0,0,3,0,0,0,3,0,0,0,3, 1,1]),
("n=e=0.4 pinched", "superell", [0,0,0,3,0,0,0,3,0,0,0,3, 0.4,0.4]),
("n=e=2.5 rounded box", "superell", [0,0,0,3,0,0,0,3,0,0,0,3, 2.5,2.5]),
("n=1 e=4 cushion", "superell", [0,0,0,3,0,0,0,3,0,0,0,3, 1.0,4.0]),
])
# ===========================================================================
# Tori
# ===========================================================================
def do_tor():
V=(0,0,0); N=(0,0,1); r1=4.0; r2=1.2
hero("tor", "tor", [*V,*N, r1, r2], [
{"t": "pt", "p": V, "label": "V", "off": (-30, 8)},
{"t": "vec", "a": V, "b": (0,0,2.4), "label": "N", "off": (-20, 6)},
{"t": "dim", "a": V, "b": (r1,0,0), "label": "r1", "off": (0, -26)},
{"t": "dim", "a": (r1,0,0), "b": (r1+r2,0,0), "label": "r2", "off": (34, -12)},
], az=35, el=42)
variety("tor", [
("ring r1 >> r2", "tor", [0,0,0,0,0,1, 4, 0.8]),
("fat torus r1 ~ r2", "tor", [0,0,0,0,0,1, 2.2, 1.8]),
("washer thin", "tor", [0,0,0,0,0,1, 4, 0.35]),
], az=35, el=42)
def do_eto():
V=(0,0,0); N=(0,0,1); r=4.0; C=(1.4,0,1.4); d=0.7
tube = (r, 0, 0) # tube cross-section center (on +x)
# semi-minor axis d: perpendicular to C within the cross-section (x-z) plane
import math as _m
cn = _m.hypot(C[0], C[2])
dperp = (C[2]/cn * d, 0.0, -C[0]/cn * d)
hero("eto", "eto", [*V,*N, r, *C, d], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 8)},
{"t": "vec", "a": V, "b": (0,0,2.6), "label": "N", "off": (-20, 6)},
{"t": "dim", "a": V, "b": tube, "label": "r", "off": (0, -24)},
{"t": "vec", "a": tube, "b": add(tube, C), "label": "C", "off": (22, 0)},
{"t": "vec", "a": tube, "b": add(tube, dperp), "label": "d", "off": (-16, 14)},
], az=35, el=42)
variety("eto", [
("upright ellipse", "eto", [0,0,0,0,0,1, 4, 0,0,1.6, 0.7]),
("tilted ellipse", "eto", [0,0,0,0,0,1, 4, 1.4,0,1.4, 0.6]),
("flat tube", "eto", [0,0,0,0,0,1, 4, 1.8,0,0, 0.5]),
], az=35, el=42)
# ===========================================================================
# Cone / cylinder (TGC family)
# ===========================================================================
def do_tgc():
# a genuine frustum so the top scale factors read clearly
V=(0,0,0); Hh=(0,0,6); A=(2.6,0,0); B=(0,1.7,0); c=0.5; d=0.5
top = (0, 0, 6)
hero("tgc", "tgc", [*V,*Hh,*A,*B, c, d], [
{"t": "pt", "p": V, "label": "V", "off": (-30, 4)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (22, 0)},
{"t": "vec", "a": V, "b": A, "label": "A", "off": (2, -16)},
{"t": "vec", "a": V, "b": B, "label": "B", "off": (18, 2)},
{"t": "vec", "a": top, "b": add(top, (c*2.6, 0, 0)),
"label": "c*A", "off": (2, -16)},
])
variety("tgc", [
("cylinder rcc", "rcc", [0,0,0,0,0,6, 2.2]),
("cone trc", "trc", [0,0,0,0,0,6, 2.4, 0.4]),
("elliptical rec", "rec", [0,0,0,0,0,6, 2.6,0,0, 0,1.3,0]),
("skewed funnel", "tgc", [0,0,0, 1.5,0,6, 2.4,0,0, 0,2.4,0, 0.4,0.9]),
])
def do_rcc():
V=(0,0,0)
hero("rcc", "rcc", [*V, 0,0,6, 2.5], [
{"t": "pt", "p": V, "label": "V", "off": (-30, 0)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "dim", "a": V, "b": (2.5,0,0), "label": "r", "off": (0, 18)},
])
def do_trc():
hero("trc", "trc", [0,0,0, 0,0,6, 2.6, 1.0], [
{"t": "pt", "p": (0,0,0), "label": "V", "off": (-28, 0)},
{"t": "vec", "a": (0,0,0), "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "dim", "a": (0,0,0), "b": (2.6,0,0), "label": "r_base", "off": (0, 16)},
{"t": "dim", "a": (0,0,6), "b": (1.0,0,6), "label": "r_top", "off": (0, 16)},
])
def do_rec():
hero("rec", "rec", [0,0,0, 0,0,6, 2.8,0,0, 0,1.4,0], [
{"t": "pt", "p": (0,0,0), "label": "V", "off": (-26, 0)},
{"t": "vec", "a": (0,0,0), "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "vec", "a": (0,0,0), "b": (2.8,0,0), "label": "A", "off": (2, -14)},
{"t": "vec", "a": (0,0,0), "b": (0,1.4,0), "label": "B", "off": (16, 2)},
])
# ===========================================================================
# Quadric / conic
# ===========================================================================
def do_rpc():
V=(0,0,0)
hero("rpc", "rpc", [*V, 0,0,6, 0,3,0, 1.5], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 6)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "vec", "a": V, "b": (0,3,0), "label": "B", "off": (18, 2)},
{"t": "dim", "a": V, "b": (1.5,0,0), "label": "r", "off": (0, 16)},
])
variety("rpc", [
("tall narrow", "rpc", [0,0,0, 0,0,6, 0,3,0, 0.8]),
("shallow wide", "rpc", [0,0,0, 0,0,6, 0,1.2,0, 2.4]),
("stubby", "rpc", [0,0,0, 0,0,2.5, 0,3,0, 2.0]),
])
def do_rhc():
V=(0,0,0)
hero("rhc", "rhc", [*V, 0,0,6, 0,3,0, 1.5, 1.2], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 6)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "vec", "a": V, "b": (0,3,0), "label": "B", "off": (18, 2)},
{"t": "dim", "a": V, "b": (1.5,0,0), "label": "r", "off": (0, 16)},
])
variety("rhc", [
("sharp small c", "rhc", [0,0,0, 0,0,6, 0,3,0, 1.5, 0.4]),
("blunt large c", "rhc", [0,0,0, 0,0,6, 0,3,0, 1.5, 3.0]),
("wide", "rhc", [0,0,0, 0,0,6, 0,2,0, 3.0, 1.2]),
])
def do_epa():
V=(0,0,0)
hero("epa", "epa", [*V, 0,0,6, 2.5,0,0, 1.5], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 4)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "vec", "a": V, "b": (2.5,0,0), "label": "A", "off": (8, -14)},
])
variety("epa", [
("bullet r1=r2", "epa", [0,0,0, 0,0,6, 2,0,0, 2.0]),
("dish short H", "epa", [0,0,0, 0,0,2, 3,0,0, 3.0]),
("elliptical base", "epa", [0,0,0, 0,0,6, 3,0,0, 1.2]),
])
def do_ehy():
V=(0,0,0)
hero("ehy", "ehy", [*V, 0,0,6, 2.5,0,0, 1.5, 1.0], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 4)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (20, 0)},
{"t": "vec", "a": V, "b": (2.5,0,0), "label": "A", "off": (8, -14)},
])
variety("ehy", [
("horn small c", "ehy", [0,0,0, 0,0,6, 2,0,0, 2.0, 0.4]),
("near-cone large c", "ehy", [0,0,0, 0,0,6, 2,0,0, 2.0, 4.0]),
("elliptical base", "ehy", [0,0,0, 0,0,6, 3,0,0, 1.2, 1.0]),
])
def do_hyp():
V=(0,0,0)
hero("hyp", "hyp", [*V, 0,0,6, 3,0,0, 1.6, 0.4], [
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (24, 0)},
{"t": "vec", "a": V, "b": (3,0,0), "label": "A", "off": (0, 20)},
], az=35, el=15)
# "cooling tower" removed: the highlight above is already the pinched form.
variety("hyp", [
("near-cylinder c=0.9", "hyp", [0,0,0, 0,0,6, 2.4,0,0, 2.4, 0.9]),
("elliptical section", "hyp", [0,0,0, 0,0,6, 3.6,0,0, 0.9, 0.55]),
], az=35, el=15, cols=2)
def do_part():
V=(0,0,0)
hero("part", "part", [*V, 0,0,6, 1.0, 2.0], [
{"t": "pt", "p": V, "label": "V", "off": (-28, 4)},
{"t": "vec", "a": V, "b": (0,0,6), "label": "H", "off": (22, 0)},
{"t": "dim", "a": V, "b": (1.0,0,0), "label": "r_v", "off": (-6, 14)},
{"t": "dim", "a": (0,0,6), "b": (2.0,0,6), "label": "r_h", "off": (0, 16)},
])
variety("part", [
("sphere H->0", "part", [0,0,0, 0,0,0.01, 2.5, 2.5]),
("capsule r_v=r_h", "part", [0,0,0, 0,0,6, 1.5, 1.5]),
("lozenge r_v!=r_h", "part", [0,0,0, 0,0,6, 0.6, 2.2]),
])
def do_hrt():
V=(0,0,0)
hero("hrt", "hrt", [*V, 3,0,0, 0,3,0, 0,0,3, 3.0], [
{"t": "pt", "p": V, "label": "V", "off": (-34, -10)},
{"t": "vec", "a": V, "b": (3,0,0), "label": "xdir", "off": (4, 20)},
{"t": "vec", "a": V, "b": (0,3,0), "label": "ydir", "off": (20, 2)},
{"t": "vec", "a": V, "b": (0,0,3), "label": "zdir", "off": (-18, -2)},
], az=0, el=20)
variety("hrt", [
("d = 2 rounded", "hrt", [0,0,0, 3,0,0, 0,3,0, 0,0,3, 2.0]),
("d = 3 classic", "hrt", [0,0,0, 3,0,0, 0,3,0, 0,0,3, 3.0]),
("d = 4.5 pointed", "hrt", [0,0,0, 3,0,0, 0,3,0, 0,0,3, 4.5]),
], az=0, el=20)
# ===========================================================================
# Implicit
# ===========================================================================
def do_metaball():
pts = [-2.8,-1.4,0, 2.3, 2.8,-1.4,0, 2.3, 0,2.8,0, 2.3]
g = fresh("metaball")
L.build(g, "metaball", [1, 1.0, 3] + pts)
offs = [(-34, -10), (34, -10), (0, 28)]
anns = [{"t": "pt", "p": (pts[4*i], pts[4*i+1], pts[4*i+2]),
"label": "P%d" % (i+1), "off": offs[i]} for i in range(3)]
L.render(g, "r", OUT("metaball"), az=20, el=60, anns=anns)
print("hero metaball")
variety("metaball", [
("far apart", "metaball", [1,1.0,2, -3,0,0,2.5, 3,0,0,2.5]),
("touching", "metaball", [1,1.0,2, -1.6,0,0,2.5, 1.6,0,0,2.5]),
("merged", "metaball", [1,1.0,2, -1.0,0,0,2.5, 1.0,0,0,2.5]),
], az=20, el=60)
# ===========================================================================
# Mesh & procedural
# ===========================================================================
def do_bot():
verts = [1,0,0, -1,0,0, 0,1,0, 0,-1,0, 0,0,1.4, 0,0,-1.4]
faces = [0,2,4, 2,1,4, 1,3,4, 3,0,4, 2,0,5, 1,2,5, 3,1,5, 0,3,5]
g = fresh("bot")
L.build(g, "bot", [6, 8, 2, 2] + verts + faces)
L.render(g, "r", OUT("bot"), az=25, el=25, anns=[
{"t": "pt", "p": (1,0,0), "label": "vertex", "off": (34, 0)},
# point the "triangle" label at a face centroid, not a vertex
{"t": "pt", "p": (1/3.0, 1/3.0, 1.4/3.0), "label": "triangle", "off": (40, -6)},
])
print("hero bot")
# Surface vs solid look identical from outside, so show cutaways: an
# open-topped shell (surface mode -> hollow) beside a corner-cut solid.
cv = [0,0,0, 4,0,0, 4,4,0, 0,4,0, 0,0,4, 4,0,4, 4,4,4, 0,4,4]
top = [4,5,6, 4,6,7]
walls = [0,2,1, 0,3,2, 0,1,5, 0,5,4, 3,7,6, 3,6,2, 0,4,7, 0,7,3, 1,2,6, 1,6,5]
cells = []
gs = fresh("bot_surf")
L.build(gs, "bot", [8, 10, 1, 2] + cv + walls) # mode 1 = surface, open top
ps = scratch("bot_surf.png")
L.render_cell(gs, "r", ps, size=380, caption="surface mode (open shell)",
az=45, el=35, fill=0.74)
cells.append(ps)
gd = fresh("bot_sol")
cutter = [2.4,2.4,2.4, 5,2.4,2.4, 5,5,2.4, 2.4,5,2.4,
2.4,2.4,5, 5,2.4,5, 5,5,5, 2.4,5,5]
L.mged_batch(gd, [
["in", "cube", "bot", 8, 12, 2, 2] + cv + walls + top,
["in", "cut", "arb8"] + cutter,
["r", "r", "u", "cube", "-", "cut"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
pd = scratch("bot_sol.png")
L.render_cell(gd, "r", pd, size=380, caption="solid mode (cut away)",
az=45, el=35, fill=0.74)
cells.append(pd)
L.montage(cells, VAR("bot"), cols=2)
print("variety bot")
def do_ars():
npts, ncrv = 6, 5
rows = []
for j in range(ncrv):
z = j * 1.2
rad = 2.2 * math.sin(math.pi * (j + 0.5) / ncrv) + 0.6
row = []
for i in range(npts):
a = 2*math.pi*i/npts
row += [rad*math.cos(a), rad*math.sin(a), z]
rows.append(row)
flat = [npts, ncrv] + [c for row in rows for c in row]
hero("ars", "ars", flat, [
{"t": "pt", "p": (rows[2][0], rows[2][1], 2.4), "label": "waterline pts",
"off": (40, 0)},
], az=35, el=20)
def do_pipe():
params = [3,
0,0,0, 1.0, 2.0, 1.5,
0,0,4, 1.0, 2.0, 1.5,
4,0,4, 1.0, 2.0, 1.5]
hero("pipe", "pipe", params, [
{"t": "pt", "p": (0,0,0), "label": "pt 1", "off": (-30, 0)},
{"t": "pt", "p": (0,0,4), "label": "pt 2 (bend)", "off": (-40, 10)},
{"t": "pt", "p": (4,0,4), "label": "pt 3", "off": (28, 8)},
], az=35, el=20)
variety("pipe", [
("hollow tube", "pipe", [2, 0,0,0, 1.2,2.4,1.3, 0,0,5, 1.2,2.4,1.3]),
("solid rod", "pipe", [2, 0,0,0, 0,2.0,1.1, 0,0,5, 0,2.0,1.1]),
("tapered", "pipe", [2, 0,0,0, 0,1.0,1.5, 0,0,5, 0,2.6,1.5]),
], az=35, el=20)
def do_pnts():
coords = []
n = 0
for x in range(4):
for y in range(4):
for z in range(4):
coords += [x*1.2, y*1.2, z*1.2]
n += 1
g = fresh("pnts")
L.build(g, "pnts", ["no", n, "no", "no", "no", 0.18] + coords)
L.render(g, "r", OUT("pnts"), az=35, el=25, anns=[])
print("hero pnts")
def do_extrude():
g = fresh("extrude")
L.mged_batch(g, [
["put", "sk", "sketch", "V", "{0 0 0}", "A", "{1 0 0}", "B", "{0 1 0}",
"VL", "{ {0 0} {4 0} {4 1.5} {1.5 1.5} {1.5 4} {0 4} }",
"SL", "{ {line S 0 E 1} {line S 1 E 2} {line S 2 E 3} "
"{line S 3 E 4} {line S 4 E 5} {line S 5 E 0} }"],
["in", "s", "extrude", 0,0,0, 0,0,4, 1,0,0, 0,1,0, "sk"],
["r", "r", "u", "s"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("extrude"), az=35, el=25, anns=[
{"t": "pt", "p": (0,0,0), "label": "V", "off": (-28, 8)},
{"t": "vec", "a": (0,0,0), "b": (0,0,4), "label": "H", "off": (22, 0)},
])
print("hero extrude")
def do_revolve():
g = fresh("revolve")
L.mged_batch(g, [
["put", "pk", "sketch", "V", "{0 0 0}", "A", "{1 0 0}", "B", "{0 1 0}",
"VL", "{ {2 0} {3.5 0} {3 2} {3.5 4} {2 4} }",
"SL", "{ {line S 0 E 1} {line S 1 E 2} {line S 2 E 3} "
"{line S 3 E 4} {line S 4 E 0} }"],
["in", "s", "revolve", 0,0,0, 0,0,1, 1,0,0, 300, "pk"],
["r", "r", "u", "s"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("revolve"), az=35, el=25, anns=[
{"t": "vec", "a": (0,0,0), "b": (0,0,4), "label": "axis", "off": (-26, 4)},
])
print("hero revolve")
def do_dsp():
W = Ht = 48
data = bytearray()
for y in range(Ht):
for x in range(W):
dx = (x-W/2)/(W/4); dy = (y-Ht/2)/(Ht/4)
h = math.exp(-(dx*dx+dy*dy)) \
+ 0.4*math.exp(-(((x-10)/6.0)**2 + ((y-34)/6.0)**2))
data += struct.pack(">H", int(h*45000))
df = put_data("dsp.data", data)
g = fresh("dsp")
L.build(g, "dsp", ["f", df, W, Ht, 1, "a", 1.0, 0.00042])
L.render(g, "r", OUT("dsp"), az=45, el=35, anns=[])
print("hero dsp")
def do_ebm():
W = Ht = 40
data = bytearray()
for y in range(Ht):
for x in range(W):
dx = x-W/2; dy = y-Ht/2
r = math.hypot(dx, dy)
data.append(255 if 7 < r < 15 else 0)
df = put_data("ebm.data", data)
g = fresh("ebm")
L.build(g, "ebm", ["f", df, W, Ht, 14])
L.render(g, "r", OUT("ebm"), az=35, el=45, anns=[])
print("hero ebm")
def do_vol():
W = Ht = D = 24
data = bytearray()
for z in range(D):
for y in range(Ht):
for x in range(W):
dx=x-W/2; dy=y-Ht/2; dz=z-D/2
inside = (dx*dx+dy*dy+dz*dz) < 100 and not (abs(dx)<3 and abs(dy)<3)
data.append(200 if inside else 0)
df = put_data("vol.data", data)
g = fresh("vol")
L.build(g, "vol", ["f", df, W, Ht, D, 128, 255, 0.5, 0.5, 0.5])
L.render(g, "r", OUT("vol"), az=35, el=30, anns=[])
print("hero vol")
def do_nmg():
# A real n-Manifold Geometry solid (facetize -n). NMG ray tracing uses a
# global hitmiss freelist that is not thread-safe, so shoot single-threaded
# (-P1) to avoid the race; the shaded result is a genuine NMG.
g = fresh("nmg")
L.mged_batch(g, [
["in", "src", "ell", 0,0,0, 3,0,0, 0,2,0, 0,0,2],
["facetize", "-n", "s", "src"],
["r", "r", "u", "s"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("nmg"), az=35, el=25, anns=[], extra=["-P1"], hyper=2)
print("hero nmg")
def do_brep():
g = fresh("brep")
L.mged_batch(g, [
["in", "src", "ell", 0,0,0, 3,0,0, 0,2,0, 0,0,2],
["brep", "src", "brep", "s"],
["r", "r", "u", "s"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("brep"), az=35, el=25, anns=[])
print("hero brep")
def do_cline():
g = fresh("cline")
L.mged_batch(g, [
["put", "c", "cline", "V", "{0 0 0}", "H", "{0 0 8}", "R", "1.5", "T", "0.4"],
["r", "r", "u", "c"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("cline"), az=35, el=20, anns=[
{"t": "pt", "p": (0,0,0), "label": "V", "off": (-28, 6)},
{"t": "vec", "a": (0,0,0), "b": (0,0,8), "label": "H", "off": (20, 0)},
{"t": "dim", "a": (0,0,0), "b": (1.5,0,0), "label": "R", "off": (0, 16)},
])
print("hero cline")
def do_submodel():
# A real submodel: instance the treetop "widget" from a separate .g file as
# a single primitive. (The relative-path resolver bug is fixed in librt.)
parts = fresh("parts")
partsname = os.path.basename(parts) # referenced relative to cwd
L.mged_batch(parts, [
["in", "hub", "sph", 0,0,0, 1.6],
["in", "arm1", "rcc", 0,0,0, 4,0,0, 0.7],
["in", "arm2", "rcc", 0,0,0, 0,4,0, 0.7],
["in", "arm3", "rcc", 0,0,0, 0,0,4, 0.7],
["in", "cap1", "sph", 4,0,0, 1.0],
["in", "cap2", "sph", 0,4,0, 1.0],
["in", "cap3", "sph", 0,0,4, 1.0],
["r", "widget", "u", "hub", "u", "arm1", "u", "arm2", "u", "arm3",
"u", "cap1", "u", "cap2", "u", "cap3"],
["mater", "widget", "plastic", FG[0], FG[1], FG[2], 0],
])
g = fresh("submodel")
L.mged_batch(g, [
["in", "sm", "submodel", "widget", "0", partsname],
["r", "r", "u", "sm"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0],
])
L.render(g, "r", OUT("submodel"), az=35, el=25, anns=[])
print("hero submodel")
# ===========================================================================
# Boolean combinations
# ===========================================================================
def do_comb():
spheres = [["in", "a", "sph", -1,0,0, 2.6], ["in", "b", "sph", 1.4,0,0, 2.0]]
ops = [("u", "union a u b"),
("-", "difference a - b"),
("+", "intersection a + b")]
# One shared view (from the union, the largest result) so all three panels
# are at the same scale and the spheres line up across them.
gu = fresh("comb_u")
L.mged_batch(gu, spheres + [["r", "r", "u", "a", "u", "b"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0]])
orient, autosize, model, frac = L.probe(gu, "r", az=35, el=20)
C = ((model[0]+model[1])/2, (model[2]+model[3])/2, (model[4]+model[5])/2)
V = autosize * frac / 0.72
view = (orient, L.eye_for(C, 35, 20, V*3), V)
cells = []
for i, (op, cap) in enumerate(ops):
g = fresh("comb_%d" % i)
L.mged_batch(g, spheres + [["r", "r", "u", "a", op, "b"],
["mater", "r", "plastic", FG[0], FG[1], FG[2], 0]])
png = scratch("comb_%d.png" % i)
L.render_cell(g, "r", png, size=380, caption=cap, view=view)
cells.append(png)
L.montage(cells, VAR("comb"), cols=3)
print("comb done")
# ===========================================================================
# registry
# ===========================================================================
OBJECTS = {
"arb8": do_arb8, "arbn": do_arbn, "half": do_half,
"ell": do_ell, "sph": do_sph, "superell": do_superell,
"tor": do_tor, "eto": do_eto,
"tgc": do_tgc, "rcc": do_rcc, "trc": do_trc, "rec": do_rec,
"rpc": do_rpc, "rhc": do_rhc, "epa": do_epa, "ehy": do_ehy, "hyp": do_hyp,
"part": do_part, "hrt": do_hrt, "metaball": do_metaball,
"bot": do_bot, "ars": do_ars, "pipe": do_pipe, "pnts": do_pnts,
"extrude": do_extrude, "revolve": do_revolve,
"dsp": do_dsp, "ebm": do_ebm, "vol": do_vol,
"nmg": do_nmg, "brep": do_brep, "cline": do_cline, "submodel": do_submodel,
"comb": do_comb,
}
def main():
keys = sys.argv[1:] or list(OBJECTS.keys())
for k in keys:
if k not in OBJECTS:
print("unknown:", k)
continue
try:
OBJECTS[k]()
except Exception as e:
print("FAILED", k, "->", e)
if __name__ == "__main__":
main()
@@ -1,459 +0,0 @@
#!/usr/bin/env python3
"""
Shared helpers for the BRL-CAD object-type catalog image generator.
Everything visual is produced with BRL-CAD's own tools:
* ``rt`` ray traces the shaded solid into a disk framebuffer,
* ``rtedge`` overlays silhouette + crease edges onto the same framebuffer
(so every shape reads clearly), and
* ``fbline`` / ``fblabel`` / ``pix-fb`` draw the parameter callouts and
assemble the variety montages,
* ``fb-png`` grabs the finished framebuffer to a PNG.
Python is used only to orchestrate those tools, to size each view so the
object fills the frame, and to project 3D parameter points to 2D pixels. The
projection is reconstructed from the exact view ``rt`` reports (orientation,
size, model bounds), so callouts land precisely on the rendered geometry.
No image-drawing libraries (matplotlib, PIL drawing, ...) are used; PIL is used
only to measure the rendered object's extent so the view can be fit to it.
"""
import os
import re
import subprocess
import sys
import numpy as np
# ----------------------------------------------------------------------------
# Tool discovery
# ----------------------------------------------------------------------------
def find_bin():
env = os.environ.get("BRLCAD_BIN")
if env and os.path.isdir(env):
return env
here = os.path.dirname(os.path.abspath(__file__))
root = os.path.abspath(os.path.join(here, "..", "..", "..", "..", ".."))
for c in (os.path.join(root, "out", "build", "x64-Debug", "bin"),
os.path.join(root, "out", "build", "x64-Release", "bin"),
os.path.join(root, "build", "bin")):
if os.path.isdir(c) and (os.path.exists(os.path.join(c, "rt.exe"))
or os.path.exists(os.path.join(c, "rt"))):
return c
raise RuntimeError("Could not find BRL-CAD bin dir; set BRLCAD_BIN")
BIN = find_bin()
def _exe(name):
for ext in (".exe", ""):
p = os.path.join(BIN, name + ext)
if os.path.exists(p):
return p
return os.path.join(BIN, name)
def _cwd(gfile):
return os.path.dirname(os.path.abspath(gfile)) or None
# ----------------------------------------------------------------------------
# Palette
# ----------------------------------------------------------------------------
BG = (236, 238, 242) # panel background
FG = (95, 140, 205) # default object color
EDGE = (28, 30, 34) # rtedge line color
ACCENT = (214, 82, 28) # vector / dimension arrows
VERTEX = (196, 28, 28) # defining points
INK = (20, 20, 20) # label text
_CHARW = 17.7 # measured nonie.r.12 glyph advance (px)
def _c(rgb):
return "%d/%d/%d" % (rgb[0], rgb[1], rgb[2])
# ----------------------------------------------------------------------------
# mged drivers
# ----------------------------------------------------------------------------
def mged(gfile, *args):
cmd = [_exe("mged"), "-c", gfile] + [str(a) for a in args]
return subprocess.run(cmd, capture_output=True, text=True, cwd=_cwd(gfile))
def mged_batch(gfile, cmds):
script = "\n".join(" ".join(str(a) for a in c) for c in cmds) + "\nquit\n"
return subprocess.run([_exe("mged"), "-c", gfile], input=script,
capture_output=True, text=True, cwd=_cwd(gfile))
def make_in(gfile, name, gtype, params):
return mged(gfile, "in", name, gtype, *[str(x) for x in params])
def build(gfile, gtype, params, color=None, region="r", solid="s"):
"""Create a solid and wrap it in a colored region, in one mged process."""
color = color or FG
mged_batch(gfile, [
["in", solid, gtype] + [str(x) for x in params],
["r", region, "u", solid],
["mater", region, "plastic", color[0], color[1], color[2], 0],
])
# ----------------------------------------------------------------------------
# View parsing + projection
# ----------------------------------------------------------------------------
_re_orient = re.compile(r"Orientation:\s*([-\d.eE]+),\s*([-\d.eE]+),\s*([-\d.eE]+),\s*([-\d.eE]+)")
_re_size = re.compile(r"Size:\s*([-\d.eE]+)")
_re_model = re.compile(r"Model:\s*X\(([-\d.eE]+),\s*([-\d.eE]+)\),\s*Y\(([-\d.eE]+),\s*([-\d.eE]+)\),\s*Z\(([-\d.eE]+),\s*([-\d.eE]+)\)")
class View:
"""Maps model coordinates to final image pixels (top-left origin)."""
def __init__(self, orient, size, model, w, h):
x, y, z, wq = orient
n = np.sqrt(x*x + y*y + z*z + wq*wq) or 1.0
x, y, z, wq = x/n, y/n, z/n, wq/n
R = np.array([
[1-2*(y*y+z*z), 2*(x*y-wq*z), 2*(x*z+wq*y)],
[2*(x*y+wq*z), 1-2*(x*x+z*z), 2*(y*z-wq*x)],
[2*(x*z-wq*y), 2*(y*z+wq*x), 1-2*(x*x+y*y)],
])
self.R = R.T # rt reports view->model; we need model->view
self.size = size
xmn, xmx, ymn, ymx, zmn, zmx = model
self.center = np.array([(xmn+xmx)/2, (ymn+ymx)/2, (zmn+zmx)/2])
self.w, self.h = w, h
def project(self, P):
v = self.R @ (np.asarray(P, float) - self.center)
px = (v[0] / self.size + 0.5) * self.w
py = (0.5 - v[1] / self.size) * self.h
return px, py
def _parse_view(err, w, h):
mo, ms, mm = _re_orient.search(err), _re_size.search(err), _re_model.search(err)
if not (mo and ms and mm):
sys.stderr.write(err + "\n")
raise RuntimeError("rt did not report a view")
return (tuple(float(g) for g in mo.groups()),
float(ms.group(1)),
tuple(float(g) for g in mm.groups()))
# ----------------------------------------------------------------------------
# Framebuffer primitives (all via BRL-CAD tools)
# ----------------------------------------------------------------------------
# IMPORTANT: libfb reads a framebuffer name containing ":" (e.g. a Windows
# "D:\..." path) as host:port and tries to open a *network* framebuffer. So
# every framebuffer device below is a bare relative name and the tool is run
# with its cwd set to the directory that holds it.
def _run(cmd, cwd=None, timeout=25, retries=3):
"""Run a tool, killing and retrying if it hangs.
The tiny framebuffer tools (fbline/fblabel/fb-png/...) occasionally hang on
Windows (a virus scanner touching the frequently-rewritten .fb file); a
bounded timeout + retry keeps a single stuck call from stalling the whole
render. rt/rtedge pass a larger timeout for slow (e.g. -P1 NMG) shots.
"""
last = None
for _ in range(retries):
try:
return subprocess.run(cmd, capture_output=True, text=True,
cwd=cwd, timeout=timeout)
except subprocess.TimeoutExpired as e:
last = e
continue
sys.stderr.write("timed out after %d tries: %s\n" % (retries, cmd[0]))
return subprocess.CompletedProcess(cmd, 1, "", str(last))
def _prepare_out(path):
"""Ensure `path` is writable (clear a stale read-only attribute) so tools
can overwrite it, then remove it so a fresh file is created."""
import stat
if os.path.exists(path):
try:
os.chmod(path, stat.S_IWRITE | stat.S_IREAD)
os.remove(path)
except OSError:
pass
def fbclear(fb, size, rgb, cwd):
_run([_exe("fbclear"), "-F", fb, "-w", str(size), "-n", str(size),
str(rgb[0]), str(rgb[1]), str(rgb[2])], cwd=cwd)
def fbline(fb, size, x0, y0, x1, y1, rgb, cwd):
# framebuffer origin is bottom-left; caller supplies top-left pixels
y0 = size - 1 - y0
y1 = size - 1 - y1
_run([_exe("fbline"), "-F", fb, "-W", str(size), "-N", str(size),
"-r", str(rgb[0]), "-g", str(rgb[1]), "-b", str(rgb[2]),
str(int(round(x0))), str(int(round(y0))),
str(int(round(x1))), str(int(round(y1)))], cwd=cwd)
def fblabel(fb, size, x, y, text, rgb, cwd):
y = size - 1 - y
_run([_exe("fblabel"), "-F", fb, "-W", str(size), "-N", str(size),
"-C", _c(rgb), str(int(round(x))), str(int(round(y))), text], cwd=cwd)
def _white_block(path, w, h, rgb):
with open(path, "wb") as fh:
fh.write(bytes(rgb) * (w * h))
def fb_png(fb, size, out, cwd):
_run([_exe("fb-png"), "-F", fb, "-w", str(size), "-n", str(size), out], cwd=cwd)
def fb_pix(fb, size, out, cwd):
_run([_exe("fb-pix"), "-F", fb, "-w", str(size), "-n", str(size), out], cwd=cwd)
# ----------------------------------------------------------------------------
# Object measurement (fit view to object)
# ----------------------------------------------------------------------------
def _object_fraction(png, bg):
"""max(width, height) of the non-background region, as a fraction of frame."""
from PIL import Image
im = np.asarray(Image.open(png).convert("RGB")).astype(int)
diff = np.abs(im - np.array(bg)).sum(2)
mask = diff > 24
if not mask.any():
return 1.0
ys, xs = np.where(mask)
fw = (xs.max() - xs.min() + 1) / im.shape[1]
fh = (ys.max() - ys.min() + 1) / im.shape[0]
return max(fw, fh)
# ----------------------------------------------------------------------------
# Annotation drawing
# ----------------------------------------------------------------------------
def _arrow(fb, size, a, b, rgb, cwd, head=True):
ax, ay = a
bx, by = b
fbline(fb, size, ax, ay, bx, by, rgb, cwd)
if head:
dx, dy = bx - ax, by - ay
L = (dx*dx + dy*dy) ** 0.5 or 1.0
dx, dy = dx / L, dy / L
hl = max(9, size * 0.02)
for ang in (2.618, -2.618): # +/-150 deg
ca, sa = np.cos(ang), np.sin(ang)
hx = bx + hl * (dx * ca - dy * sa)
hy = by + hl * (dx * sa + dy * ca)
fbline(fb, size, bx, by, hx, hy, rgb, cwd)
def _marker(fb, size, p, rgb, cwd):
x, y = p
r = max(4, int(size * 0.009)) # small cross (2 fb calls)
fbline(fb, size, x - r, y, x + r, y, rgb, cwd)
fbline(fb, size, x, y - r, x, y + r, rgb, cwd)
_HALO = (248, 249, 251)
def _label(fb, size, cwd, x, y, text, rgb):
"""Text with a light halo so it reads on light or dark areas.
Drawn as several offset copies in the halo color, then the text on top;
this avoids the disk-framebuffer quirks of clear-color and image blits.
"""
lx, ly = int(x), int(y)
for dx, dy in ((-2, -2), (2, 2)): # light halo, few draws
fblabel(fb, size, lx + dx, ly + dy, text, _HALO, cwd)
fblabel(fb, size, lx, ly, text, rgb, cwd)
def _draw_annotations(fb, size, view, anns, cwd):
for a in anns:
t = a["t"]
if t == "pt":
p = view.project(a["p"])
_marker(fb, size, p, VERTEX, cwd)
if a.get("label"):
off = a.get("off", (10, -18))
_label(fb, size, cwd, p[0] + off[0], p[1] + off[1],
a["label"], INK)
elif t in ("vec", "dim", "seg"):
pa = view.project(a["a"])
pb = view.project(a["b"])
if t == "seg":
fbline(fb, size, pa[0], pa[1], pb[0], pb[1], ACCENT, cwd)
elif t == "dim":
_arrow(fb, size, pb, pa, ACCENT, cwd)
_arrow(fb, size, pa, pb, ACCENT, cwd)
else:
_arrow(fb, size, pa, pb, ACCENT, cwd)
if a.get("label"):
off = a.get("off", (10, -16))
mx = (pa[0] + pb[0]) / 2 + off[0]
my = (pa[1] + pb[1]) / 2 + off[1]
_label(fb, size, cwd, mx, my, a["label"], ACCENT)
# ----------------------------------------------------------------------------
# The rendering entry point
# ----------------------------------------------------------------------------
def probe(gfile, obj, az=35, el=25, ambient=0.42, extra=None):
"""Autoview probe: returns (orientation, autosize, model_bbox, fill_fraction)."""
scratch_dir = _cwd(gfile)
gname = os.path.basename(gfile)
pn = os.path.splitext(gname)[0] + ".pr.png"
p = _run([_exe("rt"), "-o", pn, "-w", "220", "-n", "220", "-C", _c(BG),
"-A", str(ambient), "-a", str(az), "-e", str(el)]
+ (extra or []) + [gname, obj], cwd=scratch_dir, timeout=90)
orient, autosize, model = _parse_view(p.stderr + p.stdout, 220, 220)
frac = _object_fraction(os.path.join(scratch_dir, pn), BG)
try:
os.remove(os.path.join(scratch_dir, pn))
except OSError:
pass
return orient, autosize, model, frac
def eye_for(center, az, el, dist):
"""Eye point that looks at `center` from the given az/el at `dist` mm."""
import math
a, e = math.radians(az), math.radians(el)
d = (math.cos(e)*math.cos(a), math.cos(e)*math.sin(a), math.sin(e))
return (center[0]+d[0]*dist, center[1]+d[1]*dist, center[2]+d[2]*dist)
def render(gfile, obj, out_png, size=600, az=35, el=25, fill=0.82,
color=FG, anns=None, hyper=2, ambient=0.42, edge=EDGE, caption=None,
view=None, extra=None):
"""Shaded rt render + rtedge overlay + parameter callouts.
If `view` = (orientation, eye_pt, viewsize) is given, that exact view is
used (so several images can share one frame -- e.g. the Boolean montage);
otherwise the object is probed and a viewsize chosen to fill `fill` of the
frame. Callouts require the probe path (they need the projection).
`extra` is a list of extra flags passed to rt and rtedge (e.g. ["-P1"] to
force single-threaded shooting -- the NMG hitmiss freelist is a global that
is not thread-safe).
"""
extra = extra or []
scratch_dir = _cwd(gfile)
gname = os.path.basename(gfile)
gbase = os.path.splitext(gname)[0] # unique per object -> parallel-safe
fb = gbase + ".render.fb"
vobj = None
if view is not None:
orient, eye, viewsize = view
common = ["-w", str(size), "-n", str(size),
"-c", "orientation %g %g %g %g" % tuple(orient),
"-c", "eye_pt %g %g %g" % tuple(eye),
"-c", "viewsize %g" % viewsize]
else:
orient, autosize, model, frac = probe(gfile, obj, az, el, ambient, extra)
viewsize = autosize * frac / fill
vobj = View(orient, viewsize, model, size, size)
common = ["-w", str(size), "-n", str(size), "-a", str(az), "-e", str(el),
"-c", "viewsize %g" % viewsize]
# shaded render into a pre-sized disk framebuffer
fbclear(fb, size, BG, scratch_dir)
_run([_exe("rt"), "-F", fb] + common + extra + ["-C", _c(BG),
"-A", str(ambient), "-H", str(hyper), gname, obj],
cwd=scratch_dir, timeout=90)
# overlay silhouette + crease edges (both sides, antialiased)
_run([_exe("rtedge"), "-F", fb] + common + extra + [
"-c", "set overlay=1", "-c", "set detect_distance=1",
"-c", "set detect_normals=1", "-c", "set both_sides=1",
"-c", "set antialias=1", "-c", "set fg=%s" % _c(edge),
gname, obj], cwd=scratch_dir, timeout=90)
# parameter callouts
if anns and vobj is not None:
_draw_annotations(fb, size, vobj, anns, scratch_dir)
if caption:
cx = int(size / 2 - len(caption) * (_CHARW / 2.0))
_label(fb, size, scratch_dir, cx, size - 20, caption, INK)
_prepare_out(out_png)
fb_png(fb, size, out_png, scratch_dir)
fp = os.path.join(scratch_dir, fb)
if os.path.exists(fp):
os.remove(fp)
return vobj
def render_cell(gfile, obj, out_png, size=360, caption=None, az=35, el=25,
fill=0.82, color=FG, hyper=2, ambient=0.42, view=None, extra=None):
"""Render one montage cell (shaded + edges + burned-in caption) to a PNG.
Rendered at 512 (the disk framebuffer only behaves at >= 512), with the
caption drawn on the framebuffer, then downsampled to `size`.
"""
scratch_dir = _cwd(gfile)
tmp_png = os.path.basename(out_png) + ".r.png"
render(gfile, obj, os.path.join(scratch_dir, tmp_png), size=512,
az=az, el=el, fill=fill, anns=None, hyper=hyper, ambient=ambient,
caption=caption, view=view, extra=extra)
from PIL import Image
im = Image.open(os.path.join(scratch_dir, tmp_png)).convert("RGB")
im.load()
_prepare_out(out_png)
im.resize((size, size), Image.LANCZOS).save(out_png)
im.close()
try:
os.remove(os.path.join(scratch_dir, tmp_png))
except OSError:
pass
def montage(cell_pngs, out_png, cell=360, gap=18, cols=None):
"""Tile captioned cell PNGs (rendered + labelled by BRL-CAD) into a grid.
This is pure image layout (PIL paste): every pixel of every cell, including
its caption, was produced by rt/rtedge/fblabel above.
"""
from PIL import Image
n = len(cell_pngs)
if cols is None:
cols = n if n <= 4 else (n + 1) // 2
rows = (n + cols - 1) // cols
W = cols * cell + (cols + 1) * gap
H = rows * cell + (rows + 1) * gap
canvas = Image.new("RGB", (W, H), BG)
for i, p in enumerate(cell_pngs):
r, c = divmod(i, cols)
im = Image.open(p).convert("RGB")
im.load()
if im.size != (cell, cell):
im = im.resize((cell, cell), Image.LANCZOS)
canvas.paste(im, (gap + c * (cell + gap), gap + r * (cell + gap)))
im.close()
_prepare_out(out_png)
canvas.save(out_png)
if __name__ == "__main__":
print("BIN =", BIN)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 44 KiB

+8 -24
View File
@@ -2452,13 +2452,13 @@ mged> bev -t triangulated_lens sphere1 + sphere2
– Create a triangulated object by intersecting objects _sphere1_ and _sphere2._
*bo*_[-o|-i pattern [h|n]type] dest source_
*bo*_[-o|-i pattern type] dest source_
The “bo” command is used to create or retrieve binary opaque objects. One of _-i_ or _-o_ must be specified.
The _-o_ option “outputs” or extracts a binary object from the database object _source_ to a host-order file called _dest_.
The _-o_ option “outputs” or extracts a binary object from the database object _source_ to a file called _dest_.
The _-i_ option “inputs” or imports a file called _source_ into a binary object called _dest_ in the database. There are two additional arguments that must be specified with the _-i_ option: pattern and type. Currently, only uniform binary objects (arrays of values) are supported. As a result, the _pattern_ is always _u_ for “uniform” pattern. Input defaults to host byte order. An `h` or `n` prefix on _type_ explicitly selects host or network byte order. The base _type_ can be one of the following:
The _-i_ option “inputs” or imports a file called _source_ into a binary object called _dest_ in the database. There are two additional arguments that must be specified with the _-i_ option: pattern and type. Currently, only uniform binary objects (arrays of values) are supported. As a result, the _pattern_ is always _u_ for “uniform” pattern. The _type_ can be one of the following:
_f_-> float
@@ -2482,14 +2482,10 @@ _L_-> unsigned long (64 bit)
Examples:
`mged>` *bo -i u c cmds /usr/brlcad/html/manuals/mged/mged_cmds.html*
`mged>` *bo -i -u c cmds /usr/brlcad/html/manuals/mged/mged_cmds.html*
– Create an opaque uniform binary object of characters with the name _cmds_ that contains the contents of the file __/usr/brlcad/html/manuals/mged/mged_cmds.html.__
`mged>` *bo -i u nS dsp.data terrain.dsp*
– Import a standard network-order DSP data file as an unsigned-short binary object named _dsp.data_.
`mged>` *bo -o /home/jim/cmds.html cmds*
– Copy the contents of the binary object named _cmds_ into the file named _/home/jim/cmds.html._
@@ -4318,8 +4314,8 @@ mged> nmg_simplify poly shapea.poly shapea.nmg
**
oed path_lhs [path_rhs]::
The “oed” command places MGED directly into matrix edit mode. With one path, __path_lhs__ is the complete path to the object being edited; the matrix immediately above its final component is selected and the object's bounding-box center is used as the keypoint. With two paths, __path_rhs__ must end in a primitive shape, and __path_lhs__ must identify a combination containing the first component of __path_rhs__. The matrix between the final component of __path_lhs__ and the first component of __path_rhs__ is selected, and the final primitive in __path_rhs__ supplies the keypoint. The selected object path must currently be displayed in MGED.
oed path_lhs path_rhs::
The “oed” command places MGED directly into the matrix edit mode. The __path_rhs__ must be a path to a primitive shape, and __path_lhs__ must be a path to a combination that includes the first component of __path_rhs__ as one of its members. Also, path_rhs/path_lhs must be a path that is currently displayed in mged. The edited matrix will be the matrix in the final component of __path_lhs__ that corresponds to the first component of __path_rhs__. The last component in __path_rhs__ is used as the reference shape during object editing.
Examples:::
@@ -4329,12 +4325,6 @@ mged> oed group1/group2 region1/shapea
– Place MGED into matrix edit mode, editing the matrix in _group2_ that corresponds to _region1_, using _shapea_ as the reference shape.
mged> oed group1/group2/region1
– Place MGED into matrix edit mode for _region1_, using the center of its bounding box as the keypoint.
**
@@ -6433,18 +6423,12 @@ mged *rset r draw 1* – Draw rubber band.
mged *rset ax*
Axes model_draw=0 model_size=500 model_linewidth=1 model_pos=0,0,0 model_tick_enable=0 model_tick_interval=100 model_ticks_per_major=10 model_tick_length=4 model_tick_major_length=8 model_tick_threshold=8 view_draw=0 view_size=500 view_linewidth=1 view_pos=0,0 edit_draw=0 edit_size1=500 edit_size2=500 edit_linewidth1=1 edit_linewidth2=1.
Axes model_draw=0 model_size=500 model_linewidth=1 model_pos=0,0,0 view_draw=0 view_size=500 view_linewidth=1 view_pos=0,0 edit_draw=0 edit_size1=500 edit_size2=500 edit_linewidth1=1 edit_linewidth2=1.
–Prints the values of the axes
mged *rset ax model_size* – Get size of model axes 500.
mged *rset ax model_tick_enable* – Enable (1) or disable (0) a ticked scale
along the model axes. The tick spacing is set with *rset ax
model_tick_interval* (in mm), with a major tick every *rset ax
model_ticks_per_major* ticks. This gives a measurable scale in the target
coordinate system.
**
@@ -6959,7 +6943,7 @@ A <<REGION,region>> may be assigned an integer _material code_ by the user. This
*matrix edit mode*
This is the mode that <<mged,_mged_>> is in while editing a transformation matrix in a <<COMBINATION,combination>>. It is characterized by the illumination of one object in the graphics window, and the appearance of matrix editing selections in the _Edit_ menu. This mode may be entered through the _Matrix Selection.._ entry of the _Edit_ menu, or via the <<oed,_oed_>> command. Editing operations such as rotation, translation, and scale may be performed in this mode and will affect all objects below the edited matrix in the <<tree,tree>>. These operations are applied relative to a keypoint obtained from a key solid, an object's bounding-box center, or an explicit *keypoint* command.
This is the mode that <<mged,_mged_>> is in while editing a transformation matrix in a <<COMBINATION,combination>>. It is characterized by the illumination of one object in the graphics window, and the appearance of matrix editing selections in the _Edit_ menu. This mode may be entered through the _Matrix Selection.._ entry of the _Edit_ menu, or via the <<oed,_oed_>> command. Editing operations such as rotation, translation, and scale may be performed in this mode and will affect all objects below the edited matrix in the <<tree,tree>>. These operations will be applied in reference to a key solid that is a leaf of that tree.
*member*
File diff suppressed because it is too large Load Diff
+11 -41
View File
@@ -12,17 +12,9 @@ The syntax of *oed* is fairly straightforward: footnote:[Note: _lhs_ is an abbre
[source]
----
oed {path_lhs} [{path_rhs}]
oed {path_lhs} {path_rhs}
----
When only __path_lhs__ is specified, it is the complete path to the
object being edited. The matrix immediately above its final component is
selected, and the center of that object's bounding box is used as the
editing keypoint. When __path_rhs__ is also specified, the two paths are
joined conceptually: the matrix between the final component of
__path_lhs__ and the first component of __path_rhs__ is selected, and the
primitive at the end of __path_rhs__ supplies the keypoint.
*oed* serves primarily to make working with combinations and regions practical when there are large numbers of primitives involved. It is of course possible to move primitives one by one to desired locations, but the process is extremely tedious for any non-trivial combination of primitives and the result is inflexible - for example,if the modeler wished to return the primitives in a combination to their original position after moving them _as primitives_ the process of moving them would need to be reversed one by one as well. Barring being able to do everything perfectly the first time, individual primitive placement is impractical.
The notion of _path_ in this context refers to the tree of objects that traditionally makes up a CSG model. Primitives will be combined with other primitives to make groups of objects, and the "path" to any individual shape within the combinations is described by the series of nodes in the tree that identify the object of interest. For example, take a simple model of a lollipop:
@@ -65,22 +57,14 @@ In the "file system" of a BRL-CAD object combinations can hold combinations, reg
....
To operate on this combination without choosing a primitive keypoint, use
the complete object path as the single argument:
Note that if we wish to operate on this combination it is not enough to specify /lollipop/outer-candy-shell.r for the lhs and outer-candy-sphere.c for the rhs - _combinations and regions do not themselves have default control points._ In other words, if you want to rotate a combination there must be a point around which that rotation occurs - a combination will have no default point assigned. This is the reason the rhs must always end with a primitive - even though the intent is not to edit the primitive, information necessary for most operations on the combination will use information (such as default keypoint settings) that the primitive _does_ have. So,
....
oed /lollipop/outer-candy-shell.r/outer-candy-sphere.c
oed /lollipop/outer-candy-shell.r outer-candy-sphere.c
....
This form uses the center of the bounding box of
__outer-candy-sphere.c__ as the keypoint. To use a primitive's default
keypoint instead, split the path at the matrix to edit and supply a right
hand path ending in that primitive. For example, any of the following
selects the matrix between __outer-candy-shell.r__ and
__outer-candy-sphere.c__ while obtaining the keypoint from a different
primitive:
is not enough. Either
....
@@ -102,10 +86,7 @@ or
oed /lollipop/outer-candy-shell.r outer-candy-sphere.c/stick.s
....
Because they are primitives in the outer-candy-sphere.c combination,
outer-candy-sphere.s, core.s and stick.s are all legal reference shapes -
there will be illustrations later of the consequences of different
primitive choices.
is needed to have *oed* actually enter edit mode on lollipop's outer-candy-sphere.c. Because they are primitives in the outer-candy-sphere.c combination, outer-candy-sphere.s, core.s and stick.s are all legal - there will be illustrations later of the consequences of different primitive choices.
To demonstrate basic *oed* behavior an example is in order. footnote:[Bear in mind that these examples will be using very basic primitives for the sake of simplicity and it is not guaranteed that they will behave well for things like raytracing. In this document raytraced screenshots are included to aid visualization. Most of them are simple but there are sometimes a number of extra steps needed to actually allow the objects to be raytraced with the results seen here.] footnote:[__path_lhs__ will be set to "/" for these simple cases - this means either we will be working with combinations that are not contained within any other combination/region or the intent is to transform _every_ instance of the combination/region present regardless of where it appears in the tree structure. "/" denotes the toplevel lhs path, or the "root of all trees" in the database. Because every object in the database exists "on its own" at the top level as well as inside tree structures, operating on any object with a "/" path_lhs will always edit the matrix associated with that particular combination/region independently of any other transformations applied within tree structures.]
@@ -400,7 +381,7 @@ Now the primitives have changed, and the combination is back to being just a boo
[[Right_Hand_Path_Section]]
== Right Hand Path Selection - Reasons and Implications
Notice in the previous section that sphere.s was explicitly selected as part of the *oed* __path_rhs__. What would the impact have been had cube.s been selected instead?
Notice in the previous section that sphere.s was selected when using the *oed* command as part of the path_rhs. What would the impact have been had cube.s been selected instead?
Using the commands shown below, clear the old object1.c tree from MGED, re-insert the primitives, and make a combination as before. This time make two objects using the same primitives, for later use. At the moment, only the object2.c combination will be displayed.
@@ -541,22 +522,13 @@ object2.c: --
Selection of a particular primitive when using the two-path form of *oed*
will depend on the particular situation. If no primitive has an
appropriate default keypoint, use the one-path form to select the object's
bounding-box center or set the keypoint explicitly after entering object
edit mode.
Selection of a particular primitive when using *oed* will depend on the particular situation. Combinations do not have control points of their own, and thus cannot provide any basis for these operations - a primitive MUST be supplied for every *oed* operation.
[[Flexible_Manipulation]]
== Flexible Manipulation with keypoint
The one-path form of *oed* uses the center of the specified object's
bounding box as the point from which translations, rotations, and scaling
are defined. The two-path form instead derives this point from the
specified primitive. BRL-CAD's term for this point is the _keypoint_. For
cases where neither default is appropriate, BRL-CAD also offers an option
for explicitly setting the keypoint.
It might be reasonable to expect the *oed* command to use the center of the combination bounding box as a default if no primitive is supplied and/or take as an optional parameter an explicit keypoint setting, but this is not the current behavior of BRL-CAD as of version 7.12 - a primitive is required. As seen in the previous section, the *oed* uses the specified primitive to select a point from which translations/rotations/etc. are defined. BRL-CAD's term for this point is the _keypoint_. For cases where it is not practical to select a primitive that will provide the correct keypoint, BRL-CAD does offer an option for explicitly setting the keypoint.
For example, to rotate object2.c around the z axis intersecting point (2,2,0) the keypoint must be set explicitly - this is not a point that can be selected by identifying a primitive.
@@ -578,7 +550,7 @@ keypoint
....
V (-5, 5, 5)
(null) (-5, 5, 5)
....
In order to set a new keypoint, we simply supply an x y z style coordinate option to the keypoint command:
@@ -915,11 +887,9 @@ The major points of the *oed* command are:
* *oed* is the standard tool when working with combinations and regions instead of primitives.
* Object edit mode does not alter primitives directly but instead works on a transformation matrix that BRL-CAD uses when interpreting the primitive.
* If __path_rhs__ is omitted, __path_lhs__ is the complete path to the object being edited and its bounding-box center is the keypoint.
* If __path_rhs__ is supplied, it must end in a primitive shape whose default keypoint will be used for object editing.
* BRL-CAD requires that a primitive shape be supplied at the end of the __path_rhs__ for all object edit mode operations.
* *push* is used to force changes corresponding to the transformation down to the primitives, but the operation is destructive in that it replaces the previous information defining the primitive.
* _keypoint_ is used in object edit mode as the point moved by *translate* operations and around which rotations occur. It is set from the object's bounding-box center or the primitive supplied to *oed*, and can also be set manually in object edit mode with the *keypoint* command.
* _keypoint_ is used in object edit mode as the point moved by *translate* operations and around with rotations occur - it is set from the primitive supplied to *oed* but can also be set manually when in object edit mode with the *keynote* command.
* When editing objects inside other objects it is important to remember to use __path_lhs__ to precisely identify the shape to be worked on - subtle and messy errors are possible if the wrong path is used.
* When using *oed* in a script, the object must be in view so a *B* or *draw* command to select the object must be entered before using the *oed* command on it.
@@ -79,7 +79,7 @@ building the `procedural-gallery-snapshot` target.
|image:images/gallery_brickwall.png[brickwall,512]
|*brickwall*: Builds a brick wall: emits mged commands that create RPP brick solids arranged in rows (with optional mortar slabs between them) to fill a specified wall width and height. Output is a stream of mged commands on stdout, not a .g directly.
|image:images/gallery_mkbuilding.png[mkbuilding,512]
|*mkbuilding*: Generates physically dimensioned buildings from presets, a validated native JSON schema, OSM GeoJSON or Overpass data, and CityJSON 2.x. It supports arbitrary footprints, storeys and basements, material-separated envelopes and roofs, doors and windows, structural grids, installations, and nested building parts.
|*mkbuilding*: Procedurally builds a small building: a floor slab, four framed walls with openings, and an overhanging roof.
|image:images/gallery_cchannel.png[cchannel,512]
|*cchannel*: Creates a section of fully configurable C-channel (structural metal beam). Default is a 1" diameter by 12" long section of American standard C-channel, here generated with a row of drilled holes.
|image:images/gallery_ringworld.png[ringworld,512]
@@ -22,7 +22,7 @@ set(RENDERER_GALLERY_ITEM_4 [=[rt_l4|RT lighting models|rt|png|-l4|rt -l4 curva
set(RENDERER_GALLERY_ITEM_5 [=[rt_l5|RT lighting models|rt|png|-l5|rt -l5 principal direction|Principal curvature direction debug display.]=])
set(RENDERER_GALLERY_ITEM_6 [=[rt_l6|RT lighting models|rt|png|-l6|rt -l6 UV|UV coordinate test-map style; U appears in red and V in blue.]=])
set(RENDERER_GALLERY_ITEM_7 [=[rt_l7|RT lighting models|rt|png|-l7,1024,0,8,60.0,1,0,0,0,1.0,|rt -l7 photon map|Photon-mapping global illumination using a small deterministic photon count so regeneration remains quick enough for documentation snapshots.]=])
set(RENDERER_GALLERY_ITEM_8 [=[rt_l8|RT lighting models|rt|png|-l8|rt -l8 heat graph|Heat-graph diagnostic mode maps the high-resolution current-thread CPU time needed to render each fully shaded pixel to grayscale; brighter pixels took longer to render.]=])
set(RENDERER_GALLERY_ITEM_8 [=[rt_l8|RT lighting models|rt|png|-l8|rt -l8 heat graph|Heat-graph mode. Current PNG file output matches the shaded image while heat timing is reported in the render log.]=])
set(RENDERER_GALLERY_ITEM_9 [=[rt_haze|RT output options|rt|png|-m 0.0008,0.55,0.72,0.92|rt haze|Full lighting with atmospheric haze enabled.]=])
set(RENDERER_GALLERY_ITEM_10 [=[rt_cutaway|RT output options|rt|png|-k 0,1,0,260|rt cut plane|Full lighting with a view-wide cutting plane applied at render time.]=])
+1 -1
View File
@@ -43,7 +43,7 @@ regenerate them from the built tools by configuring with
|image:images/renderer_gallery_rt_l7.png[rt_l7,512]
|*rt -l7 photon map*: Photon-mapping global illumination using a small deterministic photon count so regeneration remains quick enough for documentation snapshots.
|image:images/renderer_gallery_rt_l8.png[rt_l8,512]
|*rt -l8 heat graph*: Heat-graph diagnostic mode maps the high-resolution current-thread CPU time needed to render each fully shaded pixel to grayscale; brighter pixels took longer to render.
|*rt -l8 heat graph*: Heat-graph mode. Current PNG file output matches the shaded image while heat timing is reported in the render log.
|===
== RT output options
-317
View File
@@ -1,317 +0,0 @@
= BRL-CAD Taxonomy and Conventions
BRL-CAD Development Team <devs@brlcad.org>
:doctype: article
:toc:
:toclevels: 3
[[purpose]]
This guide overviews the common vocabulary used in BRL-CAD
documentation, models, and tools. It distinguishes the formal
database terms from the shorter modeling terms commonly seen in MGED
and in existing models. It is a guide to communication and
organization; it does not impose a database naming scheme.
[[model]]
== Model and database vocabulary
A BRL-CAD geometry database, normally a `.g` file, stores named
*objects*. An object is typically a primitive solid, a combination,
or other database record. In formal terms the geometric object
relationships form a *directed acyclic graph* (DAG): primitive solids
are its leaves, combinations are internal nodes, and the objects not
referenced by any other object are its tops. Documentation often says
“tree” because one path through the DAG is tree-shaped. A single
object may be referenced along more than one path, so “DAG” is the
more precise term.
.A simple model hierarchy; `bore.s` is intentionally shared.
[source]
----
all.g/ group (assembly)
u housing.r/R region (part)
u shell.c/ non-region combination
u outer.s primitive solid
- bore.s primitive solid
u cover.r/R region (part)
u cover.s primitive solid
- bore.s shared primitive solid
----
The `tree` display notation shown above uses `/` for a combination and
`/R` for a region. The `u`, `+`, and `-` symbols identify union,
intersection, and subtraction respectively. They belong to the
relationship between a combination and a member, not to the member
object itself.
[cols="1,2,3",options="header"]
|===
|Term
|Also called
|Meaning
|Primitive solid
|primitive; solid; shape
|A leaf object that directly defines geometry, such as an `rcc`,
`ell`, `arb8`, or `bot`. “Solid” is the traditional term; “primitive”
is clearer when distinguishing it from a complete modeled part.
|Combination
|comb
|An object containing a Boolean expression whose members are
primitives and/or other combinations. A combination may also carry
display and shader data.
|Non-region combination
|shape combination; component combination
|An ordinary combination, often used to express a reusable Boolean
shape below a region or to organize objects above regions.
|Region
|part
|A combination specially marked as a region. It defines a material
component: normally one connected, homogeneous volume with one
material assignment. It is the level reported by ray-tracing and
analysis tools.
|Group
|assembly; top-level assembly
|A combination whose members are all unioned. Groups organize parts
and subassemblies; they need not represent a single material volume.
|Top
|top-level object
|An object not referenced by another object. A database may have
several tops. A group named `all.g` is a common, but not required,
model entry point.
|Member
|child
|An object directly referenced by a combination.
|Arc
|reference; edge
|The DAG relationship from a combination to a member. An arc carries
its Boolean operation and may carry a 4x4 homogeneous transformation
matrix.
|Path
|full path; instance path
|A slash-separated sequence of objects through the DAG, such as
`/all.g/housing.r/shell.c/outer.s`. The path identifies an instance
of an object, including the transforms accumulated along that route.
|===
[[csg]]
== CSG and representation terms
*Constructive solid geometry* (CSG), also called *combinatorial solid
geometry*, builds complex volumes from simpler objects using set
operations. BRL-CAD uses the following notation in combination
expressions and `tree` output:
[cols="1,1,3",options="header"]
|===
|Operation
|Notation
|Result
|Union
|`u`
|Volume in either member.
|Intersection
|`+`
|Volume common to both members.
|Difference (subtraction)
|`-`
|Volume in the left member that is not in the right member.
|===
CSG is BRL-CAD's principal modeling style, but BRL-CAD is a hybrid
system. It also supports explicit representations, including boundary
representation (B-rep), n-manifold geometry (NMG), point clouds,
displacement map (DSP) terrain data, Bag of Triangles (BoT) meshes,
and more. The word *solid* in “primitive solid” is historical
terminology and should not be used to imply that every supported
representation is a CSG primitive.
[[conventions]]
== Modeling conventions
=== Names and suffixes
BRL-CAD requires object names to be unique within a database but
otherwise places few restrictions on a modeler's naming scheme. The
suffix convention below is widely used to help people and tools
recognize an object's intended role.
[cols="1,2,3",options="header"]
|===
|Suffix
|Object role
|Examples and notes
|`.s`
|Primitive solid
|`bracket.s`, `hole.s`. These are commonly used in Boolean
combination recipes.
|`.r`
|Region (part)
|`bracket.r`. A region is a combination with region semantics, not a
distinct database object class.
|`.c`
|Non-region combination
|`bracket_shape.c`. This is commonly used for a Boolean shape beneath
a region.
|No suffix or `.g`
|Group (assembly)
|`landing_gear` or `landing_gear.g`. Use a descriptive assembly name
when it helps readers navigate the model.
|===
Use concise, descriptive names and one documented scheme throughout a
model. Lowercase letters, digits, and underscores are portable
choices. Avoid spaces, shell-significant punctuation, and `/`, which
separates elements of a path. Names should communicate function or
location rather than only the primitive type, except for temporary or
test geometry.
=== Coordinates, units, and transformations
BRL-CAD model coordinates use a right-handed Cartesian system. By
convention, positive X is forward, positive Y is left, and positive Z
is up. Database coordinates are stored in millimeters; interactive
tools can present and accept other units.
[source]
----
+Z (up)
|
|
o---- +X (front)
/
/
+Y (left)
----
Transformations associated with an arc create instances: the same
object can appear at multiple locations, orientations, or scales
through different paths. Editing a primitive changes every instance;
editing an arc matrix changes only the instance reached by that path.
This distinction is central to predictable hierarchical editing.
=== Materials and analysis properties
Regions are the conventional place to assign material and analysis
properties. Common historical terms include *ident*, *region ID*,
*component ID*, and *item* for a user-assigned integer reported to
applications; *material code* for a user-assigned material identifier;
and *LOS* (line-of-sight) for a percentage describing material
solidity. These values are application data: BRL-CAD stores and
reports them, but their interpretation is determined by the tool or
workflow using the model.
*Attributes* are arbitrary name/value metadata that may be attached to
any database object. Prefer attributes for metadata that is not
intrinsic to the CSG expression or the traditional region fields.
[[tools]]
== Tool taxonomy
BRL-CAD is a suite, not a single application. The categories below
describe the role of a tool; a program may participate in more than
one workflow. Consult its manual page for its exact interface and
supported formats.
[cols="2,4",options="header"]
|===
|Category
|Purpose and representative tools
|Geometry editing and inspection
|Create, modify, view, and query database objects. `mged` is the
traditional interactive geometry editor; `archer` is a graphical
solid-modeling interface prototype; `ged` provides geometry-editing
commands to applications; `gcv` supports geometry conversion and
viewing.
|Model construction and automation
|Generate or organize geometry programmatically or from naming
conventions. Examples include `pipe`, `tire`, `fence`, and various
programs written with `libwdb`.
|Ray tracing and rendering
|Render images or use rays to interrogate a model. `rt` is the
primary ray-tracer; related tools include `rtedge`, `rtarea`,
`rtcheck`, and `nirt`.
|Geometry analysis and validation
|Measure, inspect, or detect issues in geometry. Typical tools
include `analyze`, `gqa`, `rtcheck`, `nirt`, and `bot_repair`. An
*overlap* or *interference* occurs when two regions occupy the same
volume; it is usually a modeling error unless intentionally permitted
by the application.
|Geometry conversion and database maintenance
|Move geometry between BRL-CAD and other formats, or maintain
databases. Names commonly reflect direction: `format-g` imports into
a `.g` database and `g-format` exports from it, for example `stl-g`
and `g-stl`. `dbupgrade`, `g2asc`, and `asc2g` are database-oriented
examples. The `gcv` geometry converter is a multi-format tool for
converting from/to BRL-CAD and other formats.
|Image, framebuffer, and plot processing
|Render, display, convert, and process raster or plot data. `.pix` is
raw three-channel color data, `.bw` is raw one-channel grayscale data,
and `.pl` is a plot format. `pix-*`, `*-pix`, `fb*`, and `plot3-*`
names often indicate the data family or conversion direction.
|Libraries and application development
|Embed BRL-CAD capabilities in other software. Important libraries
include `librt` for geometry and ray tracing, `libwdb` for writing
geometry databases, `libged` for editing commands, `libbu` for utility
services, `libbn` for numerics, `libbv` for viewing, and `libfb` for
framebuffer access.
|===
.Typical BRL-CAD workflow and the roles of its tool families.
[source]
----
measurements or external geometry
|
v
import / construct / edit --> .g geometry database --> inspect / organize
*-g, libwdb, mged, gcv primitives, tree, search,
combinations, regions attributes
| |
+------------------------------+
|
+-------------------+-------------------+
v v
render or ray-query analyze / validate
rt, rtedge, nirt rtcheck, gqa, analyze
|
v
pix / framebuffer / image tools
----
[[usage]]
== Choosing terms in new documentation
Use *object* when the type does not matter. Use *primitive solid* (or
simply *primitive* after it is defined) for a leaf; use *combination*
for the general Boolean container; and use *region* or *group* when
their material or organizational semantics matter. When discussing a
traversal, distinguish the named object from the *path* or *instance*
by which it is reached.
Prefer *union*, *intersection*, and *subtraction* over ambiguous
informal descriptions of Boolean operations. Define acronyms at first
use, especially CSG, DAG, B-rep,pace, as in `rtcheck`, and use the
man-page form `rtcheck(1)` when pointing readers to its reference
documentation.

Some files were not shown because too many files have changed in this diff Show More