Skip to content

feat: add ray-tracing propagation with OptiX and Embree - #216

Draft
davidbits wants to merge 50 commits into
masterfrom
feat/sfbdragon-raytracing
Draft

davidbits wants to merge 50 commits into
masterfrom
feat/sfbdragon-raytracing

Conversation

@davidbits

Copy link
Copy Markdown
Owner

Adds ray-tracing propagation from SFBdragon/FERS, including OptiX and Embree backends, propagation refactoring, CW sampling improvements, and streaming fixes.

Validation: tests not run.

SFBdragon and others added 30 commits September 5, 2026 23:52
…e variant hierarchy

David's branch (merged here) adds file-backed CW/FMCW waveform playback
(commit 8e02245 and friends), built against the pre-refactor virtual
Signal hierarchy. This repo's master had since replaced that hierarchy
with a std::variant-based Waveform (d6a8bf9), because sampled/pulsed
signals share no meaningful operations with CW-family signals. The two
branches independently restructured the same subsystem, so this merge
required rewriting the waveform-hierarchy conflicts by hand rather than
a mechanical patch.

Resolution:
- All five existing waveform kinds keep their std::variant design, now
  renamed for clarity now that "Signal" no longer distinguishes anything:
  SampledSignal -> PulseWaveform, CwSignal -> CwWaveform,
  FmcwChirpSignal -> FmcwChirpWaveform, FmcwTriangleSignal ->
  FmcwTriangleWaveform, SteppedFrequencySignal -> SteppedFrequencyWaveform.
  RadarSignal's accessors follow suit (isSampled -> isPulsed,
  getSampledSignal -> getPulseWaveform, etc).
- File-backed CW and FMCW playback becomes a single new variant
  alternative, FileWaveform, carrying a 2-valued FileWaveformKind{Cw,Fmcw}
  classification tag and a sampleAt() envelope query - not render()/
  renderSlice(), since only PulseWaveform participates in the pulsed
  PropagationModel path. Tracing the runtime evaluator confirmed
  file-CW and file-FMCW are behaviorally identical everywhere except
  classification, so splitting them into two alternatives would have
  been pure duplication.
- A new WaveformSampleBuffer component (buffer + load + sampleAt) is
  shared between PulseWaveform and FileWaveform, so the two don't
  duplicate file-loading/interpolation code despite being separate types.
- waveform_factory.cpp routes a new 3-valued
  serial::FileWaveformRequestKind{Pulsed,Cw,Fmcw} to PulseWaveform or
  FileWaveform; Cw/Fmcw remain HDF5-only per David's original constraint.
- XML/JSON parsing, serialization, streaming evaluation
  (StreamingWaveformKind::FileCw/FileFmcw, ActiveStreamingSource.file,
  envelope-aware computeStreamingEvaluation), and VITA49 metadata
  (waveform_shape="file", sampled_duration/sampled_count, and the
  sole-active-CW-source context binding with graceful ambiguity
  handling) largely auto-merged cleanly from David's side and needed
  only the type renames plus two small additions (FmcwContext gained
  sampled_duration/sampled_count, forwarded through the VITA49 JSON
  sink).
- Ported the two genuinely new test cases from the deleted/modified
  test_channel_model_direct.cpp (file envelope sampling, file-CW direct
  path) into test_channel_model_streaming.cpp, which superseded it;
  removed the file since its remaining content (solveRe/solveReDirect/
  calculateDirectPathContribution) was already superseded by the
  unified calculateStreamingPathContribution + PropagationPath
  abstraction introduced by d6a8bf9.
- The 5 commits unrelated to the waveform hierarchy (vcpkg baseline fix,
  VITA49 pacing/test timing fixes) merged with no conflicts.

Full libfers test suite passes (605 test cases, 8221 assertions).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N1XzsBYaJfodFPoeWEM3eg
Merge David's work into SFBdragon/FERS
…ixes, voltage wiring, fix many warnings, add tests, reorganise files
…tScatterModel-like paths. Replaced with a two tier system: a loose bound based on the world diameter and maximum number of propagation legs, and a tight hueristic based on whether receivers are no longer receiving in-window signal from a source after its streaming segment ends
…ive carrier limit, avoid assuming fixed carrier frequencies, implement exact persistent carrier models for propagation modelling, avoid pre-computing radiation vectors where rays often miss
…uniform sampling interval, and don't taper outside of pulse reception
… for scatterers that are only appropriate for modelling by the ray-tracing propagation model, improve launch ray direction computation to mitigate floating-point quantisation
… contain tapering complexity to contruction time
…build and launch overhead, fix directPath receiver index bug
…upported on Windows Server 2025/Ubuntu 24.04
Merge the ray-tracing extension, CW coarse sampling, CW batching, and various improvements into master

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants