Reverting change to decimation to fix compatibility with
[blender.git] / intern / decimation / intern / LOD_decimation.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 // implementation of external c api
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
36
37 #include "../extern/LOD_decimation.h"
38 #include "LOD_DecimationClass.h"
39
40 using namespace std;
41
42         int 
43 LOD_LoadMesh(
44         LOD_Decimation_InfoPtr info
45 ) {
46         if (info == NULL) return 0;
47         if (
48                 info->vertex_buffer == NULL ||
49                 info->vertex_normal_buffer == NULL ||
50                 info->triangle_index_buffer == NULL
51         ) {
52                 return 0;
53         }
54
55
56         // create the intern object to hold all 
57         // the decimation classes
58
59         MEM_SmartPtr<LOD_DecimationClass> intern(LOD_DecimationClass::New(info));
60
61         if (intern == NULL) return 0;
62
63         MEM_SmartPtr<vector<LOD_Vertex> > intern_vertex_buffer(new vector<LOD_Vertex>(info->vertex_num));
64         if (intern_vertex_buffer == NULL) return 0;
65
66         vector<LOD_Vertex>::iterator intern_vertex_it(intern_vertex_buffer->begin());
67
68         // now load in the vertices to the mesh
69
70         const int vertex_stride = 3;
71
72         float * vertex_ptr = info->vertex_buffer;
73         const float * vertex_end = vertex_ptr + info->vertex_num*vertex_stride;
74         
75         LOD_ManMesh2 &mesh = intern->Mesh();
76
77         for (;vertex_ptr < vertex_end; vertex_ptr += vertex_stride,++intern_vertex_it) {
78                 intern_vertex_it->pos = MT_Vector3(vertex_ptr);
79         }
80         
81         mesh.SetVertices(intern_vertex_buffer);
82
83         // load in the triangles
84         
85         const int triangle_stride = 3;
86
87         int * triangle_ptr = info->triangle_index_buffer;
88         const int * triangle_end = triangle_ptr + info->face_num*triangle_stride;
89
90         try {
91
92                 for (;triangle_ptr < triangle_end; triangle_ptr += triangle_stride) {
93                         mesh.AddTriangle(triangle_ptr);
94                 }
95         }
96
97         catch (...) {
98                 return 0;
99         }
100
101         // ok we have built the mesh 
102
103         intern->m_e_decimation_state = LOD_DecimationClass::e_loaded;
104
105         info->intern = (void *) (intern.Release());     
106
107         return 1;
108 }
109
110         int 
111 LOD_PreprocessMesh(
112         LOD_Decimation_InfoPtr info
113 ) {
114         if (info == NULL) return 0;
115         if (info->intern == NULL) return 0;
116
117         LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
118         if (intern->m_e_decimation_state != LOD_DecimationClass::e_loaded) return 0;    
119
120         // arm the various internal classes so that we are ready to step
121         // through decimation
122
123         intern->FaceEditor().BuildNormals();
124         if (intern->Decimator().Arm() == false) return 0;
125
126         // ok preprocessing done 
127         intern->m_e_decimation_state = LOD_DecimationClass::e_preprocessed;
128
129         return 1;
130 }
131
132         int 
133 LOD_CollapseEdge(
134         LOD_Decimation_InfoPtr info
135 ){
136         if (info == NULL) return 0;
137         if (info->intern == NULL) return 0;
138         LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
139         if (intern->m_e_decimation_state != LOD_DecimationClass::e_preprocessed) return 0;      
140
141         bool step_result = intern->Decimator().Step();
142
143         return step_result == true ? 1 : 0;
144 }       
145
146         
147         int
148 LOD_FreeDecimationData(
149         LOD_Decimation_InfoPtr info
150 ){
151         if (info == NULL) return 0;
152         if (info->intern == NULL) return 0;
153         LOD_DecimationClass *intern = (LOD_DecimationClass *) info->intern;
154         delete(intern);
155         info->intern = NULL;
156         return 1;
157 }
158