Skip to content

Latest commit

 

History

History
379 lines (373 loc) · 17.9 KB

File metadata and controls

379 lines (373 loc) · 17.9 KB
  • 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
  • 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)
  • 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
  • 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
  • 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.py as an example
    • big_tester_cmdline.py as 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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 SPDisplaysDataType
    • system_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
  • 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 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
  • 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) -> AnimatorBase
    • ExampleHelper.create_animator_save_video(rendererBase) -> WindowEventBase
  • DONE in animator, add a AnimatorBase in 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 _datoviz and _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

Trying to figure out the DPI/PPI mess

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