HOOPS/3dGS I.M. Interface

     << Back      Full Index      Forward >>


lod_qslim.h

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
Main Index
HOOPS/3dGS I.M. Interface

     << Back      Full Index      Forward >>