|
|
|
@ -1,93 +1,157 @@
|
|
|
|
|
# Acute Tasks
|
|
|
|
|
- [x] Implement Material Import for Maxim Data
|
|
|
|
|
- [x] Implement Robust DataFlowKind for list-like / spectral-like composite types
|
|
|
|
|
- [x] Unify random node/socket caches.
|
|
|
|
|
- [x] Revalidate cache logic
|
|
|
|
|
- [x] Finish math system
|
|
|
|
|
- [ ] Finish the "Low-Hanging Fruit" Nodes
|
|
|
|
|
- [ ] Move preview GN trees to the asset library.
|
|
|
|
|
# Working TODO
|
|
|
|
|
- [ ] Wave Constant
|
|
|
|
|
- Bounds
|
|
|
|
|
- [ ] Boundary Conds
|
|
|
|
|
- [ ] PML
|
|
|
|
|
- [ ] PEC
|
|
|
|
|
- [ ] PMC
|
|
|
|
|
- [ ] Bloch
|
|
|
|
|
- [ ] Absorbing
|
|
|
|
|
- Sources
|
|
|
|
|
- [ ] Temporal Shapes / Continuous Wave Temporal Shape
|
|
|
|
|
- [ ] Temporal Shapes / Symbolic Temporal Shape
|
|
|
|
|
- [ ] Plane Wave Source
|
|
|
|
|
- [ ] TFSF Source
|
|
|
|
|
- [ ] Gaussian Beam Source
|
|
|
|
|
- [ ] Astig. Gauss Beam
|
|
|
|
|
- Material Data Fitting
|
|
|
|
|
- [ ] Data File Import
|
|
|
|
|
- [ ] DataFit Medium
|
|
|
|
|
- Monitors
|
|
|
|
|
- [ ] EH Field
|
|
|
|
|
- [ ] Power Flux
|
|
|
|
|
- [ ] Permittivity
|
|
|
|
|
- [ ] Diffraction
|
|
|
|
|
- Structures
|
|
|
|
|
- [ ] Cylinder
|
|
|
|
|
- [ ] Cylinder Array
|
|
|
|
|
- [ ] L-Cavity Cylinder
|
|
|
|
|
- [ ] H-Cavity Cylinder
|
|
|
|
|
- [ ] FCC Lattice
|
|
|
|
|
- [ ] BCC Lattice
|
|
|
|
|
- Sim Grid
|
|
|
|
|
- [ ] Sim Grid
|
|
|
|
|
- [ ] Auto
|
|
|
|
|
- [ ] Manual
|
|
|
|
|
- [ ] Uniform
|
|
|
|
|
- [ ] Data
|
|
|
|
|
- Mediums
|
|
|
|
|
- [ ] PEC Medium
|
|
|
|
|
- [ ] Isotropic Medium
|
|
|
|
|
- [ ] Sellmeier Medium
|
|
|
|
|
- [ ] Drude Medium
|
|
|
|
|
- [ ] Debye Medium
|
|
|
|
|
- [ ] Anisotropic Medium
|
|
|
|
|
- Tidy3D
|
|
|
|
|
- [ ] Exporter
|
|
|
|
|
- [ ] Importer
|
|
|
|
|
- Integration
|
|
|
|
|
- [ ] Simulation and Analysis of Maxim's Cavity
|
|
|
|
|
- Constants
|
|
|
|
|
- [ ] Number Constant
|
|
|
|
|
- [ ] Vector Constant
|
|
|
|
|
- [ ] Physical Constant
|
|
|
|
|
|
|
|
|
|
- [ ] Fix many problems by persisting `_enum_cb_cache` and `_str_cb_cache`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Nodes
|
|
|
|
|
## Analysis
|
|
|
|
|
- [x] Extract
|
|
|
|
|
- [ ] Implement "saved" state for info, and provide the user an indicator that state has been saved w/a button to reset (the state should also be reset when plugging a new data thing in)
|
|
|
|
|
- [x] Viz
|
|
|
|
|
- [ ] Implement Info-driven planar projection of pixels onto managed image empty.
|
|
|
|
|
- [ ] Live-slice 2D field values onto user-controlled image empty from 2D field.
|
|
|
|
|
- [ ] SocketType-based visualization support.
|
|
|
|
|
- [ ] Pol SocketType: 2D elliptical visualization of Jones vectors.
|
|
|
|
|
- [ ] Pol SocketType: 3D Poincare sphere visualization of Stokes vectors.
|
|
|
|
|
|
|
|
|
|
- [x] Math / Map Math
|
|
|
|
|
- [ ] Remove "By x" socket set let socket sets only be "Function"/"Expr"; then add a dynamic enum underneath to select "By x" based on data support.
|
|
|
|
|
- [ ] Filter the operations based on data support, ex. use positive-definiteness to guide cholesky.
|
|
|
|
|
- [ ] Implement support for additional symbols via `Expr`.
|
|
|
|
|
- [x] Math / Filter Math
|
|
|
|
|
- [ ] Math / Reduce Math
|
|
|
|
|
- [ ] Math / Operate Math
|
|
|
|
|
- [x] Math / Operate Math
|
|
|
|
|
- [ ] Remove two-layered dropdown; directly filter operations and use categories to seperate them.
|
|
|
|
|
- [ ] Implement Expr socket advancements to make a better experience operating between random expression-like sockets.
|
|
|
|
|
|
|
|
|
|
## Inputs
|
|
|
|
|
- [x] Wave Constant
|
|
|
|
|
- [x] Implement export of frequency / wavelength array/range.
|
|
|
|
|
- [x] Unit System
|
|
|
|
|
- [ ] Implement presets, including "Tidy3D" and "Blender", shown in the label row.
|
|
|
|
|
- [ ] Fix the LazyValueRange (again!)
|
|
|
|
|
- [ ] Document
|
|
|
|
|
- [x] Scene
|
|
|
|
|
- [ ] Implement export of scene time via. Blender unit system.
|
|
|
|
|
- [ ] Implement optional scene-synced time exporting, so that the simulation definition and scene definition match for analysis needs.
|
|
|
|
|
|
|
|
|
|
- [x] Constants / Scientific Constant
|
|
|
|
|
- [x] Create `utils.sci_constants` to map `scipy` constants to `sympy` units.
|
|
|
|
|
- [x] Utilize `utils.sci_constants` to make it easy for the user to select appropriate constants with two-layered dropdowns.
|
|
|
|
|
- [x] Constants / Expr Constant
|
|
|
|
|
- See IDEAS.
|
|
|
|
|
- [x] Constants / Number Constant
|
|
|
|
|
- [ ] Fix non-integer sockets
|
|
|
|
|
- [ ] Constants / Vector Constant
|
|
|
|
|
- [ ] Constants / Physical Constant
|
|
|
|
|
- [ ] Pol: Elliptical viz as 2D plot.
|
|
|
|
|
- [ ] Pol: Poincare sphere viz as 3D GN.
|
|
|
|
|
- [x] Constants / Scientific Constant
|
|
|
|
|
- [ ] Nicer (boxed?) node information, maybe centered headers, in a box, etc. .
|
|
|
|
|
- [x] Constants / Unit System Constant
|
|
|
|
|
- [ ] Implement presets, including "Tidy3D" and "Blender", shown in the label row.
|
|
|
|
|
- [x] Constants / Blender Constant
|
|
|
|
|
- [ ] Fix it!
|
|
|
|
|
|
|
|
|
|
- [ ] Web / Tidy3D Web Importer
|
|
|
|
|
- [ ] Have a visual indicator for the current download status, with a manual re-download button.
|
|
|
|
|
- [ ] Fix the check of folders, actually, just fix `tdcloud` in general!
|
|
|
|
|
- [ ] Have a visual indicator for the download status of the currently selected task, as well as its data size.
|
|
|
|
|
- [ ] If a task is "selected", lock the cloud task socket, so other tasks can't be selected. While that lock is active, expose a real "download" button. Also make the loose output socket and put out a `FlowPending` until the download is available.
|
|
|
|
|
- [ ] A manual download button and seperate re-download button (maybe on the side, round reload boi).
|
|
|
|
|
- [ ] An option to pack the data into the blend, with overview of how much data it will take (Base85/base64 has overhead).
|
|
|
|
|
- [ ] Default limits for caching/packing.
|
|
|
|
|
- [ ] Support importing batched simulations and outputting an `Array` of SimData.
|
|
|
|
|
|
|
|
|
|
- [x] File Import / Material Import
|
|
|
|
|
- [x] Dropdown to choose import format
|
|
|
|
|
- MERGED w/TIDY3D FILE IMPORT
|
|
|
|
|
- [x] File Import / Tidy3D File Import
|
|
|
|
|
- [x] HDF and JSON file support, with appropriate choice of loose output socket.
|
|
|
|
|
- [ ] File Import / Array File Import
|
|
|
|
|
- [ ] File Import / Data File Import
|
|
|
|
|
- [ ] Implement `FlowKind.LazyValueFunc` that plays the loading game.
|
|
|
|
|
- [ ] Implement `FlowKind.Info` which lets the user describe the data being loaded, for proper further processing.
|
|
|
|
|
- [ ] Implement unit system input to guide conversion from numpy data type.
|
|
|
|
|
- [ ] Implement datatype dropdown to guide format from disk, prefilled to detected.
|
|
|
|
|
- [ ] Implement `FlowKind.Array` that just runs the `LazyValueFunc` as usual.
|
|
|
|
|
- [ ] Standardize 1D and 2D array loading/saving on numpy's savetxt with gzip enabled.
|
|
|
|
|
- [ ] Implement unit system input to guide conversion from numpy data type.
|
|
|
|
|
- [ ] Implement datatype dropdown to guide format from disk, prefilled to detected.
|
|
|
|
|
- [ ] Implement a LazyValue to provide a data path that avoids having to load massive arrays every time always.
|
|
|
|
|
- [x] File Import / Tidy3D File Import
|
|
|
|
|
|
|
|
|
|
## Outputs
|
|
|
|
|
- [x] Viewer
|
|
|
|
|
- [ ] Remove image preview when disabling plots.
|
|
|
|
|
- [x] Auto-enable 3D preview when creating.
|
|
|
|
|
- [ ] Consider a "debug" mode
|
|
|
|
|
- [ ] Auto-enable plot when creating.
|
|
|
|
|
- [ ] Test/support multiple viewers at the same time.
|
|
|
|
|
- [ ] Pop-up w/multiline string as alternative to console print.
|
|
|
|
|
- [ ] Handle per-tree viewers, so that switching trees doesn't "bleed" state from the old tree.
|
|
|
|
|
- [ ] BUG: CTRL+SHIFT+CLICK not on a node shows an error; should just do nothing.
|
|
|
|
|
|
|
|
|
|
- [x] Web Export / Tidy3D Web Exporter
|
|
|
|
|
- This is an extraordinarily nuanced node, and will need constant adjusting if it is to be robust.
|
|
|
|
|
- [ ] Run checks on-demand, and require they be run before the sim can be uploaded. If the simulation changes, don't
|
|
|
|
|
- [ ] Support doing checks in a seperate process.
|
|
|
|
|
- [ ] We need better ways of doing checks before uploading, like for monitor data size. Maybe a SimInfo node?
|
|
|
|
|
- [ ] Implement "new folder" feature w/popup operator.
|
|
|
|
|
- [ ] Implement "delete task" feature w/popup confirmation.
|
|
|
|
|
- [ ] We need to be able to "delete and re-upload" (or maybe just delete from the interface).
|
|
|
|
|
- [ ] Accept `Array` of simulations, and upload them as `Batch`.
|
|
|
|
|
|
|
|
|
|
- [x] File Export / JSON File Export
|
|
|
|
|
- [ ] File Import / Tidy3D File Export
|
|
|
|
|
- [ ] Reevaluate its purpose.
|
|
|
|
|
- [ ] File Export / Tidy3D File Export
|
|
|
|
|
- [ ] Implement HDF-based export of Tidy3D-exported object (which includes ex. mesh data and such)
|
|
|
|
|
- [ ] Also JSON (but indicate somehow that ex. mesh data doesn't come along for the ride).
|
|
|
|
|
- [ ] File Export / Array File Export
|
|
|
|
|
- [ ] File Export / Data File Export
|
|
|
|
|
- [ ] Implement datatype dropdown to guide format on disk.
|
|
|
|
|
- [ ] Implement unit system input to guide conversion to numpy data type.
|
|
|
|
|
- [ ] Standardize 1D and 2D array loading/saving on numpy's savetxt with gzip enabled.
|
|
|
|
|
|
|
|
|
|
## Viz
|
|
|
|
|
- [x] Monitor Data Viz
|
|
|
|
|
- [x] Implement dropdown to choose which monitor in the SimulationData should be visualized (based on which are available in the SimulationData), and implement visualization based on every kind of monitor-adjascent output data type (<https://docs.flexcompute.com/projects/tidy3d/en/latest/api/output_data.html>)
|
|
|
|
|
- [ ] Project field values onto a plane object (managed)
|
|
|
|
|
|
|
|
|
|
## Sources
|
|
|
|
|
- [x] Temporal Shapes / Gaussian Pulse Temporal Shape
|
|
|
|
|
- [x] Temporal Shapes / Continuous Wave Temporal Shape
|
|
|
|
|
- [ ] Temporal Shapes / Symbolic Temporal Shape
|
|
|
|
|
- [ ] Specify a Sympy function to generate appropriate array based on
|
|
|
|
|
- [ ] Temporal Shapes / Array Temporal Shape
|
|
|
|
|
- [ ] Temporal Shapes / Data Temporal Shape
|
|
|
|
|
|
|
|
|
|
- [x] Point Dipole Source
|
|
|
|
|
- [ ] Use a viz mesh, not empty (empty doesn't play well with alpha hashing).
|
|
|
|
|
- [ ] Plane Wave Source
|
|
|
|
|
- [x] Implement an oriented vector input with 3D preview.
|
|
|
|
|
- [ ] **IMPORTANT**: Fix the math so that an actually valid construction emerges!!
|
|
|
|
|
- [ ] Uniform Current Source
|
|
|
|
|
- [ ] TFSF Source
|
|
|
|
@ -95,14 +159,17 @@
|
|
|
|
|
- [ ] Gaussian Beam Source
|
|
|
|
|
- [ ] Astigmatic Gaussian Beam Source
|
|
|
|
|
|
|
|
|
|
- [ ] Mode Source
|
|
|
|
|
|
|
|
|
|
- [ ] Array Source / EH Array Source
|
|
|
|
|
- [ ] Array Source / EH Equiv Array Source
|
|
|
|
|
- [ ] EH Array Source
|
|
|
|
|
- [ ] EH Equiv Array Source
|
|
|
|
|
|
|
|
|
|
## Mediums
|
|
|
|
|
- [x] Library Medium
|
|
|
|
|
- [ ] Implement frequency range output (listy)
|
|
|
|
|
- [ ] Implement frequency range output (listy), perhaps in the `InfoFlow` lane?
|
|
|
|
|
- [ ] Implement dynamic label.
|
|
|
|
|
- [ ] DataFit Medium
|
|
|
|
|
- [ ] Implement by migrating the material data fitting logic from the `Tidy3D File Importer`, except now only accept a `Data` input socket, and rely on the `Data File Importer` to do the parsing into an acceptable `Data` socket format.
|
|
|
|
|
- [ ] Save the result in the node, specifically in a property (serialized!) and lock the input graph while saved.
|
|
|
|
|
|
|
|
|
|
- [ ] PEC Medium
|
|
|
|
|
- [ ] Isotropic Medium
|
|
|
|
|
- [ ] Anisotropic Medium
|
|
|
|
@ -117,65 +184,60 @@
|
|
|
|
|
- [ ] Non-Linearity / Two-Photon Absorption Non-Linearity
|
|
|
|
|
- [ ] Non-Linearity / Kerr Non-Linearity
|
|
|
|
|
|
|
|
|
|
- [ ] Space/Time epsilon/mu Modulation
|
|
|
|
|
|
|
|
|
|
## Structures
|
|
|
|
|
- [ ] BLObject Structure
|
|
|
|
|
- [x] GeoNodes Structure
|
|
|
|
|
- [x] Rewrite the `bl_socket_map.py`
|
|
|
|
|
- [x] Use the modifier itself as memory, via the ManagedObj
|
|
|
|
|
- [x] Rewrite to use unit systems properly.
|
|
|
|
|
- [ ] Implement a panel system, to make GN trees with a ton of inputs (most of which are not usually needed) actually useful.
|
|
|
|
|
- [ ] Propertly map / implement Enum input sockets to the GN group.
|
|
|
|
|
- [ ] Implement a panel system, either based on native GN panels, or description parsing, or something like that.
|
|
|
|
|
|
|
|
|
|
- [ ] Primitive Structures / Line Structure
|
|
|
|
|
- [ ] Primitive Structures / Plane Structure
|
|
|
|
|
- [x] Primitive Structures / Box Structure
|
|
|
|
|
- [x] Primitive Structures / Sphere Structure
|
|
|
|
|
- [ ] Primitive Structures / Cylinder Structure
|
|
|
|
|
- [ ] Primitive Structures / Ring Structure
|
|
|
|
|
- [ ] Primitive Structures / Capsule Structure
|
|
|
|
|
- [ ] Primitive Structures / Cone Structure
|
|
|
|
|
|
|
|
|
|
## Monitors
|
|
|
|
|
- [x] E/H Field Monitor
|
|
|
|
|
- [x] Field Power Flux Monitor
|
|
|
|
|
- [ ] \epsilon Tensor Monitor
|
|
|
|
|
- [ ] Diffraction Monitor
|
|
|
|
|
- [ ] Axis-aligned planar 2D (pixel)
|
|
|
|
|
|
|
|
|
|
- [ ] Projected E/H Field Monitor / Cartesian Projected E/H Field Monitor
|
|
|
|
|
- [ ] Use to implement the metalens: <https://docs.flexcompute.com/projects/tidy3d/en/latest/notebooks/Metalens.html>
|
|
|
|
|
- [ ] Projected E/H Field Monitor / Angle Projected E/H Field Monitor
|
|
|
|
|
- [ ] Projected E/H Field Monitor / K-Space Projected E/H Field Monitor
|
|
|
|
|
|
|
|
|
|
- [ ] Modal Nodes
|
|
|
|
|
- Spatial+frequency feature monitoring. An EM field can be decomposed into using a specially configured solver, which can be used to look for very particular kinds of effects by constraining investigations of a solver result to filter out everything that isn't these particular modes aka. features. Kind of a fourier-based redimensionalization, almost).
|
|
|
|
|
|
|
|
|
|
## Simulations
|
|
|
|
|
- [x] FDTDSim
|
|
|
|
|
|
|
|
|
|
- [x] Sim Domain
|
|
|
|
|
- [ ] By-Medium batching of Structures when building the td.Simulation object, which can have significant performance implications.
|
|
|
|
|
- [ ] Primitive Structures / PolySlab Structure
|
|
|
|
|
|
|
|
|
|
## Bounds
|
|
|
|
|
- [x] Boundary Conds
|
|
|
|
|
- [ ] Boundary Cond / PML Bound Face
|
|
|
|
|
- [ ] Dropdown for "Normal" and "Stable"
|
|
|
|
|
- [ ] Boundary Cond / PEC Bound Face
|
|
|
|
|
- [ ] Boundary Cond / PMC Bound Face
|
|
|
|
|
- [ ] Boundary Cond / Bloch Bound Face
|
|
|
|
|
- [ ] Boundary Cond / Periodic Bound Face
|
|
|
|
|
- [ ] Implement "simple" mode aka "periodic" mode in Tidy3D
|
|
|
|
|
- [ ] Boundary Cond / Absorbing Bound Face
|
|
|
|
|
|
|
|
|
|
## Monitors
|
|
|
|
|
- [x] EH Field Monitor
|
|
|
|
|
- [ ] Method of setting `inf` on dimensions - use a `ManyEnum` maybe to select the injection axis, and let that set the $0$.
|
|
|
|
|
- [ ] Revamp the input parameters.
|
|
|
|
|
- [x] Power Flux Monitor
|
|
|
|
|
- [ ] Permittivity Monitor
|
|
|
|
|
- [ ] Diffraction Monitor
|
|
|
|
|
|
|
|
|
|
- [ ] Projected E/H Field Monitor / Cartesian Projected E/H Field Monitor
|
|
|
|
|
- [ ] Use to implement the metalens: <https://docs.flexcompute.com/projects/tidy3d/en/latest/notebooks/Metalens.html>
|
|
|
|
|
- [ ] Projected E/H Field Monitor / Angle Projected E/H Field Monitor
|
|
|
|
|
- [ ] Projected E/H Field Monitor / K-Space Projected E/H Field Monitor
|
|
|
|
|
|
|
|
|
|
## Simulations
|
|
|
|
|
- [x] FDTDSim
|
|
|
|
|
- [ ] By-Medium batching of Structures when building the td.Simulation object, which can have significant performance implications.
|
|
|
|
|
|
|
|
|
|
- [x] Sim Domain
|
|
|
|
|
|
|
|
|
|
- [ ] Sim Grid
|
|
|
|
|
- [ ] Sim Grid Axes / Auto Sim Grid Axis
|
|
|
|
|
- [ ] Sim Grid Axes / Manual Sim Grid Axis
|
|
|
|
|
- [ ] Sim Grid Axes / Uniform Sim Grid Axis
|
|
|
|
|
- [ ] Sim Grid Axes / Array Sim Grid Axis
|
|
|
|
|
- [ ] Sim Grid Axes / Data Sim Grid Axis
|
|
|
|
|
|
|
|
|
|
## Utilities
|
|
|
|
|
- [ ] Separate
|
|
|
|
|
- [ ] Use generic Expr socket mode to combine numerical types into either Expr or Data socket.
|
|
|
|
|
- [x] Combine
|
|
|
|
|
- [x] Implement concatenation of sim-critical socket types into their multi-type
|
|
|
|
|
- [ ] Use generic Expr socket mode to combine numerical types into either Expr or Data socket.
|
|
|
|
|
- [ ] Explicit about lower structures taking precedence.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -183,34 +245,30 @@
|
|
|
|
|
- [ ] Tests / Monkey (suzanne deserves to be simulated, she may need manifolding up though :))
|
|
|
|
|
- [ ] Tests / Wood Pile
|
|
|
|
|
|
|
|
|
|
- [ ] Structures / Primitives / Line
|
|
|
|
|
- [ ] Structures / Primitives / Plane
|
|
|
|
|
- [x] Structures / Primitives / Box
|
|
|
|
|
- [x] Structures / Primitives / Sphere
|
|
|
|
|
- [ ] Structures / Primitives / Cylinder
|
|
|
|
|
- [x] Structures / Primitives / Ring
|
|
|
|
|
- [ ] Structures / Primitives / Capsule
|
|
|
|
|
- [ ] Structures / Primitives / Cone
|
|
|
|
|
|
|
|
|
|
- [ ] Structures / Arrays / Square
|
|
|
|
|
- [ ] Structures / Arrays / Square-Hole
|
|
|
|
|
- [ ] Structures / Arrays / Cyl
|
|
|
|
|
- [ ] Structures / Arrays / Cyl-Hole
|
|
|
|
|
- [x] Structures / Arrays / Box
|
|
|
|
|
- [x] Structures / Arrays / Sphere
|
|
|
|
|
- [ ] Structures / Arrays / Box
|
|
|
|
|
- [ ] Structures / Arrays / Sphere
|
|
|
|
|
- [ ] Structures / Arrays / Cylinder
|
|
|
|
|
- [x] Structures / Arrays / Ring
|
|
|
|
|
- [ ] Structures / Arrays / Capsule
|
|
|
|
|
- [ ] Structures / Arrays / Cone
|
|
|
|
|
|
|
|
|
|
- [ ] Array / Square Array **NOTE: Ring and cylinder**
|
|
|
|
|
- [ ] Array / Hex Array **NOTE: Ring and cylinder**
|
|
|
|
|
- [ ] Hole Array / Square Hole Array: Takes a primitive hole shape.
|
|
|
|
|
- [ ] Hole Array / Hex Hole Array: Takes a primitive hole shape.
|
|
|
|
|
- [ ] Cavity Array / Hex Array w/ L-Cavity
|
|
|
|
|
- [ ] Cavity Array / Hex Array w/ H-Cavity
|
|
|
|
|
- [ ] Structures / Hex Arrays / Cyl
|
|
|
|
|
- [ ] Structures / Hex Arrays / Box
|
|
|
|
|
- [ ] Structures / Hex Arrays / Sphere
|
|
|
|
|
- [ ] Structures / Hex Arrays / Cylinder
|
|
|
|
|
- [x] Structures / Hex Arrays / Ring
|
|
|
|
|
|
|
|
|
|
- [ ] Crystal Sphere Lattice / Sphere FCC Array
|
|
|
|
|
- [ ] Crystal Sphere Lattice / Sphere BCC Array
|
|
|
|
|
- [ ] Structures / Cavity Arrays / L-Cavity Cylinder
|
|
|
|
|
- [ ] Structures / Cavity Arrays / H-Cavity Cylinder
|
|
|
|
|
|
|
|
|
|
- [ ] Structures / Lattice Arrays / FCC Sphere
|
|
|
|
|
- [ ] Structures / Lattice Arrays / BCC Sphere
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -233,6 +291,9 @@
|
|
|
|
|
- [x] String
|
|
|
|
|
- [x] File Path
|
|
|
|
|
- [x] Color
|
|
|
|
|
- [x] Expr
|
|
|
|
|
- [ ] Implement node-driven support for dynamic symbols.
|
|
|
|
|
- [ ] Implement compatibility with sockets that fundamentally do produce expressions, especially Physical sockets.
|
|
|
|
|
|
|
|
|
|
## Number
|
|
|
|
|
- [x] Integer
|
|
|
|
@ -279,7 +340,10 @@
|
|
|
|
|
|
|
|
|
|
## Tidy3D
|
|
|
|
|
- [x] Cloud Task
|
|
|
|
|
- [ ] Implement switcher for API-key-having config filconfig file vs. direct entry of API key. It should be auto-filled with the config file when such a thing exists.
|
|
|
|
|
- [ ] Move API checking out of the socket, and don't re-prompt for a key if the config file exists.
|
|
|
|
|
- [ ] Remove the existing task selector when making a new task.
|
|
|
|
|
- [ ] Implement "new folder" feature w/popup operator.
|
|
|
|
|
- [ ] Implement "delete task" feature w/popup confirmation.
|
|
|
|
|
|
|
|
|
|
## Physical
|
|
|
|
|
- [x] Unit System
|
|
|
|
@ -350,16 +414,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Internal / Architecture
|
|
|
|
|
## IDEAS
|
|
|
|
|
- [ ] Socket "guarding" - let nodes influence the dynamic capabilities of sockets to prevent links (with a `self.report` explanation) to an output socket that won't yet produce a value.
|
|
|
|
|
- [ ] Prevents some uses of loose sockets (we want less loose sockets!)
|
|
|
|
|
|
|
|
|
|
## CRITICAL
|
|
|
|
|
- [ ] Rethink the way that loose sockets are replaced, specifically with respect to deterministic ordering.
|
|
|
|
|
- Currently order is not guaranteed. This is causing problems.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## User-Facing Errors and Legal Considerations
|
|
|
|
|
- [ ] `log.error` should invoke `self.report` in some Blender operator - used for errors that are due to usage error (which can't simply be prevented with UX design, like text file formatting of import), not due to error in the program.
|
|
|
|
|
- [ ] License header UI for MaxwellSimTrees, to clarify the AGPL-compatible potentially user-selected license that trees must be distributed under.
|
|
|
|
|
- [x] Document the node tree cache semantics thoroughly; it's a VERY nuanced piece of logic, and its invariants may not survive Blender versions / the author's working memory
|
|
|
|
|
- [ ] Start standardizing nodes/sockets w/individualized SemVer
|
|
|
|
|
- [ ] A "CitationsFlow" FlowKind which simply propagates citations.
|
|
|
|
|
- [ ] Implement standardization of nodes/sockets w/individualized SemVer
|
|
|
|
|
- Perhaps keep node / socket versions in a property, so that trying to load an incompatible major version hop can error w/indicator of where to find a compatible `blender_maxwell` version.
|
|
|
|
|
- Integrate w/BLField, to help the user manage addon updates that would break their tree.
|
|
|
|
|
|
|
|
|
|
## Documentation
|
|
|
|
|
- [ ] Make all modules available
|
|
|
|
@ -368,16 +434,12 @@
|
|
|
|
|
- [ ] Comb through and finish `__doc__`s.
|
|
|
|
|
|
|
|
|
|
## Performance
|
|
|
|
|
- [ ] The GN value pushing currently does an expensive from-sympy conversion for all GN attributes, making it very slow.
|
|
|
|
|
- Generally, the issue is that we can't compare the pushed value to the existing value without a conversion.
|
|
|
|
|
- Also, sympy expressions can't be hashed (by default), and `str()` may be just as slow, so a simple `@lru_cache` is no good.
|
|
|
|
|
- **One approach** is a `HashableSympyExpr` class, which would use ex. atoms and values in `SympyExpr` to let us `@lru_cache` the sympy conversion.
|
|
|
|
|
- **Another approach** is to "just" make the `scale_to_unit` function faster (we should profile).
|
|
|
|
|
- Presumably, the scaling factors between units could be eagerly cached, then the numerical part of the expression could be used to avoid `convert_to` calls.
|
|
|
|
|
- Without the list format of `(np.array, spu.Quantity)`, `sp.Matrix` can't be performantly handled like this.
|
|
|
|
|
- [ ] Optimize GN value pushing w/sympy expression hashing.
|
|
|
|
|
|
|
|
|
|
## Style
|
|
|
|
|
- [ ] Color of nodes should be a nice blue, eh?
|
|
|
|
|
Header color style can't be done, unfortunately. Body color feels unclean, so nothing there for now.
|
|
|
|
|
|
|
|
|
|
- [ ] Node icons to denote preview/plot state.
|
|
|
|
|
|
|
|
|
|
## Registration and Contracts
|
|
|
|
|
- [ ] Refactor the node category code; it's ugly.
|
|
|
|
@ -396,47 +458,30 @@
|
|
|
|
|
- [ ] Document the `tdcloud` service thoroughly and open a GitHub discussion about `td.web` shortcomings.
|
|
|
|
|
|
|
|
|
|
## Node Base Class
|
|
|
|
|
- [ ] Implement a new socket type for preview-only parameters
|
|
|
|
|
- [ ] When used, the node base class should expose a toggle
|
|
|
|
|
- [ ] Instead of mangling props, we can instead reuse all of the socket-based code, while also enabling composability of previews.
|
|
|
|
|
- [ ] Custom `@cache`/`@lru_cache`/`@cached_property` which caches by instance ID (possibly based on `beartype` or `pydantic`).
|
|
|
|
|
- The problem to solve is performance vs. persistence.
|
|
|
|
|
- [ ]
|
|
|
|
|
- [ ] Implement by-category sorting of loose sockets with 'move' method on `node.inputs`/`node.outputs`.
|
|
|
|
|
- Currently order is not guaranteed
|
|
|
|
|
- [ ] When presets are used, if a preset is selected and the user alters a preset setting, then dynamically switch the preset indicator back to "Custom" to indicate that there is no active preset
|
|
|
|
|
- [ ] Re-engineer "presets" to use an Enum of some kind.
|
|
|
|
|
|
|
|
|
|
## Events
|
|
|
|
|
- [x] Mechanism for selecting a blender object managed by a particular node.
|
|
|
|
|
- [ ] Standard way of triggering the selection
|
|
|
|
|
- [ ] Mechanism for ex. specially coloring a node that is currently participating in the preview.
|
|
|
|
|
- [ ] Custom callbacks when deleting a node (in `free()`), to ex. delete all previews with the viewer node.
|
|
|
|
|
- [ ] When a Blender object is selected, select the node that owns its ManagedObj.
|
|
|
|
|
- [ ] Node button / shortcut / something to select the ManagedObj owned by a node.
|
|
|
|
|
|
|
|
|
|
## Socket Base Class
|
|
|
|
|
- [ ] Second-generation listy, based on a `DataFlowKind.ValueListy`, `DataFlowKind.ValueRange`, etc. to encode the presence of special logic.
|
|
|
|
|
- This is key to allow special handling, as "just give me a `list[]` of `sympy` objects" is an exceptionally non-performant and brittle thing.
|
|
|
|
|
- [ ] Implement capability system, which defaults to exactly matching the type.
|
|
|
|
|
- [ ] Make `to_socket`s no-consent to new links from `from_socket`s of incompatible Capability.
|
|
|
|
|
- [ ] Add Capabilities needed mainly in cases where we need `Any` currently.
|
|
|
|
|
- [ ] Collect `SocketDef` objects like we do with `BL_REGISTER`, without any special mojo sauce.
|
|
|
|
|
|
|
|
|
|
## Many Nodes
|
|
|
|
|
- [ ] Implement "Steady-State" / "Time Domain" on all relevant Monitor nodes
|
|
|
|
|
- [ ] (?) Dynamic `bl_label` where appropriate (ex. "Library Medium" becoming "Au Medium")
|
|
|
|
|
- [ ] Implement LazyValue, including LazyParamValue on a new class of constant-like input nodes that really just emit ex. sympy variables.
|
|
|
|
|
- [ ] Medium Features
|
|
|
|
|
- [ ] Accept spatial field. Else, spatial uniformity.
|
|
|
|
|
- [ ] Accept non-linearity. Else, linear.
|
|
|
|
|
- [ ] Accept space-time modulation. Else, static.
|
|
|
|
|
- [ ] Modal Features
|
|
|
|
|
- [ ] ModeSpec, for use by ModeSource, ModeMonitor, ModeSolverMonitor. Data includes ModeSolverData, ModeData, ScalarModeFieldDataArray, ModeAmpsDataArray, ModeIndexDataArray, ModeSolver.
|
|
|
|
|
- ModeSpec, for use by ModeSource, ModeMonitor, ModeSolverMonitor. Data includes ModeSolverData, ModeData, ScalarModeFieldDataArray, ModeAmpsDataArray, ModeIndexDataArray, ModeSolver.
|
|
|
|
|
|
|
|
|
|
## Many Sockets
|
|
|
|
|
- [ ] Implement constrained SympyExpr checks all over the place.
|
|
|
|
|
|
|
|
|
|
## Development Tooling
|
|
|
|
|
- [ ] Implement `pre-commit.
|
|
|
|
|
- [ ] Pass a `mypy` check
|
|
|
|
|
- [ ] Pass all `ruff` checks, including `__doc__` availability.
|
|
|
|
|
- [ ] Implement `pre-commit.
|
|
|
|
|
- [ ] Add profiling support, so we can properly analyze performance characteristics.
|
|
|
|
|
- Without a test harness, or profile-while-logging, there may be undue noise in our analysis.
|
|
|
|
|
- [ ] Simple `pytest` harnesses for unit testing of nodes, sockets.
|
|
|
|
@ -454,41 +499,24 @@
|
|
|
|
|
- We might still want/need the jax based stuff after; volume geonodes aren't finalized.
|
|
|
|
|
|
|
|
|
|
## Packaging
|
|
|
|
|
- [ ] Popup to install dependencies after UI is available (possibly with the help of the `draw()` function of the `InstallPyDeps` operator)
|
|
|
|
|
- [ ] Use a Modal and multiline-text-like construction to print `pip install` as we install dependencies, so that the user has an idea that something is happening.
|
|
|
|
|
- [ ] Test lockfile platform-agnosticism on Windows
|
|
|
|
|
|
|
|
|
|
## BLCache
|
|
|
|
|
- [ ] Replace every raw property with `BLField`.
|
|
|
|
|
- [ ] Add matrix property support: https://developer.blender.org/docs/release_notes/3.0/python_api/#other-additions
|
|
|
|
|
- [ ] Fix many problems by persisting `_enum_cb_cache` and `_str_cb_cache`.
|
|
|
|
|
- [ ] Docstring parser for descriptions.
|
|
|
|
|
- [ ] Method of dynamically setting property options after creation, using `idproperty_ui_data`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# BUGS
|
|
|
|
|
We're trying to do our part by reporting bugs we find!
|
|
|
|
|
This is where we keep track of them for now.
|
|
|
|
|
This is where we keep track of them for now, if they're not covered by the above listings.
|
|
|
|
|
|
|
|
|
|
## Blender Maxwell Bugs
|
|
|
|
|
- [ ] Detaching data chained into Viz node makes for a very laggy error, as non-implemented LazyValueFunc suddenly can't propagate live into the Viz node.
|
|
|
|
|
- [ ] Need to clear invalid searched StrProperties on copy
|
|
|
|
|
- [ ] Enabled 3D preview is really slow for some reason when working with the math nodes.
|
|
|
|
|
|
|
|
|
|
- [ ] BUG: CTRL+SHIFT+CLICK not on a node shows an error; should just do nothing.
|
|
|
|
|
- [ ] Slow changing of socket sets / range on wave constant.
|
|
|
|
|
- [ ] API auth shouldn't show if everything is fine in Cloud Task socket
|
|
|
|
|
- [ ] Cloud task socket loads folders before its node shows, which can be slow (and error prone if offline)
|
|
|
|
|
- [ ] Dispersive fit is slow, which means lag on normal operations that rely on the fit result - fit computation should be integrated into the node, and the output socket should only appear when the fit is available.
|
|
|
|
|
- [ ] Numerical, Physical Constant is missing entries
|
|
|
|
|
- [ ] Numerical, Physical Constant is missing entries
|
|
|
|
|
|
|
|
|
|
BROKE NODES
|
|
|
|
|
- [ ] Numerical constant doesn't switch types
|
|
|
|
|
- [ ] Blender constant is inexplicably mega laggy
|
|
|
|
|
- [ ] Web importer is just wonky in general
|
|
|
|
|
- [ ] JSON File exporter is having trouble with generic types (is that bad?)
|
|
|
|
|
|
|
|
|
|
- [ ] Extact Data needs flux settings
|
|
|
|
|
- [ ] Point dipole still has no preview
|
|
|
|
|
- [ ] Plane wave math still doesn't work and it has no preview
|
|
|
|
|
- [ ] Monitors need a way of setting infinite dimensions
|
|
|
|
|
|
|
|
|
|
## Blender Bugs
|
|
|
|
|
Reported:
|
|
|
|
@ -511,87 +539,39 @@ Unreported:
|
|
|
|
|
- Let's have operator `poll_message_set`: https://projects.blender.org/blender/blender/commit/ebe04bd3cafaa1f88bd51eee5b3e7bef38ae69bc
|
|
|
|
|
- Careful, Python uses user site packages: <https://projects.blender.org/blender/blender/commit/72c012ab4a3d2a7f7f59334f4912402338c82e3c>
|
|
|
|
|
- Our modifier obj can see execution time: <https://projects.blender.org/blender/blender/commit/8adebaeb7c3c663ec775fda239fdfe5ddb654b06>
|
|
|
|
|
- We found the translation callback! https://projects.blender.org/blender/blender/commit/8564e03cdf59fb2a71d545e81871411b82f561d9
|
|
|
|
|
- This can update the node center!!
|
|
|
|
|
|
|
|
|
|
- [x] Optimize the `DataChanged` invalidator.
|
|
|
|
|
- [ ] Optimize unit stripping.
|
|
|
|
|
## IDEAS
|
|
|
|
|
- [ ] Depedencies-gated addon preferences.
|
|
|
|
|
- [ ] Preferences-based specification/alteration of default unit systems for Tidy3D and Blender.
|
|
|
|
|
- [ ] Preferences-based specification/alteration of Tidy3D API key, so we can factor away all the `prelock` bullshit.
|
|
|
|
|
|
|
|
|
|
- [ ] Subsockets
|
|
|
|
|
- We need Exprs to not be so picky.
|
|
|
|
|
- All the sympy-making nodes should be subsockets of Expr, so that you can plug any socket that should work with Expr into Expr.
|
|
|
|
|
- When it comes to Data, any Expr that produces an array-like output from its `LazyValueFunc` should be deemed compatible (as in, the Expr may plug into a Data socket).
|
|
|
|
|
- Specifically, that means the presence of a well-defined `Info`, as well as `jax` compatibility.
|
|
|
|
|
|
|
|
|
|
- [ ] Symbolic Expr Socket
|
|
|
|
|
- [ ] Nodes should be able to dynamically define new symbols on their Expr sockets.
|
|
|
|
|
- [ ] Expr's `FlowKind`s should be expanded:
|
|
|
|
|
- [ ] `Capabilities`: Expand to include subsocket checking, where Expr is the supersocket of ex. most/all of the physical, numerical, vector sockets.
|
|
|
|
|
- [ ] `Value`: Just the raw sympy expression, when `active_kind` is `Value`.
|
|
|
|
|
- [ ] `Array`: The evaluated `LazyValueFunc`, when `active_kind` is `Array`.
|
|
|
|
|
- Should require that the expression as a whole simplifies to `sp.Matrix`.
|
|
|
|
|
- Should require that there are no symbols to be defined in a socket (since `LazyValueFunc` must be called with no args).
|
|
|
|
|
- [ ] `LazyValueFunc`: Create a 'jax' function from an expression, such that each symbol becomes an argument to that function.
|
|
|
|
|
- When `active_kind` is `Value`, it should take arrays/scalars and return a scalar (expression output is a normal sympy number of some kind).
|
|
|
|
|
- When `active_kind` is `Array`, it should take arrays/scalars and return an array (expression output is `sp.Matrix`).
|
|
|
|
|
- This kind of approach allows using
|
|
|
|
|
- [ ] `LazyValueRange`: Expose two expressions, start/end, but with one symbol set.
|
|
|
|
|
- [ ] `Info`: Should always produce an `InfoFlow` that, at minimum, has an empty `dim_*`, an `output_shape` of `None`, etc., for a scalar.
|
|
|
|
|
- [ ] Implement an Expr Constant node to see all this through in prototype.
|
|
|
|
|
- [ ] Expr: Obviously, input and output.
|
|
|
|
|
- [ ] Symbols: Node-bound dynamic thing where you can add and subtract symbols, as well as set their type. They should popup in the `Let:` statement of the input expr socket.
|
|
|
|
|
- [ ] Examples: Each symbol should have the ability to set "example values", which causes the Node to fill `Params`. When all
|
|
|
|
|
|
|
|
|
|
## Keyed Cache
|
|
|
|
|
- [x] Implement `bl_cache.KeyedCache` for, especially, abstracting the caches underlying the input and output sockets.
|
|
|
|
|
- [ ] Report reason for no-link using `self.report`.
|
|
|
|
|
|
|
|
|
|
- [ ] Dropping a link on empty space should query a menu of possible nodes, or if only one node is reasonable, make that node.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## BLField as Property Abstraction
|
|
|
|
|
We need Python properties to work together with Blender properties.
|
|
|
|
|
- Blender Pros: Altered via UI. Options control UI usage. `update()` is a perfect inflection point for callback logic.
|
|
|
|
|
- Blender Cons: Extremely limited supported types. A lot of manual labor that duplicates work done elsewhere in a Python program
|
|
|
|
|
|
|
|
|
|
`BLField` seeks to bridge the two worlds in an elegant way.
|
|
|
|
|
|
|
|
|
|
### Type Support
|
|
|
|
|
We need support for arbitrary objects, but still backed by the persistance semantics of native Blender properties.
|
|
|
|
|
- [x] Add logic that matches appropriate types to native IntProperty, FloatProperty, IntVectorProperty, FloatVectorProperty.
|
|
|
|
|
- We want absolute minimal overhead for types that actually already do work in Blender.
|
|
|
|
|
- **REMEMBER8* they can do matrices too! https://developer.blender.org/docs/release_notes/3.0/python_api/#other-additions
|
|
|
|
|
- [x] Add logic that matches any bpy.types.ID subclass to a PointerProperty.
|
|
|
|
|
- This is important for certain kinds of properties ex. "select a Blender object".
|
|
|
|
|
- [ ] Implement Enum property, (also see <https://developer.blender.org/docs/release_notes/4.1/python_api/#enum-id-properties>)
|
|
|
|
|
- Use this to bridge the enum UI to actual StrEnum objects.
|
|
|
|
|
- This also maybe enables some very interesting use cases when it comes to ex. static verifiability of data provided to event callbacks.
|
|
|
|
|
- [x] Ensure certain options, namely `name` (as `ui_name`), `default`, `subtype`, (numeric) `min`, `max`, `step`, `precision`, (string) `maxlen`, `search`, and `search_options`, can be passed down via the `BLField()` constructor.
|
|
|
|
|
- [ ] Make a class method that parses the docstring.
|
|
|
|
|
- [ ] `description`: Use the docstring parser to extract the first description sentence of the attribute name from the subclass docstring, so we are both encouraged to document our nodes/sockets, and so we're not documenting twice.
|
|
|
|
|
|
|
|
|
|
### Niceness
|
|
|
|
|
- [x] Rename the internal property to 'blfield__'.
|
|
|
|
|
- [x] Add a method that extracts the internal property name, for places where we need the Blender property name.
|
|
|
|
|
- **Key use case**: `draw.prop(self, self.field_name._bl_prop_name)`, which is also nice b/c no implicit string-based reference.
|
|
|
|
|
- The work done above with types makes this as fast and useful as internal props. Just make sure we validate that the type can be usefully accessed like this.
|
|
|
|
|
- [x] Add a field method (called w/instance) that updates min/max/etc. on the 'blfield__' prop, in a native property type compatible manner: https://developer.blender.org/docs/release_notes/3.0/python_api/#idproperty-ui-data-api
|
|
|
|
|
- Should also throw appropriate errors for invalid access from Python, while Blender handles access from the inside.
|
|
|
|
|
- This allows us
|
|
|
|
|
- [x] Similarly, a field method that gets the 'blfield__' prop data as a dictionary.
|
|
|
|
|
|
|
|
|
|
### Parallel Features
|
|
|
|
|
- [x] Move serialization work to a `utils`.
|
|
|
|
|
- [x] Also make ENCODER a function that can shortcut the easy cases.
|
|
|
|
|
- [x] For serializeability, let the encoder/decoder be able to make use of an optional `.msgspec_encodable()` and similar decoder respectively, and add support for these in the ENCODER/DECODER functions.
|
|
|
|
|
- [x] Define a superclass for `SocketDef` and make everyone inherit from it
|
|
|
|
|
- [ ] Collect with a `BL_SOCKET_DEFS` object, instead of manually from `__init__.py`s
|
|
|
|
|
- [x] Add support for `.msgspec_*()` methods, so that we remove the dependency on sockets from the serialization module.
|
|
|
|
|
|
|
|
|
|
### Sweeping Features
|
|
|
|
|
- [ ] Replace all raw Blender properties with `BLField`.
|
|
|
|
|
- Benefit: update= is taken care of automatically, preventing an entire class of nasty bug.
|
|
|
|
|
- Benefit: Any serializable object can be "simply used", at almost native speed (due to the aggressive read-cache).
|
|
|
|
|
- Benefit: Better error properties for updating, access, setting, etc. .
|
|
|
|
|
- Benefit: Validate usage in a vastly greater amount of contexts.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Overnight Ideas
|
|
|
|
|
- [ ] Fix file-load hiccups by persisting `_enum_cb_cache` and `_str_cb_cache`.
|
|
|
|
|
|
|
|
|
|
- [x] Implement `FlowSignal`s as special return values for `@computes_output_socket`, instead of juggling `None`.
|
|
|
|
|
- `FlowSignal.FlowPending`: Data was asked for, and it's not yet available, but it's expected to become available.
|
|
|
|
|
- Semantically: "Just hold on for a hot second".
|
|
|
|
|
- Return: If in any socket data provided to cb, return the same signal insted of running the callback.
|
|
|
|
|
- Caches: Don't invalidate caches, since the user will expect their data to still persist.
|
|
|
|
|
- Net Effect: Absolutely nothing happens. Perhaps we can recolor the nodes, though.
|
|
|
|
|
|
|
|
|
|
- [ ] `FlowSignal.FlowLost`: Output socket requires data that simply isn't available.
|
|
|
|
|
- Generally, nodes don't return it
|
|
|
|
|
- Return: If in any socket data provided to cb, return the same signal insted of running the callback.
|
|
|
|
|
- Caches: Do invalidate caches, since the user will expect their data to still persist.
|
|
|
|
|
- Net Effect: Sometimes, stuff happens in the output method [BB
|
|
|
|
|
- Net Effect: `DataChanged` is an event that signifies Node data will reset along the flow.
|
|
|
|
|
|
|
|
|
|
- [ ] Packing Imported Data in `Tidy3D Web Importer`, `Tidy3D File Importer`.
|
|
|
|
|
- Just `.to_hdf5_gz()` it into a `BytesIO`, Base85
|
|
|
|
|
|
|
|
|
|
- [ ] Remove Matplotlib Bottlenecks (~70ms -> ~5ms)
|
|
|
|
|
- Reuse `fig` per-`ManagedBLImage` (~25ms)
|
|
|
|
|
- Use `Agg` backend, plot with `fig.canvas.draw()`, and load image buffer directly as np.frombuffer(ax.figure.canvas.tostring_rgb(), dtype=np.uint8) (~40ms).
|
|
|
|
|
- [ ] Shader visualizations approximated from medium `nk` into a shader node graph, aka. a generic BSDF.
|
|
|
|
|