Skip to content
  1. Feb 26, 2025
  2. Feb 20, 2025
  3. Feb 19, 2025
  4. Feb 18, 2025
  5. Feb 14, 2025
  6. Feb 13, 2025
  7. Feb 12, 2025
  8. Feb 11, 2025
    • Flavien BRIDAULT's avatar
      fix(viz): blending between layers · 3b57a779
      Flavien BRIDAULT authored
      The blending between layers was incorrect, and alpha blending was applied twice. This made transparent objects look darker proportionally to the number of layers.
      3b57a779
  9. Feb 10, 2025
  10. Feb 06, 2025
    • Flavien BRIDAULT's avatar
    • Didier WECKMANN's avatar
      feat(io): use properties instead of xml configuration for readers/writers · 90fced65
      Didier WECKMANN authored
      Base reader and writer has been improved to support <file>, <folder>, <resource> and windowTitle XML configuration as files, folder, resources and window_title properties. The XML configuration has been deprecated (but kept) and a unit test was added. Readers and writers that used the windowTitle configuration (mainly by defining a different "default"), were updated to use window_title property. This implies passing the class "default" to the super constructor.
      
      Breaking change(s)
      window_title property required a slight change in the API: using the super constructor for the class default and use *m_window_title to access the property when calling open_location_dialog().
      90fced65
  11. Feb 05, 2025
    • Flavien BRIDAULT's avatar
      enh(filter): add a slider to navigate along the reslice plane · 15a22ffc
      Flavien BRIDAULT authored
      This adds a slider in each view of ex_image_reslice allowing it to slide in the direction of the reslice. In this example, the reslice transform is directly manipulated, so it is not really useful. However, in real applications, the reslice transform will likely come from non-editable data, such as a sensor location. In such cases, the slider allows us to explore around the reslice direction as if we had a real axis.
      
      A property was also added to centre the reslice instead of doing it from the bottom left corner.
      15a22ffc
  12. Feb 03, 2025
    • Didier WECKMANN's avatar
      feat(ui): specify screen index for multiple frames · 4b0c2c35
      Didier WECKMANN authored
      - Add a `<screen index=xx />` attribute to force the displaying on a particular screen. The index is the screen index as returned by `QGuiApplication::screens()` which is the same as the Windows `display number - 1`.
      
      - Most shortcuts (menus, toolbars) are now "global", they work regardless of the current focused frame. The "contextual" ones (speed dial) are not, since there are ...contextual.
      
      - The `ex_progress_bar` example has been modified to demonstrate the use: The toolbar is on a frame on a screen and the display on another. Shortcuts "1", "2", "3" launch the according jobs.
      4b0c2c35
  13. Jan 31, 2025
    • Flavien BRIDAULT's avatar
      fix(viz): drift in trackball and predefined interactors · 33b35790
      Flavien BRIDAULT authored
      Two drift issues were fixed in camera management:
      
      * the trackball interactor used to drift when combining a mouse/touch movement in width and height. This was fixed by changing the up vector to stick with the up vector of the world and by applying the first rotation on the second rotation axis, based on the right camera vector. This was also fixed in the predefined interactor by sharing the code.
      * the predefined interactor, on top of that, drifts when following a target. A quick workaround is proposed, that disables, by default, the following of the target orientation. Thus the interaction only follows the translation part. This behaviour looks anyway closer to the expected result.
      33b35790
    • Alexandre ANCEL's avatar
      enh(viz): add resliced mask to ex_image_reslice · 061c65c4
      Alexandre ANCEL authored
      - Add option to prevent transfer function scaling to max texture size
      061c65c4
  14. Jan 28, 2025
    • Flavien BRIDAULT's avatar
      enh(viz): add preclassification support for negatoscope · 1a49fc51
      Flavien BRIDAULT authored and Alexandre ANCEL's avatar Alexandre ANCEL committed
      1a49fc51
    • Flavien BRIDAULT's avatar
      refactor(viz): modernize material management · b47e3eab
      Flavien BRIDAULT authored
      `sight::viz::scene3d::material` is refactored and replaced by three new classes:
      - `sight::viz::scene3d::material::generic`: generic class to handle any material. It provides functions that allow to set uniforms and a function to set textures, in all techniques where they exist. This solves the initial problem of the intrusive tests for OIT and thus avoids a priori knowledge (declaration, etc...) about the generated pass. If the uniform or the texture exists, set it, otherwise, it silently does nothing. However, if nothing is set amongst all techniques, an error is logged, since it should not happen, normally you would expect to reach at least one technique.
      - `sight::viz::scene3d::material::standard`: allows using our "Default" material, and manages the permutations to handle different shading modes, normals display, etc...
      - derive this into `sight::viz::scene3d::material::r2vb`: specific version to handle per-primitive colours and triangles generation for quads
      
      Also, most adaptors no longer use `sight::module::viz::scene3d::material_adaptor`. It should only be required when wrapping a real `sight::data::material`. Otherwise, `sight::viz::scene3d::material::generic` or one of its inherited classes must be used.
      
      We also used the opportunity to sort out parts of the OIT logic. We grouped the generation of OIT material techniques from `material_mgr_listener` and the dynamic compositor passes generation into a new class `sight::viz::scene3d::compositor::manager::oit`. This allowed notably to share many hard-coded strings.
      
      Last we harmonized the identifiers for Ogre objects, using the `core::id::join()` function or a new function `viz::scene3d::adaptor::gen_id()` instead of concatenating strings manually.
      b47e3eab
  15. Jan 24, 2025
    • Didier WECKMANN's avatar
      fix(core): gui test launcher script always returns success · 81e0b884
      Didier WECKMANN authored and Didier WECKMANN's avatar Didier WECKMANN committed
      This was indeed a problem with the windows gui test launcher, because of delayed expansion feature not enabled. In short, in a batch script, testing a "variable" must be done using enclosing ! not % and
      delayed expansion must be enabled with setlocal enabledelayedexpansion, otherwise, the variable value is evaluated BEFORE script execution, resulting returning 0 in all cases, even when the test fails.
      81e0b884
  16. Jan 23, 2025
    • Didier WECKMANN's avatar
      fix(ui): recompute toolbar size / layout when actions are modified · a1aed1fb
      Didier WECKMANN authored
      There was a bug with Toolbars in overlay layout, which prevented to "reserve" the right size. This has been "fixed" / "mitigated" by calling `QWidget::adjustSize()` at strategic places. Still, normally we should not have to do this, even for overlay. Anyway, the workaround should not have any side effect.
      a1aed1fb
    • Didier WECKMANN's avatar
      fix(ui): forward events from overlay to scene · 8baec74f
      Didier WECKMANN authored and Flavien BRIDAULT's avatar Flavien BRIDAULT committed
      When using an overlay, events that hit the non-visible/transparent parts (like the "toolbar") will be caught by the overlay, making the behaviour strange for the user who thought he was interacting with the scene. This fixes that by forwarding the events, back to the scene.
      This was non-trivial because of the nature of the overlay, as the scene and the overlays are "sibling" widgets, not parent/children. Qt will always send events to the top-level widget at a given position, but in our case, the top-level widget, the overlay, may be "transparent" at that position, and we needed to trick Qt into believing the overlay is indeed not there so it could hit the underlying scene.
      
      Also, make the container transparent to mouse events if no children are visible in the layout. This is the only known way to make multi-touch events (pan, pinch) work
      8baec74f
  17. Jan 21, 2025
  18. Jan 16, 2025
  19. Jan 09, 2025
    • Flavien BRIDAULT's avatar
      refactor(geometry): modernize geometry libraries · a49f8358
      Flavien BRIDAULT authored
      Geometry libraries were refactored.
      - `sight::geometry::glm` becomes `sight::geometry`
      - `sight::geometry::data` now only contains functions relative to `sight::data` objects
      
      Several types were renamed or moved:
      
      * `fw_matrix4x4`: removed, replaced by `glm::dmat4`
      * `fw_plane`: replaced by `sight::geometry::plane_t`, moved all related code to `sight::geometry`
      * `fw_line`: redefined either by `sight::geometry::ray_t` or `sight::geometry::line_t` which both refers to `std::pair<glm::dvec3, glm::dvec3>`. Moved all related code to `sight::geometry`
      * `fw_vector_index` and `fw_vector_position`: all related code was removed
      
      Also `sight::data::image::world_to_image()` and `sight::data::image::image_to_world()` were moved from `sight::data` to `sight::geometry::data`.
      
      They were internally rewritten to be more "SIMD" friendly and new functions were added to get the raw transforms:
      - `sight::data::image::world_to_image_transform()`
      - `sight::data::image::image_to_world_transform()`
      
      This is especially useful in tight loops to avoid recomputing these matrices for each point/voxel.
      a49f8358
  20. Dec 19, 2024
    • Flavien BRIDAULT's avatar
      fix(viz): make material selector working again · 95c4bdbd
      Flavien BRIDAULT authored and Flavien BRIDAULT's avatar Flavien BRIDAULT committed
      95c4bdbd
    • Didier WECKMANN's avatar
      feat(core): image orientation support · ac1899b1
      Didier WECKMANN authored and Flavien BRIDAULT's avatar Flavien BRIDAULT committed
      This change ensures image orientation is used in filtering and visualisation.
      
      To help with the process and to factorize some code, the `sight::data::image` class now has two functions `data::image::image_to_world()` and `data::image::world_to_image()` that convert image coordinates from/to world coordinates. They use internally `data::image::m_orientation`, `data::image::m_origin` and `data::image::m_spacing` and they are templated, so you can use any container that holds 3d coordinates, without having to use `{x, y, z}` construct to convert from/to Ogre, ITK, ...
      
      Notable modified classes/helpers:
      
      - volume_renderer
      - ray_tracing_volume_renderer
      - scene
      - negato3d
      - negato2d
      - negato2d_camera
      - medical_image
      - plane
      - image_extruder
      - resampler
      - ITK (reader, writer, converter)
      - VTK (reader, writer, converter)
      - image_center
      - propagator
      - slice_index_position_editor
      - ruler
      - shape
      - point
      ac1899b1
  21. Dec 13, 2024
  22. Dec 12, 2024
  23. Dec 11, 2024
    • Flavien BRIDAULT's avatar
      enh(core): allow optional objects with defaults in configuration parameters · 934e5bbe
      Flavien BRIDAULT authored
      It is now possible to pass optional objects with default values in XML configurations:
      
      ```xml
      <extension implements="sight::app::extension::config">
          <id>...</id>
          <parameters>
              <!-- valid, if not passed, returns the object returned by the default constructor -->
              <object uid="model_series" type="sight::data::model_series" optional="true" />
      
              <!-- valid, if not passed, returns false -->
              <object uid="vr_visibility" type="sight::data::boolean" optional="true" value="false" />
      
              <!-- invalid because model_series is not a string_serializable -->
              <object uid="model_series" type="sight::data::model_series" optional="true" value="..." />
      
              <!-- invalid, "optional" must always be specified. -->
              <object uid="vr_visibility" type="sight::data::boolean" value="false" />
          </parameters>
      ...
      </extension>
      ```
      
      However, the keyword `optional` was already used before to pass deferred objects. To get something harmonized with local objects declaration, the `src` attribute is now deprecated and you must now use `deferred=true` at both places. Similarly, use `preference="true"` instead of `src="preference`.
      
      ```xml
      <extension implements="sight::app::extension::config">
          <id>...</id>
          <parameters>
              <!-- valid, if not passed, returns the object returned by the default constructor -->
              <object uid="model_series" type="sight::data::model_series" deferred="true" />
          </parameters>
          <config>
              <object uid="image" type="sight::data::image_series" deferred="true" />
              <object uid="bool" type="sight::data::boolean" value="true" preference="true" />
          </config>
      ...
      </extension>
      ```
      934e5bbe
    • Flavien BRIDAULT's avatar
      fix(ci): deploy doxygen and coverage in a single job · 2ec76144
      Flavien BRIDAULT authored
      The pages deployment must be done in a single job, otherwise they can delete each other content.
      2ec76144
  24. Dec 10, 2024
  25. Dec 09, 2024
    • Flavien BRIDAULT's avatar
      fix(core): improve handling of connection exceptions in proxies · 0aa06b77
      Flavien BRIDAULT authored
      Now, when an incompatibility is found between the signal and the slot, the exception is caught in the proxy and an error is returned. The config can still run, but it will not crash when closing.
      
      Also, an important bug was found when trying to match signal and slot signature. We can indeed omit part of the arguments of a signal when connecting a slot, but of course from the right. We can connect for instance:
      - (int, int) -> (int)
      - (int, int) -> ()
      
      But of course we refuse the inverse (we throw `sight::core::com::exception::bad_slot`):
      - (int) -> (int, int)
      - () -> (int, int)
      
      This mechanism works recursively but was broken when argument types were different like:
      - (int, int) -> (string)
      
      This led to a stack overflow. 😕 This is now fixed and throw `sight::core::com::exception::bad_slot` as well.
      0aa06b77
Loading