Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/io/alembic/intern')
-rw-r--r--source/blender/io/alembic/intern/abc_axis_conversion.cc166
-rw-r--r--source/blender/io/alembic/intern/abc_axis_conversion.h99
-rw-r--r--source/blender/io/alembic/intern/abc_customdata.cc17
-rw-r--r--source/blender/io/alembic/intern/abc_customdata.h17
-rw-r--r--source/blender/io/alembic/intern/abc_exporter.cc6
-rw-r--r--source/blender/io/alembic/intern/abc_reader_archive.cc4
-rw-r--r--source/blender/io/alembic/intern/abc_reader_archive.h2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_camera.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_curves.cc5
-rw-r--r--source/blender/io/alembic/intern/abc_reader_curves.h2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_mesh.cc32
-rw-r--r--source/blender/io/alembic/intern/abc_reader_nurbs.cc5
-rw-r--r--source/blender/io/alembic/intern/abc_reader_object.cc5
-rw-r--r--source/blender/io/alembic/intern/abc_reader_object.h2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_points.cc4
-rw-r--r--source/blender/io/alembic/intern/abc_reader_points.h2
-rw-r--r--source/blender/io/alembic/intern/abc_reader_transform.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_util.cc141
-rw-r--r--source/blender/io/alembic/intern/abc_util.h69
-rw-r--r--source/blender/io/alembic/intern/abc_writer_archive.cc7
-rw-r--r--source/blender/io/alembic/intern/abc_writer_archive.h2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_camera.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_curves.cc5
-rw-r--r--source/blender/io/alembic/intern/abc_writer_curves.h2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_hair.cc4
-rw-r--r--source/blender/io/alembic/intern/abc_writer_mball.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_mesh.cc17
-rw-r--r--source/blender/io/alembic/intern/abc_writer_nurbs.cc4
-rw-r--r--source/blender/io/alembic/intern/abc_writer_object.cc2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_object.h2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_points.cc4
-rw-r--r--source/blender/io/alembic/intern/abc_writer_points.h2
-rw-r--r--source/blender/io/alembic/intern/abc_writer_transform.cc4
-rw-r--r--source/blender/io/alembic/intern/alembic_capi.cc5
34 files changed, 354 insertions, 292 deletions
diff --git a/source/blender/io/alembic/intern/abc_axis_conversion.cc b/source/blender/io/alembic/intern/abc_axis_conversion.cc
new file mode 100644
index 00000000000..17db5e9c99f
--- /dev/null
+++ b/source/blender/io/alembic/intern/abc_axis_conversion.cc
@@ -0,0 +1,166 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup Alembic
+ */
+
+#include "abc_axis_conversion.h"
+
+extern "C" {
+#include "BLI_assert.h"
+#include "DNA_object_types.h"
+
+#include "BLI_math_geom.h"
+}
+
+void create_swapped_rotation_matrix(float rot_x_mat[3][3],
+ float rot_y_mat[3][3],
+ float rot_z_mat[3][3],
+ const float euler[3],
+ AbcAxisSwapMode mode)
+{
+ const float rx = euler[0];
+ float ry;
+ float rz;
+
+ /* Apply transformation */
+ switch (mode) {
+ case ABC_ZUP_FROM_YUP:
+ ry = -euler[2];
+ rz = euler[1];
+ break;
+ case ABC_YUP_FROM_ZUP:
+ ry = euler[2];
+ rz = -euler[1];
+ break;
+ default:
+ ry = 0.0f;
+ rz = 0.0f;
+ BLI_assert(false);
+ break;
+ }
+
+ unit_m3(rot_x_mat);
+ unit_m3(rot_y_mat);
+ unit_m3(rot_z_mat);
+
+ rot_x_mat[1][1] = cos(rx);
+ rot_x_mat[2][1] = -sin(rx);
+ rot_x_mat[1][2] = sin(rx);
+ rot_x_mat[2][2] = cos(rx);
+
+ rot_y_mat[2][2] = cos(ry);
+ rot_y_mat[0][2] = -sin(ry);
+ rot_y_mat[2][0] = sin(ry);
+ rot_y_mat[0][0] = cos(ry);
+
+ rot_z_mat[0][0] = cos(rz);
+ rot_z_mat[1][0] = -sin(rz);
+ rot_z_mat[0][1] = sin(rz);
+ rot_z_mat[1][1] = cos(rz);
+}
+
+/* Convert matrix from Z=up to Y=up or vice versa.
+ * Use yup_mat = zup_mat for in-place conversion. */
+void copy_m44_axis_swap(float dst_mat[4][4], float src_mat[4][4], AbcAxisSwapMode mode)
+{
+ float dst_rot[3][3], src_rot[3][3], dst_scale_mat[4][4];
+ float rot_x_mat[3][3], rot_y_mat[3][3], rot_z_mat[3][3];
+ float src_trans[3], dst_scale[3], src_scale[3], euler[3];
+
+ zero_v3(src_trans);
+ zero_v3(dst_scale);
+ zero_v3(src_scale);
+ zero_v3(euler);
+ unit_m3(src_rot);
+ unit_m3(dst_rot);
+ unit_m4(dst_scale_mat);
+
+ /* TODO(Sybren): This code assumes there is no sheer component and no
+ * homogeneous scaling component, which is not always true when writing
+ * non-hierarchical (e.g. flat) objects (e.g. when parent has non-uniform
+ * scale and the child rotates). This is currently not taken into account
+ * when axis-swapping. */
+
+ /* Extract translation, rotation, and scale form matrix. */
+ mat4_to_loc_rot_size(src_trans, src_rot, src_scale, src_mat);
+
+ /* Get euler angles from rotation matrix. */
+ mat3_to_eulO(euler, ROT_MODE_XZY, src_rot);
+
+ /* Create X, Y, Z rotation matrices from euler angles. */
+ create_swapped_rotation_matrix(rot_x_mat, rot_y_mat, rot_z_mat, euler, mode);
+
+ /* Concatenate rotation matrices. */
+ mul_m3_m3m3(dst_rot, dst_rot, rot_z_mat);
+ mul_m3_m3m3(dst_rot, dst_rot, rot_y_mat);
+ mul_m3_m3m3(dst_rot, dst_rot, rot_x_mat);
+
+ mat3_to_eulO(euler, ROT_MODE_XZY, dst_rot);
+
+ /* Start construction of dst_mat from rotation matrix */
+ unit_m4(dst_mat);
+ copy_m4_m3(dst_mat, dst_rot);
+
+ /* Apply translation */
+ switch (mode) {
+ case ABC_ZUP_FROM_YUP:
+ copy_zup_from_yup(dst_mat[3], src_trans);
+ break;
+ case ABC_YUP_FROM_ZUP:
+ copy_yup_from_zup(dst_mat[3], src_trans);
+ break;
+ default:
+ BLI_assert(false);
+ }
+
+ /* Apply scale matrix. Swaps y and z, but does not
+ * negate like translation does. */
+ dst_scale[0] = src_scale[0];
+ dst_scale[1] = src_scale[2];
+ dst_scale[2] = src_scale[1];
+
+ size_to_mat4(dst_scale_mat, dst_scale);
+ mul_m4_m4m4(dst_mat, dst_mat, dst_scale_mat);
+}
+
+/* Recompute transform matrix of object in new coordinate system
+ * (from Z-Up to Y-Up). */
+void create_transform_matrix(Object *obj,
+ float r_yup_mat[4][4],
+ AbcMatrixMode mode,
+ Object *proxy_from)
+{
+ float zup_mat[4][4];
+
+ /* get local or world matrix. */
+ if (mode == ABC_MATRIX_LOCAL && obj->parent) {
+ /* Note that this produces another matrix than the local matrix, due to
+ * constraints and modifiers as well as the obj->parentinv matrix. */
+ invert_m4_m4(obj->parent->imat, obj->parent->obmat);
+ mul_m4_m4m4(zup_mat, obj->parent->imat, obj->obmat);
+ }
+ else {
+ copy_m4_m4(zup_mat, obj->obmat);
+ }
+
+ if (proxy_from) {
+ mul_m4_m4m4(zup_mat, proxy_from->obmat, zup_mat);
+ }
+
+ copy_m44_axis_swap(r_yup_mat, zup_mat, ABC_YUP_FROM_ZUP);
+}
diff --git a/source/blender/io/alembic/intern/abc_axis_conversion.h b/source/blender/io/alembic/intern/abc_axis_conversion.h
new file mode 100644
index 00000000000..7fde0e92ea4
--- /dev/null
+++ b/source/blender/io/alembic/intern/abc_axis_conversion.h
@@ -0,0 +1,99 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2016 Kévin Dietrich & Blender Foundation.
+ * All rights reserved.
+ */
+#pragma once
+
+/** \file
+ * \ingroup Alembic
+ */
+
+struct Object;
+
+#ifdef _MSC_VER
+# define ABC_INLINE static __forceinline
+#else
+# define ABC_INLINE static inline
+#endif
+
+/* TODO(kevin): for now keeping these transformations hardcoded to make sure
+ * everything works properly, and also because Alembic is almost exclusively
+ * used in Y-up software, but eventually they'll be set by the user in the UI
+ * like other importers/exporters do, to support other axis. */
+
+/* Copy from Y-up to Z-up. */
+
+ABC_INLINE void copy_zup_from_yup(float zup[3], const float yup[3])
+{
+ const float old_yup1 = yup[1]; /* in case zup == yup */
+ zup[0] = yup[0];
+ zup[1] = -yup[2];
+ zup[2] = old_yup1;
+}
+
+ABC_INLINE void copy_zup_from_yup(short zup[3], const short yup[3])
+{
+ const short old_yup1 = yup[1]; /* in case zup == yup */
+ zup[0] = yup[0];
+ zup[1] = -yup[2];
+ zup[2] = old_yup1;
+}
+
+/* Copy from Z-up to Y-up. */
+
+ABC_INLINE void copy_yup_from_zup(float yup[3], const float zup[3])
+{
+ const float old_zup1 = zup[1]; /* in case yup == zup */
+ yup[0] = zup[0];
+ yup[1] = zup[2];
+ yup[2] = -old_zup1;
+}
+
+ABC_INLINE void copy_yup_from_zup(short yup[3], const short zup[3])
+{
+ const short old_zup1 = zup[1]; /* in case yup == zup */
+ yup[0] = zup[0];
+ yup[1] = zup[2];
+ yup[2] = -old_zup1;
+}
+
+/* Names are given in (dst, src) order, just like
+ * the parameters of copy_m44_axis_swap() */
+typedef enum {
+ ABC_ZUP_FROM_YUP = 1,
+ ABC_YUP_FROM_ZUP = 2,
+} AbcAxisSwapMode;
+
+/* Create a rotation matrix for each axis from euler angles.
+ * Euler angles are swapped to change coordinate system. */
+void create_swapped_rotation_matrix(float rot_x_mat[3][3],
+ float rot_y_mat[3][3],
+ float rot_z_mat[3][3],
+ const float euler[3],
+ AbcAxisSwapMode mode);
+
+void copy_m44_axis_swap(float dst_mat[4][4], float src_mat[4][4], AbcAxisSwapMode mode);
+
+typedef enum {
+ ABC_MATRIX_WORLD = 1,
+ ABC_MATRIX_LOCAL = 2,
+} AbcMatrixMode;
+
+void create_transform_matrix(Object *obj,
+ float r_transform_mat[4][4],
+ AbcMatrixMode mode,
+ Object *proxy_from);
diff --git a/source/blender/io/alembic/intern/abc_customdata.cc b/source/blender/io/alembic/intern/abc_customdata.cc
index c5f60ac3e29..62f6a52f7cf 100644
--- a/source/blender/io/alembic/intern/abc_customdata.cc
+++ b/source/blender/io/alembic/intern/abc_customdata.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -27,7 +27,6 @@
#include <algorithm>
#include <unordered_map>
-extern "C" {
#include "DNA_customdata_types.h"
#include "DNA_meshdata_types.h"
@@ -35,7 +34,6 @@ extern "C" {
#include "BLI_utildefines.h"
#include "BKE_customdata.h"
-}
/* NOTE: for now only UVs and Vertex Colors are supported for streaming.
* Although Alembic only allows for a single UV layer per {I|O}Schema, and does
@@ -146,7 +144,7 @@ const char *get_uv_sample(UVSample &sample, const CDStreamConfig &config, Custom
* - (optional due to its behavior) tag as UV using Alembic::AbcGeom::SetIsUV
*/
static void write_uv(const OCompoundProperty &prop,
- const CDStreamConfig &config,
+ CDStreamConfig &config,
void *data,
const char *name)
{
@@ -159,13 +157,18 @@ static void write_uv(const OCompoundProperty &prop,
return;
}
- OV2fGeomParam param(prop, name, true, kFacevaryingScope, 1);
+ std::string uv_map_name(name);
+ OV2fGeomParam param = config.abc_uv_maps[uv_map_name];
+ if (!param.valid()) {
+ param = OV2fGeomParam(prop, name, true, kFacevaryingScope, 1);
+ }
OV2fGeomParam::Sample sample(V2fArraySample(&uvs.front(), uvs.size()),
UInt32ArraySample(&indices.front(), indices.size()),
kFacevaryingScope);
-
param.set(sample);
+
+ config.abc_uv_maps[uv_map_name] = param;
}
/* Convention to write Vertex Colors:
@@ -219,7 +222,7 @@ static void write_mcol(const OCompoundProperty &prop,
}
void write_custom_data(const OCompoundProperty &prop,
- const CDStreamConfig &config,
+ CDStreamConfig &config,
CustomData *data,
int data_type)
{
diff --git a/source/blender/io/alembic/intern/abc_customdata.h b/source/blender/io/alembic/intern/abc_customdata.h
index 6107e230627..96b57b08681 100644
--- a/source/blender/io/alembic/intern/abc_customdata.h
+++ b/source/blender/io/alembic/intern/abc_customdata.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -27,6 +27,8 @@
#include <Alembic/Abc/All.h>
#include <Alembic/AbcGeom/All.h>
+#include <map>
+
struct CustomData;
struct MLoop;
struct MLoopUV;
@@ -68,6 +70,14 @@ struct CDStreamConfig {
Alembic::AbcGeom::index_t index;
Alembic::AbcGeom::index_t ceil_index;
+ const char **modifier_error_message;
+
+ /* Alembic needs Blender to keep references to C++ objects (the destructors
+ * finalize the writing to ABC). This map stores OV2fGeomParam objects for the
+ * 2nd and subsequent UV maps; the primary UV map is kept alive by the Alembic
+ * mesh sample itself. */
+ std::map<std::string, Alembic::AbcGeom::OV2fGeomParam> abc_uv_maps;
+
CDStreamConfig()
: mloop(NULL),
totloop(0),
@@ -80,7 +90,8 @@ struct CDStreamConfig {
weight(0.0f),
time(0.0f),
index(0),
- ceil_index(0)
+ ceil_index(0),
+ modifier_error_message(NULL)
{
}
};
@@ -92,7 +103,7 @@ struct CDStreamConfig {
const char *get_uv_sample(UVSample &sample, const CDStreamConfig &config, CustomData *data);
void write_custom_data(const OCompoundProperty &prop,
- const CDStreamConfig &config,
+ CDStreamConfig &config,
CustomData *data,
int data_type);
diff --git a/source/blender/io/alembic/intern/abc_exporter.cc b/source/blender/io/alembic/intern/abc_exporter.cc
index fb75fb1f6c7..dbf24452b78 100644
--- a/source/blender/io/alembic/intern/abc_exporter.cc
+++ b/source/blender/io/alembic/intern/abc_exporter.cc
@@ -33,7 +33,6 @@
#include "abc_writer_points.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_fluid_types.h"
@@ -51,7 +50,7 @@ extern "C" {
# include "BLI_winstuff.h"
#endif
-#include "BKE_anim.h"
+#include "BKE_duplilist.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_layer.h"
@@ -62,7 +61,6 @@ extern "C" {
#include "BKE_scene.h"
#include "DEG_depsgraph_query.h"
-}
using Alembic::Abc::OBox3dProperty;
using Alembic::Abc::TimeSamplingPtr;
@@ -105,7 +103,7 @@ ExportSettings::ExportSettings()
static bool object_is_smoke_sim(Object *ob)
{
- ModifierData *md = modifiers_findByType(ob, eModifierType_Fluid);
+ ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Fluid);
if (md) {
FluidModifierData *smd = reinterpret_cast<FluidModifierData *>(md);
diff --git a/source/blender/io/alembic/intern/abc_reader_archive.cc b/source/blender/io/alembic/intern/abc_reader_archive.cc
index 6ad44553701..563466d81bc 100644
--- a/source/blender/io/alembic/intern/abc_reader_archive.cc
+++ b/source/blender/io/alembic/intern/abc_reader_archive.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -23,12 +23,10 @@
#include "abc_reader_archive.h"
-extern "C" {
#include "BKE_main.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-}
#ifdef WIN32
# include "utfconv.h"
diff --git a/source/blender/io/alembic/intern/abc_reader_archive.h b/source/blender/io/alembic/intern/abc_reader_archive.h
index bdb53bd0b8c..35273e10108 100644
--- a/source/blender/io/alembic/intern/abc_reader_archive.h
+++ b/source/blender/io/alembic/intern/abc_reader_archive.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_reader_camera.cc b/source/blender/io/alembic/intern/abc_reader_camera.cc
index ab506f32cbe..0752534f8c2 100644
--- a/source/blender/io/alembic/intern/abc_reader_camera.cc
+++ b/source/blender/io/alembic/intern/abc_reader_camera.cc
@@ -22,7 +22,6 @@
#include "abc_reader_transform.h"
#include "abc_util.h"
-extern "C" {
#include "DNA_camera_types.h"
#include "DNA_object_types.h"
@@ -30,7 +29,6 @@ extern "C" {
#include "BKE_object.h"
#include "BLI_math.h"
-}
using Alembic::AbcGeom::CameraSample;
using Alembic::AbcGeom::ICamera;
diff --git a/source/blender/io/alembic/intern/abc_reader_curves.cc b/source/blender/io/alembic/intern/abc_reader_curves.cc
index 1be164c7c94..d5e0b694294 100644
--- a/source/blender/io/alembic/intern/abc_reader_curves.cc
+++ b/source/blender/io/alembic/intern/abc_reader_curves.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -22,6 +22,7 @@
*/
#include "abc_reader_curves.h"
+#include "abc_axis_conversion.h"
#include "abc_reader_transform.h"
#include "abc_util.h"
@@ -29,7 +30,6 @@
#include "MEM_guardedalloc.h"
-extern "C" {
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -38,7 +38,6 @@ extern "C" {
#include "BKE_curve.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
-}
using Alembic::Abc::FloatArraySamplePtr;
using Alembic::Abc::Int32ArraySamplePtr;
diff --git a/source/blender/io/alembic/intern/abc_reader_curves.h b/source/blender/io/alembic/intern/abc_reader_curves.h
index 763a83f586f..eb0538308f8 100644
--- a/source/blender/io/alembic/intern/abc_reader_curves.h
+++ b/source/blender/io/alembic/intern/abc_reader_curves.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc
index ec74fb2137e..8b79a3a0aa0 100644
--- a/source/blender/io/alembic/intern/abc_reader_mesh.cc
+++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc
@@ -19,6 +19,7 @@
*/
#include "abc_reader_mesh.h"
+#include "abc_axis_conversion.h"
#include "abc_reader_transform.h"
#include "abc_util.h"
@@ -26,7 +27,6 @@
#include "MEM_guardedalloc.h"
-extern "C" {
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -39,7 +39,6 @@ extern "C" {
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
-}
using Alembic::Abc::Int32ArraySamplePtr;
using Alembic::Abc::P3fArraySamplePtr;
@@ -201,6 +200,7 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
unsigned int loop_index = 0;
unsigned int rev_loop_index = 0;
unsigned int uv_index = 0;
+ bool seen_invalid_geometry = false;
for (int i = 0; i < face_counts->size(); i++) {
const int face_size = (*face_counts)[i];
@@ -216,10 +216,18 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
/* NOTE: Alembic data is stored in the reverse order. */
rev_loop_index = loop_index + (face_size - 1);
+ uint last_vertex_index = 0;
for (int f = 0; f < face_size; f++, loop_index++, rev_loop_index--) {
MLoop &loop = mloops[rev_loop_index];
loop.v = (*face_indices)[loop_index];
+ if (f > 0 && loop.v == last_vertex_index) {
+ /* This face is invalid, as it has consecutive loops from the same vertex. This is caused
+ * by invalid geometry in the Alembic file, such as in T76514. */
+ seen_invalid_geometry = true;
+ }
+ last_vertex_index = loop.v;
+
if (do_uvs) {
MLoopUV &loopuv = mloopuvs[rev_loop_index];
@@ -237,6 +245,12 @@ static void read_mpolys(CDStreamConfig &config, const AbcMeshData &mesh_data)
}
BKE_mesh_calc_edges(config.mesh, false, false);
+ if (seen_invalid_geometry) {
+ if (config.modifier_error_message) {
+ *config.modifier_error_message = "Mesh hash invalid geometry; more details on the console";
+ }
+ BKE_mesh_validate(config.mesh, true, true);
+ }
}
static void process_no_normals(CDStreamConfig &config)
@@ -467,6 +481,19 @@ bool AbcMeshReader::valid() const
return m_schema.valid();
}
+/* Specialisation of has_animations() as defined in abc_reader_object.h. */
+template<> bool has_animations(Alembic::AbcGeom::IPolyMeshSchema &schema, ImportSettings *settings)
+{
+ if (settings->is_sequence || !schema.isConstant()) {
+ return true;
+ }
+
+ IV2fGeomParam uvsParam = schema.getUVsParam();
+ IN3fGeomParam normalsParam = schema.getNormalsParam();
+ return (uvsParam.valid() && !uvsParam.isConstant()) ||
+ (normalsParam.valid() && !normalsParam.isConstant());
+}
+
void AbcMeshReader::readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel)
{
Mesh *mesh = BKE_mesh_add(bmain, m_data_name.c_str());
@@ -609,6 +636,7 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh,
CDStreamConfig config = get_config(new_mesh ? new_mesh : existing_mesh);
config.time = sample_sel.getRequestedTime();
+ config.modifier_error_message = err_str;
read_mesh_sample(m_iobject.getFullName(), &settings, m_schema, sample_sel, config);
diff --git a/source/blender/io/alembic/intern/abc_reader_nurbs.cc b/source/blender/io/alembic/intern/abc_reader_nurbs.cc
index 0ada10baba5..5b9954b3ff6 100644
--- a/source/blender/io/alembic/intern/abc_reader_nurbs.cc
+++ b/source/blender/io/alembic/intern/abc_reader_nurbs.cc
@@ -19,12 +19,12 @@
*/
#include "abc_reader_nurbs.h"
+#include "abc_axis_conversion.h"
#include "abc_reader_transform.h"
#include "abc_util.h"
#include "MEM_guardedalloc.h"
-extern "C" {
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -33,7 +33,6 @@ extern "C" {
#include "BKE_curve.h"
#include "BKE_object.h"
-}
using Alembic::AbcGeom::FloatArraySamplePtr;
using Alembic::AbcGeom::kWrapExisting;
@@ -72,7 +71,7 @@ bool AbcNurbsReader::valid() const
static bool set_knots(const FloatArraySamplePtr &knots, float *&nu_knots)
{
- if (!knots || knots->size() == 0) {
+ if (!knots || knots->size() < 2) {
return false;
}
diff --git a/source/blender/io/alembic/intern/abc_reader_object.cc b/source/blender/io/alembic/intern/abc_reader_object.cc
index 9b0c3237c45..e5bd0771a42 100644
--- a/source/blender/io/alembic/intern/abc_reader_object.cc
+++ b/source/blender/io/alembic/intern/abc_reader_object.cc
@@ -19,9 +19,9 @@
*/
#include "abc_reader_object.h"
+#include "abc_axis_conversion.h"
#include "abc_util.h"
-extern "C" {
#include "DNA_cachefile_types.h"
#include "DNA_constraint_types.h"
#include "DNA_modifier_types.h"
@@ -36,7 +36,6 @@ extern "C" {
#include "BLI_math_geom.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
-}
using Alembic::AbcGeom::IObject;
using Alembic::AbcGeom::IXform;
@@ -295,7 +294,7 @@ void AbcObjectReader::read_matrix(float r_mat[4][4] /* local matrix */,
void AbcObjectReader::addCacheModifier()
{
- ModifierData *md = modifier_new(eModifierType_MeshSequenceCache);
+ ModifierData *md = BKE_modifier_new(eModifierType_MeshSequenceCache);
BLI_addtail(&m_object->modifiers, md);
MeshSeqCacheModifierData *mcmd = reinterpret_cast<MeshSeqCacheModifierData *>(md);
diff --git a/source/blender/io/alembic/intern/abc_reader_object.h b/source/blender/io/alembic/intern/abc_reader_object.h
index 94923df2df9..dcc2697e0b5 100644
--- a/source/blender/io/alembic/intern/abc_reader_object.h
+++ b/source/blender/io/alembic/intern/abc_reader_object.h
@@ -24,9 +24,7 @@
#include <Alembic/Abc/All.h>
#include <Alembic/AbcGeom/All.h>
-extern "C" {
#include "DNA_ID.h"
-}
struct CacheFile;
struct Main;
diff --git a/source/blender/io/alembic/intern/abc_reader_points.cc b/source/blender/io/alembic/intern/abc_reader_points.cc
index e4dc345f868..c5d08693176 100644
--- a/source/blender/io/alembic/intern/abc_reader_points.cc
+++ b/source/blender/io/alembic/intern/abc_reader_points.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -26,14 +26,12 @@
#include "abc_reader_transform.h"
#include "abc_util.h"
-extern "C" {
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
-}
using Alembic::AbcGeom::kWrapExisting;
using Alembic::AbcGeom::N3fArraySamplePtr;
diff --git a/source/blender/io/alembic/intern/abc_reader_points.h b/source/blender/io/alembic/intern/abc_reader_points.h
index bb33afb466f..99881e091f9 100644
--- a/source/blender/io/alembic/intern/abc_reader_points.h
+++ b/source/blender/io/alembic/intern/abc_reader_points.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_reader_transform.cc b/source/blender/io/alembic/intern/abc_reader_transform.cc
index ce569a9ccb5..3df391f8432 100644
--- a/source/blender/io/alembic/intern/abc_reader_transform.cc
+++ b/source/blender/io/alembic/intern/abc_reader_transform.cc
@@ -21,13 +21,11 @@
#include "abc_reader_transform.h"
#include "abc_util.h"
-extern "C" {
#include "DNA_object_types.h"
#include "BLI_utildefines.h"
#include "BKE_object.h"
-}
using Alembic::Abc::ISampleSelector;
diff --git a/source/blender/io/alembic/intern/abc_util.cc b/source/blender/io/alembic/intern/abc_util.cc
index b26ef8b3b76..1f3bd2a1aaa 100644
--- a/source/blender/io/alembic/intern/abc_util.cc
+++ b/source/blender/io/alembic/intern/abc_util.cc
@@ -20,6 +20,7 @@
#include "abc_util.h"
+#include "abc_axis_conversion.h"
#include "abc_reader_camera.h"
#include "abc_reader_curves.h"
#include "abc_reader_mesh.h"
@@ -31,13 +32,11 @@
#include <algorithm>
-extern "C" {
#include "DNA_object_types.h"
#include "BLI_math_geom.h"
#include "PIL_time.h"
-}
std::string get_id_name(const Object *const ob)
{
@@ -121,144 +120,6 @@ void split(const std::string &s, const char delim, std::vector<std::string> &tok
}
}
-void create_swapped_rotation_matrix(float rot_x_mat[3][3],
- float rot_y_mat[3][3],
- float rot_z_mat[3][3],
- const float euler[3],
- AbcAxisSwapMode mode)
-{
- const float rx = euler[0];
- float ry;
- float rz;
-
- /* Apply transformation */
- switch (mode) {
- case ABC_ZUP_FROM_YUP:
- ry = -euler[2];
- rz = euler[1];
- break;
- case ABC_YUP_FROM_ZUP:
- ry = euler[2];
- rz = -euler[1];
- break;
- default:
- ry = 0.0f;
- rz = 0.0f;
- BLI_assert(false);
- break;
- }
-
- unit_m3(rot_x_mat);
- unit_m3(rot_y_mat);
- unit_m3(rot_z_mat);
-
- rot_x_mat[1][1] = cos(rx);
- rot_x_mat[2][1] = -sin(rx);
- rot_x_mat[1][2] = sin(rx);
- rot_x_mat[2][2] = cos(rx);
-
- rot_y_mat[2][2] = cos(ry);
- rot_y_mat[0][2] = -sin(ry);
- rot_y_mat[2][0] = sin(ry);
- rot_y_mat[0][0] = cos(ry);
-
- rot_z_mat[0][0] = cos(rz);
- rot_z_mat[1][0] = -sin(rz);
- rot_z_mat[0][1] = sin(rz);
- rot_z_mat[1][1] = cos(rz);
-}
-
-/* Convert matrix from Z=up to Y=up or vice versa.
- * Use yup_mat = zup_mat for in-place conversion. */
-void copy_m44_axis_swap(float dst_mat[4][4], float src_mat[4][4], AbcAxisSwapMode mode)
-{
- float dst_rot[3][3], src_rot[3][3], dst_scale_mat[4][4];
- float rot_x_mat[3][3], rot_y_mat[3][3], rot_z_mat[3][3];
- float src_trans[3], dst_scale[3], src_scale[3], euler[3];
-
- zero_v3(src_trans);
- zero_v3(dst_scale);
- zero_v3(src_scale);
- zero_v3(euler);
- unit_m3(src_rot);
- unit_m3(dst_rot);
- unit_m4(dst_scale_mat);
-
- /* TODO(Sybren): This code assumes there is no sheer component and no
- * homogeneous scaling component, which is not always true when writing
- * non-hierarchical (e.g. flat) objects (e.g. when parent has non-uniform
- * scale and the child rotates). This is currently not taken into account
- * when axis-swapping. */
-
- /* Extract translation, rotation, and scale form matrix. */
- mat4_to_loc_rot_size(src_trans, src_rot, src_scale, src_mat);
-
- /* Get euler angles from rotation matrix. */
- mat3_to_eulO(euler, ROT_MODE_XZY, src_rot);
-
- /* Create X, Y, Z rotation matrices from euler angles. */
- create_swapped_rotation_matrix(rot_x_mat, rot_y_mat, rot_z_mat, euler, mode);
-
- /* Concatenate rotation matrices. */
- mul_m3_m3m3(dst_rot, dst_rot, rot_z_mat);
- mul_m3_m3m3(dst_rot, dst_rot, rot_y_mat);
- mul_m3_m3m3(dst_rot, dst_rot, rot_x_mat);
-
- mat3_to_eulO(euler, ROT_MODE_XZY, dst_rot);
-
- /* Start construction of dst_mat from rotation matrix */
- unit_m4(dst_mat);
- copy_m4_m3(dst_mat, dst_rot);
-
- /* Apply translation */
- switch (mode) {
- case ABC_ZUP_FROM_YUP:
- copy_zup_from_yup(dst_mat[3], src_trans);
- break;
- case ABC_YUP_FROM_ZUP:
- copy_yup_from_zup(dst_mat[3], src_trans);
- break;
- default:
- BLI_assert(false);
- }
-
- /* Apply scale matrix. Swaps y and z, but does not
- * negate like translation does. */
- dst_scale[0] = src_scale[0];
- dst_scale[1] = src_scale[2];
- dst_scale[2] = src_scale[1];
-
- size_to_mat4(dst_scale_mat, dst_scale);
- mul_m4_m4m4(dst_mat, dst_mat, dst_scale_mat);
-}
-
-/* Recompute transform matrix of object in new coordinate system
- * (from Z-Up to Y-Up). */
-void create_transform_matrix(Object *obj,
- float r_yup_mat[4][4],
- AbcMatrixMode mode,
- Object *proxy_from)
-{
- float zup_mat[4][4];
-
- /* get local or world matrix. */
- if (mode == ABC_MATRIX_LOCAL && obj->parent) {
- /* Note that this produces another matrix than the local matrix, due to
- * constraints and modifiers as well as the obj->parentinv matrix. */
- invert_m4_m4(obj->parent->imat, obj->parent->obmat);
- mul_m4_m4m4(zup_mat, obj->parent->imat, obj->obmat);
- }
- else {
- copy_m4_m4(zup_mat, obj->obmat);
- }
-
- if (proxy_from) {
- mul_m4_m4m4(zup_mat, proxy_from->obmat, zup_mat);
- }
-
- copy_m44_axis_swap(r_yup_mat, zup_mat, ABC_YUP_FROM_ZUP);
-}
-
bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string &name)
{
if (!prop.valid()) {
diff --git a/source/blender/io/alembic/intern/abc_util.h b/source/blender/io/alembic/intern/abc_util.h
index 0b3462c2132..57b4d9800a5 100644
--- a/source/blender/io/alembic/intern/abc_util.h
+++ b/source/blender/io/alembic/intern/abc_util.h
@@ -56,15 +56,6 @@ Imath::M44d convert_matrix_datatype(float mat[4][4]);
/* Convert from Alembic to float matrix representations. Does NOT convert from Y-up to Z-up. */
void convert_matrix_datatype(const Imath::M44d &xform, float r_mat[4][4]);
-typedef enum {
- ABC_MATRIX_WORLD = 1,
- ABC_MATRIX_LOCAL = 2,
-} AbcMatrixMode;
-void create_transform_matrix(Object *obj,
- float r_transform_mat[4][4],
- AbcMatrixMode mode,
- Object *proxy_from);
-
void split(const std::string &s, const char delim, std::vector<std::string> &tokens);
template<class TContainer> bool begins_with(const TContainer &input, const TContainer &match)
@@ -115,66 +106,6 @@ float get_weight_and_index(float time,
AbcObjectReader *create_reader(const Alembic::AbcGeom::IObject &object, ImportSettings &settings);
-/* ************************** */
-
-/* TODO(kevin): for now keeping these transformations hardcoded to make sure
- * everything works properly, and also because Alembic is almost exclusively
- * used in Y-up software, but eventually they'll be set by the user in the UI
- * like other importers/exporters do, to support other axis. */
-
-/* Copy from Y-up to Z-up. */
-
-ABC_INLINE void copy_zup_from_yup(float zup[3], const float yup[3])
-{
- const float old_yup1 = yup[1]; /* in case zup == yup */
- zup[0] = yup[0];
- zup[1] = -yup[2];
- zup[2] = old_yup1;
-}
-
-ABC_INLINE void copy_zup_from_yup(short zup[3], const short yup[3])
-{
- const short old_yup1 = yup[1]; /* in case zup == yup */
- zup[0] = yup[0];
- zup[1] = -yup[2];
- zup[2] = old_yup1;
-}
-
-/* Copy from Z-up to Y-up. */
-
-ABC_INLINE void copy_yup_from_zup(float yup[3], const float zup[3])
-{
- const float old_zup1 = zup[1]; /* in case yup == zup */
- yup[0] = zup[0];
- yup[1] = zup[2];
- yup[2] = -old_zup1;
-}
-
-ABC_INLINE void copy_yup_from_zup(short yup[3], const short zup[3])
-{
- const short old_zup1 = zup[1]; /* in case yup == zup */
- yup[0] = zup[0];
- yup[1] = zup[2];
- yup[2] = -old_zup1;
-}
-
-/* Names are given in (dst, src) order, just like
- * the parameters of copy_m44_axis_swap() */
-typedef enum {
- ABC_ZUP_FROM_YUP = 1,
- ABC_YUP_FROM_ZUP = 2,
-} AbcAxisSwapMode;
-
-/* Create a rotation matrix for each axis from euler angles.
- * Euler angles are swapped to change coordinate system. */
-void create_swapped_rotation_matrix(float rot_x_mat[3][3],
- float rot_y_mat[3][3],
- float rot_z_mat[3][3],
- const float euler[3],
- AbcAxisSwapMode mode);
-
-void copy_m44_axis_swap(float dst_mat[4][4], float src_mat[4][4], AbcAxisSwapMode mode);
-
/* *************************** */
#undef ABC_DEBUG_TIME
diff --git a/source/blender/io/alembic/intern/abc_writer_archive.cc b/source/blender/io/alembic/intern/abc_writer_archive.cc
index af18d480a18..e7dee536cb9 100644
--- a/source/blender/io/alembic/intern/abc_writer_archive.cc
+++ b/source/blender/io/alembic/intern/abc_writer_archive.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -22,14 +22,13 @@
*/
#include "abc_writer_archive.h"
-extern "C" {
+
#include "BKE_blender_version.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "DNA_scene_types.h"
-}
#ifdef WIN32
# include "utfconv.h"
@@ -53,7 +52,7 @@ static OArchive create_archive(std::ostream *ostream,
abc_metadata.set(Alembic::Abc::kApplicationNameKey, "Blender");
abc_metadata.set(Alembic::Abc::kUserDescriptionKey, scene_name);
- abc_metadata.set("blender_version", versionstr);
+ abc_metadata.set("blender_version", std::string("v") + BKE_blender_version_string());
abc_metadata.set("FramesPerTimeUnit", std::to_string(scene_fps));
time_t raw_time;
diff --git a/source/blender/io/alembic/intern/abc_writer_archive.h b/source/blender/io/alembic/intern/abc_writer_archive.h
index e261e60990a..82b0e98b376 100644
--- a/source/blender/io/alembic/intern/abc_writer_archive.h
+++ b/source/blender/io/alembic/intern/abc_writer_archive.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_writer_camera.cc b/source/blender/io/alembic/intern/abc_writer_camera.cc
index e705e5ba911..07ae81e584f 100644
--- a/source/blender/io/alembic/intern/abc_writer_camera.cc
+++ b/source/blender/io/alembic/intern/abc_writer_camera.cc
@@ -21,10 +21,8 @@
#include "abc_writer_camera.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_camera_types.h"
#include "DNA_object_types.h"
-}
using Alembic::AbcGeom::OCamera;
using Alembic::AbcGeom::OFloatProperty;
diff --git a/source/blender/io/alembic/intern/abc_writer_curves.cc b/source/blender/io/alembic/intern/abc_writer_curves.cc
index 3ab9b365a72..db93ac1920e 100644
--- a/source/blender/io/alembic/intern/abc_writer_curves.cc
+++ b/source/blender/io/alembic/intern/abc_writer_curves.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -22,17 +22,16 @@
*/
#include "abc_writer_curves.h"
+#include "abc_axis_conversion.h"
#include "abc_reader_curves.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
#include "BKE_curve.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
-}
using Alembic::AbcGeom::OCompoundProperty;
using Alembic::AbcGeom::OCurves;
diff --git a/source/blender/io/alembic/intern/abc_writer_curves.h b/source/blender/io/alembic/intern/abc_writer_curves.h
index e57978ada2a..83f0289dd2d 100644
--- a/source/blender/io/alembic/intern/abc_writer_curves.h
+++ b/source/blender/io/alembic/intern/abc_writer_curves.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_writer_hair.cc b/source/blender/io/alembic/intern/abc_writer_hair.cc
index f29d195f2ff..ed62889b03d 100644
--- a/source/blender/io/alembic/intern/abc_writer_hair.cc
+++ b/source/blender/io/alembic/intern/abc_writer_hair.cc
@@ -19,12 +19,11 @@
*/
#include "abc_writer_hair.h"
-#include "abc_util.h"
+#include "abc_axis_conversion.h"
#include "abc_writer_transform.h"
#include <cstdio>
-extern "C" {
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -35,7 +34,6 @@ extern "C" {
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_particle.h"
-}
using Alembic::Abc::P3fArraySamplePtr;
diff --git a/source/blender/io/alembic/intern/abc_writer_mball.cc b/source/blender/io/alembic/intern/abc_writer_mball.cc
index 151848674f9..3593acf18b0 100644
--- a/source/blender/io/alembic/intern/abc_writer_mball.cc
+++ b/source/blender/io/alembic/intern/abc_writer_mball.cc
@@ -21,7 +21,6 @@
#include "abc_writer_mball.h"
#include "abc_writer_mesh.h"
-extern "C" {
#include "DNA_mesh_types.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
@@ -33,7 +32,6 @@ extern "C" {
#include "BKE_object.h"
#include "BLI_utildefines.h"
-}
AbcMBallWriter::AbcMBallWriter(Main *bmain,
Object *ob,
diff --git a/source/blender/io/alembic/intern/abc_writer_mesh.cc b/source/blender/io/alembic/intern/abc_writer_mesh.cc
index f81b9505048..df1734c9de1 100644
--- a/source/blender/io/alembic/intern/abc_writer_mesh.cc
+++ b/source/blender/io/alembic/intern/abc_writer_mesh.cc
@@ -19,16 +19,15 @@
*/
#include "abc_writer_mesh.h"
-#include "abc_util.h"
+#include "abc_axis_conversion.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_fluidsim_types.h"
-#include "BKE_animsys.h"
+#include "BKE_anim_data.h"
#include "BKE_key.h"
#include "BKE_lib_id.h"
#include "BKE_material.h"
@@ -40,7 +39,6 @@ extern "C" {
#include "bmesh_tools.h"
#include "DEG_depsgraph_query.h"
-}
using Alembic::Abc::FloatArraySample;
using Alembic::Abc::Int32ArraySample;
@@ -139,7 +137,8 @@ static void get_loop_normals(struct Mesh *mesh,
/* If all polygons are smooth shaded, and there are no custom normals, we don't need to export
* normals at all. This is also done by other software, see T71246. */
- if (!has_flat_shaded_poly && !CustomData_has_layer(&mesh->ldata, CD_CUSTOMLOOPNORMAL)) {
+ if (!has_flat_shaded_poly && !CustomData_has_layer(&mesh->ldata, CD_CUSTOMLOOPNORMAL) &&
+ (mesh->flag & ME_AUTOSMOOTH) == 0) {
return;
}
@@ -169,7 +168,7 @@ static ModifierData *get_subsurf_modifier(Scene *scene, Object *ob)
ModifierData *md = static_cast<ModifierData *>(ob->modifiers.last);
for (; md; md = md->prev) {
- if (!modifier_isEnabled(scene, md, eModifierMode_Render)) {
+ if (!BKE_modifier_is_enabled(scene, md, eModifierMode_Render)) {
continue;
}
@@ -192,9 +191,9 @@ static ModifierData *get_subsurf_modifier(Scene *scene, Object *ob)
static ModifierData *get_liquid_sim_modifier(Scene *scene, Object *ob)
{
- ModifierData *md = modifiers_findByType(ob, eModifierType_Fluidsim);
+ ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Fluidsim);
- if (md && (modifier_isEnabled(scene, md, eModifierMode_Render))) {
+ if (md && (BKE_modifier_is_enabled(scene, md, eModifierMode_Render))) {
FluidsimModifierData *fsmd = reinterpret_cast<FluidsimModifierData *>(md);
if (fsmd->fss && fsmd->fss->type == OB_FLUIDSIM_DOMAIN) {
@@ -335,7 +334,7 @@ void AbcGenericMeshWriter::writeMesh(struct Mesh *mesh)
V3fArraySample(points), Int32ArraySample(poly_verts), Int32ArraySample(loop_counts));
UVSample sample;
- if (m_first_frame && m_settings.export_uvs) {
+ if (m_settings.export_uvs) {
const char *name = get_uv_sample(sample, m_custom_data_config, &mesh->ldata);
if (!sample.indices.empty() && !sample.uvs.empty()) {
diff --git a/source/blender/io/alembic/intern/abc_writer_nurbs.cc b/source/blender/io/alembic/intern/abc_writer_nurbs.cc
index d643f5482c0..8b4a1050d33 100644
--- a/source/blender/io/alembic/intern/abc_writer_nurbs.cc
+++ b/source/blender/io/alembic/intern/abc_writer_nurbs.cc
@@ -19,17 +19,15 @@
*/
#include "abc_writer_nurbs.h"
-#include "abc_util.h"
+#include "abc_axis_conversion.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
#include "BLI_listbase.h"
#include "BKE_curve.h"
-}
using Alembic::AbcGeom::FloatArraySample;
using Alembic::AbcGeom::OBoolProperty;
diff --git a/source/blender/io/alembic/intern/abc_writer_object.cc b/source/blender/io/alembic/intern/abc_writer_object.cc
index 75dc93bd08e..f4a3587f54d 100644
--- a/source/blender/io/alembic/intern/abc_writer_object.cc
+++ b/source/blender/io/alembic/intern/abc_writer_object.cc
@@ -20,11 +20,9 @@
#include "abc_writer_object.h"
-extern "C" {
#include "DNA_object_types.h"
#include "BKE_object.h"
-}
AbcObjectWriter::AbcObjectWriter(Object *ob,
uint32_t time_sampling,
diff --git a/source/blender/io/alembic/intern/abc_writer_object.h b/source/blender/io/alembic/intern/abc_writer_object.h
index c3511566372..830c4aee903 100644
--- a/source/blender/io/alembic/intern/abc_writer_object.h
+++ b/source/blender/io/alembic/intern/abc_writer_object.h
@@ -26,9 +26,7 @@
#include "abc_exporter.h"
-extern "C" {
#include "DNA_ID.h"
-}
class AbcTransformWriter;
diff --git a/source/blender/io/alembic/intern/abc_writer_points.cc b/source/blender/io/alembic/intern/abc_writer_points.cc
index 70a1ead239a..d45af2eed4c 100644
--- a/source/blender/io/alembic/intern/abc_writer_points.cc
+++ b/source/blender/io/alembic/intern/abc_writer_points.cc
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
@@ -26,7 +26,6 @@
#include "abc_writer_mesh.h"
#include "abc_writer_transform.h"
-extern "C" {
#include "DNA_object_types.h"
#include "DNA_particle_types.h"
@@ -36,7 +35,6 @@ extern "C" {
#include "BLI_math.h"
#include "DEG_depsgraph_query.h"
-}
using Alembic::AbcGeom::kVertexScope;
using Alembic::AbcGeom::OPoints;
diff --git a/source/blender/io/alembic/intern/abc_writer_points.h b/source/blender/io/alembic/intern/abc_writer_points.h
index c171cddd10e..184a363ae6b 100644
--- a/source/blender/io/alembic/intern/abc_writer_points.h
+++ b/source/blender/io/alembic/intern/abc_writer_points.h
@@ -10,7 +10,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
+ * along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2016 Kévin Dietrich.
diff --git a/source/blender/io/alembic/intern/abc_writer_transform.cc b/source/blender/io/alembic/intern/abc_writer_transform.cc
index d7bcc46d96f..1ec7db0a1c6 100644
--- a/source/blender/io/alembic/intern/abc_writer_transform.cc
+++ b/source/blender/io/alembic/intern/abc_writer_transform.cc
@@ -19,17 +19,15 @@
*/
#include "abc_writer_transform.h"
-#include "abc_util.h"
+#include "abc_axis_conversion.h"
#include <OpenEXR/ImathBoxAlgo.h>
-extern "C" {
#include "DNA_object_types.h"
#include "BLI_math.h"
#include "DEG_depsgraph_query.h"
-}
using Alembic::AbcGeom::OObject;
using Alembic::AbcGeom::OXform;
diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc
index ced5791e0e8..6ca9e82a26c 100644
--- a/source/blender/io/alembic/intern/alembic_capi.cc
+++ b/source/blender/io/alembic/intern/alembic_capi.cc
@@ -40,7 +40,6 @@
#include "MEM_guardedalloc.h"
-extern "C" {
#include "DNA_cachefile_types.h"
#include "DNA_curve_types.h"
#include "DNA_modifier_types.h"
@@ -74,7 +73,6 @@ extern "C" {
#include "WM_api.h"
#include "WM_types.h"
-}
using Alembic::Abc::Int32ArraySamplePtr;
using Alembic::Abc::ObjectHeader;
@@ -877,8 +875,7 @@ bool ABC_import(bContext *C,
bool validate_meshes,
bool as_background_job)
{
- /* Using new here since MEM_* funcs do not call ctor to properly initialize
- * data. */
+ /* Using new here since MEM_* functions do not call constructor to properly initialize data. */
ImportJobData *job = new ImportJobData();
job->bmain = CTX_data_main(C);
job->scene = CTX_data_scene(C);