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);
85 info.alphaChannel = _header.alphachan;
86 info.numChannels = _header.nchannels;
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
PTEX_INLINE T AtomicAdd(volatile T *target, T value)
PTEX_INLINE T AtomicIncrement(volatile T *target)
#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
Per-face texture data accessor.
Definition Ptexture.h:409
Custom handler interface for intercepting and redirecting Ptex input stream calls.
Definition Ptexture.h:628
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)
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
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)
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)
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)
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
friend class PtexReader
Definition PtexReader.h:494
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
Definition PtexReader.h:482
void readTile(int tile, FaceData *&data)
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()
ReductionMap _reductions
Definition PtexReader.h:703
bool reopenFP()
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)
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()
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 .
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
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()
bool _needToOpen
Definition PtexReader.h:651
virtual Ptex::BorderMode uBorderMode()
Mode for filtering texture access beyond mesh border.
Definition PtexReader.h:93
void readConstData()
virtual PtexMetaData * getMetaData()
Access meta data.
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.
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)
PtexHashMap< ReductionKey, FaceData * > ReductionMap
Definition PtexReader.h:702
PtexReader(bool premultiply, PtexInputHandler *inputHandler, PtexErrorHandler *errorHandler)
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.
FilePos _metadatapos
Definition PtexReader.h:662
void readLargeMetaDataHeaders(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
void closeFP()
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)
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
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)
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)
void getCompressedData(int faceid, int level, FaceDataHeader &fdh, std::vector< std::byte > &data)
void readMetaData()
void logBlockRead()
Definition PtexReader.h:74
void logOpen()
Definition PtexReader.h:73
void readLevel(int levelid, Level *&level)
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)
const LevelInfo & levelinfo(int level) const
Definition PtexReader.h:121
bool tryClose()
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
uint32_t blocksize() const
Definition PtexIO.h:85
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