[Bf-blender-cvs] [98a25e6] alembic_basic_io: Merge branch 'master' into alembic_basic_io

Campbell Barton noreply at git.blender.org
Wed Jul 20 22:07:42 CEST 2016


Commit: 98a25e6528df8c38a12bf67bdefbbac6fee15fda
Author: Campbell Barton
Date:   Thu Jul 21 06:08:35 2016 +1000
Branches: alembic_basic_io
https://developer.blender.org/rB98a25e6528df8c38a12bf67bdefbbac6fee15fda

Merge branch 'master' into alembic_basic_io

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



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

diff --cc source/blender/alembic/intern/abc_mesh.cc
index 2ef20f4,0000000..64ca552
mode 100644,000000..100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@@ -1,1210 -1,0 +1,1210 @@@
 +/*
 + * ***** BEGIN GPL LICENSE BLOCK *****
 + *
 + * 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.
 + *
 + * Contributor(s): Esteban Tovagliari, Cedric Paille, Kevin Dietrich
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +#include "abc_mesh.h"
 +
 +#include <algorithm>
 +
 +#include "abc_transform.h"
 +#include "abc_util.h"
 +
 +extern "C" {
 +#include "DNA_material_types.h"
 +#include "DNA_mesh_types.h"
 +#include "DNA_modifier_types.h"
 +#include "DNA_object_fluidsim.h"
 +#include "DNA_object_types.h"
 +
 +#include "BLI_math_geom.h"
 +#include "BLI_string.h"
 +
 +#include "BKE_depsgraph.h"
 +#include "BKE_DerivedMesh.h"
 +#include "BKE_main.h"
 +#include "BKE_material.h"
 +#include "BKE_mesh.h"
 +#include "BKE_modifier.h"
 +#include "BKE_object.h"
 +
 +#include "WM_api.h"
 +#include "WM_types.h"
 +
 +#include "ED_mesh.h"
 +}
 +
 +using Alembic::Abc::FloatArraySample;
 +using Alembic::Abc::ICompoundProperty;
 +using Alembic::Abc::Int32ArraySample;
 +using Alembic::Abc::Int32ArraySamplePtr;
 +using Alembic::Abc::P3fArraySamplePtr;
 +using Alembic::Abc::V2fArraySample;
 +using Alembic::Abc::V3fArraySample;
 +using Alembic::Abc::C4fArraySample;
 +
 +using Alembic::AbcGeom::IFaceSet;
 +using Alembic::AbcGeom::IFaceSetSchema;
 +using Alembic::AbcGeom::IObject;
 +using Alembic::AbcGeom::IPolyMesh;
 +using Alembic::AbcGeom::IPolyMeshSchema;
 +using Alembic::AbcGeom::ISampleSelector;
 +using Alembic::AbcGeom::ISubD;
 +using Alembic::AbcGeom::ISubDSchema;
 +using Alembic::AbcGeom::IV2fGeomParam;
 +
 +using Alembic::AbcGeom::OArrayProperty;
 +using Alembic::AbcGeom::OBoolProperty;
 +using Alembic::AbcGeom::OC3fArrayProperty;
 +using Alembic::AbcGeom::OC3fGeomParam;
 +using Alembic::AbcGeom::OC4fGeomParam;
 +using Alembic::AbcGeom::OCompoundProperty;
 +using Alembic::AbcGeom::OFaceSet;
 +using Alembic::AbcGeom::OFaceSetSchema;
 +using Alembic::AbcGeom::OFloatGeomParam;
 +using Alembic::AbcGeom::OInt32GeomParam;
 +using Alembic::AbcGeom::ON3fArrayProperty;
 +using Alembic::AbcGeom::ON3fGeomParam;
 +using Alembic::AbcGeom::OPolyMesh;
 +using Alembic::AbcGeom::OPolyMeshSchema;
 +using Alembic::AbcGeom::OSubD;
 +using Alembic::AbcGeom::OSubDSchema;
 +using Alembic::AbcGeom::OV2fGeomParam;
 +using Alembic::AbcGeom::OV3fGeomParam;
 +
 +using Alembic::AbcGeom::kFacevaryingScope;
 +using Alembic::AbcGeom::kVaryingScope;
 +using Alembic::AbcGeom::kVertexScope;
 +using Alembic::AbcGeom::kWrapExisting;
 +using Alembic::AbcGeom::UInt32ArraySample;
 +using Alembic::AbcGeom::N3fArraySamplePtr;
 +using Alembic::AbcGeom::IN3fGeomParam;
 +
 +/* ************************************************************************** */
 +
 +/* NOTE: Alembic's polygon winding order is clockwise, to match with Renderman. */
 +
 +static void get_vertices(DerivedMesh *dm, std::vector<Imath::V3f> &points)
 +{
 +	points.clear();
 +	points.resize(dm->getNumVerts(dm));
 +
 +	MVert *verts = dm->getVertArray(dm);
 +
 +	for (int i = 0, e = dm->getNumVerts(dm); i < e; ++i) {
 +		copy_zup_yup(points[i].getValue(), verts[i].co);
 +	}
 +}
 +
 +static void get_topology(DerivedMesh *dm,
 +                         std::vector<int32_t> &poly_verts,
 +                         std::vector<int32_t> &loop_counts,
 +                         bool &smooth_normal)
 +{
 +	const int num_poly = dm->getNumPolys(dm);
 +	const int num_loops = dm->getNumLoops(dm);
 +	MLoop *mloop = dm->getLoopArray(dm);
 +	MPoly *mpoly = dm->getPolyArray(dm);
 +
 +	poly_verts.clear();
 +	loop_counts.clear();
 +	poly_verts.reserve(num_loops);
 +	loop_counts.reserve(num_poly);
 +
 +	/* NOTE: data needs to be written in the reverse order. */
 +	for (int i = 0; i < num_poly; ++i) {
 +		MPoly &poly = mpoly[i];
 +		loop_counts.push_back(poly.totloop);
 +
 +		smooth_normal |= ((poly.flag & ME_SMOOTH) != 0);
 +
 +		MLoop *loop = mloop + poly.loopstart + (poly.totloop - 1);
 +
 +		for (int j = 0; j < poly.totloop; ++j, --loop) {
 +			poly_verts.push_back(loop->v);
 +		}
 +	}
 +}
 +
 +static void get_material_indices(DerivedMesh *dm, std::vector<int32_t> &indices)
 +{
 +	indices.clear();
 +	indices.reserve(dm->getNumTessFaces(dm));
 +
 +	MPoly *mpolys = dm->getPolyArray(dm);
 +
 +	for (int i = 1, e = dm->getNumPolys(dm); i < e; ++i) {
 +		MPoly *mpoly = &mpolys[i];
 +		indices.push_back(mpoly->mat_nr);
 +	}
 +}
 +
 +static void get_creases(DerivedMesh *dm,
 +                        std::vector<int32_t> &indices,
 +                        std::vector<int32_t> &lengths,
 +                        std::vector<float> &sharpnesses)
 +{
 +	const float factor = 1.0f / 255.0f;
 +
 +	indices.clear();
 +	lengths.clear();
 +	sharpnesses.clear();
 +
 +	MEdge *edge = dm->getEdgeArray(dm);
 +
 +	for (int i = 0, e = dm->getNumEdges(dm); i < e; ++i) {
 +		const float sharpness = static_cast<float>(edge[i].crease) * factor;
 +
 +		if (sharpness != 0.0f) {
 +			indices.push_back(edge[i].v1);
 +			indices.push_back(edge[i].v2);
 +			sharpnesses.push_back(sharpness);
 +		}
 +	}
 +
 +	lengths.resize(sharpnesses.size(), 2);
 +}
 +
 +static void get_vertex_normals(DerivedMesh *dm, std::vector<Imath::V3f> &normals)
 +{
 +	normals.clear();
 +	normals.resize(dm->getNumVerts(dm) * 3);
 +
 +	MVert *verts = dm->getVertArray(dm);
 +	float no[3];
 +
 +	for (int i = 0, e = dm->getNumVerts(dm); i < e; ++i) {
 +		normal_short_to_float_v3(no, verts[i].no);
 +		copy_zup_yup(normals[i].getValue(), no);
 +	}
 +}
 +
 +static void get_loop_normals(DerivedMesh *dm, std::vector<Imath::V3f> &normals)
 +{
 +	MPoly *mpoly = dm->getPolyArray(dm);
 +	MPoly *mp = mpoly;
 +
 +	MLoop *mloop = dm->getLoopArray(dm);
 +	MLoop *ml = mloop;
 +
 +	MVert *verts = dm->getVertArray(dm);
 +
 +	const size_t num_normals = dm->getNumLoops(dm) * 3;
 +
 +	const float (*lnors)[3] = static_cast<float(*)[3]>(dm->getLoopDataArray(dm, CD_NORMAL));
 +
 +	normals.clear();
 +	normals.resize(num_normals);
 +
 +	unsigned loop_index = 0;
 +
 +	/* NOTE: data needs to be written in the reverse order. */
 +
 +	if (lnors) {
 +		for (int i = 0, e = dm->getNumPolys(dm); i < e; ++i, ++mp) {
 +			ml = mloop + mp->loopstart + (mp->totloop - 1);
 +
 +			for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) {
 +				const int index = ml->v;
 +				copy_zup_yup(normals[loop_index].getValue(), lnors[index]);
 +			}
 +		}
 +	}
 +	else {
 +		float no[3];
 +
 +		for (int i = 0, e = dm->getNumPolys(dm); i < e; ++i, ++mp) {
 +			ml = mloop + mp->loopstart + (mp->totloop - 1);
 +
 +			/* Flat shaded, use common normal for all verts. */
 +			if ((mp->flag & ME_SMOOTH) == 0) {
 +				BKE_mesh_calc_poly_normal(mp, ml - (mp->totloop - 1), verts, no);
 +
 +				for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) {
 +					copy_zup_yup(normals[loop_index].getValue(), no);
 +				}
 +			}
 +			else {
 +				/* Smooth shaded, use individual vert normals. */
 +				for (int j = 0; j < mp->totloop; --ml, ++j, ++loop_index) {
 +					normal_short_to_float_v3(no, verts[ml->v].no);
 +					copy_zup_yup(normals[loop_index].getValue(), no);
 +				}
 +			}
 +		}
 +	}
 +}
 +
 +/* *************** Modifiers *************** */
 +
 +/* check if the mesh is a subsurf, ignoring disabled modifiers and
 + * displace if it's after subsurf. */
 +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)) {
 +			continue;
 +		}
 +
 +		if (md->type == eModifierType_Subsurf) {
 +			SubsurfModifierData *smd = reinterpret_cast<SubsurfModifierData*>(md);
 +
 +			if (smd->subdivType == ME_CC_SUBSURF) {
 +				return md;
 +			}
 +		}
 +
 +		/* mesh is not a subsurf. break */
 +		if ((md->type != eModifierType_Displace) && (md->type != eModifierType_ParticleSystem)) {
 +			return NULL;
 +		}
 +	}
 +
 +	return NULL;
 +}
 +
 +static ModifierData *get_liquid_sim_modifier(Scene *scene, Object *ob)
 +{
 +	ModifierData *md = modifiers_findByType(ob, eModifierType_Fluidsim);
 +
 +	if (md && (modifier_isEnabled(scene, md, eModifierMode_Render))) {
 +		FluidsimModifierData *fsmd = reinterpret_cast<FluidsimModifierData *>(md);
 +
 +		if (fsmd->fss && fsmd->fss->type == OB_FLUIDSIM_DOMAIN) {
 +			return md;
 +		}
 +	}
 +
 +	return NULL;
 +}
 +
 +/* ************************************************************************** */
 +
 +AbcMeshWriter::AbcMeshWriter(Scene *scene,
 +                             Object *ob,
 +                             AbcTransformWriter *parent,
 +                             uint32_t time_sampling,
 +                             ExportSettings &settings)
 +    : AbcObjectWriter(scene, ob, time_sampling, settings, parent)
 +{
 +	m_is_animated = isAnimated();
 +	m_subsurf_mod = NULL;
 +	m_has_per_face_materials = false;
 +	m_is_subd = false;
 +
 +	/* If the object is static, use the default static time sampling. */
 +	if (!m_is_animated) {
 +		time_sampling = 0;
 +	}
 +
 +	if (!m_settings.apply_subdiv) {
 +		m_subsurf_mod = get_subsurf_modifier(m_scene, m_object);
 +		m_is_subd = (m_subsurf_mod != NULL);
 +	}
 +
 +	m_is_liquid = (get_liquid_sim_modifier(m_scene, m_object) != NULL);
 +
 +	while (parent->alembicXform().getChildHeader(m_name)) {
 +		m_name.append("_");
 +	}
 +
 +	if (m_settings.use_subdiv_schema && m_is_subd) {
 +		OSubD subd(parent->alembicXform(), m

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list