Commit: 09552885f932a6b0e4673881205a7d7291f8b1da
Author: Kévin Dietrich
Date:   Wed Apr 6 19:56:23 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB09552885f932a6b0e4673881205a7d7291f8b1da

AbcHairWriter: split write function in smaller ones.

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

M       source/blender/alembic/intern/abc_hair.cc
M       source/blender/alembic/intern/abc_hair.h

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

diff --git a/source/blender/alembic/intern/abc_hair.cc 
b/source/blender/alembic/intern/abc_hair.cc
index fccd90b..a489195 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -22,6 +22,8 @@
 
 #include "abc_hair.h"
 
+#include <cstdio>
+
 #include "abc_transform.h"
 #include "abc_util.h"
 
@@ -39,6 +41,8 @@ using Alembic::AbcGeom::OCurvesSchema;
 using Alembic::AbcGeom::ON3fGeomParam;
 using Alembic::AbcGeom::OV2fGeomParam;
 
+static const float nscale = 1.0f / 32767.0f;
+
 AbcHairWriter::AbcHairWriter(Scene *sce,
                              Object *obj,
                              AbcTransformWriter *parent,
@@ -77,177 +81,214 @@ void AbcHairWriter::do_write()
                return;
        }
 
-       Object *ob = m_object;
-
-       ParticleData * pa; int p, k;
-       ParticleCacheKey **cache, *path;
+       DerivedMesh *dm = mesh_create_derived_view(m_scene, m_object, 
CD_MASK_MESH);
+       DM_ensure_tessface(dm);
+       DM_update_tessface_data(dm);
 
-       /* Get untransformed vertices, there's a xform under the hair. */
-       float inv_mat[4][4];
-       invert_m4_m4_safe(inv_mat, ob->obmat);
+       std::vector<Imath::V3f> verts;
+       std::vector<int32_t> hvertices;
+       std::vector<Imath::V2f> uv_values;
+       std::vector<Imath::V3f> norm_values;
 
        ParticleSettings *part = m_psys->part;
 
-       DerivedMesh *dm = mesh_create_derived_view(m_scene, m_object, 
CD_MASK_MESH);
-       DM_ensure_tessface(dm);
-       DM_update_tessface_data(dm);
+       if (part->type == PART_HAIR && m_psys->pathcache) {
+               write_hair_sample(dm, part, verts, norm_values, uv_values, 
hvertices);
+
+               if (m_options.export_child_hairs && m_psys->childcache) {
+                       write_hair_child_sample(dm, part, verts, norm_values, 
uv_values, hvertices);
+               }
+       }
+
+       dm->release(dm);
+
+       Alembic::Abc::P3fArraySample iPos(verts);
+       m_curves_schema_sample = OCurvesSchema::Sample(iPos, hvertices);
+
+       if (!uv_values.empty()) {
+               OV2fGeomParam::Sample uv_smp;
+               uv_smp.setVals(uv_values);
+               m_curves_schema_sample.setUVs(uv_smp);
+       }
+
+       if (!norm_values.empty()) {
+               ON3fGeomParam::Sample norm_smp;
+               norm_smp.setVals(norm_values);
+               m_curves_schema_sample.setNormals(norm_smp);
+       }
+
+       m_curves_schema_sample.setSelfBounds(bounds());
+       m_curves_schema.set(m_curves_schema_sample);
+}
+
+void AbcHairWriter::write_hair_sample(DerivedMesh *dm,
+                                      ParticleSettings *part,
+                                      std::vector<Imath::V3f> &verts,
+                                      std::vector<Imath::V3f> &norm_values,
+                                      std::vector<Imath::V2f> &uv_values,
+                                      std::vector<int32_t> &hvertices)
+{
+       /* Get untransformed vertices, there's a xform under the hair. */
+       float inv_mat[4][4];
+       invert_m4_m4_safe(inv_mat, m_object->obmat);
 
        MTFace *mtface = static_cast<MTFace 
*>(CustomData_get_layer(&dm->faceData, CD_MTFACE));
        MFace *mface = dm->getTessFaceArray(dm);
        MVert *mverts = dm->getVertArray(dm);
 
        if (!mtface || !mface) {
-               printf("Warning, no UV set found for underlying geometry\n");
+               std::fprintf(stderr, "Warning, no UV set found for underlying 
geometry.\n");
        }
 
-       std::vector<Imath::V3f> verts;
-       std::vector<int32_t> hvertices;
-       std::vector<Imath::V2f> uv_values;
-       std::vector<Imath::V3f> norm_values;
+       ParticleData * pa = m_psys->particles;
+       int k;
 
-       const float nscale = 1.0f / 32767.0f;
+       ParticleCacheKey **cache = m_psys->pathcache;
+       ParticleCacheKey *path;
 
-       if (part->type == PART_HAIR && m_psys->pathcache) {
-               cache = m_psys->pathcache;
+       for (int p = 0; p < m_psys->totpart; ++p, ++pa) {
+               /* underlying info for faces-only emission */
+               path = cache[p];
 
-               for (p = 0, pa = m_psys->particles; p < m_psys->totpart; p++, 
pa++) {
-                       /* We want underlying info for faces only emission */
-                       path = cache[p];
+               if (part->from == PART_FROM_FACE && mtface) {
+                       float r_uv[2];
+                       float tmpnor[3], mapfw[4], vec[3];
+                       int num = pa->num_dmcache >= 0 ? pa->num_dmcache : 
pa->num;
 
-                       if (part->from == PART_FROM_FACE && mtface) {
-                               float r_uv[2];
-                               float tmpnor[3], mapfw[4], vec[3];
-                               int num = pa->num_dmcache >= 0 ? 
pa->num_dmcache : pa->num;
+                       if (num < dm->getNumTessFaces(dm)) {
+                               MFace *face = (MFace*)dm->getTessFaceData(dm, 
num, CD_MFACE);
+                               MTFace *tface = mtface + num;
 
-                               if (num < dm->getNumTessFaces(dm)) {
-                                       MFace *face  = 
(MFace*)dm->getTessFaceData(dm, num, CD_MFACE);
-                                       MTFace *tface = mtface + num;
+                               if (mface) {
+                                       psys_interpolate_uvs(tface, face->v4, 
pa->fuv, r_uv);
+                                       uv_values.push_back(Imath::V2f(r_uv[0], 
r_uv[1]));
 
-                                       if (mface) {
-                                               psys_interpolate_uvs(tface, 
face->v4, pa->fuv, r_uv);
-                                               
uv_values.push_back(Imath::V2f(r_uv[0], r_uv[1]));
+                                       psys_interpolate_face(mverts, face, 
tface, NULL, mapfw, vec, tmpnor, NULL, NULL, NULL, NULL);
 
-                                               psys_interpolate_face(mverts, 
face, tface, NULL, mapfw, vec, tmpnor, NULL, NULL, NULL, NULL);
-                                               
norm_values.push_back(Imath::V3f(tmpnor[0],tmpnor[2], -tmpnor[1]));
+                                       if (m_options.do_convert_axis) {
+                                               
mul_m3_v3(m_options.convert_matrix, tmpnor);
                                        }
+
+                                       
norm_values.push_back(Imath::V3f(tmpnor[0], tmpnor[1], tmpnor[2]));
                                }
-                               else {
-                                       printf("Particle to faces overflow 
(%d/%d)\n", num, dm->getNumTessFaces(dm));
-                               }
                        }
-                       else if (part->from == 0 && mtface) {
-                               /* num is the DM's vertex id */
-                               const int num = (pa->num_dmcache >= 0) ? 
pa->num_dmcache : pa->num;
-
-                               /* We will iterate over all faces to find a 
corresponding underlying UV */
-                               for (int n = 0; n < dm->getNumTessFaces(dm); 
++n) {
-                                       MFace * face  = 
(MFace*)dm->getTessFaceData(dm, n, CD_MFACE);
-                                       MTFace *tface = mtface + n;
-                                       unsigned int vtx[4];
-                                       vtx[0] = face->v1;
-                                       vtx[1] = face->v2;
-                                       vtx[2] = face->v3;
-                                       vtx[3] = face->v4;
-                                       bool found = false;
-                                       for (int o = 0; o < 4; ++o) {
-                                               if (o > 2 && vtx[o] == 0) {
-                                                       break;
-                                               }
-
-                                               if (vtx[o] == num) {
-                                                       
uv_values.push_back(Imath::V2f(tface->uv[o][0], tface->uv[o][1]));
-                                                       MVert *mv = mverts + 
vtx[o];
-                                                       
norm_values.push_back(Imath::V3f(mv->no[0] * nscale,
-                                                                             
mv->no[1] * nscale, mv->no[2] * nscale));
-                                                       found = true;
-                                                       break;
-                                               }
+                       else {
+                               std::fprintf(stderr, "Particle to faces 
overflow (%d/%d)\n", num, dm->getNumTessFaces(dm));
+                       }
+               }
+               else if (part->from == PART_FROM_VERT && mtface) {
+                       /* vertex id */
+                       const int num = (pa->num_dmcache >= 0) ? 
pa->num_dmcache : pa->num;
+
+                       /* iterate over all faces to find a corresponding 
underlying UV */
+                       for (int n = 0; n < dm->getNumTessFaces(dm); ++n) {
+                               MFace *face  = (MFace*)dm->getTessFaceData(dm, 
n, CD_MFACE);
+                               MTFace *tface = mtface + n;
+                               unsigned int vtx[4];
+                               vtx[0] = face->v1;
+                               vtx[1] = face->v2;
+                               vtx[2] = face->v3;
+                               vtx[3] = face->v4;
+                               bool found = false;
+
+                               for (int o = 0; o < 4; ++o) {
+                                       if (o > 2 && vtx[o] == 0) {
+                                               break;
                                        }
 
-                                       if (found) {
+                                       if (vtx[o] == num) {
+                                               
uv_values.push_back(Imath::V2f(tface->uv[o][0], tface->uv[o][1]));
+                                               MVert *mv = mverts + vtx[o];
+                                               
norm_values.push_back(Imath::V3f(mv->no[0] * nscale,
+                                                                     mv->no[1] 
* nscale, mv->no[2] * nscale));
+                                               found = true;
                                                break;
                                        }
                                }
+
+                               if (found) {
+                                       break;
+                               }
                        }
+               }
 
-                       int steps = path->segments + 1;
-                       hvertices.push_back(steps);
+               int steps = path->segments + 1;
+               hvertices.push_back(steps);
 
-                       for (k = 0; k < steps; ++k) {
-                               float vert[3];
-                               copy_v3_v3(vert, path->co);
-                               mul_m4_v3(inv_mat, vert);
+               for (k = 0; k < steps; ++k) {
+                       float vert[3];
+                       copy_v3_v3(vert, path->co);
+                       mul_m4_v3(inv_mat, vert);
 
-                               if (m_options.do_convert_axis) {
-                                       mul_m3_v3(m_options.convert_matrix, 
vert);
-                               }
+                       if (m_options.do_convert_axis) {
+                               mul_m3_v3(m_options.convert_matrix, vert);
+                       }
 
-                               verts.push_back(Imath::V3f(vert[0], vert[1], 
vert[2]));
+                       verts.push_back(Imath::V3f(vert[0], vert[1], vert[2]));
 
-                               ++path;
-                       }
+                       ++path;
                }
+       }
+}
 
-               if (m_options.export_child_hairs && m_psys->childcache) {
-                       /* Children part */
-                       cache = m_psys->childcache;
-                       ChildParticle *pc;
-                       for (p = 0, pc = m_psys->child; p < m_psys->totchild; 
p++, pc++) {
-                               path = cache[p];
+void AbcHairWriter::write_hair_child_sample(DerivedMesh *dm,
+                                            ParticleSettings *part,
+                                            std::vector<Imath::V3f> &verts,
+                                            std::vector<Imath::V3f> 
&norm_values,
+                                            std::vector<Imath::V2f> &uv_values,
+                                            std::vector<int32_t> &hvertices)
+{
+       /* Get untransformed vertices, there's a xform under the hair. */
+       float inv_mat[4][4];
+       invert_m4_m4_safe(inv_mat, m_object->obmat);
 
-                               if (part->from == PART_FROM_FACE) {
-                                       float r_uv[2];
-                                       float tmpnor[3], mapfw[4], vec[3];
-                                       int num = pc->num;
+       MTFace *mtface = static_cast<MTFace 
*>(CustomData_get_layer(&dm->faceData, CD_MTFACE));
+       MFace *mface = dm->getTessFaceArray(dm);
+       MVert *mverts = dm->getVertArray(dm);
 
-                                       MFace *face = (MFace 
*)dm->getTessFaceData(dm, num, CD_MFACE);
-                                       MTFace *tface = mtface + num;
+       if (!mtface || !mface) {
+               std::fprintf(stderr, "Warning, no UV set found for underlying 
geometry.\n");
+       }
 
-                                       if (mface && mtface) {
-                                               psys_interpolate_uvs(tface, 
face->v4, pc->fuv, r_uv);
-                                               
uv_values.push_back(Imath::V2f(r_uv[0], r_uv[1]));
+       ParticleCacheKey **cache = m_psys->childcache;
+       ParticleCacheKey *path;
 
-                                               psys_interpolate_face(mverts, 
face, tface, NULL, mapfw, vec, tmpnor, NULL, NULL, NULL, NULL);
+       ChildParticle *pc = m_psys->child;
 
-                                               if (m_options.do_convert_axis) {
-                                                       
mul_m3_v3(m_options.convert_matrix, tmpnor);
-                                               }
+       for (int p = 0; p < m_psys->totchild; ++p, ++pc) {
+               path = cache[p];
 
-                                               
norm_values.push_back(Imath::V3f(tmpnor[0], tmpnor[1], tmpnor[2]));
-                                       }
-                               }
+               if (part->from == PART_FROM_FACE) {
+                       float r_uv[2];
+                       float tmpnor[3], mapfw[4], vec[3];
+                       int num = pc->num;
+
+                       MFace *face = (MF

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to