diff options
author | Siddhartha Jejurkar <f20180617@goa.bits-pilani.ac.in> | 2021-12-17 16:01:32 +0300 |
---|---|---|
committer | Siddhartha Jejurkar <f20180617@goa.bits-pilani.ac.in> | 2021-12-17 16:01:32 +0300 |
commit | dbc41b30f88b96f7d8c6e995b17f5930eb55cc77 (patch) | |
tree | c6c495328443ea3621e5df2ef483b0e0dd504496 /source/blender/io/alembic/intern | |
parent | 99a2af76d10e05a18987be5d554ada197b1ca086 (diff) | |
parent | 7c9e4099854a4fc8eab4db97173c1aacd25f9e08 (diff) |
Merge branch 'master' into soc-2021-uv-edge-select-supportsoc-2021-uv-edge-select-support
Diffstat (limited to 'source/blender/io/alembic/intern')
10 files changed, 55 insertions, 33 deletions
diff --git a/source/blender/io/alembic/intern/abc_axis_conversion.cc b/source/blender/io/alembic/intern/abc_axis_conversion.cc index 23b24d2fd9a..78ea7166faf 100644 --- a/source/blender/io/alembic/intern/abc_axis_conversion.cc +++ b/source/blender/io/alembic/intern/abc_axis_conversion.cc @@ -75,8 +75,6 @@ void create_swapped_rotation_matrix(float rot_x_mat[3][3], } // namespace // alembicvoidcreate_swapped_rotation_matrix(floatrot_x_mat[3][3],floatrot_y_mat[3][3],floatrot_z_mat[3][3],constfloateuler[3],AbcAxisSwapModemode) -/* 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]; @@ -139,8 +137,6 @@ void copy_m44_axis_swap(float dst_mat[4][4], float src_mat[4][4], AbcAxisSwapMod 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, diff --git a/source/blender/io/alembic/intern/abc_axis_conversion.h b/source/blender/io/alembic/intern/abc_axis_conversion.h index 30988222fb7..21b95ec717e 100644 --- a/source/blender/io/alembic/intern/abc_axis_conversion.h +++ b/source/blender/io/alembic/intern/abc_axis_conversion.h @@ -70,20 +70,27 @@ BLI_INLINE void copy_yup_from_zup(short yup[3], const short zup[3]) } /* Names are given in (dst, src) order, just like - * the parameters of copy_m44_axis_swap() */ + * 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. */ +/** + * 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); +/** + * 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); typedef enum { @@ -91,6 +98,10 @@ typedef enum { ABC_MATRIX_LOCAL = 2, } AbcMatrixMode; +/** + * 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, diff --git a/source/blender/io/alembic/intern/abc_customdata.cc b/source/blender/io/alembic/intern/abc_customdata.cc index 188e8daac8f..830ec731e20 100644 --- a/source/blender/io/alembic/intern/abc_customdata.cc +++ b/source/blender/io/alembic/intern/abc_customdata.cc @@ -36,6 +36,7 @@ #include "BLI_utildefines.h" #include "BKE_customdata.h" +#include "BKE_mesh.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 @@ -253,7 +254,8 @@ static void write_mcol(const OCompoundProperty &prop, void write_generated_coordinates(const OCompoundProperty &prop, CDStreamConfig &config) { - const void *customdata = CustomData_get_layer(&config.mesh->vdata, CD_ORCO); + Mesh *mesh = config.mesh; + const void *customdata = CustomData_get_layer(&mesh->vdata, CD_ORCO); if (customdata == nullptr) { /* Data not available, so don't even bother creating an Alembic property for it. */ return; @@ -268,6 +270,11 @@ void write_generated_coordinates(const OCompoundProperty &prop, CDStreamConfig & coords[vertex_idx].setValue(orco_yup[0], orco_yup[1], orco_yup[2]); } + /* ORCOs are always stored in the normalized 0..1 range in Blender, but Alembic stores them + * unnormalized, so we need to unnormalize (invert transform) them. */ + BKE_mesh_orco_verts_transform( + mesh, reinterpret_cast<float(*)[3]>(&coords[0]), mesh->totvert, true); + if (!config.abc_orco.valid()) { /* Create the Alembic property and keep a reference so future frames can reuse it. */ config.abc_orco = OV3fGeomParam(prop, propNameOriginalCoordinates, false, kVertexScope, 1); @@ -536,13 +543,14 @@ void read_generated_coordinates(const ICompoundProperty &prop, IV3fGeomParam::Sample sample = param.getExpandedValue(iss); Alembic::AbcGeom::V3fArraySamplePtr abc_ocro = sample.getVals(); const size_t totvert = abc_ocro.get()->size(); + Mesh *mesh = config.mesh; void *cd_data; - if (CustomData_has_layer(&config.mesh->vdata, CD_ORCO)) { - cd_data = CustomData_get_layer(&config.mesh->vdata, CD_ORCO); + if (CustomData_has_layer(&mesh->vdata, CD_ORCO)) { + cd_data = CustomData_get_layer(&mesh->vdata, CD_ORCO); } else { - cd_data = CustomData_add_layer(&config.mesh->vdata, CD_ORCO, CD_CALLOC, nullptr, totvert); + cd_data = CustomData_add_layer(&mesh->vdata, CD_ORCO, CD_CALLOC, nullptr, totvert); } float(*orcodata)[3] = static_cast<float(*)[3]>(cd_data); @@ -550,6 +558,10 @@ void read_generated_coordinates(const ICompoundProperty &prop, const Imath::V3f &abc_coords = (*abc_ocro)[vertex_idx]; copy_zup_from_yup(orcodata[vertex_idx], abc_coords.getValue()); } + + /* ORCOs are always stored in the normalized 0..1 range in Blender, but Alembic stores them + * unnormalized, so we need to normalize them. */ + BKE_mesh_orco_verts_transform(mesh, orcodata, mesh->totvert, false); } void read_custom_data(const std::string &iobject_full_name, @@ -591,12 +603,6 @@ void read_custom_data(const std::string &iobject_full_name, } } -/* UVs can be defined per-loop (one value per vertex per face), or per-vertex (one value per - * vertex). The first case is the most common, as this is the standard way of storing this data - * given that some vertices might be on UV seams and have multiple possible UV coordinates; the - * second case can happen when the mesh is split according to the UV islands, in which case storing - * a single UV value per vertex allows to deduplicate data and thus to reduce the file size since - * vertices are guaranteed to only have a single UV coordinate. */ AbcUvScope get_uv_scope(const Alembic::AbcGeom::GeometryScope scope, const CDStreamConfig &config, const Alembic::AbcGeom::UInt32ArraySamplePtr &indices) diff --git a/source/blender/io/alembic/intern/abc_customdata.h b/source/blender/io/alembic/intern/abc_customdata.h index 5eae6307474..97a9235753f 100644 --- a/source/blender/io/alembic/intern/abc_customdata.h +++ b/source/blender/io/alembic/intern/abc_customdata.h @@ -132,6 +132,14 @@ typedef enum { ABC_UV_SCOPE_VERTEX, } AbcUvScope; +/** + * UVs can be defined per-loop (one value per vertex per face), or per-vertex (one value per + * vertex). The first case is the most common, as this is the standard way of storing this data + * given that some vertices might be on UV seams and have multiple possible UV coordinates; the + * second case can happen when the mesh is split according to the UV islands, in which case storing + * a single UV value per vertex allows to de-duplicate data and thus to reduce the file size since + * vertices are guaranteed to only have a single UV coordinate. + */ AbcUvScope get_uv_scope(const Alembic::AbcGeom::GeometryScope scope, const CDStreamConfig &config, const Alembic::AbcGeom::UInt32ArraySamplePtr &indices); diff --git a/source/blender/io/alembic/intern/abc_reader_curves.cc b/source/blender/io/alembic/intern/abc_reader_curves.cc index d2ec7fb84db..bd1e57da648 100644 --- a/source/blender/io/alembic/intern/abc_reader_curves.cc +++ b/source/blender/io/alembic/intern/abc_reader_curves.cc @@ -274,12 +274,6 @@ void AbcCurveReader::read_curve_sample(Curve *cu, } } -/* NOTE: Alembic only stores data about control points, but the Mesh - * passed from the cache modifier contains the displist, which has more data - * than the control points, so to avoid corrupting the displist we modify the - * object directly and create a new Mesh from that. Also we might need to - * create new or delete existing NURBS in the curve. - */ Mesh *AbcCurveReader::read_mesh(Mesh *existing_mesh, const ISampleSelector &sample_sel, int /*read_flag*/, diff --git a/source/blender/io/alembic/intern/abc_reader_curves.h b/source/blender/io/alembic/intern/abc_reader_curves.h index df5d68d7850..6bc0691a870 100644 --- a/source/blender/io/alembic/intern/abc_reader_curves.h +++ b/source/blender/io/alembic/intern/abc_reader_curves.h @@ -43,6 +43,13 @@ class AbcCurveReader final : public AbcObjectReader { const char **err_str) const override; void readObjectData(Main *bmain, const Alembic::Abc::ISampleSelector &sample_sel) override; + /** + * \note Alembic only stores data about control points, but the Mesh + * passed from the cache modifier contains the displist, which has more data + * than the control points, so to avoid corrupting the displist we modify the + * object directly and create a new Mesh from that. Also we might need to + * create new or delete existing NURBS in the curve. + */ struct Mesh *read_mesh(struct Mesh *existing_mesh, const Alembic::Abc::ISampleSelector &sample_sel, const int read_flag, diff --git a/source/blender/io/alembic/intern/abc_reader_object.cc b/source/blender/io/alembic/intern/abc_reader_object.cc index a6d46c4b42a..4a359c49d26 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.cc +++ b/source/blender/io/alembic/intern/abc_reader_object.cc @@ -67,7 +67,6 @@ AbcObjectReader::AbcObjectReader(const IObject &object, ImportSettings &settings determine_inherits_xform(); } -/* Determine whether we can inherit our parent's XForm */ void AbcObjectReader::determine_inherits_xform() { m_inherits_xform = false; diff --git a/source/blender/io/alembic/intern/abc_reader_object.h b/source/blender/io/alembic/intern/abc_reader_object.h index 6e97f841a88..f1c07da0764 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.h +++ b/source/blender/io/alembic/intern/abc_reader_object.h @@ -171,6 +171,7 @@ class AbcObjectReader { void read_matrix(float r_mat[4][4], const float time, const float scale, bool &is_constant); protected: + /** Determine whether we can inherit our parent's XForm. */ void determine_inherits_xform(); }; diff --git a/source/blender/io/alembic/intern/abc_util.cc b/source/blender/io/alembic/intern/abc_util.cc index 3d3ba0347c5..952fe1fa783 100644 --- a/source/blender/io/alembic/intern/abc_util.cc +++ b/source/blender/io/alembic/intern/abc_util.cc @@ -63,15 +63,6 @@ std::string get_valid_abc_name(const char *name) return name_string; } -/** - * \brief get_object_dag_path_name returns the name under which the object - * will be exported in the Alembic file. It is of the form - * "[../grandparent/]parent/object" if dupli_parent is NULL, or - * "dupli_parent/[../grandparent/]parent/object" otherwise. - * \param ob: - * \param dupli_parent: - * \return - */ std::string get_object_dag_path_name(const Object *const ob, Object *dupli_parent) { std::string name = get_id_name(ob); diff --git a/source/blender/io/alembic/intern/abc_util.h b/source/blender/io/alembic/intern/abc_util.h index ced9fde0f85..3a0b2852eea 100644 --- a/source/blender/io/alembic/intern/abc_util.h +++ b/source/blender/io/alembic/intern/abc_util.h @@ -35,6 +35,15 @@ struct ImportSettings; std::string get_id_name(const ID *const id); std::string get_id_name(const Object *const ob); std::string get_valid_abc_name(const char *name); +/** + * \brief get_object_dag_path_name returns the name under which the object + * will be exported in the Alembic file. It is of the form + * "[../grandparent/]parent/object" if dupli_parent is NULL, or + * "dupli_parent/[../grandparent/]parent/object" otherwise. + * \param ob: + * \param dupli_parent: + * \return + */ std::string get_object_dag_path_name(const Object *const ob, Object *dupli_parent); /* Convert from float to Alembic matrix representations. Does NOT convert from Z-up to Y-up. */ |