00001 #ifndef MXQSLIM_INCLUDED 00002 #define MXQSLIM_INCLUDED 00003 00004 00005 /************************************************************************ 00006 00007 Surface simplification using quadric error metrics 00008 00009 Copyright (C) 1998 Michael Garland. See "COPYING.txt" for details. 00010 00011 $Id: lod__qslim_8h-source.html,v 1.4 2008-02-21 21:41:00 stage Exp $ 00012 00013 ************************************************************************/ 00014 00015 #include "mxmodel.h" 00016 #include "mxmetric.h" 00017 #include "mxtype.h" 00018 #include "mxmain.h" /* for definition of MxConfig */ 00019 00020 00021 00022 typedef struct MxQSlimEdge_TAG 00023 { 00024 MxHeapable h; 00025 MxEdge e; 00026 double vnew[3]; 00027 00028 } MxQSlimEdge; 00029 00030 extern void mxqslimedge_init( MxQSlimEdge *qse ); 00031 00032 00033 typedef Block MxEdgeList; /* holds type MxQSlimEdge* */ 00034 00035 /* inline MxQSlimEdge *el_get_edge( MxEdgeList *el, int i ) { return (MxQSlimEdge *) getpb( el, i ); } */ 00036 /* inline int el_add_edge( MxEdgeList *el, MxQSlimEdge *q ) { return addpb( el, q ); } */ 00037 #define el_get_edge(el,i) ( (MxQSlimEdge *) getpb( el, i ) ) 00038 #define el_add_edge(el,q) ( addpb( el, q ) ) 00039 00040 extern MxBool find_edge( MxEdgeList *el, const MxQSlimEdge *t, int *index ); 00041 00042 00043 00044 00045 00046 typedef struct MxQSlim_TAG 00047 { 00048 MxEdgeList edge_array; 00049 Block edge_links; /* stores type MxEdgeList, links to elements of edge_array */ 00050 MxModel *m; 00051 Block quadrics; /* stores type MxQuadric3 */ 00052 MxHeap heap; 00053 00054 int valid_verts; 00055 int valid_faces; 00056 00057 /* to be copied from MxConfig at initialization */ 00058 int placement_policy; 00059 int weighting_policy; 00060 double boundary_weight; 00061 double compactness_ratio; 00062 double meshing_penalty; 00063 MxBool will_join_only; 00064 int max_degree; 00065 00066 double local_validity_threshold; 00067 Mat4 *object_transform; 00068 00069 void (*contraction_callback)(const MxPairContraction *, double); 00070 00071 } MxQSlim; 00072 00073 extern void mxqslim_init( MxQSlim *, MxModel *, MxConfig * ); 00074 extern void mxqslim_cleanup( MxQSlim * ); 00075 00076 extern MxBool qs_decimate( MxQSlim *, int ); 00077 extern void qs_apply_contraction( MxQSlim *, MxPairContraction * ); 00078 00079 extern void discontinuity_constraint( MxQSlim *, MxVertexID, MxVertexID, MxFaceList *); 00080 extern void collect_quadrics( MxQSlim * ); 00081 extern void transform_quadrics( MxQSlim *, const Mat4 *); 00082 extern void constrain_boundaries( MxQSlim * ); 00083 00084 extern double check_local_compactness( MxQSlim *, int v1, int v2, const double *vnew ); 00085 extern double check_local_inversion( MxQSlim *, int v1, const double *vnew ); 00086 extern int check_local_validity( MxQSlim *, int v1, int v2, const double *vnew ); 00087 extern void apply_penalties( MxQSlim *, MxQSlimEdge * ); 00088 extern void create_edge( MxQSlim *, MxVertexID i, MxVertexID j ); 00089 extern void collect_edges( MxQSlim * ); 00090 00091 extern void compute_target_placement( MxQSlim *, MxQSlimEdge * ); 00092 00093 extern void compute_edge_info( MxQSlim *, MxQSlimEdge * ); 00094 extern void update_pre_contract( MxQSlim *, const MxPairContraction * ); 00095 extern void update_post_expand( MxQSlim *, const MxPairContraction * ); 00096 00097 00098 /* inline MxQuadric3 *qs_get_quadrics( MxQSlim *q, int i ) { return (MxQuadric3 *) getpb ( &(q->quadrics), i ); } */ 00099 /* inline MxEdgeList *qs_get_edge_links( MxQSlim *q, int i ) { return (MxEdgeList *) getpb ( &(q->edge_links), i ); } */ 00100 /* inline int edge_count( MxQSlim *q ) { return sizeh( &(q->heap) ); } */ 00101 #define qs_get_quadrics(q,i) ( (MxQuadric3 *) getpb ( &((q)->quadrics), (i) ) ) 00102 #define qs_get_edge_links(q,i) ( (MxEdgeList *) getpb ( &((q)->edge_links), (i) ) ) 00103 #define edge_count(q) ( sizeh( &((q)->heap) ) ) 00104 00105 00106 00107 /* MXQSLIM_INCLUDED*/ 00108 #endif