[Bf-blender-cvs] [bdbf897] alembic_basic_io: Replace hard coded axis conversion with UI parrameters.
Kévin Dietrich
noreply at git.blender.org
Wed Apr 6 18:11:54 CEST 2016
Commit: bdbf89728f4c6a6c02814def54bc2b6060b9a7e6
Author: Kévin Dietrich
Date: Wed Apr 6 16:38:39 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBbdbf89728f4c6a6c02814def54bc2b6060b9a7e6
Replace hard coded axis conversion with UI parrameters.
===================================================================
M source/blender/alembic/ABC_alembic.h
M source/blender/alembic/intern/abc_export_options.h
M source/blender/alembic/intern/abc_hair.cc
M source/blender/alembic/intern/abc_mesh.cc
M source/blender/alembic/intern/abc_nurbs.cc
M source/blender/alembic/intern/abc_transform.cc
M source/blender/alembic/intern/alembic_capi.cc
M source/blender/editors/io/io_alembic.c
M source/blender/makesrna/intern/rna_scene_api.c
===================================================================
diff --git a/source/blender/alembic/ABC_alembic.h b/source/blender/alembic/ABC_alembic.h
index 02b2880..30b8686 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -40,19 +40,19 @@ struct Scene;
#define BL_ABC_UNKNOWN_ERROR 1
int ABC_export(struct Scene *sce, const char *filename,
- double start, double end,
- double xformstep, double geomstep,
- double shutter_open, double shutter_close,
- int selected_only,
- int uvs, int normals,
- int vcolors,
- int force_meshes,
- int flatten_hierarchy,
- int custom_props_as_geodata,
- int vislayers, int renderable,
- int facesets, int matindices,
- int geogroups, bool ogawa,
- bool packuv);
+ double start, double end,
+ double xformstep, double geomstep,
+ double shutter_open, double shutter_close,
+ int selected_only,
+ int uvs, int normals,
+ int vcolors,
+ int force_meshes,
+ int flatten_hierarchy,
+ int custom_props_as_geodata,
+ int vislayers, int renderable,
+ int facesets, int matindices,
+ int geogroups, bool ogawa,
+ bool packuv, int to_forward, int to_up);
void ABC_import(struct bContext *C, const char *filename, int from_forward, int from_up);
diff --git a/source/blender/alembic/intern/abc_export_options.h b/source/blender/alembic/intern/abc_export_options.h
index c1bcbd6..31409ac 100644
--- a/source/blender/alembic/intern/abc_export_options.h
+++ b/source/blender/alembic/intern/abc_export_options.h
@@ -60,6 +60,9 @@ struct AbcExportOptions {
bool export_ogawa;
bool pack_uv;
+ bool do_convert_axis;
+ float convert_matrix[3][3];
+
private:
Scene *m_scene;
};
diff --git a/source/blender/alembic/intern/abc_hair.cc b/source/blender/alembic/intern/abc_hair.cc
index c03685b..0c40405 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -163,17 +163,19 @@ void AbcHairWriter::do_write()
int steps = path->segments + 1;
hvertices.push_back(steps);
- for (k=0; k < steps; k++) {
+
+ for (k = 0; k < steps; ++k) {
float vert[3];
copy_v3_v3(vert, path->co);
mul_m4_v3(inv_mat, vert);
- if (m_rotate_matrix) {
- verts.push_back(Alembic::AbcGeom::V3f(vert[0], vert[2], -vert[1]));
- }
- else {
- verts.push_back(Alembic::AbcGeom::V3f(vert[0], vert[1], vert[2]));
+
+ if (m_options.do_convert_axis) {
+ mul_m3_v3(m_options.convert_matrix, vert);
}
- path++;
+
+ verts.push_back(Alembic::AbcGeom::V3f(vert[0], vert[1], vert[2]));
+
+ ++path;
}
}
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 4cf67f6..12e039a 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -403,11 +403,12 @@ void AbcMeshWriter::getPoints(DerivedMesh *dm, std::vector<float> &points)
MVert *verts = dm->getVertArray(dm);
- if (m_rotate_matrix) {
+ if (m_options.do_convert_axis) {
+ float vert[3];
+
for (int i = 0, e = dm->getNumVerts(dm); i < e; ++i) {
- points.push_back(verts[i].co[0]);
- points.push_back(verts[i].co[2]);
- points.push_back(-verts[i].co[1]);
+ copy_v3_v3(vert, verts[i].co);
+ mul_m3_v3(m_options.convert_matrix, vert);
}
}
else {
@@ -837,11 +838,16 @@ void AbcMeshWriter::getVelocities(DerivedMesh *dm,
if (fss->meshVelocities) {
float *meshVels = reinterpret_cast<float *>(fss->meshVelocities);
- if (m_rotate_matrix) {
+ if (m_options.do_convert_axis) {
+ float vel[3];
+
for (int i = 0; i < totverts; ++i) {
- vels.push_back(meshVels[0]);
- vels.push_back(meshVels[2]);
- vels.push_back(-meshVels[1]);
+ copy_v3_v3(vel, meshVels);
+ mul_m3_v3(m_options.convert_matrix, vel);
+
+ vels.push_back(vels[0]);
+ vels.push_back(vels[1]);
+ vels.push_back(vels[2]);
meshVels += 3;
}
}
diff --git a/source/blender/alembic/intern/abc_nurbs.cc b/source/blender/alembic/intern/abc_nurbs.cc
index 4bb1310..5639888 100644
--- a/source/blender/alembic/intern/abc_nurbs.cc
+++ b/source/blender/alembic/intern/abc_nurbs.cc
@@ -32,6 +32,7 @@ extern "C" {
#include "DNA_object_types.h"
#include "BLI_listbase.h"
+#include "BLI_math.h"
#include "BLI_string.h"
#include "BKE_curve.h"
@@ -82,9 +83,12 @@ bool AbcNurbsWriter::isAnimated() const
return (cu->key != NULL);
}
-static
-void recompute_pnts_cyclic(const BPoint *bps, const int num_u, const int num_v, const int add_u, const int add_v,
- std::vector<Alembic::Abc::V3f>& pos, std::vector<float>& posWeight, bool rotate)
+static void recompute_pnts_cyclic(const BPoint *bps,
+ const int num_u, const int num_v,
+ const int add_u, const int add_v,
+ std::vector<Alembic::Abc::V3f> &pos,
+ std::vector<float> &posWeight,
+ bool rotate, float rot_mat[3][3])
{
const int new_u = num_u;// + add_u;
const int new_v = num_v;// + add_v;
@@ -98,19 +102,28 @@ void recompute_pnts_cyclic(const BPoint *bps, const int num_u, const int num_v,
for (int u = 0; u < new_u; ++u) {
pnts[u].resize(new_v);
- for (int v = 0; v < new_v; ++v) {
- const BPoint& bp = bps[u + (v * new_u)];
- pnts[u][v] = Imath::Vec4<float>(bp.vec[0], bp.vec[1], bp.vec[2], bp.vec[3]);
+ if (rotate) {
+ for (int v = 0; v < new_v; ++v) {
+ const BPoint& bp = bps[u + (v * new_u)];
+ float vert[3];
+ copy_v3_v3(vert, bp.vec);
+ mul_m3_v3(rot_mat, vert);
+
+ pnts[u][v] = Imath::Vec4<float>(vert[0], vert[1], vert[2], bp.vec[3]);
+ }
+ }
+ else {
+ for (int v = 0; v < new_v; ++v) {
+ const BPoint& bp = bps[u + (v * new_u)];
+ pnts[u][v] = Imath::Vec4<float>(bp.vec[0], bp.vec[1], bp.vec[2], bp.vec[3]);
+ }
}
}
for (int u = 0; u < new_u; ++u) {
for (int v = 0; v < new_v; ++v) {
Imath::Vec4<float>& pnt = pnts[u][v];
- if (!rotate)
- pos.push_back(Alembic::Abc::V3f(pnt.x, pnt.y, pnt.z));
- else
- pos.push_back(Alembic::Abc::V3f(pnt.x, pnt.z, -pnt.y));
+ pos.push_back(Alembic::Abc::V3f(pnt.x, pnt.y, pnt.z));
posWeight.push_back(pnt.z);
}
}
@@ -163,7 +176,9 @@ void AbcNurbsWriter::do_write()
std::vector<Alembic::Abc::V3f> sampPos;
std::vector<float> sampPosWeights;
- recompute_pnts_cyclic(nu->bp, nu->pntsu, nu->pntsv, add_u, add_v, sampPos, sampPosWeights, m_rotate_matrix);
+ recompute_pnts_cyclic(nu->bp, nu->pntsu, nu->pntsv, add_u, add_v,
+ sampPos, sampPosWeights,
+ m_options.do_convert_axis, m_options.convert_matrix);
nuSamp.setPositions(sampPos);
nuSamp.setPositionWeights(sampPosWeights);
diff --git a/source/blender/alembic/intern/abc_transform.cc b/source/blender/alembic/intern/abc_transform.cc
index 86c407e..7d0cac4 100644
--- a/source/blender/alembic/intern/abc_transform.cc
+++ b/source/blender/alembic/intern/abc_transform.cc
@@ -51,212 +51,9 @@ AbcTransformWriter::AbcTransformWriter(Object *obj, Abc::OObject abcParent, AbcT
writerParent->addChild(this);
}
-// recompute transform matrix of object in new coordinate system (from Z-Up to Y-Up)
-static void createTransformMatrix(float transform_mat[4][4], Object *obj)
-{
- float rot_mat[3][3], rot[3][3], scale_mat[4][4], invmat[4][4], mat[4][4];
- float rot_x_mat[3][3], rot_y_mat[3][3], rot_z_mat[3][3];
- float loc[3], scale[3], euler[3];
-
- zero_v3(loc);
- zero_v3(scale);
- zero_v3(euler);
- unit_m3(rot);
- unit_m3(rot_mat);
- unit_m4(scale_mat);
- unit_m4(transform_mat);
- unit_m4(invmat);
- unit_m4(mat);
-
- // get local matrix
- if (obj->parent) {
- invert_m4_m4(invmat, obj->parent->obmat);
- mul_m4_m4m4(mat, invmat, obj->obmat);
- }
- else {
- copy_m4_m4(mat, obj->obmat);
- }
-
- // compute rotation matrix
- switch(obj->rotmode) {
- case ROT_MODE_AXISANGLE:
- {
- // get euler angles from axis angle rotation
- axis_angle_to_eulO(euler, ROT_MODE_XYZ, obj->rotAxis, obj->rotAngle);
-
- // create X, Y, Z rotation matrices from euler angles
- rotate_m3_zup_yup(rot_x_mat, rot_y_mat, rot_z_mat, euler);
-
- // concatenate rotation matrices
- mul_m3_m3m3(rot_mat, rot_mat, rot_y_mat);
- mul_m3_m3m3(rot_mat, rot_mat, rot_z_mat);
- mul_m3_m3m3(rot_mat, rot_mat, rot_x_mat);
-
- // extract location and scale from matrix
- mat4_to_loc_rot_size(loc, rot, scale, mat);
-
- break;
- }
-
- case ROT_MODE_QUAT:
- {
- float q[4];
- copy_v4_v4(q, obj->quat);
-
- // swap axis
- q[2] = obj->quat[3];
- q[3] = -obj->quat[2];
-
- // compute rotation matrix from quaternion
- quat_to_mat3(rot_mat, q);
-
- // extract location and scale from matrix
- mat4_to_loc_rot_size(loc, rot, scale, mat);
-
- break;
- }
-
- case ROT_MODE_XYZ:
- {
- // extract location, rotation, and scale form matrix
- mat4_to_loc_rot_size(loc, rot, scale, mat);
-
- // get euler angles from rotation matrix
- mat3_to_eulO(euler, ROT_MODE_XYZ, rot);
-
- // create X, Y, Z rotation matrices from euler angles
- rotate_m3_zup_yup(rot_x_mat, rot_y_mat, rot_z_mat, euler);
-
- // concatenate rotation matrices
- mul_m3_m3m3(rot_mat, rot_mat, rot_y_mat);
- mul_m3_m3m3(rot_mat, rot_mat, rot_z_mat);
- mul_m3_m3m3(rot_mat, rot_mat, rot_x_mat);
-
- break;
- }
-
- case ROT_MODE_XZY:
- {
- // extract location, rotation, and scale form matrix
- mat4_to_loc_rot_size(loc, rot, scale, mat);
-
- // get euler angles from rotation matrix
- mat3_to_eulO(euler, ROT_MODE_XZY, rot);
-
- // create X, Y, Z rotation matrices from euler angles
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list