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 |
|
---|
20 | class MxQSlim : public MxStdSlim
|
---|
21 | {
|
---|
22 | protected:
|
---|
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 |
|
---|
30 | public:
|
---|
31 |
|
---|
32 | Mat4 *object_transform;
|
---|
33 |
|
---|
34 | public:
|
---|
35 | MxQSlim(MxStdModel&);
|
---|
36 | virtual ~MxQSlim() { }
|
---|
37 |
|
---|
38 | virtual void initialize();
|
---|
39 |
|
---|
40 | const MxQuadric3& vertex_quadric(MxVertexID v) { return quadrics(v); }
|
---|
41 | };
|
---|
42 |
|
---|
43 | class MxQSlimEdge : public MxEdge, public MxHeapable
|
---|
44 | {
|
---|
45 | public:
|
---|
46 | float vnew[3];
|
---|
47 | };
|
---|
48 |
|
---|
49 | class MxEdgeQSlim : public MxQSlim
|
---|
50 | {
|
---|
51 | private:
|
---|
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 |
|
---|
61 | protected:
|
---|
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 |
|
---|
79 | public:
|
---|
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 |
|
---|
93 | public:
|
---|
94 | void (*contraction_callback)(const MxPairContraction&, float);
|
---|
95 | };
|
---|
96 |
|
---|
97 | class MxFaceQSlim : public MxQSlim
|
---|
98 | {
|
---|
99 | private:
|
---|
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 |
|
---|
109 | protected:
|
---|
110 | void compute_face_info(MxFaceID);
|
---|
111 |
|
---|
112 |
|
---|
113 | public:
|
---|
114 | MxFaceQSlim(MxStdModel&);
|
---|
115 |
|
---|
116 | void initialize();
|
---|
117 | bool decimate(uint target);
|
---|
118 | };
|
---|
119 |
|
---|
120 | // MXQSLIM_INCLUDED
|
---|
121 | #endif
|
---|