[Bf-blender-cvs] [45a19261616] sybren-usd: USD: initial support for exporting lights

Sybren A. Stüvel noreply at git.blender.org
Fri Jul 19 18:06:46 CEST 2019


Commit: 45a192616167691209aa13dc15e16014a40bb013
Author: Sybren A. Stüvel
Date:   Fri Jul 19 16:34:00 2019 +0200
Branches: sybren-usd
https://developer.blender.org/rB45a192616167691209aa13dc15e16014a40bb013

USD: initial support for exporting lights

USD does not seem to support spot lights, so those aren't exported yet.
The units used for the light intensity is also still a bit of a mystery.

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

M	source/blender/usd/CMakeLists.txt
M	source/blender/usd/intern/usd_hierarchy_iterator.cc
A	source/blender/usd/intern/usd_writer_light.cc
A	source/blender/usd/intern/usd_writer_light.h

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

diff --git a/source/blender/usd/CMakeLists.txt b/source/blender/usd/CMakeLists.txt
index 95046a48a74..1861b8c41b9 100644
--- a/source/blender/usd/CMakeLists.txt
+++ b/source/blender/usd/CMakeLists.txt
@@ -53,6 +53,7 @@ set(SRC
   intern/usd_writer_abstract.cc
   intern/usd_writer_camera.cc
   intern/usd_writer_hair.cc
+  intern/usd_writer_light.cc
   intern/usd_writer_mesh.cc
   intern/usd_writer_transform.cc
 
@@ -62,6 +63,7 @@ set(SRC
   intern/usd_writer_abstract.h
   intern/usd_writer_camera.h
   intern/usd_writer_hair.h
+  intern/usd_writer_light.h
   intern/usd_writer_mesh.h
   intern/usd_writer_transform.h
 )
diff --git a/source/blender/usd/intern/usd_hierarchy_iterator.cc b/source/blender/usd/intern/usd_hierarchy_iterator.cc
index 7636ec7d3f3..3214f25386e 100644
--- a/source/blender/usd/intern/usd_hierarchy_iterator.cc
+++ b/source/blender/usd/intern/usd_hierarchy_iterator.cc
@@ -4,6 +4,7 @@
 #include "usd_writer_abstract.h"
 #include "usd_writer_camera.h"
 #include "usd_writer_hair.h"
+#include "usd_writer_light.h"
 #include "usd_writer_mesh.h"
 #include "usd_writer_transform.h"
 
@@ -87,13 +88,15 @@ AbstractHierarchyWriter *USDHierarchyIterator::create_data_writer(const Hierarch
     case OB_CAMERA:
       data_writer = new USDCameraWriter(usd_export_context);
       break;
+    case OB_LAMP:
+      data_writer = new USDLightWriter(usd_export_context);
+      break;
 
     case OB_EMPTY:
     case OB_CURVE:
     case OB_SURF:
     case OB_FONT:
     case OB_MBALL:
-    case OB_LAMP:
     case OB_SPEAKER:
     case OB_LIGHTPROBE:
     case OB_LATTICE:
diff --git a/source/blender/usd/intern/usd_writer_light.cc b/source/blender/usd/intern/usd_writer_light.cc
new file mode 100644
index 00000000000..bbba8c7ab89
--- /dev/null
+++ b/source/blender/usd/intern/usd_writer_light.cc
@@ -0,0 +1,88 @@
+#include "usd_writer_light.h"
+#include "usd_hierarchy_iterator.h"
+
+#include <pxr/usd/usdLux/diskLight.h>
+#include <pxr/usd/usdLux/distantLight.h>
+#include <pxr/usd/usdLux/rectLight.h>
+#include <pxr/usd/usdLux/sphereLight.h>
+
+extern "C" {
+#include "BLI_assert.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_light_types.h"
+#include "DNA_object_types.h"
+}
+
+USDLightWriter::USDLightWriter(const USDExporterContext &ctx) : USDAbstractWriter(ctx)
+{
+}
+
+bool USDLightWriter::is_supported(const Object *object) const
+{
+  Light *light = static_cast<Light *>(object->data);
+  return ELEM(light->type, LA_AREA, LA_LOCAL, LA_SUN);
+}
+
+void USDLightWriter::do_write(HierarchyContext &context)
+{
+  pxr::UsdTimeCode timecode = get_export_time_code();
+
+  Light *light = static_cast<Light *>(context.object->data);
+  pxr::UsdLuxLight usd_light;
+
+  switch (light->type) {
+    case LA_AREA:
+      switch (light->area_shape) {
+        case LA_AREA_DISK:
+        case LA_AREA_ELLIPSE: { /* An ellipse light will deteriorate into a disk light. */
+          pxr::UsdLuxDiskLight disk_light = pxr::UsdLuxDiskLight::Define(stage, usd_path_);
+          disk_light.CreateRadiusAttr().Set(light->area_size, timecode);
+          usd_light = disk_light;
+          break;
+        }
+        case LA_AREA_RECT: {
+          pxr::UsdLuxRectLight rect_light = pxr::UsdLuxRectLight::Define(stage, usd_path_);
+          rect_light.CreateWidthAttr().Set(light->area_size, timecode);
+          rect_light.CreateHeightAttr().Set(light->area_sizey, timecode);
+          usd_light = rect_light;
+          break;
+        }
+        case LA_AREA_SQUARE: {
+          pxr::UsdLuxRectLight rect_light = pxr::UsdLuxRectLight::Define(stage, usd_path_);
+          rect_light.CreateWidthAttr().Set(light->area_size, timecode);
+          rect_light.CreateHeightAttr().Set(light->area_size, timecode);
+          usd_light = rect_light;
+          break;
+        }
+      }
+      break;
+    case LA_LOCAL: {
+      pxr::UsdLuxSphereLight sphere_light = pxr::UsdLuxSphereLight::Define(stage, usd_path_);
+      sphere_light.CreateRadiusAttr().Set(light->area_size, timecode);
+      usd_light = sphere_light;
+      break;
+    }
+    case LA_SUN:
+      usd_light = pxr::UsdLuxDistantLight::Define(stage, usd_path_);
+      break;
+    default:
+      BLI_assert(!"is_supported() returned true for unsupported light type");
+  }
+
+  /* Scale factor to get to somewhat-similar illumination. Since the Hydra viewport had similar
+   * over-exposure as Blender Internal with the same values, this code applies the reverse of the
+   * versioning code in light_emission_unify(). */
+  float usd_intensity;
+  if (light->type == LA_SUN) {
+    /* Untested, as the Hydra GL viewport doesn't support distant lights. */
+    usd_intensity = light->energy;
+  }
+  else {
+    usd_intensity = light->energy / 100.f;
+  }
+  usd_light.CreateIntensityAttr().Set(usd_intensity, timecode);
+
+  usd_light.CreateColorAttr().Set(pxr::GfVec3f(light->r, light->g, light->b), timecode);
+  usd_light.CreateSpecularAttr().Set(light->spec_fac, timecode);
+}
diff --git a/source/blender/usd/intern/usd_writer_light.h b/source/blender/usd/intern/usd_writer_light.h
new file mode 100644
index 00000000000..5c424cf7283
--- /dev/null
+++ b/source/blender/usd/intern/usd_writer_light.h
@@ -0,0 +1,15 @@
+#ifndef __USD__USD_WRITER_LIGHT_H__
+#define __USD__USD_WRITER_LIGHT_H__
+
+#include "usd_writer_abstract.h"
+
+class USDLightWriter : public USDAbstractWriter {
+ public:
+  USDLightWriter(const USDExporterContext &ctx);
+
+ protected:
+  virtual bool is_supported(const Object *object) const override;
+  virtual void do_write(HierarchyContext &context) override;
+};
+
+#endif /* __USD__USD_WRITER_LIGHT_H__ */



More information about the Bf-blender-cvs mailing list