---
title: "Swarm Art in the Browser with boids4R"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Swarm Art in the Browser with boids4R}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
if (file.exists("../DESCRIPTION") && requireNamespace("pkgload", quietly = TRUE)) {
  pkgload::load_all("..", export_all = FALSE, helpers = FALSE, quiet = TRUE)
} else {
  library(ggWebGL)
}
```

# Swarm Art in the Browser

This article documents an optional downstream bridge from `boids4R` into
`ggWebGL`. The creative use case is generative browser art: compact schools,
predator avoidance, obstacle corridors, murmurations, and mixed-species swarms
become animated point/vector timelines that can be panned, zoomed, scrubbed, and
inspected in WebGL.

The CRAN-built vignette is documentation-only. It does not load `boids4R`, does
not execute GitHub-only package code, and does not require optional ecosystem
packages to be installed. The runnable bridge remains in the package example
script named below.

# Boundary

The ownership split is deliberately narrow:

- `boids4R` owns simulation semantics: flocking state, rules, scenarios, and
  frame export.
- The optional downstream bridge translates simulation frames into renderer
  primitives when `boids4R` is installed separately.
- `ggWebGL` owns WebGL rendering: the htmlwidget, point and vector primitives,
  shader choice, timeline controls, hover, pan, zoom, and 3D orbit interaction.

This keeps the core `ggWebGL` package self-contained for CRAN while preserving a
clear optional integration path for development installations.

# Runnable Optional Demo

The optional example script is:

```text
inst/examples/htmlwidget/downstream-boids4r-animation.R
```

When `boids4R` is installed separately, the script builds two widgets:

- a 2D schooling scene rendered as exact-frame animated points and vectors
- a 3D murmuration scene rendered with the structured 3D view path

To run it in a development checkout or installed package, use:

```text
source(system.file("examples", "htmlwidget", "downstream-boids4r-animation.R", package = "ggWebGL"))
widgets <- downstream_boids4r_widgets()
widgets$schooling_2d
widgets$murmuration_3d
```

The script is guarded: if `boids4R` is absent, it reports that the optional demo
was skipped instead of failing package checks.

# What To Inspect

The optional widgets are intended to demonstrate renderer capabilities rather
than package-specific simulation interpretation:

- point primitives carry boid positions for each frame
- vector primitives show local velocity direction
- exact timeline filtering makes each scrubbed frame visually distinct
- 3D view metadata enables the murmuration scene to use browser camera controls
- shader settings remain owned by `ggWebGL`, not by the simulation package

# CRAN Position

`boids4R` is an optional development ecosystem package. It is not listed in
`ggWebGL` dependencies and is not required for installation, examples, tests, or
vignettes. This article is retained as a documentation entry so downstream
packages can see the intended adapter boundary without making CRAN checks depend
on GitHub-only packages.
