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:
Diffstat (limited to 'intern/decimation/intern/LOD_decimation.cpp')
-rw-r--r--intern/decimation/intern/LOD_decimation.cpp156
1 files changed, 156 insertions, 0 deletions
diff --git a/intern/decimation/intern/LOD_decimation.cpp b/intern/decimation/intern/LOD_decimation.cpp
new file mode 100644
index 00000000000..7bbc0945424
--- /dev/null
+++ b/intern/decimation/intern/LOD_decimation.cpp
@@ -0,0 +1,156 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+// implementation of external c api
+
+
+#include "../extern/LOD_decimation.h"
+#include "LOD_DecimationClass.h"
+
+using namespace std;
+
+ int
+LOD_LoadMesh(
+ LOD_Decimation_InfoPtr info
+) {
+ if (info == NULL) return 0;
+ if (
+ info->vertex_buffer == NULL ||
+ info->vertex_normal_buffer == NULL ||
+ info->triangle_index_buffer == NULL
+ ) {
+ return 0;
+ }
+
+
+ // create the intern object to hold all
+ // the decimation classes
+
+ MEM_SmartPtr<LOD_DecimationClass> intern(LOD_DecimationClass::New(info));
+
+ if (intern == NULL) return 0;
+
+ MEM_SmartPtr<vector<LOD_Vertex> > intern_vertex_buffer(new vector<LOD_Vertex>(info->vertex_num));
+ if (intern_vertex_buffer == NULL) return 0;
+
+ vector<LOD_Vertex>::iterator intern_vertex_it(intern_vertex_buffer->begin());
+
+ // now load in the vertices to the mesh
+
+ const int vertex_stride = 3;
+
+ float * vertex_ptr = info->vertex_buffer;
+ const float * vertex_end = vertex_ptr + info->vertex_num*vertex_stride;
+
+ LOD_ManMesh2 &mesh = intern->Mesh();
+
+ for (;vertex_ptr < vertex_end; vertex_ptr += vertex_stride,++intern_vertex_it) {
+ intern_vertex_it->pos = MT_Vector3(vertex_ptr);
+ }
+
+ mesh.SetVertices(intern_vertex_buffer);
+
+ // load in the triangles
+
+ const int triangle_stride = 3;
+
+ int * triangle_ptr = info->triangle_index_buffer;
+ const int * triangle_end = triangle_ptr + info->face_num*triangle_stride;
+
+ try {
+
+ for (;triangle_ptr < triangle_end; triangle_ptr += triangle_stride) {
+ mesh.AddTriangle(triangle_ptr);
+ }
+ }
+
+ catch (...) {
+ return 0;
+ }
+
+ // ok we have built the mesh
+
+ intern->m_e_decimation_state = LOD_DecimationClass::e_loaded;
+
+ info->intern = (void *) (intern.Release());
+
+ return 1;
+}
+
+ int
+LOD_PreprocessMesh(
+ LOD_Decimation_InfoPtr info
+) {
+ if (info == NULL) return 0;
+ if (info->intern == NULL) return 0;
+
+ LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
+ if (intern->m_e_decimation_state != LOD_DecimationClass::e_loaded) return 0;
+
+ // arm the various internal classes so that we are ready to step
+ // through decimation
+
+ intern->FaceEditor().BuildNormals();
+ if (intern->Decimator().Arm() == false) return 0;
+
+ // ok preprocessing done
+ intern->m_e_decimation_state = LOD_DecimationClass::e_preprocessed;
+
+ return 1;
+}
+
+ int
+LOD_CollapseEdge(
+ LOD_Decimation_InfoPtr info
+){
+ if (info == NULL) return 0;
+ if (info->intern == NULL) return 0;
+ LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
+ if (intern->m_e_decimation_state != LOD_DecimationClass::e_preprocessed) return 0;
+
+ bool step_result = intern->Decimator().Step();
+
+ return step_result == true ? 1 : 0;
+}
+
+
+ int
+LOD_FreeDecimationData(
+ LOD_Decimation_InfoPtr info
+){
+ if (info == NULL) return 0;
+ if (info->intern == NULL) return 0;
+ LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
+ delete(intern);
+ info->intern = NULL;
+ return 1;
+}
+