| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | #ifndef _txpage_write_h_ |
|---|
| 17 | |
|---|
| 18 | #define _txpage_write_h_ |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | #include <trpage_sys.h> |
|---|
| 25 | #include <trpage_io.h> |
|---|
| 26 | #include <trpage_swap.h> |
|---|
| 27 | #include <trpage_read.h> |
|---|
| 28 | |
|---|
| 29 | |
|---|
| 30 | |
|---|
| 31 | |
|---|
| 32 | |
|---|
| 33 | TX_EXDECL class TX_CLDECL trpgwGeomStats { |
|---|
| 34 | public: |
|---|
| 35 | trpgwGeomStats(void); |
|---|
| 36 | ~trpgwGeomStats(void); |
|---|
| 37 | |
|---|
| 38 | int totalTri; |
|---|
| 39 | |
|---|
| 40 | int totalQuad; |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | int totalStripTri; |
|---|
| 44 | int totalFanTri; |
|---|
| 45 | int totalBagTri; |
|---|
| 46 | |
|---|
| 47 | int numStrip; |
|---|
| 48 | int numFan; |
|---|
| 49 | |
|---|
| 50 | int stripStat[15]; |
|---|
| 51 | int fanStat[15]; |
|---|
| 52 | |
|---|
| 53 | int stripGeom; |
|---|
| 54 | int fanGeom; |
|---|
| 55 | int bagGeom; |
|---|
| 56 | |
|---|
| 57 | int stateChanges; |
|---|
| 58 | |
|---|
| 59 | |
|---|
| 60 | inline void AddStripStat(int val) { stripStat[MIN(14,val)]++; totalStripTri += val; totalTri += val; numStrip++;} |
|---|
| 61 | inline void AddFanStat(int val) { fanStat[MIN(14,val)]++; totalFanTri += val; totalTri += val; numFan++;} |
|---|
| 62 | inline void AddBagStat(int val) { totalBagTri += val; totalTri += val;} |
|---|
| 63 | inline void AddQuadStat(int val) { totalQuad += val; } |
|---|
| 64 | }; |
|---|
| 65 | |
|---|
| 66 | |
|---|
| 67 | |
|---|
| 68 | |
|---|
| 69 | |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | |
|---|
| 73 | |
|---|
| 74 | |
|---|
| 75 | TX_EXDECL class TX_CLDECL trpgwGeomHelper { |
|---|
| 76 | public: |
|---|
| 77 | trpgwGeomHelper(void); |
|---|
| 78 | virtual ~trpgwGeomHelper(void); |
|---|
| 79 | enum {UseDouble,UseFloat}; |
|---|
| 80 | trpgwGeomHelper(trpgWriteBuffer *,int dataType=UseDouble); |
|---|
| 81 | void init(trpgWriteBuffer *,int dataType=UseDouble); |
|---|
| 82 | virtual void SetMode(int); |
|---|
| 83 | virtual void Reset(void); |
|---|
| 84 | |
|---|
| 85 | virtual void StartPolygon(void); |
|---|
| 86 | virtual void EndPolygon(void); |
|---|
| 87 | virtual void ResetPolygon(void); |
|---|
| 88 | |
|---|
| 89 | |
|---|
| 90 | virtual void SetColor(trpgColor &); |
|---|
| 91 | virtual void SetTexCoord(trpg2dPoint &); |
|---|
| 92 | virtual void AddTexCoord(trpg2dPoint &); |
|---|
| 93 | virtual void SetNormal(trpg3dPoint &); |
|---|
| 94 | virtual void SetMaterial(int32); |
|---|
| 95 | virtual void AddMaterial(int32); |
|---|
| 96 | |
|---|
| 97 | virtual void AddVertex(trpg3dPoint &); |
|---|
| 98 | |
|---|
| 99 | |
|---|
| 100 | virtual void FlushGeom(void); |
|---|
| 101 | |
|---|
| 102 | |
|---|
| 103 | virtual void GetZMinMax(double &min,double &max); |
|---|
| 104 | |
|---|
| 105 | |
|---|
| 106 | trpgwGeomStats *GetStats(void) { return &stats; } |
|---|
| 107 | protected: |
|---|
| 108 | int mode; |
|---|
| 109 | int dataType; |
|---|
| 110 | trpgWriteBuffer *buf; |
|---|
| 111 | |
|---|
| 112 | |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | |
|---|
| 121 | |
|---|
| 122 | virtual void Optimize(void); |
|---|
| 123 | |
|---|
| 124 | |
|---|
| 125 | virtual void ResetTri(void); |
|---|
| 126 | |
|---|
| 127 | |
|---|
| 128 | trpgGeometry strips,fans,bags; |
|---|
| 129 | |
|---|
| 130 | |
|---|
| 131 | std::vector<int32> matTri; |
|---|
| 132 | std::vector<trpg2dPoint> tex; |
|---|
| 133 | std::vector<trpg3dPoint> norm,vert; |
|---|
| 134 | |
|---|
| 135 | std::vector<int32> matPoly; |
|---|
| 136 | std::vector<trpg2dPoint> polyTex; |
|---|
| 137 | std::vector<trpg3dPoint> polyNorm,polyVert; |
|---|
| 138 | |
|---|
| 139 | std::vector<trpg2dPoint> tmpTex; |
|---|
| 140 | trpg3dPoint tmpNorm; |
|---|
| 141 | trpgColor tmpCol; |
|---|
| 142 | |
|---|
| 143 | |
|---|
| 144 | trpgwGeomStats stats; |
|---|
| 145 | |
|---|
| 146 | |
|---|
| 147 | double zmin,zmax; |
|---|
| 148 | }; |
|---|
| 149 | |
|---|
| 150 | |
|---|
| 151 | |
|---|
| 152 | |
|---|
| 153 | |
|---|
| 154 | |
|---|
| 155 | TX_EXDECL class TX_CLDECL trpgwImageHelper { |
|---|
| 156 | public: |
|---|
| 157 | trpgwImageHelper() {;}; |
|---|
| 158 | trpgwImageHelper(trpgEndian ness,char *dir,trpgTexTable &,bool separateGeoTypical); |
|---|
| 159 | |
|---|
| 160 | virtual void Init(trpgEndian ness,char *dir,trpgTexTable &,bool separateGeoTypical); |
|---|
| 161 | |
|---|
| 162 | virtual ~trpgwImageHelper(void); |
|---|
| 163 | |
|---|
| 164 | |
|---|
| 165 | virtual bool AddExternal(char *name,int &texID,bool lookForExisting=true); |
|---|
| 166 | |
|---|
| 167 | |
|---|
| 168 | |
|---|
| 169 | |
|---|
| 170 | |
|---|
| 171 | virtual bool AddLocal(char *name,trpgTexture::ImageType type,int sizeX,int sizeY,bool isMipmap,char *data,int &texID,bool deferWrite); |
|---|
| 172 | |
|---|
| 173 | |
|---|
| 174 | |
|---|
| 175 | |
|---|
| 176 | |
|---|
| 177 | |
|---|
| 178 | virtual bool ReplaceLocal(char *data,int &texID); |
|---|
| 179 | |
|---|
| 180 | |
|---|
| 181 | |
|---|
| 182 | |
|---|
| 183 | |
|---|
| 184 | |
|---|
| 185 | virtual bool AddTileLocal(char *name,trpgTexture::ImageType type,int sizeX,int sizeY,bool isMipmap,char *data, int &texID,trpgwAppAddress &addr); |
|---|
| 186 | |
|---|
| 187 | |
|---|
| 188 | |
|---|
| 189 | |
|---|
| 190 | |
|---|
| 191 | virtual void SetMaxTexFileLength(int len); |
|---|
| 192 | |
|---|
| 193 | |
|---|
| 194 | |
|---|
| 195 | |
|---|
| 196 | |
|---|
| 197 | |
|---|
| 198 | virtual trpgwAppFile * IncrementTextureFile(bool geotyp); |
|---|
| 199 | |
|---|
| 200 | |
|---|
| 201 | |
|---|
| 202 | |
|---|
| 203 | virtual bool DesignateTextureFile(int); |
|---|
| 204 | |
|---|
| 205 | |
|---|
| 206 | virtual bool Flush(void); |
|---|
| 207 | |
|---|
| 208 | |
|---|
| 209 | virtual trpgwAppFile* GetNewWAppFile(trpgEndian inNess,const char *fileName,bool reuse=false); |
|---|
| 210 | |
|---|
| 211 | |
|---|
| 212 | bool WriteToArchive(const trpgTexture &tex,char *data,trpgwAppAddress &addr,bool geotyp=false); |
|---|
| 213 | |
|---|
| 214 | |
|---|
| 215 | protected: |
|---|
| 216 | |
|---|
| 217 | |
|---|
| 218 | trpgEndian ness; |
|---|
| 219 | char dir[1024]; |
|---|
| 220 | trpgTexTable *texTable; |
|---|
| 221 | std::vector<int> texFileIDs; |
|---|
| 222 | trpgwAppFile *texFile; |
|---|
| 223 | std::vector<int> geotypFileIDs; |
|---|
| 224 | trpgwAppFile *geotypFile; |
|---|
| 225 | bool separateGeoTypical; |
|---|
| 226 | int maxTexFileLen; |
|---|
| 227 | }; |
|---|
| 228 | |
|---|
| 229 | |
|---|
| 230 | |
|---|
| 231 | |
|---|
| 232 | |
|---|
| 233 | |
|---|
| 234 | TX_EXDECL class TX_CLDECL trpgwArchive : public trpgCheckable { |
|---|
| 235 | public: |
|---|
| 236 | |
|---|
| 237 | enum TileMode {TileLocal,TileExternal,TileExternalSaved}; |
|---|
| 238 | |
|---|
| 239 | |
|---|
| 240 | |
|---|
| 241 | trpgwArchive(char *baseDir,char *name,trpg2dPoint &ll,trpg2dPoint &ur, int majorVer=TRPG_VERSION_MAJOR, int minorVer=TRPG_VERSION_MINOR); |
|---|
| 242 | virtual void Init(char *baseDir,char *name,trpg2dPoint &ll,trpg2dPoint &ur, int majorVer=TRPG_VERSION_MAJOR, int minorVer=TRPG_VERSION_MINOR); |
|---|
| 243 | |
|---|
| 244 | trpgwArchive(trpgEndian ness=LittleEndian,TileMode tileMode=TileLocal,int majorVer=TRPG_VERSION_MAJOR, int minorVer=TRPG_VERSION_MINOR); |
|---|
| 245 | virtual void Init(trpgEndian ness=LittleEndian,TileMode tileMode=TileLocal,int majorVer=TRPG_VERSION_MAJOR, int minorVer=TRPG_VERSION_MINOR); |
|---|
| 246 | |
|---|
| 247 | trpgwArchive(int ) {;}; |
|---|
| 248 | virtual ~trpgwArchive(void); |
|---|
| 249 | |
|---|
| 250 | |
|---|
| 251 | |
|---|
| 252 | virtual void SetMaxTileFileLength(int len); |
|---|
| 253 | |
|---|
| 254 | |
|---|
| 255 | virtual bool SetHeader(const trpgHeader &); |
|---|
| 256 | virtual bool SetMaterialTable(const trpgMatTable &); |
|---|
| 257 | virtual bool SetTextureTable(const trpgTexTable &); |
|---|
| 258 | virtual bool SetModelTable(const trpgModelTable &); |
|---|
| 259 | virtual bool SetLightTable(const trpgLightTable &); |
|---|
| 260 | virtual bool SetRangeTable(const trpgRangeTable &); |
|---|
| 261 | virtual bool SetLabelPropertyTable(const trpgLabelPropertyTable &); |
|---|
| 262 | virtual bool SetSupportStyleTable(const trpgSupportStyleTable &); |
|---|
| 263 | virtual bool SetTextStyleTable(const trpgTextStyleTable &); |
|---|
| 264 | |
|---|
| 265 | |
|---|
| 266 | virtual trpgHeader *GetHeader(); |
|---|
| 267 | virtual trpgMatTable *GetMatTable(); |
|---|
| 268 | virtual trpgTexTable *GetTextureTable(); |
|---|
| 269 | virtual trpgModelTable *GetModelTable(); |
|---|
| 270 | virtual trpgLightTable *GetLightTable(); |
|---|
| 271 | virtual trpgRangeTable *GetRangeTable(); |
|---|
| 272 | virtual trpgLabelPropertyTable *GetLabelPropertyTable(); |
|---|
| 273 | virtual trpgTextStyleTable *GetTextStyleTable(); |
|---|
| 274 | virtual trpgSupportStyleTable *GetSupportStyleTable(); |
|---|
| 275 | |
|---|
| 276 | |
|---|
| 277 | |
|---|
| 278 | virtual bool IncrementTileFile(void); |
|---|
| 279 | virtual bool DesignateTileFile(int); |
|---|
| 280 | |
|---|
| 281 | |
|---|
| 282 | |
|---|
| 283 | |
|---|
| 284 | virtual bool OpenFile(const char *,const char *); |
|---|
| 285 | virtual void CloseFile(void); |
|---|
| 286 | virtual bool WriteHeader(void); |
|---|
| 287 | virtual bool CheckpointHeader(void); |
|---|
| 288 | virtual bool WriteTile(unsigned int,unsigned int,unsigned int,float zmin,float zmax, |
|---|
| 289 | const trpgMemWriteBuffer *,const trpgMemWriteBuffer *, int32& fileId, int32& fileOffset); |
|---|
| 290 | |
|---|
| 291 | |
|---|
| 292 | bool isValid(void) const; |
|---|
| 293 | const char *getErrMess() const; |
|---|
| 294 | char* getDir(void){return dir;}; |
|---|
| 295 | virtual trpgwImageHelper* GetNewWImageHelper(trpgEndian ness,char *dir,trpgTexTable &); |
|---|
| 296 | virtual trpgwAppFile* GetNewWAppFile(trpgEndian inNess,const char *fileName,bool reuse=false); |
|---|
| 297 | virtual trpgr_Archive* GetArchiveReader() {return new trpgr_Archive();}; |
|---|
| 298 | virtual int32 WriteHeaderData(const char *dataPtr,int32 length,FILE *filehandle); |
|---|
| 299 | virtual int32 GetMagicNumber() {return TRPG_MAGIC;}; |
|---|
| 300 | protected: |
|---|
| 301 | |
|---|
| 302 | bool isRegenerate; |
|---|
| 303 | |
|---|
| 304 | |
|---|
| 305 | class TileFileEntry { |
|---|
| 306 | public: |
|---|
| 307 | int x,y,lod; |
|---|
| 308 | float zmin,zmax; |
|---|
| 309 | int32 offset; |
|---|
| 310 | }; |
|---|
| 311 | class TileFile { |
|---|
| 312 | public: |
|---|
| 313 | int id; |
|---|
| 314 | std::vector<TileFileEntry> tiles; |
|---|
| 315 | }; |
|---|
| 316 | |
|---|
| 317 | trpgEndian ness,cpuNess; |
|---|
| 318 | int majorVersion, minorVersion; |
|---|
| 319 | |
|---|
| 320 | char dir[1024]; |
|---|
| 321 | |
|---|
| 322 | |
|---|
| 323 | |
|---|
| 324 | trpgHeader header; |
|---|
| 325 | trpgMatTable matTable; |
|---|
| 326 | trpgTexTable texTable; |
|---|
| 327 | trpgModelTable modelTable; |
|---|
| 328 | trpgLightTable lightTable; |
|---|
| 329 | trpgRangeTable rangeTable; |
|---|
| 330 | trpgTextStyleTable textStyleTable; |
|---|
| 331 | trpgSupportStyleTable supportStyleTable; |
|---|
| 332 | trpgLabelPropertyTable labelPropertyTable; |
|---|
| 333 | |
|---|
| 334 | |
|---|
| 335 | trpgTileTable tileTable; |
|---|
| 336 | |
|---|
| 337 | int numLod; |
|---|
| 338 | TileMode tileMode; |
|---|
| 339 | |
|---|
| 340 | trpgwAppFile *tileFile; |
|---|
| 341 | int tileFileCount; |
|---|
| 342 | |
|---|
| 343 | std::vector<TileFile> tileFiles; |
|---|
| 344 | |
|---|
| 345 | std::vector<TileFileEntry> externalTiles; |
|---|
| 346 | |
|---|
| 347 | int maxTileFileLen; |
|---|
| 348 | |
|---|
| 349 | |
|---|
| 350 | trpg2iPoint addOffset; |
|---|
| 351 | |
|---|
| 352 | FILE *fp; |
|---|
| 353 | |
|---|
| 354 | bool firstHeaderWrite; |
|---|
| 355 | |
|---|
| 356 | mutable char errMess[512]; |
|---|
| 357 | }; |
|---|
| 358 | |
|---|
| 359 | #endif |
|---|