Ptex
Ptexture.h
Go to the documentation of this file.
1 #ifndef Ptexture_h
2 #define Ptexture_h
3 
4 /*
5 PTEX SOFTWARE
6 Copyright 2014 Disney Enterprises, Inc. All rights reserved
7 
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are
10 met:
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 
25 Disclaimer: THIS SOFTWARE IS PROVIDED BY WALT DISNEY PICTURES AND
26 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
27 BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
28 FOR A PARTICULAR PURPOSE, NONINFRINGEMENT AND TITLE ARE DISCLAIMED.
29 IN NO EVENT SHALL WALT DISNEY PICTURES, THE COPYRIGHT HOLDER OR
30 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND BASED ON ANY
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
37 */
38 
44 #include "PtexExports.h"
45 #include "PtexInt.h"
46 #include "PtexVersion.h"
47 
48 #include <ostream>
49 
50 #if !defined(PTEX_PLATFORM_WINDOWS)
51 # ifndef DOXYGEN
52 # define PTEX_USE_STDSTRING
53 # endif
54 #endif
55 
56 #ifdef DOXYGEN
58 namespace Ptex {
59 #else
61 #endif
62 
66 enum MeshType {
68  mt_quad
69  };
70 
72 enum DataType {
76  dt_float
77 };
78 
82  efm_tanvec
83 };
84 
86 enum BorderMode {
89  m_periodic
90 };
91 
94 enum EdgeId {
98  e_left
99 };
100 
108  mdt_double
109 };
110 
112 PTEXAPI const char* MeshTypeName(MeshType mt);
113 
115 PTEXAPI const char* DataTypeName(DataType dt);
116 
119 
122 
124 PTEXAPI const char* EdgeIdName(EdgeId eid);
125 
128 
130 inline int DataSize(DataType dt) {
131  static const int sizes[] = { 1,2,2,4 };
132  return sizes[dt];
133 }
134 
136 inline float OneValue(DataType dt) {
137  static const float one[] = { 255.f, 65535.f, 1.f, 1.f };
138  return one[dt];
139 }
140 
142 inline float OneValueInv(DataType dt) {
143  static const float one[] = { 1.f/255.f, 1.f/65535.f, 1.f, 1.f };
144  return one[dt];
145 }
146 
148 PTEXAPI void ConvertToFloat(float* dst, const void* src,
149  Ptex::DataType dt, int numChannels);
150 
152 PTEXAPI void ConvertFromFloat(void* dst, const float* src,
153  Ptex::DataType dt, int numChannels);
154 
159 struct Res {
160  int8_t ulog2;
161  int8_t vlog2;
162 
164  Res() : ulog2(0), vlog2(0) {}
165 
167  Res(int8_t ulog2_, int8_t vlog2_) : ulog2(ulog2_), vlog2(vlog2_) {}
168 
170  Res(uint16_t value) : ulog2(int8_t(value&0xff)), vlog2(int8_t((value>>8)&0xff)) {}
171 
173  int u() const { return 1<<(unsigned)ulog2; }
174 
176  int v() const { return 1<<(unsigned)vlog2; }
177 
179  uint16_t val() const { return uint16_t(ulog2 | (vlog2<<8)); }
180 
182  int size() const { return u() * v(); }
183 
185  bool operator==(const Res& r) const { return r.ulog2 == ulog2 && r.vlog2 == vlog2; }
186 
188  bool operator!=(const Res& r) const { return !(r==*this); }
189 
191  bool operator>=(const Res& r) const { return ulog2 >= r.ulog2 && vlog2 >= r.vlog2; }
192 
194  Res swappeduv() const { return Res(vlog2, ulog2); }
195 
197  void swapuv() { *this = swappeduv(); }
198 
200  void clamp(const Res& r) {
201  if (ulog2 > r.ulog2) ulog2 = r.ulog2;
202  if (vlog2 > r.vlog2) vlog2 = r.vlog2;
203  }
204 
206  int ntilesu(Res tileres) const { return 1<<(ulog2-tileres.ulog2); }
207 
209  int ntilesv(Res tileres) const { return 1<<(vlog2-tileres.vlog2); }
210 
212  int ntiles(Res tileres) const { return ntilesu(tileres) * ntilesv(tileres); }
213 };
214 
229 struct FaceInfo {
231  uint8_t adjedges;
232  uint8_t flags;
233  int32_t adjfaces[4];
234 
236  FaceInfo() : res(), adjedges(0), flags(0)
237  {
238  adjfaces[0] = adjfaces[1] = adjfaces[2] = adjfaces[3] = -1;
239  }
240 
242  FaceInfo(Res res_) : res(res_), adjedges(0), flags(0)
243  {
244  adjfaces[0] = adjfaces[1] = adjfaces[2] = adjfaces[3] = -1;
245  }
246 
248  FaceInfo(Res res_, int adjfaces_[4], int adjedges_[4], bool isSubface_=false)
249  : res(res_), flags(isSubface_ ? flag_subface : 0)
250  {
251  setadjfaces(adjfaces_[0], adjfaces_[1], adjfaces_[2], adjfaces_[3]);
252  setadjedges(adjedges_[0], adjedges_[1], adjedges_[2], adjedges_[3]);
253  }
254 
256  EdgeId adjedge(int eid) const { return EdgeId((adjedges >> (2*eid)) & 3); }
257 
259  int adjface(int eid) const { return adjfaces[eid]; }
260 
262  bool isConstant() const { return (flags & flag_constant) != 0; }
263 
265  bool isNeighborhoodConstant() const { return (flags & flag_nbconstant) != 0; }
266 
268  bool hasEdits() const { return (flags & flag_hasedits) != 0; }
269 
271  bool isSubface() const { return (flags & flag_subface) != 0; }
272 
274  void setadjfaces(int f0, int f1, int f2, int f3)
275  { adjfaces[0] = f0, adjfaces[1] = f1, adjfaces[2] = f2; adjfaces[3] = f3; }
276 
278  void setadjedges(int e0, int e1, int e2, int e3)
279  { adjedges = (uint8_t)((e0&3) | ((e1&3)<<2) | ((e2&3)<<4) | ((e3&3)<<6)); }
280 
283 };
284 
285 
292 #ifdef PTEX_USE_STDSTRING
293 typedef std::string String;
294 #else
295 class String
296 {
297 public:
298  String() : _str(0) {}
299  String(const String& str) : _str(0) { *this = str; }
300  PTEXAPI ~String();
301  PTEXAPI String& operator=(const char* str);
302  String& operator=(const String& str) { *this = str._str; return *this; }
303  String& operator=(const std::string& str) { *this = str.c_str(); return *this; }
304  const char* c_str() const { return _str ? _str : ""; }
305  bool empty() const { return _str == 0 || _str[0] == '\0'; }
306 
307 private:
308  char* _str;
309 };
310 #endif
311 
313 #ifndef PTEX_USE_STDSTRING
314 PTEXAPI std::ostream& operator << (std::ostream& stream, const Ptex::String& str);
315 #endif
316 
317 
318 #ifdef DOXYGEN
319 } // end namespace Ptex
320 #endif
321 
329  protected:
331  virtual ~PtexMetaData() {}
332 
333  public:
335  virtual void release() = 0;
336 
338  virtual int numKeys() = 0;
339 
341  virtual void getKey(int index, const char*& key, Ptex::MetaDataType& type) = 0;
342 
344  virtual bool findKey(const char* key, int& index, Ptex::MetaDataType& type) = 0;
345 
348  virtual void getValue(const char* key, const char*& value) = 0;
349 
352  virtual void getValue(int index, const char*& value) = 0;
353 
356  virtual void getValue(const char* key, const int8_t*& value, int& count) = 0;
357 
360  virtual void getValue(int index, const int8_t*& value, int& count) = 0;
361 
364  virtual void getValue(const char* key, const int16_t*& value, int& count) = 0;
365 
368  virtual void getValue(int index, const int16_t*& value, int& count) = 0;
369 
372  virtual void getValue(const char* key, const int32_t*& value, int& count) = 0;
373 
376  virtual void getValue(int index, const int32_t*& value, int& count) = 0;
377 
380  virtual void getValue(const char* key, const float*& value, int& count) = 0;
381 
384  virtual void getValue(int index, const float*& value, int& count) = 0;
385 
388  virtual void getValue(const char* key, const double*& value, int& count) = 0;
389 
392  virtual void getValue(int index, const double*& value, int& count) = 0;
393 };
394 
395 
407  protected:
409  virtual ~PtexFaceData() {}
410 
411  public:
413  virtual void release() = 0;
414 
416  virtual bool isConstant() = 0;
417 
421  virtual Ptex::Res res() = 0;
422 
426  virtual void getPixel(int u, int v, void* result) = 0;
427 
434  virtual void* getData() = 0;
435 
438  virtual bool isTiled() = 0;
439 
441  virtual Ptex::Res tileRes() = 0;
442 
444  virtual PtexFaceData* getTile(int tile) = 0;
445 };
446 
447 
457 class PtexTexture {
458  protected:
460  virtual ~PtexTexture() {}
461 
462  public:
474  PTEXAPI static PtexTexture* open(const char* path, Ptex::String& error, bool premultiply=0);
475 
476 
478  virtual void release() = 0;
479 
483  virtual const char* path() = 0;
484 
486  struct Info {
494  int numFaces;
495  };
496  virtual Info getInfo() = 0;
497 
499  virtual Ptex::MeshType meshType() = 0;
500 
502  virtual Ptex::DataType dataType() = 0;
503 
506 
509 
512 
516  virtual int alphaChannel() = 0;
517 
519  virtual int numChannels() = 0;
520 
522  virtual int numFaces() = 0;
523 
525  virtual bool hasEdits() = 0;
526 
528  virtual bool hasMipMaps() = 0;
529 
531  virtual PtexMetaData* getMetaData() = 0;
532 
534  virtual const Ptex::FaceInfo& getFaceInfo(int faceid) = 0;
535 
551  virtual void getData(int faceid, void* buffer, int stride) = 0;
552 
564  virtual void getData(int faceid, void* buffer, int stride, Ptex::Res res) = 0;
565 
567  virtual PtexFaceData* getData(int faceid) = 0;
568 
578  virtual PtexFaceData* getData(int faceid, Ptex::Res res) = 0;
579 
592  virtual void getPixel(int faceid, int u, int v,
593  float* result, int firstchan, int nchannels) = 0;
594 
606  virtual void getPixel(int faceid, int u, int v,
607  float* result, int firstchan, int nchannels,
608  Ptex::Res res) = 0;
609 };
610 
611 
620  protected:
621  virtual ~PtexInputHandler() {}
622 
623  public:
624  typedef void* Handle;
625 
630  virtual Handle open(const char* path) = 0;
631 
633  virtual void seek(Handle handle, int64_t pos) = 0;
634 
640  virtual size_t read(void* buffer, size_t size, Handle handle) = 0;
641 
644  virtual bool close(Handle handle) = 0;
645 
647  virtual const char* lastError() = 0;
648 };
649 
650 
659  protected:
660  virtual ~PtexErrorHandler() {}
661 
662  public:
663  virtual void reportError(const char* error) = 0;
664 };
665 
666 
684 class PtexCache {
685  protected:
687  virtual ~PtexCache() {}
688 
689  public:
711  PTEXAPI static PtexCache* create(int maxFiles,
712  size_t maxMem,
713  bool premultiply=false,
714  PtexInputHandler* inputHandler=0,
715  PtexErrorHandler* errorHandler=0);
716 
718  virtual void release() = 0;
719 
725  virtual void setSearchPath(const char* path) = 0;
726 
728  virtual const char* getSearchPath() = 0;
729 
757  virtual PtexTexture* get(const char* path, Ptex::String& error) = 0;
758 
764  virtual void purge(PtexTexture* texture) = 0;
765 
771  virtual void purge(const char* path) = 0;
772 
777  virtual void purgeAll() = 0;
778 
779  struct Stats {
780  uint64_t memUsed;
781  uint64_t peakMemUsed;
782  uint64_t filesOpen;
783  uint64_t peakFilesOpen;
784  uint64_t filesAccessed;
785  uint64_t fileReopens;
786  uint64_t blockReads;
787  };
788 
790  virtual void getStats(Stats& stats) = 0;
791 };
792 
793 
810 class PtexWriter {
811  protected:
813  virtual ~PtexWriter() {}
814 
815  public:
826  PTEXAPI
827  static PtexWriter* open(const char* path,
829  int nchannels, int alphachan, int nfaces,
830  Ptex::String& error, bool genmipmaps=true);
831 
849  PTEXAPI
850  static PtexWriter* edit(const char* path, bool incremental,
852  int nchannels, int alphachan, int nfaces,
853  Ptex::String& error, bool genmipmaps=true);
854 
863  PTEXAPI
864  static bool applyEdits(const char* path, Ptex::String& error);
865 
867  virtual void release() = 0;
868 
870  virtual void setBorderModes(Ptex::BorderMode uBorderMode, Ptex::BorderMode vBorderMode) = 0;
871 
873  virtual void setEdgeFilterMode(Ptex::EdgeFilterMode edgeFilterMode) = 0;
874 
876  virtual void writeMeta(const char* key, const char* string) = 0;
877 
879  virtual void writeMeta(const char* key, const int8_t* value, int count) = 0;
880 
882  virtual void writeMeta(const char* key, const int16_t* value, int count) = 0;
883 
885  virtual void writeMeta(const char* key, const int32_t* value, int count) = 0;
886 
888  virtual void writeMeta(const char* key, const float* value, int count) = 0;
889 
891  virtual void writeMeta(const char* key, const double* value, int count) = 0;
892 
894  virtual void writeMeta(PtexMetaData* data) = 0;
895 
907  virtual bool writeFace(int faceid, const Ptex::FaceInfo& info, const void* data, int stride=0) = 0;
908 
914  virtual bool writeConstantFace(int faceid, const Ptex::FaceInfo& info, const void* data) = 0;
915 
919  virtual bool close(Ptex::String& error) = 0;
920 
921 #if NEW_API
922  virtual bool writeFaceReduction(int faceid, const Ptex::Res& res, const void* data, int stride=0) = 0;
923  virtual bool writeConstantFaceReduction(int faceid, const Ptex::Res& res, const void* data) = 0;
924 #endif
925 };
926 
927 
937 class PtexFilter {
938  protected:
940  virtual ~PtexFilter() {}
941 
942  public:
944  enum FilterType {
952  f_mitchell
953  };
954 
956  struct Options {
959  bool lerp;
960  float sharpness;
961  bool noedgeblend;
962 
964  Options(FilterType filter_=f_box, bool lerp_=0, float sharpness_=0, bool noedgeblend_=0) :
965  __structSize(sizeof(Options)),
966  filter(filter_), lerp(lerp_), sharpness(sharpness_), noedgeblend(noedgeblend_) {}
967  };
968 
969  /* Construct a filter for the given texture.
970  */
971  PTEXAPI static PtexFilter* getFilter(PtexTexture* tx, const Options& opts);
972 
974  virtual void release() = 0;
975 
997  virtual void eval(float* result, int firstchan, int nchannels,
998  int faceid, float u, float v, float uw1, float vw1, float uw2, float vw2,
999  float width=1, float blur=0) = 0;
1000 };
1001 
1002 
1032 template <class T> class PtexPtr {
1033  T* _ptr;
1034  public:
1036  PtexPtr(T* ptr=0) : _ptr(ptr) {}
1037 
1039  ~PtexPtr() { if (_ptr) _ptr->release(); }
1040 
1042  operator T* () const { return _ptr; }
1043 
1045  T* operator-> () const { return _ptr; }
1046 
1048  T* get() const { return _ptr; }
1049 
1051  void swap(PtexPtr& p)
1052  {
1053  T* tmp = p._ptr;
1054  p._ptr = _ptr;
1055  _ptr = tmp;
1056  }
1057 
1059  void reset(T* ptr=0) {
1060  if (_ptr) _ptr->release();
1061  _ptr = ptr;
1062  }
1063 
1064  private:
1066  PtexPtr(const PtexPtr& p);
1067 
1070 };
1071 
1072 #ifndef DOXYGEN
1073 namespace PtexUtils {}
1074 
1076 
1077 using Ptex::PtexMetaData;
1078 using Ptex::PtexFaceData;
1079 using Ptex::PtexTexture;
1080 using Ptex::PtexInputHandler;
1081 using Ptex::PtexErrorHandler;
1082 using Ptex::PtexCache;
1083 using Ptex::PtexWriter;
1084 using Ptex::PtexFilter;
1085 using Ptex::PtexPtr;
1086 namespace PtexUtils = Ptex::PtexUtils;
1087 
1088 #endif
1089 #endif
Definitions related to exported Ptex API symbol visibility.
#define PTEXAPI
Definition: PtexExports.h:60
Portable fixed-width integer types.
std::ostream & operator<<(std::ostream &stream, const String &str)
Definition: PtexUtils.cpp:692
#define PTEX_NAMESPACE_END
Definition: PtexVersion.h:62
File-handle and memory cache for reading ptex files.
Definition: Ptexture.h:684
virtual void getStats(Stats &stats)=0
Get stats.
virtual const char * getSearchPath()=0
Query the search path.
virtual void release()=0
Release PtexCache. Cache will be immediately destroyed and all resources will be released.
virtual void purge(PtexTexture *texture)=0
Remove a texture file from the cache.
virtual PtexTexture * get(const char *path, Ptex::String &error)=0
Access a texture.
static PtexCache * create(int maxFiles, size_t maxMem, bool premultiply=false, PtexInputHandler *inputHandler=0, PtexErrorHandler *errorHandler=0)
Create a cache with the specified limits.
Definition: PtexCache.cpp:177
virtual void setSearchPath(const char *path)=0
Set a search path for finding textures.
virtual ~PtexCache()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:687
virtual void purgeAll()=0
Remove all texture files from the cache.
virtual void purge(const char *path)=0
Remove a texture file from the cache by pathname.
Custom handler interface redirecting Ptex error messages.
Definition: Ptexture.h:658
virtual void reportError(const char *error)=0
virtual ~PtexErrorHandler()
Definition: Ptexture.h:660
Per-face texture data accessor.
Definition: Ptexture.h:406
virtual bool isTiled()=0
True if this data block is tiled.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual void * getData()=0
Access the data from this data block.
virtual void getPixel(int u, int v, void *result)=0
Read a single texel from the data block.
virtual PtexFaceData * getTile(int tile)=0
Access a tile from the data block.
virtual Ptex::Res tileRes()=0
Resolution of each tile in this data block.
virtual bool isConstant()=0
True if this data block is constant.
virtual ~PtexFaceData()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:409
virtual Ptex::Res res()=0
Resolution of the texture held by this data block.
Interface for filtered sampling of ptex data files.
Definition: Ptexture.h:937
static PtexFilter * getFilter(PtexTexture *tx, const Options &opts)
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual ~PtexFilter()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:940
virtual void eval(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)=0
Apply filter to a ptex data file.
FilterType
Filter types.
Definition: Ptexture.h:944
@ f_bicubic
General bi-cubic filter (uses sharpness option)
Definition: Ptexture.h:949
@ f_bspline
BSpline (equivalent to bi-cubic w/ sharpness=0)
Definition: Ptexture.h:950
@ f_bilinear
Bi-linear interpolation.
Definition: Ptexture.h:946
@ f_catmullrom
Catmull-Rom (equivalent to bi-cubic w/ sharpness=1)
Definition: Ptexture.h:951
@ f_mitchell
Mitchell (equivalent to bi-cubic w/ sharpness=2/3)
Definition: Ptexture.h:952
@ f_box
Box filter.
Definition: Ptexture.h:947
@ f_gaussian
Gaussian filter.
Definition: Ptexture.h:948
@ f_point
Point-sampled (no filtering)
Definition: Ptexture.h:945
Custom handler interface for intercepting and redirecting Ptex input stream calls.
Definition: Ptexture.h:619
virtual void seek(Handle handle, int64_t pos)=0
Seek to an absolute byte position in the input stream.
virtual ~PtexInputHandler()
Definition: Ptexture.h:621
virtual size_t read(void *buffer, size_t size, Handle handle)=0
Read a number of bytes from the file.
virtual const char * lastError()=0
Return the last error message encountered.
virtual Handle open(const char *path)=0
Open a file in read mode.
virtual bool close(Handle handle)=0
Close a file.
Meta data accessor.
Definition: Ptexture.h:328
virtual void getValue(int index, const int8_t *&value, int &count)=0
Query the value of a given meta data entry by index.
virtual void getValue(int index, const int32_t *&value, int &count)=0
Query the value of a given meta data entry by index.
virtual void getValue(const char *key, const double *&value, int &count)=0
Query the value of a given meta data entry.
virtual int numKeys()=0
Query number of meta data entries stored in file.
virtual ~PtexMetaData()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:331
virtual void getValue(const char *key, const int8_t *&value, int &count)=0
Query the value of a given meta data entry.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual void getValue(int index, const double *&value, int &count)=0
Query the value of a given meta data entry by index.
virtual void getValue(const char *key, const int32_t *&value, int &count)=0
Query the value of a given meta data entry.
virtual bool findKey(const char *key, int &index, Ptex::MetaDataType &type)=0
Query the index and type of a meta data entry by name.
virtual void getValue(int index, const int16_t *&value, int &count)=0
Query the value of a given meta data entry by index.
virtual void getValue(const char *key, const float *&value, int &count)=0
Query the value of a given meta data entry.
virtual void getValue(int index, const float *&value, int &count)=0
Query the value of a given meta data entry by index.
virtual void getValue(const char *key, const char *&value)=0
Query the value of a given meta data entry.
virtual void getValue(int index, const char *&value)=0
Query the value of a given meta data entry by index.
virtual void getKey(int index, const char *&key, Ptex::MetaDataType &type)=0
Query the name and type of a meta data entry.
virtual void getValue(const char *key, const int16_t *&value, int &count)=0
Query the value of a given meta data entry.
Smart-pointer for acquiring and releasing API objects.
Definition: Ptexture.h:1032
T * operator->() const
Access members of pointer.
Definition: Ptexture.h:1045
PtexPtr(const PtexPtr &p)
Copying prohibited.
T * get() const
Get pointer value.
Definition: Ptexture.h:1048
PtexPtr(T *ptr=0)
Constructor.
Definition: Ptexture.h:1036
void reset(T *ptr=0)
Deallocate object pointed to, and optionally set to new value.
Definition: Ptexture.h:1059
void operator=(PtexPtr &p)
Assignment prohibited.
~PtexPtr()
Destructor, calls ptr->release().
Definition: Ptexture.h:1039
void swap(PtexPtr &p)
Swap pointer values.
Definition: Ptexture.h:1051
T * _ptr
Definition: Ptexture.h:1033
Interface for reading data from a ptex file.
Definition: Ptexture.h:457
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)=0
Access resolution and adjacency information about a face.
virtual void getData(int faceid, void *buffer, int stride)=0
Access texture data for a face at highest-resolution.
virtual const char * path()=0
Path that file was opened with.
virtual Ptex::MeshType meshType()=0
Type of mesh for which texture data is defined.
virtual Ptex::BorderMode uBorderMode()=0
Mode for filtering texture access beyond mesh border.
virtual ~PtexTexture()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:460
virtual PtexMetaData * getMetaData()=0
Access meta data.
virtual bool hasMipMaps()=0
True if the file has mipmaps.
virtual Info getInfo()=0
virtual int numFaces()=0
Number of faces stored in file.
virtual Ptex::DataType dataType()=0
Type of data stored in file.
virtual void getData(int faceid, void *buffer, int stride, Ptex::Res res)=0
Access texture data for a face at a specific resolution.
virtual int alphaChannel()=0
Index of alpha channel (if any).
virtual Ptex::EdgeFilterMode edgeFilterMode()=0
Mode for filtering textures across edges.
static PtexTexture * open(const char *path, Ptex::String &error, bool premultiply=0)
Open a ptex file for reading.
Definition: PtexReader.cpp:59
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 .
virtual bool hasEdits()=0
True if the file has edit blocks.
virtual Ptex::BorderMode vBorderMode()=0
Mode for filtering texture access beyond mesh border.
virtual PtexFaceData * getData(int faceid, Ptex::Res res)=0
Access texture data for a face at a specific resolution as stored on disk.
virtual int numChannels()=0
Number of channels stored in file.
virtual void getPixel(int faceid, int u, int v, float *result, int firstchan, int nchannels, Ptex::Res res)=0
Access a single texel for a face at a particular resolution.
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual PtexFaceData * getData(int faceid)=0
Access texture data for a face at highest-resolution as stored on disk.
Interface for writing data to a ptex file.
Definition: Ptexture.h:810
virtual void setBorderModes(Ptex::BorderMode uBorderMode, Ptex::BorderMode vBorderMode)=0
Set border modes.
virtual void writeMeta(const char *key, const float *value, int count)=0
Write an array of signed 32-bit floats as meta data.
virtual void setEdgeFilterMode(Ptex::EdgeFilterMode edgeFilterMode)=0
Set edge filter mode.
static PtexWriter * edit(const char *path, bool incremental, 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.
Definition: PtexWriter.cpp:186
virtual void release()=0
Release resources held by this pointer (pointer becomes invalid).
virtual void writeMeta(const char *key, const int8_t *value, int count)=0
Write an array of signed 8-bit integers as meta data.
static bool applyEdits(const char *path, Ptex::String &error)
Apply edits to a file.
Definition: PtexWriter.cpp:242
virtual void writeMeta(const char *key, const int32_t *value, int count)=0
Write an array of signed 32-bit integers as meta data.
virtual void writeMeta(const char *key, const int16_t *value, int count)=0
Write an array of signed 16-bit integers as meta data.
virtual void writeMeta(const char *key, const char *string)=0
Write a string as meta data.
virtual bool close(Ptex::String &error)=0
Close the file.
virtual void writeMeta(const char *key, const double *value, int count)=0
Write an array of signed 32-bit doubles as meta data.
virtual void writeMeta(PtexMetaData *data)=0
Copy meta data from an existing meta data block.
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.
Definition: PtexWriter.cpp:167
virtual bool writeConstantFace(int faceid, const Ptex::FaceInfo &info, const void *data)=0
Write constant texture data for a face.
virtual ~PtexWriter()
Destructor not for public use. Use release() instead.
Definition: Ptexture.h:813
virtual bool writeFace(int faceid, const Ptex::FaceInfo &info, const void *data, int stride=0)=0
Write texture data for a face.
Memory-managed string.
Definition: Ptexture.h:296
bool empty() const
Definition: Ptexture.h:305
const char * c_str() const
Definition: Ptexture.h:304
char * _str
Definition: Ptexture.h:308
String & operator=(const String &str)
Definition: Ptexture.h:302
String(const String &str)
Definition: Ptexture.h:299
String & operator=(const std::string &str)
Definition: Ptexture.h:303
String & operator=(const char *str)
Definition: PtexUtils.cpp:685
Common data structures and enums used throughout the API.
Definition: Ptexture.h:58
int DataSize(DataType dt)
Look up size of given data type (in bytes).
Definition: Ptexture.h:130
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.
EdgeId
Edge IDs used in adjacency data in the Ptex::FaceInfo struct.
Definition: Ptexture.h:94
@ e_right
Right edge, from UV (1,0) to (1,1)
Definition: Ptexture.h:96
@ e_top
Top edge, from UV (1,1) to (0,1)
Definition: Ptexture.h:97
@ e_left
Left edge, from UV (0,1) to (0,0)
Definition: Ptexture.h:98
@ e_bottom
Bottom edge, from UV (0,0) to (1,0)
Definition: Ptexture.h:95
const char * EdgeIdName(EdgeId eid)
Look up name of given edge ID.
const char * EdgeFilterModeName(EdgeFilterMode m)
Look up name of given edge filter mode.
DataType
Type of data stored in texture file.
Definition: Ptexture.h:72
@ dt_half
Half-precision (16-bit) floating point.
Definition: Ptexture.h:75
@ dt_float
Single-precision (32-bit) floating point.
Definition: Ptexture.h:76
@ dt_uint16
Unsigned, 16-bit integer.
Definition: Ptexture.h:74
@ dt_uint8
Unsigned, 8-bit integer.
Definition: Ptexture.h:73
float OneValue(DataType dt)
Look up value of given data type that corresponds to the normalized value of 1.0.
Definition: Ptexture.h:136
const char * MeshTypeName(MeshType mt)
Look up name of given mesh type.
MeshType
Type of base mesh for which the textures are defined.
Definition: Ptexture.h:66
@ mt_triangle
Mesh is triangle-based.
Definition: Ptexture.h:67
@ mt_quad
Mesh is quad-based.
Definition: Ptexture.h:68
BorderMode
How to handle mesh border when filtering.
Definition: Ptexture.h:86
@ m_black
texel beyond border are assumed to be black
Definition: Ptexture.h:88
@ m_clamp
texel access is clamped to border
Definition: Ptexture.h:87
@ m_periodic
texel access wraps to other side of face
Definition: Ptexture.h:89
const char * DataTypeName(DataType dt)
Look up name of given data type.
const char * BorderModeName(BorderMode m)
Look up name of given border mode.
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.
MetaDataType
Type of meta data entry.
Definition: Ptexture.h:102
@ mdt_string
Null-terminated string.
Definition: Ptexture.h:103
@ mdt_float
Single-precision (32-bit) floating point.
Definition: Ptexture.h:107
@ mdt_int32
Signed 32-bit integer.
Definition: Ptexture.h:106
@ mdt_int8
Signed 8-bit integer.
Definition: Ptexture.h:104
@ mdt_double
Double-precision (32-bit) floating point.
Definition: Ptexture.h:108
@ mdt_int16
Signed 16-bit integer.
Definition: Ptexture.h:105
EdgeFilterMode
How to handle transformation across edges when filtering.
Definition: Ptexture.h:80
@ efm_none
Don't do anything with the values.
Definition: Ptexture.h:81
@ efm_tanvec
Values are vectors in tangent space; rotate values.
Definition: Ptexture.h:82
const char * MetaDataTypeName(MetaDataType mdt)
Look up name of given meta data type.
float OneValueInv(DataType dt)
Lookup up inverse value of given data type that corresponds to the normalized value of 1....
Definition: Ptexture.h:142
uint64_t filesAccessed
Definition: Ptexture.h:784
uint64_t filesOpen
Definition: Ptexture.h:782
uint64_t peakFilesOpen
Definition: Ptexture.h:783
uint64_t fileReopens
Definition: Ptexture.h:785
uint64_t memUsed
Definition: Ptexture.h:780
uint64_t blockReads
Definition: Ptexture.h:786
uint64_t peakMemUsed
Definition: Ptexture.h:781
Choose filter options.
Definition: Ptexture.h:956
FilterType filter
Filter type.
Definition: Ptexture.h:958
int __structSize
(for internal use only)
Definition: Ptexture.h:957
float sharpness
Filter sharpness, 0..1 (for general bi-cubic filter only).
Definition: Ptexture.h:960
bool lerp
Interpolate between mipmap levels.
Definition: Ptexture.h:959
bool noedgeblend
Disable cross-face filtering. Useful for debugging or rendering on polys.
Definition: Ptexture.h:961
Options(FilterType filter_=f_box, bool lerp_=0, float sharpness_=0, bool noedgeblend_=0)
Constructor - sets defaults.
Definition: Ptexture.h:964
Get most commonly used info in a single call for convenience / efficiency.
Definition: Ptexture.h:486
BorderMode uBorderMode
Definition: Ptexture.h:489
BorderMode vBorderMode
Definition: Ptexture.h:490
EdgeFilterMode edgeFilterMode
Definition: Ptexture.h:491
DataType dataType
Definition: Ptexture.h:488
MeshType meshType
Definition: Ptexture.h:487
Information about a face, as stored in the Ptex file header.
Definition: Ptexture.h:229
void setadjedges(int e0, int e1, int e2, int e3)
Set the adjedges data.
Definition: Ptexture.h:278
bool hasEdits() const
Determine if face has edits in the file (by checking a flag).
Definition: Ptexture.h:268
bool isNeighborhoodConstant() const
Determine if neighborhood of face is constant (by checking a flag).
Definition: Ptexture.h:265
FaceInfo(Res res_)
Constructor.
Definition: Ptexture.h:242
bool isSubface() const
Determine if face is a subface (by checking a flag).
Definition: Ptexture.h:271
Res res
Resolution of face.
Definition: Ptexture.h:230
EdgeId adjedge(int eid) const
Access an adjacent edge id. The eid value must be 0..3.
Definition: Ptexture.h:256
bool isConstant() const
Determine if face is constant (by checking a flag).
Definition: Ptexture.h:262
uint8_t adjedges
Adjacent edges, 2 bits per edge.
Definition: Ptexture.h:231
int32_t adjfaces[4]
Adjacent faces (-1 == no adjacent face).
Definition: Ptexture.h:233
uint8_t flags
Flags.
Definition: Ptexture.h:232
FaceInfo(Res res_, int adjfaces_[4], int adjedges_[4], bool isSubface_=false)
Constructor.
Definition: Ptexture.h:248
FaceInfo()
Default constructor.
Definition: Ptexture.h:236
void setadjfaces(int f0, int f1, int f2, int f3)
Set the adjfaces data.
Definition: Ptexture.h:274
int adjface(int eid) const
Access an adjacent face id. The eid value must be 0..3.
Definition: Ptexture.h:259
Pixel resolution of a given texture.
Definition: Ptexture.h:159
bool operator>=(const Res &r) const
True if res is >= given res in both u and v directions.
Definition: Ptexture.h:191
int ntilesu(Res tileres) const
Determine the number of tiles in the u direction for the given tile res.
Definition: Ptexture.h:206
bool operator!=(const Res &r) const
Comparison operator.
Definition: Ptexture.h:188
Res(uint16_t value)
Constructor.
Definition: Ptexture.h:170
int8_t ulog2
log base 2 of u resolution, in texels
Definition: Ptexture.h:160
int ntilesv(Res tileres) const
Determine the number of tiles in the v direction for the given tile res.
Definition: Ptexture.h:209
Res()
Default constructor, sets res to 0 (1x1 texel).
Definition: Ptexture.h:164
uint16_t val() const
Resolution as a single 16-bit integer value.
Definition: Ptexture.h:179
int v() const
V resolution in texels.
Definition: Ptexture.h:176
Res swappeduv() const
Get value of resolution with u and v swapped.
Definition: Ptexture.h:194
int size() const
Total size of specified texture in texels (u * v).
Definition: Ptexture.h:182
Res(int8_t ulog2_, int8_t vlog2_)
Constructor.
Definition: Ptexture.h:167
void swapuv()
Swap the u and v resolution values in place.
Definition: Ptexture.h:197
void clamp(const Res &r)
Clamp the resolution value against the given value.
Definition: Ptexture.h:200
int ntiles(Res tileres) const
Determine the total number of tiles for the given tile res.
Definition: Ptexture.h:212
int u() const
U resolution in texels.
Definition: Ptexture.h:173
int8_t vlog2
log base 2 of v resolution, in texels
Definition: Ptexture.h:161
bool operator==(const Res &r) const
Comparison operator.
Definition: Ptexture.h:185