Alembic/USD: use geometry sets to import data #115623

Merged
Jesse Yurkovich merged 14 commits from kevindietrich/blender:abc_usd_geometry_sets_review into main 2024-02-28 03:02:48 +01:00

This rewrites the Alembic and USD data importers to work with and
output GeometrySets instead of Meshes.

The main motivation for this change is to be able to import properly
point clouds, which are currently imported as Meshes, and curves
data, which suffer from a lot of issues due to limitations of
legacy curves structures (fixed by the new curves data-block) and are
also converted to Meshes. Further, for Curves, it will allow importing
arbitrary attributes.

This patch was primarily meant for Alembic, but changes to USD import
were necessary as they share the same modifier.

For Alembic:

  • there should be no behavioral changes for Meshes
  • points are imported as PointClouds
  • curves are imported as the new Curves object type which fixes an
    important bug (see note at the end)

For USD:

  • there should be no behavioral changes for Meshes
  • curves are imported as the new Curves object type

Note that the current USD importer does not support loading PointClouds,
so this patch does not add support for it.

For both Alembic and USD, knots arrays are not read anymore, as the new
Curves object does not expose the ability to set them. As knots arrays
from other software were always a little problematic to interpret, this
might not really change anything for users.

This fixes #58704: Animated Alembic curves don't update on render

(NOTE: it could be that the fixed curve bug was also present in USD.)

This rewrites the Alembic and USD data importers to work with and output GeometrySets instead of Meshes. The main motivation for this change is to be able to import properly point clouds, which are currently imported as Meshes, and curves data, which suffer from a lot of issues due to limitations of legacy curves structures (fixed by the new curves data-block) and are also converted to Meshes. Further, for Curves, it will allow importing arbitrary attributes. This patch was primarily meant for Alembic, but changes to USD import were necessary as they share the same modifier. For Alembic: - there should be no behavioral changes for Meshes - points are imported as PointClouds - curves are imported as the new Curves object type which fixes an important bug (see note at the end) For USD: - there should be no behavioral changes for Meshes - curves are imported as the new Curves object type Note that the current USD importer does not support loading PointClouds, so this patch does not add support for it. For both Alembic and USD, knots arrays are not read anymore, as the new Curves object does not expose the ability to set them. As knots arrays from other software were always a little problematic to interpret, this might not really change anything for users. This fixes #58704: Animated Alembic curves don't update on render (NOTE: it could be that the fixed curve bug was also present in USD.)
Kévin Dietrich requested review from Jesse Yurkovich 2023-11-30 19:07:14 +01:00
Kévin Dietrich requested review from Michael Kowalski 2023-11-30 19:07:15 +01:00
Jesse Yurkovich reviewed 2023-12-02 03:43:20 +01:00
Jesse Yurkovich left a comment
Member

Still going through this and mostly focusing on the non-alembic parts so far. The previous test files still load correctly etc. too.

I'd be remiss if I didn't mention the knots array feedback from last time that's still pending though. I think a major factor here is access to some files so we can better reason about the changes right?

This then lead me to look at usd_reader_nurbs and notice it's still using the legacy curve type. Is the note about USD not reading knots arrays correct given that?

Still going through this and mostly focusing on the non-alembic parts so far. The previous test files still load correctly etc. too. I'd be remiss if I didn't mention the knots array feedback from last time that's still pending though. I think a major factor here is access to some files so we can better reason about the changes right? This then lead me to look at `usd_reader_nurbs` and notice it's still using the legacy curve type. Is the note about USD not reading knots arrays correct given that?
@ -29,0 +63,4 @@
if (basis == pxr::UsdGeomTokens->bspline) {
return CURVE_TYPE_NURBS;
}
if (basis == pxr::UsdGeomTokens->bezier) {

There's a comment in main about /* TODO(makowalski): Beziers are not properly imported as beziers. */ -- Is that still applicable or is that actually ok now? Guessing we need a sample file to check?

There's a comment in `main` about `/* TODO(makowalski): Beziers are not properly imported as beziers. */` -- Is that still applicable or is that actually ok now? Guessing we need a sample file to check?
Author
Member

I don't know what problem this is referring to, so test files would be appreciated.

I don't know what problem this is referring to, so test files would be appreciated.
deadpin marked this conversation as resolved
@ -40,3 +40,1 @@
Mesh *read_mesh(struct Mesh *existing_mesh,
USDMeshReadParams params,
const char **err_str) override;
virtual void read_geometry(bke::GeometrySet &geometry_set,

nit: can remove virtual keyword on this one

nit: can remove `virtual` keyword on this one
deadpin marked this conversation as resolved
@ -171,0 +186,4 @@
BKE_cachefile_reader_open(cache_file, &mcmd->reader, ctx->object, mcmd->object_path);
if (!mcmd->reader) {
BKE_modifier_set_error(
ctx->object, md, "Could not create Alembic reader for file %s", cache_file->filepath);

Keep this message generic since USD is here now.

Keep this message generic since USD is here now.
deadpin marked this conversation as resolved
@ -209,3 +292,3 @@
const Span<float3> mesh_positions = mesh->vert_positions();
const Span<blender::int2> mesh_edges = mesh->edges();
const blender::OffsetIndices mesh_faces = mesh->faces();
const blender::OffsetIndices mesh_polys = mesh->faces();

Keep the faces terminology on this and the below few lines (mesh_faces and me_faces).

Keep the `faces` terminology on this and the below few lines (mesh_faces and me_faces).
deadpin marked this conversation as resolved

I will review this pull request early this week. My apologies for the delay.

I will review this pull request early this week. My apologies for the delay.
Michael Kowalski added the
Interest
USD
label 2023-12-04 04:27:36 +01:00
Author
Member

I'd be remiss if I didn't mention the knots array feedback from last time that's still pending though. I think a major factor here is access to some files so we can better reason about the changes right?

Are you referring to the discussion on the old patch review on the old website? If so, I think the conclusion is to move ahead and see if that is actually needed. Otherwise, I am out of loop.

This then lead me to look at usd_reader_nurbs and notice it's still using the legacy curve type. Is the note about USD not reading knots arrays correct given that?

I could clarify the description, but this is only about curves data imported with the new Curves, and not NURBS which are still read with the legacy curve object. So the note is right although perhaps confusing.

> I'd be remiss if I didn't mention the knots array feedback from last time that's still pending though. I think a major factor here is access to some files so we can better reason about the changes right? Are you referring to the discussion on the old patch review on the old website? If so, I think the conclusion is to move ahead and see if that is actually needed. Otherwise, I am out of loop. > This then lead me to look at `usd_reader_nurbs` and notice it's still using the legacy curve type. Is the note about USD not reading knots arrays correct given that? I could clarify the description, but this is only about curves data imported with the new Curves, and not NURBS which are still read with the legacy curve object. So the note is right although perhaps confusing.
Kévin Dietrich force-pushed abc_usd_geometry_sets_review from 03620acdc9 to 14fb9edc41 2023-12-05 23:00:53 +01:00 Compare

Are you referring to the discussion on the old patch review on the old website? If so, I think the conclusion is to move ahead and see if that is actually needed. Otherwise, I am out of loop.

Yes, it was just from the old review. I have no further thoughts or data on it either, just wanted to mention it as the description in this new PR is quite similar to the old one which led to questions.

> Are you referring to the discussion on the old patch review on the old website? If so, I think the conclusion is to move ahead and see if that is actually needed. Otherwise, I am out of loop. Yes, it was just from the old review. I have no further thoughts or data on it either, just wanted to mention it as the description in this new PR is quite similar to the old one which led to questions.

I finished an initial review (focusing on the USD code) and the changes look good. Loading test cases works as expected. I hope to finish the review/testing tomorrow.

I finished an initial review (focusing on the USD code) and the changes look good. Loading test cases works as expected. I hope to finish the review/testing tomorrow.

There's a few issues with the new Curves object to deal with.

  1. Importing Alembic cyclic bezier curves crash blender. Export a curve circle and then try importing for the repro.
  2. To fully setup the new Curves object we should be filling in both the Handle types as well as the Left-Right handles for bezier curves at least. See create_bezier_segment_curve in file node_geo_curve_primitive_bezier_segment.cc for a minimal example.
  3. The USD curve data is coming in incorrect as we're treating the entire points array as spline control points instead of both control points and handle positions. See the various diagrams and charts on https://openusd.org/dev/api/class_usd_geom_basis_curves.html#details
  4. Unfortunately, after prototyping a fix for USD bezier curves, I ran into #96455. None of the Alembic/USD curves will be displayed or rendered correctly if we use the new Curves object right now. And the edit mode experience will also be degraded for them. Ironically, the curves are so bad it's almost better to interpret the data "incorrectly" and disregard the curve handle data and treat them as control points instead as the patch currently does. Unsure what to do about all this.
There's a few issues with the new Curves object to deal with. 1. Importing Alembic cyclic bezier curves crash blender. Export a curve circle and then try importing for the repro. 2. To fully setup the new Curves object we should be filling in both the Handle types as well as the Left-Right handles for bezier curves at least. See `create_bezier_segment_curve` in file `node_geo_curve_primitive_bezier_segment.cc` for a minimal example. 3. The USD curve data is coming in incorrect as we're treating the entire points array as spline control points instead of both control points and handle positions. See the various diagrams and charts on https://openusd.org/dev/api/class_usd_geom_basis_curves.html#details 4. Unfortunately, after prototyping a fix for USD bezier curves, I ran into #96455. None of the Alembic/USD curves will be displayed or rendered correctly if we use the new Curves object right now. And the edit mode experience will also be degraded for them. Ironically, the curves are so bad it's almost better to interpret the data "incorrectly" and disregard the curve handle data and treat them as control points instead as the patch currently does. Unsure what to do about all this.

@deadpin what is the motivation to import them as the new curve objects? The old one is still the recommended one for non-hair curves, and probably to all the imported curves at the moment.

@deadpin what is the motivation to import them as the new curve objects? The old one is still the recommended one for non-hair curves, and probably to all the imported curves at the moment.

I just realized that the old curves don't support generic attributes. Is this the main reason to use the new one?

The drawing limitation described on #96455 is something that will be worked on by @fclem . It is still not clear when, but having more use-cases for that certainly helps it being prioritized.

I just realized that the old curves don't support generic attributes. Is this the main reason to use the new one? The drawing limitation described on #96455 is something that will be worked on by @fclem . It is still not clear when, but having more use-cases for that certainly helps it being prioritized.
Author
Member

@dfelinto the rationales for using the new curves objects are indeed for attributes import, but also to not having to convert to a mesh as currently done for the legacy curves (which happens e.g. when saving files).

Ultimately, geometry sets do not work with the legacy curves, so not using the new object type means either postponing this patch, or revising the way the modifiers detect if geometry sets can be used; e.g. by having a callback on ModifierType which will take the decision based on the object type, and not relying on ModifierType.modify_geometry_set being non-null. Maybe there are other solutions.

@dfelinto the rationales for using the new curves objects are indeed for attributes import, but also to not having to convert to a mesh as currently done for the legacy curves (which happens e.g. when saving files). Ultimately, geometry sets do not work with the legacy curves, so not using the new object type means either postponing this patch, or revising the way the modifiers detect if geometry sets can be used; e.g. by having a callback on **ModifierType** which will take the decision based on the object type, and not relying on **ModifierType.modify_geometry_set** being non-null. Maybe there are other solutions.

We discussed this a little bit today at the weekly USD meeting and there was a desire to move forward with this patch for 4.1 as it still brings many benefits. For USD, as an example, this allows the Blender Hair demo files[1] to actually be imported without crashing (beveling the old curves creates too much geometry in main currently). It also opens the door for point instancing support in the not too distant future.

I think we can:

  • Continue with the review here and make it ready for commit.
  • Determine the best way to document and note the current Curves deficiencies in comparison to what's there in main today [2]

[1] https://www.blender.org/download/demo-files/#hair (The Animal Fur examples at least)
[2] Example Curves issues:

USD Curve import in main USD Curves import in this patch
usd-curves-main.png usd-curves-geoset.png

Spreadsheet view of what's going on. Notice how the more "correct" prototype actually turns out worse even though it matches what should be present.

main patch patch + prototype
wrong control points, no handle data, partial radius values wrong control points, no handle data, partial radius values proper control points and handle data
usd-bezier-main.png usd-bezier-geoset.png usd-bezier-geoset-sad.png
We discussed this a little bit today at the weekly USD meeting and there was a desire to move forward with this patch for 4.1 as it still brings many benefits. For USD, as an example, this allows the Blender Hair demo files[1] to actually be imported without crashing (beveling the old curves creates too much geometry in main currently). It also opens the door for point instancing support in the not too distant future. I think we can: - Continue with the review here and make it ready for commit. - Determine the best way to document and note the current Curves deficiencies in comparison to what's there in main today [2] [1] https://www.blender.org/download/demo-files/#hair (The Animal Fur examples at least) [2] Example Curves issues: | USD Curve import in main | USD Curves import in this patch | | --- | --- | | ![usd-curves-main.png](/attachments/08c57943-8b6e-4a20-bc94-3bfc57d08ba5) | ![usd-curves-geoset.png](/attachments/b43801a1-9409-4012-97e2-b2ffefc83741) | Spreadsheet view of what's going on. Notice how the more "correct" prototype actually turns out worse even though it matches what should be present. | main | patch | patch + prototype | | --- | --- | --- | | wrong control points, no handle data, partial radius values | wrong control points, no handle data, partial radius values | proper control points and handle data | | ![usd-bezier-main.png](/attachments/6e700118-565e-4ea8-a86d-fbe60777e4d3) | ![usd-bezier-geoset.png](/attachments/335f098d-4f7b-4080-a5dc-bdd4f3bfb7a3) | ![usd-bezier-geoset-sad.png](/attachments/33d7e0bd-719b-477f-ac4e-0f6c913b5505) |
Michael Kowalski reviewed 2023-12-29 04:02:47 +01:00
@ -54,0 +52,4 @@
USDMeshReadParams /*params*/,
const char ** /*err_str*/) override
{
}

The read_geometry() function needs to have a non-empty body defined in usd_reader_shape.cc to actually read the mesh, as below:

#include "BKE_geometry_set.hh"

void USDShapeReader::read_geometry(bke::GeometrySet & geometry_set,
                                   USDMeshReadParams params,
                                   const char ** err_str)
{
  Mesh *existing_mesh = geometry_set.get_mesh_for_write();
  Mesh *new_mesh = read_mesh(existing_mesh, params, err_str);

  if (new_mesh != existing_mesh) {
    geometry_set.replace_mesh(new_mesh);
  }
}

Without this, the mesh won't animate if the USD shape has a time-varying property (such as size or radius).

I'll attach an example USDA of such an animation for testing in a separate comment.

The `read_geometry()` function needs to have a non-empty body defined in `usd_reader_shape.cc` to actually read the mesh, as below: ``` #include "BKE_geometry_set.hh" void USDShapeReader::read_geometry(bke::GeometrySet & geometry_set, USDMeshReadParams params, const char ** err_str) { Mesh *existing_mesh = geometry_set.get_mesh_for_write(); Mesh *new_mesh = read_mesh(existing_mesh, params, err_str); if (new_mesh != existing_mesh) { geometry_set.replace_mesh(new_mesh); } } ``` Without this, the mesh won't animate if the USD shape has a time-varying property (such as size or radius). I'll attach an example USDA of such an animation for testing in a separate comment.

Should be fixed now with the commit just pushed. I directly used your suggestion above which I confirmed still works.

Should be fixed now with the commit just pushed. I directly used your suggestion above which I confirmed still works.
deadpin marked this conversation as resolved

As mentioned in my last comment, meshes generated for USD shapes with time-varying properties won't currently animate. I'm attaching an example USD of a capsule with an animating radius for testing.

I don't have additional comments regarding the USD changes, which look good to me, so I will approve this PR. (I agree that remaining issues with curves can be addressed in bcon 2 and 3.)

As mentioned in my last comment, meshes generated for USD shapes with time-varying properties won't currently animate. I'm attaching an example USD of a capsule with an animating radius for testing. I don't have additional comments regarding the USD changes, which look good to me, so I will approve this PR. (I agree that remaining issues with curves can be addressed in bcon 2 and 3.)
Michael Kowalski approved these changes 2023-12-29 04:15:35 +01:00
Dismissed
Jesse Yurkovich added 2 commits 2024-01-10 19:56:20 +01:00
Jesse Yurkovich added 1 commit 2024-01-10 22:31:31 +01:00
Jesse Yurkovich added 1 commit 2024-01-19 20:10:58 +01:00
Member

Also gets rid of #112308 then

Also gets rid of #112308 then
Jesse Yurkovich added 3 commits 2024-02-07 22:45:11 +01:00
Jesse Yurkovich added 3 commits 2024-02-20 21:44:02 +01:00
USD: read in all relevant bezier handle data properly
Some checks failed
buildbot/vexp-code-patch-lint Build done.
buildbot/vexp-code-patch-linux-x86_64 Build done.
buildbot/vexp-code-patch-darwin-x86_64 Build done.
buildbot/vexp-code-patch-darwin-arm64 Build done.
buildbot/vexp-code-patch-windows-amd64 Build done.
buildbot/vexp-code-patch-coordinator Build done.
9e2eae5c2b

I've updated this patch with my changes to address the alembic crash and fixing up some USD curve details.

For USD I needed to hand-craft files to test the various combinations of properties for linear and bezier curves (attached). Here is what things will look like.

Linear curves - Bottom to Top (Left side: Object with 1 curve. Right side: Object with 4 curves each of different size)

  • Row 1: Non-periodic, Constant widths
  • Row 2: Non-periodic, Varying widths
  • Row 3: Periodic, Constant widths
  • Row 4: Periodic, Varying widths

Note: The "constant" widths look "odd" due to not having a way to use an "even" profile when skinning the curve. Spreadsheet will show proper values.

initial import With Curve to Mesh node With Curve to Mesh node + Profile curve
linear-0.png linear-1.png linear-2.png

Bezier curves - Bottom to Top (Left side: Object with 1 curve. Right side: Object with 4 curves each of different size)

  • Row 1: Non-periodic, Constant widths
  • Row 2: Non-periodic, Varying widths
  • Row 3: Non-periodic, Vertex Varying widths
  • Row 4: Periodic, Constant widths
  • Row 5: Periodic, Varying widths
  • Row 6: Periodic, Vertex Varying widths

Note: Blender does not support vertex-varying -- we munge it to something close to varying instead.

initial import With Curve to Mesh node With Curve to Mesh node + Profile curve
bezier-0.png bezier-1.png bezier-2.png
I've updated this patch with my changes to address the alembic crash and fixing up some USD curve details. For USD I needed to hand-craft files to test the various combinations of properties for linear and bezier curves (attached). Here is what things will look like. Linear curves - Bottom to Top (Left side: Object with 1 curve. Right side: Object with 4 curves each of different size) - Row 1: `Non-periodic`, `Constant` widths - Row 2: `Non-periodic`, `Varying` widths - Row 3: `Periodic`, `Constant` widths - Row 4: `Periodic`, `Varying` widths Note: The "constant" widths look "odd" due to not having a way to use an "even" profile when skinning the curve. Spreadsheet will show proper values. | initial import | With Curve to Mesh node | With Curve to Mesh node + Profile curve | | --- | --- | --- | | ![linear-0.png](/attachments/95cf4f32-438b-446f-bbf4-e90ecbc82ed2) | ![linear-1.png](/attachments/69b9d428-7dca-439e-aace-24d005f7ec28) | ![linear-2.png](/attachments/fe4c51d4-14e9-40be-ab0e-8bc344aa89c3) | Bezier curves - Bottom to Top (Left side: Object with 1 curve. Right side: Object with 4 curves each of different size) - Row 1: `Non-periodic`, `Constant` widths - Row 2: `Non-periodic`, `Varying` widths - Row 3: `Non-periodic`, `Vertex Varying` widths - Row 4: `Periodic`, `Constant` widths - Row 5: `Periodic`, `Varying` widths - Row 6: `Periodic`, `Vertex Varying` widths Note: Blender does not support `vertex-varying` -- we munge it to something close to `varying` instead. | initial import | With Curve to Mesh node | With Curve to Mesh node + Profile curve | | --- | --- | --- | | ![bezier-0.png](/attachments/ed2a8ecf-9a3d-4ce8-a0cb-d04826efa54b) | ![bezier-1.png](/attachments/e79e27a1-ea37-4ad5-b078-33a39f025bab) | ![bezier-2.png](/attachments/ca0eb21d-826c-45ee-b017-17dbebb14ddd) |

The latest commits look good to me!

The latest commits look good to me!

The latest commits look good to me!

The latest commits look good to me!
Michael Kowalski approved these changes 2024-02-24 01:15:11 +01:00

@blender-bot build

@blender-bot build
Jesse Yurkovich added 2 commits 2024-02-28 02:30:28 +01:00
Merge remote-tracking branch 'origin/main' into abc_usd_geometry_sets_review
Some checks failed
buildbot/vexp-code-patch-lint Build done.
buildbot/vexp-code-patch-linux-x86_64 Build done.
buildbot/vexp-code-patch-darwin-arm64 Build done.
buildbot/vexp-code-patch-darwin-x86_64 Build done.
buildbot/vexp-code-patch-windows-amd64 Build done.
buildbot/vexp-code-patch-coordinator Build done.
6482dc469b

@blender-bot build

@blender-bot build
Jesse Yurkovich added 1 commit 2024-02-28 03:00:43 +01:00
Jesse Yurkovich merged commit ea256346a8 into main 2024-02-28 03:02:48 +01:00
First-time contributor

I did some tests : importing hair animation from Houdini in Alembic works great.
However, the hair imported in *.USD has a problem : there is a 90° rotation on it in X, and if i add some geo nodes hair modifiers like the interpolate hair, that dosen't work well. The hair dosen't stick to the source mesh.
I can't apply transformations neither because of the mesh sequence cache
image

I did some tests : importing hair animation from Houdini in Alembic works great. However, the hair imported in *.USD has a problem : there is a 90° rotation on it in X, and if i add some geo nodes hair modifiers like the interpolate hair, that dosen't work well. The hair dosen't stick to the source mesh. I can't apply transformations neither because of the mesh sequence cache ![image](/attachments/72c554d3-c0cf-4e00-a696-a2462a10f74b)
720 KiB

@FrancoisRimasson If you believe you've found a bug, please open a new issue rather than comment on an already merged pull request.

@FrancoisRimasson If you believe you've found a bug, please open a new issue rather than comment on an already merged pull request.
Sign in to join this conversation.
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset System
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Code Documentation
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Viewport & EEVEE
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Asset Browser Project
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Module
Viewport & EEVEE
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Severity
High
Severity
Low
Severity
Normal
Severity
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
6 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: blender/blender#115623
No description provided.