[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-84120":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":28,"discoverSource":29},84120,"spektrafilm-ofx","chaert-s\u002Fspektrafilm-ofx","chaert-s","Development repository of spektrafilm OFX.","https:\u002F\u002Fspektrafilm.114c.de",null,"C++",112,10,9,2,0,3,6,12,52.72,"GNU General Public License v3.0",false,"main",true,[],"2026-06-12 04:01:42","# spektrafilm OFX\n\nspektrafilm OFX is a native OpenFX plugin project built from the `spektrafilm`\nfilm-simulation codebase. It is intended for host applications such as DaVinci\nResolve or Nuke and provides Metal\u002FVulkan-accelerated film, print, scan, grain, halation,\ndiffusion, color-management, and LUT-export workflows on macOS and Windows.\n\n## Relationship to Andrea Volpato's spektrafilm\n\nThis project is an expansion of\n[spektrafilm by Andrea Volpato](https:\u002F\u002Fgithub.com\u002Fandreavolpato\u002Fspektrafilm).\nThe original project provides the research foundation, Python implementation,\nprofile-generation workflow, and much of the film-density modeling direction.\n\nThe OFX work in this directory ports and extends that idea into a native plugin\nfor video applications. The main goals are:\n\n1. Stay true to the spectral and density-based character of the original model.\n2. Expand upon the controls for photochemical developemnt simulation (e.g. adding push\u002Fpull)\n3. Make the pipeline usable in professional video and finishing workflows.\n4. Keep spacial effects resolution-independant (1080p and 2160p sample the same virtual film negative, just at different densities)\n5. Leverage Apple's Metal GPU stack on macOS and Vulkan compute for Windows and Linux workflows.\n6. Provide ready to use OFX binaries for non developers.\n7. Keep tools in active development and research controls in a separate dev\n   build.\n\n## Binary Downloads and Product Page\n\nPrebuilt binaries, release information, and product-facing documentation are available at:\n\n\u003Chttps:\u002F\u002Fspektrafilm.114c.de>\n\nThe public binary packages are intended for users who only want to install the\nOFX plugin. Building from source is mainly useful for development, verification,\ncustom resources, or local experimental builds.\n\n## Main Features\n\nThe OFX plugin adds several workflow and model extensions on top of the\nbase `spektrafilm` framework. For a general project overview visit \n[Andrea Volpato's page](https:\u002F\u002Fgithub.com\u002Fandreavolpato\u002Fspektrafilm) or read the documentation in [`documentation\u002F`](documentation\u002F).\n\n### Color Management\n\nThe plugin includes explicit input and output color-management controls for\ncommon camera, scene-linear, scene-log, SDR display, and HDR output paths. The\npipeline decodes input into a scene-referred working representation, runs the\nfilm and print model, then encodes the selected output format.\n\nThe available output formats are:\n\n| Format | Purpose |\n| --- | --- |\n| `Display Out SDR` | A finished display-referred SDR output. |\n| `RCM` | Resolve Color Management mode. The selected timeline color space is decoded as input and encoded back as output, with no separate output color-space selector. |\n| `Display Out HDR` | A finished display-referred HDR output using Rec.2100 PQ or HLG controls. |\n\n### LUT Export\n\nThe `Manage` group includes a LUT export path for display-referred SDR looks.\nExports are rendered through the native Metal color pipeline as `.cube` LUTs. \nSpatial and stochastic effects such as grain, halation, diffusion, scanner blur, \nand similar image-dependent operations are excluded from the exported LUT\nas they go beyond the scope of LUT capabilites.\n\nThe LUTs are designed to easily work for dailies, on-set monitoring, cross-platform editing and many other workflows.\n\nFor spatial effects, `Film Format` defines the shared virtual film gate used by grain, halation, diffusion, DIR, and scanner optics. Crops and enlarger transforms sample smaller regions of that same negative; output resolution only changes sampling density.\n\n### Push and Pull Modes\n\nThe film-development controls include two push\u002Fpull approaches:\n\n| Mode | Description |\n| --- | --- |\n| `Standard` | The more straightforward gamma\u002Ftiming-style push\u002Fpull model. It is intended to be stable and predictable. |\n| `Experimental` | A layer- and tone-region-dependent warp that often achieves looks closer to real push\u002Fpull references. |\n\nPrint\u002Fpaper push and pull is separate from film push and pull. Film push\u002Fpull\nacts around negative development. Print push\u002Fpull acts around paper development.\n\n### Printer Lights\n\nThe project contains a printer-light system for APD-based print timing comparable to motion picture printers. \nIt uses printer points where one point equals `1\u002F12` stop of light, matching the common lab timing\nunit.\n\nThis feature depends on SMPTE ST 2065-2 Academy Printing Density data. The relevant\nCSV files are licensed standards material and are not redistributed in this\npublic repository.\n\nPublic source builds without those CSV files still build successfully, but the\nprinter-density mode and printer-point controls will be disabled and the build\nprints a clear notice when the files are missing.\n\nIf you have your own licensed copies of the CSV files attached to ST 2065-2, place them here\nbefore configuring the build:\n\n```text\nResources\u002Fdata\u002Fstandards\u002Fsmpte_st_2065_2\u002Fst2065-2a-2020.csv\nResources\u002Fdata\u002Fstandards\u002Fsmpte_st_2065_2\u002Fst2065-2b-2020.csv\n```\n\nThen re-run CMake from a clean build directory. When both files are present, the\ngenerated profile counts header enables the Academy Printer Density path and the\nprinter-light controls become available in the relevant plugin flavors.\n\n### Bleach Bypass Controls (Experimental)\n\nThe native renderer has experimental negative and print bleach-bypass controls\navailable in the `spektrafilm dev` build. They are an attempt to model retained silver in the\nfilm or print path, but this area is not yet backed by enough stock- and\u002For\nprocess-specific measured data.\n\nFor that reason, these controls should not be treated as representative lab\ncontrols but as a playful first attempt at modeling this process. They are not exposed \nin the normal public `spektrafilm flow` and `spektrafilm` builds.\n\n## Project Layout\n\nImportant paths in this directory:\n\n| Path | Purpose |\n| --- | --- |\n| `CMakeLists.txt` | Main build definition for the OFX bundles, Metal library, generated data, and harnesses. |\n| `build_macos.sh` | Convenience build script for local macOS builds. |\n| `tools\u002Fpackage_macos_release.sh` | Signed macOS release packager that builds both public `.ofx.bundle` plugins, creates a notarized installer package, and writes the public ZIP. |\n| `tools\u002Fpackage_windows_release.ps1` | Windows release packager that builds both public `.ofx.bundle` plugins and writes the public ZIP with an inspectable install script. |\n| `src\u002FSpektraFilmPlugin.cpp` | OFX entry points, parameter definitions, flavor visibility, render dispatch, defaults, clipboard handling, and LUT export wiring. |\n| `src\u002FSpektraMetalRenderer.mm` | Objective-C++ Metal renderer implementation and CPU-side render orchestration. |\n| `src\u002FSpektraMetalRenderer.h` | Renderer API used by the OFX host side and the local harnesses. |\n| `src\u002FSpektraVulkanRenderer.cpp` | Early Windows\u002FLinux Vulkan compute backend and copy-validation image I\u002FO path. |\n| `src\u002FSpektraVulkanRenderer.h` | Vulkan renderer declaration behind the shared renderer interface. |\n| `src\u002FSpektraParameters.h` | Shared render parameter types and enums. |\n| `src\u002FSpektraProfileCurves.h` | Declarations for generated stock\u002Fprofile tables. |\n| `src\u002FSpektraTooltips.h` | User-facing control help text. |\n| `shaders\u002FSpektraFilm.metal` | Metal kernels for the film, print, scan, grain, halation, diffusion, and utility passes. |\n| `Resources\u002Fdata\u002Fprofiles\u002F` | Self-contained film and paper profile JSON files used by the OFX build. |\n| `Resources\u002Fdata\u002Ffilters\u002F` | Filter data used for enlarger, print, neutral filters, heat absorption, and lens transmission. |\n| `Resources\u002Fdata\u002Fluts\u002F` | Spectral upsampling LUT resources used during native table generation. |\n| `Resources\u002Fdata\u002Fstandards\u002F` | Optional standards-derived data. Licensed ST 2065-2 CSVs belong here. |\n| `Resources\u002Ficons\u002F` | SVG and PNG plugin icons. |\n| `Resources\u002FInfo.plist.in` | macOS bundle plist template. |\n| `Resources\u002Fplugin_manifest.json.in` | Plugin manifest template copied into each bundle. |\n| `tools\u002Fgenerate_profile_curves.py` | Generates native C++ profile tables, color-space tables, APD tables, and the Hanatos LUT resource. |\n| `tools\u002Fofx_stock_lists.py` | Film and paper stock ordering for OFX plugins. |\n| `tools\u002Fexport_reference_cases.py` | Exports reference cases from the Python model for comparison work. |\n| `tools\u002FSpektraMetalPerfHarness.mm` | Synthetic Metal performance harness for debugging and performance hunting. |\n| `tools\u002Frun_final_core_profile.py` | Focused fused\u002Fstaged Metal profiling workflow for the final film-density core. |\n| `tools\u002Fperf_candidates_final_core.json` | Parity-gated exact and approximate final-core optimization candidates. |\n| `tools\u002FSpektraMetalEvaluationHarness.mm` | Native evaluation harness. |\n| `tools\u002FSpektraVulkanCopyHarness.cpp` | Windows\u002FLinux Vulkan copy-validation smoke harness. |\n| `tools\u002FSpektraVariantGenerator.mm` | Generates rendered variants for stock\u002Flook inspection (used for generating images of stocks for product website). |\n| `tests\u002F` | Python tests for build wiring, resource generation, parameter metadata, and source invariants. |\n| `third_party\u002Fopenfx\u002F` | Vendored OpenFX SDK headers and support code. (OFX_Release_1.5.1)|\n| `Legal\u002F` | Binary distribution notices, exported LUT license terms, and third-party notices. |\n| `documentation\u002F` | Manual and user-facing documentation for the OFX plugin. |\n\n## Build Requirements\n\nThe macOS source build expects:\n\n1. macOS.\n2. Xcode Command Line Tools or Xcode.\n3. Apple's Metal toolchain available through `xcrun`.\n4. CMake `3.24` or newer.\n5. Python with the OFX build-time table generation dependencies installed:\n   `numpy`, `scipy`, and `colour-science`.\n6. libpng discoverable by CMake for the variant generator target.\n7. OpenFX SDK headers (OFX_Release_1.5.1).\n\nThe Windows source build expects:\n\n1. Windows 10 or newer.\n2. Visual Studio 2022 C++ build tools, Ninja, or another CMake-supported C++17 toolchain.\n3. Vulkan SDK with the Vulkan loader, headers, and `glslc` or `glslangValidator`.\n4. CMake `3.24` or newer.\n5. Python with the OFX build-time table generation dependencies installed:\n   `numpy`, `scipy`, and `colour-science`.\n6. OpenFX SDK headers (OFX_Release_1.5.1).\n\nThe Linux developer source build expects:\n\n1. Linux x86_64.\n2. GCC, Clang, Ninja, or another CMake-supported C++17 toolchain.\n3. Vulkan loader and development headers plus `glslc` or `glslangValidator`\n   from the Vulkan SDK or distribution packages.\n4. CMake `3.24` or newer.\n5. Python with the OFX build-time table generation dependencies installed:\n   `numpy`, `scipy`, and `colour-science`.\n6. OpenFX SDK headers (OFX_Release_1.5.1).\n\nThe OFX build prefers the repository virtual environment at `..\u002F..\u002F.venv\u002Fbin\u002Fpython`\non Unix-like platforms and `..\u002F..\u002F.venv\u002FScripts\u002Fpython.exe` on Windows when it\nexists. Otherwise CMake falls back to the Python interpreter found by\n`find_package(Python3)`. CMake checks for the build-time Python packages during\nconfigure and prints the matching `pip install` command if they are missing.\n\n## Setup From a Fresh Checkout\nFor ease of use, I developed this project from within Andrea's spektrafilm repository root. To follow the below instructions, pull the latest version of spektrafilm and place the contents of this repo at OFX\u002FSpektraFilm.\n\nFrom the spektrafilm root, create or sync the Python environment first. This\nproject uses the Python package for build-time table generation.\n\nUsing `uv`:\n\n```sh\nuv sync --extra dev\n```\n\nOr with a manually managed Python 3.13 environment:\n\n```sh\npython -m pip install -e \".[dev]\"\n```\n\nFor an OFX-only build environment, the full GUI\u002Fimage stack is not required:\n\n```sh\npython -m pip install numpy scipy colour-science\n```\n\nThen build the OFX project:\n\n```sh\ncd OFX\u002FSpektraFilm\n.\u002Fbuild_macos.sh\n```\n\nThe script configures CMake, builds the plugin targets, and produces local\n`.ofx.bundle` outputs. It does not sign with Developer ID, notarize, or write\nthe public macOS installer ZIP.\n\nTo create the signed public macOS release ZIP, first create a notarytool\nkeychain profile, then run the release packager with your Developer ID\nidentities:\n\n```sh\nxcrun notarytool store-credentials spektrafilm-notary\n\nSPEKTRAFILM_DEVELOPER_ID_APP=\"Developer ID Application: Your Name (TEAMID)\" \\\nSPEKTRAFILM_DEVELOPER_ID_INSTALLER=\"Developer ID Installer: Your Name (TEAMID)\" \\\nSPEKTRAFILM_NOTARY_PROFILE=\"spektrafilm-notary\" \\\n.\u002Ftools\u002Fpackage_macos_release.sh\n```\n\nThe output is a single notarized installer package that installs both public\nmacOS plugins into `\u002FLibrary\u002FOFX\u002FPlugins`.\n\nOn Windows, run the PowerShell build script instead:\n\n```powershell\ncd OFX\\SpektraFilm\n.\\build_windows.ps1\n```\n\nThe Windows script builds local `Contents\\Win64` OFX bundles for development.\nIt does not create the public website ZIP.\n\nTo create the public Windows release ZIP, run the release packager:\n\n```powershell\n.\\tools\\package_windows_release.ps1\n```\n\nThe generated zip contains both public Windows `.ofx.bundle` directories, `install.bat`,\nmanual, install instructions, and legal notices. The batch script can be\ninspected before running; it elevates, removes old public spektrafilm bundles,\nand copies the new bundles into\n`C:\\Program Files\\Common Files\\OFX\\Plugins`.\n\n\nOn Linux, use the manual CMake flow. The build creates local\n`Contents\u002FLinux-x86-64` OFX bundles for development and emits\n`SpektraVulkanCopyHarness` for the same Vulkan smoke coverage. Linux release\npackaging is not provided in this phase.\n\n## Manual CMake Build\n\nFor a more explicit build:\n\n```sh\ncd OFX\u002FSpektraFilm\ncmake -S . -B build\ncmake --build build --parallel\n```\n\nTo install the built OFX bundles into the system OFX plugin directory:\n\n```sh\ncmake --install build\n```\n\nThe default install destinations are:\n\n```text\nmacOS:   \u002FLibrary\u002FOFX\u002FPlugins\nWindows: C:\u002FProgram Files\u002FCommon Files\u002FOFX\u002FPlugins\nLinux:   \u002Fusr\u002FOFX\u002FPlugins\n```\n\nDepending on your system permissions, installation may require elevated rights.\n\n\n## Plugin Flavors\n\nThe build defines three OFX bundle targets:\n\n| Target | Artifact name | Bundle label | Plugin identifier | Public package |\n| --- | --- | --- | --- | --- |\n| `spektrafilm_flow` | `spektrafilm_flow` | `spektrafilm flow` | `org.spektrafilm.flow` | Yes |\n| `spektrafilm` | `spektrafilm` | `spektrafilm` | `org.spektrafilm` | Yes |\n| `spektrafilm_dev` | `spektrafilm_dev` | `spektrafilm dev` | `org.spektrafilm.dev` | No |\n\nAll three are compiled from the same source. Flavor-specific behavior is\ncontrolled through compile definitions and parameter visibility rules in\n`src\u002FSpektraFilmPlugin.cpp`.\n\n## Legal and Redistribution Notes\n\n1. The public source tree does not redistribute licensed SMPTE ST 2065-2 CSV\n   files.\n2. Official binary distributions may include bundled resources covered by the\n   notices in `Legal\u002F`.\n3. LUT files exported from the plugin are governed by\n   `Legal\u002FSPEKTRAFILM_OFX_LUT_LICENSE.txt`.\n4. The vendored OpenFX SDK carries its own notices under `third_party\u002Fopenfx\u002F`.\n\n## Development Notes\n\nThe plugin is still an active development project. The public flavors prioritize\ncontrols that are useful and reasonably defensible in grading workflows. The dev\nflavor keeps deeper controls available so that modeling decisions can be tested\nwithout committing every experiment to the public UI.\n\nHave fun and thank you for creating with spektrafilm!\n","2026-06-11 04:12:20","CREATED_QUERY"]