00001 /*
00002 File: MRModel.h
00003
00004 Function: Implements edge-contraction multires polygonal model
00005
00006 Author: Andrew Willmott
00007
00008 Copyright: (c) 1997-2000, Andrew Willmott
00009 */
00010
00011 #ifndef __MRModel__
00012 #define __MRModel__
00013
00014 #include "gcl/MRVertex.h"
00015 #include "gcl/MRFaceCluster.h"
00016 #include "gcl/Renderer.h"
00017
00018 typedef Array<Byte> ActList;
00019
00020 enum MRM_Flags
00021 {
00022 MRM_MemMapped = 0x0001,
00023 MRM_Ordered = 0x0002,
00024 MRM_End
00025 };
00026
00027 class MRModel
00033 {
00034 public:
00035 MRModel();
00036 ~MRModel();
00037
00038 // Adaption routines
00039 Void SimplestModel();
00041 Void MostComplexModel();
00043
00044 Void AdaptFaces(Int targetFaces);
00046 Void AdaptClusters(Int targetClusters);
00048 Void AdaptComplexity(GCLReal complexity);
00051
00052 Void AdaptLength(
00053 GCLReal threshold,
00054 const Transform &M,
00055 const Transform &P,
00056 Float timeLimit = vl_inf
00057 );
00059
00060 // Parsing
00061 Bool Parse(StrConst filename);
00062 Bool ParseBinary();
00063 Bool ParseText();
00064 Void WriteBinary();
00065
00066 // Drawing
00067 Void Draw(Renderer &r);
00068
00069 // Internal utility routines
00070 Void PrepareModel();
00071 Void AdjustLeafFaces();
00072
00073 Void PrepareClusters();
00074 Void PrepareVertices();
00075
00076 Void DrawClusterFaces(Int i, Renderer &r);
00077 Void DrawClusters(Renderer &r);
00078 Void DrawVertices(Renderer &r);
00079
00080 Vector FaceAreaNormal(Int faceIdx);
00081 Int ReorderLeafClusters(Int ic, FaceIdxArray &newFaces);
00082 Void CropClusters(Int numClusters);
00083 Void CreateClusterColours();
00084 Void DumpFCH(StrConst filename);
00085 Void UpdateBounds(Point &min, Point &max,
00086 const Transform &t);
00087
00088 Void AddContraction(
00089 Int child0,
00090 Int child1,
00091 Int face1,
00092 Int face2,
00093 GCLReal error,
00094 const Point &p,
00095 Int delta
00096 );
00097
00098 Void AddCluster(
00099 Int child0,
00100 Int child1,
00101 Point ¢re,
00102 VecTrans &axis,
00103 Vector &fitNormal,
00104 GCLReal d,
00105 Point &clusMin,
00106 Point &clusMax,
00107 Int clusID
00108 );
00109
00110 // basic model
00111 PointList *points;
00112 ColourList *colours;
00113 Colour colour;
00114 FaceIdxArray faces;
00115
00116 // vertex-contraction stuff
00117 Int currentFaces;
00118 IndexList rootVertices;
00119 MRVertexes vertices;
00120 MRCodesList vtxCodes;
00121 MRFlagsList vtxFlags;
00122 FaceIdxArray vtxFaces;
00123 Bool verticesPrepped;
00124
00125 // face cluster stuff
00126 Int currentClusters;
00127 Bool clustersPrepped;
00128 IndexList rootClusters;
00129 FaceClusList clusters;
00130 ActList clustersActive;
00131 ColourList clusterColours;
00132 NormalList faceNormals;
00133 Int firstClusterID;
00134 Int lastClusterID;
00135
00136 Bool IsFace(Int i)
00138 { return(i < faces.NumItems()); };
00139 FaceCluster &Cluster(Int i)
00141 { return(clusters[firstClusterID - i]); };
00142
00143 Bool showMeta;
00144 Bool showFaces;
00145 Bool colourFaces;
00146
00147 FileName modelFile;
00148
00149 Flags32 flags;
00150 GCLReal lastComplexity;
00151 static Bool sAvgClusColours;
00152 };
00153
00154
00155 // --- Integration into GCL scenes ---------------------------------------------
00156
00157 #include "gcl/SceneObjects.h"
00158
00159 class scMRModel : public scPrimitive
00161 {
00162 public:
00163
00164 scMRModel();
00165
00166 Void Draw(Renderer &r, SLContext *context);
00167 StrConst Label() const
00168 { return "MR Model"; };
00169
00170 Object *Clone() const
00171 { return new scMRModel(*this); };
00172
00173 Void DecimateSelf(Decimator &dec);
00174 Void UpdateBounds(Point &min, Point &max,
00175 const Transform &t);
00176
00177 MRModel model;
00178
00179 static Void SetComplexity(GCLReal comp);
00180 static GCLReal GetComplexity();
00181
00182 protected:
00183 static GCLReal complexity;
00184 GCLReal currentComplexity;
00185 };
00186
00187 class MRModelsFinder : public scSceneAction
00189 {
00190 public:
00191 Void Start();
00192 Void Primitive(scPrimitive *sp);
00193
00194 PtrArray<MRModel> models;
00195
00196 Int NumModels() const
00197 { return(models.NumItems()); }
00198 MRModel *Model(Int i) const
00199 { return(models[i]); }
00200 };
00201
00202 // MRB stuff
00203
00204 enum MRB_Flags
00205 {
00206 MRB_HasVH = 0x0001,
00207 MRB_HasFH = 0x0002,
00208 MRB_Float = 0x0004,
00209 MRB_Ordered = 0x0008,
00210 MRB_End
00211 };
00212
00213 struct MRB_Header
00214 {
00215 Int version;
00216 Flags32 flags;
00217 };
00218
00219 #endif