#include "../config.h"
#ifdef HAVE_MIXKIT
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

#include <mixkit/stdmix.h>
#include <mixkit/mixio.h>
#include <mixkit/MxTimer.h>
#include <mixkit/MxSMF.h>
#include <mixkit/MxQSlim.h>
#include "decimate.h"



void	DecimateTriStrip(
	const float	*vr,
	const float	*vc,
	const float	*vl,
	const float	*nx,
	const float	*ny,
	const float	*nz,
	int		numverts,
	const int	*vpts,
	int		numindexes,
	float		*deci_vr,
	float		*deci_vc,
	float		*deci_vl,
	float		*deci_nx,
	float		*deci_ny,
	float		*deci_nz,
	int		deci_max_tris,
	int		*deci_numverts
) {
	MxStdModel      *m;
	double          init_time, slim_time;
	int             i, j, vi;

	m = new MxStdModel(16, 32);
	m->normal_binding(MX_PERVERTEX);

	for (i=0; i<numverts; i++) {
		m->add_vertex(vr[i], vc[i], vl[i]);
		m->add_normal(nx[i], ny[i], nz[i]);
	}

	for (i=0; i<numindexes-2; i++) {
		m->add_face(vpts[i], vpts[i+1], vpts[i+2]);
	}

	MxEdgeQSlim slim(*m);

	MXTIME(init_time, slim.initialize());
	MXTIME(slim_time, slim.decimate(deci_max_tris));

	// First, mark stray vertices for removal
	//
	for(i=0; i<m->vert_count(); i++) {
		if(m->vertex_is_valid(i) &&
			m->neighbors(i).length() == 0) {

		m->vertex_mark_invalid(i);
		}
	}

	// Compact vertex array so only valid vertices remain
	m->compact_vertices();

#ifdef DEBUG
	cerr << "+ Running time" << endl;
	cerr << "    PSlim init  : " << init_time << " sec" << endl;
	cerr << "    PSlim run   : " << slim_time << " sec" << endl;
	cerr << endl;
	cerr << "    PSlim Total : " << init_time+slim_time << endl;
	cerr << "    Total       : " << init_time+slim_time<<endl;
	cerr << endl;

	cerr << "    Original geometry : " << numindexes-2  << " tris, "
		<< numverts * 3 << " verts" << endl;

	cerr << "    Slimmed geometry : " << slim.valid_faces << " tris, "
		<< slim.valid_verts << " verts" << endl;
	cerr << "    Slimmed geometry : " << slim.valid_faces << " tris, "
		<< m->vert_count() << " verts" << endl;
#endif

	for(i=0, vi=0; i<m->face_count(); i++) {

                if( m->face_is_valid(i) ) {
			MxFace		f;
			MxVertex	v;
			MxNormal	n;

                        f = m->face(i);

			for(j=0; j<3; j++) {
				v = m->vertex(f[j]);
				n = m->normal(f[j]);

				deci_vr[vi] = v[0];
				deci_vc[vi] = v[1];
				deci_vl[vi] = v[2];

				deci_nx[vi] = n[0];
				deci_ny[vi] = n[1];
				deci_nz[vi] = n[2];
				vi++;
			}
		}
	}
	*deci_numverts = vi;

	delete m;
}
#endif


syntax highlighted by Code2HTML, v. 0.9.1