Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d8b619114 |
@@ -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."
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -36,6 +36,5 @@ CMakeLists.txt.user
|
||||
|
||||
# Misc
|
||||
.clang-format
|
||||
*__pycache__*
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
----------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
=====================
|
||||
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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
|
||||
----
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
====
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
....
|
||||
|
||||
@@ -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.]=])
|
||||
|
||||
|
||||
@@ -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.
|
||||
|===
|
||||
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 215 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 137 KiB |
|
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)
|
||||
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 44 KiB |
@@ -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*
|
||||
|
||||
|
||||
@@ -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.]=])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||