source: GTP/trunk/Lib/Vis/Preprocessing/src/mixkit/MxQSlim.h @ 1097

Revision 1097, 3.0 KB checked in by mattausch, 18 years ago (diff)
Line 
1#ifndef MXQSLIM_INCLUDED // -*- C++ -*-
2#define MXQSLIM_INCLUDED
3#if !defined(__GNUC__)
4#  pragma once
5#endif
6
7/************************************************************************
8
9  Surface simplification using quadric error metrics
10
11  Copyright (C) 1998 Michael Garland.  See "COPYING.txt" for details.
12 
13  $Id: MxQSlim.h,v 1.1 2002/09/24 16:53:54 wimmer Exp $
14
15 ************************************************************************/
16
17#include "MxStdSlim.h"
18#include "MxQMetric3.h"
19
20class MxQSlim : public MxStdSlim
21{
22protected:
23    MxBlock<MxQuadric3> quadrics;
24
25    void discontinuity_constraint(MxVertexID, MxVertexID, const MxFaceList&);
26    void collect_quadrics();
27    void transform_quadrics(const Mat4&);
28    void constrain_boundaries();
29
30public:
31
32    Mat4 *object_transform;
33
34public:
35    MxQSlim(MxStdModel&);
36    virtual ~MxQSlim() { }
37
38    virtual void initialize();
39
40    const MxQuadric3& vertex_quadric(MxVertexID v) { return quadrics(v); }
41};
42
43class MxQSlimEdge : public MxEdge, public MxHeapable
44{
45public:
46    float vnew[3];
47};
48
49class MxEdgeQSlim : public MxQSlim
50{
51private:
52    typedef MxSizedDynBlock<MxQSlimEdge*, 6> edge_list;
53
54    MxBlock<edge_list> edge_links;
55
56    //
57    // Temporary variables used by methods
58    MxVertexList star, star2;
59    MxPairContraction conx_tmp;
60
61protected:
62    double check_local_compactness(uint v1, uint v2, const float *vnew);
63    double check_local_inversion(uint v1, uint v2, const float *vnew);
64    uint check_local_validity(uint v1, uint v2, const float *vnew);
65    uint check_local_degree(uint v1, uint v2, const float *vnew);
66    void apply_mesh_penalties(MxQSlimEdge *);
67    void create_edge(MxVertexID i, MxVertexID j);
68    void collect_edges();
69
70    void compute_target_placement(MxQSlimEdge *);
71    void finalize_edge_update(MxQSlimEdge *);
72
73    virtual void compute_edge_info(MxQSlimEdge *);
74    virtual void update_pre_contract(const MxPairContraction&);
75    virtual void update_post_contract(const MxPairContraction&);
76    virtual void update_pre_expand(const MxPairContraction&);
77    virtual void update_post_expand(const MxPairContraction&);
78
79public:
80    MxEdgeQSlim(MxStdModel&);
81    virtual ~MxEdgeQSlim();
82
83    void initialize();
84    void initialize(const MxEdge *edges, uint count);
85    bool decimate(uint target);
86
87    void apply_contraction(const MxPairContraction& conx);
88    void apply_expansion(const MxPairContraction& conx);
89
90    uint edge_count() const { return heap.size(); }
91    const MxQSlimEdge *edge(uint i) const {return (MxQSlimEdge *)heap.item(i);}
92
93public:
94    void (*contraction_callback)(const MxPairContraction&, float);
95};
96
97class MxFaceQSlim : public MxQSlim
98{
99private:
100    class tri_info : public MxHeapable
101    {
102    public:
103        MxFaceID f;
104        float vnew[3];
105    };
106
107    MxBlock<tri_info> f_info;
108
109protected:
110    void compute_face_info(MxFaceID);
111
112
113public:
114    MxFaceQSlim(MxStdModel&);
115
116    void initialize();
117    bool decimate(uint target);
118};
119
120// MXQSLIM_INCLUDED
121#endif
Note: See TracBrowser for help on using the repository browser.