50 #if !defined(PTEX_PLATFORM_WINDOWS)
52 # define PTEX_USE_STDSTRING
131 static const int sizes[] = { 1,2,2,4 };
137 static const float one[] = { 255.f, 65535.f, 1.f, 1.f };
143 static const float one[] = { 1.f/255.f, 1.f/65535.f, 1.f, 1.f };
164 Res() : ulog2(0), vlog2(0) {}
167 Res(int8_t ulog2_, int8_t vlog2_) : ulog2(ulog2_), vlog2(vlog2_) {}
170 Res(uint16_t value) : ulog2(int8_t(value&0xff)), vlog2(int8_t((value>>8)&0xff)) {}
173 int u()
const {
return 1<<(unsigned)ulog2; }
176 int v()
const {
return 1<<(unsigned)vlog2; }
179 uint16_t
val()
const {
return uint16_t(ulog2 | (vlog2<<8)); }
185 size_t size64()
const {
return size_t(
u()) *
v(); }
241 adjfaces[0] = adjfaces[1] = adjfaces[2] = adjfaces[3] = -1;
247 adjfaces[0] = adjfaces[1] = adjfaces[2] = adjfaces[3] = -1;
251 FaceInfo(
Res res_,
int adjfaces_[4],
int adjedges_[4],
bool isSubface_=
false)
254 setadjfaces(adjfaces_[0], adjfaces_[1], adjfaces_[2], adjfaces_[3]);
255 setadjedges(adjedges_[0], adjedges_[1], adjedges_[2], adjedges_[3]);
262 int adjface(
int eid)
const {
return adjfaces[eid]; }
278 { adjfaces[0] = f0, adjfaces[1] = f1, adjfaces[2] = f2; adjfaces[3] = f3; }
282 { adjedges = (uint8_t)((e0&3) | ((e1&3)<<2) | ((e2&3)<<4) | ((e3&3)<<6)); }
295 #ifdef PTEX_USE_STDSTRING
296 typedef std::string String;
316 #ifndef PTEX_USE_STDSTRING
351 virtual void getValue(
const char* key,
const char*& value) = 0;
355 virtual void getValue(
int index,
const char*& value) = 0;
359 virtual void getValue(
const char* key,
const int8_t*& value,
int& count) = 0;
363 virtual void getValue(
int index,
const int8_t*& value,
int& count) = 0;
367 virtual void getValue(
const char* key,
const int16_t*& value,
int& count) = 0;
371 virtual void getValue(
int index,
const int16_t*& value,
int& count) = 0;
375 virtual void getValue(
const char* key,
const int32_t*& value,
int& count) = 0;
379 virtual void getValue(
int index,
const int32_t*& value,
int& count) = 0;
383 virtual void getValue(
const char* key,
const float*& value,
int& count) = 0;
387 virtual void getValue(
int index,
const float*& value,
int& count) = 0;
391 virtual void getValue(
const char* key,
const double*& value,
int& count) = 0;
395 virtual void getValue(
int index,
const double*& value,
int& count) = 0;
429 virtual void getPixel(
int u,
int v,
void* result) = 0;
486 virtual const char*
path() = 0;
554 virtual void getData(
int faceid,
void* buffer,
int stride) = 0;
567 virtual void getData(
int faceid,
void* buffer,
int stride,
Ptex::Res res) = 0;
595 virtual void getPixel(
int faceid,
int u,
int v,
596 float* result,
int firstchan,
int nchannels) = 0;
609 virtual void getPixel(
int faceid,
int u,
int v,
610 float* result,
int firstchan,
int nchannels,
639 virtual Handle
open(
const char* path) = 0;
642 virtual void seek(Handle handle, int64_t pos) = 0;
649 virtual size_t read(
void* buffer,
size_t size, Handle handle) = 0;
653 virtual bool close(Handle handle) = 0;
722 bool premultiply=
false,
780 virtual void purge(
const char* path) = 0;
838 int nchannels,
int alphachan,
int nfaces,
851 int nchannels,
int alphachan,
int nfaces,
864 int nchannels,
int alphachan,
int nfaces,
882 virtual void writeMeta(
const char* key,
const char*
string) = 0;
885 virtual void writeMeta(
const char* key,
const int8_t* value,
int count) = 0;
888 virtual void writeMeta(
const char* key,
const int16_t* value,
int count) = 0;
891 virtual void writeMeta(
const char* key,
const int32_t* value,
int count) = 0;
894 virtual void writeMeta(
const char* key,
const float* value,
int count) = 0;
897 virtual void writeMeta(
const char* key,
const double* value,
int count) = 0;
928 virtual bool writeFaceReduction(
int faceid,
const Ptex::Res& res,
const void* data,
int stride=0) = 0;
929 virtual bool writeConstantFaceReduction(
int faceid,
const Ptex::Res& res,
const void* data) = 0;
972 filter(filter_), lerp(lerp_), sharpness(sharpness_), noedgeblend(noedgeblend_) {}
1000 float* result,
int firstchan,
int nchannels,
1001 int faceid,
float u,
float v,
float uw1,
float vw1,
float uw2,
float vw2,
1002 float width=1,
float blur=0);
1032 virtual void eval(
float* result,
int firstchan,
int nchannels,
1033 int faceid,
float u,
float v,
float uw1,
float vw1,
float uw2,
float vw2,
1034 float width=1,
float blur=0) = 0;
1077 operator T* ()
const {
return _ptr; }
1095 if (_ptr) _ptr->release();
1112 using Ptex::PtexMetaData;
1113 using Ptex::PtexFaceData;
1114 using Ptex::PtexTexture;
1115 using Ptex::PtexInputHandler;
1116 using Ptex::PtexErrorHandler;
1117 using Ptex::PtexCache;
1118 using Ptex::PtexWriter;
1119 using Ptex::PtexFilter;
1120 using Ptex::PtexPtr;
EdgeFilterMode edgeFilterMode
PtexPtr(T *ptr=0)
Constructor.
virtual Ptex::BorderMode vBorderMode()=0
Mode for filtering texture access beyond mesh border.
int ntiles(Res tileres) const
Determine the total number of tiles for the given tile res.
int ntilesv(Res tileres) const
Determine the number of tiles in the v direction for the given tile res.
FaceInfo()
Default constructor.
int adjface(int eid) const
Access an adjacent face id. The eid value must be 0..3.
virtual int numChannels()=0
Number of channels stored in file.
Interface for writing data to a ptex file.
void setadjedges(int e0, int e1, int e2, int e3)
Set the adjedges data.
Half-precision (16-bit) floating point.
Don't do anything with the values.
virtual void setBorderModes(Ptex::BorderMode uBorderMode, Ptex::BorderMode vBorderMode)=0
Set border modes.
String & operator=(const char *str)
bool isConstant() const
Determine if face is constant (by checking a flag).
T * operator->() const
Access members of pointer.
bool operator>=(const Res &r) const
True if res is >= given res in both u and v directions.
virtual bool hasEdits()=0
Obsolete (returns false).
bool noedgeblend
Disable cross-face filtering. Useful for debugging or rendering on polys.
void reset(T *ptr=0)
Deallocate object pointed to, and optionally set to new value.
void ConvertFromFloat(void *dst, const float *src, Ptex::DataType dt, int numChannels)
Convert a number of data values from float to the given data type.
FaceInfo(Res res_)
Constructor.
texel access is clamped to border
Top edge, from UV (1,1) to (0,1)
virtual void * getConstantData(int faceid)=0
Access the constant (or average) data value for a given face.
static PtexFilter * getFilter(PtexTexture *tx, const Options &opts)
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
Res swappeduv() const
Get value of resolution with u and v swapped.
File-handle and memory cache for reading ptex files.
bool isNeighborhoodConstant() const
Determine if neighborhood of face is constant (by checking a flag).
Single-precision (32-bit) floating point.
const char * DataTypeName(DataType dt)
Look up name of given data type.
void operator=(PtexPtr &p)
Assignment prohibited.
virtual void getStats(Stats &stats)=0
Get stats.
EdgeFilterMode
How to handle transformation across edges when filtering.
Get most commonly used info in a single call for convenience / efficiency.
virtual void release()=0
Release PtexCache. Cache will be immediately destroyed and all resources will be released.
int v() const
V resolution in texels.
virtual int alphaChannel()=0
Index of alpha channel (if any).
virtual PtexMetaData * getMetaData()=0
Access meta data.
static PtexWriter * open(const char *path, Ptex::MeshType mt, Ptex::DataType dt, int nchannels, int alphachan, int nfaces, Ptex::String &error, bool genmipmaps=true)
Open a new texture file for writing.
texel beyond border are assumed to be black
virtual ~PtexFaceData()
Destructor not for public use. Use release() instead.
Double-precision (32-bit) floating point.
EdgeId
Edge IDs used in adjacency data in the Ptex::FaceInfo struct.
Values are vectors in tangent space; rotate values.
virtual void reportError(const char *error)=0
int32_t adjfaces[4]
Adjacent faces (-1 == no adjacent face).
virtual Ptex::MeshType meshType()=0
Type of mesh for which texture data is defined.
size_t size64() const
Total size of specified texture in texels (u * v), allowing arbitrarily large textures.
virtual Ptex::Res res()=0
Resolution of the texture held by this data block.
virtual ~PtexWriter()
Destructor not for public use. Use release() instead.
Per-face texture data accessor.
bool operator!=(const Res &r) const
Comparison operator.
virtual bool writeConstantFace(int faceid, const Ptex::FaceInfo &info, const void *data)=0
Write constant texture data for a face.
int u() const
U resolution in texels.
Custom handler interface redirecting Ptex error messages.
virtual void * getData()=0
Access the data from this data block.
int8_t vlog2
log base 2 of v resolution, in texels
static PtexTexture * open(const char *path, Ptex::String &error, bool premultiply=0)
Open a ptex file for reading.
virtual void writeMeta(const char *key, const char *string)=0
Write a string as meta data.
int ntilesu(Res tileres) const
Determine the number of tiles in the u direction for the given tile res.
virtual PtexFaceData * getTile(int tile)=0
Access a tile from the data block.
MeshType
Type of base mesh for which the textures are defined.
virtual void getData(int faceid, void *buffer, int stride)=0
Access texture data for a face at highest-resolution.
Unsigned, 16-bit integer.
bool isSubface() const
Determine if face is a subface (by checking a flag).
uint16_t val() const
Resolution as a single 16-bit integer value.
virtual bool hasMipMaps()=0
True if the file has mipmaps.
const char * EdgeIdName(EdgeId eid)
Look up name of given edge ID.
BorderMode
How to handle mesh border when filtering.
bool hasEdits() const
Obsolete (returns false).
String & operator=(const String &str)
Options(FilterType filter_=f_box, bool lerp_=0, float sharpness_=0, bool noedgeblend_=0)
Constructor - sets defaults.
virtual void purgeAll()=0
Remove all texture files from the cache.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual ~PtexFilter()
Destructor not for public use. Use release() instead.
virtual int numFaces()=0
Number of faces stored in file.
Common data structures and enums used throughout the API.
~PtexPtr()
Destructor, calls ptr->release().
virtual void setEdgeFilterMode(Ptex::EdgeFilterMode edgeFilterMode)=0
Set edge filter mode.
virtual bool writeFace(int faceid, const Ptex::FaceInfo &info, const void *data, int stride=0)=0
Write texture data for a face.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
static PtexWriter * edit(const char *path, Ptex::MeshType mt, Ptex::DataType dt, int nchannels, int alphachan, int nfaces, Ptex::String &error, bool genmipmaps=true)
Open an existing texture file for writing.
Mitchell (equivalent to bi-cubic w/ sharpness=2/3)
Point-sampled (no filtering)
EdgeId adjedge(int eid) const
Access an adjacent edge id. The eid value must be 0..3.
virtual ~PtexTexture()
Destructor not for public use. Use release() instead.
String(const String &str)
Right edge, from UV (1,0) to (1,1)
Bottom edge, from UV (0,0) to (1,0)
FilterType filter
Filter type.
FaceInfo(Res res_, int adjfaces_[4], int adjedges_[4], bool isSubface_=false)
Constructor.
int size() const
Total size of specified texture in texels (u * v). (deprecated, use size64)
void setadjfaces(int f0, int f1, int f2, int f3)
Set the adjfaces data.
String & operator=(const std::string &str)
float OneValueInv(DataType dt)
Lookup up inverse value of given data type that corresponds to the normalized value of 1...
Catmull-Rom (equivalent to bi-cubic w/ sharpness=1)
virtual Ptex::DataType dataType()=0
Type of data stored in file.
Res()
Default constructor, sets res to 0 (1x1 texel).
virtual const char * path()=0
Path that file was opened with.
void swapuv()
Swap the u and v resolution values in place.
BSpline (equivalent to bi-cubic w/ sharpness=0)
Res(int8_t ulog2_, int8_t vlog2_)
Constructor.
Smart-pointer for acquiring and releasing API objects.
virtual bool isTiled()=0
True if this data block is tiled.
virtual bool isConstant()=0
True if this data block is constant.
virtual Ptex::EdgeFilterMode edgeFilterMode()=0
Mode for filtering textures across edges.
int8_t ulog2
log base 2 of u resolution, in texels
virtual void getPixel(int u, int v, void *result)=0
Read a single texel from the data block.
const char * MeshTypeName(MeshType mt)
Look up name of given mesh type.
float sharpness
Filter sharpness, 0..1 (for general bi-cubic filter only).
static void eval(PtexTexture *tx, const Options &opts, float *result, int firstchan, int nchannels, int faceid, float u, float v, float uw1, float vw1, float uw2, float vw2, float width=1, float blur=0)
Interface for reading data from a ptex file.
static PtexCache * create(int maxFiles, size_t maxMem, bool premultiply=false, PtexInputHandler *inputHandler=0, PtexErrorHandler *errorHandler=0)
Create a cache with the specified limits.
texel access wraps to other side of face
static bool applyEdits(const char *path, Ptex::String &error)
Obsolete (returns true).
virtual ~PtexErrorHandler()
Pixel resolution of a given texture.
Left edge, from UV (0,1) to (0,0)
virtual void setSearchPath(const char *path)=0
Set a search path for finding textures.
virtual Ptex::BorderMode uBorderMode()=0
Mode for filtering texture access beyond mesh border.
virtual void getPixel(int faceid, int u, int v, float *result, int firstchan, int nchannels)=0
Access a single texel from the highest resolution texture .
Single-precision (32-bit) floating point.
int DataSize(DataType dt)
Look up size of given data type (in bytes).
Res res
Resolution of face.
uint8_t adjedges
Adjacent edges, 2 bits per edge.
MetaDataType
Type of meta data entry.
Definitions related to exported Ptex API symbol visibility.
virtual const char * getSearchPath()=0
Query the search path.
Information about a face, as stored in the Ptex file header.
virtual bool close(Ptex::String &error)=0
Close the file.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)=0
Access resolution and adjacency information about a face.
const char * BorderModeName(BorderMode m)
Look up name of given border mode.
DataType
Type of data stored in texture file.
Res(uint16_t value)
Constructor.
bool operator==(const Res &r) const
Comparison operator.
const char * c_str() const
float OneValue(DataType dt)
Look up value of given data type that corresponds to the normalized value of 1.0. ...
Portable fixed-width integer types.
#define PTEX_NAMESPACE_END
const char * EdgeFilterModeName(EdgeFilterMode m)
Look up name of given edge filter mode.
void swap(PtexPtr &p)
Swap pointer values.
std::ostream & operator<<(std::ostream &stream, const String &str)
void clamp(const Res &r)
Clamp the resolution value against the given value.
virtual ~PtexCache()
Destructor not for public use. Use release() instead.
int __structSize
(for internal use only)
bool lerp
Interpolate between mipmap levels.
void ConvertToFloat(float *dst, const void *src, Ptex::DataType dt, int numChannels)
Convert a number of data values from the given data type to float.
const char * MetaDataTypeName(MetaDataType mdt)
Look up name of given meta data type.
General bi-cubic filter (uses sharpness option)
Interface for filtered sampling of ptex data files.
virtual Ptex::Res tileRes()=0
Resolution of each tile in this data block.
virtual void purge(PtexTexture *texture)=0
Remove a texture file from the cache.