- TODO ask about datoviz text rendering
- write standalone code that anchor and rotation are irrelevant in datoviz text rendering
- fixed text rendering anchor + rotation in datoviz - required for vispy_axes
- fixed in matplotlib
- BUG in datoviz i cant change the anchor or rotation, i dunno why
- TODO support
GSP_RENDERER=network python ./examples/vispy_axes_managed_multiple_example.py- now that we got background_color in canvas and viewport
- now that i know how to copy with alpha blending in the network renderer
- i need to clear the screen at some point... when ? and how ?
- TODO support transparent background for network renderer
- only on matplotlib backend for now, but mark it as a TODO for datoviz backend
- enter github issue for datoviz backend
- TODO should that be done for both canvas/viewport ? which API for background color in GSP
- simply add a background_color:Color in the canvas/viewport object
- DONE handle GSP canvas/viewport with background color
- EARLY support (works in matplotlib figure, not axes. not at all in datoviz)
- python
./examples/vispy_axes_display_example.py - working in standalone tho
python ./tmp/matplotlib/background_color.py
- python
- EARLY support (works in matplotlib figure, not axes. not at all in datoviz)
- BUG multiple axes_managed on network - axes_managed is doing multiple render calls
- so it fails with network renderer which erase the whole canvas at each render call
- POSSIBLE fix: the network server render with transparent background, so it doesnt erase the whole canvas, but only the content of the visual
- POSSIBLE FIX: regroup the multiple render calls in one call... more like a workaround than a real fix, but it can be done in a short term
- TODO make renderer.clear() ? or renderer.clear_viewport(viewport)
- .clear_viewport(viewport) seems better
- https://chatgpt.com/c/697b6010-b9b0-8328-b0e9-8bfed9c1d9e0
- make a example for it
- multiple viewports
- make them blink alternatively
- look at a DSL domain specific language for transform
- syntax sugar to build a transform chain
- for the visual which requires multiple artists, think about what happen when the number of artists is reduced
- one need to destroy/hide the older extra artists
- see matplotlib_renderer_texts.py for an example
- GSP doc
- concise
- resume of the existing white paper
- follow the deliverable
- follow the Quarter order
- https://docs.google.com/document/d/1KbAgU9t96Qw6l3JP09zSZyy3bTbAavpLq0WOTUkp3E4/edit
- basic for vispy 2.0 - minimal - all in GSP
- in src/gsp_vispy2
- imgshow, scatter
- record a session with matplotlib + camera controls + animator
- in the animator callback, get all the rendering _args, in a file with timestamps
- then write a player of this gsp_session.json file
- session_recorder.py
- session_player.py
- transform mvp for all visual in datoviz
- how to test that
- in big_tester ?
- support texts in datoviz
- identify what is wrong/missing
- write datoviz tests
- transform chain + viewport unit conversion in .userData
- MathOpUnit link
- op_code: add/sub/mul/div
- scalar_value: float32
- scalar_unit: enum (ndc, px, cm, inch, pt)
- All in user space
- MathOpUnit link
- how to leverage big_tester ?
- do i use it in a test suite ? or just as an example ?
- what about having a big_tester_test.py which use it as a test suite and generate many cases
big_tester_example.pyas an examplebig_tester_cmdline.pyas a test suite
- RECORD + REPLAY
- MG4: GSP video recording (Q4). We will provide a Python example showing how to record a live interactive visualization video by saving the timestamped emitted GSP commands to a file, and replaying them in real time on another computer.
- handle 3d rotation in datoviz
- how to handle that ? maybe i set it up to orthographic camera
- dvz.visual_mvp(c_visual, mvp_pointer_to_48_float32)
- you need to concatenate the 3 mat4
- API design principles
- "what are the good design principle to apply when designing an library API"
- https://gemini.google.com/app/8fe8f99d920a68b5
- https://chatgpt.com/c/69162470-7220-8332-9df8-a928b77f0528
- test dynamic group in datoviz pixels
- transformChain
- with depth color
- aka with renderer events
- example of transformChain + unit conversion
- assume the canvas DPI is the screen one
- example: draw an axis with ticks every 1 cm using segments
- multiple viewports
- redrawn on resize
- axis at 10px margin from the border
- ticks every 1cm
- transformChain with unit conversions - can this be done in user-space
- data in ndc by default - aka -1 to 1 in current viewport
- operation with scalar with unit pt/px/cm/inch
- pt - point - 1/72 inch
- cm - centimeter
- inch - inch
- px - pixel - screen pixel - ppi pre device-pixel-ratio
- dpi canvas - === ppi on screen, dpi on print
- dpi === PPI
- in the transform chain, have a user data which store the current viewport size in px, and dpi
- MathOpsLink (opts, scalar, units) in usespace
- op_code
- scalar_value (in input buffer_type)
- scalar_unit
- how to pass the canvas to the transform chain?
- can this be done in userspace
- possibility: set by class or by instance
- DONE vispy and imgshow()
- DONE in axes_managed.py, support title, xlabel, ylabel
- with a specific visual for each of them
- with a specific position for each of them
- GSP_RENDERER=matplotlib python ./examples/vispy_axes_display_example.py
- GSP_RENDERER=datoviz python ./examples/vispy_axes_display_example.py
- DONE in datoviz, the set_xlabel/set_ylabel/set_title are not properly handled - the text rendering is wrong in the text alignement
- debug the text alignement in the text visual of datoviz and matplotlib
- DONE .plot() https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html
- TODO how to do hashed lines WONTDO
- line
- point + marker
- DONE in vispy2.plot, support line color (copy on the marker colors)
- DONE in vispy2.plot, support line color (copy on the marker colors)
- DONE improbe Marker
- more marker shapes
- datoviz with angle (do a standalone test)
- DONE BUG support panzoom in GSP_RENDERER=network
- show only a blank, no axes content, no axes content
- noticed 2 render calls in network server: one big then one small
- maybe fix === renderer base.clear() to be implemented - check that
- DONE support image in network renderer
- DONE in network server, make it save all the json+image in a folder
- good for debug
- DONE scatter - https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html
- union of point, pixel, markers
- DONE examples which display 3 viewports one for each
- TODO if scatter doesnt include property - best guess on default value
- DONE pyramid:
- then compute the needed resolution level
- based on the maximum possible zoom-out level in sample/dunit
- progressive decrease of resolution when zooming out
- determine the optimal resolution level
- based on the axes x_min/max_dunit and how many pixels it represents
- recompute the image if resolution is not optimal
- image translation is independtant of the resolution level
- so first code the image translation
- then code the resolution level change
- this it the divide and conquer approach
- then compute the needed resolution level
- if translation fails, recompute the whole
- if translation succeed, but not optimal resolution, recompute the whole
- if translation succeed, and optimal resolution succeed, do nothing
- pyramid: build the image only once
- do the computation in a single place
- think of pyramid next steps - adapt the image visual based on axes
- file displayed between 2 data unit file_x_min_dunit/file_x_max_dunit
- file is splitted in sample. which are becoming pixels in the texture
- image_x_min_dunit/image_x_max_dunit computed from image position/extent -
image_compute_limits_dunit() - image position/extent/texture will change based on the axes limits
- how to know if the image visual fit in the axes limits
- if position+extent is not visible then it fits
- if it is visible, but there is no more in this direction, then it fits
- convert a data unit to file sample index in sample file
- how many pixels in x of the images are visible in the axes
- for a given axes limits, what is the needed image position/extent/texture
- Q. can you subdivide the problem
- DONE Initialize it at an impossible place
- super small extent, -0.1 + 0.1
- position at -100
- Thus you ensure it is recomputed
- DONE first let determine the x_min/max_dunit of the image
- DONE pyramid to load from datoviz/data
- DONE datoviz to support on_raw_mouse
- to get press_release/press_release
- DONE add image interpolation in Image visual
- NEAREST
- LINEAR
- DONE fix the trailing point in datoviz
- DONE implement a image visual
- base it on datoviz
- supporting what is needed for pyramid
- DONE in axes_panzoom.py, limit the translation/zoom one can do
- Q. how to express max/min zoom
- zoom_x_max_range
- zoom_x_min_range
- zoom_y_max_range
- zoom_y_min_range
- Q. how to express max/min translation
- center_x_max_dunit
- center_x_min_dunit
- center_y_max_dunit
- center_y_min_dunit
- Q. how to express max/min zoom
- DONE rendering visual MUST call the
.sanity_check_attributes_buffer()- to be done in matplotlib and in datoviz
- see matplotlib_renderer_texts.py for an example
- DONE Move viewport_event and animator in their own backend package
- with the type definition in
gsp.core
- with the type definition in
- DONE invoice changes - dec 2025
- started vispy 2.0 package - implementation of axes display and panzoom
- made gsp_extra as a real package
- animator loop for datoviz and matplotlib
- viewport events for datoviz and matplotlib
- DONE change axes_display to handle sub ticks
- https://chatgpt.com/c/695e6038-7a54-8325-93f9-c471099097fb
- implemented in axis_tick_locator.py and axis_tick_formater.py
- change ._compute_tick_coords_horizontal and ._compute_tick_coords_vertical to use axis_tick_locator/formater
- make it return location and label with current algo
- then port it to axis_tick_*
- change dataunit in inner viewport
- to xy inner viewport
- then to x/y canvas
- to ndc in outer viewport
- DONE change axes_panzoom_example to have multiple viewports
- DONE fix axe panzoom in datoviz : it is zooming too much
- bug may be in viewport events datoviz - like the button release is not well handled
- DONE bug in axes_panzoom/display
- how to reproduce ? zoom in to the max
- in axes_display.py dont render ticks if no tick is visible
- make positions_array in a separate function and use this to test if the array is empty, if so dont create the visual
- currently trigger exception in bufferx.from_numpy()
- if no axes ticks are visible, draw nothing
- DONE other bugs in datoviz viewport events - may be in animator
- out of memory sometime... not sure why/when. occurs in axes panzoom example but not in viewport events example
- make a renderer_base.get_stats() and check memory usage
DVZ_LOG_LEVEL=4 GSP_RENDERER=datoviz python ./examples/animator_example.py
- DONE fix blinking in matplotlib axes display when resizing/panning
- added a timeout to limit the number of render during interaction
- DONE make gsp_extra a real package
- DONE make vispy_2 a real package
- depends on gsp_extra
- about porting pyramid
- sub sample data to make it addable on github data (aka less 2gb limit)
- DONE rewrite all the docstrings to follow numpydoc style
- https://numpydoc.readthedocs.io/en/latest/format.html
- document all functions/member/types public to the class
- DONE object3d single image with datoviz rotation
- DONE object3d with animator in matplotlib
- DONE object3d aninator animation with datoviz and matplotlib
- DONE object3d in datoviz
- object3d issue with .render()
- issue with the animation loop + .render()
- rotation in the datoviz_renderer_pixels
- object3d issue with .render()
- DONE serialize/deserialize texts
- test with network
- DONE add 'resize_event' in viewport events
- DONE unit_converter(canvas, viewport)
- viewport is always used in ndc
- +- X pixel (pre device pixel ratio)
- +- X cm
- so need to convert pixel to viewport-ndc
- so need to convert cm to viewport-ndc
- i got the canvas size in pixel and in cm
- viewport size in pixel (so i can get viewport size in cm)
- so i got a canvas/viewport ratio
- so i add the cm/pixel to viewport-ndc
- viewport is always used in ndc
- DONE handle the animation loop
- with decorator like datoviz? yes
- API from datoviz
- API from matplotlib
- GSP API common
- DONE to get the screen type on macosx
system_profiler SPDisplaysDataTypesystem_profiler SPHardwareDataType
- DONE when datoviz core dump, DVZ_LOG_LEVEL=0
- when creating a datoviz app with 350 pixelds visual, there is a segfault
- DONE transform serialisation/deserialization
- code a transformLinkLoad in user space
- DONE link registry in transform link registry
- DONE thus can register user-defined transform link, important for deserialization
- register a name and a class
- https://github.com/jeromeetienne/gsp_01/blob/main/src/gsp/transform/transform_registry.py
- DONE link MUST have
.deserialize()and.serialize()methods
- DONE datoviz event: event are notified even when the mouse is outside of the figure
- DONE how to leverage all the renderer
- matplotlib/datoviz/network(matplotlib backend)/network(datoviz backend)
- run_all_examples should set the GSP_RENDERER and GSP_REMOTE_RENDERER env variable
- do i limit them
- should i put a 'front matter' to controls that like datoviz
- DONE datoviz render to image doesnt work well
- in the last .render() save all the parameters
- in the .show()
- DONE all examples should produce a screenshot
- DONE rename GSP_INTERACTIVE_MODE to GSP_TEST_MODE ?
- DONE autosave screenshots in show() ? or in .render() ?
- if in_test
- DONE motion/scroll events in viewport_events_matplotlib/network
- Make a special event for scroll
- DONE import the
./tools/check_expected_output.py - DONE gsp_pydantic:
- DONE doesnt support transform chain properly
- DONE dont forget transform chain may be user-defined, take it into account in the serialization/deserialization
- DONE make TransformLinkImmediate the only link in gsp
- DONE code a transformLinkLoad in user space
- DONE make an example of it
- DONE transform serialisation/deserialization
- DONE implemented but not tested
- DONE make a actual examples, save
- DONE need serialisation/deserialization in transform chain
- DONE need to use them in gsp_pydantic
- DONE need serialization/deserialization tests
- DONE do test with expected_screenshots
- DONE example helper
- with env variable GSP_RENDERER to select the renderer
- matplotlib
- datoviz
- network
- DONE make tmp/dpi_stuff/mpl_accurate_figure_gemini_1.py a real example on top of GSP
- done in
examples/figure_inch_matplotlib.py
- done in
- DONE network animator with video save doesnt quit the scripts
- DONE how to handle camera control in GSP, aka same events for various renderers matplotlib/datoviz/network
- with mouse events
- with API
- windowEventNetwork/Matplotlib/Datoviz, with a common base class
- handle pan/zoom/rotate
- matplotlib event doc https://matplotlib.org/stable/users/explain/figure/event_handling.html
- datoviz event doc
- DONE camera controller awsdqe on top of the windowEventBase
- DONE camera controller trackball on top of the windowEventBase
- DONE datoviz viewport is bad at diagnosticating sending events to the right viewport
- DONE datoviz bug: viewport are not in the proper order
- DONE ExampleHelper:
ExampleHelper.create_animator(rendererBase) -> AnimatorBaseExampleHelper.create_animator_save_video(rendererBase) -> WindowEventBase
- DONE in animator, add a
AnimatorBasein all animator - DONE window events with multiple viewports
- recode all the viewport events using the same structure
- DONE animator: handle datoviz animator
- DONE make an example of viewport_events
- DONE animator: handle saving video on network/matplotlib
- DONE in trackball, notify -1 +1, not [0,+1]
- DONE PR datoviz with the whole ./datoviz as pyright 0 errors
- add a pyright target in justfile
- DONE datoviz network doesnt work as it is unable to take screenshots
- DONE Complete serialisation/deserialization for all visuals
- DONE do a 'big tester' example
- something with arguments which can be changed from command line
- thus it can be intrumented to cover all the cases in combinations
- multi-viewports
- with and without serialisation
- with and without http server
- all visuals - various scenes
- all renderers
- using transform or buffer as input
- DONE gsp_network to specify the scene renderer on a remote server
- easier to test
- DONE pdf/svg output for matplotlib
- DONE do something multi viewport
- DONE do serialisation with json
- DONE do network with http
- DONE implement points in datoviz
- WONTDO for each example,
_matplotlib_datovizand_both- have a test_runner ?
- PR for datoviz
- DONE issue on n_groups missing in .paths() constructor
- DONE issue of static type checking in .segments() cap
- DONE add test layers (with visual regression)
- DONE code segments - matplotlib + datoviz
- positions is [start, end]*n
- color rgba8 * n
- line_width float32 * n
- cap: butt, round, square
- DONE implement path in matplotlib + datoviz
- issue to mix the multiple paths and the groups attributes
screen size in
-
millimeter
-
hw pixel
-
logical pixel
-
'from there find the formula for the other paramters' as a next steps
the point is to get the minimal parmeters
- then find the formula to get the other parameters
- we need to progress slowly to be sure we understand/agree those concepts
i dont see anything so hard, just messy