Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2012-05-07 22:09:59 +0400
committerGaia Clary <gaia.clary@machinimatrix.org>2012-05-07 22:09:59 +0400
commit98ba7dfecf454d8536ef63d8a5bd31c2e687a62e (patch)
tree5593f5f1f663ffd0c91a8c734ebda5d653491c41 /source/blender/collada
parent353ef9541a37faa009e62a2969fc96d160260c6b (diff)
Collada: patch #31331: Implementation of 'Apply Modifiers'
Diffstat (limited to 'source/blender/collada')
-rw-r--r--source/blender/collada/ExportSettings.h1
-rw-r--r--source/blender/collada/GeometryExporter.cpp46
-rw-r--r--source/blender/collada/GeometryExporter.h3
-rw-r--r--source/blender/collada/collada.cpp9
-rw-r--r--source/blender/collada/collada.h2
5 files changed, 49 insertions, 12 deletions
diff --git a/source/blender/collada/ExportSettings.h b/source/blender/collada/ExportSettings.h
index 80e20acbe48..41fa7e1ed38 100644
--- a/source/blender/collada/ExportSettings.h
+++ b/source/blender/collada/ExportSettings.h
@@ -31,6 +31,7 @@ struct ExportSettings
{
public:
bool selected;
+ bool apply_modifiers;
bool second_life;
char *filepath;
};
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index 8e4fa057daf..8c7bff285eb 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -36,10 +36,18 @@
#include "GeometryExporter.h"
#include "DNA_meshdata_types.h"
+
+extern "C" {
+ #include "BKE_DerivedMesh.h"
+ #include "BKE_main.h"
+ #include "BKE_global.h"
+ #include "BKE_library.h"
+}
+
+
#include "BKE_customdata.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
-
#include "collada_internal.h"
// TODO: optimize UV sets by making indexed list with duplicates removed
@@ -57,6 +65,25 @@ void GeometryExporter::exportGeom(Scene *sce)
closeLibrary();
}
+Mesh * GeometryExporter::get_mesh(Object *ob, int apply_modifiers)
+{
+ Mesh *tmpmesh;
+ if (!apply_modifiers)
+ {
+ tmpmesh = (Mesh*)ob->data;
+ }
+ else
+ {
+ CustomDataMask mask = CD_MASK_MESH;
+ DerivedMesh *dm = mesh_create_derived_view(mScene, ob, mask);
+ tmpmesh = BKE_mesh_add("ColladaMesh"); // name is not important here
+ DM_to_mesh(dm, tmpmesh, ob);
+ dm->release(dm);
+ BKE_mesh_tessface_ensure(tmpmesh);
+ }
+ return tmpmesh;
+}
+
void GeometryExporter::operator()(Object *ob)
{
// XXX don't use DerivedMesh, Mesh instead?
@@ -64,8 +91,8 @@ void GeometryExporter::operator()(Object *ob)
#if 0
DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
#endif
- Mesh *me = (Mesh*)ob->data;
- BKE_mesh_tessface_ensure(me);
+
+ Mesh *me = get_mesh(ob, this->export_settings->apply_modifiers);
std::string geom_id = get_geometry_id(ob);
std::string geom_name = id_name(ob->data);
@@ -110,11 +137,11 @@ void GeometryExporter::operator()(Object *ob)
// XXX slow
if (ob->totcol) {
for (int a = 0; a < ob->totcol; a++) {
- createPolylist(a, has_uvs, has_color, ob, geom_id, norind);
+ createPolylist(a, has_uvs, has_color, ob, me, geom_id, norind);
}
}
else {
- createPolylist(0, has_uvs, has_color, ob, geom_id, norind);
+ createPolylist(0, has_uvs, has_color, ob, me, geom_id, norind);
}
closeMesh();
@@ -124,7 +151,12 @@ void GeometryExporter::operator()(Object *ob)
}
closeGeometry();
-
+
+ if (this->export_settings->apply_modifiers)
+ {
+ BKE_libblock_free_us(&(G.main->mesh), me);
+ }
+
#if 0
dm->release(dm);
#endif
@@ -135,10 +167,10 @@ void GeometryExporter::createPolylist(short material_index,
bool has_uvs,
bool has_color,
Object *ob,
+ Mesh *me,
std::string& geom_id,
std::vector<Face>& norind)
{
- Mesh *me = (Mesh*)ob->data;
MFace *mfaces = me->mface;
int totfaces = me->totface;
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index 5d79fabb713..55dc179e5e2 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -69,6 +69,7 @@ public:
bool has_uvs,
bool has_color,
Object *ob,
+ Mesh *me,
std::string& geom_id,
std::vector<Face>& norind);
@@ -98,6 +99,8 @@ private:
std::set<std::string> exportedGeometry;
const ExportSettings *export_settings;
+
+ Mesh * get_mesh(Object *ob, int apply_modifiers);
};
struct GeometryFunctor {
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index 70bf0556b5b..ae024ec52a7 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -49,13 +49,14 @@ extern "C"
return 0;
}
- int collada_export(Scene *sce, const char *filepath, int selected, int second_life)
+ int collada_export(Scene *sce, const char *filepath, int selected, int apply_modifiers, int second_life)
{
ExportSettings export_settings;
- export_settings.selected = selected != 0;
- export_settings.second_life = second_life != 0;
- export_settings.filepath = (char *)filepath;
+ export_settings.selected = selected != 0;
+ export_settings.apply_modifiers = apply_modifiers != 0;
+ export_settings.second_life = second_life != 0;
+ export_settings.filepath = (char *)filepath;
/* annoying, collada crashes if file cant be created! [#27162] */
if (!BLI_exists(filepath)) {
diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h
index f8afc797447..f335796f799 100644
--- a/source/blender/collada/collada.h
+++ b/source/blender/collada/collada.h
@@ -37,7 +37,7 @@ extern "C" {
* both return 1 on success, 0 on error
*/
int collada_import(bContext *C, const char *filepath);
- int collada_export(Scene *sce, const char *filepath, int selected, int second_life);
+ int collada_export(Scene *sce, const char *filepath, int selected, int apply_modifiers, int second_life);
#ifdef __cplusplus
}
#endif