ClangFormat: apply to source, most of intern
[blender.git] / source / blender / alembic / intern / abc_mball.cc
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup balembic
19  */
20
21 #include "abc_mball.h"
22 #include "abc_mesh.h"
23 #include "abc_transform.h"
24
25 extern "C" {
26 #include "DNA_meta_types.h"
27 #include "DNA_mesh_types.h"
28 #include "DNA_object_types.h"
29
30 #include "BKE_curve.h"
31 #include "BKE_displist.h"
32 #include "BKE_library.h"
33 #include "BKE_mball.h"
34 #include "BKE_mesh.h"
35 #include "BKE_object.h"
36
37 #include "DEG_depsgraph.h"
38 #include "MEM_guardedalloc.h"
39 }
40
41 AbcMBallWriter::AbcMBallWriter(Main *bmain,
42                                Object *ob,
43                                AbcTransformWriter *parent,
44                                uint32_t time_sampling,
45                                ExportSettings &settings)
46     : AbcGenericMeshWriter(ob, parent, time_sampling, settings), m_bmain(bmain)
47 {
48   m_is_animated = isAnimated();
49 }
50
51 AbcMBallWriter::~AbcMBallWriter()
52 {
53 }
54
55 bool AbcMBallWriter::isAnimated() const
56 {
57   return true;
58 }
59
60 Mesh *AbcMBallWriter::getEvaluatedMesh(Scene * /*scene_eval*/, Object *ob_eval, bool &r_needsfree)
61 {
62   if (ob_eval->runtime.mesh_eval != NULL) {
63     /* Mesh_eval only exists when generative modifiers are in use. */
64     r_needsfree = false;
65     return ob_eval->runtime.mesh_eval;
66   }
67   r_needsfree = true;
68
69   /* The approach below is copied from BKE_mesh_new_from_object() */
70   Mesh *tmpmesh = BKE_mesh_add(m_bmain, ((ID *)m_object->data)->name + 2);
71   BLI_assert(tmpmesh != NULL);
72
73   /* BKE_mesh_add gives us a user count we don't need */
74   id_us_min(&tmpmesh->id);
75
76   ListBase disp = {NULL, NULL};
77   /* TODO(sergey): This is gonna to work for until Depsgraph
78    *               only contains for_render flag. As soon as CoW is
79    *               implemented, this is to be rethinked.
80    */
81   BKE_displist_make_mball_forRender(m_settings.depsgraph, m_settings.scene, m_object, &disp);
82   BKE_mesh_from_metaball(&disp, tmpmesh);
83   BKE_displist_free(&disp);
84
85   BKE_mesh_texspace_copy_from_object(tmpmesh, m_object);
86
87   return tmpmesh;
88 }
89
90 void AbcMBallWriter::freeEvaluatedMesh(struct Mesh *mesh)
91 {
92   BKE_id_free(m_bmain, mesh);
93 }
94
95 bool AbcMBallWriter::isBasisBall(Scene *scene, Object *ob)
96 {
97   Object *basis_ob = BKE_mball_basis_find(scene, ob);
98   return ob == basis_ob;
99 }