framerudiments 0.4.2__tar.gz → 0.4.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {framerudiments-0.4.2 → framerudiments-0.4.3}/AGENTS.md +8 -0
- {framerudiments-0.4.2/src/framerudiments.egg-info → framerudiments-0.4.3}/PKG-INFO +5 -4
- {framerudiments-0.4.2 → framerudiments-0.4.3}/README.md +4 -3
- {framerudiments-0.4.2 → framerudiments-0.4.3}/RELEASE_NOTES.md +14 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/natural-materials.md +12 -4
- {framerudiments-0.4.2 → framerudiments-0.4.3}/pyproject.toml +1 -1
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/__init__.py +1 -1
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_renderer.py +80 -14
- {framerudiments-0.4.2 → framerudiments-0.4.3/src/framerudiments.egg-info}/PKG-INFO +5 -4
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_fire_methods.py +20 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/LICENSE +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/MANIFEST.in +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/analysis-releases.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/ECOSYSTEM.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/FrameRudiments-PATCH_WORKFLOW.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/annular-modulation.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/authoring-workspace.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/beat-alignment.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/controlled-audio-response.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/expanded-effects.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/extraction.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/full-preset-analysis.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/hybrid-preset-analysis.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/keyframed-mattes.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/beat-alignment-evidence.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/beat-alignment.mp4 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/beat-alignment.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/demo-transcript.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/effects-pipeline.svg +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/full-frame-comparison.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/full-frame-demo.mp4 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/media-evidence.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/natural-materials.mp4 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/natural-materials.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/preset-test-cards.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/rangoli-transcript.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/rangoli.mp4 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/rangoli.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/test-card-inputs/colour-bars.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/test-card-inputs/grid-rings.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/media/test-card-inputs/text-card.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/multi-stem-modulation.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/music-reactive-3d.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/particle-smoke.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/phase3-compositing.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/preset-behaviour.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/preset-profiling.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/project-format.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/projectm-local-runtime.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/quality-effects.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/rangoli.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/rich-lyric-effects.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/rudiment-renderers.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/scoped-post-effects.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/solid-spatial-renderers.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/spatial-renderers.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/spatiotemporal-supersampling.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/spectrum.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/sprite-visualisations.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/stem-sources-and-masks.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/variable-bpm-word-subtitles.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/visualisation-atlas.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/visualisation-coverage-matrix.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/visualiser-routing.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/visualisers.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/docs/workflow-media.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/integration/test_fire_volume_gpu.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/integration/test_music_spatial_gpu.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/integration/test_preset_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/integration/test_released_preset_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/integration/test_visualisers_gpu.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/Run-ControlledPresetAnalysis.ps1 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/Run-FullPresetAnalysis.ps1 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/Run-HybridPresetAnalysis.ps1 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/Run-PresetBehaviourAnalysis.ps1 +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/authoring_preview.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/bake_mantaflow_fire.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/build_sprite_assets.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/check_projectm_runtime.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/check_release_packages.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/controlled_preset_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/ensure_projectm_runtime.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/full_preset_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_particle_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_post_effect_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_quality_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_rich_lyric_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_sprite_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_supersampling_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_timing_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_visualisation_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_visualiser_routing_gallery.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/install_analysis_releases.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/prepare_fire_atlas.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/prepare_pixelcue_taggers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/preset_behaviour_pipeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/profile_visualisation_coverage.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/profile_visualisers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/projectm_dll_diagnostics.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/render_natural_material_demo.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/repair_projectm_mingw.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/select_projectm_generator.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/validate_patch.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/setup.cfg +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/__main__.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/advanced_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/atlas.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/audio_probes.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/beat_alignment.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/beat_timeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/choreography.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/circular_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/cli.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/compositor.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/controlled_profiling.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/demo.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/effect_catalogue.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/effect_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/encoding.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/mantaflow/NOTICE.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/mantaflow/atlas.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/mantaflow/flames.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/marburg/NOTICE.md +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/marburg/atlas.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets/marburg/flames.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_assets.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_fluid.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/fire_volume.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/flight.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/gpu_spatial_backend.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/io.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/keyframes.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/layer_animation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/layer_displacement.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/layer_masks.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/lyric_indicator.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/modulation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/motion.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/music_spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/natural_materials.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/output_quality.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/particle_engine.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/post_effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/preset_library.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/preset_profiling.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/profile_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/project.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/projectm_backend.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/quality_effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/rangoli_renderer.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/render.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/rich_subtitles.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/rudiment_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/scoped_effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/solid_spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/spectrum.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/arcade.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/crystal.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/fire.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/generated-neon.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/glass.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/hud.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/ice.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/lcd-amber.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/lcd-green.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/lcd.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/led.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/manifest.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/metal.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/mono.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/neon.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/pixel.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/plasma.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_assets/vfd.png +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_catalogue.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/sprite_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/stem_blend.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/stemlab.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/subtitles.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/super_sampling.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/terrain_field.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/timeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visual_style.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualisation_catalogue.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/butterchurn-page.js +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/butterchurn-worker.mjs +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/feedback.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/feedback.milk +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/julia.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/julia.milk +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/kaleidoscope.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/kaleidoscope.milk +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/package-lock.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/package.json +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_assets/rangoli-background.milk +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_routing.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualiser_setup.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/visualisers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments/word_timing.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments.egg-info/SOURCES.txt +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments.egg-info/dependency_links.txt +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments.egg-info/entry_points.txt +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments.egg-info/requires.txt +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/src/framerudiments.egg-info/top_level.txt +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/conftest.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_adapters.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_advanced_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_authoring_preview.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_beat_alignment.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_behaviour_pipeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_checkpoint_batches.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_controlled_audio.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_coverage_matrix.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_default_antialias.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_effect_batch.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_extracted_helpers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_flight.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_full_preset_analysis.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_gpu_ci_isolation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_hybrid_launcher.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_keyframes.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_layer_masks.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_lyrics.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_music_spatial_pipeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_music_spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_natural_materials.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_particle_engine.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_patch_validation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_phase3_animation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_phase3_gpu_injection.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_pipeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_preset_profiling.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_projectm_dll_diagnostics.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_projectm_generator.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_projectm_runtime_preflight.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_pytest_temp_isolation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_quality_effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_rangoli_renderer.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_release_metadata.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_repair_projectm_mingw.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_rich_subtitles.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_rudiment_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_scoped_effects.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_solid_spatial_integration.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_solid_spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_spatial_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_spectrum.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_sprite_renderers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_stem_blend.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_stem_source_integration.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_supersampling.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_timeline.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_variable_bpm_words.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_visualisation_modulation.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_visualiser_routing.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_visualisers.py +0 -0
- {framerudiments-0.4.2 → framerudiments-0.4.3}/tests/test_windows_launcher_splitpath.py +0 -0
|
@@ -22,3 +22,11 @@ and immutable assets. New publication destinations still require user authority.
|
|
|
22
22
|
## Full ecosystem and release preflight
|
|
23
23
|
|
|
24
24
|
Before every new workflow run, check the latest stable official release and observe the actual runtime used by the job. Follow [the shared preflight](https://github.com/kieransimkin/DanceFlow/blob/main/docs/workflows/release-preflight.md) and this project's [people-and-agent guide](docs/ECOSYSTEM.md). Review the complete relevant capability inventory rather than only a familiar command. Consider every DanceFlow component against the actual task; use and compose all applicable supported capabilities, and improve a concrete reusable gap in its canonical repository. Record why existing capabilities suffice when no change is justified. No catalogue checklist expands the task, authorises model downloads/training, or proves integration. Preserve exact source/package identity, clocks, model-local storage, privacy, costs, immutable releases and separate deployment gates.
|
|
25
|
+
|
|
26
|
+
## Preflight temporary-directory access
|
|
27
|
+
|
|
28
|
+
Before any long, costly, model-backed, media-rendering, build, test, packaging or release command that creates private or atomic temporary directories, run a disposable preflight with the exact runtime, user or sandbox, and intended output parent. The probe must create a unique directory, write and read a file, atomically rename it, then remove the file and directory.
|
|
29
|
+
|
|
30
|
+
Keep temporary data and caches under the owning project on `Z:`; model weights and model-specific caches remain under that project's ignored `models/`. If the probe returns `WinError 5`, access denied, a rename failure or a cleanup failure, stop before the expensive command. Preserve the exact error and use the documented narrowly approved unrestricted recovery from the outset only when the task requires it. Use a fresh output directory and do not repeat the already-failing full job in the restricted shell.
|
|
31
|
+
|
|
32
|
+
After any unrestricted recovery, verify that the final output is readable and writable from the normal managed environment. If it is not, copy the completed bytes into a pre-created project-local directory that passed the probe, verify hashes, and retain the original failure and recovery evidence. Do not edit global ACLs, switch caches to `C:`, terminate unrelated processes or claim the underlying permission problem is fixed. Repositories that own temporary-directory creation should provide and test a reusable preflight helper rather than relying only on this instruction.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: framerudiments
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
4
4
|
Summary: Deterministic Shorts and lyric visualisers using DanceRudiments and StemLab evidence.
|
|
5
5
|
Author: Kieran Simkin
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,9 +33,10 @@ Dynamic: license-file
|
|
|
33
33
|
|
|
34
34
|
## Five fire methods and ice
|
|
35
35
|
|
|
36
|
-
Version 0.4.
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
Version 0.4.3 adds evidence-recorded three-stop fire palettes, an optional
|
|
37
|
+
vertical tip bias applied after burn-front placement, and less repetitive
|
|
38
|
+
deterministic layouts for filmed and Mantaflow sources. The five fire methods,
|
|
39
|
+
scorched artwork burn-away, fractured ice and frost remain available through ordinary material layers or the reusable
|
|
39
40
|
`FireRenderer` and `NaturalMaterial` APIs. Source clocks, clean text, transparent edges and
|
|
40
41
|
seek-safe rendering remain explicit. See [natural materials](docs/natural-materials.md).
|
|
41
42
|
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
## Five fire methods and ice
|
|
4
4
|
|
|
5
|
-
Version 0.4.
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
Version 0.4.3 adds evidence-recorded three-stop fire palettes, an optional
|
|
6
|
+
vertical tip bias applied after burn-front placement, and less repetitive
|
|
7
|
+
deterministic layouts for filmed and Mantaflow sources. The five fire methods,
|
|
8
|
+
scorched artwork burn-away, fractured ice and frost remain available through ordinary material layers or the reusable
|
|
8
9
|
`FireRenderer` and `NaturalMaterial` APIs. Source clocks, clean text, transparent edges and
|
|
9
10
|
seek-safe rendering remain explicit. See [natural materials](docs/natural-materials.md).
|
|
10
11
|
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# FrameRudiments 0.4.3
|
|
2
|
+
|
|
3
|
+
- Atlas fire accepts an evidence-recorded three-stop CSS palette ordered as
|
|
4
|
+
shadow, body and core. An optional bounded `palette_vertical` bias can carry
|
|
5
|
+
the shadow colour into visible flame tongues after burn-front placement while
|
|
6
|
+
preserving the source alpha silhouette.
|
|
7
|
+
- Filmed and Mantaflow layouts vary deterministic jet scale, playback rate,
|
|
8
|
+
phase, mirroring, angle and placement across wide surfaces, reducing obvious
|
|
9
|
+
repeated strips without introducing a new source clock.
|
|
10
|
+
- Invalid palette shapes, colours and bounds fail closed. The focused fire
|
|
11
|
+
suite, configured full suite, package checks and clean-wheel palette smoke
|
|
12
|
+
test cover the reusable contract.
|
|
13
|
+
- [Actual synthetic still/video, API, settings and limitations](docs/natural-materials.md).
|
|
14
|
+
|
|
1
15
|
# FrameRudiments 0.4.2
|
|
2
16
|
|
|
3
17
|
- Five selectable fire routes: hash-pinned CC0 filmed flame, animated flame
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Five fire methods and ice
|
|
2
2
|
|
|
3
|
-
FrameRudiments 0.4.
|
|
3
|
+
FrameRudiments 0.4.3 offers five distinct fire routes through one RGBA and
|
|
4
4
|
artwork-burn API. Recorded flame preserves photographed detail; sprite
|
|
5
5
|
particles rearrange that detail; a 2D fluid solver, a GPU volume renderer and
|
|
6
6
|
a Blender/Mantaflow bake offer different degrees of simulation and control.
|
|
@@ -49,7 +49,9 @@ assets fail clearly; methods never silently substitute another backend.
|
|
|
49
49
|
from framerudiments import FireRenderer, NaturalMaterial
|
|
50
50
|
|
|
51
51
|
fire = FireRenderer(ticket.size, method="sprites", seed=21,
|
|
52
|
-
resolution=0.75, warmth=1.0, glow=0.1
|
|
52
|
+
resolution=0.75, warmth=1.0, glow=0.1,
|
|
53
|
+
palette=["#531178", "#ef5b16", "#ffd25c"],
|
|
54
|
+
palette_vertical=0.7)
|
|
53
55
|
ice = NaturalMaterial(ticket.size, "ice", seed=21, resolution=0.75)
|
|
54
56
|
try:
|
|
55
57
|
burning = fire.burn(ticket, source_seconds, progress=0.5)
|
|
@@ -87,12 +89,18 @@ source-to-asset time mapping in the scene if a bake represents another interval.
|
|
|
87
89
|
|
|
88
90
|
Shared controls are `seed`, `speed`, `glow` and `opacity`. `resolution` declares
|
|
89
91
|
the synthetic working tile scale (0.1–1). Atlas detail remains bounded by its
|
|
90
|
-
actual cell resolution. `flame_height` controls the
|
|
92
|
+
actual cell resolution. The footage route deterministically varies jet scale, playback rate, phase, mirroring, angle and placement so wide surfaces do not expose an evenly repeated source silhouette. `flame_height` controls the overlapping footage/bake layout;
|
|
91
93
|
sprite shape and simulation shape are owned by their respective backends.
|
|
92
94
|
The legacy noise `scale`/`turbulence` controls apply to `stylized`, and to the
|
|
93
95
|
shared scorched burn mask, rather than altering recorded motion. `warmth`
|
|
94
96
|
(0–1) grades only atlas-based methods, preserves alpha and is a creative colour
|
|
95
|
-
grade, never a new source or temperature observation.
|
|
97
|
+
grade, never a new source or temperature observation. It can blend the original
|
|
98
|
+
emission towards the default hot grade or an explicit
|
|
99
|
+
three-stop CSS `palette` ordered shadow, body and core. The selected colours
|
|
100
|
+
are retained in renderer evidence; the palette changes RGB only and preserves
|
|
101
|
+
the source alpha silhouette. `palette_vertical` (0–1) optionally biases the
|
|
102
|
+
shadow colour into higher flame tongues while retaining the energy-led body and
|
|
103
|
+
core grade; it is useful when art direction calls for coloured flame tips.
|
|
96
104
|
|
|
97
105
|
Simulation controls are explicit `backend_settings`: `fluid_2d` accepts
|
|
98
106
|
`simulation_hz`, `resolution` and `warmup`; `volume` accepts `steps`. Atlas
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "framerudiments"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.3"
|
|
8
8
|
description = "Deterministic Shorts and lyric visualisers using DanceRudiments and StemLab evidence."
|
|
9
9
|
requires-python = ">=3.11"
|
|
10
10
|
readme = "README.md"
|
|
@@ -4,7 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
import math
|
|
5
5
|
from types import SimpleNamespace
|
|
6
6
|
|
|
7
|
-
from PIL import Image, ImageFilter
|
|
7
|
+
from PIL import Image, ImageColor, ImageFilter
|
|
8
8
|
|
|
9
9
|
from .natural_materials import NaturalMaterial
|
|
10
10
|
from .io import file_ref, number, sha256
|
|
@@ -24,7 +24,17 @@ def builtin_asset(name="marburg"):
|
|
|
24
24
|
|
|
25
25
|
class FireRenderer(NaturalMaterial):
|
|
26
26
|
def __init__(
|
|
27
|
-
self,
|
|
27
|
+
self,
|
|
28
|
+
size,
|
|
29
|
+
method="footage",
|
|
30
|
+
*,
|
|
31
|
+
asset=None,
|
|
32
|
+
repeat=True,
|
|
33
|
+
warmth=0,
|
|
34
|
+
palette=None,
|
|
35
|
+
palette_vertical=0,
|
|
36
|
+
backend_settings=None,
|
|
37
|
+
**settings,
|
|
28
38
|
):
|
|
29
39
|
if method not in METHODS:
|
|
30
40
|
raise ValueError(f"Unknown fire method; choose {METHODS}")
|
|
@@ -34,6 +44,20 @@ class FireRenderer(NaturalMaterial):
|
|
|
34
44
|
self.method = method
|
|
35
45
|
self.closed = False
|
|
36
46
|
self.warmth = number(warmth, "fire warmth grade", minimum=0, maximum=1)
|
|
47
|
+
if palette is not None:
|
|
48
|
+
if not isinstance(palette, (list, tuple)) or len(palette) != 3:
|
|
49
|
+
raise ValueError("Fire palette must contain exactly three CSS colours")
|
|
50
|
+
try:
|
|
51
|
+
self.palette = tuple(ImageColor.getcolor(value, "RGB") for value in palette)
|
|
52
|
+
except (TypeError, ValueError) as exc:
|
|
53
|
+
raise ValueError("Fire palette must contain exactly three CSS colours") from exc
|
|
54
|
+
self.palette_source = list(palette)
|
|
55
|
+
else:
|
|
56
|
+
self.palette = None
|
|
57
|
+
self.palette_source = None
|
|
58
|
+
self.palette_vertical = number(
|
|
59
|
+
palette_vertical, "fire vertical palette bias", minimum=0, maximum=1
|
|
60
|
+
)
|
|
37
61
|
self.repeat = repeat
|
|
38
62
|
self.atlas = None
|
|
39
63
|
self.backend = None
|
|
@@ -71,6 +95,8 @@ class FireRenderer(NaturalMaterial):
|
|
|
71
95
|
self.evidence.update(
|
|
72
96
|
method=method,
|
|
73
97
|
warmth_grade=self.warmth,
|
|
98
|
+
palette=self.palette_source,
|
|
99
|
+
palette_vertical=self.palette_vertical,
|
|
74
100
|
repeat=repeat,
|
|
75
101
|
asset=self.atlas.evidence if self.atlas else None,
|
|
76
102
|
backend="opengl"
|
|
@@ -168,16 +194,30 @@ class FireRenderer(NaturalMaterial):
|
|
|
168
194
|
|
|
169
195
|
def _footage(self, seconds):
|
|
170
196
|
image = Image.new("RGBA", self.size)
|
|
171
|
-
|
|
197
|
+
base_h = max(8, round(self.size[1] * self.flame_height))
|
|
172
198
|
cw, ch = self.atlas.cell_size
|
|
173
|
-
|
|
174
|
-
|
|
199
|
+
base_w = max(4, round(base_h * cw / ch))
|
|
200
|
+
step = max(2, round(base_w * 0.42))
|
|
201
|
+
count = math.ceil(self.size[0] / step) + 3
|
|
175
202
|
for i in range(count):
|
|
176
|
-
|
|
203
|
+
# Vary every jet deterministically so a real source does not become
|
|
204
|
+
# an artificial picket-fence pattern when it spans a wide surface.
|
|
205
|
+
code = (i * 1103515245 + self.seed * 12345) & 0x7FFFFFFF
|
|
206
|
+
scale = 0.72 + ((code >> 4) % 67) / 100
|
|
207
|
+
speed = 0.82 + ((code >> 11) % 39) / 100
|
|
208
|
+
h = max(8, round(base_h * scale))
|
|
209
|
+
w = max(4, round(h * cw / ch))
|
|
210
|
+
t = seconds * speed + ((code >> 17) % 997) / 137
|
|
177
211
|
tile = self.atlas.frame_at(t, repeat=self.repeat)
|
|
178
212
|
tile = tile.convert("RGBa").resize((w, h), Image.Resampling.LANCZOS).convert("RGBA")
|
|
179
|
-
|
|
180
|
-
|
|
213
|
+
if code & 1:
|
|
214
|
+
tile = tile.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
|
|
215
|
+
angle = ((code >> 23) % 7) - 3
|
|
216
|
+
if angle:
|
|
217
|
+
tile = tile.rotate(angle, Image.Resampling.BICUBIC, expand=True)
|
|
218
|
+
jitter_x = ((code >> 7) % max(2, step)) - step / 2
|
|
219
|
+
x = round((i - 1) * step + jitter_x - tile.width * 0.18)
|
|
220
|
+
y = round(self.size[1] - tile.height + (((code >> 14) % 13) - 6) * base_h / 100)
|
|
181
221
|
image.alpha_composite(tile, (x, y))
|
|
182
222
|
return image
|
|
183
223
|
|
|
@@ -211,19 +251,45 @@ class FireRenderer(NaturalMaterial):
|
|
|
211
251
|
# photographed/simulated silhouette so blue-screen fringes cannot
|
|
212
252
|
# leak into a warm fire treatment.
|
|
213
253
|
energy = np.max(a[:, :, :3], axis=2)
|
|
214
|
-
|
|
215
|
-
(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
254
|
+
if self.palette:
|
|
255
|
+
low, middle, high = (np.asarray(colour, dtype=np.float32) / 255 for colour in self.palette)
|
|
256
|
+
split = 0.58
|
|
257
|
+
lower_t = np.clip(energy / split, 0, 1)[:, :, None]
|
|
258
|
+
upper_t = np.clip((energy - split) / (1 - split), 0, 1)[:, :, None]
|
|
259
|
+
lower = low + (middle - low) * lower_t
|
|
260
|
+
upper = middle + (high - middle) * upper_t
|
|
261
|
+
warm = np.where((energy < split)[:, :, None], lower, upper)
|
|
262
|
+
# Keep low-energy tongues dark while allowing the hot core to
|
|
263
|
+
# reach the selected highlight. Alpha continues to own shape.
|
|
264
|
+
warm *= (0.28 + 0.72 * energy)[:, :, None]
|
|
265
|
+
else:
|
|
266
|
+
warm = np.dstack(
|
|
267
|
+
(
|
|
268
|
+
np.ones_like(energy),
|
|
269
|
+
np.clip(0.12 + energy * 0.82, 0, 1),
|
|
270
|
+
np.clip((energy - 0.93) * 8, 0, 1),
|
|
271
|
+
)
|
|
219
272
|
)
|
|
220
|
-
)
|
|
221
273
|
a[:, :, :3] = a[:, :, :3] * (1 - self.warmth) + warm * self.warmth
|
|
222
274
|
tile = Image.fromarray(np.rint(a * 255).astype(np.uint8))
|
|
223
275
|
if front != 1:
|
|
224
276
|
shifted = Image.new("RGBA", self.size)
|
|
225
277
|
shifted.alpha_composite(tile, (0, round((front - 1) * self.size[1])))
|
|
226
278
|
tile = shifted
|
|
279
|
+
if self.palette and self.palette_vertical:
|
|
280
|
+
# Apply the tip bias after front placement. Otherwise a moving burn
|
|
281
|
+
# front can translate all cooler graded pixels off-canvas and leave
|
|
282
|
+
# only the body/core colours visible at the consumption edge.
|
|
283
|
+
np = self.np
|
|
284
|
+
a = np.asarray(tile, dtype=np.float32) / 255
|
|
285
|
+
energy = np.max(a[:, :, :3], axis=2)
|
|
286
|
+
low = np.asarray(self.palette[0], dtype=np.float32) / 255
|
|
287
|
+
y = np.linspace(0, 1, a.shape[0], dtype=np.float32)[:, None]
|
|
288
|
+
tip = np.clip((front - y) / max(0.05, self.flame_height), 0, 1)
|
|
289
|
+
tip *= self.palette_vertical
|
|
290
|
+
cool = low[None, None, :] * (0.38 + 0.62 * energy)[:, :, None]
|
|
291
|
+
a[:, :, :3] = a[:, :, :3] * (1 - tip[:, :, None]) + cool * tip[:, :, None]
|
|
292
|
+
tile = Image.fromarray(np.rint(a * 255).astype(np.uint8))
|
|
227
293
|
factor = amount * self.opacity
|
|
228
294
|
tile.putalpha(tile.getchannel("A").point(lambda a: round(a * factor)))
|
|
229
295
|
if self.glow:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: framerudiments
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.3
|
|
4
4
|
Summary: Deterministic Shorts and lyric visualisers using DanceRudiments and StemLab evidence.
|
|
5
5
|
Author: Kieran Simkin
|
|
6
6
|
License-Expression: MIT
|
|
@@ -33,9 +33,10 @@ Dynamic: license-file
|
|
|
33
33
|
|
|
34
34
|
## Five fire methods and ice
|
|
35
35
|
|
|
36
|
-
Version 0.4.
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
Version 0.4.3 adds evidence-recorded three-stop fire palettes, an optional
|
|
37
|
+
vertical tip bias applied after burn-front placement, and less repetitive
|
|
38
|
+
deterministic layouts for filmed and Mantaflow sources. The five fire methods,
|
|
39
|
+
scorched artwork burn-away, fractured ice and frost remain available through ordinary material layers or the reusable
|
|
39
40
|
`FireRenderer` and `NaturalMaterial` APIs. Source clocks, clean text, transparent edges and
|
|
40
41
|
seek-safe rendering remain explicit. See [natural materials](docs/natural-materials.md).
|
|
41
42
|
|
|
@@ -98,6 +98,23 @@ def test_grade_keeps_alpha_at_unshifted_front(atlas):
|
|
|
98
98
|
b.close()
|
|
99
99
|
|
|
100
100
|
|
|
101
|
+
def test_three_stop_palette_grades_fire_without_changing_alpha(atlas):
|
|
102
|
+
palette = ["#531178", "#ef5b16", "#ffd25c"]
|
|
103
|
+
plain = FireRenderer((64, 64), "footage", asset=atlas, warmth=0, glow=0)
|
|
104
|
+
graded = FireRenderer(
|
|
105
|
+
(64, 64), "footage", asset=atlas, warmth=1, palette=palette, palette_vertical=0.7, glow=0
|
|
106
|
+
)
|
|
107
|
+
try:
|
|
108
|
+
a, b = plain.render(0.1, front=1), graded.render(0.1, front=1)
|
|
109
|
+
assert a.getchannel("A").tobytes() == b.getchannel("A").tobytes()
|
|
110
|
+
assert a.tobytes() != b.tobytes()
|
|
111
|
+
assert graded.evidence["palette"] == palette
|
|
112
|
+
assert graded.evidence["palette_vertical"] == 0.7
|
|
113
|
+
finally:
|
|
114
|
+
plain.close()
|
|
115
|
+
graded.close()
|
|
116
|
+
|
|
117
|
+
|
|
101
118
|
def test_native_sprite_particle_age_selects_frame_and_long_source_is_bounded(atlas):
|
|
102
119
|
f = FireRenderer((64, 64), "sprites", asset=atlas)
|
|
103
120
|
try:
|
|
@@ -153,6 +170,9 @@ def test_bundled_assets_have_reviewed_provenance_and_no_private_paths():
|
|
|
153
170
|
{"backend_settings": []},
|
|
154
171
|
{"method": "missing"},
|
|
155
172
|
{"asset": {}, "method": "fluid_2d"},
|
|
173
|
+
{"palette": ["#fff", "#000"]},
|
|
174
|
+
{"palette": ["#fff", "not-a-colour", "#000"]},
|
|
175
|
+
{"palette_vertical": 2},
|
|
156
176
|
),
|
|
157
177
|
)
|
|
158
178
|
def test_invalid_fire_options_do_not_fallback(settings):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{framerudiments-0.4.2 → framerudiments-0.4.3}/scripts/generate_visualiser_routing_gallery.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|