Ptex
PtexReader.h
Go to the documentation of this file.
1#ifndef PtexReader_h
2#define PtexReader_h
3
4/*
5PTEX SOFTWARE
6Copyright 2014 Disney Enterprises, Inc. All rights reserved
7
8Redistribution and use in source and binary forms, with or without
9modification, are permitted provided that the following conditions are
10met:
11
12 * Redistributions of source code must retain the above copyright
13 notice, this list of conditions and the following disclaimer.
14
15 * Redistributions in binary form must reproduce the above copyright
16 notice, this list of conditions and the following disclaimer in
17 the documentation and/or other materials provided with the
18 distribution.
19
20 * The names "Disney", "Walt Disney Pictures", "Walt Disney Animation
21 Studios" or the names of its contributors may NOT be used to
22 endorse or promote products derived from this software without
23 specific prior written permission from Walt Disney Pictures.
24
25Disclaimer: THIS SOFTWARE IS PROVIDED BY WALT DISNEY PICTURES AND
26CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
27BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
28FOR A PARTICULAR PURPOSE, NONINFRINGEMENT AND TITLE ARE DISCLAIMED.
29IN NO EVENT SHALL WALT DISNEY PICTURES, THE COPYRIGHT HOLDER OR
30CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND BASED ON ANY
34THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
37*/
38#include <stdio.h>
39#include <vector>
40#include <string>
41#include <map>
42#include <errno.h>
43#include "Ptexture.h"
44#include "PtexIO.h"
45#include "PtexUtils.h"
46
47#include "PtexHashMap.h"
48
49struct libdeflate_decompressor;
50
52
53class PtexReader : public PtexTexture {
54public:
55 PtexReader(bool premultiply, PtexInputHandler* inputHandler, PtexErrorHandler* errorHandler);
56 virtual ~PtexReader();
57 virtual void release() { delete this; }
58 bool needToOpen() const { return _needToOpen; }
59 bool open(const char* path, Ptex::String& error);
60 void prune();
61 void purge();
62 void setPendingPurge() { _pendingPurge = true; }
63 bool pendingPurge() const { return _pendingPurge; }
64 bool tryClose();
65 bool ok() const { return _ok; }
66 bool isOpen() { return _fp; }
67 void invalidate() {
68 _ok = false;
69 _needToOpen = false;
70 }
71
72 void increaseMemUsed(size_t amount) { if (amount) AtomicAdd(&_memUsed, amount); }
75
76 virtual const char* path() { return _path.c_str(); }
77
78 virtual Info getInfo() {
79 Info info;
80 info.meshType = MeshType(_header.meshtype);
81 info.dataType = DataType(_header.datatype);
82 info.uBorderMode = BorderMode(_extheader.ubordermode);
83 info.vBorderMode = BorderMode(_extheader.vbordermode);
84 info.edgeFilterMode = EdgeFilterMode(_extheader.edgefiltermode);
87 info.numFaces = _header.nfaces;
88 return info;
89 }
90
91 virtual Ptex::MeshType meshType() { return MeshType(_header.meshtype); }
92 virtual Ptex::DataType dataType() { return DataType(_header.datatype); }
93 virtual Ptex::BorderMode uBorderMode() { return BorderMode(_extheader.ubordermode); }
94 virtual Ptex::BorderMode vBorderMode() { return BorderMode(_extheader.vbordermode); }
95 virtual Ptex::EdgeFilterMode edgeFilterMode() { return EdgeFilterMode(_extheader.edgefiltermode); }
96 virtual int alphaChannel() { return _header.alphachan; }
97 virtual int numChannels() { return _header.nchannels; }
98 virtual int numFaces() { return _header.nfaces; }
99 virtual bool hasEdits() { return false; }
100 virtual bool hasMipMaps() { return _header.nlevels > 1; }
101
102 virtual PtexMetaData* getMetaData();
103 virtual const Ptex::FaceInfo& getFaceInfo(int faceid);
104 virtual void getData(int faceid, void* buffer, int stride);
105 virtual void getData(int faceid, void* buffer, int stride, Res res);
106 virtual PtexFaceData* getData(int faceid);
107 virtual PtexFaceData* getData(int faceid, Res res);
108 virtual void* getConstantData(int faceid) final { return _constdata + faceid * _pixelsize; }
109 virtual void getPixel(int faceid, int u, int v,
110 float* result, int firstchan, int nchannels);
111 virtual void getPixel(int faceid, int u, int v,
112 float* result, int firstchan, int nchannels,
113 Ptex::Res res);
114 void getCompressedData(int faceid, int level, FaceDataHeader& fdh, std::vector<std::byte>& data);
115
116 DataType datatype() const { return DataType(_header.datatype); }
117 int nchannels() const { return _header.nchannels; }
118 int pixelsize() const { return _pixelsize; }
119 const Header& header() const { return _header; }
120 const ExtHeader& extheader() const { return _extheader; }
121 const LevelInfo& levelinfo(int level) const { return _levelinfo[level]; }
122
123 class MetaData : public PtexMetaData {
124 public:
126 : _reader(reader) {}
128 virtual void release() {}
129
130 virtual int numKeys() { return int(_entries.size()); }
131 virtual void getKey(int index, const char*& key, MetaDataType& type)
132 {
133 if (index < 0 || index >= int(_entries.size())) {
134 return;
135 }
136 Entry* e = _entries[index];
137 key = e->key;
138 type = e->type;
139 }
140
141 virtual bool findKey(const char* key, int& index, MetaDataType& type)
142 {
143 MetaMap::iterator iter = _map.find(key);
144 if (iter==_map.end()) {
145 index = -1;
146 return false;
147 }
148 index = iter->second.index;
149 type = iter->second.type;
150 return true;
151 }
152
153 virtual void getValue(const char* key, const char*& value)
154 {
155 int index = -1;
156 MetaDataType type;
157 if (!findKey(key, index, type)) {
158 value = 0;
159 return;
160 }
161 Entry* e = getEntry(index);
162 if (e && e->type == mdt_string) value = (const char*) e->data;
163 else value = 0;
164 }
165
166 virtual void getValue(int index, const char*& value)
167 {
168 if (index < 0 || index >= int(_entries.size())) { value = 0; return; }
169 Entry* e = getEntry(index);
170 if (e && e->type == mdt_string) value = (const char*) e->data;
171 else value = 0;
172 }
173
174 template<typename T>
175 void getValue(int index, MetaDataType requestedType, const T*& value, int& count)
176 {
177 if (index < 0 || index >= int(_entries.size())) {
178 value = 0;
179 count = 0;
180 return;
181 }
182 Entry* e = getEntry(index);
183 if (e && e->type == requestedType) {
184 value = (const T*) e->data;
185 count = int(e->datasize/sizeof(T));
186 }
187 else { value = 0; count = 0; }
188 }
189
190 template<typename T>
191 void getValue(const char* key, MetaDataType requestedType, const T*& value, int& count)
192 {
193 int index = -1;
194 MetaDataType type;
195 findKey(key, index, type);
196 getValue<T>(index, requestedType, value, count);
197 }
198
199 virtual void getValue(const char* key, const int8_t*& value, int& count)
200 {
201 getValue<int8_t>(key, mdt_int8, value, count);
202 }
203
204 virtual void getValue(int index, const int8_t*& value, int& count)
205 {
206 getValue<int8_t>(index, mdt_int8, value, count);
207 }
208
209 virtual void getValue(const char* key, const int16_t*& value, int& count)
210 {
211 getValue<int16_t>(key, mdt_int16, value, count);
212 }
213
214 virtual void getValue(int index, const int16_t*& value, int& count)
215 {
216 getValue<int16_t>(index, mdt_int16, value, count);
217 }
218
219 virtual void getValue(const char* key, const int32_t*& value, int& count)
220 {
221 getValue<int32_t>(key, mdt_int32, value, count);
222 }
223
224 virtual void getValue(int index, const int32_t*& value, int& count)
225 {
226 getValue<int32_t>(index, mdt_int32, value, count);
227 }
228
229 virtual void getValue(const char* key, const float*& value, int& count)
230 {
231 getValue<float>(key, mdt_float, value, count);
232 }
233
234 virtual void getValue(int index, const float*& value, int& count)
235 {
236 getValue<float>(index, mdt_float, value, count);
237 }
238
239 virtual void getValue(const char* key, const double*& value, int& count)
240 {
241 getValue<double>(key, mdt_double, value, count);
242 }
243
244 virtual void getValue(int index, const double*& value, int& count)
245 {
246 getValue<double>(index, mdt_double, value, count);
247 }
248
249 void addEntry(uint8_t keysize, const char* key, uint8_t datatype,
250 uint32_t datasize, const void* data, size_t& metaDataMemUsed)
251 {
252 Entry* e = newEntry(keysize, key, datatype, datasize, metaDataMemUsed);
253 e->data = new char[datasize];
254 memcpy(e->data, data, datasize);
255 metaDataMemUsed += datasize;
256 }
257
258 void addLmdEntry(uint8_t keysize, const char* key, uint8_t datatype,
259 uint32_t datasize, FilePos filepos, uint32_t zipsize,
260 size_t& metaDataMemUsed)
261 {
262 Entry* e = newEntry(keysize, key, datatype, datasize, metaDataMemUsed);
263 e->isLmd = true;
264 e->lmdData = 0;
265 e->lmdPos = filepos;
266 e->lmdZipSize = zipsize;
267 }
268
270 {
271 return sizeof(*this) + sizeof(Entry*) * _entries.capacity();
272 }
273
274 protected:
276 {
277 public:
279 : _data(new char [size]) {}
280 virtual ~LargeMetaData() { delete [] _data; }
281 void* data() { return _data; }
282 private:
284 char* _data;
285 };
286
287 struct Entry {
288 const char* key; // ptr to map key string
289 MetaDataType type; // meta data type
290 uint32_t datasize; // size of data in bytes
291 char* data; // if lmd, data only valid when lmd is loaded and ref'ed
292 bool isLmd; // true if data is a large meta data block
293 LargeMetaData* lmdData; // large meta data (lazy-loaded)
294 FilePos lmdPos; // large meta data file position
295 uint32_t lmdZipSize; // large meta data size on disk
296 uint32_t index; // index in vector
297
299 key(0), type(MetaDataType(0)), datasize(0), data(0),
300 isLmd(0), lmdData(0), lmdPos(0), lmdZipSize(0) {}
301 ~Entry() { clear(); }
302 void clear() {
303 if (isLmd) {
304 isLmd = 0;
305 if (lmdData) { delete lmdData; lmdData = 0; }
306 lmdPos = 0;
307 lmdZipSize = 0;
308 }
309 else {
310 if (data) { delete [] data; }
311 }
312 data = 0;
313 }
314 };
315
316 Entry* newEntry(uint8_t keysize, const char* key, uint8_t datatype, uint32_t datasize, size_t& metaDataMemUsed)
317 {
318 std::pair<MetaMap::iterator,bool> result =
319 _map.insert(std::make_pair(std::string(key, keysize), Entry()));
320 Entry* e = &result.first->second;
321 bool newentry = result.second;
322 uint32_t index = 0;
323 if (newentry) {
324 index = uint32_t(_entries.size());
325 _entries.push_back(e);
326 }
327 else {
328 index = e->index;
329 e->clear();
330 }
331 e->key = result.first->first.c_str();
332 e->type = MetaDataType(datatype);
333 e->datasize = datasize;
334 e->index = index;
335 metaDataMemUsed += sizeof(std::string) + keysize + 1 + sizeof(Entry);
336 return e;
337 }
338
339 PTEXAPI Entry* getEntry(int index);
340
342 typedef std::map<std::string, Entry> MetaMap;
344 std::vector<Entry*> _entries;
345 };
346
347
348 class ConstDataPtr : public PtexFaceData {
349 public:
350 ConstDataPtr(void* data, int pixelsize)
351 : _data(data), _pixelsize(pixelsize) {}
352 virtual void release() { delete this; }
353 virtual Ptex::Res res() { return 0; }
354 virtual bool isConstant() { return true; }
355 virtual void getPixel(int, int, void* result)
356 { memcpy(result, _data, _pixelsize); }
357 virtual void* getData() { return _data; }
358 virtual bool isTiled() { return false; }
359 virtual Ptex::Res tileRes() { return 0; }
360 virtual PtexFaceData* getTile(int) { return 0; }
361
362 protected:
363 void* _data;
365 };
366
367
368 class FaceData : public PtexFaceData {
369 public:
370 FaceData(Res resArg)
371 : _res(resArg) {}
372 virtual ~FaceData() {}
373 virtual void release() { }
374 virtual Ptex::Res res() { return _res; }
375 virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed) = 0;
376 protected:
377 Res _res;
378 };
379
380 class PackedFace : public FaceData {
381 public:
382 PackedFace(Res resArg, int pixelsize, int size)
383 : FaceData(resArg),
384 _pixelsize(pixelsize), _data(new char [size]) {}
385 void* data() { return _data; }
386 virtual bool isConstant() { return false; }
387 virtual void getPixel(int u, int v, void* result)
388 {
389 memcpy(result, _data + (v*_res.u() + u) * _pixelsize, _pixelsize);
390 }
391 virtual void* getData() { return _data; }
392 virtual bool isTiled() { return false; }
393 virtual Ptex::Res tileRes() { return _res; }
394 virtual PtexFaceData* getTile(int) { return 0; }
395 virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
396
397 protected:
398 virtual ~PackedFace() { delete [] _data; }
399
401 char* _data;
402 };
403
404 class ConstantFace : public PackedFace {
405 public:
408 virtual bool isConstant() { return true; }
409 virtual void getPixel(int, int, void* result) { memcpy(result, _data, _pixelsize); }
410 virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
411 };
412
413 class ErrorFace : public ConstantFace {
415 public:
416 ErrorFace(void* errorPixel, int pixelsize, bool deleteOnRelease)
417 : ConstantFace(pixelsize), _deleteOnRelease(deleteOnRelease)
418 {
419 memcpy(_data, errorPixel, pixelsize);
420 }
421 virtual void release() { if (_deleteOnRelease) delete this; }
422 };
423
424 class TiledFaceBase : public FaceData {
425 public:
426 TiledFaceBase(PtexReader* reader, Res resArg, Res tileresArg)
427 : FaceData(resArg),
428 _reader(reader),
429 _tileres(tileresArg)
430 {
431 _dt = reader->datatype();
432 _nchan = reader->nchannels();
433 _pixelsize = DataSize(_dt)*_nchan;
434 _ntilesu = _res.ntilesu(tileresArg);
435 _ntilesv = _res.ntilesv(tileresArg);
437 _tiles.resize(_ntiles);
438 }
439
440 virtual void release() { }
441 virtual bool isConstant() { return false; }
442 virtual void getPixel(int u, int v, void* result);
443 virtual void* getData() { return 0; }
444 virtual bool isTiled() { return true; }
445 virtual Ptex::Res tileRes() { return _tileres; }
446 virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
447 Res tileres() const { return _tileres; }
448 int ntilesu() const { return _ntilesu; }
449 int ntilesv() const { return _ntilesv; }
450 int ntiles() const { return _ntiles; }
451
452 protected:
453 size_t baseExtraMemUsed() { return _tiles.size() * sizeof(_tiles[0]); }
454
455 virtual ~TiledFaceBase() {
456 for (std::vector<FaceData*>::iterator i = _tiles.begin(); i != _tiles.end(); ++i) {
457 if (*i) delete *i;
458 }
459 }
460
463 DataType _dt;
469 std::vector<FaceData*> _tiles;
470 };
471
472
473 class TiledFace : public TiledFaceBase {
474 public:
475 TiledFace(PtexReader* reader, Res resArg, Res tileresArg, int levelid)
476 : TiledFaceBase(reader, resArg, tileresArg),
477 _levelid(levelid)
478 {
479 _fdh.resize(_ntiles),
480 _offsets.resize(_ntiles);
481 }
482 virtual PtexFaceData* getTile(int tile)
483 {
484 FaceData*& f = _tiles[tile];
485 if (!f) readTile(tile, f);
486 return f;
487 }
488 void readTile(int tile, FaceData*& data);
489 size_t memUsed() {
490 return sizeof(*this) + baseExtraMemUsed() + _fdh.size() * (sizeof(_fdh[0]) + sizeof(_offsets[0]));
491 }
492
493 protected:
494 friend class PtexReader;
496 std::vector<FaceDataHeader> _fdh;
497 std::vector<FilePos> _offsets;
498 };
499
500
502 public:
503 TiledReducedFace(PtexReader* reader, Res resArg, Res tileresArg,
504 TiledFaceBase* parentface, PtexUtils::ReduceFn reducefn)
505 : TiledFaceBase(reader, resArg, tileresArg),
506 _parentface(parentface),
507 _reducefn(reducefn)
508 {
509 }
511 {
512 }
513 virtual PtexFaceData* getTile(int tile);
514
515 size_t memUsed() { return sizeof(*this) + baseExtraMemUsed(); }
516
517 protected:
520 };
521
522
523 class Level {
524 public:
525 std::vector<FaceDataHeader> fdh;
526 std::vector<FilePos> offsets;
527 std::vector<FaceData*> faces;
528
529 Level(int nfaces)
530 : fdh(nfaces),
531 offsets(nfaces),
532 faces(nfaces) {}
533
535 for (std::vector<FaceData*>::iterator i = faces.begin(); i != faces.end(); ++i) {
536 if (*i) delete *i;
537 }
538 }
539
540 size_t memUsed() {
541 return sizeof(*this) + fdh.size() * (sizeof(fdh[0]) +
542 sizeof(offsets[0]) +
543 sizeof(faces[0]));
544 }
545 };
546
547
548protected:
549 void setError(const char* error, bool ioError = false)
550 {
551 std::string msg = error;
552 msg += " PtexFile: ";
553 msg += _path;
554 msg += "\n";
555 if (ioError) {
556 msg += _io->lastError();
557 msg += "\n";
558 }
559 if (_err) _err->reportError(msg.c_str());
560 else std::cerr << msg;
561 _ok = 0;
562 }
563
564 void setIOError(const char* error)
565 {
566 setError(error, true);
567 }
568
569 FilePos tell() { return _pos; }
570 void seek(FilePos pos)
571 {
572 if (!_fp && !reopenFP()) return;
573 logBlockRead();
574 if (pos != _pos) {
575 _io->seek(_fp, pos);
576 _pos = pos;
577 }
578 }
579
580 void closeFP();
581 bool reopenFP();
582 bool readBlock(void* data, int size);
583 bool readZipBlock(void* data, int zipsize, int unzipsize);
584 Level* getLevel(int levelid)
585 {
586 Level*& level = _levels[levelid];
587 if (!level) readLevel(levelid, level);
588 return level;
589 }
590
591 FaceData* getFace(int levelid, Level* level, int faceid, Res res)
592 {
593 FaceData*& face = level->faces[faceid];
594 if (!face) readFace(levelid, level, faceid, res);
595 return face;
596 }
597
598 void readFaceInfo();
599 void readLevelInfo();
600 void readConstData();
601 void readLevel(int levelid, Level*& level);
602 void readFace(int levelid, Level* level, int faceid, Res res);
603 void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData*& face);
604 void readMetaData();
605 void readMetaDataBlock(MetaData* metadata, FilePos pos, int zipsize, int memsize, size_t& metaDataMemUsed);
606 void readLargeMetaDataHeaders(MetaData* metadata, FilePos pos, int zipsize, int memsize, size_t& metaDataMemUsed);
607
608 FaceData* errorData(bool deleteOnRelease=false)
609 {
610 return new ErrorFace(&_errorPixel[0], _pixelsize, deleteOnRelease);
611 }
612
613 void computeFaceTileOffsets(FilePos pos, int noffsets, const FaceDataHeader* fdh, FilePos* offsets)
614 {
615 FilePos* end = offsets + noffsets;
616 while (offsets != end) { *offsets++ = pos; pos += fdh->blocksize(); fdh++; }
617 }
618
620 {
621 char* buffer;
622 public:
624 virtual Handle open(const char* path) {
625 FILE* fp = fopen(path, "rb");
626 if (fp) {
627 buffer = new char [IBuffSize];
628 setvbuf(fp, buffer, _IOFBF, IBuffSize);
629 }
630 else buffer = 0;
631 return (Handle) fp;
632 }
633 virtual void seek(Handle handle, int64_t pos) { fseeko((FILE*)handle, pos, SEEK_SET); }
634 virtual size_t read(void* bufferArg, size_t size, Handle handle) {
635 return fread(bufferArg, size, 1, (FILE*)handle) == 1 ? size : 0;
636 }
637 virtual bool close(Handle handle) {
638 bool ok = handle && (fclose((FILE*)handle) == 0);
639 if (buffer) { delete [] buffer; buffer = 0; }
640 return ok;
641 }
642 virtual const char* lastError() { return strerror(errno); }
643 };
644
646 DefaultInputHandler _defaultIo; // Default IO handler
647 PtexInputHandler* _io; // IO handler
648 PtexErrorHandler* _err; // Error handler
649 bool _premultiply; // true if reader should premultiply the alpha chan
650 bool _ok; // flag set to false if open or read error occurred
651 bool _needToOpen; // true if file needs to be opened (or reopened after a purge)
652 bool _pendingPurge; // true if a purge attempt was made but file was busy
654 FilePos _pos; // current seek position
655 std::string _path; // current file path
656 Header _header; // the header
657 ExtHeader _extheader; // extended header
658 FilePos _faceinfopos; // file positions of data sections
665 int _pixelsize; // size of a pixel in bytes
666 uint8_t* _constdata; // constant pixel value per face
667 MetaData* _metadata; // meta data (read on demand)
668
669 std::vector<FaceInfo> _faceinfo; // per-face header info
670 std::vector<uint32_t> _rfaceids; // faceids sorted in reduction order
671 std::vector<LevelInfo> _levelinfo; // per-level header info
672 std::vector<FilePos> _levelpos; // file position of each level's data
673 std::vector<Level*> _levels; // level data (read on demand)
674
676 int64_t _val;
677 public:
679 ReductionKey(uint32_t faceid, Res res)
680 : _val( int64_t(faceid)<<32 | uint32_t(16777619*((res.val()<<16) ^ faceid)) ) {}
681
682 void copy(volatile ReductionKey& key) volatile
683 {
684 _val = key._val;
685 }
686
687 void move(volatile ReductionKey& key) volatile
688 {
689 _val = key._val;
690 }
691
692 bool matches(const ReductionKey& key) const volatile
693 {
694 return _val == key._val;
695 }
696 bool isEmpty() const volatile { return _val==-1; }
697 uint32_t hash() const volatile
698 {
699 return uint32_t(_val);
700 }
701 };
704 std::vector<char> _errorPixel; // referenced by errorData()
705
706 libdeflate_decompressor* _decompressor;
708 volatile size_t _memUsed;
709 volatile size_t _opens;
710 volatile size_t _blockReads;
711};
712
714
715#endif
#define PTEXAPI
Definition: PtexExports.h:60
Contains PtexHashMap, a lightweight multi-threaded hash table.
const int IBuffSize
Definition: PtexIO.h:106
off_t FilePos
Definition: PtexPlatform.h:101
PTEX_INLINE T AtomicAdd(volatile T *target, T value)
Definition: PtexPlatform.h:211
PTEX_INLINE T AtomicIncrement(volatile T *target)
Definition: PtexPlatform.h:227
#define PTEX_NAMESPACE_END
Definition: PtexVersion.h:62
Public API classes for reading, writing, caching, and filtering Ptex files.
Custom handler interface redirecting Ptex error messages.
Definition: Ptexture.h:667
virtual void reportError(const char *error)=0
Per-face texture data accessor.
Definition: Ptexture.h:409
Custom handler interface for intercepting and redirecting Ptex input stream calls.
Definition: Ptexture.h:628
virtual void seek(Handle handle, int64_t pos)=0
Seek to an absolute byte position in the input stream.
virtual const char * lastError()=0
Return the last error message encountered.
Meta data accessor.
Definition: Ptexture.h:331
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:354
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:353
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:352
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:358
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:357
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:355
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:359
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
Definition: PtexReader.h:360
ConstDataPtr(void *data, int pixelsize)
Definition: PtexReader.h:350
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:409
ConstantFace(int pixelsize)
Definition: PtexReader.h:406
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:408
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:950
virtual void seek(Handle handle, int64_t pos)
Seek to an absolute byte position in the input stream.
Definition: PtexReader.h:633
virtual bool close(Handle handle)
Close a file.
Definition: PtexReader.h:637
virtual size_t read(void *bufferArg, size_t size, Handle handle)
Read a number of bytes from the file.
Definition: PtexReader.h:634
virtual Handle open(const char *path)
Open a file in read mode.
Definition: PtexReader.h:624
virtual const char * lastError()
Return the last error message encountered.
Definition: PtexReader.h:642
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:421
ErrorFace(void *errorPixel, int pixelsize, bool deleteOnRelease)
Definition: PtexReader.h:416
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:374
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)=0
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:373
FaceData(Res resArg)
Definition: PtexReader.h:370
Level(int nfaces)
Definition: PtexReader.h:529
std::vector< FilePos > offsets
Definition: PtexReader.h:526
std::vector< FaceDataHeader > fdh
Definition: PtexReader.h:525
std::vector< FaceData * > faces
Definition: PtexReader.h:527
size_t memUsed()
Definition: PtexReader.h:540
LargeMetaData(const LargeMetaData &)
virtual void getValue(int index, const int8_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:204
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:128
Entry * newEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, size_t &metaDataMemUsed)
Definition: PtexReader.h:316
virtual void getKey(int index, const char *&key, MetaDataType &type)
Definition: PtexReader.h:131
virtual void getValue(int index, const double *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:244
virtual void getValue(const char *key, const int8_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:199
virtual void getValue(int index, const char *&value)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:166
void addEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, const void *data, size_t &metaDataMemUsed)
Definition: PtexReader.h:249
virtual void getValue(int index, const float *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:234
void getValue(const char *key, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:191
virtual bool findKey(const char *key, int &index, MetaDataType &type)
Definition: PtexReader.h:141
virtual void getValue(int index, const int16_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:214
MetaData(PtexReader *reader)
Definition: PtexReader.h:125
virtual void getValue(const char *key, const int32_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:219
virtual int numKeys()
Query number of meta data entries stored in file.
Definition: PtexReader.h:130
virtual void getValue(int index, const int32_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:224
virtual void getValue(const char *key, const double *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:239
PtexReader * _reader
Definition: PtexReader.h:341
virtual void getValue(const char *key, const char *&value)
Query the value of a given meta data entry.
Definition: PtexReader.h:153
std::map< std::string, Entry > MetaMap
Definition: PtexReader.h:342
virtual void getValue(const char *key, const float *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:229
void addLmdEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, FilePos filepos, uint32_t zipsize, size_t &metaDataMemUsed)
Definition: PtexReader.h:258
void getValue(int index, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:175
Entry * getEntry(int index)
Definition: PtexReader.cpp:345
std::vector< Entry * > _entries
Definition: PtexReader.h:344
virtual void getValue(const char *key, const int16_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:209
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
Definition: PtexReader.h:394
PackedFace(Res resArg, int pixelsize, int size)
Definition: PtexReader.h:382
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:392
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:393
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:933
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:386
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:387
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:391
bool isEmpty() const volatile
Definition: PtexReader.h:696
ReductionKey(uint32_t faceid, Res res)
Definition: PtexReader.h:679
void move(volatile ReductionKey &key) volatile
Definition: PtexReader.h:687
uint32_t hash() const volatile
Definition: PtexReader.h:697
void copy(volatile ReductionKey &key) volatile
Definition: PtexReader.h:682
bool matches(const ReductionKey &key) const volatile
Definition: PtexReader.h:692
TiledFaceBase(PtexReader *reader, Res resArg, Res tileresArg)
Definition: PtexReader.h:426
std::vector< FaceData * > _tiles
Definition: PtexReader.h:469
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:444
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:963
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:443
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:440
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:445
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:441
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
std::vector< FaceDataHeader > _fdh
Definition: PtexReader.h:496
TiledFace(PtexReader *reader, Res resArg, Res tileresArg, int levelid)
Definition: PtexReader.h:475
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
Definition: PtexReader.h:482
void readTile(int tile, FaceData *&data)
Definition: PtexReader.cpp:567
std::vector< FilePos > _offsets
Definition: PtexReader.h:497
TiledFaceBase * _parentface
Definition: PtexReader.h:518
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
PtexUtils::ReduceFn * _reducefn
Definition: PtexReader.h:519
TiledReducedFace(PtexReader *reader, Res resArg, Res tileresArg, TiledFaceBase *parentface, PtexUtils::ReduceFn reducefn)
Definition: PtexReader.h:503
void readLevelInfo()
Definition: PtexReader.cpp:300
ReductionMap _reductions
Definition: PtexReader.h:703
bool reopenFP()
Definition: PtexReader.cpp:242
bool ok() const
Definition: PtexReader.h:65
DataType datatype() const
Definition: PtexReader.h:116
bool _premultiply
Definition: PtexReader.h:649
FilePos _constdatapos
Definition: PtexReader.h:659
void readMetaDataBlock(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:411
const ExtHeader & extheader() const
Definition: PtexReader.h:120
virtual void * getConstantData(int faceid) final
Access the constant (or average) data value for a given face.
Definition: PtexReader.h:108
virtual int numFaces()
Number of faces stored in file.
Definition: PtexReader.h:98
void setPendingPurge()
Definition: PtexReader.h:62
void readFaceInfo()
Definition: PtexReader.cpp:279
virtual Ptex::BorderMode vBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:94
std::string _path
Definition: PtexReader.h:655
uint8_t * _constdata
Definition: PtexReader.h:666
std::vector< FilePos > _levelpos
Definition: PtexReader.h:672
virtual void getPixel(int faceid, int u, int v, float *result, int firstchan, int nchannels)
Access a single texel from the highest resolution texture .
Definition: PtexReader.cpp:825
virtual Info getInfo()
Definition: PtexReader.h:78
void setIOError(const char *error)
Definition: PtexReader.h:564
volatile size_t _opens
Definition: PtexReader.h:709
bool isOpen()
Definition: PtexReader.h:66
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:57
void increaseMemUsed(size_t amount)
Definition: PtexReader.h:72
virtual const char * path()
Path that file was opened with.
Definition: PtexReader.h:76
void computeFaceTileOffsets(FilePos pos, int noffsets, const FaceDataHeader *fdh, FilePos *offsets)
Definition: PtexReader.h:613
FaceData * getFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.h:591
void purge()
Definition: PtexReader.cpp:117
FilePos tell()
Definition: PtexReader.h:569
Level * getLevel(int levelid)
Definition: PtexReader.h:584
FaceData * errorData(bool deleteOnRelease=false)
Definition: PtexReader.h:608
virtual ~PtexReader()
Definition: PtexReader.cpp:94
bool _needToOpen
Definition: PtexReader.h:651
virtual Ptex::BorderMode uBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:93
void readConstData()
Definition: PtexReader.cpp:321
virtual PtexMetaData * getMetaData()
Access meta data.
Definition: PtexReader.cpp:337
bool needToOpen() const
Definition: PtexReader.h:58
virtual int alphaChannel()
Index of alpha channel (if any).
Definition: PtexReader.h:96
ExtHeader _extheader
Definition: PtexReader.h:657
FilePos _leveldatapos
Definition: PtexReader.h:661
virtual void getData(int faceid, void *buffer, int stride)
Access texture data for a face at highest-resolution.
Definition: PtexReader.cpp:643
PtexErrorHandler * _err
Definition: PtexReader.h:648
const Header & header() const
Definition: PtexReader.h:119
FilePos _faceinfopos
Definition: PtexReader.h:658
std::vector< LevelInfo > _levelinfo
Definition: PtexReader.h:671
bool readBlock(void *data, int size)
Definition: PtexReader.cpp:466
PtexHashMap< ReductionKey, FaceData * > ReductionMap
Definition: PtexReader.h:702
virtual bool hasMipMaps()
True if the file has mipmaps.
Definition: PtexReader.h:100
PtexInputHandler * _io
Definition: PtexReader.h:647
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)
Access resolution and adjacency information about a face.
Definition: PtexReader.cpp:269
FilePos _metadatapos
Definition: PtexReader.h:662
void readLargeMetaDataHeaders(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:437
void closeFP()
Definition: PtexReader.cpp:233
int _pixelsize
Definition: PtexReader.h:665
bool _pendingPurge
Definition: PtexReader.h:652
bool pendingPurge() const
Definition: PtexReader.h:63
Mutex readlock
Definition: PtexReader.h:645
void setError(const char *error, bool ioError=false)
Definition: PtexReader.h:549
void readFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.cpp:559
FilePos _levelinfopos
Definition: PtexReader.h:660
FilePos _lmdheaderpos
Definition: PtexReader.h:663
virtual bool hasEdits()
Obsolete (returns false).
Definition: PtexReader.h:99
int nchannels() const
Definition: PtexReader.h:117
FilePos _lmddatapos
Definition: PtexReader.h:664
void prune()
Definition: PtexReader.cpp:106
std::vector< uint32_t > _rfaceids
Definition: PtexReader.h:670
volatile size_t _memUsed
Definition: PtexReader.h:708
DefaultInputHandler _defaultIo
Definition: PtexReader.h:646
volatile size_t _blockReads
Definition: PtexReader.h:710
Header _header
Definition: PtexReader.h:656
void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData *&face)
Definition: PtexReader.cpp:573
libdeflate_decompressor * _decompressor
Definition: PtexReader.h:706
void seek(FilePos pos)
Definition: PtexReader.h:570
MetaData * _metadata
Definition: PtexReader.h:667
std::vector< Level * > _levels
Definition: PtexReader.h:673
size_t _baseMemUsed
Definition: PtexReader.h:707
std::vector< FaceInfo > _faceinfo
Definition: PtexReader.h:669
void invalidate()
Definition: PtexReader.h:67
virtual Ptex::MeshType meshType()
Type of mesh for which texture data is defined.
Definition: PtexReader.h:91
virtual Ptex::EdgeFilterMode edgeFilterMode()
Mode for filtering textures across edges.
Definition: PtexReader.h:95
int pixelsize() const
Definition: PtexReader.h:118
PtexInputHandler::Handle _fp
Definition: PtexReader.h:653
bool readZipBlock(void *data, int zipsize, int unzipsize)
Definition: PtexReader.cpp:480
void getCompressedData(int faceid, int level, FaceDataHeader &fdh, std::vector< std::byte > &data)
Definition: PtexReader.cpp:892
void readMetaData()
Definition: PtexReader.cpp:383
void logBlockRead()
Definition: PtexReader.h:74
void logOpen()
Definition: PtexReader.h:73
void readLevel(int levelid, Level *&level)
Definition: PtexReader.cpp:499
virtual Ptex::DataType dataType()
Type of data stored in file.
Definition: PtexReader.h:92
std::vector< char > _errorPixel
Definition: PtexReader.h:704
virtual int numChannels()
Number of channels stored in file.
Definition: PtexReader.h:97
FilePos _pos
Definition: PtexReader.h:654
bool open(const char *path, Ptex::String &error)
Definition: PtexReader.cpp:137
const LevelInfo & levelinfo(int level) const
Definition: PtexReader.h:121
bool tryClose()
Definition: PtexReader.cpp:222
Interface for reading data from a ptex file.
Definition: Ptexture.h:460
Memory-managed string.
Definition: Ptexture.h:299
void ReduceFn(const void *src, int sstride, int ures, int vres, void *dst, int dstride, DataType dt, int nchannels)
Definition: PtexUtils.h:167
DataType
Type of data stored in texture file.
Definition: Ptexture.h:72
MeshType
Type of base mesh for which the textures are defined.
Definition: Ptexture.h:66
BorderMode
How to handle mesh border when filtering.
Definition: Ptexture.h:86
EdgeFilterMode
How to handle transformation across edges when filtering.
Definition: Ptexture.h:80
uint16_t edgefiltermode
Definition: PtexIO.h:68
uint16_t vbordermode
Definition: PtexIO.h:67
uint16_t ubordermode
Definition: PtexIO.h:65
uint32_t blocksize() const
Definition: PtexIO.h:85
Definition: PtexIO.h:44
uint16_t nlevels
Definition: PtexIO.h:51
uint16_t nchannels
Definition: PtexIO.h:50
uint32_t meshtype
Definition: PtexIO.h:47
uint32_t datatype
Definition: PtexIO.h:48
int32_t alphachan
Definition: PtexIO.h:49
uint32_t nfaces
Definition: PtexIO.h:52
LargeMetaData * lmdData
Definition: PtexReader.h:293
Get most commonly used info in a single call for convenience / efficiency.
Definition: Ptexture.h:489
BorderMode uBorderMode
Definition: Ptexture.h:492
BorderMode vBorderMode
Definition: Ptexture.h:493
EdgeFilterMode edgeFilterMode
Definition: Ptexture.h:494
DataType dataType
Definition: Ptexture.h:491
MeshType meshType
Definition: Ptexture.h:490
Information about a face, as stored in the Ptex file header.
Definition: Ptexture.h:232
Pixel resolution of a given texture.
Definition: Ptexture.h:159