[Bf-blender-cvs] [c31b89e76e0] master: Cycles: Add support for "stageMetersPerUnit" Hydra render setting

Patrick Mours noreply at git.blender.org
Wed Apr 13 12:24:48 CEST 2022


Commit: c31b89e76e0d216fc7b8807aa8ccd815b30ed93d
Author: Patrick Mours
Date:   Tue Apr 12 18:08:25 2022 +0200
Branches: master
https://developer.blender.org/rBc31b89e76e0d216fc7b8807aa8ccd815b30ed93d

Cycles: Add support for "stageMetersPerUnit" Hydra render setting

This can be useful to match transforms to what native Cycles
would see in Blender, as USD typically uses centimeters, but
Blender uses meters. This patch also fixes the hardcoded focal
length multiplicator, which is now using the same units as
everything else. Default of "stageMetersPerUnit" is 0.01 to match
the USD default of centimeters.

Differential Revision: https://developer.blender.org/D14630

===================================================================

M	intern/cycles/hydra/camera.cpp
M	intern/cycles/hydra/camera.h
M	intern/cycles/hydra/geometry.inl
M	intern/cycles/hydra/light.cpp
M	intern/cycles/hydra/render_delegate.cpp
M	intern/cycles/hydra/render_pass.cpp
M	intern/cycles/hydra/session.h

===================================================================

diff --git a/intern/cycles/hydra/camera.cpp b/intern/cycles/hydra/camera.cpp
index c746a107899..62042cbbcd2 100644
--- a/intern/cycles/hydra/camera.cpp
+++ b/intern/cycles/hydra/camera.cpp
@@ -3,6 +3,7 @@
  * Copyright 2022 Blender Foundation */
 
 #include "hydra/camera.h"
+#include "hydra/session.h"
 #include "scene/camera.h"
 
 #include <pxr/base/gf/frustum.h>
@@ -12,6 +13,19 @@
 HDCYCLES_NAMESPACE_OPEN_SCOPE
 
 extern Transform convert_transform(const GfMatrix4d &matrix);
+Transform convert_camera_transform(const GfMatrix4d &matrix, float metersPerUnit)
+{
+  Transform t = convert_transform(matrix);
+  // Flip Z axis
+  t.x.z *= -1.0f;
+  t.y.z *= -1.0f;
+  t.z.z *= -1.0f;
+  // Scale translation
+  t.x.w *= metersPerUnit;
+  t.y.w *= metersPerUnit;
+  t.z.w *= metersPerUnit;
+  return t;
+}
 
 #if PXR_VERSION < 2102
 // clang-format off
@@ -61,13 +75,20 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
   if (*dirtyBits & DirtyBits::DirtyTransform) {
     sceneDelegate->SampleTransform(id, &_transformSamples);
 
+    bool transform_found = false;
     for (size_t i = 0; i < _transformSamples.count; ++i) {
       if (_transformSamples.times[i] == 0.0f) {
         _transform = _transformSamples.values[i];
         _data.SetTransform(_transform);
+        transform_found = true;
         break;
       }
     }
+
+    if (!transform_found && _transformSamples.count) {
+      _transform = _transformSamples.values[0];
+      _data.SetTransform(_transform);
+    }
   }
 #else
   if (*dirtyBits & DirtyBits::DirtyViewMatrix) {
@@ -236,18 +257,21 @@ void HdCyclesCamera::Finalize(HdRenderParam *renderParam)
   HdCamera::Finalize(renderParam);
 }
 
-void HdCyclesCamera::ApplyCameraSettings(Camera *cam) const
+void HdCyclesCamera::ApplyCameraSettings(HdRenderParam *renderParam, Camera *cam) const
 {
-  ApplyCameraSettings(_data, _windowPolicy, cam);
+  ApplyCameraSettings(renderParam, _data, _windowPolicy, cam);
+
+  const float metersPerUnit = static_cast<HdCyclesSession *>(renderParam)->GetStageMetersPerUnit();
 
   array<Transform> motion(_transformSamples.count);
-  for (size_t i = 0; i < _transformSamples.count; ++i)
-    motion[i] = convert_transform(_transformSamples.values[i]) *
-                transform_scale(1.0f, 1.0f, -1.0f);
+  for (size_t i = 0; i < _transformSamples.count; ++i) {
+    motion[i] = convert_camera_transform(_transformSamples.values[i], metersPerUnit);
+  }
   cam->set_motion(motion);
 }
 
-void HdCyclesCamera::ApplyCameraSettings(const GfCamera &dataUnconformedWindow,
+void HdCyclesCamera::ApplyCameraSettings(HdRenderParam *renderParam,
+                                         const GfCamera &dataUnconformedWindow,
                                          CameraUtilConformWindowPolicy windowPolicy,
                                          Camera *cam)
 {
@@ -261,20 +285,22 @@ void HdCyclesCamera::ApplyCameraSettings(const GfCamera &dataUnconformedWindow,
                 GfCamera::Orthographic == CAMERA_ORTHOGRAPHIC);
   cam->set_camera_type(static_cast<CameraType>(data.GetProjection()));
 
+  const float metersPerUnit = static_cast<HdCyclesSession *>(renderParam)->GetStageMetersPerUnit();
+
   auto viewplane = data.GetFrustum().GetWindow();
   auto focalLength = 1.0f;
   if (data.GetProjection() == GfCamera::Perspective) {
     viewplane *= 2.0 / viewplane.GetSize()[1];  // Normalize viewplane
-    focalLength = data.GetFocalLength() * 1e-3f;
+    focalLength = data.GetFocalLength() * GfCamera::FOCAL_LENGTH_UNIT * metersPerUnit;
 
     cam->set_fov(GfDegreesToRadians(data.GetFieldOfView(GfCamera::FOVVertical)));
   }
 
-  cam->set_sensorwidth(data.GetHorizontalAperture() * GfCamera::APERTURE_UNIT);
-  cam->set_sensorheight(data.GetVerticalAperture() * GfCamera::APERTURE_UNIT);
+  cam->set_sensorwidth(data.GetHorizontalAperture() * GfCamera::APERTURE_UNIT * metersPerUnit);
+  cam->set_sensorheight(data.GetVerticalAperture() * GfCamera::APERTURE_UNIT * metersPerUnit);
 
-  cam->set_nearclip(data.GetClippingRange().GetMin());
-  cam->set_farclip(data.GetClippingRange().GetMax());
+  cam->set_nearclip(data.GetClippingRange().GetMin() * metersPerUnit);
+  cam->set_farclip(data.GetClippingRange().GetMax() * metersPerUnit);
 
   cam->set_viewplane_left(viewplane.GetMin()[0]);
   cam->set_viewplane_right(viewplane.GetMax()[0]);
@@ -282,14 +308,15 @@ void HdCyclesCamera::ApplyCameraSettings(const GfCamera &dataUnconformedWindow,
   cam->set_viewplane_top(viewplane.GetMax()[1]);
 
   if (data.GetFStop() != 0.0f) {
-    cam->set_focaldistance(data.GetFocusDistance());
+    cam->set_focaldistance(data.GetFocusDistance() * metersPerUnit);
     cam->set_aperturesize(focalLength / (2.0f * data.GetFStop()));
   }
 
-  cam->set_matrix(convert_transform(data.GetTransform()) * transform_scale(1.0f, 1.0f, -1.0f));
+  cam->set_matrix(convert_camera_transform(data.GetTransform(), metersPerUnit));
 }
 
-void HdCyclesCamera::ApplyCameraSettings(const GfMatrix4d &worldToViewMatrix,
+void HdCyclesCamera::ApplyCameraSettings(HdRenderParam *renderParam,
+                                         const GfMatrix4d &worldToViewMatrix,
                                          const GfMatrix4d &projectionMatrix,
                                          const std::vector<GfVec4d> &clipPlanes,
                                          Camera *cam)
@@ -298,7 +325,7 @@ void HdCyclesCamera::ApplyCameraSettings(const GfMatrix4d &worldToViewMatrix,
   GfCamera data;
   data.SetFromViewAndProjectionMatrix(worldToViewMatrix, projectionMatrix);
 
-  ApplyCameraSettings(data, CameraUtilFit, cam);
+  ApplyCameraSettings(renderParam, data, CameraUtilFit, cam);
 #else
   TF_CODING_ERROR("Not implemented");
 #endif
diff --git a/intern/cycles/hydra/camera.h b/intern/cycles/hydra/camera.h
index 8b7fed5a6bb..d839164317f 100644
--- a/intern/cycles/hydra/camera.h
+++ b/intern/cycles/hydra/camera.h
@@ -17,12 +17,14 @@ class HdCyclesCamera final : public PXR_NS::HdCamera {
   HdCyclesCamera(const PXR_NS::SdfPath &sprimId);
   ~HdCyclesCamera() override;
 
-  void ApplyCameraSettings(CCL_NS::Camera *targetCamera) const;
+  void ApplyCameraSettings(PXR_NS::HdRenderParam *renderParam, CCL_NS::Camera *targetCamera) const;
 
-  static void ApplyCameraSettings(const PXR_NS::GfCamera &cameraData,
+  static void ApplyCameraSettings(PXR_NS::HdRenderParam *renderParam,
+                                  const PXR_NS::GfCamera &cameraData,
                                   PXR_NS::CameraUtilConformWindowPolicy windowPolicy,
                                   CCL_NS::Camera *targetCamera);
-  static void ApplyCameraSettings(const PXR_NS::GfMatrix4d &worldToViewMatrix,
+  static void ApplyCameraSettings(PXR_NS::HdRenderParam *renderParam,
+                                  const PXR_NS::GfMatrix4d &worldToViewMatrix,
                                   const PXR_NS::GfMatrix4d &projectionMatrix,
                                   const std::vector<PXR_NS::GfVec4d> &clipPlanes,
                                   CCL_NS::Camera *targetCamera);
diff --git a/intern/cycles/hydra/geometry.inl b/intern/cycles/hydra/geometry.inl
index 007fc6f2667..3e02a59ea83 100644
--- a/intern/cycles/hydra/geometry.inl
+++ b/intern/cycles/hydra/geometry.inl
@@ -153,7 +153,11 @@ void HdCyclesGeometry<Base, CyclesBase>::Sync(HdSceneDelegate *sceneDelegate,
 
     // Update transforms of all instances
     for (size_t i = 0; i < transforms.size(); ++i) {
-      const Transform tfm = convert_transform(_geomTransform * transforms[i]);
+      const float metersPerUnit =
+          static_cast<HdCyclesSession *>(renderParam)->GetStageMetersPerUnit();
+
+      const Transform tfm = transform_scale(make_float3(metersPerUnit)) *
+                            convert_transform(_geomTransform * transforms[i]);
       _instances[i]->set_tfm(tfm);
     }
   }
diff --git a/intern/cycles/hydra/light.cpp b/intern/cycles/hydra/light.cpp
index b691da0d6a6..c0b4b3a3f38 100644
--- a/intern/cycles/hydra/light.cpp
+++ b/intern/cycles/hydra/light.cpp
@@ -54,11 +54,16 @@ void HdCyclesLight::Sync(HdSceneDelegate *sceneDelegate,
   const SdfPath &id = GetId();
 
   if (*dirtyBits & DirtyBits::DirtyTransform) {
+    const float metersPerUnit =
+        static_cast<HdCyclesSession *>(renderParam)->GetStageMetersPerUnit();
+
+    const Transform tfm = transform_scale(make_float3(metersPerUnit)) *
 #if PXR_VERSION >= 2011
-    const Transform tfm = convert_transform(sceneDelegate->GetTransform(id));
+                          convert_transform(sceneDelegate->GetTransform(id));
 #else
-    const Transform tfm = convert_transform(
-        sceneDelegate->GetLightParamValue(id, HdTokens->transform).Get<GfMatrix4d>());
+                          convert_transform(
+                              sceneDelegate->GetLightParamValue(id, HdTokens->transform)
+                                  .Get<GfMatrix4d>());
 #endif
     _light->set_tfm(tfm);
 
diff --git a/intern/cycles/hydra/render_delegate.cpp b/intern/cycles/hydra/render_delegate.cpp
index a954c3e4d72..faefe9382e9 100644
--- a/intern/cycles/hydra/render_delegate.cpp
+++ b/intern/cycles/hydra/render_delegate.cpp
@@ -33,11 +33,12 @@ TF_DEFINE_PRIVATE_TOKENS(_tokens,
 );
 
 TF_DEFINE_PRIVATE_TOKENS(HdCyclesRenderSettingsTokens,
+    (stageMetersPerUnit)
     ((device, "cycles:device"))
     ((threads, "cycles:threads"))
-    ((time_limit, "cycles:time_limit"))
+    ((timeLimit, "cycles:time_limit"))
     ((samples, "cycles:samples"))
-    ((sample_offset, "cycles:sample_offset"))
+    ((sampleOffset, "cycles:sample_offset"))
 );
 // clang-format on
 
@@ -424,7 +425,7 @@ HdRenderSettingDescriptorList HdCyclesDelegate::GetRenderSettingDescriptors() co
 
   descriptors.push_back({
       "Time Limit",
-      HdCyclesRenderSettingsTokens->time_limit,
+      HdCyclesRenderSettingsTokens->timeLimit,
       VtValue(0.0),
   });
   descriptors.push_back({
@@ -434,7 +435,7 @@ HdRenderSettingDescriptorList HdCyclesDelegate::GetRenderSettingDescriptors() co
   });
   descriptors.push_back({
       "Sample Offset",
-      HdCyclesRenderSettingsTokens->sample_offset,
+      HdCyclesRenderSettingsTokens->sampleOffset,
       VtValue(0),
   });
 
@@ -452,7 +453,11 @@ void HdCyclesDelegate::SetRen

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list