Compare commits
160 Commits
e656a4f6d2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 28ab8a3af4 | |||
| 096911a156 | |||
| 360203d647 | |||
| 95cca3e777 | |||
| 5a533dfa00 | |||
| 42f0c62b6b | |||
| 33d1cf6827 | |||
| cb9233c59c | |||
| b59bc4c3cd | |||
| d85f7d22f2 | |||
| 19ebee129b | |||
| 692894cac9 | |||
| f6f5abe464 | |||
| c101007362 | |||
| 0dd2ca5824 | |||
| 2f5f03ac6f | |||
| e4e84dcdcb | |||
| adf5165033 | |||
| db25a977b7 | |||
| b56b28043f | |||
| 00707fd8df | |||
| fe8d0119ef | |||
| 11a8c37f21 | |||
| 64edd8df46 | |||
| 08696cd2fe | |||
| a749111657 | |||
| 6370b3e416 | |||
| e99ee0f33d | |||
| 8658c0407e | |||
| 962d17257d | |||
| 058ed10005 | |||
| 3a0ead7eb5 | |||
| 26fd2bf714 | |||
| e3ed39471b | |||
| 3553c83ffa | |||
| e3b9d575f9 | |||
| a46bc42a8f | |||
| 1e1e95a58a | |||
| 1254cf24e1 | |||
| e970bdecf6 | |||
| c5b81afb91 | |||
| 969a289efb | |||
| 4fb085d5b9 | |||
| 1098b4d543 | |||
| d8beeab98d | |||
| e2e100808b | |||
| 25fdffbd3b | |||
| e16ad04dbd | |||
| 1ea44e5e42 | |||
| 6f67568f47 | |||
| 2ec65d0e8a | |||
| e0e76bed8c | |||
| 8c18b2ac8c | |||
| e1744f44bb | |||
| 519591a4de | |||
| 4780bd9e2c | |||
| 0bab5b4c8d | |||
| 27c860c225 | |||
| b9415bedaa | |||
| e26c0b9cb1 | |||
| e5cb3c6803 | |||
| b399645430 | |||
| c9a1170a27 | |||
| dceb394378 | |||
| 738fe3933e | |||
| b71386dc31 | |||
| d08b59c9a9 | |||
| 5eb3f01122 | |||
| 3db144da63 | |||
| 9e3b532a7e | |||
| 9779e50ce9 | |||
| a9e2711447 | |||
| 66f10baa1b | |||
| da4afec708 | |||
| 21f85a1b58 | |||
| 374d7958f1 | |||
| ea10b7672c | |||
| 9675440210 | |||
| d1e05d1b30 | |||
| bb7f419ca0 | |||
| 4504abcc64 | |||
| f0420f6c8b | |||
| f0fd975d0f | |||
| f93a27f469 | |||
| d4990f3b07 | |||
| 2558e2f49f | |||
| 656d837778 | |||
| 73cef10054 | |||
| 2f1c15c081 | |||
| 362fa62059 | |||
| 468a0f0619 | |||
| 88408c9680 | |||
| 611db567a0 | |||
| fdda05b53f | |||
| 55424dbd7f | |||
| 763e9e5044 | |||
| c22eef5d0e | |||
| 66fbb87b3f | |||
| d537a37172 | |||
| 13f85bfa34 | |||
| 43820f6bd1 | |||
| cf98152e41 | |||
| ed516a1a5d | |||
| b1f60db3d6 | |||
| a9927fcfcb | |||
| 52f62d8c39 | |||
| d5c318d280 | |||
| 61d6721287 | |||
| eb7be428c6 | |||
| 0791e0a69e | |||
| 9c9d5b91f1 | |||
| c8b2317e13 | |||
| 1fd127bd8a | |||
| 3951bdb809 | |||
| aa269f1785 | |||
| 3032b16e7b | |||
| d298b4f4c4 | |||
| a18b09d928 | |||
| aeb44fd089 | |||
| 1c434098fd | |||
| 2274dd9a91 | |||
| c7777d42f5 | |||
| b413cd6f4d | |||
| 167f469fc2 | |||
| 4a32025e37 | |||
| 5f83ce61e1 | |||
| 74801c3488 | |||
| 5bc22bdd83 | |||
| b2a060d3c6 | |||
| fb7d0c6836 | |||
| 9f7a4e323f | |||
| 9a62922afa | |||
| c6171dc625 | |||
| 5b3950c421 | |||
| 4849bbda7b | |||
| 16501f2331 | |||
| 5d1573fc82 | |||
| 2c806d80ff | |||
| d980692933 | |||
| 6d02db8a9a | |||
| 84bc31d031 | |||
| 2308e55671 | |||
| 7a4f1f2fb1 | |||
| d152e80ef9 | |||
| ae0b7966e2 | |||
| 28bd5a0296 | |||
| 66997128e7 | |||
| 3068e5ee9e | |||
| 28a6f54f7e | |||
| e63f2c615a | |||
| 3140e65dc7 | |||
| 1604822689 | |||
| cdb392643c | |||
| d7d12957e6 | |||
| a78f9fba76 | |||
| ffe559db61 | |||
| 7691d54a5d | |||
| 21bbdab9ab | |||
| 6d4d9adaf4 | |||
| de6e611ef0 |
2
.cargo/config.toml
Normal file
2
.cargo/config.toml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[build]
|
||||||
|
jobs = 4
|
||||||
6
.env.example
Normal file
6
.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Set RUN_LIVE_TESTS=1 as an explicit opt-in. With all three credentials below,
|
||||||
|
# every live compatibility test runs; the suite fails if any case is ignored.
|
||||||
|
RUN_LIVE_TESTS=0
|
||||||
|
GRID_USER=First Last
|
||||||
|
GRID_PASSWORD=
|
||||||
|
GRID_LOGIN_URL=https://grid.example.test/login
|
||||||
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
crates/libremetaverse/assets/avatar_lad.xml -whitespace
|
||||||
189
.gitea/workflows/ci.yml
Normal file
189
.gitea/workflows/ci.yml
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
cold_cache:
|
||||||
|
description: Deliberately clear the required dependency/native cache before validation
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# The runner-persistent Cargo cache is shared across refs. Queue complete CI
|
||||||
|
# runs instead of trying to kill one while it owns or mutates that cache.
|
||||||
|
group: ci-${{ github.workflow }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rust-skia:
|
||||||
|
name: rust-skia (Rust only)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 15
|
||||||
|
env:
|
||||||
|
CARGO_BUILD_JOBS: "1"
|
||||||
|
CARGO_INCREMENTAL: "0"
|
||||||
|
CARGO_PROFILE_DEV_DEBUG: "0"
|
||||||
|
CARGO_PROFILE_TEST_DEBUG: "0"
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Deliberately do not install CMake, Clang, pkg-config, Skia, WebP, or
|
||||||
|
# any other native codec prerequisite in this job.
|
||||||
|
- name: Install pinned Rust
|
||||||
|
uses: dtolnay/rust-toolchain@master
|
||||||
|
with:
|
||||||
|
toolchain: 1.97.1
|
||||||
|
targets: wasm32-unknown-unknown
|
||||||
|
|
||||||
|
- name: Test the pure-Rust Skia-compatible extension
|
||||||
|
run: cargo test --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia
|
||||||
|
|
||||||
|
- name: Audit the normal and build dependency graph
|
||||||
|
run: cargo tree --locked -p libremetaverse-imaging-skia --no-default-features --features rust-skia -e normal,build
|
||||||
|
|
||||||
|
- name: Compile the same Rust codec for WASM
|
||||||
|
run: cargo check --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia --target wasm32-unknown-unknown
|
||||||
|
|
||||||
|
required:
|
||||||
|
name: required
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# A source edit rebuilds the monolithic compatibility crate under several
|
||||||
|
# feature/profile graphs. Serialized compilation is required by the ARM64
|
||||||
|
# runner's memory ceiling, so retain a small margin above the measured
|
||||||
|
# 25-minute full gate instead of aborting a healthy graph at 12 minutes.
|
||||||
|
timeout-minutes: 30
|
||||||
|
env:
|
||||||
|
# The all-features graph includes Skia, OpenJPEG, and the pure-Rust J2K
|
||||||
|
# codec. Serialize rustc/clippy on the memory-constrained ARM64 runner so
|
||||||
|
# the umbrella crate cannot overlap with another peak-memory compile.
|
||||||
|
CARGO_BUILD_JOBS: "1"
|
||||||
|
CARGO_INCREMENTAL: "0"
|
||||||
|
CARGO_PROFILE_DEV_DEBUG: "0"
|
||||||
|
CARGO_PROFILE_TEST_DEBUG: "0"
|
||||||
|
RUSTDOCFLAGS: "-D warnings"
|
||||||
|
CARGO_HOME: ${{ runner.tool_cache }}/metacrate/cargo/home-rust-1.97.1-aarch64-unknown-linux-gnu
|
||||||
|
METACRATE_EXPECTED_HOST: aarch64-unknown-linux-gnu
|
||||||
|
METACRATE_PROVENANCE_DIAGNOSTICS_DIR: artifacts/ci/provenance-candidates
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Inspect the runner-persistent, architecture-keyed cache
|
||||||
|
run: |
|
||||||
|
cargo_cache_root="${{ runner.tool_cache }}/metacrate/cargo"
|
||||||
|
cache_key="$(git ls-files -z 'Cargo.lock' 'Cargo.toml' '**/Cargo.toml' 'ci/ci-coverage.json' 'ci/dependency-policy.json' 'deny.toml' 'tools/install_openjpeg_2_5_4.sh' 'tools/normalize_git_mtimes.py' | sort -z | xargs -0 sha256sum | sha256sum | cut -d ' ' -f 1)"
|
||||||
|
cargo_target="$cargo_cache_root/target-rust-1.97.1-aarch64-unknown-linux-gnu-$cache_key"
|
||||||
|
openjpeg_prefix="${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}"
|
||||||
|
skia_dir="${{ runner.tool_cache }}/metacrate/native/skia-0.99.0-aarch64-unknown-linux-gnu"
|
||||||
|
skia_archive="$skia_dir/skia-binaries-a25a0fdb7d90429aa2d1-aarch64-unknown-linux-gnu-jpegd-jpege-pdf-svg-textlayout-vulkan-webpd-webpe.tar.gz"
|
||||||
|
mkdir -p "$CARGO_HOME" "$cargo_cache_root" "$skia_dir"
|
||||||
|
(
|
||||||
|
flock --exclusive 9
|
||||||
|
|
||||||
|
if test "${{ github.event_name }}" = workflow_dispatch && test "${{ inputs.cold_cache }}" = true; then
|
||||||
|
rm -rf -- "$CARGO_HOME/registry/cache" "$CARGO_HOME/registry/index" "$CARGO_HOME/git/db" "$openjpeg_prefix" "$skia_dir"
|
||||||
|
rm -f -- "$CARGO_HOME/bin/cargo-deny" "$CARGO_HOME/bin/cargo-machete"
|
||||||
|
fi
|
||||||
|
if ! test -d "$cargo_target"; then
|
||||||
|
previous_target="$(find "$cargo_cache_root" -mindepth 1 -maxdepth 1 -type d -name 'target-rust-1.97.1-aarch64-unknown-linux-gnu-*' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d ' ' -f 2-)"
|
||||||
|
if test -n "$previous_target"; then
|
||||||
|
cp -al "$previous_target" "$cargo_target"
|
||||||
|
rm -f -- "$cargo_target/.metacrate-ready"
|
||||||
|
else
|
||||||
|
mkdir -p "$cargo_target"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
while IFS= read -r -d '' stale_target; do
|
||||||
|
if test "$stale_target" != "$cargo_target"; then
|
||||||
|
rm -rf -- "$stale_target"
|
||||||
|
fi
|
||||||
|
done < <(find "$cargo_cache_root" -mindepth 1 -maxdepth 1 -type d -name 'target-rust-1.97.1-aarch64-unknown-linux-gnu-*' -print0)
|
||||||
|
) 9>"$cargo_cache_root/required-target.lock"
|
||||||
|
test -f "$cargo_target/.metacrate-ready" && cargo_hit=true || cargo_hit=false
|
||||||
|
test -d "$CARGO_HOME/registry/cache" && dependency_hit=true || dependency_hit=false
|
||||||
|
test -f "$openjpeg_prefix/metacrate-openjpeg.identity" && test -f "$skia_archive" && native_hit=true || native_hit=false
|
||||||
|
test -x "$CARGO_HOME/bin/cargo-deny" && test -x "$CARGO_HOME/bin/cargo-machete" && tools_hit=true || tools_hit=false
|
||||||
|
echo "CARGO_TARGET_DIR=$cargo_target" >> "$GITHUB_ENV"
|
||||||
|
echo "OPENJPEG_PREFIX=$openjpeg_prefix" >> "$GITHUB_ENV"
|
||||||
|
echo "PKG_CONFIG_PATH=$openjpeg_prefix/lib/pkgconfig" >> "$GITHUB_ENV"
|
||||||
|
echo "LD_LIBRARY_PATH=$openjpeg_prefix/lib" >> "$GITHUB_ENV"
|
||||||
|
echo "METACRATE_SKIA_ARCHIVE=$skia_archive" >> "$GITHUB_ENV"
|
||||||
|
echo "METACRATE_CARGO_CACHE_HIT=$cargo_hit" >> "$GITHUB_ENV"
|
||||||
|
echo "METACRATE_DEPENDENCY_CACHE_HIT=$dependency_hit" >> "$GITHUB_ENV"
|
||||||
|
echo "METACRATE_NATIVE_CACHE_HIT=$native_hit" >> "$GITHUB_ENV"
|
||||||
|
echo "METACRATE_TOOLS_CACHE_HIT=$tools_hit" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Install the single native prerequisite set
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install --yes build-essential clang cmake curl git ninja-build pkg-config python3 libfontconfig1-dev libfreetype6-dev libopus-dev libasound2-dev
|
||||||
|
|
||||||
|
- name: Install pinned Rust and audit tools
|
||||||
|
uses: dtolnay/rust-toolchain@master
|
||||||
|
with:
|
||||||
|
toolchain: 1.97.1
|
||||||
|
components: clippy,rustfmt
|
||||||
|
- uses: taiki-e/install-action@v2
|
||||||
|
with:
|
||||||
|
tool: cargo-deny@0.20.2,cargo-machete@0.9.2
|
||||||
|
|
||||||
|
- name: Verify pinned audit tool versions
|
||||||
|
run: |
|
||||||
|
cargo deny --version | grep '0.20.2'
|
||||||
|
cargo machete --version | grep '0.9.2'
|
||||||
|
|
||||||
|
- name: Validate and populate the exact native cache
|
||||||
|
run: |
|
||||||
|
test "$(uname -m)" = aarch64
|
||||||
|
rustc -vV | grep '^host: aarch64-unknown-linux-gnu$'
|
||||||
|
tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX"
|
||||||
|
pkg-config --exact-version 2.5.4 libopenjp2
|
||||||
|
mkdir -p "$(dirname "$METACRATE_SKIA_ARCHIVE")"
|
||||||
|
if ! echo 'dd127f458a5e67a79f3936a8aa19f822fe90a1d6a11b50b5f84df2b0519d909c '"$METACRATE_SKIA_ARCHIVE" | sha256sum --check --status; then
|
||||||
|
curl --fail --location --proto '=https' --tlsv1.2 --output "$METACRATE_SKIA_ARCHIVE" \
|
||||||
|
https://github.com/rust-skia/skia-binaries/releases/download/0.99.0/skia-binaries-a25a0fdb7d90429aa2d1-aarch64-unknown-linux-gnu-jpegd-jpege-pdf-svg-textlayout-vulkan-webpd-webpe.tar.gz
|
||||||
|
fi
|
||||||
|
echo 'dd127f458a5e67a79f3936a8aa19f822fe90a1d6a11b50b5f84df2b0519d909c '"$METACRATE_SKIA_ARCHIVE" | sha256sum --check
|
||||||
|
|
||||||
|
- name: Run the authoritative code-ready graph with exclusive cache ownership
|
||||||
|
run: |
|
||||||
|
cargo_cache_root="${{ runner.tool_cache }}/metacrate/cargo"
|
||||||
|
cache_lock="$cargo_cache_root/required-target.lock"
|
||||||
|
(
|
||||||
|
flock --exclusive 9
|
||||||
|
rm -f -- "$CARGO_TARGET_DIR/.metacrate-ready"
|
||||||
|
python3 tools/normalize_git_mtimes.py --self-test
|
||||||
|
python3 tools/normalize_git_mtimes.py --state "$CARGO_TARGET_DIR/.metacrate-mtimes.json"
|
||||||
|
python3 tools/normalize_git_mtimes.py --state "$CARGO_TARGET_DIR/.metacrate-mtimes.json" --check
|
||||||
|
# Cargo does not fingerprint CARGO_TARGET_DIR in integration-test
|
||||||
|
# binaries. After a clone, interruption, or failed gate, invalidate
|
||||||
|
# only those fingerprints so CARGO_BIN_EXE_* cannot stay poisoned.
|
||||||
|
if test "$METACRATE_CARGO_CACHE_HIT" != true; then
|
||||||
|
fingerprint_root="$CARGO_TARGET_DIR/debug/.fingerprint"
|
||||||
|
fingerprint_list="$CARGO_TARGET_DIR/.metacrate-relocated-fingerprints"
|
||||||
|
if test -d "$fingerprint_root"; then
|
||||||
|
find "$fingerprint_root" -mindepth 2 -maxdepth 2 -type f \
|
||||||
|
-path '*/libremetaverse-programs-*/*' \
|
||||||
|
-name 'test-integration-test-*' -printf '%h\0' > "$fingerprint_list"
|
||||||
|
while IFS= read -r -d '' integration_fingerprint; do
|
||||||
|
rm -rf -- "$integration_fingerprint"
|
||||||
|
done < "$fingerprint_list"
|
||||||
|
fi
|
||||||
|
rm -f -- "$fingerprint_list"
|
||||||
|
fi
|
||||||
|
cargo run --locked -p metacrate-ci-matrix -- required-gate --evidence artifacts/ci/required-gate.json
|
||||||
|
test ! -e artifacts/ci/grid-agent-acceptance.jsonl
|
||||||
|
cargo test --locked -p metacrate-grid-agent --test acceptance_gate --all-features
|
||||||
|
METACRATE_SOURCE_COMMIT="${{ github.sha }}" cargo run --locked -p metacrate-grid-agent -- --acceptance-evidence artifacts/ci/grid-agent-acceptance.jsonl
|
||||||
|
touch "$CARGO_TARGET_DIR/.metacrate-ready"
|
||||||
|
) 9>"$cache_lock"
|
||||||
|
|
||||||
|
- name: Upload stage timing and audit evidence
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: required-ci-evidence
|
||||||
|
path: artifacts/ci/
|
||||||
|
if-no-files-found: error
|
||||||
56
.gitea/workflows/release.yml
Normal file
56
.gitea/workflows/release.yml
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
name: Non-routine release validation
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: release-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 120
|
||||||
|
env:
|
||||||
|
CARGO_BUILD_JOBS: "2"
|
||||||
|
CARGO_INCREMENTAL: "0"
|
||||||
|
RUSTDOCFLAGS: "-D warnings"
|
||||||
|
OPENJPEG_PREFIX: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}
|
||||||
|
PKG_CONFIG_PATH: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}/lib/pkgconfig
|
||||||
|
LD_LIBRARY_PATH: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}/lib
|
||||||
|
METACRATE_RUST_COMMIT: ${{ github.sha }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry
|
||||||
|
~/.cargo/git
|
||||||
|
${{ runner.tool_cache }}/metacrate/native
|
||||||
|
target/release-gate
|
||||||
|
key: release-rust-1.97.1-${{ runner.arch }}-${{ hashFiles('.gitea/workflows/release.yml', 'Cargo.lock', 'ci/ci-coverage.json', 'ci/release-matrix.json', 'ci/artifact-policy.json', 'tools/install_openjpeg_2_5_4.sh') }}
|
||||||
|
- name: Install the release prerequisite set once
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install --yes build-essential clang cmake curl git mingw-w64 ninja-build pkg-config python3 libfontconfig1-dev libfreetype6-dev libopus-dev libasound2-dev
|
||||||
|
- uses: dtolnay/rust-toolchain@master
|
||||||
|
with:
|
||||||
|
toolchain: 1.97.1
|
||||||
|
components: clippy,rustfmt
|
||||||
|
targets: x86_64-pc-windows-gnu,x86_64-apple-darwin
|
||||||
|
- name: Validate the native release dependency
|
||||||
|
run: tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX"
|
||||||
|
- name: Run the Rust-owned non-routine release graph
|
||||||
|
run: cargo run --locked -p metacrate-ci-matrix -- release-gate --evidence artifacts/release/release-gate.json
|
||||||
|
- name: Upload release evidence and packages
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: non-routine-release-evidence
|
||||||
|
path: |
|
||||||
|
artifacts/release/
|
||||||
|
target/release-gate/package/*.crate
|
||||||
|
if-no-files-found: error
|
||||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,5 +1,11 @@
|
|||||||
/target/
|
/target/
|
||||||
|
/crates/libremetaverse-openjpeg/target/
|
||||||
|
/crates/libremetaverse-openjpeg/Cargo.lock
|
||||||
/tests/api-compile/target/
|
/tests/api-compile/target/
|
||||||
|
/tests/semver-port/target/
|
||||||
|
/artifacts/
|
||||||
|
/linden/
|
||||||
|
/crates/metacrate-grid-agent/linden/
|
||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
All code and API mappings must be cross-platform; do not use macOS-only APIs unless equivalent Linux and Windows implementations are provided.
|
All code and API mappings must be cross-platform; do not use macOS-only APIs unless equivalent Linux and Windows implementations are provided.
|
||||||
|
Gitea Actions workflows must target only `ubuntu-latest`; do not add macOS or Windows Gitea jobs.
|
||||||
|
Crates named `libremetaverse-*` are restricted to compatibility mappings of the C# LibreMetaverse libraries. New MetaCrate-native functionality must use a `metacrate-*` crate name; the reusable wgpu renderer is `metacrate-rendering-wgpu`.
|
||||||
|
Every intentional correction or adaptation in a `libremetaverse-*` crate must be recorded in that crate's `CHANGES.md` so it can be preserved or re-evaluated when importing newer C# LibreMetaverse sources.
|
||||||
|
|||||||
28
CHANGELOG.md
Normal file
28
CHANGELOG.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to MetaCrate are recorded here. The project follows
|
||||||
|
[Semantic Versioning](https://semver.org/); the public compatibility surface is
|
||||||
|
also fixed by `api/SEMVER-BASELINE.json`.
|
||||||
|
|
||||||
|
## 0.0.1 - release candidate
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Native Rust implementations for the mapped LibreMetaverse types, structured
|
||||||
|
data, imaging, meshing, wire protocol, client/network lifecycle, world and
|
||||||
|
social managers, rendering, RLV, LSL, voice adapters, and programs.
|
||||||
|
- Deterministic compatibility, fake-grid, concurrency, performance, API,
|
||||||
|
documentation, dependency, provenance, package, and native artifact gates.
|
||||||
|
- Explicit OpenSim dedicated-account validation with sanitized nine-stage
|
||||||
|
evidence and reversible side-effect confirmations.
|
||||||
|
|
||||||
|
### Release requirements
|
||||||
|
|
||||||
|
- Normal development and release validation use Rust 1.97.1.
|
||||||
|
- The release candidate is not approved while
|
||||||
|
`metacrate-ci-matrix release-candidate-audit` reports any blocker. Fuzz-smoke
|
||||||
|
is temporarily deferred by explicit project direction; every other gate is
|
||||||
|
fail-closed.
|
||||||
|
- No artifact-signing identity is configured for 0.0.1. Checked SHA-256 values,
|
||||||
|
immutable Gitea build artifacts, license notices, and provenance manifests are
|
||||||
|
therefore mandatory.
|
||||||
8995
Cargo.lock
generated
8995
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
64
Cargo.toml
64
Cargo.toml
@@ -1,6 +1,7 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
members = [
|
members = [
|
||||||
|
"crates/metacrate",
|
||||||
"crates/libremetaverse-types",
|
"crates/libremetaverse-types",
|
||||||
"crates/libremetaverse-structured-data",
|
"crates/libremetaverse-structured-data",
|
||||||
"crates/libremetaverse-imaging",
|
"crates/libremetaverse-imaging",
|
||||||
@@ -9,21 +10,52 @@ members = [
|
|||||||
"crates/libremetaverse",
|
"crates/libremetaverse",
|
||||||
"crates/libremetaverse-rendering-simple",
|
"crates/libremetaverse-rendering-simple",
|
||||||
"crates/libremetaverse-rendering-mesh-foundry",
|
"crates/libremetaverse-rendering-mesh-foundry",
|
||||||
"crates/libremetaverse-lsl-tools",
|
"crates/metacrate-lsl-tools",
|
||||||
|
"crates/metacrate-game-loop",
|
||||||
|
"crates/metacrate-grid-world",
|
||||||
|
"crates/metacrate-rendering-wgpu",
|
||||||
"crates/libremetaverse-rlv",
|
"crates/libremetaverse-rlv",
|
||||||
"crates/libremetaverse-utilities",
|
"crates/libremetaverse-utilities",
|
||||||
"crates/libremetaverse-voice-vivox",
|
"crates/libremetaverse-voice-vivox",
|
||||||
|
"crates/libremetaverse-opus",
|
||||||
"crates/libremetaverse-voice-webrtc",
|
"crates/libremetaverse-voice-webrtc",
|
||||||
|
"crates/metacrate-grid-agent",
|
||||||
"programs",
|
"programs",
|
||||||
"tests/compat",
|
"tests/compat",
|
||||||
|
"tools/codegen",
|
||||||
|
"tools/ci-matrix",
|
||||||
|
"tools/concurrency-audit",
|
||||||
|
"tools/performance",
|
||||||
|
]
|
||||||
|
exclude = ["crates/libremetaverse-openjpeg", "vendor/mentra", "vendor/mentra-provider"]
|
||||||
|
default-members = [
|
||||||
|
"crates/metacrate",
|
||||||
|
"crates/libremetaverse-types",
|
||||||
|
"crates/libremetaverse-structured-data",
|
||||||
|
"crates/libremetaverse-imaging",
|
||||||
|
"crates/libremetaverse-imaging-skia",
|
||||||
|
"crates/libremetaverse-prim-mesher",
|
||||||
|
"crates/libremetaverse",
|
||||||
|
"crates/libremetaverse-rendering-simple",
|
||||||
|
"crates/libremetaverse-rendering-mesh-foundry",
|
||||||
|
"crates/metacrate-lsl-tools",
|
||||||
|
"crates/metacrate-game-loop",
|
||||||
|
"crates/metacrate-grid-world",
|
||||||
|
"crates/metacrate-rendering-wgpu",
|
||||||
|
"crates/libremetaverse-rlv",
|
||||||
|
"crates/libremetaverse-utilities",
|
||||||
|
"crates/libremetaverse-voice-vivox",
|
||||||
|
"crates/libremetaverse-opus",
|
||||||
|
"crates/libremetaverse-voice-webrtc",
|
||||||
|
"crates/metacrate-grid-agent",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
rust-version = "1.85"
|
rust-version = "1.97.1"
|
||||||
license = "BSD-3-Clause"
|
license = "BSD-3-Clause"
|
||||||
repository = "https://github.com/cinderblocks/libremetaverse"
|
repository = "https://git.rfc1437.de/hugo/MetaCrate"
|
||||||
|
|
||||||
[workspace.lints.rust]
|
[workspace.lints.rust]
|
||||||
unsafe_code = "forbid"
|
unsafe_code = "forbid"
|
||||||
@@ -31,3 +63,29 @@ unsafe_code = "forbid"
|
|||||||
[workspace.lints.clippy]
|
[workspace.lints.clippy]
|
||||||
all = { level = "warn", priority = -1 }
|
all = { level = "warn", priority = -1 }
|
||||||
pedantic = { level = "warn", priority = -1 }
|
pedantic = { level = "warn", priority = -1 }
|
||||||
|
|
||||||
|
# The generated compatibility core is intentionally large. A bounded release
|
||||||
|
# profile keeps clean-machine packaging viable on the documented 8 GiB worker
|
||||||
|
# while still producing optimized, debug-free native artifacts.
|
||||||
|
[profile.release]
|
||||||
|
opt-level = 1
|
||||||
|
debug = 0
|
||||||
|
incremental = false
|
||||||
|
codegen-units = 256
|
||||||
|
|
||||||
|
# The generated core API is intentionally very large; full release LTO-style
|
||||||
|
# optimization can exceed small Gitea worker memory before diagnostic fixture
|
||||||
|
# benchmarks run. This stable profile retains optimization without debug or
|
||||||
|
# incremental artifacts and is used only when explicitly selected.
|
||||||
|
[profile.benchmark]
|
||||||
|
inherits = "dev"
|
||||||
|
opt-level = 1
|
||||||
|
debug = 0
|
||||||
|
incremental = false
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
# Mentra 0.5.1 duplicates `v1` for nested OpenAI-compatible base URLs.
|
||||||
|
mentra-provider = { path = "vendor/mentra-provider" }
|
||||||
|
# Mentra 0.18.3 lacks the host-facing bounded memory browse API required by
|
||||||
|
# the grid-agent operator control plane. Keep the storage schema inside Mentra.
|
||||||
|
mentra = { path = "vendor/mentra" }
|
||||||
|
|||||||
53
NOTICE.md
Normal file
53
NOTICE.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# MetaCrate notices and attribution
|
||||||
|
|
||||||
|
MetaCrate's Rust implementation is licensed under the BSD 3-Clause License in
|
||||||
|
[`LICENSE.md`](LICENSE.md). It is a clean native Rust rewrite based on the
|
||||||
|
public API and observable behavior of LibreMetaverse at commit
|
||||||
|
`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. The upstream BSD notice is
|
||||||
|
retained in `LICENSE.md` for openmetaverse.co (2006–2016) and Sjofn LLC
|
||||||
|
(2017–2025). The exact pinned upstream text is included in
|
||||||
|
[`licenses/LibreMetaverse-BSD-3-Clause.txt`](licenses/LibreMetaverse-BSD-3-Clause.txt).
|
||||||
|
|
||||||
|
## Linden viewer data
|
||||||
|
|
||||||
|
The following exact, unmodified files are Linden viewer data redistributed by
|
||||||
|
LibreMetaverse under Creative Commons Attribution-ShareAlike 3.0 Unported:
|
||||||
|
|
||||||
|
- `codegen/inputs/attentions.xml`
|
||||||
|
- `codegen/inputs/attentionsN.xml`
|
||||||
|
- `codegen/inputs/avatar_lad.xml`
|
||||||
|
- `codegen/inputs/avatar_skeleton.xml`
|
||||||
|
- `codegen/inputs/genepool.xml`
|
||||||
|
- `codegen/inputs/grass.xml`
|
||||||
|
- `codegen/inputs/trees.xml`
|
||||||
|
|
||||||
|
The original author/attribution party is Linden Lab. MetaCrate copied these
|
||||||
|
files without modification from the pinned LibreMetaverse `LibreMetaverse/linden/`
|
||||||
|
tree. Their generated Rust data tables identify the input, exact SHA-256, and
|
||||||
|
CC-BY-SA-3.0 license. The license URI and pinned legal-code hash are retained in
|
||||||
|
[`licenses/CC-BY-SA-3.0-NOTICE.md`](licenses/CC-BY-SA-3.0-NOTICE.md).
|
||||||
|
|
||||||
|
No Linden textures, meshes, animations, gestures, clothing, body parts, or
|
||||||
|
viewer binaries are included. The protocol `message_template.msg` is separately
|
||||||
|
tracked as BSD-3-Clause material from LibreMetaverse's `data/` tree and is not
|
||||||
|
classified as a Linden CC asset by the pinned upstream repository.
|
||||||
|
|
||||||
|
## Generated and translated material
|
||||||
|
|
||||||
|
Generated Rust files retain machine-readable source hashes and licenses in
|
||||||
|
their headers. The LSL parser grammar snapshot, compatibility fixtures,
|
||||||
|
translated tests, API mappings, and program mappings are covered by the
|
||||||
|
MetaCrate and upstream BSD notices. Their exact provenance is checked by the
|
||||||
|
Rust release-provenance audit and its locked manifests.
|
||||||
|
|
||||||
|
## Dependencies and native components
|
||||||
|
|
||||||
|
[`release/THIRD-PARTY-NOTICES.md`](release/THIRD-PARTY-NOTICES.md) contains the
|
||||||
|
complete locked Rust package inventory and the license/notice files shipped by
|
||||||
|
each package. [`release/NATIVE-LICENSES.md`](release/NATIVE-LICENSES.md) records
|
||||||
|
native components, whether MetaCrate bundles them, and the notice obligations
|
||||||
|
for binary distributors. Both are generated from
|
||||||
|
[`ci/provenance-policy.json`](ci/provenance-policy.json) and `Cargo.lock`.
|
||||||
|
|
||||||
|
A source or binary distribution is complete only when it includes the notice
|
||||||
|
files required by [`release/DISTRIBUTION-MANIFEST.json`](release/DISTRIBUTION-MANIFEST.json).
|
||||||
551
README.md
551
README.md
@@ -1,23 +1,30 @@
|
|||||||
# MetaCrate
|
# MetaCrate
|
||||||
|
|
||||||
|
The [Rust API and C# migration guide](docs/rust-api-guide.md) explains crate
|
||||||
|
selection, ownership, async cancellation, errors, events, native prerequisites,
|
||||||
|
and credential-safe OpenSim operation. The generated
|
||||||
|
[documentation coverage report](api/DOCUMENTATION-COVERAGE.md) ties the public
|
||||||
|
Rust surface back to the pinned C# type and member mappings.
|
||||||
|
The reviewed [first-release API and SemVer audit](api/SEMVER-AUDIT.md) fixes the
|
||||||
|
`0.0.1` public surface, features, ownership and async contracts, and intentional
|
||||||
|
migration differences in a deterministic baseline.
|
||||||
|
|
||||||
MetaCrate is a test-driven, clean native Rust reimplementation of
|
MetaCrate is a test-driven, clean native Rust reimplementation of
|
||||||
[LibreMetaverse](https://github.com/cinderblocks/libremetaverse). LibreMetaverse
|
[LibreMetaverse](https://github.com/cinderblocks/libremetaverse). LibreMetaverse
|
||||||
is a behavioral and API reference only: the finished project must not load,
|
is a behavioral and API reference only: the finished project must not load,
|
||||||
host, bind to, invoke, or ship the .NET implementation. The current
|
host, bind to, invoke, or ship the .NET implementation. The project is in
|
||||||
stage is a compiling structural shell: crate boundaries mirror the .NET library
|
release hardening: crate boundaries mirror the .NET libraries, every mapped
|
||||||
projects, public C# type names have Rust declarations, every upstream NUnit
|
public type and member has a documented native Rust destination, and every
|
||||||
invocation has a traceable catalog entry, and every sample/tool project has a
|
sample/tool project has a tested Rust binary target. Types, structured data,
|
||||||
Rust binary target. Types, StructuredData, Imaging, PrimMesher, both rendering adapters, and
|
imaging, meshing/rendering, packet and message codecs, client/network runtime,
|
||||||
the main assembly's packet/message/asset/primitive wire-data, core
|
avatar/world/social/service managers, RLV, LSL tools, utilities, Vivox, and
|
||||||
runtime/networking, avatar-facing manager, world/social/service manager, RLV,
|
WebRTC are implemented without a CLR bridge. The independent downstream
|
||||||
LSL tools, Utilities, Vivox, and WebRTC slices now have complete callable,
|
fixture compiles every cataloged type and member with zero exclusions, and all
|
||||||
failure-only signatures. The independent downstream fixture compiles every
|
1,289 upstream NUnit invocations have reviewed Rust parity cases.
|
||||||
cataloged type and member with zero exclusions; semantic Rust test translations
|
|
||||||
are the next stage.
|
|
||||||
|
|
||||||
Pending NUnit cases are inventory only, not generated fake tests. A case counts
|
A case counts as translated only when an explicit Rust test body calls the
|
||||||
as translated only when an explicit Rust test body calls the mapped API and
|
mapped API and retains the upstream identity and body hash. The parity ledger
|
||||||
retains the upstream identity and body hash.
|
now contains zero pending or unreviewed cases.
|
||||||
|
|
||||||
The source snapshot, compatibility rules, dependency research, and ordered
|
The source snapshot, compatibility rules, dependency research, and ordered
|
||||||
implementation plan are in [RUSTREWRITE.md](RUSTREWRITE.md).
|
implementation plan are in [RUSTREWRITE.md](RUSTREWRITE.md).
|
||||||
@@ -27,9 +34,11 @@ The authoritative compiled .NET surface is checked in as
|
|||||||
reviewed Rust destination in [`api/RUST-TYPES.tsv`](api/RUST-TYPES.tsv) and
|
reviewed Rust destination in [`api/RUST-TYPES.tsv`](api/RUST-TYPES.tsv) and
|
||||||
[`api/RUST-MAPPING.tsv`](api/RUST-MAPPING.tsv); [`api/README.md`](api/README.md)
|
[`api/RUST-MAPPING.tsv`](api/RUST-MAPPING.tsv); [`api/README.md`](api/README.md)
|
||||||
documents deterministic regeneration and validation.
|
documents deterministic regeneration and validation.
|
||||||
All API crates expose the same typed `Error` for fallible unimplemented members;
|
API mappings record ownership, async, error, overload, and native implementation
|
||||||
infallible shims use `libremetaverse_types::unimplemented_api!` so placeholders
|
decisions, and the generated rustdoc keeps those contracts attached to their
|
||||||
cannot look like successful behavior.
|
exact C# documentation IDs.
|
||||||
|
|
||||||
|
Building MetaCrate requires Rust 1.97.1 or newer.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cargo build --workspace
|
cargo build --workspace
|
||||||
@@ -37,8 +46,63 @@ cargo test --workspace --no-run
|
|||||||
python3 tools/generate_rust_mapping.py --check
|
python3 tools/generate_rust_mapping.py --check
|
||||||
python3 tools/generate_api_shims.py --check
|
python3 tools/generate_api_shims.py --check
|
||||||
python3 tools/check_test_parity.py
|
python3 tools/check_test_parity.py
|
||||||
|
python3 tools/audit_red_suite.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Image codec features
|
||||||
|
|
||||||
|
The default build needs no system image-codec library. It includes the
|
||||||
|
project-owned TGA and DDS implementations, pure-Rust J2K/JP2 through
|
||||||
|
`rust-j2k`, and pure-Rust common-raster decoding through the default
|
||||||
|
`libremetaverse-imaging-skia` `rust-skia` feature. The default `dds-bc67`
|
||||||
|
feature uses the pure-Rust `bcdec_rs` dependency for BC6H and BC7. Use
|
||||||
|
`--no-default-features` only for a deliberately minimal codec-free build.
|
||||||
|
|
||||||
|
The available default and optional codec backends are:
|
||||||
|
|
||||||
|
| Capability | Feature | Build command | External prerequisite |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Raw J2K and JP2 decoding/encoding in pure Rust (default) | `libremetaverse/rust-j2k` | `cargo build -p libremetaverse` | none |
|
||||||
|
| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding in pure Rust (default) | `libremetaverse-imaging-skia/rust-skia` | `cargo build -p libremetaverse-imaging-skia` | none |
|
||||||
|
| Raw J2K and JP2 decoding/encoding through OpenJPEG (optional) | `libremetaverse/jpeg2000` | `cargo build -p libremetaverse --features jpeg2000` | OpenJPEG 2.5.4 or newer |
|
||||||
|
| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding through native Skia | `libremetaverse-imaging-skia/skia` | `cargo build -p libremetaverse-imaging-skia --features skia` | A matching rust-skia binary cache, or the documented native source-build tools |
|
||||||
|
| PCM to Ogg Vorbis encoding | `libremetaverse/vorbis` | `cargo build -p libremetaverse --features vorbis` | `vorbis_rs` 0.5.6 and its native encoder build prerequisites |
|
||||||
|
|
||||||
|
Run their focused test suites with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test -p libremetaverse-imaging --features jpeg2000
|
||||||
|
cargo test -p libremetaverse-imaging
|
||||||
|
cargo test -p libremetaverse-imaging-skia --features skia
|
||||||
|
cargo test -p libremetaverse-imaging-skia
|
||||||
|
cargo test -p libremetaverse --no-default-features --features vorbis
|
||||||
|
```
|
||||||
|
|
||||||
|
`cargo build --workspace --all-features` enables all optional backends and
|
||||||
|
therefore requires both sets of native prerequisites. Platform installation,
|
||||||
|
offline-build, cache, and redistribution details are in the
|
||||||
|
[`OpenJPEG adapter guide`](crates/libremetaverse-openjpeg/README.md) and
|
||||||
|
[`Skia adapter guide`](crates/libremetaverse-imaging-skia/README.md).
|
||||||
|
|
||||||
|
The validated Linux/Windows/macOS target and feature inventory, clean
|
||||||
|
profile runner, native prerequisite evidence, and manual platform boundaries
|
||||||
|
are documented in the [release CI matrix](docs/release-ci-matrix.md).
|
||||||
|
The [native release artifact audit](docs/release-artifacts.md) documents the
|
||||||
|
clean-machine package build, binary/link inspection, offline runtime smokes,
|
||||||
|
and evidence proving that shipped artifacts have no CLR or bridge dependency.
|
||||||
|
The aggregate [0.0.1 release-candidate gate](docs/release-candidate.md) combines
|
||||||
|
those audits with versioning, parity, zero-stub, fake/OpenSim, checksum, and
|
||||||
|
release-note requirements; it records blockers instead of waiving them.
|
||||||
|
Deterministic task, socket, file, subscription, cancellation, and allocation
|
||||||
|
baselines are documented in the
|
||||||
|
[concurrency hardening guide](docs/concurrency-hardening.md).
|
||||||
|
|
||||||
|
The default `rust-j2k` backend never enables the native OpenJPEG adapter. Its
|
||||||
|
explicit `RustJ2kCodec` preserves the existing `J2kCodec` meaning when both
|
||||||
|
features are enabled. Likewise, default `RustSkiaTextureCodec` selection does
|
||||||
|
not rename or enable native `SkiaTextureCodec`. The native features remain
|
||||||
|
available for backend-interoperability testing or explicit application use.
|
||||||
|
|
||||||
`tests/upstream-tests.json` is the machine-readable NUnit parity catalog.
|
`tests/upstream-tests.json` is the machine-readable NUnit parity catalog.
|
||||||
Translated tests live in hand-written Rust files with the `parity-case` marker
|
Translated tests live in hand-written Rust files with the `parity-case` marker
|
||||||
documented in `tests/PARITY.md`; `python3 tools/generate_surface.py --check`
|
documented in `tests/PARITY.md`; `python3 tools/generate_surface.py --check`
|
||||||
@@ -46,3 +110,456 @@ verifies the catalog against the pinned adjacent LibreMetaverse checkout without
|
|||||||
overwriting those files.
|
overwriting those files.
|
||||||
|
|
||||||
Running `cargo test --workspace` is intentionally red during the shim stage.
|
Running `cargo test --workspace` is intentionally red during the shim stage.
|
||||||
|
|
||||||
|
## Native implementation progress
|
||||||
|
|
||||||
|
### Milestone 04
|
||||||
|
|
||||||
|
Milestone 04 is complete. `libremetaverse-types` now provides
|
||||||
|
native UUID, incremental CRC-32, little-endian floating-point byte helpers,
|
||||||
|
Vector2/Vector3/Vector3d/Vector4 arithmetic and serialization, Color4 color
|
||||||
|
conversion, Ray storage, Quaternion rotation/interpolation/serialization, and
|
||||||
|
Matrix4 construction, transforms, inversion, and decomposition. UUID protocol
|
||||||
|
bytes use explicit network order while `compat::Guid` conversions preserve the
|
||||||
|
mixed-endian .NET byte-array layout. Vector, color, and normalized quaternion
|
||||||
|
byte encodings are explicitly little-endian and do not depend on host
|
||||||
|
architecture. Matrix4 preserves LibreMetaverse's row-major storage, row-vector
|
||||||
|
transform direction, and translation in the fourth row; quaternion components
|
||||||
|
are stored as `(x, y, z, w)` and products use the reference Hamilton-product
|
||||||
|
direction. All Types enum discriminants retain their C# widths, extensible
|
||||||
|
protocol flags preserve unknown bits, and the native conversion layer covers
|
||||||
|
numeric and floating-point byte order, UTF-8
|
||||||
|
and hex text, hashes and PBKDF2, timestamps, IP addresses, region handles, enum
|
||||||
|
metadata, and cross-platform OS detection. The Types collections,
|
||||||
|
including duplicate-preserving multi-value and synchronized double-key maps,
|
||||||
|
bounded LRU/MRU caches, deterministic absolute and sliding expiration, and
|
||||||
|
hierarchical token-bucket throttling are native Rust as well. Cache and bucket
|
||||||
|
tests use injected monotonic clocks, and concurrency invariants run without
|
||||||
|
sleep-based timing. All 45 Types and all 942 mapped members now resolve to
|
||||||
|
native implementations; no generated Types shims remain.
|
||||||
|
|
||||||
|
### Milestone 05
|
||||||
|
|
||||||
|
Milestone 05 now has a native, format-neutral OSD value model with structural
|
||||||
|
equality and hashing, permissive `LibreMetaverse` conversion defaults, explicit
|
||||||
|
integer/date byte order, synchronized snapshot-based arrays and maps, and
|
||||||
|
bounded parser dispatch. OSD map order is intentionally unspecified at the
|
||||||
|
public model boundary; encoders must choose and document any stable ordering
|
||||||
|
they require. Untrusted dispatch limits input bytes, nesting depth, decoded
|
||||||
|
nodes, and aggregate binary allocation before returning a value. The native
|
||||||
|
Binary LLSD codec covers every reference marker, both accepted headers, exact
|
||||||
|
numeric and date byte order, seekable stream overloads, and position-bearing
|
||||||
|
errors for malformed or truncated input. Its parser and encoder enforce the
|
||||||
|
same byte, depth, node, and allocation bounds; map keys are encoded in sorted
|
||||||
|
order to make output stable despite the model's intentionally unordered maps.
|
||||||
|
The bounded Notation LLSD codec preserves UTF-16 length-prefix semantics, the
|
||||||
|
reference escape rules and accepted scalar spellings, base64, base16 and
|
||||||
|
length-prefixed binary forms, and both compact and formatted output. Malformed
|
||||||
|
notation reports UTF-16 offsets with parser context, while input, output,
|
||||||
|
nesting, node, and aggregate allocation limits apply to untrusted text.
|
||||||
|
The native XML LLSD codec covers the wrapper and inner-element APIs, all scalar
|
||||||
|
and container elements, namespace-local names, XML declarations, comments,
|
||||||
|
CDATA, entity decoding, and the reference's nonstandard Linden processing
|
||||||
|
instruction handling. Serialization is compact and deterministic for maps.
|
||||||
|
DTD declarations and named entity expansion are disabled; input, output,
|
||||||
|
nesting, node, and aggregate allocation limits are enforced with byte-positioned
|
||||||
|
parse errors.
|
||||||
|
JSON conversion is explicit rather than a derived Serde mapping: integral
|
||||||
|
width coercion, empty strings, binary arrays, typed values, and the reference's
|
||||||
|
default omission rules retain their C# behavior. Its reader rejects duplicate
|
||||||
|
properties and enforces byte, depth, node, and allocation limits while compact
|
||||||
|
output uses System.Text.Json-compatible escaping and stable map-key ordering.
|
||||||
|
The private OSD Protobuf schema is implemented directly with fixed field tags,
|
||||||
|
ZigZag `int32`, little-endian IEEE-754 fixed64 values, 16-byte UUIDs, bounded
|
||||||
|
length-delimited containers, and wire-type-aware unknown-field skipping. The
|
||||||
|
schema remains an internal compatibility format; native encoders emit stable
|
||||||
|
sorted maps and accept the exact optional LLSD Protobuf header.
|
||||||
|
Cross-format conversion follows the reference's format-specific boundaries:
|
||||||
|
|
||||||
|
| Format | Round-trip behavior |
|
||||||
|
| --- | --- |
|
||||||
|
| Binary LLSD | All regular OSD variants are lossless; raw `OSDLlsdXml` is unsupported. |
|
||||||
|
| Notation LLSD | All regular OSD variants are lossless; raw `OSDLlsdXml` is unsupported. |
|
||||||
|
| XML LLSD | Regular variants are lossless; raw `OSDLlsdXml` is injected as an element and therefore decodes as that element's ordinary OSD value. |
|
||||||
|
| JSON OSD | Booleans, integers, reals, nonempty strings, maps, and arrays retain structure; UUID, date, and URI become strings, binary becomes an integer array, and undefined, empty strings, and raw XML become JSON `null`. |
|
||||||
|
| Protobuf OSD | Regular variants are lossless within the reference schema's date range and whole-second precision; raw `OSDLlsdXml` maps to undefined. |
|
||||||
|
|
||||||
|
Checked-in malformed corpora and bounded deterministic mutations exercise all
|
||||||
|
five parsers without an external fuzzing runtime. They cover truncation, tags,
|
||||||
|
lengths, payloads, delimiters, nesting, entity rejection, contextual errors,
|
||||||
|
and the parser resource limits. Every encoder sorts map keys where necessary,
|
||||||
|
so serialization is deterministic across platforms.
|
||||||
|
|
||||||
|
### Milestone 06
|
||||||
|
|
||||||
|
Milestone 06 starts with a native `ManagedImage`: top-left-origin,
|
||||||
|
byte-per-sample planar storage has an explicit width-byte row stride, with gray
|
||||||
|
stored in the red plane and optional color, alpha, and bump planes. Checked
|
||||||
|
constructors and resizers cap decoded images at 4096 by 4096 worth of pixels,
|
||||||
|
codec adapters cap buffered encoded input at 64 MiB, and canonical
|
||||||
|
interleaving accepts explicit row strides without exposing codec-library types
|
||||||
|
through the core abstraction.
|
||||||
|
The native TGA/Pfim-compatible path decodes uncompressed and RLE true-color,
|
||||||
|
grayscale, and indexed TGA data with all descriptor orientations, plus bounded
|
||||||
|
legacy and DX10 DDS packed luminance/RGB(A) layouts and BC1 through BC7 blocks.
|
||||||
|
TGA output preserves the reference header, BGR(A) order, descriptor choice,
|
||||||
|
alpha-only expansion, and deterministic trailing padding. File and stream
|
||||||
|
inputs are capped before decoding, and all dimensions, packed rows, palettes,
|
||||||
|
packets, masks, and block indices use checked arithmetic with positioned parse
|
||||||
|
errors.
|
||||||
|
Legacy and DX10 BC1 through BC5 decoding is built in. The default `dds-bc67`
|
||||||
|
feature adds BC6H/BC7 decoding through the safe, pure-Rust `bcdec_rs` crate;
|
||||||
|
disabling default features removes that optional dependency and makes those
|
||||||
|
two formats return a typed unsupported-format error.
|
||||||
|
The default `rust-j2k` feature provides raw J2K and JP2 lossless/lossy encoding
|
||||||
|
and decoding through `RustJ2kCodec`, backed by the exact pure-Rust `j2k` 0.8.1
|
||||||
|
release. It supports native component precision/signedness/order,
|
||||||
|
reduced-resolution and progressive quality-layer decoding, and strict or
|
||||||
|
explicitly permissive truncation handling. It has no C/C++ codec, CMake,
|
||||||
|
pkg-config, vcpkg, CLR, or platform-specific API.
|
||||||
|
The optional `jpeg2000` feature provides the native OpenJPEG alternative. It
|
||||||
|
provides raw J2K and JP2 lossless/lossy encoding and decoding, preserves one through five
|
||||||
|
component order, precision, signedness, and alpha metadata until explicit byte
|
||||||
|
conversion, and bounds encoded input, output, dimensions, and decoded samples.
|
||||||
|
The compatibility encoder reproduces CoreJ2K's four-plane RGB/alpha view,
|
||||||
|
including its alpha-only and opaque-alpha substitutions. See
|
||||||
|
[`crates/libremetaverse-openjpeg/README.md`](crates/libremetaverse-openjpeg/README.md)
|
||||||
|
for OpenJPEG prerequisites, licensing, and deployment details. Default builds
|
||||||
|
do not discover or link OpenJPEG.
|
||||||
|
The default pure-Rust raster adapter decodes BMP, GIF, ICO, JPEG, PNG, WBMP,
|
||||||
|
and WebP into the same checked planar representation through
|
||||||
|
`RustSkiaTextureCodec`. Its optional native `skia` feature uses pinned
|
||||||
|
rust-skia binary-cache configurations on macOS, Linux, and Windows, normalizes
|
||||||
|
premultiplied color at the imaging boundary, and keeps encoded input, decoded
|
||||||
|
dimensions, strides, and allocations bounded. See
|
||||||
|
[`crates/libremetaverse-imaging-skia/README.md`](crates/libremetaverse-imaging-skia/README.md)
|
||||||
|
for native prerequisites, cache/source-build controls, licenses, and packaging
|
||||||
|
details. Default workspace builds compile neither OpenJPEG nor native Skia.
|
||||||
|
Primitive profile and path meshing is implemented in native Rust from the
|
||||||
|
pinned `PrimMesher.cs` reference. It covers checked linear, flexible, and
|
||||||
|
circular extrusion; profile cuts and hollows; twist, taper, shear, skew,
|
||||||
|
radius, and revolutions; cap and side winding; normals, UVs, viewer faces, and
|
||||||
|
prim-face indexing. Geometry allocation and index arithmetic are bounded, and
|
||||||
|
identical finite inputs produce deterministic mesh output on every supported
|
||||||
|
platform.
|
||||||
|
Sculpt maps are sampled through the same checked imaging abstraction and can
|
||||||
|
produce plane, sphere, torus, and cylinder topology with reference seam,
|
||||||
|
mirror, inversion, LOD, normal, UV, and viewer-face behavior. Native viewer
|
||||||
|
indexing deduplicates vertices per prim face, while bounded Wavefront OBJ
|
||||||
|
ingestion preserves object/group output and position/UV/normal associations.
|
||||||
|
Malformed dimensions, channel layouts, topology, and indices return typed
|
||||||
|
errors without partial meshes or panics.
|
||||||
|
The milestone-owned feature matrix, rendering-data contract, reproducible
|
||||||
|
audit, cross-platform CI commands, bounds, and large-input performance
|
||||||
|
baselines are documented in
|
||||||
|
[`docs/imaging-meshing.md`](docs/imaging-meshing.md).
|
||||||
|
The controlled audit aggregates every expected failure by standardized C#
|
||||||
|
member ID and rejects unrelated fixture, assertion, compile, or symbol errors.
|
||||||
|
|
||||||
|
### Milestone 07
|
||||||
|
|
||||||
|
The deterministic, Rust-only source-data generator framework and its complete
|
||||||
|
pinned input inventory are documented in
|
||||||
|
[`codegen/README.md`](codegen/README.md).
|
||||||
|
The first native data generator now parses the pinned protocol template into a
|
||||||
|
checked-in catalog covering all 483 packets, 905 blocks, exact field widths,
|
||||||
|
repetition rules, flags, IDs, and frequencies. It supplies the public
|
||||||
|
`PacketType`, deterministic lookup tables, and real default construction and
|
||||||
|
sizing behavior for every mapped packet/block while validating the complete
|
||||||
|
shape against the pinned compiled C# API catalog. The generated native packet
|
||||||
|
codec implements the reference header frequencies and IDs, flags, sequences,
|
||||||
|
appended ACKs, little-endian fields, big-endian ports, fixed and length-prefixed
|
||||||
|
data, block repetition, zerocoding, bounded decoding, and MTU packet splitting.
|
||||||
|
Golden-byte tests and generated round trips cover every packet type without
|
||||||
|
requiring the C# toolchain at build or test time.
|
||||||
|
The native XML generators also emit all 672 visual parameters and all 21 tree
|
||||||
|
and 6 grass definitions from the pinned character and foliage inputs. Generated
|
||||||
|
types preserve ranges, defaults, groups, wearables, color/alpha data, driven
|
||||||
|
relationships, skeletal/volume morphs, and every foliage rendering property.
|
||||||
|
Schema validation rejects malformed or ambiguous input, while sorted visual-ID
|
||||||
|
and source-indexed foliage lookups preserve the ordering observable in the
|
||||||
|
reference APIs and packet bytes.
|
||||||
|
The remaining avatar-data generators emit the full 133-bone/26-collision-volume
|
||||||
|
skeleton hierarchy, both masculine and feminine versions of the default and
|
||||||
|
updated 11-slot attention tables, and all 24 genepool archetypes with 3,360
|
||||||
|
visual-parameter values. Native skeleton traversal, alias lookup, expanded mesh
|
||||||
|
joint lists, custom XML loading, attention indexing, and archetype lookup now
|
||||||
|
implement the mapped behavior directly in Rust. Each checked-in catalog retains
|
||||||
|
its own input hash and license provenance.
|
||||||
|
|
||||||
|
### Milestone 08
|
||||||
|
|
||||||
|
The native client core now provides the exact grouped `Settings` defaults from
|
||||||
|
the golden C# implementation, validates endpoints, durations, limits, cache
|
||||||
|
policy, and download policy, and exposes typed configuration and lifecycle
|
||||||
|
errors. `GridClient` construction and drop have no network side effects and do
|
||||||
|
not create an async runtime. Explicitly composed services share a cancellation
|
||||||
|
token and are shut down idempotently in network, manager, HTTP, then rate-limiter
|
||||||
|
order. Injected clocks support deterministic tests, while `Debug` output omits
|
||||||
|
endpoint values and service internals. The ownership and executor requirements
|
||||||
|
are documented in [`docs/client-core.md`](docs/client-core.md).
|
||||||
|
The native Tokio UDP layer now implements the C# packet buffers and throttle
|
||||||
|
encoding plus bounded socket receive, coordination, and single-writer tasks.
|
||||||
|
It assigns wrapping protocol sequences, aggregates and consumes ACKs, retries
|
||||||
|
reliable packets with duplicate suppression, preserves zerocoding and the
|
||||||
|
1,200-byte MTU contract, applies independent task/texture/asset token buckets,
|
||||||
|
and exposes payload-free transport statistics. All queues, peer state,
|
||||||
|
zerocode expansion, ACK state, and reliable windows have explicit limits;
|
||||||
|
linked cancellation and final drop release every socket task. The executor,
|
||||||
|
wire, backpressure, retry, and security contracts are documented in
|
||||||
|
[`docs/udp-transport.md`](docs/udp-transport.md).
|
||||||
|
The native network manager now layers ordered packet and CAPS callback
|
||||||
|
registries, typed RAII subscriptions, synchronized simulator collections,
|
||||||
|
cancellable connection events, ACK-gated circuit setup, current-simulator and
|
||||||
|
seed-capability selection, CAPS `EnableSimulator`, UDP `DisableSimulator`, ping
|
||||||
|
handling, typed region-handshake replies, two-interval keepalive detection, and
|
||||||
|
deterministic disconnect reasons on that transport. Callback lists are
|
||||||
|
snapshotted before invocation, and manager/transport workers retain no dropped
|
||||||
|
client owner. The ownership,
|
||||||
|
dispatch, lifecycle, and fake-server verification contracts are documented in
|
||||||
|
[`docs/network-manager.md`](docs/network-manager.md).
|
||||||
|
The capability transport is now native Rust as well. `HttpCapsClient` supports
|
||||||
|
the C# GET/POST/PUT/PATCH/DELETE and LLSD overloads through an injectable
|
||||||
|
`reqwest`/fake-handler boundary, with HTTPS, bounded redirects, gzip/deflate,
|
||||||
|
streaming progress, cancellation, explicit request/response/decompression
|
||||||
|
limits, and rejection of outbound non-HTTP capability URIs. The per-category
|
||||||
|
oldest-first token buckets retain the reference defaults and cap-name mapping.
|
||||||
|
The download manager adds a bounded queue and concurrency gate, canonical-URI
|
||||||
|
deduplication, subscriber progress fanout, shared cancellation, and transient
|
||||||
|
retry handling while preserving permanent 401/403/404/410 failures. Capability
|
||||||
|
URLs and tokens are absent from errors and diagnostics. Ownership, limits,
|
||||||
|
injection, and offline fake-server coverage are documented in
|
||||||
|
[`docs/caps-http.md`](docs/caps-http.md).
|
||||||
|
Login is implemented against that transport with the C# password-hashing and
|
||||||
|
token rules, viewer/channel/platform fields, start-location normalization,
|
||||||
|
bounded redirects, cancellation, and typed status transitions. Native response
|
||||||
|
parsing populates session, simulator, inventory, buddy, account-benefit, and
|
||||||
|
service fields before the initial UDP circuit and seed capability are installed.
|
||||||
|
Credentials and session/capability tokens are redacted from diagnostics, and
|
||||||
|
offline fake login/simulator tests cover success, rejection, redirect, timeout,
|
||||||
|
and cancellation cleanup. The login contract is documented with the network
|
||||||
|
lifecycle in [`docs/network-manager.md`](docs/network-manager.md).
|
||||||
|
Region handoff and logout now follow the same packet-level lifecycle as the
|
||||||
|
golden implementation: a promoted simulator receives `UseCircuitCode` and
|
||||||
|
`CompleteAgentMovement`, while blocking, asynchronous, and nonblocking logout
|
||||||
|
send `LogoutRequest`, validate `LogoutReply`, preserve callback ordering, and
|
||||||
|
perform bounded idempotent teardown. Shutdown cancels login/logout work before
|
||||||
|
closing every simulator and worker, clears session and capability secrets, and
|
||||||
|
allows the manager to reconnect cleanly afterward. Loopback fake-server tests
|
||||||
|
cover handoff, reconnect, reply, timeout, cancellation, and repeated shutdown.
|
||||||
|
Seed-cap discovery and `EventQueueGet` are native Rust too: the full reference
|
||||||
|
capability list is posted as LLSD/XML, accepted URIs are rate-categorized, and
|
||||||
|
bounded long polls preserve ack IDs, reconnect retries, shutdown `done`, and
|
||||||
|
event order. Typed Linden messages share the CAPS dispatch registry; unknown
|
||||||
|
messages remain observable and then use the generated caps-to-packet catalog so
|
||||||
|
packet handlers receive them through the same bounded pipeline as UDP traffic.
|
||||||
|
The milestone gate now drives login, UDP, seed discovery, event-queue region
|
||||||
|
enablement, capability download, simulator handoff, and logout through one
|
||||||
|
offline fake grid. Native `Simulator.SimStats` uses atomic C#-compatible
|
||||||
|
counters and receives real UDP and server-stat updates without exposing packet
|
||||||
|
payloads or endpoints. The gate asserts token redaction, bounded policies, and
|
||||||
|
joined CAPS/download/network tasks; `tools/check_milestone_08.py` prevents owned
|
||||||
|
networking stubs or required audit evidence from regressing.
|
||||||
|
|
||||||
|
### Milestone 09
|
||||||
|
|
||||||
|
The first world-services slice provides a native non-movement `AgentManager`
|
||||||
|
over the milestone 08 transport. Chat, instant messages and conferences,
|
||||||
|
gestures, animation, viewer effects, balance and payments, profiles, notes,
|
||||||
|
picks, classifieds, display names, language/access/preferences, experiences,
|
||||||
|
viewer reporting, benefits, attachment resources, mute lists, and nav-mesh
|
||||||
|
status now use their C#-compatible LLUDP or capability paths. Incoming state is
|
||||||
|
updated before callbacks, and callbacks run outside synchronization locks.
|
||||||
|
Gesture assets have a native version-2 parser and executor with bounded HTTP
|
||||||
|
and UDP download paths. An offline fake grid verifies capability discovery and
|
||||||
|
the resulting chat, animation, and sound packets. The ownership, cancellation,
|
||||||
|
limits, and compatibility rules are documented in
|
||||||
|
[`docs/agent-manager.md`](docs/agent-manager.md).
|
||||||
|
|
||||||
|
Native movement now covers all control flags, camera frame math, periodic and
|
||||||
|
manual `AgentUpdate`, flying/crouching/jumping/sitting/standing, always-run,
|
||||||
|
FOV, and autopilot packets. Teleport requests and UDP/CAPS progress messages
|
||||||
|
share cancellation-safe waiters, while region handoffs use a bounded,
|
||||||
|
diagnosable crossing state machine with recovery to the old simulator. Paused
|
||||||
|
time tests and a loopback fake grid verify exact wire fields and clean worker
|
||||||
|
shutdown. The compatibility and lifecycle contract is documented in
|
||||||
|
[`docs/agent-movement.md`](docs/agent-movement.md).
|
||||||
|
|
||||||
|
Native inventory now preserves the complete item/folder model hierarchy,
|
||||||
|
permissions, concrete subclasses, parent/descendant counts, link resolution,
|
||||||
|
root/library semantics, system-folder lookup, and C# sort flags. Local mutation
|
||||||
|
is transport-independent and observer callbacks run after locks are released.
|
||||||
|
The versioned 64 MiB-bounded cache validates complete snapshots before install
|
||||||
|
and uses same-directory temporary replacement with rollback. The compatibility
|
||||||
|
and persistence contract is documented in
|
||||||
|
[`docs/inventory.md`](docs/inventory.md).
|
||||||
|
|
||||||
|
Native asset models now enforce bounded format decoding, real JPEG 2000 and Ogg
|
||||||
|
Vorbis codec boundaries, client-owned capability and LLUDP downloads, complete
|
||||||
|
small/Xfer and two-stage capability uploads, independent cancellation for
|
||||||
|
deduplicated HTTP subscribers, and atomic size-pruned disk caching. The ownership,
|
||||||
|
correlation, and corruption contracts are documented in
|
||||||
|
[`docs/assets.md`](docs/assets.md).
|
||||||
|
|
||||||
|
Deterministic OAR/tar IO, bounded GLTF/GLB and Collada conversion, material
|
||||||
|
resolution, and opt-in mesh pricing/upload now use the same native asset and
|
||||||
|
capability layers. Their archive safety, offline determinism, and live-upload
|
||||||
|
boundaries are also documented in [`docs/assets.md`](docs/assets.md).
|
||||||
|
|
||||||
|
The client-owned `InventoryManager` now implements the packet-level create,
|
||||||
|
update, move, copy, remove, fetch, search, give, rez/derez, script-state, and
|
||||||
|
task-inventory workflows. Callback IDs and concurrent item/task waiters are
|
||||||
|
bounded and cancellation-safe; generated multi-block packets retain the UDP
|
||||||
|
codec's MTU-aware splitting. Capability replies and UDP replies are validated
|
||||||
|
before store reconciliation, and legacy task inventory uses a 16 MiB-bounded
|
||||||
|
`ReplyTaskInventory`/`RequestXfer` state machine. Focused translated and native
|
||||||
|
fake-packet tests cover correlation, stale replies, offers, bulk completion,
|
||||||
|
capability task inventory, and malformed transfer sizes.
|
||||||
|
|
||||||
|
The client-owned `InventoryAISClient` implements Inventory/Library API v3
|
||||||
|
category, child, link, item, outfit, orphan, and trash resources with exact
|
||||||
|
LLSD XML request shapes and `COPY` destination headers. Parsed objects,
|
||||||
|
side-effect removals, and folder versions are validated and reconciled through
|
||||||
|
one atomic store transaction; cancellation and malformed responses cannot
|
||||||
|
partially mutate the cache. Focused compatibility and injected-HTTP tests cover
|
||||||
|
link correction, endpoint recording, error isolation, and metadata updates.
|
||||||
|
|
||||||
|
The milestone closes with one deterministic cross-manager fake-grid scenario
|
||||||
|
and a reproducible owned-test runner. The scenario covers authenticated agent
|
||||||
|
state, movement and handoff, shared inventory/AIS state, assets and appearance,
|
||||||
|
avatar/animesh and object entry points, land and discovery caches, social,
|
||||||
|
estate, experience and marketplace construction, ordered events, redacted
|
||||||
|
diagnostics, clean logout, and root cancellation. The complete audit and test
|
||||||
|
boundary is documented in
|
||||||
|
[`docs/world-milestone-gate.md`](docs/world-milestone-gate.md).
|
||||||
|
|
||||||
|
Native appearance state now tracks layered wearables and attachment points,
|
||||||
|
sends the inventory-backed wearable and attachment LLUDP messages, and exposes
|
||||||
|
worn queries by slot, item, and point. The client-owned Current Outfit Folder
|
||||||
|
service resolves inventory links, preserves layer descriptions, serializes
|
||||||
|
concurrent mutations through a cancellation-aware gate, and compensates failed
|
||||||
|
link or attachment replacement without publishing partial local state.
|
||||||
|
Composite policies make pure decisions from snapshots and receive committed
|
||||||
|
changes after synchronization is released. The behavior and transaction
|
||||||
|
boundaries are documented in [`docs/appearance.md`](docs/appearance.md).
|
||||||
|
|
||||||
|
The appearance service now completes cached, local, and server-side baking for
|
||||||
|
all 11 bake targets. It parses wearable parameters and texture indices,
|
||||||
|
downloads and decodes texture inputs through a bounded provider abstraction,
|
||||||
|
composites color/alpha/bump layers, uploads JPEG2000 bakes, builds the complete
|
||||||
|
appearance packet, and handles cache and forced-rebake messages without locks
|
||||||
|
crossing awaits or callbacks. First-login outfit setup performs a bounded
|
||||||
|
library copy and transactional COF application with monotonic progress,
|
||||||
|
cancellation, and compensation. Exact mappings, hashes, generated visual data,
|
||||||
|
pixels, packet/event payloads, and recovery behavior are covered by focused
|
||||||
|
tests and documented in [`docs/appearance.md`](docs/appearance.md).
|
||||||
|
|
||||||
|
Native land services now correlate parcel overlays, properties, access lists,
|
||||||
|
owners, dwell, remote lookups, and bounded script-resource capabilities while
|
||||||
|
maintaining the simulator's four-metre parcel map. The 16×16 terrain codec
|
||||||
|
handles normal and rectangular large-region patches, wind layers, and four-slot
|
||||||
|
PBR material overrides. Extended and legacy environment LLSD paths preserve
|
||||||
|
parcel-versus-region URI rules, and sound packets retain identity, gain,
|
||||||
|
position, and queue flags. Packet/capability selection, state-before-event
|
||||||
|
ordering, cancellation, limits, and live-operation safety are documented in
|
||||||
|
[`docs/land.md`](docs/land.md).
|
||||||
|
|
||||||
|
Estate administration, experience preferences, marketplace listings, and
|
||||||
|
abuse reporting now use native owner-message, capability, event, cache, and
|
||||||
|
legacy-packet paths. Exact schedules, list deltas, folder roles, report fields,
|
||||||
|
cancellation, and explicit live-operation gates are documented in
|
||||||
|
[`docs/world-services.md`](docs/world-services.md).
|
||||||
|
|
||||||
|
Grid and directory discovery now use native LLUDP map and search requests,
|
||||||
|
correlated bounded reply events, expiring region indexes, coarse-location
|
||||||
|
deltas, and exact region-handle math. SLURL parsing covers location and
|
||||||
|
application forms with stable escaping, while interest-list modes and unknown
|
||||||
|
simulator features are preserved through LLSD capabilities. The cache,
|
||||||
|
pagination, cancellation, and compatibility contracts are documented in
|
||||||
|
[`docs/discovery.md`](docs/discovery.md).
|
||||||
|
|
||||||
|
### Milestone 10
|
||||||
|
|
||||||
|
The native `SimpleRenderer` is the milestone's deterministic reference
|
||||||
|
pipeline for legacy prim and decoded sculpt-map geometry. It converts checked
|
||||||
|
PrimMesher output into shared faceted and simple meshes, preserves prim-face
|
||||||
|
texture/material metadata, supplies finite normals and UVs, applies default or
|
||||||
|
planar texture transforms, and reports bounded failures with the source
|
||||||
|
primitive UUID. It deliberately does not fetch or decode mesh assets; that
|
||||||
|
surface remains with MeshFoundry. Supported topology, 16-bit geometry budgets,
|
||||||
|
determinism, and the asset boundary are documented in the
|
||||||
|
[`SimpleRenderer` guide](crates/libremetaverse-rendering-simple/README.md).
|
||||||
|
|
||||||
|
The native `MeshFoundry` pipeline builds on that reference path for prims and
|
||||||
|
sculpts, and adds bounded packed-LLSD mesh assets, deterministic LOD fallback,
|
||||||
|
terrain and convex hulls, independent UV domains, generated or stored normals
|
||||||
|
and tangents, inherited material metadata, mirror/invert transforms, and
|
||||||
|
rigged-mesh skin matrices and normalized weights. A large executable fixture
|
||||||
|
reports decode allocations and timing without replacing correctness gates. The
|
||||||
|
format, ownership, error, and tangent-output contracts are documented in the
|
||||||
|
[`MeshFoundry` guide](crates/libremetaverse-rendering-mesh-foundry/README.md).
|
||||||
|
|
||||||
|
The native RLV layer parses bounded chat messages into typed clear, action,
|
||||||
|
restriction, and query directives, then provides independent thread-safe
|
||||||
|
restriction, inventory-map, folder-lock, camera, blacklist, and permission
|
||||||
|
providers without network I/O. Its callback-driven service dispatches typed
|
||||||
|
actions and queries through `Send + Sync` host adapters, integrates completed
|
||||||
|
inventory and agent services through their public boundaries, and reports
|
||||||
|
inventory, attachment, outfit, chat, sit, and object-source lifecycle events.
|
||||||
|
It
|
||||||
|
preserves source casing, folder paths, separators, numeric channels, UUIDs, and
|
||||||
|
attachment/wearable aliases while exposing canonical behavior names and
|
||||||
|
source-located typed errors. All 119 restriction names from the pinned
|
||||||
|
LibreMetaverse snapshot are covered, and deterministic malformed-input
|
||||||
|
mutations exercise the parser without an external fuzzing runtime. Immutable
|
||||||
|
snapshots and post-lock update events make concurrent policy reads
|
||||||
|
deterministic; cancellation and resource limits are checked before callbacks,
|
||||||
|
and no callback runs under an internal lock. The grammar, state precedence,
|
||||||
|
normalization rules, service orchestration, limits, and ownership boundary are
|
||||||
|
documented in the
|
||||||
|
[`RLV protocol guide`](crates/libremetaverse-rlv/README.md).
|
||||||
|
|
||||||
|
### Milestone 11
|
||||||
|
|
||||||
|
The native `osd-inspector`, `simple-bot`, `packet-dump`, `prim-inspector`, and
|
||||||
|
`inventory-explorer` programs are complete.
|
||||||
|
`osd-inspector` validates and converts bounded LLSD and performs deterministic
|
||||||
|
Primitive-to-OSD round trips. `simple-bot` provides native async login, IM and
|
||||||
|
local-chat commands, movement and animation calls, bounded fake-grid
|
||||||
|
conversations, secret redaction, and cancellation-safe logout. `packet-dump`
|
||||||
|
adds filtered, bounded incoming/outgoing capture with native wire validation,
|
||||||
|
sanitized optional raw bytes, and deterministic fake datagrams. `prim-inspector`
|
||||||
|
discovers real simulator primitives, hydrates missing object properties, orders
|
||||||
|
nearest matches, and formats construction, feature, and ownership details with
|
||||||
|
bounded deterministic fake-grid coverage. `inventory-explorer` uses the native
|
||||||
|
manager/store and AIS parser for bounded browsing, statistics, typed search,
|
||||||
|
link-aware hierarchy traversal, and deterministic export. Their command
|
||||||
|
surfaces, limits, isolated CLI tests, and the status of every remaining program
|
||||||
|
are documented in the [`native programs guide`](programs/README.md).
|
||||||
|
|
||||||
|
The native `TestClient` now exposes every non-voice system, communication,
|
||||||
|
inventory, appearance, asset, movement, object, parcel, estate, grid, social,
|
||||||
|
directory, and statistics command group through one bounded multi-client shell.
|
||||||
|
World commands use the native manager
|
||||||
|
APIs for movement and teleportation, object inspection and linkset transfer,
|
||||||
|
parcel and map queries, estate terrain transfer, texture caching, and primitive
|
||||||
|
creation. Social and search commands use cancellable friend, group, avatar, and
|
||||||
|
paged-directory APIs; complete profile cloning combines capability data with
|
||||||
|
the simulator's interest block. Offline fixtures exercise the same parsing,
|
||||||
|
filtering, output, cancellation, and safety paths without connecting to a
|
||||||
|
privileged live grid. Command ownership, resource limits, explicit
|
||||||
|
live-operation gates, and the focused verification command are documented in the
|
||||||
|
[`TestClient` guide](docs/test-client.md).
|
||||||
|
|
||||||
|
### Milestone 12
|
||||||
|
|
||||||
|
The release surface now has deterministic native Rust gates for toolchain and
|
||||||
|
feature coverage, dependency policy, documentation completeness, API/SemVer
|
||||||
|
stability, concurrency/resource lifecycle, and license/source provenance. The
|
||||||
|
license audit corrects the separate CC-BY-SA-3.0 status of the seven required
|
||||||
|
Linden data inputs, rejects unknown fixtures and opaque bundled assets,
|
||||||
|
consolidates license texts for every locked Rust package, records all native
|
||||||
|
linkage and redistribution obligations, and hashes the complete source and
|
||||||
|
notice distribution. See the
|
||||||
|
[`release provenance guide`](docs/release-provenance.md) for reproduction and
|
||||||
|
the exact source/binary notice contract.
|
||||||
|
|||||||
115
RUSTREWRITE.md
115
RUSTREWRITE.md
@@ -60,7 +60,8 @@ The current workspace is a structural baseline, not a working client:
|
|||||||
members with real fields/constants/enum values and standardized failing
|
members with real fields/constants/enum values and standardized failing
|
||||||
bodies;
|
bodies;
|
||||||
- all 1,289 real NUnit `[Test]`/`[TestCase]` invocations have stable catalog
|
- all 1,289 real NUnit `[Test]`/`[TestCase]` invocations have stable catalog
|
||||||
entries; pending cases do not generate executable placeholder tests;
|
entries; all 1,266 non-live, non-benchmark cases are translated, all 19
|
||||||
|
live-grid cases and four benchmarks are reviewed, and none remain pending;
|
||||||
- all nine sample/tool projects have compiling Rust binary targets;
|
- all nine sample/tool projects have compiling Rust binary targets;
|
||||||
- the 128 TestClient command source files are retained as a command inventory.
|
- the 128 TestClient command source files are retained as a command inventory.
|
||||||
|
|
||||||
@@ -75,8 +76,9 @@ gate is complete; semantic test translation is the next stage.**
|
|||||||
The avatar-facing slice preserves the C# agent, movement/camera, appearance and
|
The avatar-facing slice preserves the C# agent, movement/camera, appearance and
|
||||||
outfit-policy, inventory/AIS/store, asset/cache, avatar, and animesh concepts.
|
outfit-policy, inventory/AIS/store, asset/cache, avatar, and animesh concepts.
|
||||||
Long-running mapped calls retain an explicit cross-platform cancellation token
|
Long-running mapped calls retain an explicit cross-platform cancellation token
|
||||||
and return the shared `NotImplemented { csharp_member }` error; events return a
|
and return the shared `Error::NotImplemented(NotImplemented { csharp_member })`
|
||||||
typed subscription guard so callback lifetime is visible to Rust callers.
|
error; events return a typed subscription guard so callback lifetime is visible
|
||||||
|
to Rust callers.
|
||||||
|
|
||||||
The world-facing slice preserves the C# object, parcel, terrain, grid,
|
The world-facing slice preserves the C# object, parcel, terrain, grid,
|
||||||
environment, estate, directory, friend, group, sound, interest-list,
|
environment, estate, directory, friend, group, sound, interest-list,
|
||||||
@@ -152,7 +154,7 @@ run the Rust implementation.
|
|||||||
| `libremetaverse` | `LibreMetaverse` | 210 | 138,916 | 8,982 | client, protocol, managers, assets and rendering model |
|
| `libremetaverse` | `LibreMetaverse` | 210 | 138,916 | 8,982 | client, protocol, managers, assets and rendering model |
|
||||||
| `libremetaverse-rendering-simple` | `LibreMetaverse.Rendering.Simple` | 1 | 161 | 6 | simple renderer |
|
| `libremetaverse-rendering-simple` | `LibreMetaverse.Rendering.Simple` | 1 | 161 | 6 | simple renderer |
|
||||||
| `libremetaverse-rendering-mesh-foundry` | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 852 | 14 | full mesh renderer |
|
| `libremetaverse-rendering-mesh-foundry` | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 852 | 14 | full mesh renderer |
|
||||||
| `libremetaverse-lsl-tools` | `LibreMetaverse.LslTools` | 175 | 27,856 | 962 | LSL lexer/parser generator and generated grammar |
|
| `metacrate-lsl-tools` | `LibreMetaverse.LslTools` | 175 | 27,856 | 962 | LSL lexer/parser generator and generated grammar |
|
||||||
| `libremetaverse-rlv` | `LibreMetaverse.RLV` | 32 | 6,296 | 262 | RLV parsing, restrictions, locks and callbacks |
|
| `libremetaverse-rlv` | `LibreMetaverse.RLV` | 32 | 6,296 | 262 | RLV parsing, restrictions, locks and callbacks |
|
||||||
| `libremetaverse-utilities` | `LibreMetaverse.Utilities` | 1 | 289 | 12 | high-level convenience helpers |
|
| `libremetaverse-utilities` | `LibreMetaverse.Utilities` | 1 | 289 | 12 | high-level convenience helpers |
|
||||||
| `libremetaverse-voice-vivox` | `LibreMetaverse.Voice.Vivox` | 12 | 4,544 | 440 | Vivox control protocol adapter |
|
| `libremetaverse-voice-vivox` | `LibreMetaverse.Voice.Vivox` | 12 | 4,544 | 440 | Vivox control protocol adapter |
|
||||||
@@ -163,7 +165,7 @@ crates under `types`, `structured_data`, and `imaging_abstractions`. Rendering,
|
|||||||
voice, RLV, LSL tools, and native Skia remain separate so users do not pay for
|
voice, RLV, LSL tools, and native Skia remain separate so users do not pay for
|
||||||
large or platform-specific dependency trees unless requested.
|
large or platform-specific dependency trees unless requested.
|
||||||
|
|
||||||
The workspace uses Rust 2024 with MSRV 1.85. Generated code is committed so
|
The workspace uses Rust 2024 with Rust 1.97.1. Generated code is committed so
|
||||||
ordinary consumers do not need Python, .NET, Roslyn, or the upstream checkout.
|
ordinary consumers do not need Python, .NET, Roslyn, or the upstream checkout.
|
||||||
|
|
||||||
## 3. Public API translation policy
|
## 3. Public API translation policy
|
||||||
@@ -276,7 +278,7 @@ Each mapped Rust item must actually compile and be callable:
|
|||||||
untyped placeholder.
|
untyped placeholder.
|
||||||
|
|
||||||
The body is the only part allowed to be fake. Fallible Rust APIs return a shared
|
The body is the only part allowed to be fake. Fallible Rust APIs return a shared
|
||||||
typed `NotImplemented { csharp_member }` error. Infallible constructors,
|
typed `Error::NotImplemented(NotImplemented { csharp_member })` error. Infallible constructors,
|
||||||
accessors, operators and trait methods call a shared `unimplemented_api!`
|
accessors, operators and trait methods call a shared `unimplemented_api!`
|
||||||
placeholder that panics with the stable C# member ID. Constants and enum values
|
placeholder that panics with the stable C# member ID. Constants and enum values
|
||||||
must have their real values. Never return plausible defaults such as `false`,
|
must have their real values. Never return plausible defaults such as `false`,
|
||||||
@@ -286,7 +288,8 @@ for the wrong reason.
|
|||||||
The failure contract lives in `libremetaverse-types` and every API crate exposes
|
The failure contract lives in `libremetaverse-types` and every API crate exposes
|
||||||
it as `crate::Error`:
|
it as `crate::Error`:
|
||||||
|
|
||||||
- synchronous fallible members return `Err(NotImplemented::new(CSHARP_ID))`;
|
- synchronous fallible members return
|
||||||
|
`Err(Error::NotImplemented(NotImplemented::new(CSHARP_ID)))`;
|
||||||
async members do the same when first polled and start no work first;
|
async members do the same when first polled and start no work first;
|
||||||
- a stream-producing operation returns the typed error before exposing a
|
- a stream-producing operation returns the typed error before exposing a
|
||||||
stream; an intrinsically infallible stream factory uses `unimplemented_api!`
|
stream; an intrinsically infallible stream factory uses `unimplemented_api!`
|
||||||
@@ -330,8 +333,10 @@ and semantic-review status. Reviewed tests are identified by `parity-case`
|
|||||||
markers in hand-written Rust files, so regeneration records unresolved cases
|
markers in hand-written Rust files, so regeneration records unresolved cases
|
||||||
without creating fake executable tests and fails on body drift. The checked-in
|
without creating fake executable tests and fails on body drift. The checked-in
|
||||||
audit reports pending, translated, ignored-live, benchmark, drifted, missing,
|
audit reports pending, translated, ignored-live, benchmark, drifted, missing,
|
||||||
duplicate, stale, and unreviewed cases; the initial handover contains 1,289
|
duplicate, stale, and unreviewed cases. The initial handover contained 1,289
|
||||||
unreviewed cases.
|
unreviewed cases; the current ledger contains all 1,266 ordinary cases as
|
||||||
|
translated, 19 reviewed live-grid cases, four benchmark-reviewed cases, and no
|
||||||
|
pending or unreviewed cases.
|
||||||
|
|
||||||
The Rust tests must call the public APIs rather than internal replacements.
|
The Rust tests must call the public APIs rather than internal replacements.
|
||||||
Where the C# tests call internal members through friend-assembly access, record
|
Where the C# tests call internal members through friend-assembly access, record
|
||||||
@@ -354,11 +359,38 @@ The test-suite gate is complete only when:
|
|||||||
- a controlled test run fails at standardized unimplemented member IDs rather
|
- a controlled test run fails at standardized unimplemented member IDs rather
|
||||||
than from missing symbols, compile errors, malformed fixtures, or weakened
|
than from missing symbols, compile errors, malformed fixtures, or weakened
|
||||||
assertions;
|
assertions;
|
||||||
- live-server/device tests are faithfully translated but `#[ignore]` by default
|
- live-server/device tests are faithfully translated and are conditionally
|
||||||
with documented opt-in configuration;
|
ignored only while their documented credentials are absent;
|
||||||
- no production method contains real behavior beyond what is required to make
|
- no production method contains real behavior beyond what is required to make
|
||||||
signatures and constants compile.
|
signatures and constants compile.
|
||||||
|
|
||||||
|
### 3.3 Fixed compatibility baseline
|
||||||
|
|
||||||
|
Milestone 03 closes against the pinned 1,289-invocation catalog, not the older
|
||||||
|
1,295 source-text estimate. The six-case difference is intentional: five
|
||||||
|
attributes were commented out and one parameterless `[Test]` marker duplicated
|
||||||
|
a parameterized `[TestCase]` method. Reintroducing those entries would create
|
||||||
|
tests that NUnit never runs.
|
||||||
|
|
||||||
|
`tests/red-suite-baseline.json` fixes the machine-checked ledger at 1,266
|
||||||
|
ordinary translations, 19 live-grid translations, four benchmarks, and zero
|
||||||
|
pending, drifted, duplicate, missing, or unreviewed cases. The historical
|
||||||
|
red-suite filename is retained for automation compatibility, but the reviewed
|
||||||
|
Rust translations and benchmarks are now required to pass. Run the controlled
|
||||||
|
audit with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python3 tools/audit_red_suite.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Without the explicit live-grid opt-in, the audit requires all 1,266 ordinary
|
||||||
|
translations and four benchmark cases to pass, conditionally ignores exactly
|
||||||
|
the 19 live-grid cases, and pins the independently counted support-test total.
|
||||||
|
Setting `RUN_LIVE_TESTS=1` with all three live-grid credentials makes those 19
|
||||||
|
cases required passes as well. Any ordinary failure, unexpected ignore,
|
||||||
|
nonstandard failure, parity-catalog drift, or support-test-count drift fails the
|
||||||
|
audit.
|
||||||
|
|
||||||
## 4. Validated Rust dependency map
|
## 4. Validated Rust dependency map
|
||||||
|
|
||||||
Versions below were queried from crates.io on 2026-08-08 with `cargo search`
|
Versions below were queried from crates.io on 2026-08-08 with `cargo search`
|
||||||
@@ -373,7 +405,7 @@ MSRV, features, and licenses at adoption time.
|
|||||||
| `System.Net.Http` / WinHTTP | [`reqwest` 0.13.4](https://crates.io/crates/reqwest/0.13.4) | MSRV 1.85. Use rustls/default TLS deliberately, connection pooling, streaming bodies, and injected client/timeouts. |
|
| `System.Net.Http` / WinHTTP | [`reqwest` 0.13.4](https://crates.io/crates/reqwest/0.13.4) | MSRV 1.85. Use rustls/default TLS deliberately, connection pooling, streaming bodies, and injected client/timeouts. |
|
||||||
| JSON and general data mapping | [`serde` 1.0.229](https://crates.io/crates/serde/1.0.229), [`serde_json` 1.0.151](https://crates.io/crates/serde_json/1.0.151), [`serde_bytes` 0.11.19](https://crates.io/crates/serde_bytes/0.11.19) | Use only where the C# implementation is schema-driven JSON. Hand-write LLSD encodings. |
|
| JSON and general data mapping | [`serde` 1.0.229](https://crates.io/crates/serde/1.0.229), [`serde_json` 1.0.151](https://crates.io/crates/serde_json/1.0.151), [`serde_bytes` 0.11.19](https://crates.io/crates/serde_bytes/0.11.19) | Use only where the C# implementation is schema-driven JSON. Hand-write LLSD encodings. |
|
||||||
| MessagePack 3.1.8 | [`rmp-serde` 1.3.1](https://crates.io/crates/rmp-serde/1.3.1), [`rmpv` 1.3.1](https://crates.io/crates/rmpv/1.3.1) | Golden byte vectors must prove integer widths, maps, extensions, and field ordering. |
|
| MessagePack 3.1.8 | [`rmp-serde` 1.3.1](https://crates.io/crates/rmp-serde/1.3.1), [`rmpv` 1.3.1](https://crates.io/crates/rmpv/1.3.1) | Golden byte vectors must prove integer widths, maps, extensions, and field ordering. |
|
||||||
| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. |
|
| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. WASM selects UUID's `rng-getrandom` adapter and `getrandom`'s Web Crypto-backed `wasm_js` feature while desktop targets retain operating-system entropy. |
|
||||||
| byte buffers | [`bytes` 1.12.1](https://crates.io/crates/bytes/1.12.1), [`bytemuck` 1.25.2](https://crates.io/crates/bytemuck/1.25.2) | Prefer explicit endian reads. `bytemuck` is only for proven POD layouts, never untrusted variable packets. |
|
| byte buffers | [`bytes` 1.12.1](https://crates.io/crates/bytes/1.12.1), [`bytemuck` 1.25.2](https://crates.io/crates/bytemuck/1.25.2) | Prefer explicit endian reads. `bytemuck` is only for proven POD layouts, never untrusted variable packets. |
|
||||||
| vector/matrix math | [`glam` 0.33.3](https://crates.io/crates/glam/0.33.3) | Keep compatibility newtypes to control component order, precision, equality, and serialization. |
|
| vector/matrix math | [`glam` 0.33.3](https://crates.io/crates/glam/0.33.3) | Keep compatibility newtypes to control component order, precision, equality, and serialization. |
|
||||||
| flags | [`bitflags` 2.13.1](https://crates.io/crates/bitflags/2.13.1) | Retain unknown bits from newer grids. |
|
| flags | [`bitflags` 2.13.1](https://crates.io/crates/bitflags/2.13.1) | Retain unknown bits from newer grids. |
|
||||||
@@ -381,12 +413,15 @@ MSRV, features, and licenses at adoption time.
|
|||||||
| ZLogger / Microsoft logging | [`tracing` 0.1.44](https://crates.io/crates/tracing/0.1.44), [`tracing-subscriber` 0.3.23](https://crates.io/crates/tracing-subscriber/0.3.23) | Libraries emit spans/events; binaries choose formatting and filters. Never log credentials or capability tokens. |
|
| ZLogger / Microsoft logging | [`tracing` 0.1.44](https://crates.io/crates/tracing/0.1.44), [`tracing-subscriber` 0.3.23](https://crates.io/crates/tracing-subscriber/0.3.23) | Libraries emit spans/events; binaries choose formatting and filters. Never log credentials or capability tokens. |
|
||||||
| rate limiting | [`governor` 0.10.4](https://crates.io/crates/governor/0.10.4) | Candidate for caps categories. First reproduce burst/refill/cancellation behavior with deterministic clock tests. |
|
| rate limiting | [`governor` 0.10.4](https://crates.io/crates/governor/0.10.4) | Candidate for caps categories. First reproduce burst/refill/cancellation behavior with deterministic clock tests. |
|
||||||
| compression and tar archives | [`flate2` 1.1.9](https://crates.io/crates/flate2/1.1.9), [`tar` 0.4.46](https://crates.io/crates/tar/0.4.46) | Enforce decompressed-size, path traversal, and entry-count limits on untrusted OAR data. |
|
| compression and tar archives | [`flate2` 1.1.9](https://crates.io/crates/flate2/1.1.9), [`tar` 0.4.46](https://crates.io/crates/tar/0.4.46) | Enforce decompressed-size, path traversal, and entry-count limits on untrusted OAR data. |
|
||||||
|
| release artifact inspection | [`goblin` 0.10.5](https://crates.io/crates/goblin/0.10.5) | Parse ELF, PE, and Mach-O imports, symbols, and linked libraries without executing an artifact or relying on platform-only inspection tools. |
|
||||||
| XML and URL | [`quick-xml` 0.41.0](https://crates.io/crates/quick-xml/0.41.0), [`url` 2.5.8](https://crates.io/crates/url/2.5.8), [`base64` 0.23.1](https://crates.io/crates/base64/0.23.1) | Streaming XML for LLSD/login; retain exact URL escaping behavior with fixtures. |
|
| XML and URL | [`quick-xml` 0.41.0](https://crates.io/crates/quick-xml/0.41.0), [`url` 2.5.8](https://crates.io/crates/url/2.5.8), [`base64` 0.23.1](https://crates.io/crates/base64/0.23.1) | Streaming XML for LLSD/login; retain exact URL escaping behavior with fixtures. |
|
||||||
| CoreJ2K 2.3.3.91 | [`jpeg2k` 0.10.1](https://crates.io/crates/jpeg2k/0.10.1) | Defaults to OpenJPEG/native bindings. Keep behind a codec trait and feature; test channel order, alpha, dimensions, discard levels, and malformed input. |
|
| CoreJ2K 2.3.3.91 | system [OpenJPEG](https://www.openjpeg.org/) 2.5.4+ through the private `libremetaverse-openjpeg` adapter | Opt-in `jpeg2000` feature; checked-in minimal bindings avoid a libclang build dependency. Bounded memory streams and header validation isolate native code. Golden tests cover channel order, alpha, 16-bit precision, dimensions, discard levels, lossless/lossy modes, and malformed input. |
|
||||||
| SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | MSRV 1.85 and native/binary-cache build. Optional adapter only; core image APIs must not leak Skia types. |
|
| CoreJ2K pure-Rust extension | [`j2k`](https://crates.io/crates/j2k) 0.8.1 | Independent opt-in `rust-j2k` feature with no native library. The safe adapter provides J2K/JP2 encode/decode, native component preservation, bounded streams and allocations, reduced resolution, progressive quality layers, strict/permissive truncation, and OpenJPEG interoperability. |
|
||||||
|
| SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | Adopted behind the opt-in `skia` feature. Target-specific official binary-cache feature sets provide BMP/GIF/ICO/JPEG/PNG/WBMP/WebP decoding on macOS, Linux, and Windows; checked owned buffers keep Skia types out of the core image API. |
|
||||||
|
| SkiaSharp pure-Rust extension | [`skia-rs-codec` 0.3.0](https://crates.io/crates/skia-rs-codec/0.3.0) and [`image-webp` 0.2.4](https://crates.io/crates/image-webp/0.2.4) | Independent opt-in `rust-skia` feature with no native codec. Default features stay disabled: pure-Rust PNG/JPEG/GIF plus built-in BMP/ICO/WBMP come from `skia-rs-codec`, and pure-Rust WebP comes from `image-webp` instead of the native `libwebp-sys` path. |
|
||||||
| Pfim 0.11.4 | [`image` 0.25.10](https://crates.io/crates/image/0.25.10), [`ddsfile` 0.6.0](https://crates.io/crates/ddsfile/0.6.0) | `image` covers TGA and common DDS decoding; `ddsfile` exposes DDS container details. Golden files decide whether both are needed. |
|
| Pfim 0.11.4 | [`image` 0.25.10](https://crates.io/crates/image/0.25.10), [`ddsfile` 0.6.0](https://crates.io/crates/ddsfile/0.6.0) | `image` covers TGA and common DDS decoding; `ddsfile` exposes DDS container details. Golden files decide whether both are needed. |
|
||||||
| OggVorbisEncoder 1.2.2 | [`vorbis_rs` 0.5.6](https://crates.io/crates/vorbis_rs/0.5.6) | BSD-3-Clause, MSRV 1.82, backed by C libraries. Feature-gate native audio encoding. |
|
| OggVorbisEncoder 1.2.2 | [`vorbis_rs` 0.5.6](https://crates.io/crates/vorbis_rs/0.5.6) | BSD-3-Clause, MSRV 1.82, backed by C libraries. Feature-gate native audio encoding. |
|
||||||
| SIPSorcery 8.0.23 | [`webrtc` 0.20.0](https://crates.io/crates/webrtc/0.20.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), [`opus` 0.3.1](https://crates.io/crates/opus/0.3.1) | Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. |
|
| SIPSorcery 8.0.23 | [`str0m` 0.22.0](https://crates.io/crates/str0m/0.22.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), system libopus 1.3+ through `libremetaverse-opus` | The private safe adapter avoids the unmaintained `audiopus_sys` binding. Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. |
|
||||||
| LSL generated parser | [`lalrpop` 0.23.1](https://crates.io/crates/lalrpop/0.23.1) | Candidate only. Preserve grammar conflicts, recovery, token positions, and diagnostics before replacing the generated parser. |
|
| LSL generated parser | [`lalrpop` 0.23.1](https://crates.io/crates/lalrpop/0.23.1) | Candidate only. Preserve grammar conflicts, recovery, token positions, and diagnostics before replacing the generated parser. |
|
||||||
| NUnit/Moq | built-in test harness, [`mockall` 0.15.0](https://crates.io/crates/mockall/0.15.0), [`proptest` 1.11.0](https://crates.io/crates/proptest/1.11.0) | Prefer fakes and deterministic protocol fixtures; use mocks only for interaction contracts. Add properties after direct parity cases exist. |
|
| NUnit/Moq | built-in test harness, [`mockall` 0.15.0](https://crates.io/crates/mockall/0.15.0), [`proptest` 1.11.0](https://crates.io/crates/proptest/1.11.0) | Prefer fakes and deterministic protocol fixtures; use mocks only for interaction contracts. Add properties after direct parity cases exist. |
|
||||||
| NUnit benchmarks | [`criterion` 0.8.2](https://crates.io/crates/criterion/0.8.2) | Port benchmark-category methods to `benches/`; never make timing thresholds correctness tests. |
|
| NUnit benchmarks | [`criterion` 0.8.2](https://crates.io/crates/criterion/0.8.2) | Port benchmark-category methods to `benches/`; never make timing thresholds correctness tests. |
|
||||||
@@ -398,6 +433,29 @@ not select a crate merely because NuGet used one. In particular, begin with
|
|||||||
`Mutex<HashMap<...>>` rather than a concurrent-map dependency and add a pool
|
`Mutex<HashMap<...>>` rather than a concurrent-map dependency and add a pool
|
||||||
only after allocations appear in a profile.
|
only after allocations appear in a profile.
|
||||||
|
|
||||||
|
### 4.1 Adopted direct dependency inventory
|
||||||
|
|
||||||
|
The candidates above are not the release inventory. The machine-checked
|
||||||
|
inventory is [`ci/dependency-policy.json`](ci/dependency-policy.json); each
|
||||||
|
locked direct version must appear there with its implemented purpose,
|
||||||
|
maintenance state, transitive-cost classification, and native-code status.
|
||||||
|
The current adopted set is:
|
||||||
|
|
||||||
|
| Responsibility | Adopted direct crates |
|
||||||
|
|---|---|
|
||||||
|
| Async and HTTP | `tokio`, `futures-channel`, `futures-util`, `reqwest` |
|
||||||
|
| Wire data and parsing | `base64`, `serde`, `serde_json`, `roxmltree`, `regex`, `unicode-general-category` |
|
||||||
|
| Identity, hashing, and platform facts | `uuid`, `getrandom`, `md-5`, `sha1`, `sha2`, `mac_address2`, `os_info` |
|
||||||
|
| Archives, images, and audio | `flate2`, `tar`, `bcdec_rs`, `skia-safe`, `skia-rs-codec`, `image-webp`, `hound`, `vorbis_rs`, `str0m`, `cpal` |
|
||||||
|
| Code generation, program CLI, and artifact inspection | `syn`, `prettyplease`, `clap`, `goblin` |
|
||||||
|
| Build and compatibility-test support | `pkg-config`, `vcpkg`, `stats_alloc` |
|
||||||
|
|
||||||
|
System libopus is accessed only through the private `libremetaverse-opus`
|
||||||
|
safe adapter; it replaces the unmaintained `audiopus`/`audiopus_sys` stack.
|
||||||
|
The adapter uses `pkg-config` on Linux, macOS, and Windows GNU, and `vcpkg` on
|
||||||
|
Windows MSVC. The dependency audit fails closed for any new direct crate,
|
||||||
|
resolved version, duplicate-version set, wildcard, Git source, or registry.
|
||||||
|
|
||||||
## 5. Module-by-module implementation guidance
|
## 5. Module-by-module implementation guidance
|
||||||
|
|
||||||
### 5.1 `libremetaverse-types`
|
### 5.1 `libremetaverse-types`
|
||||||
@@ -462,10 +520,12 @@ and invalid-dimension tests match the original.
|
|||||||
|
|
||||||
### 5.4 `libremetaverse-imaging-skia`
|
### 5.4 `libremetaverse-imaging-skia`
|
||||||
|
|
||||||
Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`. Convert at
|
Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`, plus an
|
||||||
the boundary to/from `ManagedImage`; never expose `skia_safe` types in the core
|
independently selectable `RustSkiaTextureCodec` using `skia-rs-codec` and
|
||||||
trait. CI must cover macOS, Linux, and Windows or explicitly document unsupported
|
`image-webp`. Convert at the boundary to/from `ManagedImage`; never expose
|
||||||
targets. Validate native binary provenance and packaging.
|
backend-specific types in the core trait. CI must cover macOS, Linux, Windows,
|
||||||
|
and the Rust-only WASM compile boundary. Validate native binary provenance and
|
||||||
|
the locked Rust dependency/license inventory.
|
||||||
|
|
||||||
### 5.5 `libremetaverse-prim-mesher`
|
### 5.5 `libremetaverse-prim-mesher`
|
||||||
|
|
||||||
@@ -610,7 +670,7 @@ grouping, materials, transforms, skin weights, normals/tangents, texture
|
|||||||
coordinates, and output ordering. Do not merge the two crates: users should be
|
coordinates, and output ordering. Do not merge the two crates: users should be
|
||||||
able to choose the small renderer without the full mesh pipeline.
|
able to choose the small renderer without the full mesh pipeline.
|
||||||
|
|
||||||
### 5.8 `libremetaverse-lsl-tools`
|
### 5.8 `metacrate-lsl-tools`
|
||||||
|
|
||||||
- Treat `Tools/` as the parser-generator implementation and `YYClass/` as
|
- Treat `Tools/` as the parser-generator implementation and `YYClass/` as
|
||||||
generated grammar output. Do not line-by-line port all generated classes.
|
generated grammar output. Do not line-by-line port all generated classes.
|
||||||
@@ -708,8 +768,10 @@ Test translation rules:
|
|||||||
- async tests use paused/injected time where possible; no arbitrary sleeps.
|
- async tests use paused/injected time where possible; no arbitrary sleeps.
|
||||||
- Moq interaction tests prefer a small fake recording calls; use Mockall only
|
- Moq interaction tests prefer a small fake recording calls; use Mockall only
|
||||||
when a trait contract has many independent expectations.
|
when a trait contract has many independent expectations.
|
||||||
- `RequiresLiveServer` tests become `#[ignore]` and require explicit grid URL,
|
- `RequiresLiveServer` tests use `GRID_USER`, `GRID_PASSWORD`, and
|
||||||
first/last name, and secret environment variables. They never run in normal CI.
|
`GRID_LOGIN_URL` from the process environment or the ignored workspace
|
||||||
|
`.env`; they are ignored when any value is absent and run automatically when
|
||||||
|
all three are present. `.env.example` documents the non-secret shape.
|
||||||
- benchmark-category methods move to Criterion and are removed from correctness
|
- benchmark-category methods move to Criterion and are removed from correctness
|
||||||
pass/fail counts.
|
pass/fail counts.
|
||||||
- malformed wire/asset tests become fuzz seeds after direct parity is passing.
|
- malformed wire/asset tests become fuzz seeds after direct parity is passing.
|
||||||
@@ -806,11 +868,18 @@ not part of the default smoke test.
|
|||||||
11. **Programs/live grid:** offline inspector, four core examples, TestClient,
|
11. **Programs/live grid:** offline inspector, four core examples, TestClient,
|
||||||
then voice adapters and opt-in live/device validation.
|
then voice adapters and opt-in live/device validation.
|
||||||
12. **Hardening/release:** fuzz untrusted parsers, cross-platform native CI,
|
12. **Hardening/release:** fuzz untrusted parsers, cross-platform native CI,
|
||||||
MSRV, docs/examples, semver/API audit, license/asset audit, performance
|
docs/examples, semver/API audit, license/asset audit, performance
|
||||||
comparison against the separately run pinned C# implementation, and an
|
comparison against the separately run pinned C# implementation, and an
|
||||||
artifact/dependency audit proving there is no CLR, .NET assembly, subprocess,
|
artifact/dependency audit proving there is no CLR, .NET assembly, subprocess,
|
||||||
RPC, or LibreMetaverse foreign-interface dependency.
|
RPC, or LibreMetaverse foreign-interface dependency.
|
||||||
|
|
||||||
|
The native release artifact gate packages all 16 release/source crates as one
|
||||||
|
versioned set, rebuilds those extracted packages offline without the reference
|
||||||
|
checkout, parses every shipped ELF/PE/Mach-O program and its native imports, and
|
||||||
|
runs credential-free helper-trapped smoke modes for all ten executables. The
|
||||||
|
policy, clean-machine prerequisites, and reproducible commands are documented
|
||||||
|
in [`docs/release-artifacts.md`](docs/release-artifacts.md).
|
||||||
|
|
||||||
Each milestone ends with zero unreviewed generated shims in its owned modules,
|
Each milestone ends with zero unreviewed generated shims in its owned modules,
|
||||||
no weakened parity assertions, formatted/clippy-clean code, public Rust docs
|
no weakened parity assertions, formatted/clippy-clean code, public Rust docs
|
||||||
that cite the corresponding C# concept, and a refreshed completeness report
|
that cite the corresponding C# concept, and a refreshed completeness report
|
||||||
|
|||||||
14
api/DOCUMENTATION-COVERAGE.md
Normal file
14
api/DOCUMENTATION-COVERAGE.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Documentation coverage
|
||||||
|
|
||||||
|
Generated by `metacrate-ci-matrix documentation-report`; do not edit by hand.
|
||||||
|
|
||||||
|
| Surface | Documented | Required | Coverage |
|
||||||
|
| --- | ---: | ---: | ---: |
|
||||||
|
| Publishable public crates | 15 | 15 | 100% |
|
||||||
|
| Pinned LibreMetaverse public types | 3066 | 3066 | 100% |
|
||||||
|
| Mapped public members | 30789 | 30789 | 100% |
|
||||||
|
| Compiled Rust guide snippets | 5 | 4 minimum | pass |
|
||||||
|
| Linked native programs | 9 | 9 | 100% |
|
||||||
|
| Checked local Markdown links | 84 | 84 | 100% |
|
||||||
|
|
||||||
|
Every mapped item is tied to its exact C# documentation ID and to the ownership, asyncness, error, overload, mapping-kind, and Rust-signature decisions in [`RUST-MAPPING.tsv`](RUST-MAPPING.tsv). Public types are tied to the corresponding type mapping. The upstream source is pinned to [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||||
@@ -21,7 +21,7 @@ Generated by `python3 tools/generate_rust_mapping.py`; do not edit by hand.
|
|||||||
| `LibreMetaverse` | `libremetaverse` | 27,281 | `E:LibreMetaverse.AgentManager.AgentDataReply` -> `libremetaverse::AgentManager::agent_data_reply` |
|
| `LibreMetaverse` | `libremetaverse` | 27,281 | `E:LibreMetaverse.AgentManager.AgentDataReply` -> `libremetaverse::AgentManager::agent_data_reply` |
|
||||||
| `LibreMetaverse.Imaging.Abstractions` | `libremetaverse-imaging` | 20 | `F:LibreMetaverse.Imaging.ManagedImage.Alpha` -> `libremetaverse_imaging::ManagedImage::alpha` |
|
| `LibreMetaverse.Imaging.Abstractions` | `libremetaverse-imaging` | 20 | `F:LibreMetaverse.Imaging.ManagedImage.Alpha` -> `libremetaverse_imaging::ManagedImage::alpha` |
|
||||||
| `LibreMetaverse.Imaging.Skia` | `libremetaverse-imaging-skia` | 3 | `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor` -> `libremetaverse_imaging_skia::SkiaTextureCodec::new` |
|
| `LibreMetaverse.Imaging.Skia` | `libremetaverse-imaging-skia` | 3 | `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor` -> `libremetaverse_imaging_skia::SkiaTextureCodec::new` |
|
||||||
| `LibreMetaverse.LslTools` | `libremetaverse-lsl-tools` | 768 | `F:LibreMetaverse.LslTools.CSToolsException.handled` -> `libremetaverse_lsl_tools::CSToolsException::handled` |
|
| `LibreMetaverse.LslTools` | `metacrate-lsl-tools` | 768 | `F:LibreMetaverse.LslTools.CSToolsException.handled` -> `metacrate_lsl_tools::CSToolsException::handled` |
|
||||||
| `LibreMetaverse.PrimMesher` | `libremetaverse-prim-mesher` | 207 | `F:LibreMetaverse.PrimMesher.Coord.X` -> `libremetaverse_prim_mesher::Coord::x` |
|
| `LibreMetaverse.PrimMesher` | `libremetaverse-prim-mesher` | 207 | `F:LibreMetaverse.PrimMesher.Coord.X` -> `libremetaverse_prim_mesher::Coord::x` |
|
||||||
| `LibreMetaverse.RLV` | `libremetaverse-rlv` | 499 | `E:LibreMetaverse.RLV.RlvRestrictionManager.RestrictionUpdated` -> `libremetaverse_rlv::RlvRestrictionManager::restriction_updated` |
|
| `LibreMetaverse.RLV` | `libremetaverse-rlv` | 499 | `E:LibreMetaverse.RLV.RlvRestrictionManager.RestrictionUpdated` -> `libremetaverse_rlv::RlvRestrictionManager::restriction_updated` |
|
||||||
| `LibreMetaverse.Rendering.MeshFoundry` | `libremetaverse-rendering-mesh-foundry` | 14 | `M:LibreMetaverse.Rendering.MeshFoundry.#ctor` -> `libremetaverse_rendering_mesh_foundry::MeshFoundry::new` |
|
| `LibreMetaverse.Rendering.MeshFoundry` | `libremetaverse-rendering-mesh-foundry` | 14 | `M:LibreMetaverse.Rendering.MeshFoundry.#ctor` -> `libremetaverse_rendering_mesh_foundry::MeshFoundry::new` |
|
||||||
|
|||||||
@@ -45,9 +45,10 @@ python3 tools/check_api_coverage.py
|
|||||||
The checker rejects duplicate C# IDs, duplicate Rust destinations, invalid
|
The checker rejects duplicate C# IDs, duplicate Rust destinations, invalid
|
||||||
statuses, stale or missing catalog entries, unresolved signature types,
|
statuses, stale or missing catalog entries, unresolved signature types,
|
||||||
assemblies without representative mappings, and platform-specific API targets.
|
assemblies without representative mappings, and platform-specific API targets.
|
||||||
It also rejects generated `Default` shims, plausible false/zero/empty/nil
|
It also rejects generated `Default` shims and plausible false/zero/empty/nil
|
||||||
fallbacks, and generated function bodies that do not use the standardized
|
fallbacks. Failure-only bodies must use the standardized
|
||||||
`NotImplemented` error or `unimplemented_api!` panic.
|
`Error::NotImplemented` result or `unimplemented_api!` panic; reviewed native
|
||||||
|
member hooks must call an explicitly registered hand-written implementation.
|
||||||
The two support traits in `RUST-TYPES.tsv` are included because compiled public
|
The two support traits in `RUST-TYPES.tsv` are included because compiled public
|
||||||
inheritance records reference them even though they are absent from the public
|
inheritance records reference them even though they are absent from the public
|
||||||
type table.
|
type table.
|
||||||
@@ -59,3 +60,25 @@ compares catalog IDs, mapping rows, exported shim IDs, and fixture probes;
|
|||||||
rejects stale, missing, duplicate, or erased entries; and verifies
|
rejects stale, missing, duplicate, or erased entries; and verifies
|
||||||
`API-COVERAGE.md`. Regenerate that report with
|
`API-COVERAGE.md`. Regenerate that report with
|
||||||
`python3 tools/check_api_coverage.py --write`.
|
`python3 tools/check_api_coverage.py --write`.
|
||||||
|
|
||||||
|
The reviewed first-release public surface is stored in
|
||||||
|
[`SEMVER-BASELINE.json`](SEMVER-BASELINE.json), with the decisions and migration
|
||||||
|
recipes rendered in [`SEMVER-AUDIT.md`](SEMVER-AUDIT.md). The audit compares
|
||||||
|
mapping/export coverage, normalized Rust declarations, feature sets, ownership,
|
||||||
|
async and error contracts, thread-safety boundaries, and public dependency
|
||||||
|
types. Record a deliberate baseline only after reviewing its SemVer impact,
|
||||||
|
then verify it and write reproducible evidence:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo run --locked -p metacrate-ci-matrix -- api-baseline-write
|
||||||
|
cargo run --locked -p metacrate-ci-matrix -- api-audit \
|
||||||
|
--evidence /tmp/metacrate-api-audit.json
|
||||||
|
cmp /tmp/metacrate-api-audit.json ci/evidence/api-audit.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Native implementations replace whole generated types where practical. The
|
||||||
|
generated module retains the catalog markers and re-exports the hand-written
|
||||||
|
type; member-level implementations use an explicit generator registry. This
|
||||||
|
keeps regeneration deterministic without moving behavioral code into Python.
|
||||||
|
`SHIM-COVERAGE.md` reports native type/member totals separately from remaining
|
||||||
|
failure-only surfaces.
|
||||||
|
|||||||
10460
api/RUST-MAPPING.tsv
10460
api/RUST-MAPPING.tsv
File diff suppressed because it is too large
Load Diff
@@ -936,170 +936,170 @@ T:LibreMetaverse.LruRemovalStrategy`1 LibreMetaverse.LruRemovalStrategy<TKey> Li
|
|||||||
T:LibreMetaverse.LslSyntax LibreMetaverse.LslSyntax LibreMetaverse class libremetaverse libremetaverse::LslSyntax native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslSyntax LibreMetaverse.LslSyntax LibreMetaverse class libremetaverse libremetaverse::LslSyntax native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslSyntax.LslCategory LibreMetaverse.LslSyntax.LslCategory LibreMetaverse enum libremetaverse libremetaverse::LslSyntaxLslCategory native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
T:LibreMetaverse.LslSyntax.LslCategory LibreMetaverse.LslSyntax.LslCategory LibreMetaverse enum libremetaverse libremetaverse::LslSyntaxLslCategory native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse struct libremetaverse libremetaverse::LslSyntaxLslKeyword native_metacrate_type none traits_and_composition: System.ValueType not_applicable mapped nested types are flattened
|
T:LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse struct libremetaverse libremetaverse::LslSyntaxLslKeyword native_metacrate_type none traits_and_composition: System.ValueType not_applicable mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ANY native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ANY native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::AddToFunc native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::AddToFunc native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BASE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BASE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_4 not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_4 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_6 not_applicable mapped none
|
T:LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_6 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Builder native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Builder native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::COLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::COLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsException native_metacrate_type none traits_and_composition: System.Exception, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsException native_metacrate_type none traits_and_composition: System.Exception, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsFatalException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsFatalException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsStopException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsStopException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSymbol native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools enum libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbolSymType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
T:LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools enum metacrate-lsl-tools metacrate_lsl_tools::CSymbolSymType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.Call LibreMetaverse.LslTools.Call LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Call LibreMetaverse.LslTools.Call LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
|
T:LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
|
T:LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CatTest native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CatTest native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Charset native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Charset native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
|
T:LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
|
T:LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CommentList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
|
T:LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
|
T:LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CsReader native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CsReader native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Dfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
|
T:LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Dfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::DfaAction native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
|
T:LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::DfaAction native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::EOF native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
T:LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::EOF native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Error LibreMetaverse.LslTools.Error LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LslError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
|
T:LibreMetaverse.LslTools.Error LibreMetaverse.LslTools.Error LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LslError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ErrorHandler native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ErrorHandler native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Func LibreMetaverse.LslTools.Func LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Func native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.Func LibreMetaverse.LslTools.Func LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Func native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_4 not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_4 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_6 not_applicable mapped none
|
T:LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_6 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GenBase native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GenBase native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ID LibreMetaverse.LslTools.ID LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ID native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.ID LibreMetaverse.LslTools.ID LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ID native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item LibreMetaverse.LslTools.Item LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item LibreMetaverse.LslTools.Item LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_10 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_10 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_10_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_10 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_10_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_10 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_11 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_11 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_12 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_12 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_12_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_12 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_12_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_12 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_13 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_13 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_14 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_14 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_14_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_14 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_14_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_14 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_15 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_15 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_16 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_16 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_16_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_16 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_16_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_16 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_17 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_17 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_18 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_18 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_18_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_18 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_18_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_18 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_19 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_19 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_20 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_20 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_20_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_20 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_20_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_20 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_21 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_21 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_22 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_22 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_22_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_22 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_22_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_22 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_23 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_23 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_24 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_24 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_24_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_24 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_24_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_24 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_4 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_4 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_6 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_6 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_7 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_7 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_8 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_8 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_8_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_8 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_8_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_8 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_9 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
T:LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_9 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LNode native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LNode native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Lexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Lexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LexerEnumerator native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
|
T:LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LexerEnumerator native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LineList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LineManager native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LineManager native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Literal native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
T:LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Literal native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::NEW native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::NEW native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name LibreMetaverse.LslTools.Name LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name LibreMetaverse.LslTools.Name LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_4 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_4 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Nfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.NfaNode not_applicable mapped none
|
T:LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Nfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.NfaNode not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::NfaNode native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
|
T:LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::NfaNode native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Null LibreMetaverse.LslTools.Null LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Null native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Null LibreMetaverse.LslTools.Null LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Null native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ObjectList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ObjectList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ObjectListOListEnumerator native_metacrate_type none traits_and_composition: System.Object, System.Collections.IEnumerator not_applicable mapped nested types are flattened
|
T:LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ObjectListOListEnumerator native_metacrate_type none traits_and_composition: System.Object, System.Collections.IEnumerator not_applicable mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseStackEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParseStackEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParseState native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Parser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Parser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserOldAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserOldAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserReduce native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserReduce native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserShift native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserShift native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserSimpleAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserSimpleAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParsingInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParsingInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Path LibreMetaverse.LslTools.Path LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Path native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Path LibreMetaverse.LslTools.Path LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Path native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Precedence native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools enum libremetaverse-lsl-tools libremetaverse_lsl_tools::PrecedencePrecType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
T:LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools enum metacrate-lsl-tools metacrate_lsl_tools::PrecedencePrecType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
|
||||||
T:LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ProdItem native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ProdItem native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.Production LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Production native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.Production LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Production native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Regex native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Regex native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Relation native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Relation native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ResWds native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ResWds native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::SCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::SCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SEMICOLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SEMICOLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SYMBOL native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SYMBOL native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Serialiser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Serialiser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Sfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Sfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SourceLineInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SourceLineInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_2 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_2 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_4 not_applicable mapped none
|
T:LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_4 not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolSet native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolType native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolType native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolsGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
|
T:LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolsGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::TCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
T:LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::TCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::THIS native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
T:LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::THIS native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TOKEN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
|
T:LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TOKEN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Tfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Tfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TokClassDef native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TokClassDef native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TokensGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
|
T:LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TokensGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Transition native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Transition native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::YyLexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::YyLexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::YyParser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
T:LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::YyParser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Parser not_applicable mapped none
|
T:LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Parser not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Lexer not_applicable mapped none
|
T:LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Lexer not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RecoveredError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Error not_applicable mapped none
|
T:LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RecoveredError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Error not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Yycs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyParser not_applicable mapped none
|
T:LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Yycs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyParser not_applicable mapped none
|
||||||
T:LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Yycs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyLexer not_applicable mapped none
|
T:LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Yycs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyLexer not_applicable mapped none
|
||||||
T:LibreMetaverse.MapAdultEvent LibreMetaverse.MapAdultEvent LibreMetaverse class libremetaverse libremetaverse::MapAdultEvent native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
T:LibreMetaverse.MapAdultEvent LibreMetaverse.MapAdultEvent LibreMetaverse class libremetaverse libremetaverse::MapAdultEvent native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
||||||
T:LibreMetaverse.MapAdultLandForSale LibreMetaverse.MapAdultLandForSale LibreMetaverse class libremetaverse libremetaverse::MapAdultLandForSale native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
T:LibreMetaverse.MapAdultLandForSale LibreMetaverse.MapAdultLandForSale LibreMetaverse class libremetaverse libremetaverse::MapAdultLandForSale native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
||||||
T:LibreMetaverse.MapAgentLocation LibreMetaverse.MapAgentLocation LibreMetaverse class libremetaverse libremetaverse::MapAgentLocation native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
T:LibreMetaverse.MapAgentLocation LibreMetaverse.MapAgentLocation LibreMetaverse class libremetaverse libremetaverse::MapAgentLocation native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
|
||||||
|
|||||||
|
Can't render this file because it is too large.
|
56
api/SEMVER-AUDIT.md
Normal file
56
api/SEMVER-AUDIT.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# First-release API and SemVer audit
|
||||||
|
|
||||||
|
Generated by `metacrate-ci-matrix api-baseline-write`; do not edit by hand.
|
||||||
|
|
||||||
|
The compatibility source is pinned at [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba). The baseline version is `0.0.1`.
|
||||||
|
|
||||||
|
## Coverage and quality decisions
|
||||||
|
|
||||||
|
- Mapped/exported public types: **3066 / 3066**; unexplained mappings: **0**.
|
||||||
|
- Mapped/exported public members: **30789 / 30789**; duplicate destinations: **0**.
|
||||||
|
- Rust naming and ownership: mapped function/constant names follow Rust conventions and every member uses a reviewed ownership term.
|
||||||
|
- External signature types: **142**; referenced support traits: **2**; accidental dependency types exposed by mapped signatures or public Rust declarations: **0**.
|
||||||
|
- Intentional delegate APM replacements: **80**; each uses a native callback and is compiled by the downstream fixture.
|
||||||
|
- Descriptively named overloads: **7151**; names remain fixed by the mapping ledger.
|
||||||
|
- Native `async fn` mappings: **334**; boxed object-safe trait futures with explicit `Send`: **26**.
|
||||||
|
- Callback signatures requiring `Send + Sync`: **137**; reviewed dyn-compatible thread-safe boundary traits: **6** (`IGridClient`, `IBakingTextureProvider`, `ICurrentOutfitPolicy`, `IRlvActionCallbacks`, `IRlvQueryCallbacks`, and `IVoiceLogger`).
|
||||||
|
- C# enum mappings: **243** (46 unknown-bit-retaining flag types); stable public error enums marked `non_exhaustive`: **7**.
|
||||||
|
|
||||||
|
## Crate baselines
|
||||||
|
|
||||||
|
| Crate | Mapped types | Mapped members | Rust declarations | Features | Declaration SHA-256 |
|
||||||
|
| --- | ---: | ---: | ---: | --- | --- |
|
||||||
|
| `libremetaverse` | 2711 | 27281 | 24562 | dds-bc67, default, jpeg2000, rust-j2k, vorbis | `b1c578bb84f352dc5c920fa87751b560eaba2b0d83db4ba8ff560535eeb51afa` |
|
||||||
|
| `libremetaverse-types` | 45 | 942 | 887 | none | `532cdfc175a60cb6ab109b2c43cfdda1d89cf0aadffccbcd7c9b18e1a3215bee` |
|
||||||
|
| `libremetaverse-structured-data` | 16 | 295 | 304 | none | `b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3` |
|
||||||
|
| `libremetaverse-imaging` | 3 | 20 | 70 | default, jpeg2000, rust-j2k | `19423a5aec60e38d547b809ab947e7aff6366318f97f69cde824f57ae6194c0e` |
|
||||||
|
| `libremetaverse-imaging-skia` | 1 | 3 | 17 | default, rust-skia, skia | `855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f` |
|
||||||
|
| `libremetaverse-prim-mesher` | 17 | 207 | 117 | none | `dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415` |
|
||||||
|
| `libremetaverse-rendering-simple` | 1 | 6 | 12 | none | `4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad` |
|
||||||
|
| `libremetaverse-rendering-mesh-foundry` | 1 | 14 | 25 | none | `3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896` |
|
||||||
|
| `metacrate-lsl-tools` | 164 | 768 | 870 | none | `030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599` |
|
||||||
|
| `libremetaverse-rlv` | 28 | 499 | 301 | none | `f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a` |
|
||||||
|
| `libremetaverse-utilities` | 3 | 13 | 19 | none | `a376fe10ea6b1e5fcd26a27d7d66e7a1d1b1408bdc5c77e05c3e0d1ce027b0b1` |
|
||||||
|
| `libremetaverse-voice-vivox` | 64 | 531 | 259 | none | `b13e157186e97a38b16aa786d3f9fd4724175979ed3fea8964b7d38f4e0a3ead` |
|
||||||
|
| `libremetaverse-voice-webrtc` | 12 | 210 | 316 | default, real-audio | `b5b224b2b87aabaae6492566af9b9904101098dcd5d9b1a609a97f3a37ecbc87` |
|
||||||
|
| `libremetaverse-openjpeg` | 0 | 0 | 64 | none | `9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b` |
|
||||||
|
| `libremetaverse-opus` | 0 | 0 | 9 | none | `c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47` |
|
||||||
|
|
||||||
|
The exact mapping, exported-marker, feature, and normalized Rust declaration hashes are stored in [`SEMVER-BASELINE.json`](SEMVER-BASELINE.json). A change must be reviewed and classified before the baseline is re-recorded.
|
||||||
|
|
||||||
|
## Intentional Rust migration recipes
|
||||||
|
|
||||||
|
- C# `PascalCase` methods/properties become Rust `snake_case`; overloads use the ledger's stable descriptive suffix, never argument-count dispatch.
|
||||||
|
- C# reference ownership becomes owned values, shared or mutable borrows, `Arc`-backed managers, and explicit optional values as recorded per member.
|
||||||
|
- `Task<T>` becomes `async fn -> Result<T, Error>`; object-safe async traits return `Pin<Box<dyn Future<Output = Result<...>> + Send + '_>>`.
|
||||||
|
- .NET events become `subscribe_*` calls returning an owned `Subscription`; callbacks are `Send + Sync` and dispatch outside internal locks.
|
||||||
|
- `IDisposable` becomes explicit idempotent shutdown plus `Drop`; cancellation remains a typed `Error::Cancelled`.
|
||||||
|
- Closed C# enums retain fixed discriminants and are SemVer-breaking to extend; flags retain unknown bits, while public Rust error enums are `non_exhaustive`.
|
||||||
|
- Pure-Rust image backends are enabled by default (`rust-j2k`, `rust-skia`); native alternatives remain feature-gated (`jpeg2000`, `skia`, `vorbis`, `real-audio`), and empty-default sets remain part of the baseline.
|
||||||
|
- Capability HTTP injection uses project-owned `HttpMessageHandler`, `CapsHttpLimits`, and `with_native_transport`; the internal `reqwest` client is not part of the public surface.
|
||||||
|
- External C# signature types map to core/std, adopted cross-platform crates, or project-owned boundary types; no third-party crate path leaks through mapped signatures or public Rust declarations.
|
||||||
|
|
||||||
|
## Compile consumers
|
||||||
|
|
||||||
|
- `tests/api-compile` compiles every mapped type/member from a standalone downstream workspace.
|
||||||
|
- `tests/semver-port` is a runnable representative port covering lifecycle, value types, structured data, imaging, RLV, cancellation, dyn trait, and `Send`/`Sync` contracts without network access.
|
||||||
207
api/SEMVER-BASELINE.json
Normal file
207
api/SEMVER-BASELINE.json
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"release": "0.0.1",
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"mapped_public_types": 3066,
|
||||||
|
"mapped_members": 30789,
|
||||||
|
"external_signature_types": 142,
|
||||||
|
"support_traits": 2,
|
||||||
|
"intentional_differences": 80,
|
||||||
|
"descriptive_overloads": 7151,
|
||||||
|
"async_functions": 334,
|
||||||
|
"send_boxed_futures": 26,
|
||||||
|
"thread_safe_callbacks": 137,
|
||||||
|
"thread_safe_dyn_traits": 6,
|
||||||
|
"non_exhaustive_error_enums": 7,
|
||||||
|
"enum_types": 243,
|
||||||
|
"bitflag_types": 46,
|
||||||
|
"unexplained_mappings": 0,
|
||||||
|
"accidental_public_dependency_types": 0,
|
||||||
|
"type_mapping_sha256": "21025889c62b0f8666a2dda46a03ff4f28931f51156927822a1c04e97b49f221",
|
||||||
|
"member_mapping_sha256": "cd99420643c665ea393dd59418c33fb00f97f7030e71540c00b2b27470abb1d4",
|
||||||
|
"exported_mapping_sha256": "5b8a502ce229d26732744f2b44c029fc4a86b403966dc2f9b4a1c913a7b242b9",
|
||||||
|
"rust_declaration_sha256": "b2ba1ccf9293ac94164e593546891a2a122b1e5997ee4ecc2de86ef5eb0d866e",
|
||||||
|
"crates": [
|
||||||
|
{
|
||||||
|
"name": "libremetaverse",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {
|
||||||
|
"dds-bc67": [
|
||||||
|
"dep:bcdec_rs"
|
||||||
|
],
|
||||||
|
"default": [
|
||||||
|
"dds-bc67",
|
||||||
|
"rust-j2k"
|
||||||
|
],
|
||||||
|
"jpeg2000": [
|
||||||
|
"libremetaverse-imaging/jpeg2000"
|
||||||
|
],
|
||||||
|
"rust-j2k": [
|
||||||
|
"libremetaverse-imaging/rust-j2k"
|
||||||
|
],
|
||||||
|
"vorbis": [
|
||||||
|
"dep:vorbis_rs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mapped_types": 2711,
|
||||||
|
"mapped_members": 27281,
|
||||||
|
"public_declarations": 24562,
|
||||||
|
"declaration_sha256": "b1c578bb84f352dc5c920fa87751b560eaba2b0d83db4ba8ff560535eeb51afa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-types",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 45,
|
||||||
|
"mapped_members": 942,
|
||||||
|
"public_declarations": 887,
|
||||||
|
"declaration_sha256": "532cdfc175a60cb6ab109b2c43cfdda1d89cf0aadffccbcd7c9b18e1a3215bee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-structured-data",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 16,
|
||||||
|
"mapped_members": 295,
|
||||||
|
"public_declarations": 304,
|
||||||
|
"declaration_sha256": "b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-imaging",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {
|
||||||
|
"default": [
|
||||||
|
"rust-j2k"
|
||||||
|
],
|
||||||
|
"jpeg2000": [
|
||||||
|
"dep:libremetaverse-openjpeg"
|
||||||
|
],
|
||||||
|
"rust-j2k": [
|
||||||
|
"dep:j2k"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mapped_types": 3,
|
||||||
|
"mapped_members": 20,
|
||||||
|
"public_declarations": 70,
|
||||||
|
"declaration_sha256": "19423a5aec60e38d547b809ab947e7aff6366318f97f69cde824f57ae6194c0e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-imaging-skia",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {
|
||||||
|
"default": [
|
||||||
|
"rust-skia"
|
||||||
|
],
|
||||||
|
"rust-skia": [
|
||||||
|
"dep:image-webp",
|
||||||
|
"dep:skia-rs-codec",
|
||||||
|
"skia-rs-codec/gif",
|
||||||
|
"skia-rs-codec/jpeg",
|
||||||
|
"skia-rs-codec/png"
|
||||||
|
],
|
||||||
|
"skia": [
|
||||||
|
"dep:skia-safe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mapped_types": 1,
|
||||||
|
"mapped_members": 3,
|
||||||
|
"public_declarations": 17,
|
||||||
|
"declaration_sha256": "855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-prim-mesher",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 17,
|
||||||
|
"mapped_members": 207,
|
||||||
|
"public_declarations": 117,
|
||||||
|
"declaration_sha256": "dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rendering-simple",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 1,
|
||||||
|
"mapped_members": 6,
|
||||||
|
"public_declarations": 12,
|
||||||
|
"declaration_sha256": "4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rendering-mesh-foundry",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 1,
|
||||||
|
"mapped_members": 14,
|
||||||
|
"public_declarations": 25,
|
||||||
|
"declaration_sha256": "3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "metacrate-lsl-tools",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 164,
|
||||||
|
"mapped_members": 768,
|
||||||
|
"public_declarations": 870,
|
||||||
|
"declaration_sha256": "030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rlv",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 28,
|
||||||
|
"mapped_members": 499,
|
||||||
|
"public_declarations": 301,
|
||||||
|
"declaration_sha256": "f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-utilities",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 3,
|
||||||
|
"mapped_members": 13,
|
||||||
|
"public_declarations": 19,
|
||||||
|
"declaration_sha256": "a376fe10ea6b1e5fcd26a27d7d66e7a1d1b1408bdc5c77e05c3e0d1ce027b0b1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-voice-vivox",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 64,
|
||||||
|
"mapped_members": 531,
|
||||||
|
"public_declarations": 259,
|
||||||
|
"declaration_sha256": "b13e157186e97a38b16aa786d3f9fd4724175979ed3fea8964b7d38f4e0a3ead"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-voice-webrtc",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {
|
||||||
|
"default": [],
|
||||||
|
"real-audio": [
|
||||||
|
"dep:cpal"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mapped_types": 12,
|
||||||
|
"mapped_members": 210,
|
||||||
|
"public_declarations": 316,
|
||||||
|
"declaration_sha256": "b5b224b2b87aabaae6492566af9b9904101098dcd5d9b1a609a97f3a37ecbc87"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-openjpeg",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 0,
|
||||||
|
"mapped_members": 0,
|
||||||
|
"public_declarations": 64,
|
||||||
|
"declaration_sha256": "9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-opus",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"features": {},
|
||||||
|
"mapped_types": 0,
|
||||||
|
"mapped_members": 0,
|
||||||
|
"public_declarations": 9,
|
||||||
|
"declaration_sha256": "c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -4,19 +4,19 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
|
|||||||
|
|
||||||
| Assembly | Types | Members | Status |
|
| Assembly | Types | Members | Status |
|
||||||
|---|---:|---:|---|
|
|---|---:|---:|---|
|
||||||
| `LibreMetaverse` | 2,711 | 27,281 | callable failure-only shim |
|
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 477 types / 18,019 members; remaining surface is callable failure-only shims |
|
||||||
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | callable failure-only shim |
|
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | callable failure-only shim |
|
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
|
||||||
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
|
| `LibreMetaverse.LslTools` | 164 | 768 | native implementation: 164 types / 768 members; no generated shims remain |
|
||||||
| `LibreMetaverse.PrimMesher` | 17 | 207 | callable failure-only shim |
|
| `LibreMetaverse.PrimMesher` | 17 | 207 | native implementation: 15 types / 200 members; remaining surface is callable failure-only shims |
|
||||||
| `LibreMetaverse.RLV` | 28 | 499 | callable failure-only shim |
|
| `LibreMetaverse.RLV` | 28 | 499 | native implementation: 28 types / 499 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | callable failure-only shim |
|
| `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | native implementation: 1 type / 14 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Rendering.Simple` | 1 | 6 | callable failure-only shim |
|
| `LibreMetaverse.Rendering.Simple` | 1 | 6 | native implementation: 1 type / 6 members; no generated shims remain |
|
||||||
| `LibreMetaverse.StructuredData` | 16 | 295 | callable failure-only shim |
|
| `LibreMetaverse.StructuredData` | 16 | 295 | native implementation: 16 types / 295 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Types` | 45 | 942 | callable failure-only shim |
|
| `LibreMetaverse.Types` | 45 | 942 | native implementation: 45 types / 942 members; no generated shims remain |
|
||||||
| `LibreMetaverse.Utilities` | 3 | 13 | callable failure-only shim |
|
| `LibreMetaverse.Utilities` | 3 | 13 | native implementation: 2 types / 9 members; remaining surface is callable failure-only shims |
|
||||||
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | callable failure-only shim |
|
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | native implementation: 32 types / 259 members; remaining surface is callable failure-only shims |
|
||||||
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | callable failure-only shim |
|
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | native implementation: 12 types / 210 members; no generated shims remain |
|
||||||
|
|
||||||
The `LibreMetaverse` assembly is complete across issue #7 wire/data, issue #8 core runtime/networking,
|
The `LibreMetaverse` assembly is complete across issue #7 wire/data, issue #8 core runtime/networking,
|
||||||
issue #9 avatar-facing manager, and issue #10 world/social/service manager slices.
|
issue #9 avatar-facing manager, and issue #10 world/social/service manager slices.
|
||||||
|
|||||||
328
api/TYPES.tsv
328
api/TYPES.tsv
@@ -1425,170 +1425,170 @@ libremetaverse LibreMetaverse.Stats stats::UtilizationStatistics class LibreMeta
|
|||||||
libremetaverse LibreMetaverse.Stats stats::Stat class LibreMetaverse.Stats.Stat LibreMetaverse/UtilizationStatistics.cs 41
|
libremetaverse LibreMetaverse.Stats stats::Stat class LibreMetaverse.Stats.Stat LibreMetaverse/UtilizationStatistics.cs 41
|
||||||
libremetaverse-rendering-simple LibreMetaverse.Rendering SimpleRenderer class LibreMetaverse.Rendering.SimpleRenderer LibreMetaverse.Rendering.Simple/SimpleRenderer.cs 34
|
libremetaverse-rendering-simple LibreMetaverse.Rendering SimpleRenderer class LibreMetaverse.Rendering.SimpleRenderer LibreMetaverse.Rendering.Simple/SimpleRenderer.cs 34
|
||||||
libremetaverse-rendering-mesh-foundry LibreMetaverse.Rendering MeshFoundry class LibreMetaverse.Rendering.MeshFoundry LibreMetaverse.Rendering.MeshFoundry/MeshFoundry.cs 37
|
libremetaverse-rendering-mesh-foundry LibreMetaverse.Rendering MeshFoundry class LibreMetaverse.Rendering.MeshFoundry LibreMetaverse.Rendering.MeshFoundry/MeshFoundry.cs 37
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ObjectList class LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools/ObjectList.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ObjectList class LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools/ObjectList.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools OListEnumerator class LibreMetaverse.LslTools.OListEnumerator LibreMetaverse.LslTools/ObjectList.cs 94
|
metacrate-lsl-tools LibreMetaverse.LslTools OListEnumerator class LibreMetaverse.LslTools.OListEnumerator LibreMetaverse.LslTools/ObjectList.cs 94
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/AddToFunc.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/AddToFunc.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/Builder.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/Builder.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsException class LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools/Tools/CSToolsException.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsException class LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools/Tools/CSToolsException.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsFatalException class LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools/Tools/CSToolsFatalException.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsFatalException class LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools/Tools/CSToolsFatalException.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsStopException class LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools/Tools/CSToolsStopException.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsStopException class LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools/Tools/CSToolsStopException.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CSymbol class LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools/Tools/CSymbol.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools CSymbol class LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools/Tools/CSymbol.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SymType enum LibreMetaverse.LslTools.SymType LibreMetaverse.LslTools/Tools/CSymbol.cs 216
|
metacrate-lsl-tools LibreMetaverse.LslTools SymType enum LibreMetaverse.LslTools.SymType LibreMetaverse.LslTools/Tools/CSymbol.cs 216
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CatTest class LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools/Tools/CatTest.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools CatTest class LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools/Tools/CatTest.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Charset class LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools/Tools/Charset.cs 34
|
metacrate-lsl-tools LibreMetaverse.LslTools Charset class LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools/Tools/Charset.cs 34
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CommentList class LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools/Tools/CommentList.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools CommentList class LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools/Tools/CommentList.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools CsReader class LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools/Tools/CsReader.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools CsReader class LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools/Tools/CsReader.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Dfa class LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools/Tools/Dfa.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools Dfa class LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools/Tools/Dfa.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Action class LibreMetaverse.LslTools.Action LibreMetaverse.LslTools/Tools/Dfa.cs 272
|
metacrate-lsl-tools LibreMetaverse.LslTools Action class LibreMetaverse.LslTools.Action LibreMetaverse.LslTools/Tools/Dfa.cs 272
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools EOF class LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools/Tools/EOF.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools EOF class LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools/Tools/EOF.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ErrorHandler class LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools/Tools/ErrorHandler.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ErrorHandler class LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools/Tools/ErrorHandler.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolSet delegate LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/Func.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet delegate LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/Func.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GenBase class LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools/Tools/GenBase.cs 33
|
metacrate-lsl-tools LibreMetaverse.LslTools GenBase class LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools/Tools/GenBase.cs 33
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LNode class LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools/Tools/LNode.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LNode class LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools/Tools/LNode.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Lexer class LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools/Tools/Lexer.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools Lexer class LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools/Tools/Lexer.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools _Enumerator class LibreMetaverse.LslTools._Enumerator LibreMetaverse.LslTools/Tools/Lexer.cs 305
|
metacrate-lsl-tools LibreMetaverse.LslTools _Enumerator class LibreMetaverse.LslTools._Enumerator LibreMetaverse.LslTools/Tools/Lexer.cs 305
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LineList class LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools/Tools/LineList.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LineList class LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools/Tools/LineList.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LineManager class LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools/Tools/LineManager.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LineManager class LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools/Tools/LineManager.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Literal class LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools/Tools/Literal.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Literal class LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools/Tools/Literal.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Nfa class LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools/Tools/Nfa.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Nfa class LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools/Tools/Nfa.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools NfaNode class LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools/Tools/NfaNode.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools NfaNode class LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools/Tools/NfaNode.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Null class LibreMetaverse.LslTools.Null LibreMetaverse.LslTools/Tools/Null.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Null class LibreMetaverse.LslTools.Null LibreMetaverse.LslTools/Tools/Null.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParseStackEntry class LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools/Tools/ParseStackEntry.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ParseStackEntry class LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools/Tools/ParseStackEntry.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParseState class LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools/Tools/ParseState.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools ParseState class LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools/Tools/ParseState.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Parser class LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools/Tools/Parser.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools Parser class LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools/Tools/Parser.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserAction class LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools/Tools/ParserAction.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserAction class LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools/Tools/ParserAction.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserEntry class LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools/Tools/ParserEntry.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserEntry class LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools/Tools/ParserEntry.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserOldAction class LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools/Tools/ParserOldAction.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserOldAction class LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools/Tools/ParserOldAction.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserReduce class LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools/Tools/ParserReduce.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserReduce class LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools/Tools/ParserReduce.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserShift class LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools/Tools/ParserShift.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserShift class LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools/Tools/ParserShift.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserSimpleAction class LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools/Tools/ParserSimpleAction.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ParserSimpleAction class LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools/Tools/ParserSimpleAction.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ParsingInfo class LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools/Tools/ParsingInfo.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ParsingInfo class LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools/Tools/ParsingInfo.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Path class LibreMetaverse.LslTools.Path LibreMetaverse.LslTools/Tools/Path.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Path class LibreMetaverse.LslTools.Path LibreMetaverse.LslTools/Tools/Path.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Precedence class LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools/Tools/Precedence.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools Precedence class LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools/Tools/Precedence.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools PrecType enum LibreMetaverse.LslTools.PrecType LibreMetaverse.LslTools/Tools/Precedence.cs 106
|
metacrate-lsl-tools LibreMetaverse.LslTools PrecType enum LibreMetaverse.LslTools.PrecType LibreMetaverse.LslTools/Tools/Precedence.cs 106
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ProdItem class LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools/Tools/ProdItem.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ProdItem class LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools/Tools/ProdItem.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Production class LibreMetaverse.LslTools.Production LibreMetaverse.LslTools/Tools/Production.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools Production class LibreMetaverse.LslTools.Production LibreMetaverse.LslTools/Tools/Production.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Regex class LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools/Tools/Regex.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools Regex class LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools/Tools/Regex.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Hashtable delegate LibreMetaverse.LslTools.Hashtable LibreMetaverse.LslTools/Tools/Relation.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools Hashtable delegate LibreMetaverse.LslTools.Hashtable LibreMetaverse.LslTools/Tools/Relation.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ResWds class LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools/Tools/ResWds.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools ResWds class LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools/Tools/ResWds.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/SCreator.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/SCreator.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SYMBOL class LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools/Tools/SYMBOL.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools SYMBOL class LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools/Tools/SYMBOL.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Serialiser class LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools/Tools/Serialiser.cs 35
|
metacrate-lsl-tools LibreMetaverse.LslTools Serialiser class LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools/Tools/Serialiser.cs 35
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Sfactory class LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools/Tools/Sfactory.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools Sfactory class LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools/Tools/Sfactory.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SourceLineInfo class LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools/Tools/SourceLineInfo.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools SourceLineInfo class LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools/Tools/SourceLineInfo.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolSet class LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/SymbolSet.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet class LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/SymbolSet.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolType class LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools/Tools/SymbolType.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools SymbolType class LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools/Tools/SymbolType.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolsGen class LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools/Tools/SymbolsGen.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools SymbolsGen class LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools/Tools/SymbolsGen.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/TCreator.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/TCreator.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools TOKEN class LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools/Tools/TOKEN.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools TOKEN class LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools/Tools/TOKEN.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Tfactory class LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools/Tools/Tfactory.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools Tfactory class LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools/Tools/Tfactory.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools TokClassDef class LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools/Tools/TokClassDef.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools TokClassDef class LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools/Tools/TokClassDef.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools TokensGen class LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools/Tools/TokensGen.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools TokensGen class LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools/Tools/TokensGen.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Transition class LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools/Tools/Transition.cs 32
|
metacrate-lsl-tools LibreMetaverse.LslTools Transition class LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools/Tools/Transition.cs 32
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools YyLexer class LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools/Tools/YyLexer.cs 35
|
metacrate-lsl-tools LibreMetaverse.LslTools YyLexer class LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools/Tools/YyLexer.cs 35
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools YyParser class LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools/Tools/YyParser.cs 33
|
metacrate-lsl-tools LibreMetaverse.LslTools YyParser class LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools/Tools/YyParser.cs 33
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Error class LibreMetaverse.LslTools.Error LibreMetaverse.LslTools/Tools/error.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Error class LibreMetaverse.LslTools.Error LibreMetaverse.LslTools/Tools/error.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools recoveredError class LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools/Tools/recoveredError.cs 31
|
metacrate-lsl-tools LibreMetaverse.LslTools recoveredError class LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools/Tools/recoveredError.cs 31
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ANY class LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools/YYClass/ANY.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ANY class LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools/YYClass/ANY.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BASE class LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools/YYClass/BASE.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BASE class LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools/YYClass/BASE.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall class LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools/YYClass/BaseCall.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall class LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools/YYClass/BaseCall.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_1 class LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools/YYClass/BaseCall_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_1 class LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools/YYClass/BaseCall_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_2 class LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools/YYClass/BaseCall_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2 class LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools/YYClass/BaseCall_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_2_1 class LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools/YYClass/BaseCall_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2_1 class LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools/YYClass/BaseCall_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_3 class LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools/YYClass/BaseCall_3.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_3 class LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools/YYClass/BaseCall_3.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_4 class LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools/YYClass/BaseCall_4.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4 class LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools/YYClass/BaseCall_4.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_4_1 class LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools/YYClass/BaseCall_4_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4_1 class LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools/YYClass/BaseCall_4_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_5 class LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools/YYClass/BaseCall_5.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_5 class LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools/YYClass/BaseCall_5.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_6 class LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools/YYClass/BaseCall_6.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6 class LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools/YYClass/BaseCall_6.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_6_1 class LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools/YYClass/BaseCall_6_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6_1 class LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools/YYClass/BaseCall_6_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools COLON class LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools/YYClass/COLON.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools COLON class LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools/YYClass/COLON.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Call class LibreMetaverse.LslTools.Call LibreMetaverse.LslTools/YYClass/Call.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Call class LibreMetaverse.LslTools.Call LibreMetaverse.LslTools/YYClass/Call.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_1 class LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools/YYClass/Call_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Call_1 class LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools/YYClass/Call_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_2 class LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools/YYClass/Call_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Call_2 class LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools/YYClass/Call_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_2_1 class LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools/YYClass/Call_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Call_2_1 class LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools/YYClass/Call_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody class LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools/YYClass/ClassBody.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody class LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools/YYClass/ClassBody.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_1 class LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools/YYClass/ClassBody_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_1 class LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools/YYClass/ClassBody_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_2 class LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools/YYClass/ClassBody_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2 class LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools/YYClass/ClassBody_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_2_1 class LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools/YYClass/ClassBody_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2_1 class LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools/YYClass/ClassBody_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons class LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools/YYClass/Cons.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Cons class LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools/YYClass/Cons.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_1 class LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools/YYClass/Cons_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Cons_1 class LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools/YYClass/Cons_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_2 class LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools/YYClass/Cons_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Cons_2 class LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools/YYClass/Cons_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_2_1 class LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools/YYClass/Cons_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Cons_2_1 class LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools/YYClass/Cons_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff class LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools/YYClass/GStuff.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff class LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools/YYClass/GStuff.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_1 class LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools/YYClass/GStuff_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_1 class LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools/YYClass/GStuff_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_2 class LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools/YYClass/GStuff_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2 class LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools/YYClass/GStuff_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_2_1 class LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools/YYClass/GStuff_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2_1 class LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools/YYClass/GStuff_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_3 class LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools/YYClass/GStuff_3.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_3 class LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools/YYClass/GStuff_3.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_4 class LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools/YYClass/GStuff_4.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4 class LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools/YYClass/GStuff_4.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_4_1 class LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools/YYClass/GStuff_4_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4_1 class LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools/YYClass/GStuff_4_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_5 class LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools/YYClass/GStuff_5.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_5 class LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools/YYClass/GStuff_5.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_6 class LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools/YYClass/GStuff_6.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6 class LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools/YYClass/GStuff_6.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_6_1 class LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools/YYClass/GStuff_6_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6_1 class LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools/YYClass/GStuff_6_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools ID class LibreMetaverse.LslTools.ID LibreMetaverse.LslTools/YYClass/ID.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools ID class LibreMetaverse.LslTools.ID LibreMetaverse.LslTools/YYClass/ID.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item class LibreMetaverse.LslTools.Item LibreMetaverse.LslTools/YYClass/Item.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item class LibreMetaverse.LslTools.Item LibreMetaverse.LslTools/YYClass/Item.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_1 class LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools/YYClass/Item_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_1 class LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools/YYClass/Item_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_10 class LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools/YYClass/Item_10.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_10 class LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools/YYClass/Item_10.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_10_1 class LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools/YYClass/Item_10_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_10_1 class LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools/YYClass/Item_10_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_11 class LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools/YYClass/Item_11.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_11 class LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools/YYClass/Item_11.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_12 class LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools/YYClass/Item_12.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_12 class LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools/YYClass/Item_12.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_12_1 class LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools/YYClass/Item_12_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_12_1 class LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools/YYClass/Item_12_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_13 class LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools/YYClass/Item_13.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_13 class LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools/YYClass/Item_13.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_14 class LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools/YYClass/Item_14.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_14 class LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools/YYClass/Item_14.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_14_1 class LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools/YYClass/Item_14_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_14_1 class LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools/YYClass/Item_14_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_15 class LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools/YYClass/Item_15.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_15 class LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools/YYClass/Item_15.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_16 class LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools/YYClass/Item_16.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_16 class LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools/YYClass/Item_16.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_16_1 class LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools/YYClass/Item_16_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_16_1 class LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools/YYClass/Item_16_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_17 class LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools/YYClass/Item_17.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_17 class LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools/YYClass/Item_17.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_18 class LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools/YYClass/Item_18.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_18 class LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools/YYClass/Item_18.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_18_1 class LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools/YYClass/Item_18_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_18_1 class LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools/YYClass/Item_18_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_19 class LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools/YYClass/Item_19.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_19 class LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools/YYClass/Item_19.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_2 class LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools/YYClass/Item_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_2 class LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools/YYClass/Item_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_20 class LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools/YYClass/Item_20.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_20 class LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools/YYClass/Item_20.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_20_1 class LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools/YYClass/Item_20_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_20_1 class LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools/YYClass/Item_20_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_21 class LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools/YYClass/Item_21.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_21 class LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools/YYClass/Item_21.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_22 class LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools/YYClass/Item_22.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_22 class LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools/YYClass/Item_22.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_22_1 class LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools/YYClass/Item_22_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_22_1 class LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools/YYClass/Item_22_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_23 class LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools/YYClass/Item_23.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_23 class LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools/YYClass/Item_23.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_24 class LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools/YYClass/Item_24.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_24 class LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools/YYClass/Item_24.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_24_1 class LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools/YYClass/Item_24_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_24_1 class LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools/YYClass/Item_24_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_2_1 class LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools/YYClass/Item_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_2_1 class LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools/YYClass/Item_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_3 class LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools/YYClass/Item_3.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_3 class LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools/YYClass/Item_3.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_4 class LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools/YYClass/Item_4.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_4 class LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools/YYClass/Item_4.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_4_1 class LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools/YYClass/Item_4_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_4_1 class LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools/YYClass/Item_4_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_5 class LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools/YYClass/Item_5.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_5 class LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools/YYClass/Item_5.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_6 class LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools/YYClass/Item_6.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_6 class LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools/YYClass/Item_6.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_6_1 class LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools/YYClass/Item_6_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_6_1 class LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools/YYClass/Item_6_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_7 class LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools/YYClass/Item_7.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_7 class LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools/YYClass/Item_7.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_8 class LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools/YYClass/Item_8.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_8 class LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools/YYClass/Item_8.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_8_1 class LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools/YYClass/Item_8_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_8_1 class LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools/YYClass/Item_8_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_9 class LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools/YYClass/Item_9.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Item_9 class LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools/YYClass/Item_9.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LBRACE class LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools/YYClass/LBRACE.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LBRACE class LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools/YYClass/LBRACE.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LBRACK class LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools/YYClass/LBRACK.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LBRACK class LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools/YYClass/LBRACK.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools LPAREN class LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools/YYClass/LPAREN.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools LPAREN class LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools/YYClass/LPAREN.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools NEW class LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools/YYClass/NEW.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools NEW class LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools/YYClass/NEW.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name class LibreMetaverse.LslTools.Name LibreMetaverse.LslTools/YYClass/Name.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name class LibreMetaverse.LslTools.Name LibreMetaverse.LslTools/YYClass/Name.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_1 class LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools/YYClass/Name_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_1 class LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools/YYClass/Name_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_2 class LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools/YYClass/Name_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_2 class LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools/YYClass/Name_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_2_1 class LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools/YYClass/Name_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_2_1 class LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools/YYClass/Name_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_3 class LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools/YYClass/Name_3.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_3 class LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools/YYClass/Name_3.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_4 class LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools/YYClass/Name_4.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_4 class LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools/YYClass/Name_4.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_4_1 class LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools/YYClass/Name_4_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Name_4_1 class LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools/YYClass/Name_4_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools RBRACE class LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools/YYClass/RBRACE.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools RBRACE class LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools/YYClass/RBRACE.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools RBRACK class LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools/YYClass/RBRACK.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools RBRACK class LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools/YYClass/RBRACK.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools RPAREN class LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools/YYClass/RPAREN.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools RPAREN class LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools/YYClass/RPAREN.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools SEMICOLON class LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools/YYClass/SEMICOLON.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools SEMICOLON class LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools/YYClass/SEMICOLON.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff class LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools/YYClass/Stuff.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff class LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools/YYClass/Stuff.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_1 class LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools/YYClass/Stuff_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_1 class LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools/YYClass/Stuff_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_2 class LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools/YYClass/Stuff_2.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2 class LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools/YYClass/Stuff_2.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_2_1 class LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools/YYClass/Stuff_2_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2_1 class LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools/YYClass/Stuff_2_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_3 class LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools/YYClass/Stuff_3.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_3 class LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools/YYClass/Stuff_3.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_4 class LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools/YYClass/Stuff_4.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4 class LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools/YYClass/Stuff_4.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_4_1 class LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools/YYClass/Stuff_4_1.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4_1 class LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools/YYClass/Stuff_4_1.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools THIS class LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools/YYClass/THIS.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools THIS class LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools/YYClass/THIS.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools cs0syntax class LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools/YYClass/cs0syntax.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools cs0syntax class LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools/YYClass/cs0syntax.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools cs0tokens class LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools/YYClass/cs0tokens.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools cs0tokens class LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools/YYClass/cs0tokens.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools yycs0syntax class LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools/YYClass/yycs0syntax.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools yycs0syntax class LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools/YYClass/yycs0syntax.cs 29
|
||||||
libremetaverse-lsl-tools LibreMetaverse.LslTools yycs0tokens class LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools/YYClass/yycs0tokens.cs 29
|
metacrate-lsl-tools LibreMetaverse.LslTools yycs0tokens class LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools/YYClass/yycs0tokens.cs 29
|
||||||
libremetaverse-rlv LibreMetaverse.RLV AttachmentRequest class LibreMetaverse.RLV.AttachmentRequest LibreMetaverse.RLV/AttachmentRequest.cs 8
|
libremetaverse-rlv LibreMetaverse.RLV AttachmentRequest class LibreMetaverse.RLV.AttachmentRequest LibreMetaverse.RLV/AttachmentRequest.cs 8
|
||||||
libremetaverse-rlv LibreMetaverse.RLV CameraRestrictions class LibreMetaverse.RLV.CameraRestrictions LibreMetaverse.RLV/CameraRestrictions.cs 8
|
libremetaverse-rlv LibreMetaverse.RLV CameraRestrictions class LibreMetaverse.RLV.CameraRestrictions LibreMetaverse.RLV/CameraRestrictions.cs 8
|
||||||
libremetaverse-rlv LibreMetaverse.RLV CameraSettings class LibreMetaverse.RLV.CameraSettings LibreMetaverse.RLV/CameraSettings.cs 3
|
libremetaverse-rlv LibreMetaverse.RLV CameraSettings class LibreMetaverse.RLV.CameraSettings LibreMetaverse.RLV/CameraSettings.cs 3
|
||||||
|
|||||||
|
612
api/collada-constructor-defaults.json
Normal file
612
api/collada-constructor-defaults.json
Normal file
@@ -0,0 +1,612 @@
|
|||||||
|
{
|
||||||
|
"defaults": {
|
||||||
|
"accessor": {
|
||||||
|
"offset": "((ulong)(0m))",
|
||||||
|
"stride": "((ulong)(1m))"
|
||||||
|
},
|
||||||
|
"animation_clip": {
|
||||||
|
"start": "0D"
|
||||||
|
},
|
||||||
|
"asset": {
|
||||||
|
"up_axis": "UpAxisType.Y_UP"
|
||||||
|
},
|
||||||
|
"assetUnit": {
|
||||||
|
"meter": "1D",
|
||||||
|
"name": "\"meter\""
|
||||||
|
},
|
||||||
|
"common_transparent_type": {
|
||||||
|
"opaque": "fx_opaque_enum.A_ONE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_CG": {
|
||||||
|
"platform": "\"PC\""
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLES": {
|
||||||
|
"platform": "\"PC\""
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_funcFunc": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_funcValue": {
|
||||||
|
"value": "((float)(0F))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_funcDest": {
|
||||||
|
"value": "gl_blend_type.ZERO"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_funcSrc": {
|
||||||
|
"value": "gl_blend_type.ONE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassClip_plane_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassColor_logic_op_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassColor_material_enable": {
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassCull_face": {
|
||||||
|
"value": "gl_face_type.BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassCull_face_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_func": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_mask": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassDither_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFog_density": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFog_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFog_end": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFog_mode": {
|
||||||
|
"value": "gl_fog_type.EXP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFog_start": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassFront_face": {
|
||||||
|
"value": "gl_front_face_type.CCW"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_constant_attenuation": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_linear_attenutation": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_model_two_side_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_quadratic_attenuation": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_spot_cutoff": {
|
||||||
|
"value": "180D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLight_spot_exponent": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLighting_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLine_smooth_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLine_width": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassLogic_op": {
|
||||||
|
"value": "gl_logic_op_type.COPY"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassMaterial_shininess": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassMultisample_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassNormalize_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_fade_threshold_size": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size_max": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size_min": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_smooth_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassPolygon_offset_fill_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassRescale_normal_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassSample_alpha_to_coverage_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassSample_alpha_to_one_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassSample_coverage_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassScissor_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassShade_model": {
|
||||||
|
"value": "gl_shade_model_type.SMOOTH"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcFunc": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcMask": {
|
||||||
|
"value": "((byte)(255))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcRef": {
|
||||||
|
"value": "((byte)(0))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_mask": {
|
||||||
|
"value": "((long)(4294967295))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opFail": {
|
||||||
|
"value": "gles_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opZfail": {
|
||||||
|
"value": "gles_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opZpass": {
|
||||||
|
"value": "gles_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLESTechniquePassTexture_pipeline_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_funcFunc": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_funcValue": {
|
||||||
|
"value": "((float)(0F))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassAuto_normal_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation": {
|
||||||
|
"value": "gl_blend_equation_type.FUNC_ADD"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation_separateAlpha": {
|
||||||
|
"value": "gl_blend_equation_type.FUNC_ADD"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation_separateRgb": {
|
||||||
|
"value": "gl_blend_equation_type.FUNC_ADD"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_funcDest": {
|
||||||
|
"value": "gl_blend_type.ZERO"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_funcSrc": {
|
||||||
|
"value": "gl_blend_type.ONE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateDest_alpha": {
|
||||||
|
"value": "gl_blend_type.ZERO"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateDest_rgb": {
|
||||||
|
"value": "gl_blend_type.ZERO"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateSrc_alpha": {
|
||||||
|
"value": "gl_blend_type.ONE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateSrc_rgb": {
|
||||||
|
"value": "gl_blend_type.ONE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassClear_depth": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassClear_stencil": {
|
||||||
|
"value": "((long)(0))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassClip_plane_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_logic_op_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_materialFace": {
|
||||||
|
"value": "gl_face_type.FRONT_AND_BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_materialMode": {
|
||||||
|
"value": "gl_material_type.AMBIENT_AND_DIFFUSE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_material_enable": {
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassCull_face": {
|
||||||
|
"value": "gl_face_type.BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassCull_face_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_bounds_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_clamp_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_func": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_mask": {
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassDither_enable": {
|
||||||
|
"value": "true"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_coord_src": {
|
||||||
|
"value": "gl_fog_coord_src_type.FOG_COORDINATE"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_density": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_end": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_mode": {
|
||||||
|
"value": "gl_fog_type.EXP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_start": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassFront_face": {
|
||||||
|
"value": "gl_front_face_type.CCW"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_constant_attenuation": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_linear_attenuation": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_color_control": {
|
||||||
|
"value": "gl_light_model_color_control_type.SINGLE_COLOR"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_local_viewer_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_two_side_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_quadratic_attenuation": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_spot_cutoff": {
|
||||||
|
"value": "180D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_spot_exponent": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLighting_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_smooth_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_stipple_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_width": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLogic_op": {
|
||||||
|
"value": "gl_logic_op_type.COPY"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassLogic_op_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassMaterial_shininess": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassMultisample_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassNormalize_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_fade_threshold_size": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size_max": {
|
||||||
|
"value": "1D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size_min": {
|
||||||
|
"value": "0D"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_smooth_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_modeFace": {
|
||||||
|
"value": "gl_face_type.FRONT_AND_BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_modeMode": {
|
||||||
|
"value": "gl_polygon_mode_type.FILL"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_fill_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_line_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_point_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_smooth_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_stipple_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassRescale_normal_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_alpha_to_coverage_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_alpha_to_one_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_coverage_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassScissor_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassShade_model": {
|
||||||
|
"value": "gl_shade_model_type.SMOOTH"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcFunc": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcMask": {
|
||||||
|
"value": "((byte)(255))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcRef": {
|
||||||
|
"value": "((byte)(0))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateBack": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateFront": {
|
||||||
|
"value": "gl_func_type.ALWAYS"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateMask": {
|
||||||
|
"value": "((byte)(255))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateRef": {
|
||||||
|
"value": "((byte)(0))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask": {
|
||||||
|
"value": "((long)(4294967295))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask_separateFace": {
|
||||||
|
"value": "gl_face_type.FRONT_AND_BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask_separateMask": {
|
||||||
|
"value": "((byte)(255))"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opFail": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opZfail": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opZpass": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateFace": {
|
||||||
|
"value": "gl_face_type.FRONT_AND_BACK"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateFail": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateZfail": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateZpass": {
|
||||||
|
"value": "gl_stencil_op_type.KEEP"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_test_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture1D_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture2D_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture3D_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureCUBE_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureDEPTH_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureRECT_enable": {
|
||||||
|
"value": "false"
|
||||||
|
},
|
||||||
|
"float_array": {
|
||||||
|
"digits": "((short)(6))",
|
||||||
|
"magnitude": "((short)(38))"
|
||||||
|
},
|
||||||
|
"fx_clearcolor_common": {
|
||||||
|
"index": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_cleardepth_common": {
|
||||||
|
"index": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_clearstencil_common": {
|
||||||
|
"index": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_colortarget_common": {
|
||||||
|
"face": "fx_surface_face_enum.POSITIVE_X",
|
||||||
|
"index": "\"0\"",
|
||||||
|
"mip": "\"0\"",
|
||||||
|
"slice": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_depthtarget_common": {
|
||||||
|
"face": "fx_surface_face_enum.POSITIVE_X",
|
||||||
|
"index": "\"0\"",
|
||||||
|
"mip": "\"0\"",
|
||||||
|
"slice": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_sampler1D_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(0))",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_sampler2D_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(255))",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_t": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_sampler3D_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(255))",
|
||||||
|
"wrap_p": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_t": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_samplerCUBE_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(255))",
|
||||||
|
"wrap_p": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_t": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_samplerDEPTH_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_t": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_samplerRECT_common": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(255))",
|
||||||
|
"wrap_s": "fx_sampler_wrap_common.WRAP",
|
||||||
|
"wrap_t": "fx_sampler_wrap_common.WRAP"
|
||||||
|
},
|
||||||
|
"fx_stenciltarget_common": {
|
||||||
|
"face": "fx_surface_face_enum.POSITIVE_X",
|
||||||
|
"index": "\"0\"",
|
||||||
|
"mip": "\"0\"",
|
||||||
|
"slice": "\"0\""
|
||||||
|
},
|
||||||
|
"fx_surface_common": {
|
||||||
|
"mip_levels": "((uint)(0))"
|
||||||
|
},
|
||||||
|
"fx_surface_init_from_common": {
|
||||||
|
"face": "fx_surface_face_enum.POSITIVE_X",
|
||||||
|
"mip": "((uint)(0))",
|
||||||
|
"slice": "((uint)(0))"
|
||||||
|
},
|
||||||
|
"gles_sampler_state": {
|
||||||
|
"magfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"minfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipfilter": "fx_sampler_filter_common.NONE",
|
||||||
|
"mipmap_bias": "((float)(0F))",
|
||||||
|
"mipmap_maxlevel": "((byte)(255))",
|
||||||
|
"wrap_s": "gles_sampler_wrap.REPEAT",
|
||||||
|
"wrap_t": "gles_sampler_wrap.REPEAT"
|
||||||
|
},
|
||||||
|
"gles_texcombiner_argumentAlpha_type": {
|
||||||
|
"operand": "gles_texcombiner_operandAlpha_enums.SRC_ALPHA"
|
||||||
|
},
|
||||||
|
"gles_texcombiner_argumentRGB_type": {
|
||||||
|
"operand": "gles_texcombiner_operandRGB_enums.SRC_COLOR"
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"depth": "((ulong)(1m))"
|
||||||
|
},
|
||||||
|
"instance_rigid_bodyTechnique_common": {
|
||||||
|
"angular_velocity": "\"0.0 0.0 0.0\"",
|
||||||
|
"velocity": "\"0.0 0.0 0.0\""
|
||||||
|
},
|
||||||
|
"int_array": {
|
||||||
|
"maxInclusive": "\"2147483647\"",
|
||||||
|
"minInclusive": "\"-2147483648\""
|
||||||
|
},
|
||||||
|
"morph": {
|
||||||
|
"method": "MorphMethodType.NORMALIZED"
|
||||||
|
},
|
||||||
|
"node": {
|
||||||
|
"type": "NodeType.NODE"
|
||||||
|
},
|
||||||
|
"spline": {
|
||||||
|
"closed": "false"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"schema": 1,
|
||||||
|
"source": "LibreMetaverse/ImportExport/Collada.cs",
|
||||||
|
"source_sha256": "45c55db0e12deebfca978793a2c38f4f07e5ec853be05cb85ace84b68f12570a"
|
||||||
|
}
|
||||||
90
benchmarks/README.md
Normal file
90
benchmarks/README.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Pinned cross-runtime performance evidence
|
||||||
|
|
||||||
|
This directory compares representative offline work in native Rust with the
|
||||||
|
pinned C# source at commit `2aa70bb68513b39795da5d13c88f31b86e85a3ba`.
|
||||||
|
The runners are separate executables. The Rust executable never starts a CLR,
|
||||||
|
loads a managed assembly, accesses a grid, or reads `.env`.
|
||||||
|
|
||||||
|
## Workloads and fixtures
|
||||||
|
|
||||||
|
`fixtures/manifest.json` records SHA-256 for every shared input. Both runners
|
||||||
|
refuse a changed fixture. The suite measures UUID/matrix/quaternion operations,
|
||||||
|
all five supported LLSD codecs, packet encode/decode, notecard/TGA/mesh decode,
|
||||||
|
inventory and object updates, simple rendering, and a batched offline client
|
||||||
|
message pipeline. Each report contains one cold operation and seven warm
|
||||||
|
samples. It records latency, throughput, allocated bytes, retained heap bytes,
|
||||||
|
and allocation count where the runtime exposes it. .NET reports a null
|
||||||
|
allocation count because its supported in-process GC API exposes bytes, not
|
||||||
|
operation count; it does not substitute a misleading zero.
|
||||||
|
|
||||||
|
The checked-in inputs are deliberately modest so the suite completes on a
|
||||||
|
four-core, 8 GiB release worker. Iteration counts live in `workloads.json`.
|
||||||
|
Regenerate binary inputs only after an intentional fixture review:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo run -p metacrate-performance --profile benchmark -- \
|
||||||
|
fixtures --fixture-root benchmarks/fixtures
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reproducing the reports
|
||||||
|
|
||||||
|
Use the same otherwise-idle machine for both runs. Disable adaptive power or
|
||||||
|
thermal throttling where the host permits it. The committed evidence was
|
||||||
|
captured on Linux x86-64 with four AMD EPYC-Genoa vCPUs and 7.6 GiB RAM, Rust
|
||||||
|
1.97.1, .NET SDK 10.0.400, and the .NET 8.0.30 runtime. C# is built in Release
|
||||||
|
for `net8.0`. Rust uses the repository's `benchmark` profile (opt-level 1,
|
||||||
|
debug/incremental disabled): higher optimization of the generated core exceeds
|
||||||
|
the memory limit on this release worker, so this is a conservative Rust result.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
REFERENCE_ROOT=/absolute/path/to/libremetaverse
|
||||||
|
test "$(git -C "$REFERENCE_ROOT" rev-parse HEAD)" = \
|
||||||
|
2aa70bb68513b39795da5d13c88f31b86e85a3ba
|
||||||
|
|
||||||
|
dotnet build benchmarks/csharp-reference/MetaCrate.ReferenceBenchmarks.csproj \
|
||||||
|
-c Release -p:ReferenceRoot="$REFERENCE_ROOT"
|
||||||
|
dotnet benchmarks/csharp-reference/bin/Release/net8.0/MetaCrate.ReferenceBenchmarks.dll \
|
||||||
|
run --reference-root "$REFERENCE_ROOT" \
|
||||||
|
--fixture-root benchmarks/fixtures \
|
||||||
|
--output benchmarks/results/csharp-linux-x86_64.json
|
||||||
|
|
||||||
|
cargo run -p metacrate-performance --profile benchmark -- \
|
||||||
|
run --fixture-root benchmarks/fixtures \
|
||||||
|
--output benchmarks/results/rust-linux-x86_64.json
|
||||||
|
cargo run -p metacrate-performance --profile benchmark -- \
|
||||||
|
compare --rust benchmarks/results/rust-linux-x86_64.json \
|
||||||
|
--reference benchmarks/results/csharp-linux-x86_64.json \
|
||||||
|
--output benchmarks/results/comparison.json
|
||||||
|
cargo run -p metacrate-performance --profile benchmark -- \
|
||||||
|
audit --fixture-root benchmarks/fixtures \
|
||||||
|
--rust benchmarks/results/rust-linux-x86_64.json \
|
||||||
|
--reference benchmarks/results/csharp-linux-x86_64.json \
|
||||||
|
--comparison benchmarks/results/comparison.json
|
||||||
|
```
|
||||||
|
|
||||||
|
The C# runner executes `git rev-parse` itself and rejects any other source
|
||||||
|
commit. The comparison rejects different fixture hashes, operating systems, or
|
||||||
|
architectures.
|
||||||
|
|
||||||
|
## Release criteria and reviewed differences
|
||||||
|
|
||||||
|
`release-criteria.json` is executable policy. A warm median at least 25% slower
|
||||||
|
than the reference is material and must be reviewed; the hard default is no
|
||||||
|
more than 2.0x latency or allocated bytes. Reference operations below one
|
||||||
|
microsecond are latency-noise exempt, but not allocation exempt.
|
||||||
|
|
||||||
|
Three workload-specific differences are accepted:
|
||||||
|
|
||||||
|
- Rust LLSD JSON owns and validates the bounded decoded tree. It is over four
|
||||||
|
times faster in this evidence, so up to 2.1x allocated bytes is accepted.
|
||||||
|
- Rust rendering performs the completed behavior: six faces, 24 vertices, 36
|
||||||
|
indices, checked normals, UVs, extents, and materials. The pinned C#
|
||||||
|
`SimpleRenderer` still returns a one-face/eight-vertex placeholder cube.
|
||||||
|
Slowing Rust down by removing correctness would violate the milestone, so the
|
||||||
|
policy accepts up to 8x latency and 4x allocated bytes for this workload.
|
||||||
|
- Rust client throughput returns checked `Result` values and owns the bounded
|
||||||
|
OSD map throughout the message pipeline. It allocates fewer bytes than C#;
|
||||||
|
its measured 1.64x latency is reviewed up to the unchanged 2x hard limit.
|
||||||
|
|
||||||
|
No exception permits changed wire data, decoded values, fixture output, or
|
||||||
|
public behavior. Any other threshold failure blocks the audit.
|
||||||
41
benchmarks/REPORT.md
Normal file
41
benchmarks/REPORT.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Performance comparison report
|
||||||
|
|
||||||
|
Accepted evidence captured 2026-08-12 on the Linux x86-64 host documented in
|
||||||
|
`README.md`. Ratios are Rust divided by the pinned C# reference; lower is
|
||||||
|
better. Bytes are allocated bytes per operation. Full cold and seven-sample
|
||||||
|
warm measurements, throughput, allocation count support, retained heap, hashes,
|
||||||
|
and toolchains are in `results/`.
|
||||||
|
|
||||||
|
| Workload | Rust latency | C# latency | Ratio | Rust bytes | C# bytes | Result |
|
||||||
|
|---|---:|---:|---:|---:|---:|---|
|
||||||
|
| UUID/math | 107 ns | 105 ns | 1.02x | 36 | 40 | pass |
|
||||||
|
| LLSD XML | 23.36 us | 38.74 us | 0.60x | 10,939 | 28,600 | pass |
|
||||||
|
| LLSD JSON | 5.23 us | 21.72 us | 0.24x | 7,447 | 3,680 | reviewed pass |
|
||||||
|
| LLSD binary | 2.69 us | 11.07 us | 0.24x | 6,749 | 7,960 | pass |
|
||||||
|
| LLSD notation | 7.01 us | 18.87 us | 0.37x | 8,489 | 10,096 | pass |
|
||||||
|
| LLSD protobuf | 7.34 us | 30.97 us | 0.24x | 8,324 | 26,120 | pass |
|
||||||
|
| Packet codec | 209 ns | 176 ns | 1.19x | 124 | 264 | pass |
|
||||||
|
| Asset decode | 288 ns | 2.98 us | 0.10x | 1,246 | 4,512 | pass |
|
||||||
|
| Image decode | 42.67 us | 48.27 us | 0.88x | 65,536 | 131,612 | pass |
|
||||||
|
| Mesh decode | 413.29 us | 378.54 us | 1.09x | 507,740 | 564,593 | pass |
|
||||||
|
| Inventory update | 972 ns | 758 ns | 1.28x | 373 | 357 | pass |
|
||||||
|
| Object update | 27 ns | 46 ns | 0.59x | 16 | 11 | pass |
|
||||||
|
| Rendering | 5.22 us | 1.01 us | 5.15x | 9,480 | 3,048 | reviewed pass |
|
||||||
|
| Client throughput | 6.23 us | 3.80 us | 1.64x | 11,795 | 12,054 | reviewed pass |
|
||||||
|
|
||||||
|
The initial profile exposed two actionable regressions. Root inventory updates
|
||||||
|
rebuilt the entire hierarchy and link index on every record; the new guarded
|
||||||
|
root path updates only the affected node/link and changed the comparison from
|
||||||
|
about 22.6x latency and 10.2x allocation to 1.28x and 1.05x. TGA decoding copied
|
||||||
|
the input stream and dispatched every ordinary pixel through the fully generic
|
||||||
|
orientation/palette path; the checked borrowed-input and common-layout path
|
||||||
|
changed it from about 3.4x latency and 2.0x allocation to 0.88x and 0.50x.
|
||||||
|
|
||||||
|
LLSD JSON, rendering, and client throughput are the reviewed differences. JSON
|
||||||
|
trades 2.02x allocated bytes for 4.15x lower latency. Rendering cannot be
|
||||||
|
compared as equal work: the pinned C# method is a placeholder one-face cube,
|
||||||
|
while Rust returns the required complete checked mesh. Client throughput is
|
||||||
|
1.64x slower while allocating fewer bytes because Rust preserves checked
|
||||||
|
results and bounded owned maps. The executable limits and rationales are in
|
||||||
|
`release-criteria.json`; every other workload passes the default criteria or
|
||||||
|
the documented sub-microsecond noise rule.
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
<ReferenceRoot Condition="'$(ReferenceRoot)' == ''">$(MSBuildThisFileDirectory)../../../libremetaverse</ReferenceRoot>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse/LibreMetaverse.csproj" />
|
||||||
|
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj" />
|
||||||
|
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse.Rendering.MeshFoundry/LibreMetaverse.Rendering.MeshFoundry.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
346
benchmarks/csharp-reference/Program.cs
Normal file
346
benchmarks/csharp-reference/Program.cs
Normal file
@@ -0,0 +1,346 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text.Json;
|
||||||
|
using LibreMetaverse;
|
||||||
|
using LibreMetaverse.Assets;
|
||||||
|
using LibreMetaverse.Imaging;
|
||||||
|
using LibreMetaverse.Messages.Linden;
|
||||||
|
using LibreMetaverse.Packets;
|
||||||
|
using LibreMetaverse.Rendering;
|
||||||
|
using LibreMetaverse.StructuredData;
|
||||||
|
using IOPath = System.IO.Path;
|
||||||
|
|
||||||
|
const int Schema = 1;
|
||||||
|
const int Runs = 7;
|
||||||
|
const string ExpectedReference = "2aa70bb68513b39795da5d13c88f31b86e85a3ba";
|
||||||
|
|
||||||
|
if (args.Length == 0 || args[0] != "run")
|
||||||
|
throw new ArgumentException("usage: dotnet run ... -- run --fixture-root PATH --output FILE");
|
||||||
|
string root = Value("--fixture-root") ?? "benchmarks/fixtures";
|
||||||
|
string output = Value("--output") ?? "benchmarks/results/csharp-linux-x86_64.json";
|
||||||
|
string referenceRoot = Value("--reference-root") ?? throw new ArgumentException("missing --reference-root");
|
||||||
|
VerifyReferenceCommit(referenceRoot);
|
||||||
|
Fixture fixture = JsonSerializer.Deserialize<Fixture>(File.ReadAllBytes(IOPath.Combine(root, "workloads.json")), Options())
|
||||||
|
?? throw new InvalidDataException("empty fixture");
|
||||||
|
if (fixture.Schema != 1 || fixture.ReferenceCommit != ExpectedReference || fixture.WarmupDivisor == 0)
|
||||||
|
throw new InvalidDataException("fixture schema or reference commit does not match policy");
|
||||||
|
Dictionary<string, string> hashes = VerifyManifest(root);
|
||||||
|
var context = new Context(fixture, root);
|
||||||
|
var results = new List<BenchmarkResult>();
|
||||||
|
foreach (Workload workload in Workloads())
|
||||||
|
{
|
||||||
|
int iterations = workload.Iterations(fixture);
|
||||||
|
Metrics cold = Measure(context, workload.Run, 1);
|
||||||
|
GC.KeepAlive(workload.Run(context, Math.Max(1, iterations / fixture.WarmupDivisor)));
|
||||||
|
var samples = new List<Metrics>();
|
||||||
|
for (int index = 0; index < Runs; index++) samples.Add(Measure(context, workload.Run, iterations));
|
||||||
|
Metrics median = samples.OrderBy(value => value.ElapsedNs).ElementAt(Runs / 2);
|
||||||
|
results.Add(new BenchmarkResult(workload.Name, workload.Category, "operation", workload.Fixture, cold, samples, median));
|
||||||
|
}
|
||||||
|
var report = new Report(
|
||||||
|
Schema,
|
||||||
|
"dotnet-reference",
|
||||||
|
ExpectedReference,
|
||||||
|
hashes,
|
||||||
|
new EnvironmentInfo(
|
||||||
|
OperatingSystem.IsLinux() ? "linux" : OperatingSystem.IsWindows() ? "windows" : OperatingSystem.IsMacOS() ? "macos" : RuntimeInformation.OSDescription,
|
||||||
|
RuntimeInformation.ProcessArchitecture switch { Architecture.X64 => "x86_64", Architecture.Arm64 => "aarch64", Architecture.X86 => "x86", Architecture.Arm => "arm", _ => RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant() },
|
||||||
|
Environment.ProcessorCount,
|
||||||
|
RuntimeInformation.FrameworkDescription,
|
||||||
|
"Release net8.0"),
|
||||||
|
results);
|
||||||
|
Directory.CreateDirectory(IOPath.GetDirectoryName(IOPath.GetFullPath(output))!);
|
||||||
|
File.WriteAllText(output, JsonSerializer.Serialize(report, Options()) + "\n");
|
||||||
|
|
||||||
|
string? Value(string key)
|
||||||
|
{
|
||||||
|
int index = Array.IndexOf(args, key);
|
||||||
|
return index >= 0 && index + 1 < args.Length ? args[index + 1] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JsonSerializerOptions Options() => new()
|
||||||
|
{
|
||||||
|
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
|
||||||
|
WriteIndented = true
|
||||||
|
};
|
||||||
|
|
||||||
|
static Dictionary<string, string> VerifyManifest(string root)
|
||||||
|
{
|
||||||
|
var expected = JsonSerializer.Deserialize<Dictionary<string, string>>(
|
||||||
|
File.ReadAllBytes(IOPath.Combine(root, "manifest.json")), Options())
|
||||||
|
?? throw new InvalidDataException("empty manifest");
|
||||||
|
foreach ((string name, string hash) in expected)
|
||||||
|
{
|
||||||
|
string actual = Convert.ToHexString(SHA256.HashData(File.ReadAllBytes(IOPath.Combine(root, name)))).ToLowerInvariant();
|
||||||
|
if (actual != hash) throw new InvalidDataException($"fixture hash mismatch for {name}");
|
||||||
|
}
|
||||||
|
return expected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VerifyReferenceCommit(string referenceRoot)
|
||||||
|
{
|
||||||
|
var start = new ProcessStartInfo("git")
|
||||||
|
{
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
UseShellExecute = false
|
||||||
|
};
|
||||||
|
start.ArgumentList.Add("-C");
|
||||||
|
start.ArgumentList.Add(referenceRoot);
|
||||||
|
start.ArgumentList.Add("rev-parse");
|
||||||
|
start.ArgumentList.Add("HEAD");
|
||||||
|
var process = Process.Start(start) ?? throw new InvalidOperationException("could not start git");
|
||||||
|
string commit = process.StandardOutput.ReadToEnd().Trim();
|
||||||
|
process.WaitForExit();
|
||||||
|
if (process.ExitCode != 0 || commit != ExpectedReference)
|
||||||
|
throw new InvalidDataException($"reference checkout must be pinned to {ExpectedReference}, got {commit}");
|
||||||
|
}
|
||||||
|
|
||||||
|
static Metrics Measure(Context context, Func<Context, int, ulong> function, int iterations)
|
||||||
|
{
|
||||||
|
long allocatedBefore = GC.GetAllocatedBytesForCurrentThread();
|
||||||
|
long heapBefore = GC.GetTotalMemory(false);
|
||||||
|
long started = Stopwatch.GetTimestamp();
|
||||||
|
ulong checksum = function(context, iterations);
|
||||||
|
long elapsed = Stopwatch.GetTimestamp() - started;
|
||||||
|
long heapAfter = GC.GetTotalMemory(false);
|
||||||
|
long allocated = GC.GetAllocatedBytesForCurrentThread() - allocatedBefore;
|
||||||
|
GC.KeepAlive(checksum);
|
||||||
|
long elapsedNs = checked((long)(elapsed * (1_000_000_000.0 / Stopwatch.Frequency)));
|
||||||
|
double seconds = elapsedNs / 1_000_000_000.0;
|
||||||
|
return new Metrics(iterations, elapsedNs, (double)elapsedNs / iterations, iterations / seconds, null, allocated, heapAfter - heapBefore);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Workload[] Workloads() =>
|
||||||
|
[
|
||||||
|
new("uuid_math", "uuid/math", "workloads.json", f => f.UuidMathIterations, UuidMath),
|
||||||
|
new("llsd_xml", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdXml),
|
||||||
|
new("llsd_json", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdJson),
|
||||||
|
new("llsd_binary", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdBinary),
|
||||||
|
new("llsd_notation", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdNotation),
|
||||||
|
new("llsd_protobuf", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdProtobuf),
|
||||||
|
new("packet_codec", "packet codec", "agent_pause.packet", f => f.PacketIterations, PacketCodec),
|
||||||
|
new("asset_decode", "asset decode", "notecard.txt", f => f.AssetIterations, AssetDecode),
|
||||||
|
new("image_decode", "image decode", "image.tga", f => f.ImageIterations, ImageDecode),
|
||||||
|
new("mesh_decode", "mesh decode", "mesh_asset.bin", f => f.MeshIterations, MeshDecode),
|
||||||
|
new("inventory_update", "inventory update", "workloads.json", f => f.InventoryIterations, InventoryUpdate),
|
||||||
|
new("object_update", "object update", "workloads.json", f => f.ObjectIterations, ObjectUpdate),
|
||||||
|
new("rendering", "rendering", "workloads.json", f => f.RenderingIterations, Rendering),
|
||||||
|
new("client_throughput", "client throughput", "workloads.json", f => f.ClientIterations, ClientThroughput)
|
||||||
|
];
|
||||||
|
|
||||||
|
static ulong UuidMath(Context context, int iterations)
|
||||||
|
{
|
||||||
|
Quaternion rotation = Quaternion.CreateFromEulers(0.25f, 0.5f, 0.75f);
|
||||||
|
Matrix4 matrix = Matrix4.CreateTranslation(new Vector3(10, 20, 30));
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
var parsed = new UUID(context.Fixture.Uuid);
|
||||||
|
matrix = Matrix4.Transform(matrix, rotation);
|
||||||
|
checksum ^= parsed.GetULong() ^ BitConverter.SingleToUInt32Bits(matrix.M41) ^ (ulong)index;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong LlsdXml(Context context, int iterations) => LlsdBytes(context, iterations, OSDParser.SerializeLLSDXmlBytes, OSDParser.DeserializeLLSDXml);
|
||||||
|
static ulong LlsdBinary(Context context, int iterations) => LlsdBytes(context, iterations, OSDParser.SerializeLLSDBinary, OSDParser.DeserializeLLSDBinary);
|
||||||
|
static ulong LlsdProtobuf(Context context, int iterations) => LlsdBytes(context, iterations, value => OSDParser.SerializeLLSDProtobuf(value, true), OSDParser.DeserializeLLSDProtobuf);
|
||||||
|
|
||||||
|
static ulong LlsdBytes(Context context, int iterations, Func<OSD, byte[]> serialize, Func<byte[], OSD> deserialize)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
byte[] encoded = serialize(context.Llsd);
|
||||||
|
OSD decoded = deserialize(encoded);
|
||||||
|
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong LlsdJson(Context context, int iterations)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
string encoded = OSDParser.SerializeJsonString(context.Llsd);
|
||||||
|
OSD decoded = OSDParser.DeserializeJson(encoded);
|
||||||
|
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong LlsdNotation(Context context, int iterations)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
string encoded = OSDParser.SerializeLLSDNotation(context.Llsd);
|
||||||
|
OSD decoded = OSDParser.DeserializeLLSDNotation(encoded);
|
||||||
|
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong PacketCodec(Context context, int iterations)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
int position = 0;
|
||||||
|
var packet = new AgentPausePacket(context.Packet, ref position);
|
||||||
|
byte[] encoded = packet.ToBytes();
|
||||||
|
checksum ^= (ulong)encoded.Length ^ packet.AgentData.SerialNum;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong AssetDecode(Context context, int iterations)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
var asset = new AssetNotecard(context.Uuid, context.Notecard);
|
||||||
|
if (!asset.Decode()) throw new InvalidDataException("notecard decode returned false");
|
||||||
|
checksum ^= (ulong)asset.BodyText.Length;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong ImageDecode(Context context, int iterations)
|
||||||
|
{
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
using var stream = new MemoryStream(context.Image, false);
|
||||||
|
ManagedImage image = Targa.DecodeToManagedImage(stream);
|
||||||
|
checksum ^= (ulong)image.Red.Length;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong MeshDecode(Context context, int iterations)
|
||||||
|
{
|
||||||
|
var renderer = new MeshFoundry();
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
FacetedMesh mesh = renderer.GenerateFacetedMeshMesh(new Primitive(), context.Mesh, DetailLevel.Highest)
|
||||||
|
?? throw new InvalidDataException("mesh fixture returned no geometry");
|
||||||
|
checksum ^= (ulong)mesh.Faces.Sum(face => face.Vertices.Count + face.Indices.Count);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong InventoryUpdate(Context context, int iterations)
|
||||||
|
{
|
||||||
|
var store = new Inventory(new GridClient(), context.Uuid);
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
var item = new InventoryItem(new UUID((ulong)(index % context.Fixture.InventoryItems + 1))) { Name = $"item-{index}" };
|
||||||
|
store.UpdateNodeFor(item);
|
||||||
|
}
|
||||||
|
return (ulong)store.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong ObjectUpdate(Context context, int iterations)
|
||||||
|
{
|
||||||
|
Primitive[] objects = Enumerable.Range(0, context.Fixture.ObjectCount).Select(index => new Primitive { LocalID = (uint)index }).ToArray();
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
Primitive value = objects[index % objects.Length];
|
||||||
|
value.Position = new Vector3(index, index & 255, 21);
|
||||||
|
value.Rotation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, (index & 255) / 255.0f);
|
||||||
|
checksum ^= value.LocalID ^ BitConverter.SingleToUInt32Bits(value.Position.X);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ulong Rendering(Context context, int iterations)
|
||||||
|
{
|
||||||
|
var renderer = new SimpleRenderer();
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
FacetedMesh mesh = renderer.GenerateFacetedMesh(BoxPrimitive(), DetailLevel.High);
|
||||||
|
checksum ^= (ulong)mesh.Faces.Sum(face => face.Indices.Count);
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Primitive BoxPrimitive() => new()
|
||||||
|
{
|
||||||
|
PrimData = new Primitive.ConstructionData
|
||||||
|
{
|
||||||
|
PCode = PCode.Prim, PathCurve = PathCurve.Line, ProfileCurve = ProfileCurve.Square,
|
||||||
|
PathScaleX = 1, PathScaleY = 1, PathBegin = 0, PathEnd = 1,
|
||||||
|
ProfileBegin = 0, ProfileEnd = 1, ProfileHollow = 0,
|
||||||
|
ProfileHole = HoleType.Same, PathRevolutions = 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static ulong ClientThroughput(Context context, int iterations)
|
||||||
|
{
|
||||||
|
var client = new GridClient();
|
||||||
|
ulong checksum = 0;
|
||||||
|
for (int index = 0; index < iterations; index++)
|
||||||
|
{
|
||||||
|
for (int batch = 0; batch < context.Fixture.ClientBatch; batch++)
|
||||||
|
{
|
||||||
|
var source = new RemoteParcelRequestReply { ParcelID = context.Uuid };
|
||||||
|
OSDMap map = source.Serialize();
|
||||||
|
var target = new RemoteParcelRequestReply();
|
||||||
|
target.Deserialize(map);
|
||||||
|
checksum ^= target.ParcelID.GetULong() ^ (ulong)index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GC.KeepAlive(client);
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Context
|
||||||
|
{
|
||||||
|
public Context(Fixture fixture, string root)
|
||||||
|
{
|
||||||
|
Fixture = fixture;
|
||||||
|
Uuid = new UUID(fixture.Uuid);
|
||||||
|
Llsd = new OSDMap
|
||||||
|
{
|
||||||
|
["agent_id"] = OSD.FromUUID(Uuid), ["name"] = OSD.FromString("MetaCrate benchmark"),
|
||||||
|
["active"] = OSD.FromBoolean(true), ["score"] = OSD.FromReal(42.25),
|
||||||
|
["items"] = IntegerArray(fixture.LlsdArrayLength)
|
||||||
|
};
|
||||||
|
Packet = File.ReadAllBytes(IOPath.Combine(root, "agent_pause.packet"));
|
||||||
|
Notecard = File.ReadAllBytes(IOPath.Combine(root, "notecard.txt"));
|
||||||
|
Image = File.ReadAllBytes(IOPath.Combine(root, "image.tga"));
|
||||||
|
Mesh = File.ReadAllBytes(IOPath.Combine(root, "mesh_asset.bin"));
|
||||||
|
}
|
||||||
|
private static OSDArray IntegerArray(int count)
|
||||||
|
{
|
||||||
|
var values = new OSDArray(count);
|
||||||
|
for (int index = 0; index < count; index++) values.Add(OSD.FromInteger(index));
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
public Fixture Fixture { get; }
|
||||||
|
public UUID Uuid { get; }
|
||||||
|
public OSD Llsd { get; }
|
||||||
|
public byte[] Packet { get; }
|
||||||
|
public byte[] Notecard { get; }
|
||||||
|
public byte[] Image { get; }
|
||||||
|
public byte[] Mesh { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed record Fixture(
|
||||||
|
int Schema, string ReferenceCommit, string Uuid, int UuidMathIterations, int LlsdIterations,
|
||||||
|
int PacketIterations, int AssetIterations, int ImageIterations, int MeshIterations,
|
||||||
|
int InventoryIterations, int ObjectIterations, int RenderingIterations, int ClientIterations,
|
||||||
|
int WarmupDivisor, int LlsdArrayLength, int PacketBlocks, int ImageWidth, int ImageHeight,
|
||||||
|
int MeshSide, int InventoryItems, int ObjectCount, int ClientBatch);
|
||||||
|
sealed record Metrics(int Iterations, long ElapsedNs, double LatencyNs, double ThroughputPerSecond, long? Allocations, long BytesAllocated, long RetainedBytes);
|
||||||
|
sealed record BenchmarkResult(string Name, string Category, string Unit, string Fixture, Metrics Cold, List<Metrics> WarmSamples, Metrics WarmMedian);
|
||||||
|
sealed record EnvironmentInfo(string Os, string Arch, int LogicalCpus, string Toolchain, string Profile);
|
||||||
|
sealed record Report(int Schema, string Runtime, string ReferenceCommit, Dictionary<string, string> FixtureHashes, EnvironmentInfo Environment, List<BenchmarkResult> Results);
|
||||||
|
sealed record Workload(string Name, string Category, string Fixture, Func<Fixture, int> Iterations, Func<Context, int, ulong> Run);
|
||||||
BIN
benchmarks/fixtures/agent_pause.packet
Normal file
BIN
benchmarks/fixtures/agent_pause.packet
Normal file
Binary file not shown.
BIN
benchmarks/fixtures/image.tga
Normal file
BIN
benchmarks/fixtures/image.tga
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
7
benchmarks/fixtures/manifest.json
Normal file
7
benchmarks/fixtures/manifest.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"agent_pause.packet": "ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5",
|
||||||
|
"image.tga": "8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582",
|
||||||
|
"mesh_asset.bin": "4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684",
|
||||||
|
"notecard.txt": "b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b",
|
||||||
|
"workloads.json": "9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d"
|
||||||
|
}
|
||||||
BIN
benchmarks/fixtures/mesh_asset.bin
Normal file
BIN
benchmarks/fixtures/mesh_asset.bin
Normal file
Binary file not shown.
9
benchmarks/fixtures/notecard.txt
Normal file
9
benchmarks/fixtures/notecard.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
Linden text version 2
|
||||||
|
{
|
||||||
|
LLEmbeddedItems version 1
|
||||||
|
{
|
||||||
|
count 0
|
||||||
|
}
|
||||||
|
Text length 127
|
||||||
|
MetaCrate pinned performance fixture. This notecard exercises bounded asset parsing without a network or CLR dependency. 012345
|
||||||
|
}
|
||||||
24
benchmarks/fixtures/workloads.json
Normal file
24
benchmarks/fixtures/workloads.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"reference_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
|
||||||
|
"uuid_math_iterations": 100000,
|
||||||
|
"llsd_iterations": 2000,
|
||||||
|
"packet_iterations": 5000,
|
||||||
|
"asset_iterations": 1000,
|
||||||
|
"image_iterations": 100,
|
||||||
|
"mesh_iterations": 25,
|
||||||
|
"inventory_iterations": 10000,
|
||||||
|
"object_iterations": 20000,
|
||||||
|
"rendering_iterations": 250,
|
||||||
|
"client_iterations": 5000,
|
||||||
|
"warmup_divisor": 10,
|
||||||
|
"llsd_array_length": 32,
|
||||||
|
"packet_blocks": 16,
|
||||||
|
"image_width": 128,
|
||||||
|
"image_height": 128,
|
||||||
|
"mesh_side": 48,
|
||||||
|
"inventory_items": 128,
|
||||||
|
"object_count": 256,
|
||||||
|
"client_batch": 32
|
||||||
|
}
|
||||||
26
benchmarks/release-criteria.json
Normal file
26
benchmarks/release-criteria.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.0,
|
||||||
|
"material_latency_regression_ratio": 1.25,
|
||||||
|
"minimum_reference_latency_ns": 1000.0,
|
||||||
|
"reviewed_exceptions": [
|
||||||
|
{
|
||||||
|
"workload": "llsd_json",
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.1,
|
||||||
|
"rationale": "the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workload": "rendering",
|
||||||
|
"maximum_latency_ratio": 8.0,
|
||||||
|
"maximum_allocation_ratio": 4.0,
|
||||||
|
"rationale": "Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workload": "client_throughput",
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.0,
|
||||||
|
"rationale": "Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
194
benchmarks/results/comparison.json
Normal file
194
benchmarks/results/comparison.json
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"reference_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"fixture_hashes": {
|
||||||
|
"agent_pause.packet": "ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5",
|
||||||
|
"image.tga": "8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582",
|
||||||
|
"mesh_asset.bin": "4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684",
|
||||||
|
"notecard.txt": "b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b",
|
||||||
|
"workloads.json": "9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d"
|
||||||
|
},
|
||||||
|
"criteria": {
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.0,
|
||||||
|
"material_latency_regression_ratio": 1.25,
|
||||||
|
"minimum_reference_latency_ns": 1000.0,
|
||||||
|
"reviewed_exceptions": [
|
||||||
|
{
|
||||||
|
"workload": "llsd_json",
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.1,
|
||||||
|
"rationale": "the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workload": "rendering",
|
||||||
|
"maximum_latency_ratio": 8.0,
|
||||||
|
"maximum_allocation_ratio": 4.0,
|
||||||
|
"rationale": "Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workload": "client_throughput",
|
||||||
|
"maximum_latency_ratio": 2.0,
|
||||||
|
"maximum_allocation_ratio": 2.0,
|
||||||
|
"rationale": "Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"name": "uuid_math",
|
||||||
|
"rust_latency_ns": 107.41872,
|
||||||
|
"reference_latency_ns": 105.47209,
|
||||||
|
"latency_ratio": 1.0184563518178127,
|
||||||
|
"rust_bytes_per_operation": 36.0,
|
||||||
|
"reference_bytes_per_operation": 40.0,
|
||||||
|
"allocation_ratio": 0.9,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "llsd_xml",
|
||||||
|
"rust_latency_ns": 23361.1135,
|
||||||
|
"reference_latency_ns": 38735.79,
|
||||||
|
"latency_ratio": 0.6030886035885675,
|
||||||
|
"rust_bytes_per_operation": 10938.64,
|
||||||
|
"reference_bytes_per_operation": 28600.0,
|
||||||
|
"allocation_ratio": 0.3824699300699301,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "llsd_json",
|
||||||
|
"rust_latency_ns": 5231.5815,
|
||||||
|
"reference_latency_ns": 21724.418,
|
||||||
|
"latency_ratio": 0.24081572634074708,
|
||||||
|
"rust_bytes_per_operation": 7446.936,
|
||||||
|
"reference_bytes_per_operation": 3680.0,
|
||||||
|
"allocation_ratio": 2.0236239130434783,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "reviewed exception: the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "llsd_binary",
|
||||||
|
"rust_latency_ns": 2688.7605,
|
||||||
|
"reference_latency_ns": 11074.724,
|
||||||
|
"latency_ratio": 0.24278352218980806,
|
||||||
|
"rust_bytes_per_operation": 6749.016,
|
||||||
|
"reference_bytes_per_operation": 7960.0,
|
||||||
|
"allocation_ratio": 0.8478663316582914,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "llsd_notation",
|
||||||
|
"rust_latency_ns": 7007.081,
|
||||||
|
"reference_latency_ns": 18866.287,
|
||||||
|
"latency_ratio": 0.37140752708786845,
|
||||||
|
"rust_bytes_per_operation": 8488.784,
|
||||||
|
"reference_bytes_per_operation": 10096.0,
|
||||||
|
"allocation_ratio": 0.8408066561014262,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "llsd_protobuf",
|
||||||
|
"rust_latency_ns": 7337.0635,
|
||||||
|
"reference_latency_ns": 30965.56,
|
||||||
|
"latency_ratio": 0.23694270344214668,
|
||||||
|
"rust_bytes_per_operation": 8323.672,
|
||||||
|
"reference_bytes_per_operation": 26120.0,
|
||||||
|
"allocation_ratio": 0.31867044410413475,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "packet_codec",
|
||||||
|
"rust_latency_ns": 208.5864,
|
||||||
|
"reference_latency_ns": 175.8286,
|
||||||
|
"latency_ratio": 1.186305299592899,
|
||||||
|
"rust_bytes_per_operation": 124.0,
|
||||||
|
"reference_bytes_per_operation": 264.0,
|
||||||
|
"allocation_ratio": 0.4696969696969697,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "asset_decode",
|
||||||
|
"rust_latency_ns": 288.205,
|
||||||
|
"reference_latency_ns": 2980.13,
|
||||||
|
"latency_ratio": 0.09670886840506956,
|
||||||
|
"rust_bytes_per_operation": 1246.0,
|
||||||
|
"reference_bytes_per_operation": 4512.0,
|
||||||
|
"allocation_ratio": 0.27615248226950356,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "image_decode",
|
||||||
|
"rust_latency_ns": 42671.19,
|
||||||
|
"reference_latency_ns": 48273.63,
|
||||||
|
"latency_ratio": 0.8839440912150175,
|
||||||
|
"rust_bytes_per_operation": 65536.0,
|
||||||
|
"reference_bytes_per_operation": 131612.16,
|
||||||
|
"allocation_ratio": 0.4979479099803544,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mesh_decode",
|
||||||
|
"rust_latency_ns": 413294.68,
|
||||||
|
"reference_latency_ns": 378537.04,
|
||||||
|
"latency_ratio": 1.0918209747717158,
|
||||||
|
"rust_bytes_per_operation": 507739.92,
|
||||||
|
"reference_bytes_per_operation": 564592.96,
|
||||||
|
"allocation_ratio": 0.8993026055443554,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "inventory_update",
|
||||||
|
"rust_latency_ns": 972.1585,
|
||||||
|
"reference_latency_ns": 757.9809,
|
||||||
|
"latency_ratio": 1.282563320526942,
|
||||||
|
"rust_bytes_per_operation": 373.3421,
|
||||||
|
"reference_bytes_per_operation": 356.5016,
|
||||||
|
"allocation_ratio": 1.0472382171636818,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "object_update",
|
||||||
|
"rust_latency_ns": 27.1764,
|
||||||
|
"reference_latency_ns": 45.77345,
|
||||||
|
"latency_ratio": 0.5937153524586851,
|
||||||
|
"rust_bytes_per_operation": 16.1792,
|
||||||
|
"reference_bytes_per_operation": 10.6552,
|
||||||
|
"allocation_ratio": 1.5184323147383438,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "within default release thresholds"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rendering",
|
||||||
|
"rust_latency_ns": 5218.82,
|
||||||
|
"reference_latency_ns": 1013.564,
|
||||||
|
"latency_ratio": 5.14897924551385,
|
||||||
|
"rust_bytes_per_operation": 9480.0,
|
||||||
|
"reference_bytes_per_operation": 3048.096,
|
||||||
|
"allocation_ratio": 3.110138263361784,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "reviewed exception: Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "client_throughput",
|
||||||
|
"rust_latency_ns": 6231.7982,
|
||||||
|
"reference_latency_ns": 3795.4216,
|
||||||
|
"latency_ratio": 1.6419251552976355,
|
||||||
|
"rust_bytes_per_operation": 11795.3474,
|
||||||
|
"reference_bytes_per_operation": 12053.7952,
|
||||||
|
"allocation_ratio": 0.9785588027910082,
|
||||||
|
"accepted": true,
|
||||||
|
"criterion": "reviewed exception: Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accepted": true
|
||||||
|
}
|
||||||
1267
benchmarks/results/csharp-linux-x86_64.json
Normal file
1267
benchmarks/results/csharp-linux-x86_64.json
Normal file
File diff suppressed because it is too large
Load Diff
1267
benchmarks/results/rust-linux-x86_64.json
Normal file
1267
benchmarks/results/rust-linux-x86_64.json
Normal file
File diff suppressed because it is too large
Load Diff
79
ci/artifact-policy.json
Normal file
79
ci/artifact-policy.json
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"version": "0.0.1",
|
||||||
|
"release_packages": [
|
||||||
|
"libremetaverse-types",
|
||||||
|
"libremetaverse-structured-data",
|
||||||
|
"libremetaverse-imaging",
|
||||||
|
"libremetaverse-imaging-skia",
|
||||||
|
"libremetaverse-openjpeg",
|
||||||
|
"libremetaverse-opus",
|
||||||
|
"libremetaverse-prim-mesher",
|
||||||
|
"metacrate-lsl-tools",
|
||||||
|
"libremetaverse",
|
||||||
|
"libremetaverse-rendering-simple",
|
||||||
|
"libremetaverse-rendering-mesh-foundry",
|
||||||
|
"libremetaverse-rlv",
|
||||||
|
"libremetaverse-utilities",
|
||||||
|
"libremetaverse-voice-vivox",
|
||||||
|
"libremetaverse-voice-webrtc",
|
||||||
|
"libremetaverse-programs"
|
||||||
|
],
|
||||||
|
"binaries": [
|
||||||
|
{"name":"inventory-explorer","services":["OpenSim login, capabilities, AIS, UDP when explicitly given credentials"]},
|
||||||
|
{"name":"irc-gateway","services":["OpenSim and IRC TCP when explicitly given credentials and an IRC endpoint"]},
|
||||||
|
{"name":"live-grid-smoke","services":["none in audit/fake mode; explicit OpenSim endpoint in live mode"]},
|
||||||
|
{"name":"osd-inspector","services":["none; offline files and standard streams only"]},
|
||||||
|
{"name":"packet-dump","services":["OpenSim login and UDP when explicitly given credentials"]},
|
||||||
|
{"name":"prim-inspector","services":["OpenSim login, capabilities, and UDP when explicitly given credentials"]},
|
||||||
|
{"name":"simple-bot","services":["OpenSim login, capabilities, and UDP when explicitly given credentials"]},
|
||||||
|
{"name":"test-client","services":["OpenSim services selected by explicit login and commands"]},
|
||||||
|
{"name":"vivox-test","services":["none in help mode; explicit external Vivox control service in live mode"]},
|
||||||
|
{"name":"webrtc-test","services":["IPv4 loopback in fake mode; explicit OpenSim voice capabilities in live mode"]}
|
||||||
|
],
|
||||||
|
"offline_smokes": [
|
||||||
|
{"binary":"osd-inspector","args":["prim-to-osd"],"required_output":false},
|
||||||
|
{"binary":"live-grid-smoke","args":["--audit-only"],"required_output":false},
|
||||||
|
{"binary":"live-grid-smoke","args":["--fake","--evidence","{output}"],"required_output":true},
|
||||||
|
{"binary":"webrtc-test","args":["--fake","--timeout-seconds","10"],"required_output":false}
|
||||||
|
],
|
||||||
|
"allowed_native_ffi": [
|
||||||
|
"crates/libremetaverse-openjpeg/src/ffi.rs",
|
||||||
|
"crates/libremetaverse-openjpeg/src/lib.rs",
|
||||||
|
"crates/libremetaverse-opus/src/lib.rs"
|
||||||
|
],
|
||||||
|
"mirrored_inputs": [
|
||||||
|
{"source":"codegen/inputs/avatar_lad.xml","package_path":"crates/libremetaverse/assets/avatar_lad.xml"}
|
||||||
|
],
|
||||||
|
"forbidden_dependencies": [
|
||||||
|
"coreclr",
|
||||||
|
"grpc",
|
||||||
|
"grpcio",
|
||||||
|
"hostfxr",
|
||||||
|
"jsonrpsee",
|
||||||
|
"mono",
|
||||||
|
"netcorehost",
|
||||||
|
"pythonnet",
|
||||||
|
"tarpc",
|
||||||
|
"thrift",
|
||||||
|
"tonic",
|
||||||
|
"xmlrpc"
|
||||||
|
],
|
||||||
|
"forbidden_artifact_strings": [
|
||||||
|
"coreclr",
|
||||||
|
"hostfxr",
|
||||||
|
"mscoree.dll",
|
||||||
|
"libmono",
|
||||||
|
"libremetaverse.dll",
|
||||||
|
"system.runtime.loader",
|
||||||
|
"assemblyloadcontext"
|
||||||
|
],
|
||||||
|
"forbidden_source_strings": [
|
||||||
|
"std::process::Command",
|
||||||
|
"tokio::process",
|
||||||
|
"Command::new(\"dotnet\")",
|
||||||
|
"Command::new(\"mono\")",
|
||||||
|
"libloading::",
|
||||||
|
"include_bytes!(\"LibreMetaverse.dll\")"
|
||||||
|
]
|
||||||
|
}
|
||||||
119
ci/ci-coverage.json
Normal file
119
ci/ci-coverage.json
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"required_workflow": ".gitea/workflows/ci.yml",
|
||||||
|
"release_workflow": ".gitea/workflows/release.yml",
|
||||||
|
"hard_timeout_minutes": 30,
|
||||||
|
"internal_target_seconds": 1680,
|
||||||
|
"required_checks": [
|
||||||
|
"format",
|
||||||
|
"deterministic-generation",
|
||||||
|
"api-semver",
|
||||||
|
"workspace-tests",
|
||||||
|
"compatibility-parity",
|
||||||
|
"minimal-features",
|
||||||
|
"jpeg2000",
|
||||||
|
"rust-j2k",
|
||||||
|
"rust-skia",
|
||||||
|
"skia-binary",
|
||||||
|
"program-offline-smoke",
|
||||||
|
"clippy",
|
||||||
|
"documentation",
|
||||||
|
"dependency-policy",
|
||||||
|
"provenance-policy",
|
||||||
|
"performance-evidence",
|
||||||
|
"concurrency-regressions"
|
||||||
|
],
|
||||||
|
"legacy_workflows": [
|
||||||
|
{
|
||||||
|
"workflow": "api-surface.yml",
|
||||||
|
"responsibility": "Generated API mappings, SemVer baseline and audit, downstream consumer compilation, and focused lint",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["deterministic-generation", "api-semver", "clippy"],
|
||||||
|
"rationale": "Public API drift must block every code-ready change."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "artifact-audit.yml",
|
||||||
|
"responsibility": "Source packages, release binaries, native linkage, and artifact/provenance inspection",
|
||||||
|
"destination": "release",
|
||||||
|
"checks": ["release-packaging", "native-artifact-audit"],
|
||||||
|
"rationale": "Full packaging is expensive; routine provenance policy and package metadata validation remain required."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "codegen.yml",
|
||||||
|
"responsibility": "Deterministic generation, generated wire/catalog tests, API fixture, and clean generator artifact",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["format", "deterministic-generation", "workspace-tests", "compatibility-parity"],
|
||||||
|
"rationale": "Generated-source and translated compatibility drift must fail before compilation proceeds."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "concurrency-audit.yml",
|
||||||
|
"responsibility": "Focused race regressions and bounded resource soak",
|
||||||
|
"destination": "split",
|
||||||
|
"checks": ["concurrency-regressions", "long-resource-soak"],
|
||||||
|
"rationale": "Focused regressions remain required; the 16-cycle resource soak runs in the non-routine release gate."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "documentation.yml",
|
||||||
|
"responsibility": "Documentation audit, warning-free docs, doctests, examples, and documented program tests",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["documentation", "program-offline-smoke"],
|
||||||
|
"rationale": "Documentation and documented offline behavior are part of the public release surface."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "imaging-meshing.yml",
|
||||||
|
"responsibility": "Imaging and meshing tests, parity cases, benchmark compilation, lint, and docs",
|
||||||
|
"destination": "split",
|
||||||
|
"checks": ["workspace-tests", "compatibility-parity", "clippy", "documentation", "benchmark-compilation"],
|
||||||
|
"rationale": "Tests, parity, lint, and docs remain required; redundant benchmark compilation moves to the release gate."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "jpeg2000.yml",
|
||||||
|
"responsibility": "Independent OpenJPEG and pure-Rust JPEG 2000 feature builds, tests, and interoperability",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["jpeg2000", "rust-j2k"],
|
||||||
|
"rationale": "The optional native codec is tested with exact OpenJPEG 2.5.4 and the pure-Rust codec is tested independently and together with it."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "performance.yml",
|
||||||
|
"responsibility": "Pinned C# comparison harness and committed performance evidence audit",
|
||||||
|
"destination": "split",
|
||||||
|
"checks": ["performance-evidence", "performance-regeneration"],
|
||||||
|
"rationale": "Committed evidence validation remains required; C# checkout and evidence regeneration are manual release work."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "release-candidate.yml",
|
||||||
|
"responsibility": "Aggregate release-readiness gate and evidence",
|
||||||
|
"destination": "release",
|
||||||
|
"checks": ["release-candidate-audit"],
|
||||||
|
"rationale": "The aggregate release decision is non-routine and no longer recompiles the required gate."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "release-matrix.yml",
|
||||||
|
"responsibility": "Default, minimal, features, release profiles, and portable cross-target checks",
|
||||||
|
"destination": "split",
|
||||||
|
"checks": ["minimal-features", "jpeg2000", "rust-j2k", "skia-binary", "portable-cross-targets", "release-profile"],
|
||||||
|
"rationale": "Fast feature isolation remains required; cross-target and release-profile builds run non-routinely."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "rust-workspace.yml",
|
||||||
|
"responsibility": "Milestone checks, workspace compilation, program smoke, audio feature, extension lint, and docs",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["workspace-tests", "compatibility-parity", "program-offline-smoke", "clippy", "documentation"],
|
||||||
|
"rationale": "One all-feature test graph replaces overlapping compile and test invocations."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "skia.yml",
|
||||||
|
"responsibility": "Default and Skia feature tests plus package listing",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["rust-skia", "skia-binary", "workspace-tests"],
|
||||||
|
"rationale": "A dedicated dependency-free job tests the Rust-only codec graph, while the required gate proves the exact ARM64 GNU archive is installed and forbids source compilation."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"workflow": "supply-chain.yml",
|
||||||
|
"responsibility": "Dependency graph, advisory, license, source, provenance, duplicate, and unused-dependency audits",
|
||||||
|
"destination": "required",
|
||||||
|
"checks": ["dependency-policy", "provenance-policy"],
|
||||||
|
"rationale": "Pinned prebuilt audit tools and cached advisory data keep policy enforcement in the routine gate."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
8
ci/concurrency-thresholds.json
Normal file
8
ci/concurrency-thresholds.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"minimum_cycles": 4,
|
||||||
|
"maximum_cycles": 256,
|
||||||
|
"operations_per_cycle": 32,
|
||||||
|
"maximum_retained_bytes": 16777216,
|
||||||
|
"maximum_duration_seconds": 180
|
||||||
|
}
|
||||||
71
ci/dependency-policy.json
Normal file
71
ci/dependency-policy.json
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"current": "stable",
|
||||||
|
"reviewed_on": "2026-08-13",
|
||||||
|
"review_by": "2026-11-11",
|
||||||
|
"direct": [
|
||||||
|
{ "name": "base64", "versions": ["0.22.1"], "purpose": "LLSD, login, asset, and protocol base64 encoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`base64`" },
|
||||||
|
{ "name": "bcdec_rs", "versions": ["0.2.0"], "purpose": "Pure Rust BC6H and BC7 texture block decoding", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`bcdec_rs`" },
|
||||||
|
{ "name": "clap", "versions": ["4.6.6"], "purpose": "Typed command-line parsing for shipped diagnostic programs", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`clap`" },
|
||||||
|
{ "name": "cpal", "versions": ["0.18.1"], "purpose": "Opt-in cross-platform physical audio device access", "maintenance": "monitored-native", "transitive_cost": "high", "native": true, "rewrite_anchor": "`cpal`" },
|
||||||
|
{ "name": "flate2", "versions": ["1.1.9"], "purpose": "Bounded gzip and deflate asset/archive and release-package decoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`flate2`" },
|
||||||
|
{ "name": "futures-channel", "versions": ["0.3.33"], "purpose": "One-shot compatibility callbacks without another runtime", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`futures-channel`" },
|
||||||
|
{ "name": "futures-util", "versions": ["0.3.33"], "purpose": "Stream adaptation for HTTP capability bodies", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`futures-util`" },
|
||||||
|
{ "name": "getrandom", "versions": ["0.4.3"], "purpose": "Operating-system entropy for protocol identifiers", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`getrandom`" },
|
||||||
|
{ "name": "goblin", "versions": ["0.10.5"], "purpose": "Cross-platform ELF, PE, and Mach-O release artifact inspection", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`goblin`" },
|
||||||
|
{ "name": "hound", "versions": ["3.5.1"], "purpose": "Bounded PCM WAV parsing for WebRTC playback", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`hound`" },
|
||||||
|
{ "name": "image-webp", "versions": ["0.2.4"], "purpose": "Default pure-Rust bounded WebP image decoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`image-webp`" },
|
||||||
|
{ "name": "j2k", "versions": ["0.8.1"], "purpose": "Default pure-Rust bounded JPEG 2000 and JP2 encoding and decoding", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`j2k`" },
|
||||||
|
{ "name": "mac_address2", "versions": ["2.0.2"], "purpose": "Cross-platform machine identity compatibility input", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`mac_address2`" },
|
||||||
|
{ "name": "md-5", "versions": ["0.10.6"], "purpose": "Legacy protocol checksum compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`md-5`" },
|
||||||
|
{ "name": "os_info", "versions": ["3.15.0"], "purpose": "Cross-platform login platform reporting", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`os_info`" },
|
||||||
|
{ "name": "pkg-config", "versions": ["0.3.33"], "purpose": "Unix and macOS native library discovery in reviewed adapters", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`pkg-config`" },
|
||||||
|
{ "name": "prettyplease", "versions": ["0.2.37"], "purpose": "Deterministic formatting of generated Rust sources", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`prettyplease`" },
|
||||||
|
{ "name": "regex", "versions": ["1.13.1"], "purpose": "LSL tokenization and bounded program input parsing", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`regex`" },
|
||||||
|
{ "name": "reqwest", "versions": ["0.13.4"], "purpose": "Rustls-backed login and capability HTTP transport", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`reqwest`" },
|
||||||
|
{ "name": "roxmltree", "versions": ["0.21.1"], "purpose": "Read-only bounded LLSD and protocol XML parsing", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`roxmltree`" },
|
||||||
|
{ "name": "serde", "versions": ["1.0.229"], "purpose": "Typed JSON wire models and checked evidence manifests", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`serde`" },
|
||||||
|
{ "name": "serde_json", "versions": ["1.0.151"], "purpose": "JSON protocol, fixture, and audit evidence handling", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`serde_json`" },
|
||||||
|
{ "name": "sha1", "versions": ["0.10.7"], "purpose": "Legacy protocol hash compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha1`" },
|
||||||
|
{ "name": "sha2", "versions": ["0.11.0"], "purpose": "Manifest integrity and protocol hashing", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha2`" },
|
||||||
|
{ "name": "skia-safe", "versions": ["0.99.0"], "purpose": "Opt-in cross-platform Skia image decoding", "maintenance": "monitored-native", "transitive_cost": "high", "native": true, "rewrite_anchor": "`skia-safe`" },
|
||||||
|
{ "name": "skia-rs-codec", "versions": ["0.3.0"], "purpose": "Default pure-Rust BMP, GIF, ICO, JPEG, PNG, and WBMP image decoding", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`skia-rs-codec`" },
|
||||||
|
{ "name": "stats_alloc", "versions": ["0.1.10"], "purpose": "Allocation-budget compatibility tests, concurrency leak audits, and reproducible performance evidence", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`stats_alloc`" },
|
||||||
|
{ "name": "str0m", "versions": ["0.22.0"], "purpose": "Native Rust ICE, DTLS, SRTP, RTP, and SCTP WebRTC transport", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`str0m`" },
|
||||||
|
{ "name": "syn", "versions": ["2.0.119"], "purpose": "Syntax validation for generated Rust sources", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`syn`" },
|
||||||
|
{ "name": "tar", "versions": ["0.4.46"], "purpose": "Bounded OAR, asset, and release-package archive traversal", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`tar`" },
|
||||||
|
{ "name": "tokio", "versions": ["1.53.1"], "purpose": "Shared asynchronous networking, timers, channels, and tasks", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`tokio`" },
|
||||||
|
{ "name": "unicode-general-category", "versions": ["1.1.0"], "purpose": "Unicode category matching in the LSL lexer", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`unicode-general-category`" },
|
||||||
|
{ "name": "url", "versions": ["2.5.8"], "purpose": "Exact validation and credential-safe diagnostic redaction for grid-agent HTTP endpoints", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`url`" },
|
||||||
|
{ "name": "uuid", "versions": ["1.24.0"], "purpose": "Random UUID generation behind protocol-compatible wrappers", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`uuid`" },
|
||||||
|
{ "name": "vcpkg", "versions": ["0.2.15"], "purpose": "Windows MSVC native library discovery in reviewed adapters", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`vcpkg`" },
|
||||||
|
{ "name": "vorbis_rs", "versions": ["0.5.6"], "purpose": "Opt-in Ogg Vorbis asset encoding", "maintenance": "monitored-native", "transitive_cost": "medium", "native": true, "rewrite_anchor": "`vorbis_rs`" }
|
||||||
|
],
|
||||||
|
"approved_duplicates": [
|
||||||
|
{ "name": "bit-vec", "versions": ["0.8.0", "0.9.1"], "reason": "The pinned skia-rs shader parser and current WebRTC certificate stack require adjacent bit-vector API lines." },
|
||||||
|
{ "name": "bitflags", "versions": ["1.3.2", "2.13.1"], "reason": "The pinned pure-Rust PNG codec remains on bitflags 1 while the rest of the workspace uses bitflags 2." },
|
||||||
|
{ "name": "block-buffer", "versions": ["0.10.4", "0.12.1"], "reason": "RustCrypto digest 0.10 and 0.11 consumers have not unified their block-buffer major version." },
|
||||||
|
{ "name": "cfg_aliases", "versions": ["0.1.1", "0.2.2"], "reason": "The target-specific native stacks use different nix-generation build helpers." },
|
||||||
|
{ "name": "chacha20", "versions": ["0.9.1", "0.10.1"], "reason": "The WebRTC crypto and current random-number stacks require different RustCrypto generations." },
|
||||||
|
{ "name": "const-oid", "versions": ["0.9.6", "0.10.2"], "reason": "DTLS certificate dependencies and the newer SHA-2 stack use different const-oid generations." },
|
||||||
|
{ "name": "cpufeatures", "versions": ["0.2.17", "0.3.0"], "reason": "RustCrypto digest 0.10 and 0.11 families have not unified their CPU feature helper." },
|
||||||
|
{ "name": "crypto-common", "versions": ["0.1.7", "0.2.2"], "reason": "Legacy protocol hashes and current SHA-2 intentionally span RustCrypto digest generations." },
|
||||||
|
{ "name": "digest", "versions": ["0.10.7", "0.11.3"], "reason": "MD5, SHA-1, and WebRTC use digest 0.10 while manifest SHA-2 uses the audited 0.11 API." },
|
||||||
|
{ "name": "getrandom", "versions": ["0.2.17", "0.3.4", "0.4.3"], "reason": "WebRTC crypto, transitive rand, and direct UUID entropy consumers span three compatible APIs." },
|
||||||
|
{ "name": "hashbrown", "versions": ["0.16.1", "0.17.1"], "reason": "The pinned skia-rs geometry and shader dependencies have not unified their hash table minor line." },
|
||||||
|
{ "name": "jni-sys", "versions": ["0.3.1", "0.4.1"], "reason": "CPAL Android NDK support and rustls Android certificate verification require different JNI bindings." },
|
||||||
|
{ "name": "nix", "versions": ["0.28.0", "0.31.3"], "reason": "Machine-address and operating-system reporting crates have not unified their Unix API generation." },
|
||||||
|
{ "name": "nom", "versions": ["7.1.3", "8.0.0"], "reason": "Skia bindgen tooling remains on nom 7 while the native WebRTC stack uses nom 8." },
|
||||||
|
{ "name": "r-efi", "versions": ["5.3.0", "6.0.0"], "reason": "The three resolved getrandom generations require two WASI EFI interface generations." },
|
||||||
|
{ "name": "rand", "versions": ["0.9.5", "0.10.2"], "reason": "WebRTC protocol crates use rand 0.9 while the pinned skia-rs geometry graph uses rand 0.10." },
|
||||||
|
{ "name": "rand_core", "versions": ["0.6.4", "0.9.5", "0.10.1"], "reason": "DTLS elliptic curves and the two resolved rand generations require distinct rand_core APIs." },
|
||||||
|
{ "name": "rustc-hash", "versions": ["1.1.0", "2.1.3"], "reason": "The pinned skia-rs shader parser remains on rustc-hash 1 while existing workspace parsers use version 2." },
|
||||||
|
{ "name": "sha2", "versions": ["0.10.9", "0.11.0"], "reason": "WebRTC crypto still requires SHA-2 0.10 while MetaCrate integrity code directly uses 0.11." },
|
||||||
|
{ "name": "shlex", "versions": ["1.3.0", "2.0.1"], "reason": "Skia bindgen and current native C compilation helpers use different shell-token parsers." },
|
||||||
|
{ "name": "syn", "versions": ["2.0.119", "3.0.3"], "reason": "MetaCrate code generation uses syn 2 while current derive macro dependencies use syn 3." },
|
||||||
|
{ "name": "thiserror", "versions": ["1.0.69", "2.0.20"], "reason": "Machine-address compatibility remains on thiserror 1 while WebRTC and Vorbis use version 2." },
|
||||||
|
{ "name": "thiserror-impl", "versions": ["1.0.69", "2.0.20"], "reason": "The approved thiserror runtime duplication necessarily carries matching derive versions." },
|
||||||
|
{ "name": "untrusted", "versions": ["0.7.1", "0.9.0"], "reason": "Target-specific certificate backends and rustls webpki require different untrusted APIs." },
|
||||||
|
{ "name": "windows-sys", "versions": ["0.52.0", "0.61.2"], "reason": "Machine-address compatibility uses 0.52 while current Tokio, CLI, and archive stacks use 0.61." }
|
||||||
|
]
|
||||||
|
}
|
||||||
16
ci/evidence/api-audit.json
Normal file
16
ci/evidence/api-audit.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"release": "0.0.1",
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"baseline_sha256": "112e6a0b2df280fb72bf2e27cc878da3e3de25723ade69e6eccfdc46053876d8",
|
||||||
|
"mapped_public_types": 3066,
|
||||||
|
"mapped_members": 30789,
|
||||||
|
"intentional_differences": 80,
|
||||||
|
"unexplained_mappings": 0,
|
||||||
|
"accidental_public_dependency_types": 0,
|
||||||
|
"thread_safe_dyn_traits": 6,
|
||||||
|
"non_exhaustive_error_enums": 7,
|
||||||
|
"downstream_compile_fixture": "tests/api-compile",
|
||||||
|
"representative_port": "tests/semver-port",
|
||||||
|
"status": "ok"
|
||||||
|
}
|
||||||
437
ci/evidence/artifact-audit.json
Normal file
437
ci/evidence/artifact-audit.json
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"source_commit": "738fe3933eeb64d9081a53c71753e8d1e43c4d00",
|
||||||
|
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)",
|
||||||
|
"operating_system": "linux",
|
||||||
|
"architecture": "x86_64",
|
||||||
|
"cargo_graph_packages": 378,
|
||||||
|
"release_packages": [
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-types",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-types-0.0.1.crate",
|
||||||
|
"sha256": "18d44c43c3799938da5affd119519f20a9f380e626f6682d8ce42ccfdba2de8f",
|
||||||
|
"files": 19,
|
||||||
|
"unpacked_bytes": 648009
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-structured-data",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-structured-data-0.0.1.crate",
|
||||||
|
"sha256": "b482a76b2b785085da673df29a8dd7efe4d278cd69a8d7e5d822dfc407057f2a",
|
||||||
|
"files": 14,
|
||||||
|
"unpacked_bytes": 339585
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-imaging",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-imaging-0.0.1.crate",
|
||||||
|
"sha256": "bd797ee3dacf4475b078cc6e881b4db5419f01fe7267453bb140054051fd08a2",
|
||||||
|
"files": 10,
|
||||||
|
"unpacked_bytes": 87617
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-imaging-skia",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-imaging-skia-0.0.1.crate",
|
||||||
|
"sha256": "a408014f1051ab534d388ab268acf700e73317796eab8aceecb7271203ad6b43",
|
||||||
|
"files": 9,
|
||||||
|
"unpacked_bytes": 57306
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-openjpeg",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-openjpeg-0.0.1.crate",
|
||||||
|
"sha256": "72cee822e670b8db4d43c0ba03779e294b8b5c76aadfc50aa3c03d0295a3f18c",
|
||||||
|
"files": 8,
|
||||||
|
"unpacked_bytes": 39281
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-opus",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-opus-0.0.1.crate",
|
||||||
|
"sha256": "a3d6a8a5796198d2773c7e5c48c186f98387eaf994f6d492af6dd29d8e4d486c",
|
||||||
|
"files": 6,
|
||||||
|
"unpacked_bytes": 12860
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-prim-mesher",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-prim-mesher-0.0.1.crate",
|
||||||
|
"sha256": "436d85822576f512ba1223f0760786fc3050d02cb955d2191208caaa46706764",
|
||||||
|
"files": 12,
|
||||||
|
"unpacked_bytes": 208514
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "metacrate-lsl-tools",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "metacrate-lsl-tools-0.0.1.crate",
|
||||||
|
"sha256": "3f8a9697939c837c1fe8abbcea72fc4449195aa56d409d01769ab9325009f0ee",
|
||||||
|
"files": 14,
|
||||||
|
"unpacked_bytes": 648214
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-0.0.1.crate",
|
||||||
|
"sha256": "f06add7851122cfaece3589485ee027daf7f59e5ad7043207272a7e1085a8302",
|
||||||
|
"files": 90,
|
||||||
|
"unpacked_bytes": 28920093
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rendering-simple",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-rendering-simple-0.0.1.crate",
|
||||||
|
"sha256": "92bfb18f10275bb9daafd7f7372a7c7a2df03f150e6b5fa0444881db7ed76379",
|
||||||
|
"files": 9,
|
||||||
|
"unpacked_bytes": 92992
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rendering-mesh-foundry",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-rendering-mesh-foundry-0.0.1.crate",
|
||||||
|
"sha256": "6b17528c8c67270c0d84a3bad2c4fb580f123b6db38f296dabcdd97aa798fc16",
|
||||||
|
"files": 10,
|
||||||
|
"unpacked_bytes": 145049
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-rlv",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-rlv-0.0.1.crate",
|
||||||
|
"sha256": "c32d9b5eea214abe415f1463a20b985a426fa01fcdaf49a6511d5be3b110eef8",
|
||||||
|
"files": 12,
|
||||||
|
"unpacked_bytes": 487158
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-utilities",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-utilities-0.0.1.crate",
|
||||||
|
"sha256": "2f339ac2503cf76e352c97f5fb85be62965db4510766c931e17b686bed7f19f6",
|
||||||
|
"files": 6,
|
||||||
|
"unpacked_bytes": 67245
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-voice-vivox",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-voice-vivox-0.0.1.crate",
|
||||||
|
"sha256": "914ccd0f2c5007828593b3edc7ee76289d37b50b422fd83254604f443b4fe651",
|
||||||
|
"files": 7,
|
||||||
|
"unpacked_bytes": 431677
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-voice-webrtc",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-voice-webrtc-0.0.1.crate",
|
||||||
|
"sha256": "e525c71c95d6e4ff4b98174ca13e5e175e9eb9e8a8cc9df693137c1d2165466c",
|
||||||
|
"files": 7,
|
||||||
|
"unpacked_bytes": 317685
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "libremetaverse-programs",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"archive": "libremetaverse-programs-0.0.1.crate",
|
||||||
|
"sha256": "f3c4173c601f0e74f160055de9fb751d375525e00a2d9b398e91e96eacb74247",
|
||||||
|
"files": 47,
|
||||||
|
"unpacked_bytes": 1032987
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"binaries": [
|
||||||
|
{
|
||||||
|
"name": "inventory-explorer",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22508072,
|
||||||
|
"sha256": "bcbd78deb7b740db6b7fb396581a4316e47d7d81cc9ed9f9ccc13acbc156f82b",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 189,
|
||||||
|
"services": [
|
||||||
|
"OpenSim login, capabilities, AIS, UDP when explicitly given credentials"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "irc-gateway",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22257728,
|
||||||
|
"sha256": "56c6bbf4529567871ec2f3b04354d565b77b7630a06ce66f52b0955e5dd41a9e",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 189,
|
||||||
|
"services": [
|
||||||
|
"OpenSim and IRC TCP when explicitly given credentials and an IRC endpoint"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "live-grid-smoke",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 23545976,
|
||||||
|
"sha256": "6d0016b083b80c1d0a557d459ad278e5ef1e7d7d685185113f9115ed6db1db2d",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 194,
|
||||||
|
"services": [
|
||||||
|
"none in audit/fake mode; explicit OpenSim endpoint in live mode"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--audit-only"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--fake",
|
||||||
|
"--evidence",
|
||||||
|
"{output}"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "osd-inspector",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 7132752,
|
||||||
|
"sha256": "314836cbcda99bec0dca737d3764c84350d61453ecf42c4cddab48924b6092f2",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 94,
|
||||||
|
"services": [
|
||||||
|
"none; offline files and standard streams only"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"prim-to-osd"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "packet-dump",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22066600,
|
||||||
|
"sha256": "83dfc4ce10d86ed7b101adaee496c0850c8cfa7b37737056d66c4171a67732c3",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 189,
|
||||||
|
"services": [
|
||||||
|
"OpenSim login and UDP when explicitly given credentials"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "prim-inspector",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22421512,
|
||||||
|
"sha256": "2ae167c2c66631411889c55ce3c16e80ffdf9a112591470905d1f27eec9ca597",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 188,
|
||||||
|
"services": [
|
||||||
|
"OpenSim login, capabilities, and UDP when explicitly given credentials"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "simple-bot",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22110160,
|
||||||
|
"sha256": "dc9166108675090ed1bfd18bf0605bd0cb6eb36966d2797f59784aaada66b66c",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 189,
|
||||||
|
"services": [
|
||||||
|
"OpenSim login, capabilities, and UDP when explicitly given credentials"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "test-client",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 37352456,
|
||||||
|
"sha256": "3bb221c175ec5b0c16095b2cb533b68e24bf27ad53fcafb7e54477c60183ac3b",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libopenjp2.so.7",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 299,
|
||||||
|
"services": [
|
||||||
|
"OpenSim services selected by explicit login and commands"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vivox-test",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 22038904,
|
||||||
|
"sha256": "b3f91293f91c387360aa6becdb066dfef84b14b1a430d02c112a6799970696b0",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 191,
|
||||||
|
"services": [
|
||||||
|
"none in help mode; explicit external Vivox control service in live mode"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "webrtc-test",
|
||||||
|
"format": "ELF",
|
||||||
|
"bytes": 28176504,
|
||||||
|
"sha256": "f0db73115ad2c4cad7e187ae29ececde6f885fd9501398bd461fe2da755e594f",
|
||||||
|
"linked_libraries": [
|
||||||
|
"ld-linux-x86-64.so.2",
|
||||||
|
"libc.so.6",
|
||||||
|
"libgcc_s.so.1",
|
||||||
|
"libm.so.6",
|
||||||
|
"libopus.so.0",
|
||||||
|
"libstdc++.so.6"
|
||||||
|
],
|
||||||
|
"imported_symbols": 201,
|
||||||
|
"services": [
|
||||||
|
"IPv4 loopback in fake mode; explicit OpenSim voice capabilities in live mode"
|
||||||
|
],
|
||||||
|
"smokes": [
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--help"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arguments": [
|
||||||
|
"--fake",
|
||||||
|
"--timeout-seconds",
|
||||||
|
"10"
|
||||||
|
],
|
||||||
|
"exit_code": 0,
|
||||||
|
"output_created": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"clean_package_build": true,
|
||||||
|
"reference_checkout_required": false,
|
||||||
|
"helper_processes_invoked": [],
|
||||||
|
"forbidden_findings": 0
|
||||||
|
}
|
||||||
64
ci/evidence/concurrency-audit.json
Normal file
64
ci/evidence/concurrency-audit.json
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"mode": "deterministic-offline",
|
||||||
|
"live_grid_used": false,
|
||||||
|
"cycles": 16,
|
||||||
|
"operations_per_cycle": 32,
|
||||||
|
"scenarios": [
|
||||||
|
"concurrent-client-shutdown",
|
||||||
|
"download-deduplication-and-cancellation",
|
||||||
|
"inventory-and-appearance-operations",
|
||||||
|
"event-subscription-release",
|
||||||
|
"file-handle-teardown",
|
||||||
|
"udp-reconnect-and-socket-release",
|
||||||
|
"webrtc-loopback-task-and-socket-teardown"
|
||||||
|
],
|
||||||
|
"baseline": {
|
||||||
|
"client_tasks": 0,
|
||||||
|
"download_dispatchers": 0,
|
||||||
|
"active_downloads": 0,
|
||||||
|
"inventory_workers": 0,
|
||||||
|
"pending_inventory_operations": 0,
|
||||||
|
"voice_tasks": 0,
|
||||||
|
"signaling_tasks": 0,
|
||||||
|
"subscriptions": 0,
|
||||||
|
"open_files": 0,
|
||||||
|
"open_sockets": 0
|
||||||
|
},
|
||||||
|
"maximum_observed": {
|
||||||
|
"client_tasks": 1,
|
||||||
|
"download_dispatchers": 1,
|
||||||
|
"active_downloads": 258,
|
||||||
|
"inventory_workers": 1,
|
||||||
|
"pending_inventory_operations": 0,
|
||||||
|
"voice_tasks": 1,
|
||||||
|
"signaling_tasks": 1,
|
||||||
|
"subscriptions": 96,
|
||||||
|
"open_files": 1,
|
||||||
|
"open_sockets": 2
|
||||||
|
},
|
||||||
|
"after_shutdown": {
|
||||||
|
"client_tasks": 0,
|
||||||
|
"download_dispatchers": 0,
|
||||||
|
"active_downloads": 0,
|
||||||
|
"inventory_workers": 0,
|
||||||
|
"pending_inventory_operations": 0,
|
||||||
|
"voice_tasks": 0,
|
||||||
|
"signaling_tasks": 0,
|
||||||
|
"subscriptions": 0,
|
||||||
|
"open_files": 0,
|
||||||
|
"open_sockets": 0
|
||||||
|
},
|
||||||
|
"retained_bytes": 0,
|
||||||
|
"allocations_not_freed": 0,
|
||||||
|
"elapsed_milliseconds": 1099,
|
||||||
|
"thresholds": {
|
||||||
|
"schema": 1,
|
||||||
|
"minimum_cycles": 4,
|
||||||
|
"maximum_cycles": 256,
|
||||||
|
"operations_per_cycle": 32,
|
||||||
|
"maximum_retained_bytes": 16777216,
|
||||||
|
"maximum_duration_seconds": 180
|
||||||
|
},
|
||||||
|
"outcome": "pass"
|
||||||
|
}
|
||||||
14
ci/evidence/documentation-audit.json
Normal file
14
ci/evidence/documentation-audit.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"public_crates": 15,
|
||||||
|
"mapped_public_types": 3066,
|
||||||
|
"documented_public_types": 3066,
|
||||||
|
"mapped_members": 30789,
|
||||||
|
"documented_members": 30789,
|
||||||
|
"tested_rust_snippets": 5,
|
||||||
|
"linked_programs": 9,
|
||||||
|
"checked_local_links": 84,
|
||||||
|
"required_guide_sections": 11,
|
||||||
|
"status": "ok"
|
||||||
|
}
|
||||||
9
ci/evidence/fake-grid-smoke.jsonl
Normal file
9
ci/evidence/fake-grid-smoke.jsonl
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{"schema":1,"mode":"fake","sequence":1,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"completeness","status":"ok","metrics":{"pending_commands":0,"pending_programs":0,"programs":9,"source_files":138,"test_client_commands":121}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":2,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"login","status":"ok","metrics":{"authenticated":1,"client_version_recorded":1,"rust_commit_recorded":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":3,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"capabilities-simulator","status":"ok","metrics":{"cached_primitives":2,"event_queue_running":1,"known_capabilities":5}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":4,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"im-chat","status":"ok","metrics":{"local_chat_echo":1,"self_im_echo":1,"self_im_transmitted":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":5,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"movement-teleport","status":"ok","metrics":{"movement_stopped":1,"teleport_returned":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":6,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"inventory-folder","status":"ok","metrics":{"folder_created":1,"moved_to_trash":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":7,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"object-properties","status":"ok","metrics":{"object_observed":1,"properties_received":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":8,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"asset-texture","status":"ok","metrics":{"texture_bytes":4096,"texture_downloaded":1}}
|
||||||
|
{"schema":1,"mode":"fake","sequence":9,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"logout","status":"ok","metrics":{"active_tasks":0,"clean_logout":1}}
|
||||||
9
ci/evidence/live-grid-smoke.jsonl
Normal file
9
ci/evidence/live-grid-smoke.jsonl
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{"schema":1,"mode":"open-sim-live","sequence":1,"recorded_unix_seconds":1786514027,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"completeness","status":"ok","metrics":{"pending_commands":0,"pending_programs":0,"programs":9,"source_files":138,"test_client_commands":121}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":2,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"login","status":"ok","metrics":{"authenticated":1,"disk_asset_cache_enabled":0,"opensim_login_options":6,"packet_consumers_ready":4}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":3,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"capabilities-simulator","status":"ok","metrics":{"cached_primitives":142,"compressed_object_update_packets":201,"event_queue_running":1,"full_object_update_packets":350,"known_capabilities":7,"movement_complete_packets":1,"scene_bootstrap_requested":1,"seed_capability_present":1,"simulator_identity_present":1,"terse_object_update_packets":1552}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":4,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"im-chat","status":"ok","metrics":{"local_chat_echo":1,"self_im_echo":0,"self_im_transmitted":1}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":5,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"movement-teleport","status":"ok","metrics":{"movement_stopped":1,"teleport_returned":1}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":6,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"inventory-folder","status":"ok","metrics":{"folder_created":1,"moved_to_trash":1}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":7,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"object-properties","status":"ok","metrics":{"object_observed":1,"properties_received":1}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":8,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"asset-texture","status":"ok","metrics":{"texture_bytes":858843,"texture_downloaded":1}}
|
||||||
|
{"schema":1,"mode":"open-sim-live","sequence":9,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"logout","status":"ok","metrics":{"active_tasks":0,"clean_logout":1,"client_disposed":1,"network_disconnected":1}}
|
||||||
19
ci/evidence/provenance-audit.json
Normal file
19
ci/evidence/provenance-audit.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"recorded_unix_seconds": 1786616382,
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"material_count": 27,
|
||||||
|
"generated_output_count": 8,
|
||||||
|
"provenance_ledger_count": 3,
|
||||||
|
"source_file_count": 553,
|
||||||
|
"dependency_count": 459,
|
||||||
|
"dependency_notice_count": 337,
|
||||||
|
"native_component_count": 6,
|
||||||
|
"dependency_manifest_sha256": "5f80b45ab18a45365673b55b52d68318bc31f602ce2f6559f573027cc446c58e",
|
||||||
|
"third_party_notices_sha256": "c4d381944a9b57277963d2a5ee4e23a9a064c2ba93a676a49e023931b53a71d6",
|
||||||
|
"native_notices_sha256": "b417ee7bf6b748cc86839e5354753c0f8c1f8309d13c0fea379c77f602e69fc0",
|
||||||
|
"distribution_manifest_sha256": "3b5b9b4a765d181d5777c96e9e90e62d960da8bc3d51f0f03cebba548ad4df55",
|
||||||
|
"unknown_materials": 0,
|
||||||
|
"unknown_bundled_assets": 0,
|
||||||
|
"status": "ok"
|
||||||
|
}
|
||||||
79
ci/provenance-policy.json
Normal file
79
ci/provenance-policy.json
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"upstream_repository": "https://github.com/cinderblocks/libremetaverse",
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"project_license": "BSD-3-Clause",
|
||||||
|
"project_license_path": "LICENSE.md",
|
||||||
|
"project_license_sha256": "6e11f13f099d7fbbd94c8f08f90e77ca8b7fff25f75cb071b1427bede725667f",
|
||||||
|
"upstream_license_path": "licenses/LibreMetaverse-BSD-3-Clause.txt",
|
||||||
|
"upstream_license_sha256": "2e40a7bac96023b6299c9062195d927d8e53ca271931412fcdd0e1928e0a3b4e",
|
||||||
|
"cc_by_sa_legal_code_sha256": "075dad5e5fc96c27014fabc269f4f5732909cffd178a486f546d982b6cf86b74",
|
||||||
|
"required_source_notices": [
|
||||||
|
"LICENSE.md",
|
||||||
|
"NOTICE.md",
|
||||||
|
"licenses/LibreMetaverse-BSD-3-Clause.txt",
|
||||||
|
"licenses/CC-BY-SA-3.0-NOTICE.md",
|
||||||
|
"release/THIRD-PARTY-NOTICES.md",
|
||||||
|
"release/NATIVE-LICENSES.md"
|
||||||
|
],
|
||||||
|
"required_binary_notices": [
|
||||||
|
"LICENSE.md",
|
||||||
|
"NOTICE.md",
|
||||||
|
"licenses/LibreMetaverse-BSD-3-Clause.txt",
|
||||||
|
"licenses/CC-BY-SA-3.0-NOTICE.md",
|
||||||
|
"release/THIRD-PARTY-NOTICES.md",
|
||||||
|
"release/NATIVE-LICENSES.md"
|
||||||
|
],
|
||||||
|
"materials": [
|
||||||
|
{"path":"codegen/inputs/attentions.xml","sha256":"bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af","kind":"linden-data","origin":"LibreMetaverse/linden/character/attentions.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/attentionsN.xml","sha256":"80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b","kind":"linden-data","origin":"LibreMetaverse/linden/character/attentionsN.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","kind":"linden-data","origin":"LibreMetaverse/linden/character/avatar_lad.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"crates/libremetaverse/assets/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","kind":"linden-data-package-mirror","origin":"codegen/inputs/avatar_lad.xml","license":"CC-BY-SA-3.0","distribution":"source-package-runtime-data"},
|
||||||
|
{"path":"codegen/inputs/avatar_skeleton.xml","sha256":"addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a","kind":"linden-data","origin":"LibreMetaverse/linden/character/avatar_skeleton.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/genepool.xml","sha256":"6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d","kind":"linden-data","origin":"LibreMetaverse/linden/character/genepool.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/grass.xml","sha256":"90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e","kind":"linden-data","origin":"LibreMetaverse/linden/grass.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/trees.xml","sha256":"f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba","kind":"linden-data","origin":"LibreMetaverse/linden/trees.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
|
||||||
|
{"path":"codegen/inputs/message_template.msg","sha256":"15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d","kind":"protocol-template","origin":"data/message_template.msg","license":"BSD-3-Clause","distribution":"source-and-generated-code"},
|
||||||
|
{"path":"codegen/inputs/lsl_tools_grammar.json","sha256":"2496b7acc247c5aa927017ff2f2580f704ced17a85977d3bf926d31f17b04234","kind":"derived-grammar","origin":"LibreMetaverse.LslTools/YYClass/yycs0syntax.cs and yycs0tokens.cs","license":"BSD-3-Clause","distribution":"source-and-generated-code"},
|
||||||
|
{"path":"tests/fixtures/structured_data/json_reference.json","sha256":"97b18e725932a3192a21d6c12e6ab29236957b90f749e738b7dbbea44498afbc","kind":"project-fixture","origin":"MetaCrate JSON OSD compatibility fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"tests/fixtures/structured_data/protobuf_reference.hex","sha256":"6c87c73097eb68a8e20bba6c146da8ef2ad3c71452407da497cb7296a02f8b7d","kind":"project-fixture","origin":"MetaCrate Protobuf OSD compatibility fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/agent_pause.packet","sha256":"ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible AgentPause packet fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/image.tga","sha256":"8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible TGA image fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/manifest.json","sha256":"1b8730a08b7740b91de7d6e46595e04ee5f09613ef478313203959e7a29b3145","kind":"project-benchmark-manifest","origin":"MetaCrate reproducible benchmark fixture hashes","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/mesh_asset.bin","sha256":"4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible mesh asset fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/notecard.txt","sha256":"b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible notecard asset fixture","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"benchmarks/fixtures/workloads.json","sha256":"9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d","kind":"project-benchmark-config","origin":"MetaCrate reproducible workload dimensions","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/binary_llsd/malformed.hex","sha256":"7e0f49303f07a638a8d2fba637ac7fab1e63386c9b4e6b46730425e87d15fcbe","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/json_osd/malformed.txt","sha256":"a1b326b59db9d59a1f4ba9f6e58aa58e77bc7e160600844e76f7b0f09b44b39a","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/notation_llsd/malformed.txt","sha256":"e87c4ad58f40cc0703b771a522bf5edd7c1768bb26336169502553866f070bd1","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/protobuf_osd/malformed.hex","sha256":"3818697ae2f8cc186f2fd97863eb6e735134d0733a6059bc8a631871caf0678d","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/xml_llsd/doctype_entity.xml","sha256":"9b13c638b7c4b55f109eeb8e3c81d173a7548f567217390aaa6278ee0905f143","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/xml_llsd/external_entity.xml","sha256":"eccd9915554fd422b33a75a403796647f6f1fb7c0f80ac5c7c1a4f05b433d653","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/xml_llsd/malformed_nesting.xml","sha256":"cc8dbfc2725f03d650f4287496d729c1c8c1a58359df008f24200c2f3ff88dbe","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/xml_llsd/truncated_scalar.xml","sha256":"225cde0a5c754c3d1200a421ea693fa1464cdaadce72683e4b26f14274cb17ac","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
|
||||||
|
{"path":"fuzz/corpus/xml_llsd/unknown_entity.xml","sha256":"a181fd87d31c47c2b3dc458aa79ffd435abb952fcf9e0ec2f781c9cff0a5202f","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"}
|
||||||
|
],
|
||||||
|
"generated_outputs": [
|
||||||
|
{"path":"codegen/generated/source_manifest.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/libremetaverse/src/attention_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/libremetaverse/src/foliage_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/libremetaverse/src/genepool_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/libremetaverse/src/packet_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause"},
|
||||||
|
{"path":"crates/libremetaverse/src/skeleton_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/libremetaverse/src/visual_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
|
||||||
|
{"path":"crates/metacrate-lsl-tools/src/generated_tables.rs","generator":"tools/generate_lsl_tables.py","license":"BSD-3-Clause"}
|
||||||
|
],
|
||||||
|
"provenance_ledgers": [
|
||||||
|
{"path":"api/public-api.json","kind":"compiled-public-api","license":"BSD-3-Clause"},
|
||||||
|
{"path":"programs/upstream-programs.json","kind":"upstream-program-source-inventory","license":"BSD-3-Clause"},
|
||||||
|
{"path":"tests/upstream-tests.json","kind":"upstream-test-and-fixture-inventory","license":"BSD-3-Clause"}
|
||||||
|
],
|
||||||
|
"native_components": [
|
||||||
|
{"id":"openjpeg","version":"2.5.4 or newer","license":"BSD-2-Clause","source":"https://github.com/uclouvain/openjpeg","linkage":"optional-system-dynamic","bundled":false,"obligation":"Distributors that supply libopenjp2 must reproduce its copyright and BSD-2-Clause notice."},
|
||||||
|
{"id":"libopus","version":"1.3 or newer","license":"BSD-3-Clause AND BSD-2-Clause","source":"https://gitlab.xiph.org/xiph/opus","linkage":"required-system-dynamic","bundled":false,"obligation":"Distributors that supply libopus must reproduce the Opus copyright and BSD notices."},
|
||||||
|
{"id":"skia","version":"via skia-bindings 0.99.0","license":"BSD-3-Clause","source":"https://skia.org/","linkage":"optional-static-or-shared","bundled":true,"obligation":"Binary distributions built with the skia feature must include the Skia BSD notice from the skia-bindings package."},
|
||||||
|
{"id":"vorbis-aotuv-lancer","version":"aotuv_lancer_vorbis_sys 0.1.6","license":"BSD-3-Clause","source":"https://crates.io/crates/aotuv_lancer_vorbis_sys","linkage":"optional-bundled-static","bundled":true,"obligation":"Binary distributions built with the vorbis feature must include the package's bundled codec notices."},
|
||||||
|
{"id":"ogg-next","version":"via aotuv_lancer_vorbis_sys 0.1.6","license":"BSD-3-Clause","source":"https://crates.io/crates/ogg_next_sys","linkage":"optional-bundled-static","bundled":true,"obligation":"Binary distributions built with the vorbis feature must include the bundled libogg notice."},
|
||||||
|
{"id":"alsa-lib","version":"1.2.x","license":"LGPL-2.1-or-later","source":"https://www.alsa-project.org/","linkage":"optional-system-dynamic-linux","bundled":false,"obligation":"MetaCrate does not bundle ALSA; distributors that supply it must comply with LGPL-2.1-or-later."}
|
||||||
|
]
|
||||||
|
}
|
||||||
38
ci/release-candidate-policy.json
Normal file
38
ci/release-candidate-policy.json
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"release": "0.0.1",
|
||||||
|
"current_rust_prefix": "rustc 1.97.",
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"expected": {
|
||||||
|
"release_packages": 16,
|
||||||
|
"shipped_binaries": 10,
|
||||||
|
"mapped_public_types": 3066,
|
||||||
|
"mapped_public_members": 30789,
|
||||||
|
"parity_cases": 1289,
|
||||||
|
"translated_cases": 1266,
|
||||||
|
"live_cases": 19,
|
||||||
|
"benchmark_cases": 4,
|
||||||
|
"live_smoke_records": 9
|
||||||
|
},
|
||||||
|
"required_evidence": [
|
||||||
|
{"id":"api","path":"ci/evidence/api-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/mapped_public_types","equals":3066},{"pointer":"/mapped_members","equals":30789}]},
|
||||||
|
{"id":"artifact","path":"ci/evidence/artifact-audit.json","assertions":[{"pointer":"/clean_package_build","equals":true},{"pointer":"/reference_checkout_required","equals":false},{"pointer":"/forbidden_findings","equals":0}]},
|
||||||
|
{"id":"concurrency","path":"ci/evidence/concurrency-audit.json","assertions":[{"pointer":"/outcome","equals":"pass"},{"pointer":"/retained_bytes","equals":0},{"pointer":"/allocations_not_freed","equals":0}]},
|
||||||
|
{"id":"documentation","path":"ci/evidence/documentation-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/mapped_public_types","equals":3066},{"pointer":"/mapped_members","equals":30789}]},
|
||||||
|
{"id":"provenance","path":"ci/evidence/provenance-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/unknown_materials","equals":0},{"pointer":"/unknown_bundled_assets","equals":0}]}
|
||||||
|
],
|
||||||
|
"live_test_files": [
|
||||||
|
"tests/compat/tests/appearance_live_semantics.rs",
|
||||||
|
"tests/compat/tests/inventory_live_semantics.rs",
|
||||||
|
"tests/compat/tests/network_semantics.rs",
|
||||||
|
"tests/compat/tests/world_live_semantics.rs"
|
||||||
|
],
|
||||||
|
"fake_grid_evidence": "ci/evidence/fake-grid-smoke.jsonl",
|
||||||
|
"live_grid_evidence": "ci/evidence/live-grid-smoke.jsonl",
|
||||||
|
"release_notes": "docs/release-candidate.md",
|
||||||
|
"changelog": "CHANGELOG.md",
|
||||||
|
"checksums": "release/SHA256SUMS",
|
||||||
|
"signature_required": false,
|
||||||
|
"signature_policy": "No project signing identity is configured for 0.0.1; SHA-256 checksums and Gitea artifact retention are mandatory.",
|
||||||
|
"deferred_by_user": ["fuzz-smoke"]
|
||||||
|
}
|
||||||
186
ci/release-matrix.json
Normal file
186
ci/release-matrix.json
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"current": "stable",
|
||||||
|
"native_prerequisites": [
|
||||||
|
{
|
||||||
|
"id": "openjpeg-2.5.4",
|
||||||
|
"version": "2.5.4",
|
||||||
|
"purpose": "Opt-in raw J2K and JP2 codec"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "skia-safe-0.99.0",
|
||||||
|
"version": "0.99.0",
|
||||||
|
"purpose": "Opt-in Skia image formats using the target-specific binary cache or source build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "libopus-1.3",
|
||||||
|
"version": ">=1.3",
|
||||||
|
"purpose": "System Opus codec used through the reviewed safe WebRTC adapter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "alsa-1.2",
|
||||||
|
"version": "1.2.x",
|
||||||
|
"purpose": "Linux CPAL real-audio adapter"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vorbis-rs-0.5.6",
|
||||||
|
"version": "0.5.6",
|
||||||
|
"purpose": "Opt-in PCM to Ogg Vorbis encoder"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"manual_gates": [
|
||||||
|
"Live grid credentials and reversible dedicated-account validation remain in the explicit live-grid smoke gate.",
|
||||||
|
"Physical audio input and output devices remain an explicit manual device gate; CI uses virtual peers.",
|
||||||
|
"Proprietary services, credentials, and redistributable platform packages are never inferred or downloaded by the matrix."
|
||||||
|
],
|
||||||
|
"profiles": [
|
||||||
|
{
|
||||||
|
"id": "linux-stable-default",
|
||||||
|
"platform": "linux",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "native",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-unknown-linux-gnu",
|
||||||
|
"feature_sets": ["default", "tests", "examples", "docs"],
|
||||||
|
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3"],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Compile every default workspace target",
|
||||||
|
"args": ["check", "--workspace", "--all-targets", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Compile every default test without running live gates",
|
||||||
|
"args": ["test", "--workspace", "--no-run", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build warning-free default API documentation",
|
||||||
|
"args": ["doc", "--workspace", "--no-deps", "--locked", "-j", "1"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "linux-stable-minimal",
|
||||||
|
"platform": "linux",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "native",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-unknown-linux-gnu",
|
||||||
|
"feature_sets": ["no-default-features", "tests"],
|
||||||
|
"prerequisites": [],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Compile core and its tests without optional codecs",
|
||||||
|
"args": ["check", "-p", "libremetaverse", "--all-targets", "--no-default-features", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Run core tests without optional codecs",
|
||||||
|
"args": ["test", "-p", "libremetaverse", "--no-default-features", "--locked", "-j", "1"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "linux-stable-features",
|
||||||
|
"platform": "linux",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "native",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-unknown-linux-gnu",
|
||||||
|
"feature_sets": ["all-features", "dds-bc67", "jpeg2000", "rust-j2k", "rust-skia", "skia", "vorbis", "real-audio", "tests"],
|
||||||
|
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3", "alsa-1.2", "vorbis-rs-0.5.6"],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Compile core with only pure Rust BC6H and BC7",
|
||||||
|
"args": ["check", "-p", "libremetaverse", "--no-default-features", "--features", "dds-bc67", "--all-targets", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test the OpenJPEG feature independently",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "jpeg2000", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test the pure-Rust JPEG 2000 feature independently",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "rust-j2k", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test OpenJPEG and pure-Rust JPEG 2000 interoperability",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "jpeg2000,rust-j2k", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test the pure-Rust Skia-compatible feature independently",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "rust-skia", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test the Skia feature independently",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test native Skia and pure-Rust codec interoperability",
|
||||||
|
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia,rust-skia", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Test the Vorbis feature independently",
|
||||||
|
"args": ["test", "-p", "libremetaverse", "--no-default-features", "--features", "vorbis", "--lib", "--locked", "-j", "1", "--", "asset_pipeline_semantics"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Compile the CPAL real-audio adapter",
|
||||||
|
"args": ["check", "-p", "libremetaverse-voice-webrtc", "--all-targets", "--features", "real-audio", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Compile complete feature unification across the workspace",
|
||||||
|
"args": ["check", "--workspace", "--all-targets", "--all-features", "--locked", "-j", "1"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "linux-stable-release-surface",
|
||||||
|
"platform": "linux",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "native",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-unknown-linux-gnu",
|
||||||
|
"feature_sets": ["default", "tests", "examples", "docs"],
|
||||||
|
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3"],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Run all default documentation tests",
|
||||||
|
"args": ["test", "--workspace", "--doc", "--locked", "-j", "1"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build every shipped example program",
|
||||||
|
"args": ["build", "-p", "libremetaverse-programs", "--bins", "--locked", "-j", "1"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "windows-stable-portable",
|
||||||
|
"platform": "windows",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "cross",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-pc-windows-gnu",
|
||||||
|
"feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"],
|
||||||
|
"prerequisites": [],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Cross-check portable crates for Windows GNU",
|
||||||
|
"args": ["check", "--locked", "-j", "1", "--target", "x86_64-pc-windows-gnu", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "metacrate-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-grid-agent", "-p", "metacrate-ci-matrix"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "macos-stable-portable",
|
||||||
|
"platform": "macos",
|
||||||
|
"host": "ubuntu-latest",
|
||||||
|
"execution": "cross",
|
||||||
|
"toolchain": "stable",
|
||||||
|
"target": "x86_64-apple-darwin",
|
||||||
|
"feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"],
|
||||||
|
"prerequisites": [],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"label": "Cross-check portable crates for macOS",
|
||||||
|
"args": ["check", "--locked", "-j", "1", "--target", "x86_64-apple-darwin", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "metacrate-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
192
codegen/README.md
Normal file
192
codegen/README.md
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
# Native data generation
|
||||||
|
|
||||||
|
`libremetaverse-codegen` is the Rust-only framework for the six source
|
||||||
|
generators present at LibreMetaverse commit
|
||||||
|
`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. Normal builds compile only the
|
||||||
|
checked-in Rust outputs. They do not run this tool, invoke .NET or Roslyn, read
|
||||||
|
an environment-dependent path, access the network, or open the sibling
|
||||||
|
reference checkout.
|
||||||
|
|
||||||
|
## Provenance inventory
|
||||||
|
|
||||||
|
[`sources.json`](sources.json) is the machine-readable inventory. It records
|
||||||
|
the upstream repository and commit, source-generator hashes, every actual
|
||||||
|
`AdditionalFile`, its vendored path, SHA-256, format, and applicable license.
|
||||||
|
The generator implementations and `message_template.msg` are covered by the
|
||||||
|
pinned upstream BSD-3-Clause notice. The seven inputs copied from
|
||||||
|
`LibreMetaverse/linden/` are separately licensed CC BY-SA 3.0 and retain that
|
||||||
|
license through generated data tables; see [`NOTICE.md`](../NOTICE.md).
|
||||||
|
|
||||||
|
| Golden generator | Pinned data inputs |
|
||||||
|
| --- | --- |
|
||||||
|
| PacketSourceGenerator | `message_template.msg` |
|
||||||
|
| VisualParamGenerator | `avatar_lad.xml` |
|
||||||
|
| SkeletonGenerator | `avatar_skeleton.xml` |
|
||||||
|
| AttentionsGenerator | `attentions.xml`, `attentionsN.xml` |
|
||||||
|
| TreesGenerator | `trees.xml`, `grass.xml` |
|
||||||
|
| GenepoolGenerator | `genepool.xml` |
|
||||||
|
|
||||||
|
The C# project does not provide the optional `visualparamtemplate.cs` file.
|
||||||
|
The pinned VisualParam generator therefore uses the template embedded in its
|
||||||
|
own source; the inventory records that generator source and hash as provenance.
|
||||||
|
|
||||||
|
The files under `inputs/` are exact, unmodified snapshots. Their distinct
|
||||||
|
license and copyright attribution are covered by [`NOTICE.md`](../NOTICE.md),
|
||||||
|
and the generated source manifest repeats each hash and license in its header
|
||||||
|
and data table. MetaCrate does not vendor the sibling Linden textures, meshes,
|
||||||
|
animations, gestures, clothing, body parts, or other viewer assets.
|
||||||
|
|
||||||
|
## Packet generation
|
||||||
|
|
||||||
|
The packet generator tokenizes the pinned `message_template.msg` directly in
|
||||||
|
Rust. It preserves source order, all 483 packet names, the 434 low/17 medium/32
|
||||||
|
high frequency assignments, 16-bit IDs (including the low-frequency `Fixed`
|
||||||
|
IDs), trust and zerocode flags, optional protocol flags, 905 blocks, repetition
|
||||||
|
rules, and every field width. Braces, identifiers, numeric values, field kinds,
|
||||||
|
prefix widths, duplicate names, and duplicate frequency/ID pairs are validated
|
||||||
|
with stable source-located `PGxxx` diagnostics.
|
||||||
|
|
||||||
|
[`packet_catalog.rs`](../crates/libremetaverse/src/packet_catalog.rs) is the
|
||||||
|
checked-in native output. It contains the public `PacketType` discriminants,
|
||||||
|
ordered immutable schema descriptors, name/type/frequency-ID dispatch tables,
|
||||||
|
and native construction and sizing implementations for every mapped packet and
|
||||||
|
block. Variable blocks start empty, fixed-repeat blocks receive their declared
|
||||||
|
number of independently constructed elements, and scalar/vector/UUID fields
|
||||||
|
receive the same zero defaults as the golden generator. The generated `Length`
|
||||||
|
metadata intentionally preserves the golden generator's variable-block count
|
||||||
|
semantics.
|
||||||
|
|
||||||
|
The same output contains the native wire implementation for every generated
|
||||||
|
packet and block. It preserves high-, medium-, and low-frequency headers,
|
||||||
|
network-order packet IDs, sequence numbers and appended ACKs; the reference
|
||||||
|
field endianness and widths; one- and two-byte variable prefixes; fixed-field
|
||||||
|
padding and truncation; fixed and variable block counts; normalized quaternion
|
||||||
|
encoding; zerocoding boundaries; and the reference `ToBytesMultiple` splitting
|
||||||
|
rules. Readers use checked bounds and allocation arithmetic and reject unknown
|
||||||
|
IDs or truncated payloads without panicking. Generated tests round-trip all 483
|
||||||
|
packet types and exercise every truncation boundary, while focused fixtures
|
||||||
|
assert exact reference bytes and malformed-input behavior.
|
||||||
|
|
||||||
|
The generated packet and block APIs also implement the golden generator's
|
||||||
|
`PacketToOSD`, `PacketFromOSD`, `ToOSD`, and `FromOSD` behavior. This includes
|
||||||
|
little-endian binary encoding for unsigned 32- and 64-bit values, permissive
|
||||||
|
LLSD conversions, omission of absent map fields, one-element arrays for single
|
||||||
|
blocks, exact replacement of variable blocks, and bounded updates of
|
||||||
|
fixed-repeat blocks. The all-fields test round-trips every packet through both
|
||||||
|
wire bytes and LLSD maps.
|
||||||
|
|
||||||
|
Generation also compares all packet, block, field, field-type, and `PacketType`
|
||||||
|
entries against the pinned compiled public API catalog. This rejects a template
|
||||||
|
parser or naming change even if the emitted Rust would otherwise compile. The
|
||||||
|
Rust API compile fixture then compiles every mapped generated member, while the
|
||||||
|
packet catalog test exercises representative low/medium/high, fixed, multiple,
|
||||||
|
variable, and unknown dispatch behavior.
|
||||||
|
|
||||||
|
## Visual parameters and foliage
|
||||||
|
|
||||||
|
The visual-parameter generator parses the pinned `avatar_lad.xml` with explicit
|
||||||
|
root, attribute, numeric, vector, color, relationship, and duplicate-ID
|
||||||
|
validation. Its checked-in
|
||||||
|
[`visual_catalog.rs`](../crates/libremetaverse/src/visual_catalog.rs) output
|
||||||
|
contains all 672 public parameters, including ranges and defaults, groups,
|
||||||
|
wearable associations, alpha/color data, driven relationships, skeletal
|
||||||
|
distortions, and volume morphs. `VisualParams::params()` exposes a
|
||||||
|
`BTreeMap`-backed sorted list keyed by parameter ID. The 253 group-0/group-3
|
||||||
|
transmitted IDs are kept in ascending numeric order because that order is
|
||||||
|
observable in `AvatarAppearance` bytes; no other XML order is retained.
|
||||||
|
|
||||||
|
The foliage generator validates `trees.xml` and `grass.xml`, including UUIDs,
|
||||||
|
all numeric properties, unique IDs, and the contiguous source-order species
|
||||||
|
index required by the reference `Get` implementation. Its checked-in
|
||||||
|
[`foliage_catalog.rs`](../crates/libremetaverse/src/foliage_catalog.rs) output
|
||||||
|
uses source-ordered vectors, so tree and grass enum discriminants provide
|
||||||
|
constant-time indexed lookup. Golden fixtures cover all catalog counts,
|
||||||
|
representative complete records, public getters/setters, appearance decoding,
|
||||||
|
and every generated relationship category.
|
||||||
|
|
||||||
|
## Skeleton, attentions, and genepool
|
||||||
|
|
||||||
|
The skeleton generator validates the pinned hierarchy root, declared counts,
|
||||||
|
finite three-component transforms, unique joint names and aliases, collision
|
||||||
|
volumes, support categories, and child element schema. Its checked-in
|
||||||
|
[`skeleton_catalog.rs`](../crates/libremetaverse/src/skeleton_catalog.rs) output
|
||||||
|
constructs all 133 joints and 26 collision volumes in source hierarchy order.
|
||||||
|
The native skeleton records also implement depth-first enumeration, canonical
|
||||||
|
and alias lookup, expanded mesh-joint lists, the built-in loader, and validated
|
||||||
|
custom XML loading without a serializer or managed runtime.
|
||||||
|
|
||||||
|
The attention generator validates both pinned attention inputs independently,
|
||||||
|
requiring masculine and feminine sets with each of the nine named parameters
|
||||||
|
exactly once. The generated
|
||||||
|
[`attention_catalog.rs`](../crates/libremetaverse/src/attention_catalog.rs)
|
||||||
|
keeps the eleven `LookAtType` slots in enum-discriminant order, including the
|
||||||
|
observable zero-initialized `None` and `Clear` entries.
|
||||||
|
|
||||||
|
The genepool generator validates unique archetype names and parameter IDs,
|
||||||
|
finite values, and each ignored-but-schema-relevant texture UUID and slot. The
|
||||||
|
generated [`genepool_catalog.rs`](../crates/libremetaverse/src/genepool_catalog.rs)
|
||||||
|
preserves source archetype and parameter order for all 24 archetypes and 3,360
|
||||||
|
parameter values; exact-name lookup returns the original source index. Separate
|
||||||
|
generated headers retain the input hashes and CC-BY-SA-3.0 provenance for the
|
||||||
|
skeleton, both attention files, and genepool asset.
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
Regenerate every currently registered Rust output using only checked-in data:
|
||||||
|
|
||||||
|
```console
|
||||||
|
cargo run -p libremetaverse-codegen -- generate
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify hashes and reject stale output without writing:
|
||||||
|
|
||||||
|
```console
|
||||||
|
cargo run -p libremetaverse-codegen -- check
|
||||||
|
```
|
||||||
|
|
||||||
|
Generate into an empty temporary tree while continuing to read the pinned
|
||||||
|
inputs from this checkout:
|
||||||
|
|
||||||
|
```console
|
||||||
|
cargo run -p libremetaverse-codegen -- generate-to /tmp/metacrate-codegen
|
||||||
|
```
|
||||||
|
|
||||||
|
Maintainers can refresh the vendored snapshots from an explicitly supplied
|
||||||
|
checkout. The command verifies all six golden generator hashes and all input
|
||||||
|
hashes before writing, so a different upstream revision is rejected:
|
||||||
|
|
||||||
|
```console
|
||||||
|
cargo run -p libremetaverse-codegen -- vendor ../libremetaverse
|
||||||
|
```
|
||||||
|
|
||||||
|
Generation uses UTF-8 with an optional BOM, normalizes CRLF/CR to LF, rejects
|
||||||
|
NUL input, reports stable `path:line:column: severity[code]` diagnostics, sorts
|
||||||
|
manifest records by stable IDs, emits provenance-rich generated headers, and
|
||||||
|
always terminates output with one LF. Tests generate every registered output
|
||||||
|
twice in memory and require byte identity before comparing with the checked-in
|
||||||
|
files.
|
||||||
|
|
||||||
|
## Completion gate
|
||||||
|
|
||||||
|
The complete milestone gate regenerates `source_manifest.rs`,
|
||||||
|
`packet_catalog.rs`, `visual_catalog.rs`, `foliage_catalog.rs`,
|
||||||
|
`skeleton_catalog.rs`, `attention_catalog.rs`, and `genepool_catalog.rs` in an
|
||||||
|
isolated temporary directory and byte-compares them with the checked-in files.
|
||||||
|
It also verifies the six golden generator records (`PacketSourceGenerator`,
|
||||||
|
`VisualParamGenerator`, `SkeletonGenerator`, `AttentionsGenerator`,
|
||||||
|
`TreesGenerator`, and `GenepoolGenerator`), all eight pinned input names and
|
||||||
|
hashes, generated headers and licenses, complete public API ledgers/shims and
|
||||||
|
the compile fixture, native packet LLSD implementations, and the absence of
|
||||||
|
.NET/Roslyn dependencies or build-script invocations.
|
||||||
|
|
||||||
|
Run the normal gate after generating a clean Rust release build:
|
||||||
|
|
||||||
|
```console
|
||||||
|
cargo build --workspace --release --locked
|
||||||
|
python3 tools/check_codegen_gate.py --release-dir target/release
|
||||||
|
cargo check --manifest-path tests/api-compile/Cargo.toml --locked
|
||||||
|
```
|
||||||
|
|
||||||
|
The release-directory option additionally scans actual artifacts for managed
|
||||||
|
runtime names and markers. The Gitea workflow runs these commands from a clean
|
||||||
|
checkout using only `ubuntu-latest`.
|
||||||
32
codegen/generated/source_manifest.rs
Normal file
32
codegen/generated/source_manifest.rs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// @generated by libremetaverse-codegen; DO NOT EDIT.
|
||||||
|
// Regenerate: cargo run -p libremetaverse-codegen -- generate
|
||||||
|
// Generator: source-manifest
|
||||||
|
// Source: codegen/inputs/attentions.xml sha256=bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/attentionsN.xml sha256=80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/avatar_lad.xml sha256=6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/avatar_skeleton.xml sha256=addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/genepool.xml sha256=6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/grass.xml sha256=90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e license=CC-BY-SA-3.0
|
||||||
|
// Source: codegen/inputs/message_template.msg sha256=15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d license=BSD-3-Clause
|
||||||
|
// Source: codegen/inputs/trees.xml sha256=f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba license=CC-BY-SA-3.0
|
||||||
|
|
||||||
|
pub const UPSTREAM_COMMIT: &str = "2aa70bb68513b39795da5d13c88f31b86e85a3ba";
|
||||||
|
pub const UPSTREAM_REPOSITORY: &str = "https://github.com/cinderblocks/libremetaverse";
|
||||||
|
pub const SOURCES: &[(&str, &str, &str, &str)] = &[
|
||||||
|
("attentions", "codegen/inputs/attentions.xml", "bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af", "CC-BY-SA-3.0"),
|
||||||
|
("attentions_updated", "codegen/inputs/attentionsN.xml", "80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b", "CC-BY-SA-3.0"),
|
||||||
|
("avatar_lad", "codegen/inputs/avatar_lad.xml", "6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf", "CC-BY-SA-3.0"),
|
||||||
|
("avatar_skeleton", "codegen/inputs/avatar_skeleton.xml", "addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a", "CC-BY-SA-3.0"),
|
||||||
|
("genepool", "codegen/inputs/genepool.xml", "6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d", "CC-BY-SA-3.0"),
|
||||||
|
("grass", "codegen/inputs/grass.xml", "90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e", "CC-BY-SA-3.0"),
|
||||||
|
("message_template", "codegen/inputs/message_template.msg", "15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d", "BSD-3-Clause"),
|
||||||
|
("trees", "codegen/inputs/trees.xml", "f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba", "CC-BY-SA-3.0"),
|
||||||
|
];
|
||||||
|
pub const GENERATORS: &[(&str, &str, &str, &str)] = &[
|
||||||
|
("attentions", "SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs", "b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e", "BSD-3-Clause"),
|
||||||
|
("genepool", "SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs", "a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2", "BSD-3-Clause"),
|
||||||
|
("packets", "SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs", "8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f", "BSD-3-Clause"),
|
||||||
|
("skeleton", "SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs", "6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49", "BSD-3-Clause"),
|
||||||
|
("trees", "SourceGenerators/TreesGenerator/TreesGenerator.cs", "151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb", "BSD-3-Clause"),
|
||||||
|
("visual_params", "SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs", "bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac", "BSD-3-Clause"),
|
||||||
|
];
|
||||||
51
codegen/inputs/attentions.xml
Normal file
51
codegen/inputs/attentions.xml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||||
|
<!--
|
||||||
|
Default values for "Look At" controls.
|
||||||
|
Various events compete for avatar attention. I.E. control where the
|
||||||
|
user's avatar looks.
|
||||||
|
The avatar's head will turn to look towards the source of those events
|
||||||
|
as much as is possible.
|
||||||
|
If the head cannot turn due to an animation override, the eyes will still
|
||||||
|
track those events.
|
||||||
|
Avatar attention will be taken by events of equal of greater priorities
|
||||||
|
and will last for timeout number of seconds before reverting to idle.
|
||||||
|
Negative timeout values indicate attentions that never time out.
|
||||||
|
Avatar sex determines which set of attention settings are used.
|
||||||
|
Within each set, the following named attentions relate to the indicated events:
|
||||||
|
|
||||||
|
IDLE: Tracks the mouse pointer movement.
|
||||||
|
AUTO LISTEN: Tracks nearby chat.
|
||||||
|
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
|
||||||
|
RESPOND: Tracks the beginning of typing.
|
||||||
|
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
|
||||||
|
CONVERSATION: Tracks avatars and other objects clicked on.
|
||||||
|
SEOECT: Tracks objects grabbed and being moved.
|
||||||
|
FOCUS: Freezes during avatar customization and when focused on object or point.
|
||||||
|
MOUSELOOK: Tracks center of view when in mouselook view mode.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<linden_attentions version="1.0">
|
||||||
|
<gender name="Masculine">
|
||||||
|
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||||
|
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||||
|
<param attention="respond" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||||
|
<param attention="conversation" priority="0.0" timeout="-1" />
|
||||||
|
<param attention="select" priority="6.0" timeout="-1" />
|
||||||
|
<param attention="focus" priority="6.0" timeout="-1" />
|
||||||
|
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||||
|
</gender>
|
||||||
|
<gender name="Feminine">
|
||||||
|
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||||
|
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||||
|
<param attention="respond" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||||
|
<param attention="conversation" priority="0.0" timeout="-1" />
|
||||||
|
<param attention="select" priority="6.0" timeout="-1" />
|
||||||
|
<param attention="focus" priority="6.0" timeout="-1" />
|
||||||
|
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||||
|
</gender>
|
||||||
|
</linden_attentions>
|
||||||
|
|
||||||
51
codegen/inputs/attentionsN.xml
Normal file
51
codegen/inputs/attentionsN.xml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
|
||||||
|
<!--
|
||||||
|
Default values for "Look At" controls.
|
||||||
|
Various events compete for avatar attention. I.E. control where the
|
||||||
|
user's avatar looks.
|
||||||
|
The avatar's head will turn to look towards the source of those events
|
||||||
|
as much as is possible.
|
||||||
|
If the head cannot turn due to an animation override, the eyes will still
|
||||||
|
track those events.
|
||||||
|
Avatar attention will be taken by events of equal of greater priorities
|
||||||
|
and will last for timeout number of seconds before reverting to idle.
|
||||||
|
Negative timeout values indicate attentions that never time out.
|
||||||
|
Avatar sex determines which set of attention settings are used.
|
||||||
|
Within each set, the following named attentions relate to the indicated events:
|
||||||
|
|
||||||
|
IDLE: Tracks the mouse pointer movement.
|
||||||
|
AUTO LISTEN: Tracks nearby chat.
|
||||||
|
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
|
||||||
|
RESPOND: Tracks the beginning of typing.
|
||||||
|
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
|
||||||
|
CONVERSATION: Tracks avatars and other objects clicked on.
|
||||||
|
SEOECT: Tracks objects grabbed and being moved.
|
||||||
|
FOCUS: Freezes during avatar customization and when focused on object or point.
|
||||||
|
MOUSELOOK: Tracks center of view when in mouselook view mode.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<linden_attentions version="1.0">
|
||||||
|
<gender name="Masculine">
|
||||||
|
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||||
|
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||||
|
<param attention="respond" priority="3.0" timeout="3.0" />
|
||||||
|
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||||
|
<param attention="conversation" priority="5.0" timeout="3.0" />
|
||||||
|
<param attention="select" priority="3.5" timeout="-1" />
|
||||||
|
<param attention="focus" priority="3.5" timeout="20.0" />
|
||||||
|
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||||
|
</gender>
|
||||||
|
<gender name="Feminine">
|
||||||
|
<param attention="idle" priority="1.0" timeout="3.0" />
|
||||||
|
<param attention="auto_listen" priority="3.0" timeout="4.0" />
|
||||||
|
<param attention="freelook" priority="2.0" timeout="2.0" />
|
||||||
|
<param attention="respond" priority="3.0" timeout="6.0" />
|
||||||
|
<param attention="hover" priority="4.0" timeout="1.0" />
|
||||||
|
<param attention="conversation" priority="5.0" timeout="6.0" />
|
||||||
|
<param attention="select" priority="2.5" timeout="-1" />
|
||||||
|
<param attention="focus" priority="2.5" timeout="10.0" />
|
||||||
|
<param attention="mouselook" priority="7.0" timeout="-1" />
|
||||||
|
</gender>
|
||||||
|
</linden_attentions>
|
||||||
|
|
||||||
17504
codegen/inputs/avatar_lad.xml
Normal file
17504
codegen/inputs/avatar_lad.xml
Normal file
File diff suppressed because it is too large
Load Diff
232
codegen/inputs/avatar_skeleton.xml
Normal file
232
codegen/inputs/avatar_skeleton.xml
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
<linden_skeleton num_bones="133" num_collision_volumes="26" version="2.0">
|
||||||
|
<bone aliases="hip avatar_mPelvis" connected="false" end="0.000 0.000 0.084" group="Torso" name="mPelvis" pivot="0.000000 0.000000 1.067015" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
|
||||||
|
<collision_volume end="0.030 0.000 0.095" group="Collision" name="PELVIS" pos="-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="BUTT" pos="-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mSpine1" connected="true" end="0.000 0.000 -0.084" group="Spine" name="mSpine1" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mSpine2" connected="true" end="0.000 0.000 0.084" group="Spine" name="mSpine2" pivot="0.000000 0.000000 -0.084073" pos="0.000 0.000 -0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="abdomen avatar_mTorso" connected="true" end="-0.015 0.000 0.205" group="Torso" name="mTorso" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.028 0.000 0.094" group="Collision" name="BELLY" pos="0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="0.000 0.100 0.000" group="Collision" name="LEFT_HANDLE" pos="0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="0.000 -0.100 0.000" group="Collision" name="RIGHT_HANDLE" pos="0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="LOWER_BACK" pos="0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mSpine3" connected="true" end="0.015 0.000 -0.205" group="Spine" name="mSpine3" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mSpine4" connected="true" end="-0.015 0.000 0.205" group="Spine" name="mSpine4" pivot="0.015368 0.000000 -0.204877" pos="0.015 0.000 -0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="chest avatar_mChest" connected="true" end="-0.010 0.000 0.250" group="Torso" name="mChest" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="-0.096 0.000 0.152" group="Collision" name="CHEST" pos="0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="0.080 0.000 -0.006" group="Collision" name="LEFT_PEC" pos="0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="0.080 0.000 -0.006" group="Collision" name="RIGHT_PEC" pos="0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="UPPER_BACK" pos="0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
|
||||||
|
<bone aliases="neck avatar_mNeck" connected="true" end="0.000 0.000 0.077" group="Torso" name="mNeck" pivot="-0.009507 0.000000 0.251108" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 0.000 0.080" group="Collision" name="NECK" pos="0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08" support="base"/>
|
||||||
|
<bone aliases="head avatar_mHead" connected="true" end="0.000 0.000 0.079" group="Torso" name="mHead" pivot="0.000000 -0.000000 0.075630" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 0.000 0.100" group="Collision" name="HEAD" pos="0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12" support="base" reposition="true"/>
|
||||||
|
<bone aliases="figureHair avatar_mSkull" connected="false" end="0.000 0.000 0.033" group="Extra" name="mSkull" pivot="0.000000 0.000000 0.079000" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mEyeRight" connected="false" end="0.025 0.000 0.000" group="Extra" name="mEyeRight" pivot="0.098466 -0.036000 0.079000" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mEyeLeft" connected="false" end="0.025 0.000 0.000" group="Extra" name="mEyeLeft" pivot="0.098461 0.036000 0.079000" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceRoot" connected="false" end="0.020 0.000 0.000" group="Face" name="mFaceRoot" pivot="0.025000 0.000000 0.045000" pos="0.025 0.000 0.045" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mFaceEyeAltRight" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceEyeAltRight" pivot="0.073466 -0.036000 0.0339300" pos="0.073 -0.036 0.034" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyeAltLeft" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceEyeAltLeft" pivot="0.073461 0.036000 0.0339300" pos="0.073 0.036 0.034" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceForeheadLeft" connected="false" end="0.024 0.004 0.018" group="Face" name="mFaceForeheadLeft" pivot="0.061 0.035 0.083" pos="0.061 0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceForeheadRight" connected="false" end="0.024 -0.004 0.018" group="Face" name="mFaceForeheadRight" pivot="0.061 -0.035 0.083" pos="0.061 -0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowOuterLeft" connected="false" end="0.023 0.013 0.000" group="Eyes" name="mFaceEyebrowOuterLeft" pivot="0.064 0.051 0.048" pos="0.064 0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowCenterLeft" connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterLeft" pivot="0.070 0.043 0.056" pos="0.070 0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowInnerLeft" connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerLeft" pivot="0.075 0.022 0.051" pos="0.075 0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowOuterRight" connected="false" end="0.023 -0.013 0.000" group="Eyes" name="mFaceEyebrowOuterRight" pivot="0.064 -0.051 0.048" pos="0.064 -0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowCenterRight" connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterRight" pivot="0.070 -0.043 0.056" pos="0.070 -0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyebrowInnerRight" connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerRight" pivot="0.075 -0.022 0.051" pos="0.075 -0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyeLidUpperLeft" connected="false" end="0.027 0.000 0.005" group="Eyes" name="mFaceEyeLidUpperLeft" pivot="0.073 0.036 0.034" pos="0.073 0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyeLidLowerLeft" connected="false" end="0.024 0.000 -0.007" group="Eyes" name="mFaceEyeLidLowerLeft" pivot="0.073 0.036 0.034" pos="0.073 0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyeLidUpperRight" connected="false" end="0.027 0.000 0.005" group="Eyes" name="mFaceEyeLidUpperRight" pivot="0.073 -0.036 0.034" pos="0.073 -0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyeLidLowerRight" connected="false" end="0.024 0.000 -0.007" group="Eyes" name="mFaceEyeLidLowerRight" pivot="0.073 -0.036 0.034" pos="0.073 -0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEar1Left" connected="false" end="-0.019 0.018 0.025" group="Ears" name="mFaceEar1Left" pivot="0.000 0.080 0.002" pos="0.000 0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mFaceEar2Left" connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Left" pivot="-0.019 0.018 0.025" pos="-0.019 0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mFaceEar1Right" connected="false" end="-0.019 -0.018 0.025" group="Ears" name="mFaceEar1Right" pivot="0.000 -0.080 0.002" pos="0.000 -0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mFaceEar2Right" connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Right" pivot="-0.019 -0.018 0.025" pos="-0.019 -0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mFaceNoseLeft" connected="false" end="0.015 0.004 0.000" group="Face" name="mFaceNoseLeft" pivot="0.086 0.015 -0.004" pos="0.086 0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceNoseCenter" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceNoseCenter" pivot="0.102 0.000 0.000" pos="0.102 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceNoseRight" connected="false" end="0.015 -0.004 0.000" group="Face" name="mFaceNoseRight" pivot="0.086 -0.015 -0.004" pos="0.086 -0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceCheekLowerLeft" connected="false" end="0.013 0.030 0.000" group="Face" name="mFaceCheekLowerLeft" pivot="0.050 0.034 -0.031" pos="0.050 0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceCheekUpperLeft" connected="false" end="0.022 0.015 0.000" group="Face" name="mFaceCheekUpperLeft" pivot="0.070 0.034 -0.005" pos="0.070 0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceCheekLowerRight" connected="false" end="0.013 -0.030 0.000" group="Face" name="mFaceCheekLowerRight" pivot="0.050 -0.034 -0.031" pos="0.050 -0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceCheekUpperRight" connected="false" end="0.022 -0.015 0.000" group="Face" name="mFaceCheekUpperRight" pivot="0.070 -0.034 -0.005" pos="0.070 -0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceJaw" connected="false" end="0.059 0.000 -0.039" group="Mouth" name="mFaceJaw" pivot="-0.001 0.000 -0.015" pos="-0.001 0.000 -0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mFaceChin" connected="false" end="0.021 0.000 -0.018" group="Mouth" name="mFaceChin" pivot="0.074 0.000 -0.054" pos="0.074 0.000 -0.054" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceTeethLower" connected="false" end="0.035 0.000 0.000" group="Mouth" name="mFaceTeethLower" pivot="0.021 0.000 -0.039" pos="0.021 0.000 -0.039" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mFaceLipLowerLeft" connected="false" end="0.034 0.017 0.005" group="Lips" name="mFaceLipLowerLeft" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipLowerRight" connected="false" end="0.034 -0.017 0.005" group="Lips" name="mFaceLipLowerRight" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipLowerCenter" connected="false" end="0.040 0.000 0.002" group="Lips" name="mFaceLipLowerCenter" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceTongueBase" connected="false" end="0.022 0.000 0.007" group="Mouth" name="mFaceTongueBase" pivot="0.039 0.000 0.005" pos="0.039 0.000 0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mFaceTongueTip" connected="true" end="0.010 0.000 0.000" group="Mouth" name="mFaceTongueTip" pivot="0.022 0.000 0.007" pos="0.022 0.000 0.007" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mFaceJawShaper" connected="false" end="-0.017 0.000 0.000" group="Face" name="mFaceJawShaper" pivot="0.000 0.000 0.000" pos="0.000 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceForeheadCenter" connected="false" end="0.036 0.000 0.000" group="Face" name="mFaceForeheadCenter" pivot="0.069 0.000 0.065" pos="0.069 0.000 0.065" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceNoseBase" connected="false" end="0.014 0.000 0.000" group="Nose" name="mFaceNoseBase" pivot="0.094 0.000 -0.016" pos="0.094 0.000 -0.016" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceTeethUpper" connected="false" end="0.035 0.000 0.000" group="Mouth" name="mFaceTeethUpper" pivot="0.020 0.000 -0.030" pos="0.020 0.000 -0.030" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mFaceLipUpperLeft" connected="false" end="0.041 0.015 0.000" group="Lips" name="mFaceLipUpperLeft" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipUpperRight" connected="false" end="0.041 -0.015 0.000" group="Lips" name="mFaceLipUpperRight" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipCornerLeft" connected="false" end="0.045 0.051 0.000" group="Lips" name="mFaceLipCornerLeft" pivot="0.028 -0.019 -0.010" pos="0.028 -0.019 -0.010" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipCornerRight" connected="false" end="0.045 -0.051 0.000" group="Lips" name="mFaceLipCornerRight" pivot="0.028 0.019 -0.010" pos="0.028 0.019 -0.010" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceLipUpperCenter" connected="false" end="0.043 0.000 0.002" group="Lips" name="mFaceLipUpperCenter" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mFaceEyecornerInnerLeft" connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerLeft" pivot="0.075 0.017 0.032" pos="0.075 0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceEyecornerInnerRight" connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerRight" pivot="0.075 -0.017 0.032" pos="0.075 -0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFaceNoseBridge" connected="false" end="0.015 0.000 0.008" group="Nose" name="mFaceNoseBridge" pivot="0.091 0.000 0.020" pos="0.091 0.000 0.020" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="lCollar avatar_mCollarLeft" connected="false" end="0.000 0.079 0.000" group="Arms" name="mCollarLeft" pivot="-0.020927 0.084665 0.165396" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 0.100 0.000" group="Collision" name="L_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="lShldr avatar_mShoulderLeft" connected="true" end="0.000 0.247 0.000" group="Arms" name="mShoulderLeft" pivot="0.000000 0.079000 -0.000000" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 0.130 -0.003" group="Collision" name="L_UPPER_ARM" pos="0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="lForeArm avatar_mElbowLeft" connected="true" end="0.000 0.205 0.000" group="Arms" name="mElbowLeft" pivot="0.000000 0.248000 0.000000" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 0.100 -0.001" group="Collision" name="L_LOWER_ARM" pos="0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base" reposition="true"/>
|
||||||
|
<bone aliases="lHand avatar_mWristLeft" connected="true" end="0.000 0.060 0.000" group="Arms" name="mWristLeft" pivot="-0.000000 0.204846 0.000000" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.005 0.049 -0.001" group="Collision" name="L_HAND" pos="0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03" support="base"/>
|
||||||
|
<bone aliases="avatar_mHandMiddle1Left" connected="false" end="-0.001 0.040 -0.006" group="Hand" name="mHandMiddle1Left" pivot="0.013 0.101 0.015" pos="0.013 0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandMiddle2Left" connected="true" end="-0.001 0.049 -0.008" group="Hand" name="mHandMiddle2Left" pivot="-0.001 0.040 -0.006" pos="-0.001 0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandMiddle3Left" connected="true" end="-0.002 0.033 -0.006" group="Hand" name="mHandMiddle3Left" pivot="-0.001 0.049 -0.008" pos="-0.001 0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandIndex1Left" connected="false" end="0.017 0.036 -0.006" group="Hand" name="mHandIndex1Left" pivot="0.038 0.097 0.015" pos="0.038 0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandIndex2Left" connected="true" end="0.014 0.032 -0.006" group="Hand" name="mHandIndex2Left" pivot="0.017 0.036 -0.006" pos="0.017 0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandIndex3Left" connected="true" end="0.011 0.025 -0.004" group="Hand" name="mHandIndex3Left" pivot="0.014 0.032 -0.006" pos="0.014 0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandRing1Left" connected="false" end="-0.013 0.038 -0.008" group="Hand" name="mHandRing1Left" pivot="-0.010 0.099 0.009" pos="-0.010 0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandRing2Left" connected="true" end="-0.013 0.040 -0.009" group="Hand" name="mHandRing2Left" pivot="-0.013 0.038 -0.008" pos="-0.013 0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandRing3Left" connected="true" end="-0.010 0.028 -0.006" group="Hand" name="mHandRing3Left" pivot="-0.013 0.040 -0.009" pos="-0.013 0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandPinky1Left" connected="false" end="-0.024 0.025 -0.006" group="Hand" name="mHandPinky1Left" pivot="-0.031 0.095 0.003" pos="-0.031 0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandPinky2Left" connected="true" end="-0.015 0.018 -0.004" group="Hand" name="mHandPinky2Left" pivot="-0.024 0.025 -0.006" pos="-0.024 0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandPinky3Left" connected="true" end="-0.013 0.016 -0.004" group="Hand" name="mHandPinky3Left" pivot="-0.015 0.018 -0.004" pos="-0.015 0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandThumb1Left" connected="false" end="0.028 0.032 0.000" group="Hand" name="mHandThumb1Left" pivot="0.031 0.026 0.004" pos="0.031 0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandThumb2Left" connected="true" end="0.023 0.031 0.000" group="Hand" name="mHandThumb2Left" pivot="0.028 0.032 -0.001" pos="0.028 0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandThumb3Left" connected="true" end="0.015 0.025 0.000" group="Hand" name="mHandThumb3Left" pivot="0.023 0.031 -0.001" pos="0.023 0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="rCollar avatar_mCollarRight" connected="false" end="0.000 -0.079 0.000" group="Arms" name="mCollarRight" pivot="-0.020927 -0.085000 0.165396" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 -0.100 0.000" group="Collision" name="R_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="rShldr avatar_mShoulderRight" connected="true" end="0.000 -0.247 0.000" group="Arms" name="mShoulderRight" pivot="0.000000 -0.079418 -0.000000" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 -0.130 -0.003" group="Collision" name="R_UPPER_ARM" pos="0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="rForeArm avatar_mElbowRight" connected="true" end="0.000 -0.205 0.000" group="Arms" name="mElbowRight" pivot="0.000000 -0.248000 -0.000000" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.000 -0.100 -0.001" group="Collision" name="R_LOWER_ARM" pos="0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base" reposition="true"/>
|
||||||
|
<bone aliases="rHand avatar_mWristRight" connected="true" end="0.000 -0.060 0.000" group="Arms" name="mWristRight" pivot="-0.000000 -0.205000 -0.000000" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.005 -0.049 -0.001" group="Collision" name="R_HAND" pos="0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03" support="base"/>
|
||||||
|
<bone aliases="avatar_mHandMiddle1Right" connected="false" end="-0.001 -0.040 -0.006" group="Hand" name="mHandMiddle1Right" pivot="0.013 -0.101 0.015" pos="0.013 -0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandMiddle2Right" connected="true" end="-0.001 -0.049 -0.008" group="Hand" name="mHandMiddle2Right" pivot="-0.001 -0.040 -0.006" pos="-0.001 -0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandMiddle3Right" connected="true" end="-0.002 -0.033 -0.006" group="Hand" name="mHandMiddle3Right" pivot="-0.001 -0.049 -0.008" pos="-0.001 -0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandIndex1Right" connected="false" end="0.017 -0.036 -0.006" group="Hand" name="mHandIndex1Right" pivot="0.038 -0.097 0.015" pos="0.038 -0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandIndex2Right" connected="true" end="0.014 -0.032 -0.006" group="Hand" name="mHandIndex2Right" pivot="0.017 -0.036 -0.006" pos="0.017 -0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandIndex3Right" connected="true" end="0.011 -0.025 -0.004" group="Hand" name="mHandIndex3Right" pivot="0.014 -0.032 -0.006" pos="0.014 -0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandRing1Right" connected="false" end="-0.013 -0.038 -0.008" group="Hand" name="mHandRing1Right" pivot="-0.010 -0.099 0.009" pos="-0.010 -0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandRing2Right" connected="true" end="-0.013 -0.040 -0.009" group="Hand" name="mHandRing2Right" pivot="-0.013 -0.038 -0.008" pos="-0.013 -0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandRing3Right" connected="true" end="-0.010 -0.028 -0.006" group="Hand" name="mHandRing3Right" pivot="-0.013 -0.040 -0.009" pos="-0.013 -0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandPinky1Right" connected="false" end="-0.024 -0.025 -0.006" group="Hand" name="mHandPinky1Right" pivot="-0.031 -0.095 0.003" pos="-0.031 -0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandPinky2Right" connected="true" end="-0.015 -0.018 -0.004" group="Hand" name="mHandPinky2Right" pivot="-0.024 -0.025 -0.006" pos="-0.024 -0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandPinky3Right" connected="true" end="-0.013 -0.016 -0.004" group="Hand" name="mHandPinky3Right" pivot="-0.015 -0.018 -0.004" pos="-0.015 -0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHandThumb1Right" connected="false" end="0.028 -0.032 0.000" group="Hand" name="mHandThumb1Right" pivot="0.031 -0.026 0.004" pos="0.031 -0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandThumb2Right" connected="true" end="0.023 -0.031 0.000" group="Hand" name="mHandThumb2Right" pivot="0.028 -0.032 -0.001" pos="0.028 -0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHandThumb3Right" connected="true" end="0.015 -0.025 0.000" group="Hand" name="mHandThumb3Right" pivot="0.023 -0.031 -0.001" pos="0.023 -0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mWingsRoot" connected="false" end="-0.061 0.000 0.000" group="Wing" name="mWingsRoot" pivot="-0.014 0.000 0.000" pos="-0.014 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mWing1Left" connected="false" end="-0.168 0.169 0.067" group="Wing" name="mWing1Left" pivot="-0.099 0.105 0.181" pos="-0.099 0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing2Left" connected="true" end="-0.181 0.183 0.000" group="Wing" name="mWing2Left" pivot="-0.168 0.169 0.067" pos="-0.168 0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing3Left" connected="true" end="-0.171 0.173 0.000" group="Wing" name="mWing3Left" pivot="-0.181 0.183 0.000" pos="-0.181 0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing4Left" connected="true" end="-0.146 0.132 0.000" group="Wing" name="mWing4Left" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mWing4FanLeft" connected="true" end="-0.068 0.062 -0.159" group="Wing" name="mWing4FanLeft" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mWing1Right" connected="false" end="-0.168 -0.169 0.067" group="Wing" name="mWing1Right" pivot="-0.099 -0.105 0.181" pos="-0.099 -0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing2Right" connected="true" end="-0.181 -0.183 0.000" group="Wing" name="mWing2Right" pivot="-0.168 -0.169 0.067" pos="-0.168 -0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing3Right" connected="true" end="-0.171 -0.173 0.000" group="Wing" name="mWing3Right" pivot="-0.181 -0.183 0.000" pos="-0.181 -0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mWing4Right" connected="true" end="-0.146 -0.132 0.000" group="Wing" name="mWing4Right" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mWing4FanRight" connected="true" end="-0.068 -0.062 -0.159" group="Wing" name="mWing4FanRight" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="rThigh avatar_mHipRight" connected="false" end="-0.001 0.049 -0.491" group="Legs" name="mHipRight" pivot="0.033620 -0.128806 -0.041086" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
|
||||||
|
<collision_volume end="0.000 0.000 -0.200" group="Collision" name="R_UPPER_LEG" pos="-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base" reposition="true"/>
|
||||||
|
<bone aliases="rShin avatar_mKneeRight" connected="true" end="-0.029 0.000 -0.469" group="Legs" name="mKneeRight" pivot="-0.000780 0.048635 -0.490922" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="-0.010 0.000 -0.150" group="Collision" name="R_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base" reposition="true"/>
|
||||||
|
<bone aliases="rFoot avatar_mAnkleRight" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleRight" pivot="-0.028869 0.000000 -0.468494" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.089 0.000 -0.026" group="Collision" name="R_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFootRight" connected="true" end="0.105 -0.010 0.000" group="Extra" name="mFootRight" pivot="0.111956 -0.000000 -0.060637" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
|
||||||
|
<bone aliases="avatar_mToeRight" connected="false" end="0.020 0.000 0.000" group="Extra" name="mToeRight" pivot="0.105399 -0.010408 -0.000104" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="lThigh avatar_mHipLeft" connected="false" end="-0.001 -0.046 -0.491" group="Legs" name="mHipLeft" pivot="0.033757 0.126765 -0.040998" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
|
||||||
|
<collision_volume end="0.000 0.000 -0.200" group="Collision" name="L_UPPER_LEG" pos="-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base" reposition="true"/>
|
||||||
|
<bone aliases="lShin avatar_mKneeLeft" connected="true" end="-0.029 0.001 -0.469" group="Legs" name="mKneeLeft" pivot="-0.000887 -0.045568 -0.491053" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="-0.010 0.000 -0.150" group="Collision" name="L_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base" reposition="true"/>
|
||||||
|
<bone aliases="lFoot avatar_mAnkleLeft" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleLeft" pivot="-0.028887 0.001378 -0.468449" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
|
||||||
|
<collision_volume end="0.089 0.000 -0.026" group="Collision" name="L_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base" reposition="true"/>
|
||||||
|
<bone aliases="avatar_mFootLeft" connected="true" end="0.105 0.008 0.001" group="Extra" name="mFootLeft" pivot="0.111956 -0.000000 -0.060620" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
|
||||||
|
<bone aliases="avatar_mToeLeft" connected="false" end="0.020 0.000 0.000" group="Extra" name="mToeLeft" pivot="0.105387 0.008270 0.000871" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mTail1" connected="false" end="-0.197 0.000 0.000" group="Tail" name="mTail1" pivot="-0.116 0.000 0.047" pos="-0.116 0.000 0.047" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mTail2" connected="true" end="-0.168 0.000 0.000" group="Tail" name="mTail2" pivot="-0.197 0.000 0.000" pos="-0.197 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mTail3" connected="true" end="-0.142 0.000 0.000" group="Tail" name="mTail3" pivot="-0.168 0.000 0.000" pos="-0.168 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mTail4" connected="true" end="-0.112 0.000 0.000" group="Tail" name="mTail4" pivot="-0.142 0.000 0.000" pos="-0.142 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mTail5" connected="true" end="-0.094 0.000 0.000" group="Tail" name="mTail5" pivot="-0.112 0.000 0.000" pos="-0.112 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mTail6" connected="true" end="-0.089 0.000 0.000" group="Tail" name="mTail6" pivot="-0.094 0.000 0.000" pos="-0.094 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mGroin" connected="false" end="0.004 0.000 -0.066" group="Groin" name="mGroin" pivot="0.064 0.000 -0.097" pos="0.064 0.000 -0.097" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
|
||||||
|
<bone aliases="avatar_mHindLimbsRoot" connected="false" end="-0.204 0.000 0.000" group="Limb" name="mHindLimbsRoot" pivot="-0.200 0.000 0.084" pos="-0.200 0.000 0.084" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHindLimb1Left" connected="false" end="0.002 -0.046 -0.491" group="Limb" name="mHindLimb1Left" pivot="-0.204 0.129 -0.125" pos="-0.204 0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mHindLimb2Left" connected="true" end="-0.030 -0.003 -0.468" group="Limb" name="mHindLimb2Left" pivot="0.002 -0.046 -0.491" pos="0.002 -0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHindLimb3Left" connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Left" pivot="-0.030 -0.003 -0.468" pos="-0.030 -0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHindLimb4Left" connected="true" end="0.105 0.008 0.000" group="Limb" name="mHindLimb4Left" pivot="0.112 0.000 -0.061" pos="0.112 0.000 -0.061" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
<bone aliases="avatar_mHindLimb1Right" connected="false" end="0.002 0.046 -0.491" group="Limb" name="mHindLimb1Right" pivot="-0.204 -0.129 -0.125" pos="-0.204 -0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
|
||||||
|
<bone aliases="avatar_mHindLimb2Right" connected="true" end="-0.030 0.003 -0.468" group="Limb" name="mHindLimb2Right" pivot="0.002 0.046 -0.491" pos="0.002 0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHindLimb3Right" connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Right" pivot="-0.030 0.003 -0.468" pos="-0.030 0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
|
||||||
|
<bone aliases="avatar_mHindLimb4Right" connected="true" end="0.105 -0.008 0.000" group="Limb" name="mHindLimb4Right" pivot="0.112 0.000 -0.061" pos="0.112 0.000 -0.061" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</bone>
|
||||||
|
</linden_skeleton>
|
||||||
7107
codegen/inputs/genepool.xml
Normal file
7107
codegen/inputs/genepool.xml
Normal file
File diff suppressed because it is too large
Load Diff
45
codegen/inputs/grass.xml
Normal file
45
codegen/inputs/grass.xml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<grass_defs>
|
||||||
|
<grass
|
||||||
|
name="Grass 0"
|
||||||
|
species_id="0"
|
||||||
|
texture_id="6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
|
||||||
|
blade_size_x="1.35"
|
||||||
|
blade_size_y="1.35"
|
||||||
|
/>
|
||||||
|
<grass
|
||||||
|
name="Grass 1"
|
||||||
|
species_id="1"
|
||||||
|
texture_id="79504bf5-c3ec-0763-6563-d843de66d0a1"
|
||||||
|
blade_size_x="1.0"
|
||||||
|
blade_size_y="0.66"
|
||||||
|
/>
|
||||||
|
<grass
|
||||||
|
name="Grass 2"
|
||||||
|
species_id="2"
|
||||||
|
texture_id="6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
|
||||||
|
blade_size_x="1.8"
|
||||||
|
blade_size_y="1.8"
|
||||||
|
/>
|
||||||
|
<grass
|
||||||
|
name="Grass 3"
|
||||||
|
species_id="3"
|
||||||
|
texture_id="99bd60a2-3250-efc9-2e39-2fbcadefbecc"
|
||||||
|
blade_size_x="1.0"
|
||||||
|
blade_size_y="1.0"
|
||||||
|
/>
|
||||||
|
<grass
|
||||||
|
name="Grass 4"
|
||||||
|
species_id="4"
|
||||||
|
texture_id="7a2b3a4a-53c2-53ac-5716-aac7d743c020"
|
||||||
|
blade_size_x="2.25"
|
||||||
|
blade_size_y="2.25"
|
||||||
|
/>
|
||||||
|
<grass
|
||||||
|
name="undergrowth_1"
|
||||||
|
species_id="5"
|
||||||
|
texture_id="8f458549-173b-23ff-d4ff-bfaa5ea2371b"
|
||||||
|
blade_size_x="2.0"
|
||||||
|
blade_size_y="2.0"
|
||||||
|
/>
|
||||||
|
</grass_defs>
|
||||||
66
codegen/inputs/lsl_tools_grammar.json
Normal file
66
codegen/inputs/lsl_tools_grammar.json
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"source": {
|
||||||
|
"repository": "https://github.com/cinderblocks/libremetaverse",
|
||||||
|
"commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"parser": "LibreMetaverse.LslTools/YYClass/yycs0syntax.cs",
|
||||||
|
"lexer": "LibreMetaverse.LslTools/YYClass/yycs0tokens.cs",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"serialization_version": "4.5"
|
||||||
|
},
|
||||||
|
"start": 19,
|
||||||
|
"eof": 2,
|
||||||
|
"tokens": [
|
||||||
|
["EOF", 2, null],
|
||||||
|
["BASE", 3, "base"],
|
||||||
|
["THIS", 4, "this"],
|
||||||
|
["NEW", 5, "new"],
|
||||||
|
["ID", 6, null],
|
||||||
|
["ANY", 7, null],
|
||||||
|
["COLON", 8, ":"],
|
||||||
|
["SEMICOLON", 9, ";"],
|
||||||
|
["LBRACE", 10, "{"],
|
||||||
|
["RBRACE", 11, "}"],
|
||||||
|
["LPAREN", 12, "("],
|
||||||
|
["RPAREN", 13, ")"],
|
||||||
|
["LBRACK", 14, "["],
|
||||||
|
["RBRACK", 15, "]"]
|
||||||
|
],
|
||||||
|
"nonterminals": [
|
||||||
|
["GStuff", 16],
|
||||||
|
["Stuff", 17],
|
||||||
|
["Item", 18],
|
||||||
|
["ClassBody", 19],
|
||||||
|
["Cons", 20],
|
||||||
|
["Call", 21],
|
||||||
|
["BaseCall", 22],
|
||||||
|
["Name", 23]
|
||||||
|
],
|
||||||
|
"productions": [
|
||||||
|
[1, "ClassBody", ["GStuff", "Cons", "GStuff"], "ClassBody_2_1"],
|
||||||
|
[2, "GStuff", [], "GStuff_2_1"],
|
||||||
|
[3, "GStuff", ["GStuff", "Item"], "GStuff_4_1"],
|
||||||
|
[4, "GStuff", ["GStuff", "Call"], "GStuff_6_1"],
|
||||||
|
[5, "Stuff", [], "Stuff_2_1"],
|
||||||
|
[6, "Stuff", ["Stuff", "Item"], "Stuff_4_1"],
|
||||||
|
[7, "Cons", ["Name", "LPAREN", "Stuff", "RPAREN", "BaseCall"], "Cons_2_1"],
|
||||||
|
[8, "Call", ["Name", "LPAREN", "Stuff", "RPAREN"], "Call_2_1"],
|
||||||
|
[9, "BaseCall", [], "BaseCall_2_1"],
|
||||||
|
[10, "BaseCall", ["COLON", "BASE", "LPAREN", "Stuff", "RPAREN"], "BaseCall_4_1"],
|
||||||
|
[11, "BaseCall", ["COLON", "THIS", "LPAREN", "Stuff", "RPAREN"], "BaseCall_6_1"],
|
||||||
|
[12, "Name", ["ID"], "Name_2_1"],
|
||||||
|
[13, "Name", ["ID", "LBRACK", "Stuff", "RBRACK"], "Name_4_1"],
|
||||||
|
[14, "Item", ["ID"], "Item_2_1"],
|
||||||
|
[15, "Item", ["ANY"], "Item_4_1"],
|
||||||
|
[16, "Item", ["SEMICOLON"], "Item_6_1"],
|
||||||
|
[17, "Item", ["BASE"], "Item_8_1"],
|
||||||
|
[18, "Item", ["THIS"], "Item_10_1"],
|
||||||
|
[19, "Item", ["THIS", "LBRACK", "Stuff", "RBRACK"], "Item_12_1"],
|
||||||
|
[20, "Item", ["COLON"], "Item_14_1"],
|
||||||
|
[21, "Item", ["NEW", "Name"], "Item_16_1"],
|
||||||
|
[22, "Item", ["NEW", "ID"], "Item_18_1"],
|
||||||
|
[23, "Item", ["LPAREN", "Stuff", "RPAREN"], "Item_20_1"],
|
||||||
|
[24, "Item", ["LBRACE", "GStuff", "RBRACE"], "Item_22_1"],
|
||||||
|
[25, "Item", ["LBRACK", "Stuff", "RBRACK"], "Item_24_1"]
|
||||||
|
]
|
||||||
|
}
|
||||||
9291
codegen/inputs/message_template.msg
Normal file
9291
codegen/inputs/message_template.msg
Normal file
File diff suppressed because it is too large
Load Diff
24
codegen/inputs/trees.xml
Normal file
24
codegen/inputs/trees.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<tree_defs>
|
||||||
|
<tree name="Pine 1" species_id="0" texture_id="0187babf-6c0d-5891-ebed-4ecab1426683" droop="60.0" twist="5.0" branches="5.0" depth="1" scale_step="0.7" trunk_depth="6" branch_length="8.0" trunk_length="11.5" leaf_scale="22.0" billboard_scale="39.5" billboard_ratio="1.1" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="20.0" noise_mag="0.5" noise_scale="2.5" taper="0.8" repeat_z="3" />
|
||||||
|
<tree name="Oak" species_id="1" texture_id="8a515889-eac9-fb55-8eba-d2dc09eb32c8" droop="35.0" twist="3.0" branches="4.0" depth="3" scale_step="0.7" trunk_depth="0" branch_length="3.0" trunk_length="3.8" leaf_scale="7.0" billboard_scale="10.25" billboard_ratio="1.0" trunk_aspect="0.15" branch_aspect="0.07" leaf_rotate="0.0" noise_mag="1.2" noise_scale="4.0" taper="0.3" repeat_z="4" />
|
||||||
|
<tree name="Tropical Bush 1" species_id="2" texture_id="5bc11cd6-2f40-071e-a8da-0903394204f9" droop="10.0" twist="0.0" branches="6.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="7.5" billboard_scale="5.0" billboard_ratio="1.25" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
|
||||||
|
<tree name="Palm 1" species_id="3" texture_id="ca4e8c27-473c-eb1c-2f5d-50ee3f07d85c" droop="0.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="0" branch_length="0.7" trunk_length="9.0" leaf_scale="10.0" billboard_scale="13.25" billboard_ratio="1.0" trunk_aspect="0.035" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="0.2" noise_scale="6.0" taper="0.7" repeat_z="10" />
|
||||||
|
<tree name="Dogwood" species_id="4" texture_id="64367bd1-697e-b3e6-0b65-3f862a577366" droop="30.0" twist="0.0" branches="3.0" depth="2" scale_step="0.7" trunk_depth="1" branch_length="2.75" trunk_length="4.0" leaf_scale="5.5" billboard_scale="10.0" billboard_ratio="1.0" trunk_aspect="0.06" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.5" noise_scale="2.0" taper="0.8" repeat_z="3" />
|
||||||
|
<tree name="Tropical Bush 2" species_id="5" texture_id="cdd9a9fc-6d0b-f90d-8416-c72b6019bca8" droop="10.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="6.0" billboard_scale="4.5" billboard_ratio="0.9" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
|
||||||
|
<tree name="Palm 2" species_id="6" texture_id="2d784476-d0db-9979-0cff-9408745a7cf3" droop="0.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="0" branch_length="0.7" trunk_length="10.0" leaf_scale="7.5" billboard_scale="13.5" billboard_ratio="1.0" trunk_aspect="0.035" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="0.2" noise_scale="6.0" taper="0.6" repeat_z="12" />
|
||||||
|
<tree name="Cypress 1" species_id="7" texture_id="fb2ae204-3fd1-df33-594f-c9f882830e66" droop="30.0" twist="0.0" branches="3.0" depth="4" scale_step="0.5" trunk_depth="0" branch_length="10.0" trunk_length="10.0" leaf_scale="70.0" billboard_scale="22.5" billboard_ratio="1.0" trunk_aspect="0.05" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="1.2" noise_scale="1.0" taper="0.5" repeat_z="6" />
|
||||||
|
<tree name="Cypress 2" species_id="8" texture_id="30047cec-269d-408e-0c30-b2603b887268" droop="30.0" twist="0.0" branches="3.0" depth="4" scale_step="0.6" trunk_depth="3.0" branch_length="7.5" trunk_length="10.0" leaf_scale="35.0" billboard_scale="25.0" billboard_ratio="0.8" trunk_aspect="0.05" branch_aspect="0.04" leaf_rotate="0.0" noise_mag="1.2" noise_scale="1.0" taper="0.5" repeat_z="5" />
|
||||||
|
<tree name="Pine 2" species_id="9" texture_id="d691a01c-13b7-578d-57c0-5caef0b4e7e1" droop="50.0" twist="7.5" branches="4.0" depth="2" scale_step="0.7" trunk_depth="6.0" branch_length="6.0" trunk_length="10.0" leaf_scale="15.5" billboard_scale="33.0" billboard_ratio="1.35" trunk_aspect="0.1" branch_aspect="0.08" leaf_rotate="5.0" noise_mag="0.5" noise_scale="2.5" taper="0.7" repeat_z="3" />
|
||||||
|
<tree name="Plumeria" species_id="10" texture_id="6de37e4e-7029-61f5-54b8-f5e63f983f58" droop="8.0" twist="7.0" branches="3.0" depth="2" scale_step="0.6" trunk_depth="0" branch_length="3.0" trunk_length="0.1" leaf_scale="20" billboard_scale="10.0" billboard_ratio="1.35" trunk_aspect="0.10" branch_aspect="0.075" leaf_rotate="0.0" noise_mag="0" noise_scale="0" taper="0.85" repeat_z="2" />
|
||||||
|
<tree name="Winter Pine 1" species_id="11" texture_id="10d2a01a-0818-84b9-4b96-c2eb63256519" droop="90.0" twist="2.5" branches="6.0" depth="1" scale_step="0.66" trunk_depth="8" branch_length="0.0" trunk_length="4" leaf_scale="6.75" billboard_scale="12.5" billboard_ratio="0.6" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.0" noise_scale="2.5" taper="0.85" repeat_z="2" />
|
||||||
|
<tree name="Winter Aspen" species_id="12" texture_id="7c0cf89b-44b1-1ce2-dd74-07102a98ac2a" droop="85.0" twist="3.0" branches="5" depth="1" scale_step="0.6" trunk_depth="8" branch_length="3.0" trunk_length="4.5" leaf_scale="8" billboard_scale="12" billboard_ratio=".675" trunk_aspect="0.06" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.75" noise_scale="2.5" taper="0.8" repeat_z="2" />
|
||||||
|
<tree name="Winter Pine 2" species_id="13" texture_id="67931331-0c02-4876-1255-28770896c6a2" droop="140.0" twist="5.0" branches="6.0" depth="1" scale_step="0.6" trunk_depth="7" branch_length="0.0" trunk_length="3" leaf_scale="5.0" billboard_scale="7.5" billboard_ratio="0.5" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.750" noise_scale="2.5" taper="0.5" repeat_z="2" />
|
||||||
|
<tree name="Eucalyptus" species_id="14" texture_id="a6162133-724b-54df-a12f-51cd070ad6f3" droop="20.0" twist="5.0" branches="3.6" depth="4" scale_step="0.6" trunk_depth="0" branch_length="12.0" trunk_length="8.0" leaf_scale="33.0" billboard_scale="24" billboard_ratio="1.3" trunk_aspect="0.15" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="0" noise_scale="0" taper="0.675" repeat_z="3" />
|
||||||
|
<tree name="Fern" species_id="15" texture_id="8872f2b8-31db-42d8-580a-b3e4a91262de" droop="12.0" twist="0.0" branches="7.0" depth="1" scale_step="0.5" trunk_depth="0.1" branch_length="0.01" trunk_length="0.0" leaf_scale="4" billboard_scale="3.5" billboard_ratio="0.85" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
|
||||||
|
<tree name="Eelgrass" species_id="16" texture_id="96b4de31-f4fa-337d-ec78-451e3609769e" droop="0.0" twist="0.0" branches="5.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="5.0" billboard_scale="3.0" billboard_ratio="1.0" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
|
||||||
|
<tree name="Sea Sword" species_id="17" texture_id="5894e2e7-ab8d-edfa-e61c-18cf16854ba3" droop="0.0" twist="0.0" branches="6.0" depth="1" scale_step="0.7" trunk_depth="1" branch_length="0.0" trunk_length="0.0" leaf_scale="2.0" billboard_scale="2.0" billboard_ratio="1.0" trunk_aspect="1.0" branch_aspect="1.0" leaf_rotate="0.0" noise_mag="0.5" noise_scale="0.0" taper="0.0" repeat_z="1" />
|
||||||
|
<tree name="Kelp 1" species_id="18" texture_id="2caf1179-7861-6ff3-4b7d-46e17780bdfa" droop="-15.0" twist="0.0" branches="1.0" depth="1" scale_step="1.0" trunk_depth="3" branch_length="2.5" trunk_length="0.75" leaf_scale="1.85" billboard_scale="4.9" billboard_ratio="1.0" trunk_aspect="0.04" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.0" noise_scale="2.0" taper="0.8" repeat_z="2" />
|
||||||
|
<tree name="Beach Grass 1" species_id="19" texture_id="18fb888b-e8f1-dce7-7da7-321d651ea6b0" droop="0.0" twist="0.0" branches="4.0" depth="1" scale_step="0.7" trunk_depth="1" branch_length="0.0" trunk_length="0.0" leaf_scale="4.0" billboard_scale="2.5" billboard_ratio="1.2" trunk_aspect="1.0" branch_aspect="1.0" leaf_rotate="0.0" noise_mag="0.5" noise_scale="0.0" taper="0.0" repeat_z="1" />
|
||||||
|
<tree name="Kelp 2" species_id="20" texture_id="2a4880b6-b7a3-690a-2049-bfbe38eafb9f" droop="-15.0" twist="0.0" branches="1.0" depth="1" scale_step="1.0" trunk_depth="3" branch_length="2.5" trunk_length="1.35" leaf_scale="2.0" billboard_scale="4.9" billboard_ratio="1.0" trunk_aspect="0.025" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.0" noise_scale="2.0" taper="0.8" repeat_z="2" />
|
||||||
|
</tree_defs>
|
||||||
23
codegen/sources.json
Normal file
23
codegen/sources.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"schema": 1,
|
||||||
|
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
|
||||||
|
"upstream_repository": "https://github.com/cinderblocks/libremetaverse",
|
||||||
|
"generators": [
|
||||||
|
{"id":"attentions","reference_source":"SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs","sha256":"b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e","license":"BSD-3-Clause","inputs":["attentions","attentions_updated"]},
|
||||||
|
{"id":"genepool","reference_source":"SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs","sha256":"a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2","license":"BSD-3-Clause","inputs":["genepool"]},
|
||||||
|
{"id":"packets","reference_source":"SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs","sha256":"8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f","license":"BSD-3-Clause","inputs":["message_template"]},
|
||||||
|
{"id":"skeleton","reference_source":"SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs","sha256":"6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49","license":"BSD-3-Clause","inputs":["avatar_skeleton"]},
|
||||||
|
{"id":"trees","reference_source":"SourceGenerators/TreesGenerator/TreesGenerator.cs","sha256":"151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb","license":"BSD-3-Clause","inputs":["trees","grass"]},
|
||||||
|
{"id":"visual_params","reference_source":"SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs","sha256":"bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac","license":"BSD-3-Clause","inputs":["avatar_lad"],"note":"The project supplies no visualparamtemplate.cs AdditionalFile; the pinned C# generator uses its embedded template."}
|
||||||
|
],
|
||||||
|
"inputs": [
|
||||||
|
{"id":"message_template","reference_path":"data/message_template.msg","vendored_path":"codegen/inputs/message_template.msg","sha256":"15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d","license":"BSD-3-Clause","format":"message-template"},
|
||||||
|
{"id":"avatar_lad","reference_path":"LibreMetaverse/linden/character/avatar_lad.xml","vendored_path":"codegen/inputs/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"avatar_skeleton","reference_path":"LibreMetaverse/linden/character/avatar_skeleton.xml","vendored_path":"codegen/inputs/avatar_skeleton.xml","sha256":"addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"attentions","reference_path":"LibreMetaverse/linden/character/attentions.xml","vendored_path":"codegen/inputs/attentions.xml","sha256":"bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"attentions_updated","reference_path":"LibreMetaverse/linden/character/attentionsN.xml","vendored_path":"codegen/inputs/attentionsN.xml","sha256":"80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"genepool","reference_path":"LibreMetaverse/linden/character/genepool.xml","vendored_path":"codegen/inputs/genepool.xml","sha256":"6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"trees","reference_path":"LibreMetaverse/linden/trees.xml","vendored_path":"codegen/inputs/trees.xml","sha256":"f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba","license":"CC-BY-SA-3.0","format":"xml"},
|
||||||
|
{"id":"grass","reference_path":"LibreMetaverse/linden/grass.xml","vendored_path":"codegen/inputs/grass.xml","sha256":"90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e","license":"CC-BY-SA-3.0","format":"xml"}
|
||||||
|
]
|
||||||
|
}
|
||||||
28
config/grid-agent-acceptance-evidence.schema.json
Normal file
28
config/grid-agent-acceptance-evidence.schema.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$id": "https://metacrate.invalid/schema/grid-agent-acceptance-v1.json",
|
||||||
|
"title": "MetaCrate grid-agent acceptance evidence",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["schema_version", "sequence", "unix_millis", "package_version", "source_revision", "rust_toolchain", "command", "profile", "grid_type", "endpoint_capabilities", "stage", "status", "duration_millis", "outcome_code", "evidence_sha256", "metrics", "limitations"],
|
||||||
|
"properties": {
|
||||||
|
"schema_version": { "const": 1 },
|
||||||
|
"sequence": { "type": "integer", "minimum": 1 },
|
||||||
|
"unix_millis": { "type": "integer", "minimum": 0 },
|
||||||
|
"package_version": { "type": "string", "maxLength": 64 },
|
||||||
|
"source_revision": { "type": "string", "maxLength": 96 },
|
||||||
|
"rust_toolchain": { "type": "string", "maxLength": 96 },
|
||||||
|
"command": { "type": "string", "maxLength": 256 },
|
||||||
|
"profile": { "enum": ["deterministic_offline", "live_grid"] },
|
||||||
|
"grid_type": { "type": "string", "maxLength": 96 },
|
||||||
|
"endpoint_capabilities": { "type": "array", "maxItems": 16, "items": { "type": "string", "maxLength": 96 } },
|
||||||
|
"stage": { "type": "string", "maxLength": 96 },
|
||||||
|
"status": { "enum": ["passed", "failed", "not_run"] },
|
||||||
|
"duration_millis": { "type": "integer", "minimum": 0 },
|
||||||
|
"budget_millis": { "type": ["integer", "null"], "minimum": 0 },
|
||||||
|
"outcome_code": { "type": "string", "maxLength": 96 },
|
||||||
|
"evidence_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
||||||
|
"metrics": { "type": "object", "additionalProperties": { "type": ["integer", "number", "boolean", "string"] } },
|
||||||
|
"limitations": { "type": "array", "maxItems": 32, "items": { "type": "string", "maxLength": 256 } }
|
||||||
|
}
|
||||||
|
}
|
||||||
57
config/grid-agent.example.yml
Normal file
57
config/grid-agent.example.yml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
schema_version: 1
|
||||||
|
integrated: false
|
||||||
|
split: false
|
||||||
|
llm:
|
||||||
|
endpoint_url: https://llm.example.invalid/v1/chat/completions
|
||||||
|
api_key: <replace-in-private-config>
|
||||||
|
model: <endpoint-model-name>
|
||||||
|
authorized_avatar_uuids: []
|
||||||
|
storage_path: data/grid-agent
|
||||||
|
timeouts:
|
||||||
|
startup_seconds: 120
|
||||||
|
shutdown_seconds: 10
|
||||||
|
request_seconds: 60
|
||||||
|
limits:
|
||||||
|
grid_event_queue: 256
|
||||||
|
control_queue: 32
|
||||||
|
observable_queue: 512
|
||||||
|
max_body_bytes: 1048576
|
||||||
|
max_message_bytes: 16384
|
||||||
|
max_conversation_messages: 64
|
||||||
|
max_tool_calls: 16
|
||||||
|
max_authorized_avatars: 128
|
||||||
|
max_background_tasks: 2
|
||||||
|
behavior:
|
||||||
|
heartbeat_seconds: 30
|
||||||
|
settle_milliseconds: 2000
|
||||||
|
response_delay_min_milliseconds: 350
|
||||||
|
response_delay_max_milliseconds: 1200
|
||||||
|
attention_dwell_milliseconds: 4000
|
||||||
|
idle_interval_seconds: 120
|
||||||
|
action_timeout_seconds: 15
|
||||||
|
max_walk_duration_seconds: 10
|
||||||
|
stuck_timeout_seconds: 3
|
||||||
|
min_action_interval_milliseconds: 750
|
||||||
|
max_walk_distance_meters: 8
|
||||||
|
max_attention_distance_meters: 96
|
||||||
|
idle_look_enabled: true
|
||||||
|
|
||||||
|
vision:
|
||||||
|
max_distance_meters: 64
|
||||||
|
asset_cache_max_bytes: 2147483648
|
||||||
|
reconnect:
|
||||||
|
initial_delay_milliseconds: 1000
|
||||||
|
maximum_delay_seconds: 60
|
||||||
|
readiness_timeout_seconds: 30
|
||||||
|
stable_reset_seconds: 120
|
||||||
|
jitter_basis_points: 2000
|
||||||
|
offline_work_capacity: 128
|
||||||
|
conversation:
|
||||||
|
persistence_enabled: false
|
||||||
|
interaction:
|
||||||
|
aliases: [metacrate]
|
||||||
|
debounce_milliseconds: 250
|
||||||
|
model_timeout_seconds: 30
|
||||||
|
public_rate_milliseconds: 750
|
||||||
|
im_rate_milliseconds: 250
|
||||||
|
public_followup_seconds: 120
|
||||||
15
config/grid-agent.integrated.example.yml
Normal file
15
config/grid-agent.integrated.example.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
schema_version: 1
|
||||||
|
integrated: true
|
||||||
|
split: false
|
||||||
|
llm:
|
||||||
|
endpoint_url: https://llm.example.invalid/v1/chat/completions
|
||||||
|
api_key: <replace-in-private-config>
|
||||||
|
model: <endpoint-model-name>
|
||||||
|
grid:
|
||||||
|
login_url: https://grid.example.invalid/login
|
||||||
|
avatar_name: Service Avatar
|
||||||
|
password: <replace-in-private-config>
|
||||||
|
# These UUIDs are the only users allowed to request privileged mutations.
|
||||||
|
authorized_avatar_uuids:
|
||||||
|
- 00000000-0000-4000-8000-000000000001
|
||||||
|
storage_path: data/grid-agent
|
||||||
18
config/grid-agent.split.example.yml
Normal file
18
config/grid-agent.split.example.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
schema_version: 1
|
||||||
|
integrated: false
|
||||||
|
split: true
|
||||||
|
llm:
|
||||||
|
endpoint_url: https://llm.example.invalid/v1/chat/completions
|
||||||
|
api_key: <replace-in-private-config>
|
||||||
|
model: <endpoint-model-name>
|
||||||
|
grid:
|
||||||
|
login_url: https://grid.example.invalid/login
|
||||||
|
avatar_name: Service Avatar
|
||||||
|
password: <replace-in-private-config>
|
||||||
|
authorized_avatar_uuids:
|
||||||
|
- 00000000-0000-4000-8000-000000000001
|
||||||
|
storage_path: data/grid-agent
|
||||||
|
control:
|
||||||
|
listen: 127.0.0.1:9764
|
||||||
|
operator_token: <replace-in-private-config>
|
||||||
|
observer_token: <replace-in-private-config-with-distinct-value>
|
||||||
@@ -5,11 +5,30 @@ edition.workspace = true
|
|||||||
rust-version.workspace = true
|
rust-version.workspace = true
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
repository.workspace = true
|
repository.workspace = true
|
||||||
description = "Skia codec shims for the MetaCrate LibreMetaverse rewrite"
|
description = "Optional Skia image decoder for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["rust-skia"]
|
||||||
|
skia = ["dep:skia-safe"]
|
||||||
|
rust-skia = ["dep:image-webp", "dep:skia-rs-codec", "skia-rs-codec/gif", "skia-rs-codec/jpeg", "skia-rs-codec/png"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
|
libremetaverse-imaging = { version = "0.0.1", path = "../libremetaverse-imaging", default-features = false }
|
||||||
libremetaverse-types = { path = "../libremetaverse-types" }
|
libremetaverse-types = { version = "0.0.1", path = "../libremetaverse-types" }
|
||||||
|
image-webp = { version = "=0.2.4", optional = true }
|
||||||
|
skia-rs-codec = { version = "=0.3.0", default-features = false, optional = true }
|
||||||
|
|
||||||
|
# rust-skia publishes WebP-capable binary caches with Vulkan on Linux/Windows
|
||||||
|
# and without Vulkan on macOS. Matching those sets avoids an hours-long Skia
|
||||||
|
# source build on every supported desktop target.
|
||||||
|
[target.'cfg(any(target_os = "linux", target_os = "windows"))'.dependencies]
|
||||||
|
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "svg", "textlayout", "vulkan", "webp"], optional = true }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
|
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "svg", "textlayout", "webp"], optional = true }
|
||||||
|
|
||||||
|
[target.'cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))'.dependencies]
|
||||||
|
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "webp"], optional = true }
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|||||||
126
crates/libremetaverse-imaging-skia/README.md
Normal file
126
crates/libremetaverse-imaging-skia/README.md
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# MetaCrate Skia adapter
|
||||||
|
|
||||||
|
This crate implements the pinned `SkiaTextureCodec` behavior at a bounded,
|
||||||
|
project-owned image boundary. The core `libremetaverse-imaging` crate never
|
||||||
|
exposes a `skia-safe` type and never discovers or links Skia.
|
||||||
|
|
||||||
|
## Features and formats
|
||||||
|
|
||||||
|
The default feature set enables the pure-Rust `rust-skia` backend and has no
|
||||||
|
native Google Skia dependency. `SkiaTextureCodec::decode` and
|
||||||
|
`RustSkiaTextureCodec::decode` return a typed `InvalidOperation` error when
|
||||||
|
their respective feature is disabled, while conversion from the checked
|
||||||
|
project-owned `backend::SKBitmap` remains available for tests and callers that
|
||||||
|
already own decoded pixels.
|
||||||
|
|
||||||
|
For a fully Rust implementation, enable:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test -p libremetaverse-imaging-skia
|
||||||
|
```
|
||||||
|
|
||||||
|
`rust-skia` pins [`skia-rs-codec` 0.3.0](https://github.com/rust-skia/skia-rs)
|
||||||
|
with default features disabled and only
|
||||||
|
its pure-Rust PNG, JPEG, and GIF codecs selected. Its `webp` feature is
|
||||||
|
deliberately disabled because that feature selects `libwebp-sys`; WebP is
|
||||||
|
instead decoded by the separately pinned, safe-Rust
|
||||||
|
[`image-webp` 0.2.4](https://github.com/image-rs/image-webp) crate.
|
||||||
|
BMP, ICO, and WBMP are built into `skia-rs-codec`. The resulting normal/build
|
||||||
|
graph has no codec `-sys` crate, C/C++ compilation, CMake, system-library
|
||||||
|
lookup, or binary download.
|
||||||
|
|
||||||
|
The locked transitive codec lines are `png` 0.17.16, `jpeg-decoder` 0.3.2,
|
||||||
|
`jpeg-encoder` 0.6.1 (the upstream JPEG feature couples decode and encode), and
|
||||||
|
`gif` 0.13.3. `skia-rs-codec` also brings its ordinary Rust core, paint, and
|
||||||
|
path crates; their build helpers only select Rust cfgs and compile no native
|
||||||
|
code. A source audit of the locked `skia-rs-*` crates found no unsafe blocks,
|
||||||
|
and `image-webp` declares `forbid(unsafe_code)`. MetaCrate itself continues to
|
||||||
|
compile with workspace `unsafe_code = "forbid"`.
|
||||||
|
|
||||||
|
`RustSkiaTextureCodec` implements the same `ITextureCodec` abstraction and
|
||||||
|
decodes BMP, GIF, ICO, baseline/progressive JPEG, interlaced PNG, WBMP, and
|
||||||
|
lossless/lossy/animated WebP. GIF and WebP return frame one composited on the
|
||||||
|
logical canvas; ICO chooses its largest valid entry. Both Skia features may be
|
||||||
|
enabled together, and each codec remains independently constructible.
|
||||||
|
The graph builds with the workspace Rust 1.97.1 toolchain; both selected direct
|
||||||
|
codecs declare older compatible Rust floors.
|
||||||
|
|
||||||
|
Enable native decoding with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo test -p libremetaverse-imaging-skia --features skia
|
||||||
|
```
|
||||||
|
|
||||||
|
The native `skia` feature decodes the CPU codec formats supported by the pinned
|
||||||
|
rust-skia release: BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP. Input is buffered
|
||||||
|
to at most 64 MiB. Dimensions are rejected before native pixel allocation when
|
||||||
|
they exceed the core 16,777,216-pixel limit, and decoded storage uses checked
|
||||||
|
strides and owned Rust buffers.
|
||||||
|
|
||||||
|
The mapped C# adapter exposes decoding and `SKBitmap`-to-`ManagedImage`
|
||||||
|
conversion only; it has no encoding or resize method. Encoding selection stays
|
||||||
|
with the format-specific imaging APIs, and callers use `ManagedImage`'s checked
|
||||||
|
resize methods after decoding. Premultiplied pixels are converted to straight
|
||||||
|
alpha at this boundary. RGB565, BGRA8888, RGBA8888, RGBA/BGRA1010102, Gray8,
|
||||||
|
Alpha8, row padding, and the reference byte-width fallback retain the pinned
|
||||||
|
C# channel and rounding rules.
|
||||||
|
|
||||||
|
Both paths accept any `ReadWrite + Send` stream and stop buffering after 64
|
||||||
|
MiB plus one sentinel byte. The pure-Rust path probes encoded dimensions before
|
||||||
|
codec pixel allocation and enforces the shared 16,777,216-pixel ceiling; WebP
|
||||||
|
also receives an explicit decoder memory limit. Checked dimensions, strides,
|
||||||
|
buffer sizes, and fallible project-owned allocations turn malformed,
|
||||||
|
truncated, oversized, and allocation failures into typed errors. Decoded rows
|
||||||
|
have a top-left origin and premultiplied native samples are normalized to
|
||||||
|
straight alpha at the shared `ManagedImage` boundary.
|
||||||
|
|
||||||
|
The pure-Rust graph has identical code on Linux, Windows, macOS, and WASM and
|
||||||
|
does not call platform APIs. Checked static fixtures cover top-down/bottom-up
|
||||||
|
BMP, palette/offset GIF, largest-entry ICO, baseline/progressive JPEG,
|
||||||
|
interlaced palette PNG, multibyte WBMP, lossless-alpha/lossy WebP, malformed and
|
||||||
|
oversized inputs, and concurrent decode/drop. Gitea runs the `rust-skia` suite
|
||||||
|
in a dedicated `ubuntu-latest` job that installs no native codec prerequisites.
|
||||||
|
`image-webp` 0.2's animated-canvas blend fast path rounds fully opaque nonzero
|
||||||
|
samples one low; the bounded adapter corrects that single upstream edge so the
|
||||||
|
checked first-frame planes remain byte-identical to native Skia.
|
||||||
|
|
||||||
|
## Binary cache and source builds
|
||||||
|
|
||||||
|
`skia-safe` 0.99.0 downloads an official prebuilt Skia archive when the target
|
||||||
|
and Cargo feature set match a published archive. MetaCrate deliberately selects
|
||||||
|
the published WebP-capable feature sets:
|
||||||
|
|
||||||
|
- Linux and Windows: JPEG, PDF, SVG, text layout, Vulkan, and WebP;
|
||||||
|
- macOS: JPEG, PDF, SVG, text layout, and WebP.
|
||||||
|
|
||||||
|
Vulkan is selected on Linux and Windows only to match the published CPU/WebP
|
||||||
|
archive; this adapter does not create a GPU context or call a platform graphics
|
||||||
|
API. The same feature is therefore usable on macOS, Linux, and Windows without
|
||||||
|
leaking platform-specific behavior.
|
||||||
|
|
||||||
|
Build prerequisites for the supported desktop targets are:
|
||||||
|
|
||||||
|
- Linux: a C++ linker/runtime, `curl`, `pkg-config`, FreeType, and Fontconfig;
|
||||||
|
- macOS: Xcode command-line tools and `curl`;
|
||||||
|
- Windows MSVC: the Rust MSVC toolchain, Visual Studio C++ build tools, and
|
||||||
|
`curl`.
|
||||||
|
|
||||||
|
The build script downloads cache archives from the `rust-skia/skia-binaries`
|
||||||
|
GitHub releases. Pin or mirror `SKIA_BINARIES_URL` in offline/reproducible build
|
||||||
|
environments. `FORCE_SKIA_BINARIES_DOWNLOAD=1` makes a missing archive fail
|
||||||
|
instead of compiling Skia. If no archive matches and that variable is absent,
|
||||||
|
rust-skia falls back to a source build, which additionally requires Python 3,
|
||||||
|
Ninja, and an LLVM/Clang toolchain. `FORCE_SKIA_BUILD=1` selects that path
|
||||||
|
explicitly.
|
||||||
|
|
||||||
|
## Licensing and redistribution
|
||||||
|
|
||||||
|
`skia-safe` and rust-skia's bindings are MIT licensed; the linked Skia library
|
||||||
|
is BSD-3-Clause licensed. Official binary-cache archives contain compiled Skia.
|
||||||
|
Products that redistribute the resulting native artifacts must preserve the
|
||||||
|
applicable MIT and BSD notices and audit the exact archive they ship.
|
||||||
|
|
||||||
|
`skia-rs-codec` is MIT OR Apache-2.0 and `image-webp` is MIT OR Apache-2.0.
|
||||||
|
They are ordinary Rust source dependencies recorded in `Cargo.lock`; generated
|
||||||
|
dependency notices and the distribution manifest bind their crates.io checksums
|
||||||
|
and license texts for source and binary redistribution.
|
||||||
134
crates/libremetaverse-imaging-skia/src/backend.rs
Normal file
134
crates/libremetaverse-imaging-skia/src/backend.rs
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
//! Project-owned representation of the mapped `SkiaSharp.SKBitmap` boundary.
|
||||||
|
|
||||||
|
use crate::Error;
|
||||||
|
use libremetaverse_imaging::DEFAULT_MAX_PIXELS;
|
||||||
|
|
||||||
|
/// Pixel formats used by the pinned `SkiaTextureCodec` implementation.
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||||
|
pub enum SKColorType {
|
||||||
|
Rgb565,
|
||||||
|
Bgra8888,
|
||||||
|
Rgba8888,
|
||||||
|
Rgba1010102,
|
||||||
|
Bgra1010102,
|
||||||
|
Gray8,
|
||||||
|
Alpha8,
|
||||||
|
/// Another Skia format handled by the reference's byte-width fallback.
|
||||||
|
Other {
|
||||||
|
bytes_per_pixel: usize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SKColorType {
|
||||||
|
const fn storage_bytes(self) -> usize {
|
||||||
|
match self {
|
||||||
|
Self::Rgb565 => 2,
|
||||||
|
Self::Bgra8888 | Self::Rgba8888 | Self::Rgba1010102 | Self::Bgra1010102 => 4,
|
||||||
|
Self::Gray8 | Self::Alpha8 => 1,
|
||||||
|
Self::Other { bytes_per_pixel } => bytes_per_pixel,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Alpha representation attached to bitmap samples.
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||||
|
pub enum SKAlphaType {
|
||||||
|
Opaque,
|
||||||
|
Premul,
|
||||||
|
Unpremul,
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Owned, checked bitmap used by the fixed mapped signature.
|
||||||
|
///
|
||||||
|
/// This deliberately does not expose a Skia allocation or pointer. Feature-
|
||||||
|
/// enabled decoding copies the native pixmap into this bounded Rust buffer
|
||||||
|
/// before conversion to the core imaging abstraction.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct SKBitmap {
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
row_bytes: usize,
|
||||||
|
color_type: SKColorType,
|
||||||
|
alpha_type: SKAlphaType,
|
||||||
|
pixels: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SKBitmap {
|
||||||
|
/// Creates a bitmap with an explicit row stride and owned pixels.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::Argument`] for invalid dimensions, formats, strides,
|
||||||
|
/// lengths, or over-limit storage.
|
||||||
|
pub fn new(
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
row_bytes: usize,
|
||||||
|
color_type: SKColorType,
|
||||||
|
alpha_type: SKAlphaType,
|
||||||
|
pixels: Vec<u8>,
|
||||||
|
) -> Result<Self, Error> {
|
||||||
|
let width_usize = usize::try_from(width).map_err(|_| Error::Argument)?;
|
||||||
|
let height_usize = usize::try_from(height).map_err(|_| Error::Argument)?;
|
||||||
|
let pixel_count = width_usize
|
||||||
|
.checked_mul(height_usize)
|
||||||
|
.filter(|count| *count > 0 && *count <= DEFAULT_MAX_PIXELS)
|
||||||
|
.ok_or(Error::Argument)?;
|
||||||
|
let storage_bytes = color_type.storage_bytes();
|
||||||
|
if storage_bytes == 0 || storage_bytes > 16 {
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
let packed_row = width_usize
|
||||||
|
.checked_mul(storage_bytes)
|
||||||
|
.ok_or(Error::Argument)?;
|
||||||
|
if row_bytes < packed_row {
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
let required = row_bytes
|
||||||
|
.checked_mul(height_usize.saturating_sub(1))
|
||||||
|
.and_then(|prefix| prefix.checked_add(packed_row))
|
||||||
|
.ok_or(Error::Argument)?;
|
||||||
|
if pixels.len() < required
|
||||||
|
|| pixels.len()
|
||||||
|
> pixel_count
|
||||||
|
.checked_mul(16)
|
||||||
|
.and_then(|size| size.checked_add(row_bytes))
|
||||||
|
.ok_or(Error::Argument)?
|
||||||
|
{
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
row_bytes,
|
||||||
|
color_type,
|
||||||
|
alpha_type,
|
||||||
|
pixels,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) const fn width(&self) -> i32 {
|
||||||
|
self.width
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) const fn height(&self) -> i32 {
|
||||||
|
self.height
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) const fn row_bytes(&self) -> usize {
|
||||||
|
self.row_bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) const fn color_type(&self) -> SKColorType {
|
||||||
|
self.color_type
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) const fn alpha_type(&self) -> SKAlphaType {
|
||||||
|
self.alpha_type
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn pixels(&self) -> &[u8] {
|
||||||
|
&self.pixels
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,30 +6,22 @@
|
|||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Imaging.Skia.SkiaTextureCodec`.
|
/// C# type: `T:LibreMetaverse.Imaging.Skia.SkiaTextureCodec`.
|
||||||
pub struct SkiaTextureCodec;
|
///
|
||||||
impl SkiaTextureCodec {
|
/// Native Rust mapping of C# `LibreMetaverse.Imaging.Skia.SkiaTextureCodec` using decision
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor`.
|
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||||
pub fn new() -> Result<Self, crate::Error> {
|
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor`.
|
||||||
libremetaverse_types::not_implemented(
|
///
|
||||||
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor",
|
/// C# signature: `LibreMetaverse.Imaging.Skia.SkiaTextureCodec()`.
|
||||||
)
|
/// Mapping contract: ownership `none`; async `sync`;
|
||||||
}
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)`.
|
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)`.
|
||||||
pub fn decode(
|
///
|
||||||
&self,
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream stream)`.
|
||||||
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
|
/// Mapping contract: ownership `shared_self,owned`; async `sync`;
|
||||||
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
libremetaverse_types::not_implemented(
|
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)`.
|
||||||
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)",
|
///
|
||||||
)
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap bitmap)`.
|
||||||
}
|
/// Mapping contract: ownership `owned`; async `sync`;
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)`.
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
pub fn to_managed_image(
|
pub use crate::skia_codec::SkiaTextureCodec;
|
||||||
bitmap: libremetaverse_imaging_skia::backend::SKBitmap,
|
|
||||||
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
|
|
||||||
libremetaverse_types::not_implemented(
|
|
||||||
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec {}
|
|
||||||
|
|||||||
@@ -1,14 +1,36 @@
|
|||||||
//! Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`.
|
//! Optional Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`.
|
||||||
|
//!
|
||||||
|
//! The default `rust-skia` backend provides bounded pure-Rust `BMP`, `GIF`,
|
||||||
|
//! `ICO`, `JPEG`, `PNG`, `WBMP`, and `WebP` decoding. Enable the optional
|
||||||
|
//! `skia` feature when native Google Skia is specifically required. See the
|
||||||
|
//! crate README for native cache, source-build, licensing, and deployment details.
|
||||||
|
|
||||||
extern crate self as libremetaverse_imaging_skia;
|
extern crate self as libremetaverse_imaging_skia;
|
||||||
|
|
||||||
pub mod backend {
|
pub mod backend;
|
||||||
/// Project-owned bitmap boundary; no `SkiaSharp` API is copied.
|
|
||||||
pub struct SKBitmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod generated;
|
mod generated;
|
||||||
|
mod skia_codec;
|
||||||
|
|
||||||
pub use generated::*;
|
pub use generated::*;
|
||||||
pub use libremetaverse_imaging as imaging;
|
pub use libremetaverse_imaging as imaging;
|
||||||
pub use libremetaverse_types::NotImplemented as Error;
|
pub use libremetaverse_types::Error;
|
||||||
|
pub use skia_codec::RustSkiaTextureCodec;
|
||||||
|
|
||||||
|
impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec {
|
||||||
|
fn decode(
|
||||||
|
&self,
|
||||||
|
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
|
||||||
|
) -> Result<libremetaverse_imaging::ManagedImage, Error> {
|
||||||
|
Self::decode(self, stream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl libremetaverse_imaging::ITextureCodec for RustSkiaTextureCodec {
|
||||||
|
fn decode(
|
||||||
|
&self,
|
||||||
|
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
|
||||||
|
) -> Result<libremetaverse_imaging::ManagedImage, Error> {
|
||||||
|
Self::decode(self, stream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
1411
crates/libremetaverse-imaging-skia/src/skia_codec.rs
Normal file
1411
crates/libremetaverse-imaging-skia/src/skia_codec.rs
Normal file
File diff suppressed because it is too large
Load Diff
29
crates/libremetaverse-imaging-skia/tests/fixtures/README.md
vendored
Normal file
29
crates/libremetaverse-imaging-skia/tests/fixtures/README.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Rust codec fixtures
|
||||||
|
|
||||||
|
The tests decode these hexadecimal files into their exact checked-in bytes; no
|
||||||
|
image is generated while tests run. Unless noted below, fixtures come from the
|
||||||
|
BSD-3-Clause Skia test resources vendored by `skia-bindings 0.99.0`.
|
||||||
|
|
||||||
|
| Fixture | SHA-256 |
|
||||||
|
| --- | --- |
|
||||||
|
| `alpha.webp` | `8b09993d8ffc9a9ec4e7f5f26a1c126cf265c37b0d63c0c5be2506e20dbc6fea` |
|
||||||
|
| `animated.webp` | `292753f066add623af1e30bbeeca58f15b3d6d1052e12b13e30f21f8d3c14505` |
|
||||||
|
| `baseline.jpg` | `4e45048dbe3078943eb364221a9757df9b9845b80e795ccdc944f1c18b5e221b` |
|
||||||
|
| `bottom-up.bmp` | `d9cc5fff9e8e351727ad4519236ae46eaf37f8007dad5cdb8619fcd67ec68903` |
|
||||||
|
| `gray-alpha.png` | `377a67510b4ccc74cdcce14847b02035e75ccab36e9d8e00586c4c24d1ae385a` |
|
||||||
|
| `gray.png` | `85b19fcda452d6cbf02f570c353cfa9e47c29237f2fc8f0114deb6cd0b23f97a` |
|
||||||
|
| `interlaced-palette.png` | `6283a61b1f7344c0cfa741076d6aed4a16a6bc5582e81db8dd7374a34230b0df` |
|
||||||
|
| `palette-offset.gif` | `32d3409a79b75614ef385354d54f148f08856f8e9ce0d55054582ff7f40f4461` |
|
||||||
|
| `progressive.jpg` | `d07a9815dc792543c16b796ec7729c19d6a29e7d9b4d0bbab50f4ef210be7767` |
|
||||||
|
| `rgb.png` | `ecea1ef4a001a999ce9b82d18abf47401eb92998708b306b6c9a8ac3a6a9a2c8` |
|
||||||
|
| `rgba.png` | `756a03364c02e3c9f85d6f4029eb3cef2488c081dc537d46e102bebcb9e02732` |
|
||||||
|
| `straight-alpha.png` | `5a647404fa5289da777b1bb9e1dcfe20027262f992a214f38efaecc3da0e08a4` |
|
||||||
|
|
||||||
|
`lossy-red.webp` was produced once with FFmpeg 5.1.8/libwebp from a solid
|
||||||
|
8x8 red source (`-c:v libwebp -lossless 0 -quality 80`) and has SHA-256
|
||||||
|
`7e3aaf1a442b6e69f7706ee5afe0aeacb2d096e384dbb63e792421fe2449cfe8`.
|
||||||
|
|
||||||
|
The remaining tiny BMP, ICO, WBMP, and lossless RGB WebP files are original
|
||||||
|
MetaCrate byte-level fixtures. Their reviewed bytes are intentionally readable
|
||||||
|
in the `.hex` files and exercise header fields, row layout, masks, multi-byte
|
||||||
|
integers, and multi-entry selection directly.
|
||||||
3
crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex
vendored
Normal file
3
crates/libremetaverse-imaging-skia/tests/fixtures/alpha.webp.hex
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
524946461e000000574542505650384c110000002f0000001007d0fffef7
|
||||||
|
bf7f8188e87f0000
|
||||||
|
|
||||||
12
crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex
vendored
Normal file
12
crates/libremetaverse-imaging-skia/tests/fixtures/animated.webp.hex
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
524946464c01000057454250565038580a000000120000000a00001c0000
|
||||||
|
414e494d060000000000ffff0000414e4d465a0000000000000000000a00
|
||||||
|
001c0000e80300005650384c420000002f0a0007001720164ce6ff849cc6
|
||||||
|
388ee3fc078e0645b1ad54573b50821444f0db8728aec9f9562688e8bf80
|
||||||
|
a0c8013bd09c2c5e759505ce8f25232ee33615170c0d414e4d465a000000
|
||||||
|
010000050000060000100000f40100005650384c420000002f0600040017
|
||||||
|
201048525e647e814092f222330b049298079979fe037f15288a6ca749a3
|
||||||
|
de31819aee2fc70c32898988fe4f008092d5d79d5525f8079e709b3b6120
|
||||||
|
414e4d465c0000000100000100000600000f0000e80300005650384c4400
|
||||||
|
00002f06c0030017201048621e647e814092f222330b049298079979fe03
|
||||||
|
7f15286a1bc9b9defe4362d05ce5b7cfd5c23c1411fd4f093a8c46a30e09
|
||||||
|
ee4f7ff3c3c3c3cdd303
|
||||||
11
crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex
vendored
Normal file
11
crates/libremetaverse-imaging-skia/tests/fixtures/baseline.jpg.hex
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
ffd8ffe000104a46494600010101004800480000ffdb004300100b0c0e0c
|
||||||
|
0a100e0d0e1211101318281a181616183123251d283a333d3c3933383740
|
||||||
|
485c4e404457453738506d51575f626768673e4d71797064785c656763ff
|
||||||
|
db0043011112121815182f1a1a2f63423842636363636363636363636363
|
||||||
|
636363636363636363636363636363636363636363636363636363636363
|
||||||
|
6363636363636363ffc00011080008000803012200021101031101ffc400
|
||||||
|
1500010100000000000000000000000000000003ffc4001e100002010403
|
||||||
|
01000000000000000000000102000311213112224171ffc4001501010100
|
||||||
|
000000000000000000000000000304ffc4001a1101000203010000000000
|
||||||
|
00000000000001000203213141ffda000c03010002110311003f009d4e6a
|
||||||
|
8c15b354b2d455eda6b922c32367dd7db2222d6c9a2558c7c5393fffd9
|
||||||
2
crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex
vendored
Normal file
2
crates/libremetaverse-imaging-skia/tests/fixtures/bgrx32.bmp.hex
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
424d3e000000000000003600000028000000020000000100000001002000000000000800000000000000000000000000000000000000
|
||||||
|
0000ff0000ff0000
|
||||||
10
crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex
vendored
Normal file
10
crates/libremetaverse-imaging-skia/tests/fixtures/bottom-up.bmp.hex
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
424df6000000000000003600000028000000080000000800000001001800
|
||||||
|
00000000c0000000130b0000130b000000000000000000002272b0f8232e
|
||||||
|
d989f03857b32260a8fe403371fe95df716a63fea76b954ce022bce472b2
|
||||||
|
4a9f121345e342373d0a19bd98ac6f271d9411e45f83b2fb996ed8629116
|
||||||
|
8c1271b4ca39f93d27831ab4c312f867abcc184203a7b97d481082b44afe
|
||||||
|
5221c5d6cc78abb4dc7dd209f300ca475d60b26f44466e5742f73ba8028f
|
||||||
|
df09557e02c78aaa24966c888154628936400ea6bdb61dc088d62bd46293
|
||||||
|
b241c6decea5ba6e60f34b8f70a5bb5d5f39395ce266761927ba3cb0fcde
|
||||||
|
7438c19300fa
|
||||||
|
|
||||||
5
crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex
vendored
Normal file
5
crates/libremetaverse-imaging-skia/tests/fixtures/gray-alpha.png.hex
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
89504e470d0a1a0a0000000d4948445200000020000000200804000000d9
|
||||||
|
73b27f0000000467414d41000186a031e8965f0000003549444154488963
|
||||||
|
fccfc0c001859c683431229c2cdf1928032c3f86be01a361301a06543160
|
||||||
|
341047c3802a068c06e2681850c30000df2a207da0bf7158000000004945
|
||||||
|
4e44ae426082
|
||||||
5
crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex
vendored
Normal file
5
crates/libremetaverse-imaging-skia/tests/fixtures/gray.png.hex
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
89504e470d0a1a0a0000000d494844520000002000000020080000000056
|
||||||
|
1125280000000467414d41000186a031e8965f0000004149444154388d63
|
||||||
|
646024001408c8b30c05058c0f0829f8f71f3f6079301c1430ca11906764
|
||||||
|
a2795c0c06058c8ff0cafeffcff887e67131181430cae0956564040050e5
|
||||||
|
fe7171a90b240000000049454e44ae426082
|
||||||
5
crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex
vendored
Normal file
5
crates/libremetaverse-imaging-skia/tests/fixtures/interlaced-palette.png.hex
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
89504e470d0a1a0a0000000d49484452000000200000002001030000013e
|
||||||
|
b3d82100000006504c5445eeff222266ff6c1ad226000000294944415408
|
||||||
|
d7636080820f50b80a0a43d1b0b131c39933d849088348363f1040880f40
|
||||||
|
00212810030009ba422d1cbe5f9a0000000049454e44ae426082
|
||||||
|
|
||||||
4
crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex
vendored
Normal file
4
crates/libremetaverse-imaging-skia/tests/fixtures/lossy-red.webp.hex
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
524946463c000000574542505650382030000000d001009d012a08000800
|
||||||
|
01402625a00274ba01f80003b000fef36997fe6c0ae6b9f7fbffe9707e97
|
||||||
|
07e9707fe9480000
|
||||||
|
|
||||||
8
crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex
vendored
Normal file
8
crates/libremetaverse-imaging-skia/tests/fixtures/multi.ico.hex
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
000001000200
|
||||||
|
01010000010020002c00000026000000
|
||||||
|
02020000010020003800000052000000
|
||||||
|
28000000010000000200000001002000000000000400000000000000000000000000000000000000
|
||||||
|
0000ffff
|
||||||
|
28000000020000000400000001002000000000001000000000000000000000000000000000000000
|
||||||
|
ff0000ffffffffff0000ffff00ff00ff
|
||||||
|
|
||||||
3
crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex
vendored
Normal file
3
crates/libremetaverse-imaging-skia/tests/fixtures/multibyte.wbmp.hex
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
0000810201
|
||||||
|
ffffffffffffffffffffffffffffffff80
|
||||||
|
|
||||||
7
crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex
vendored
Normal file
7
crates/libremetaverse-imaging-skia/tests/fixtures/palette-offset.gif.hex
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
474946383961040002008400000000001000002000003000004000005000
|
||||||
|
00600000700000800000900000a00000b00000c00000d00000e00000f000
|
||||||
|
000000000000110000220000330000440000550000660000770000880000
|
||||||
|
990000aa0000bb0000cc0000dd0000ee0000ff21f904000a0000002c0000
|
||||||
|
00000400020000070908090a0b0c0d0e0f810021f9040114001a002c0100
|
||||||
|
0100030001000007041f1a1581003b
|
||||||
|
|
||||||
26
crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex
vendored
Normal file
26
crates/libremetaverse-imaging-skia/tests/fixtures/progressive.jpg.hex
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
ffd8ffe000104a46494600010101004800480000ffdb0043000806060706
|
||||||
|
05080707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20
|
||||||
|
242e2720222c231c1c2837292c30313434341f27393d38323c2e333432ff
|
||||||
|
c2000b080080008001011100ffc400150001010000000000000000000000
|
||||||
|
0000000306ffda0008010100000001824444444444444448744444444444
|
||||||
|
444487444444444444444874444444444444448744444444444444487444
|
||||||
|
444444444444874444444444444448744444444444444487444444444444
|
||||||
|
444874444444444444448744444444444444487444444444444444874444
|
||||||
|
444444444448744444444444444487444444444444444874444444444444
|
||||||
|
44ffc40014100100000000000000000000000000000080ffda0008010100
|
||||||
|
010502007fffc40014100100000000000000000000000000000080ffda00
|
||||||
|
08010100063f02007fffc400151001010000000000000000000000000000
|
||||||
|
0100ffda0008010100013f21082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082082082082082
|
||||||
|
082082082082082082082082082082082082082082082082ffda00080101
|
||||||
|
000000100000000000000000000000000000000000000000000000000000
|
||||||
|
000000000000ffc40014100100000000000000000000000000000080ffda
|
||||||
|
0008010100013f10007fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
|
||||||
|
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
|
||||||
|
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
|
||||||
|
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
|
||||||
|
ff00ff00ff00ff00ff00ff00ff00ff00ff00ffd9
|
||||||
2
crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex
vendored
Normal file
2
crates/libremetaverse-imaging-skia/tests/fixtures/rgb-lossless.webp.hex
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
524946461c000000574542505650384c0f0000002f014000000710f58ffe
|
||||||
|
0722a2ff0100
|
||||||
5
crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex
vendored
Normal file
5
crates/libremetaverse-imaging-skia/tests/fixtures/rgb.png.hex
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
89504e470d0a1a0a0000000d4948445200000020000000200802000000fc
|
||||||
|
18eda30000000467414d41000186a031e8965f00000048494441544889ed
|
||||||
|
d5c10900300c024085ec91fdb772133b442bf4a1f8cee12bb40d043b800a
|
||||||
|
14f81ca0ede47d4c784081020f4a871fc284071428f0a0743823a94081bb
|
||||||
|
7077a3c00182b1f95e3ed793980000000049454e44ae426082
|
||||||
2
crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex
vendored
Normal file
2
crates/libremetaverse-imaging-skia/tests/fixtures/rgb555.bmp.hex
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
424d3a000000000000003600000028000000020000000100000001001000000000000400000000000000000000000000000000000000
|
||||||
|
007ce003
|
||||||
7
crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex
vendored
Normal file
7
crates/libremetaverse-imaging-skia/tests/fixtures/rgba.png.hex
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
89504e470d0a1a0a0000000d494844520000002000000020080600000073
|
||||||
|
7a7af40000000467414d41000186a031e8965f0000006f494441545885ed
|
||||||
|
d6310a80300c46e12764684fa1f73f55048f21c4ddc545781d52e85028fc
|
||||||
|
1f4d28d98a01305e7b7e9cffba33831d75054703ca06a8f90d58a0074e35
|
||||||
|
1e227d805c8254e31bb0420f5cdc2e0079208892ffe2a00136a07b400794
|
||||||
|
3c1004d900195036407f011bf00052201a9cd68fe9670000000049454e44
|
||||||
|
ae426082
|
||||||
1
crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex
vendored
Normal file
1
crates/libremetaverse-imaging-skia/tests/fixtures/small.wbmp.hex
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
000002028040
|
||||||
6
crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex
vendored
Normal file
6
crates/libremetaverse-imaging-skia/tests/fixtures/straight-alpha.png.hex
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
89504e470d0a1a0a0000000d49484452000000010000000108060000001f
|
||||||
|
15c489000000017352474200aece1ce900000006624b474400ff00ff00ff
|
||||||
|
a0bda793000000097048597300000b1300000b1301009a9c180000000774
|
||||||
|
494d4507de040313163ac721af9d0000001974455874436f6d6d656e7400
|
||||||
|
4372656174656420776974682047494d5057810e170000000d4944415408
|
||||||
|
d763f8ffff7f3d00097b037d178855c50000000049454e44ae426082
|
||||||
3
crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex
vendored
Normal file
3
crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-bottom-up.bmp.hex
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
424d46000000000000003600000028000000020000000200000001001800000000001000000000000000000000000000000000000000
|
||||||
|
ff0000ffffff00000000ff00ff000000
|
||||||
|
|
||||||
3
crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex
vendored
Normal file
3
crates/libremetaverse-imaging-skia/tests/fixtures/two-by-two-top-down.bmp.hex
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
424d4600000000000000360000002800000002000000feffffff01001800000000001000000000000000000000000000000000000000
|
||||||
|
0000ff00ff000000ff0000ffffff0000
|
||||||
|
|
||||||
@@ -7,8 +7,22 @@ license.workspace = true
|
|||||||
repository.workspace = true
|
repository.workspace = true
|
||||||
description = "Texture codec abstractions for the MetaCrate LibreMetaverse rewrite"
|
description = "Texture codec abstractions for the MetaCrate LibreMetaverse rewrite"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["rust-j2k"]
|
||||||
|
jpeg2000 = ["dep:libremetaverse-openjpeg"]
|
||||||
|
rust-j2k = ["dep:j2k"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libremetaverse-types = { path = "../libremetaverse-types" }
|
libremetaverse-types = { version = "0.0.1", path = "../libremetaverse-types" }
|
||||||
|
libremetaverse-openjpeg = { version = "0.0.1", path = "../libremetaverse-openjpeg", optional = true }
|
||||||
|
j2k = { version = "=0.8.1", optional = true }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
stats_alloc = "0.1.10"
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "image_pipeline"
|
||||||
|
harness = false
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|||||||
48
crates/libremetaverse-imaging/benches/image_pipeline.rs
Normal file
48
crates/libremetaverse-imaging/benches/image_pipeline.rs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
use std::alloc::System;
|
||||||
|
use std::hint::black_box;
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
use libremetaverse_imaging::{ManagedImage, ManagedImageImageChannels};
|
||||||
|
use stats_alloc::{INSTRUMENTED_SYSTEM, Region, StatsAlloc};
|
||||||
|
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOCATOR: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
const INPUT_SIDE: i32 = 2_048;
|
||||||
|
const OUTPUT_SIDE: i32 = 1_024;
|
||||||
|
|
||||||
|
let channels = ManagedImageImageChannels(
|
||||||
|
ManagedImageImageChannels::COLOR.0 | ManagedImageImageChannels::ALPHA.0,
|
||||||
|
);
|
||||||
|
let mut source = ManagedImage::new(INPUT_SIDE, INPUT_SIDE, channels)
|
||||||
|
.expect("large benchmark image must fit the documented pixel bound");
|
||||||
|
for (index, red) in source.red.iter_mut().enumerate() {
|
||||||
|
*red = u8::try_from(index & 0xff).expect("masked sample");
|
||||||
|
}
|
||||||
|
source.green.fill(97);
|
||||||
|
source.blue.fill(193);
|
||||||
|
source.alpha.fill(255);
|
||||||
|
|
||||||
|
// Warm the validation path before measuring the owned clone, resize, and export pipeline.
|
||||||
|
source.validate().expect("valid benchmark image");
|
||||||
|
let allocation_region = Region::new(ALLOCATOR);
|
||||||
|
let started = Instant::now();
|
||||||
|
let mut resized = source.clone().expect("bounded image clone");
|
||||||
|
resized
|
||||||
|
.resize_bilinear(OUTPUT_SIDE, OUTPUT_SIDE)
|
||||||
|
.expect("bounded bilinear resize");
|
||||||
|
let rgba = resized.export_raw().expect("bounded RGBA export");
|
||||||
|
let elapsed = started.elapsed();
|
||||||
|
let allocation_stats = allocation_region.change();
|
||||||
|
|
||||||
|
assert_eq!((resized.width, resized.height), (OUTPUT_SIDE, OUTPUT_SIDE));
|
||||||
|
assert_eq!(rgba.len(), 4 * OUTPUT_SIDE as usize * OUTPUT_SIDE as usize);
|
||||||
|
black_box((resized, rgba));
|
||||||
|
println!(
|
||||||
|
"image pipeline: {INPUT_SIDE}x{INPUT_SIDE} -> {OUTPUT_SIDE}x{OUTPUT_SIDE} in {elapsed:?}, {} allocations, {} reallocations, {} bytes allocated",
|
||||||
|
allocation_stats.allocations,
|
||||||
|
allocation_stats.reallocations,
|
||||||
|
allocation_stats.bytes_allocated,
|
||||||
|
);
|
||||||
|
}
|
||||||
298
crates/libremetaverse-imaging/src/codec.rs
Normal file
298
crates/libremetaverse-imaging/src/codec.rs
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
//! Project-owned boundaries for JPEG 2000 codec types exposed by the C# API.
|
||||||
|
|
||||||
|
use crate::{DEFAULT_MAX_PIXELS, Error, ManagedImage};
|
||||||
|
use std::any::Any;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
/// A type-erased decoded image returned by an image creator.
|
||||||
|
pub trait IImage: Any + Debug + Send + Sync {
|
||||||
|
/// Returns the concrete image wrapper for checked downcasting.
|
||||||
|
fn as_any(&self) -> &dyn Any;
|
||||||
|
|
||||||
|
/// Returns the already-created managed image when this is a compatible
|
||||||
|
/// decode target.
|
||||||
|
fn as_managed_image(&self) -> Option<&ManagedImage> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Marker corresponding to `CoreJ2K`'s image-creator boundary.
|
||||||
|
pub trait IImageCreator: Send + Sync {}
|
||||||
|
|
||||||
|
/// Typed marker corresponding to `CoreJ2K`'s generic image creator.
|
||||||
|
#[derive(Clone, Copy, Debug, Default)]
|
||||||
|
pub struct ImageCreator<T>(pub PhantomData<T>);
|
||||||
|
|
||||||
|
/// One decoded JPEG 2000 component at its original integer precision.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct InterleavedComponent {
|
||||||
|
precision: u8,
|
||||||
|
signed: bool,
|
||||||
|
alpha: bool,
|
||||||
|
samples: Vec<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InterleavedComponent {
|
||||||
|
/// Creates a checked component without reducing its sample precision.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::Argument`] for precision outside 1 through 31 bits or
|
||||||
|
/// for samples outside the declared signed or unsigned range.
|
||||||
|
pub fn new(precision: u8, signed: bool, alpha: bool, samples: Vec<i32>) -> Result<Self, Error> {
|
||||||
|
if !(1..=31).contains(&precision) {
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
let (minimum, maximum) = component_range(precision, signed);
|
||||||
|
if samples
|
||||||
|
.iter()
|
||||||
|
.any(|sample| i64::from(*sample) < minimum || i64::from(*sample) > maximum)
|
||||||
|
{
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
precision,
|
||||||
|
signed,
|
||||||
|
alpha,
|
||||||
|
samples,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Declared component precision in bits.
|
||||||
|
#[must_use]
|
||||||
|
pub const fn precision(&self) -> u8 {
|
||||||
|
self.precision
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether component samples use signed representation.
|
||||||
|
#[must_use]
|
||||||
|
pub const fn is_signed(&self) -> bool {
|
||||||
|
self.signed
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether the container marks this component as alpha.
|
||||||
|
#[must_use]
|
||||||
|
pub const fn is_alpha(&self) -> bool {
|
||||||
|
self.alpha
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Original integer samples, in top-left row-major order.
|
||||||
|
#[must_use]
|
||||||
|
pub fn samples(&self) -> &[i32] {
|
||||||
|
&self.samples
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A bounded decoded image retaining component precision and order.
|
||||||
|
///
|
||||||
|
/// The historical external type calls this representation interleaved, while
|
||||||
|
/// its public conversion API is component-oriented. Keeping the components in
|
||||||
|
/// separate owned planes avoids a second full-image allocation and retains the
|
||||||
|
/// original JPEG 2000 integer samples until byte conversion is requested.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct InterleavedImage {
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
components: Vec<InterleavedComponent>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl InterleavedImage {
|
||||||
|
/// Creates a checked decoded component image.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::Argument`] for invalid/over-limit dimensions, zero or
|
||||||
|
/// more than five components, or a plane whose size differs from
|
||||||
|
/// `width * height`.
|
||||||
|
pub fn new(
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
components: Vec<InterleavedComponent>,
|
||||||
|
) -> Result<Self, Error> {
|
||||||
|
let pixels = checked_pixels(width, height)?;
|
||||||
|
if components.is_empty()
|
||||||
|
|| components.len() > 5
|
||||||
|
|| components
|
||||||
|
.iter()
|
||||||
|
.any(|component| component.samples.len() != pixels)
|
||||||
|
{
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
pixels
|
||||||
|
.checked_mul(components.len())
|
||||||
|
.filter(|samples| *samples <= DEFAULT_MAX_PIXELS * 5)
|
||||||
|
.ok_or(Error::Argument)?;
|
||||||
|
Ok(Self {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
components,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decoded width after any discard-level reduction.
|
||||||
|
#[must_use]
|
||||||
|
pub const fn width(&self) -> i32 {
|
||||||
|
self.width
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decoded height after any discard-level reduction.
|
||||||
|
#[must_use]
|
||||||
|
pub const fn height(&self) -> i32 {
|
||||||
|
self.height
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Number of decoded components in codestream order.
|
||||||
|
#[must_use]
|
||||||
|
pub fn number_of_components(&self) -> usize {
|
||||||
|
self.components.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Component metadata and original samples.
|
||||||
|
#[must_use]
|
||||||
|
pub fn components(&self) -> &[InterleavedComponent] {
|
||||||
|
&self.components
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Scales one component into an 8-bit plane using CoreJ2K-compatible full
|
||||||
|
/// range conversion.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::IndexOutOfRange`] for an invalid component index and
|
||||||
|
/// [`Error::Argument`] when `destination` is not exactly one image plane.
|
||||||
|
pub fn to_component_bytes(
|
||||||
|
&self,
|
||||||
|
component_index: usize,
|
||||||
|
destination: &mut [u8],
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let component = self
|
||||||
|
.components
|
||||||
|
.get(component_index)
|
||||||
|
.ok_or(Error::IndexOutOfRange)?;
|
||||||
|
if destination.len() != component.samples.len() {
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
for (destination, sample) in destination.iter_mut().zip(&component.samples) {
|
||||||
|
*destination = scale_sample(*sample, component.precision, component.signed);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Encode-side sample source corresponding to `CoreJ2K`'s block image source.
|
||||||
|
pub trait BlkImgDataSrc: Debug + Send + Sync {
|
||||||
|
/// Image width.
|
||||||
|
fn width(&self) -> i32;
|
||||||
|
/// Image height.
|
||||||
|
fn height(&self) -> i32;
|
||||||
|
/// Number of presented components.
|
||||||
|
fn number_of_components(&self) -> usize;
|
||||||
|
/// Nominal range bits for one component.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
|
||||||
|
fn nominal_range_bits(&self, component_index: usize) -> Result<u8, Error>;
|
||||||
|
/// Fixed-point fractional bits for one component.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
|
||||||
|
fn fixed_point(&self, component_index: usize) -> Result<u8, Error>;
|
||||||
|
/// Whether one presented component is signed at the source.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
|
||||||
|
fn is_original_signed(&self, component_index: usize) -> Result<bool, Error>;
|
||||||
|
/// Returns a checked top-left row-major rectangle with the source DC offset
|
||||||
|
/// applied, exactly as `CoreJ2K` expects.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns a typed index or argument error for an invalid component or
|
||||||
|
/// rectangle.
|
||||||
|
fn component_block(
|
||||||
|
&self,
|
||||||
|
component_index: usize,
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
) -> Result<Vec<i32>, Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn checked_pixels(width: i32, height: i32) -> Result<usize, Error> {
|
||||||
|
let width = usize::try_from(width).map_err(|_| Error::Argument)?;
|
||||||
|
let height = usize::try_from(height).map_err(|_| Error::Argument)?;
|
||||||
|
if width == 0 || height == 0 {
|
||||||
|
return Err(Error::Argument);
|
||||||
|
}
|
||||||
|
width
|
||||||
|
.checked_mul(height)
|
||||||
|
.filter(|pixels| *pixels <= DEFAULT_MAX_PIXELS)
|
||||||
|
.ok_or(Error::Argument)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn component_range(precision: u8, signed: bool) -> (i64, i64) {
|
||||||
|
if signed {
|
||||||
|
let magnitude = 1_i64 << (precision - 1);
|
||||||
|
(-magnitude, magnitude - 1)
|
||||||
|
} else {
|
||||||
|
(0, (1_i64 << precision) - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn scale_sample(sample: i32, precision: u8, signed: bool) -> u8 {
|
||||||
|
if signed {
|
||||||
|
let old_max = 1_i64 << (precision - 1);
|
||||||
|
let scaled = (i64::from(sample) * 128) / old_max + 128;
|
||||||
|
u8::try_from(scaled.clamp(0, 255)).unwrap_or_default()
|
||||||
|
} else {
|
||||||
|
let old_max = (1_u64 << precision) - 1;
|
||||||
|
let scaled = (u64::try_from(sample).unwrap_or_default() * 255) / old_max;
|
||||||
|
u8::try_from(scaled).unwrap_or(u8::MAX)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn component_conversion_preserves_precision_and_signed_range() {
|
||||||
|
let unsigned = InterleavedComponent::new(16, false, false, vec![0, 32_768, 65_535])
|
||||||
|
.expect("16-bit component");
|
||||||
|
let signed = InterleavedComponent::new(8, true, false, vec![-128, 0, 127])
|
||||||
|
.expect("signed component");
|
||||||
|
let unsigned = InterleavedImage::new(3, 1, vec![unsigned]).expect("unsigned image");
|
||||||
|
let signed = InterleavedImage::new(3, 1, vec![signed]).expect("signed image");
|
||||||
|
let mut bytes = [0; 3];
|
||||||
|
unsigned
|
||||||
|
.to_component_bytes(0, &mut bytes)
|
||||||
|
.expect("unsigned bytes");
|
||||||
|
assert_eq!(bytes, [0, 127, 255]);
|
||||||
|
signed
|
||||||
|
.to_component_bytes(0, &mut bytes)
|
||||||
|
.expect("signed bytes");
|
||||||
|
assert_eq!(bytes, [0, 128, 255]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn interleaved_image_rejects_bad_layouts_and_ranges() {
|
||||||
|
assert_eq!(
|
||||||
|
InterleavedComponent::new(0, false, false, vec![]),
|
||||||
|
Err(Error::Argument)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
InterleavedComponent::new(8, false, false, vec![256]),
|
||||||
|
Err(Error::Argument)
|
||||||
|
);
|
||||||
|
let component = InterleavedComponent::new(8, false, false, vec![0]).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
InterleavedImage::new(2, 1, vec![component]),
|
||||||
|
Err(Error::Argument)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,95 +6,119 @@
|
|||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Imaging.ITextureCodec`.
|
/// C# type: `T:LibreMetaverse.Imaging.ITextureCodec`.
|
||||||
pub trait ITextureCodec {
|
///
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)`.
|
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ITextureCodec` using decision
|
||||||
fn decode(
|
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||||
&self,
|
/// C# member: `M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)`.
|
||||||
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
|
///
|
||||||
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream stream)`.
|
||||||
libremetaverse_types::not_implemented(
|
/// Mapping contract: ownership `shared_self,owned`; async `sync`;
|
||||||
"M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)",
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
)
|
pub use crate::managed_image::ITextureCodec;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage`.
|
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage`.
|
||||||
pub struct ManagedImage {
|
///
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Alpha`.
|
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ManagedImage` using decision
|
||||||
pub alpha: Vec<u8>,
|
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Blue`.
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Alpha`.
|
||||||
pub blue: Vec<u8>,
|
///
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Bump`.
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Alpha`.
|
||||||
pub bump: Vec<u8>,
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Channels`.
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
pub channels: libremetaverse_imaging::ManagedImageImageChannels,
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Blue`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Green`.
|
///
|
||||||
pub green: Vec<u8>,
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Blue`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Height`.
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
pub height: i32,
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Red`.
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Bump`.
|
||||||
pub red: Vec<u8>,
|
///
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Width`.
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Bump`.
|
||||||
pub width: i32,
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
data: Vec<u8>,
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
}
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Channels`.
|
||||||
impl ManagedImage {
|
///
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.Channels`.
|
||||||
pub fn new(
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
width: i32,
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
height: i32,
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Green`.
|
||||||
channels: libremetaverse_imaging::ManagedImageImageChannels,
|
///
|
||||||
) -> Result<Self, crate::Error> {
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Green`.
|
||||||
libremetaverse_types::not_implemented(
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
"M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)",
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
)
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Height`.
|
||||||
}
|
///
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clear`.
|
/// C# signature: `System.Int32 LibreMetaverse.Imaging.ManagedImage.Height`.
|
||||||
pub fn clear(&self) -> Result<(), crate::Error> {
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.Clear")
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
}
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Red`.
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clone`.
|
///
|
||||||
pub fn clone(&self) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Red`.
|
||||||
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.Clone")
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
}
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Width`.
|
||||||
pub fn convert_channels(
|
///
|
||||||
&self,
|
/// C# signature: `System.Int32 LibreMetaverse.Imaging.ManagedImage.Width`.
|
||||||
channels: libremetaverse_imaging::ManagedImageImageChannels,
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
) -> Result<(), crate::Error> {
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
libremetaverse_types::not_implemented(
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
|
||||||
"M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)",
|
///
|
||||||
)
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage(System.Int32 width, System.Int32 height, LibreMetaverse.Imaging.ManagedImage.ImageChannels channels)`.
|
||||||
}
|
/// Mapping contract: ownership `owned,owned,owned`; async `sync`;
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ExportRaw`.
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
pub fn export_raw(&self) -> Result<Vec<u8>, crate::Error> {
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clear`.
|
||||||
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.ExportRaw")
|
///
|
||||||
}
|
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.Clear()`.
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)`.
|
/// Mapping contract: ownership `mutable_self`; async `sync`;
|
||||||
pub fn resize_bilinear(&self, width: i32, height: i32) -> Result<(), crate::Error> {
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
libremetaverse_types::not_implemented(
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clone`.
|
||||||
"M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)",
|
///
|
||||||
)
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.ManagedImage.Clone()`.
|
||||||
}
|
/// Mapping contract: ownership `shared_self`; async `sync`;
|
||||||
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)`.
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
pub fn resize_nearest_neighbor(&self, width: i32, height: i32) -> Result<(), crate::Error> {
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
|
||||||
libremetaverse_types::not_implemented(
|
///
|
||||||
"M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)",
|
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels channels)`.
|
||||||
)
|
/// Mapping contract: ownership `mutable_self,owned`; async `sync`;
|
||||||
}
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
}
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ExportRaw`.
|
||||||
|
///
|
||||||
|
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.ExportRaw()`.
|
||||||
|
/// Mapping contract: ownership `shared_self`; async `sync`;
|
||||||
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)`.
|
||||||
|
///
|
||||||
|
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32 width, System.Int32 height)`.
|
||||||
|
/// Mapping contract: ownership `mutable_self,owned,owned`; async `sync`;
|
||||||
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
|
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)`.
|
||||||
|
///
|
||||||
|
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32 width, System.Int32 height)`.
|
||||||
|
/// Mapping contract: ownership `mutable_self,owned,owned`; async `sync`;
|
||||||
|
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
|
||||||
|
pub use crate::managed_image::ManagedImage;
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage.ImageChannels`.
|
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage.ImageChannels`.
|
||||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
///
|
||||||
#[repr(transparent)]
|
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ManagedImage.ImageChannels` using decision
|
||||||
pub struct ManagedImageImageChannels(pub i32);
|
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
|
||||||
impl ManagedImageImageChannels {
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
|
///
|
||||||
pub const ALPHA: Self = Self(4);
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
pub const BUMP: Self = Self(8);
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
|
||||||
pub const COLOR: Self = Self(2);
|
///
|
||||||
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
|
||||||
pub const GRAY: Self = Self(1);
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
}
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
|
||||||
|
///
|
||||||
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
|
||||||
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
|
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
|
||||||
|
///
|
||||||
|
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
|
||||||
|
/// Mapping contract: ownership `owned_value`; async `sync`;
|
||||||
|
/// errors `none`; overload `direct_snake_case`; kind `direct`.
|
||||||
|
pub use crate::managed_image::ManagedImageImageChannels;
|
||||||
|
|||||||
1911
crates/libremetaverse-imaging/src/jpeg2000.rs
Normal file
1911
crates/libremetaverse-imaging/src/jpeg2000.rs
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user