40 # if defined(_WIN32) || defined(_WINDOWS) || defined(_MSC_VER)
43 # define PTEXAPI __declspec(dllexport)
45 # define PTEXAPI __declspec(dllimport)
92 virtual const char*
path() {
return _path.c_str(); }
120 virtual void getData(
int faceid,
void* buffer,
int stride);
121 virtual void getData(
int faceid,
void* buffer,
int stride, Res res);
124 virtual void getPixel(
int faceid,
int u,
int v,
125 float* result,
int firstchan,
int nchannels);
126 virtual void getPixel(
int faceid,
int u,
int v,
127 float* result,
int firstchan,
int nchannels,
147 if (index < 0 || index >=
int(
_entries.size())) {
157 MetaMap::iterator iter =
_map.find(key);
158 if (iter==
_map.end()) {
162 index = iter->second.index;
163 type = iter->second.type;
167 virtual void getValue(
const char* key,
const char*& value)
171 if (!
findKey(key, index, type)) {
180 virtual void getValue(
int index,
const char*& value)
182 if (index < 0 || index >=
int(
_entries.size())) { value = 0;
return; }
191 if (index < 0 || index >=
int(
_entries.size())) {
197 if (e && e->
type == requestedType) {
198 value = (
const T*) e->
data;
201 else { value = 0; count = 0; }
210 getValue<T>(index, requestedType, value, count);
213 virtual void getValue(
const char* key,
const int8_t*& value,
int& count)
215 getValue<int8_t>(key,
mdt_int8, value, count);
218 virtual void getValue(
int index,
const int8_t*& value,
int& count)
220 getValue<int8_t>(index,
mdt_int8, value, count);
223 virtual void getValue(
const char* key,
const int16_t*& value,
int& count)
225 getValue<int16_t>(key,
mdt_int16, value, count);
228 virtual void getValue(
int index,
const int16_t*& value,
int& count)
230 getValue<int16_t>(index,
mdt_int16, value, count);
233 virtual void getValue(
const char* key,
const int32_t*& value,
int& count)
235 getValue<int32_t>(key,
mdt_int32, value, count);
238 virtual void getValue(
int index,
const int32_t*& value,
int& count)
240 getValue<int32_t>(index,
mdt_int32, value, count);
243 virtual void getValue(
const char* key,
const float*& value,
int& count)
245 getValue<float>(key,
mdt_float, value, count);
248 virtual void getValue(
int index,
const float*& value,
int& count)
250 getValue<float>(index,
mdt_float, value, count);
253 virtual void getValue(
const char* key,
const double*& value,
int& count)
255 getValue<double>(key,
mdt_double, value, count);
258 virtual void getValue(
int index,
const double*& value,
int& count)
260 getValue<double>(index,
mdt_double, value, count);
264 uint32_t datasize,
const void* data,
size_t& metaDataMemUsed)
267 e->
data =
new char[datasize];
268 memcpy(e->
data, data, datasize);
269 metaDataMemUsed += datasize;
273 uint32_t datasize,
FilePos filepos, uint32_t zipsize,
274 size_t& metaDataMemUsed)
293 :
_data(new char [size]) {}
333 std::pair<MetaMap::iterator,bool> result =
334 _map.insert(std::make_pair(std::string(key, keysize),
Entry()));
335 Entry* e = &result.first->second;
336 bool newentry = result.second;
346 e->
key = result.first->first.c_str();
350 metaDataMemUsed +=
sizeof(std::string) + keysize + 1 +
sizeof(
Entry);
457 virtual void getPixel(
int u,
int v,
void* result);
471 for (std::vector<FaceData*>::iterator i =
_tiles.begin(); i !=
_tiles.end(); ++i) {
511 std::vector<FaceDataHeader>
_fdh;
540 std::vector<FaceDataHeader>
fdh;
550 for (std::vector<FaceData*>::iterator i =
faces.begin(); i !=
faces.end(); ++i) {
556 return sizeof(*this) +
fdh.size() * (
sizeof(
fdh[0]) +
566 std::string msg = error;
567 msg +=
" PtexFile: ";
571 else std::cerr << msg;
588 bool readBlock(
void* data,
int size,
bool reportError=
true);
589 bool readZipBlock(
void* data,
int zipsize,
int unzipsize);
601 if (!face)
readFace(levelid, level, faceid, res);
608 void readLevel(
int levelid, Level*& level);
609 void readFace(
int levelid, Level* level,
int faceid, Res res);
625 FilePos* end = offsets + noffsets;
626 while (offsets != end) { *offsets++ = pos; pos += fdh->
blocksize(); fdh++; }
635 FILE* fp = fopen(
path,
"rb");
643 virtual void seek(
Handle handle, int64_t pos) { fseeko((FILE*)handle, pos, SEEK_SET); }
644 virtual size_t read(
void* bufferArg,
size_t size,
Handle handle) {
645 return fread(bufferArg, size, 1, (FILE*)handle) == 1 ? size : 0;
648 bool ok = handle && (fclose((FILE*)handle) == 0);
652 virtual const char*
lastError() {
return strerror(errno); }
708 :
_val( int64_t(faceid)<<32 | uint32_t(16777619*((res.val()<<16) ^ faceid)) ) {}
727 return uint32_t(
_val);
Contains PtexHashMap, a lightweight multi-threaded hash table.
#define PTEX_NAMESPACE_END
Public API classes for reading, writing, caching, and filtering Ptex files.
Custom handler interface redirecting Ptex error messages.
virtual void reportError(const char *error)=0
Per-face texture data accessor.
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
virtual bool isConstant()
True if this data block is constant.
virtual Ptex::Res res()
Resolution of the texture held by this data block.
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
virtual bool isTiled()
True if this data block is tiled.
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
virtual void * getData()
Access the data from this data block.
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
ConstDataPtr(void *data, int pixelsize)
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
ConstantFace(int pixelsize)
virtual bool isConstant()
True if this data block is constant.
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
ErrorFace(void *errorPixel, int pixelsize, bool deleteOnRelease)
virtual Ptex::Res res()
Resolution of the texture held by this data block.
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)=0
std::vector< FilePos > offsets
std::vector< FaceDataHeader > fdh
std::vector< FaceData * > faces
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
PackedFace(Res resArg, int pixelsize, int size)
virtual bool isTiled()
True if this data block is tiled.
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
virtual void * getData()
Access the data from this data block.
virtual bool isConstant()
True if this data block is constant.
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
ReductionKey(uint32_t faceid, Res res)
void move(volatile ReductionKey &key) volatile
bool matches(const ReductionKey &key) volatile
void copy(volatile ReductionKey &key) volatile
TiledFaceBase(PtexReader *reader, Res resArg, Res tileresArg)
size_t baseExtraMemUsed()
std::vector< FaceData * > _tiles
virtual bool isTiled()
True if this data block is tiled.
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
virtual void * getData()
Access the data from this data block.
virtual bool isConstant()
True if this data block is constant.
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
std::vector< FaceDataHeader > _fdh
TiledFace(PtexReader *reader, Res resArg, Res tileresArg, int levelid)
void readTile(int tile, FaceData *&data)
std::vector< FilePos > _offsets
TiledFaceBase * _parentface
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
PtexUtils::ReduceFn * _reducefn
TiledReducedFace(PtexReader *reader, Res resArg, Res tileresArg, TiledFaceBase *parentface, PtexUtils::ReduceFn reducefn)
DataType datatype() const
void readMetaDataBlock(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
virtual int numFaces()
Number of faces stored in file.
virtual Ptex::BorderMode vBorderMode()
Mode for filtering texture access beyond mesh border.
std::vector< FilePos > _levelpos
virtual void getPixel(int faceid, int u, int v, float *result, int firstchan, int nchannels)
Access a single texel from the highest resolution texture .
std::vector< FaceEdit > _faceedits
FaceData * errorData(bool deleteOnRelease=false)
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
void increaseMemUsed(size_t amount)
FaceData * getFace(int levelid, Level *level, int faceid, Res res)
virtual Ptex::BorderMode uBorderMode()
Mode for filtering texture access beyond mesh border.
void computeOffsets(FilePos pos, int noffsets, const FaceDataHeader *fdh, FilePos *offsets)
virtual const char * path()
Path that file was opened with.
virtual PtexMetaData * getMetaData()
Access meta data.
virtual int alphaChannel()
Index of alpha channel (if any).
virtual void getData(int faceid, void *buffer, int stride)
Access texture data for a face at highest-resolution.
std::vector< LevelInfo > _levelinfo
PtexHashMap< ReductionKey, FaceData * > ReductionMap
PtexReader(bool premultiply, PtexInputHandler *inputHandler, PtexErrorHandler *errorHandler)
virtual bool hasMipMaps()
True if the file has mipmaps.
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)
Access resolution and adjacency information about a face.
void readLargeMetaDataHeaders(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
bool pendingPurge() const
const Header & header() const
Level * getLevel(int levelid)
void readFace(int levelid, Level *level, int faceid, Res res)
virtual bool hasEdits()
True if the file has edit blocks.
std::vector< uint32_t > _rfaceids
std::vector< MetaEdit > _metaedits
DefaultInputHandler _defaultIo
const LevelInfo & levelinfo(int level) const
volatile size_t _blockReads
void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData *&face)
bool readBlock(void *data, int size, bool reportError=true)
std::vector< Level * > _levels
std::vector< FaceInfo > _faceinfo
virtual Ptex::MeshType meshType()
Type of mesh for which texture data is defined.
virtual Ptex::EdgeFilterMode edgeFilterMode()
Mode for filtering textures across edges.
PtexInputHandler::Handle _fp
bool readZipBlock(void *data, int zipsize, int unzipsize)
void readLevel(int levelid, Level *&level)
virtual Ptex::DataType dataType()
Type of data stored in file.
std::vector< char > _errorPixel
virtual int numChannels()
Number of channels stored in file.
const ExtHeader & extheader() const
bool open(const char *path, Ptex::String &error)
void setError(const char *error)
Interface for reading data from a ptex file.
void ReduceFn(const void *src, int sstride, int ures, int vres, void *dst, int dstride, DataType dt, int nchannels)
int DataSize(DataType dt)
Look up size of given data type (in bytes).
DataType
Type of data stored in texture file.
MeshType
Type of base mesh for which the textures are defined.
BorderMode
How to handle mesh border when filtering.
MetaDataType
Type of meta data entry.
@ mdt_string
Null-terminated string.
@ mdt_float
Single-precision (32-bit) floating point.
@ mdt_int32
Signed 32-bit integer.
@ mdt_int8
Signed 8-bit integer.
@ mdt_double
Double-precision (32-bit) floating point.
@ mdt_int16
Signed 16-bit integer.
EdgeFilterMode
How to handle transformation across edges when filtering.
Get most commonly used info in a single call for convenience / efficiency.
EdgeFilterMode edgeFilterMode
Information about a face, as stored in the Ptex file header.
Pixel resolution of a given texture.