[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