Ptex
PtexUtils.h
Go to the documentation of this file.
1#ifndef PtexUtils_h
2#define PtexUtils_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
39#include <algorithm>
40#include <cmath>
41#include <cstring>
42#include "PtexExports.h"
43#include "Ptexture.h"
44#include "PtexHalf.h"
45
46#ifdef __SSE4_1__
47#include <smmintrin.h>
48#endif
49
50#include "PtexVersion.h"
51
53namespace PtexUtils {
54
55// (keeping these as aliases for code outside of the Ptex library that might have been using them)
56using std::abs;
57using std::min;
58using std::max;
59using std::clamp;
60using std::floor;
61using std::ceil;
62
63inline bool isPowerOfTwo(int x)
64{
65 return !(x&(x-1));
66}
67
68inline uint32_t ones(uint32_t x)
69{
70 // count number of ones
71 x = (x & 0x55555555) + ((x >> 1) & 0x55555555); // add pairs of bits
72 x = (x & 0x33333333) + ((x >> 2) & 0x33333333); // add bit pairs
73 x = (x & 0x0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f); // add nybbles
74 x += (x >> 8); // add bytes
75 x += (x >> 16); // add words
76 return(x & 0xff);
77}
78
79inline uint32_t floor_log2(uint32_t x)
80{
81 // floor(log2(n))
82 x |= (x >> 1);
83 x |= (x >> 2);
84 x |= (x >> 4);
85 x |= (x >> 8);
86 x |= (x >> 16);
87 return ones(x>>1);
88}
89
90inline uint32_t ceil_log2(uint32_t x)
91{
92 // ceil(log2(n))
93 bool isPow2 = isPowerOfTwo(x);
94 x |= (x >> 1);
95 x |= (x >> 2);
96 x |= (x >> 4);
97 x |= (x >> 8);
98 x |= (x >> 16);
99 return ones(x>>1) + !isPow2;
100}
101
102inline float reciprocalPow2(int power)
103{
104 // 1.0/pow(2,power)
105 int32_t i = (127-power)<<23;
106 float f;
107 memcpy(&f, &i, sizeof(f));
108 return f;
109}
110
111inline int calcResFromWidth(float w)
112{
113 // read exponent directly from float32 representation
114 // equiv to ceil(log2(1.0/w)) but much faster and no error
115 int32_t wi;
116 memcpy(&wi, &w, sizeof(wi));
117 int result = 127 - ((wi >> 23) & 0xff);
118 return result;
119}
120
121inline float smoothstep(float x, float a, float b)
122{
123 if ( x < a ) return 0;
124 if ( x >= b ) return 1;
125 x = (x - a)/(b - a);
126 return x*x * (3 - 2*x);
127}
128
129inline float qsmoothstep(float x, float a, float b)
130{
131 // quintic smoothstep (cubic is only C1)
132 if ( x < a ) return 0;
133 if ( x >= b ) return 1;
134 x = (x - a)/(b - a);
135 return x*x*x * (10 + x * (-15 + x*6));
136}
137
138template<typename T>
139inline T halve(T val) { return T(val>>1); }
140
141inline float halve(float val) { return 0.5f * val; }
142inline PtexHalf halve(PtexHalf val) { return 0.5f * val; }
143
144template<typename T>
145inline T quarter(T val) { return T(val>>2); }
146
147inline float quarter(float val) { return 0.25f * val; }
148inline PtexHalf quarter(PtexHalf val) { return 0.25f * val; }
149
151bool isConstant(const void* data, int stride, int ures, int vres, int pixelSize);
152
154void interleave(const void* src, int sstride, int ures, int vres,
155 void* dst, int dstride, DataType dt, int nchannels);
156
158void deinterleave(const void* src, int sstride, int ures, int vres,
159 void* dst, int dstride, DataType dt, int nchannels);
160
162void encodeDifference(void* data, size_t size, DataType dt);
163
165void decodeDifference(void* data, size_t size, DataType dt);
166
167typedef void ReduceFn(const void* src, int sstride, int ures, int vres,
168 void* dst, int dstride, DataType dt, int nchannels);
169
171void reduce(const void* src, int sstride, int ures, int vres,
172 void* dst, int dstride, DataType dt, int nchannels);
173
175void reduceu(const void* src, int sstride, int ures, int vres,
176 void* dst, int dstride, DataType dt, int nchannels);
177
179void reducev(const void* src, int sstride, int ures, int vres,
180 void* dst, int dstride, DataType dt, int nchannels);
181
183void reduceTri(const void* src, int sstride, int ures, int vres,
184 void* dst, int dstride, DataType dt, int nchannels);
185
187void average(const void* src, int sstride, int ures, int vres,
188 void* dst, DataType dt, int nchannels);
189
191void fill(const void* src, void* dst, int dstride,
192 int ures, int vres, int pixelsize);
193
195void copy(const void* src, int sstride, void* dst, int dstride,
196 int nrows, int rowlen);
197
199void blend(const void* src, float weight, void* dst, bool flip,
200 int rowlen, DataType dt, int nchannels);
201
203void multalpha(void* data, int npixels, DataType dt, int nchannels, int alphachan);
204
206void divalpha(void* data, int npixels, DataType dt, int nchannels, int alphachan);
207
208
210void genRfaceids(const FaceInfo* faces, int nfaces,
211 uint32_t* rfaceids, uint32_t* faceids);
212
213// fixed length vector accumulator: dst[i] += val[i] * weight
214template<typename T, int n>
215struct VecAccum {
217 void operator()(float* dst, const T* val, float weight)
218 {
219 *dst += (float)*val * weight;
220 // use template to unroll loop
221 VecAccum<T,n-1>()(dst+1, val+1, weight);
222 }
223};
224template<typename T>
225struct VecAccum<T,0> { void operator()(float*, const T*, float) {} };
226
227// variable length vector accumulator: dst[i] += val[i] * weight
228template<typename T>
229struct VecAccumN {
230 void operator()(float* dst, const T* val, int nchan, float weight)
231 {
232 for (int i = 0; i < nchan; i++) dst[i] += (float)val[i] * weight;
233 }
234};
235
236// fixed length vector multiplier: dst[i] += val[i] * weight
237template<typename T, int n>
238struct VecMult {
240 void operator()(float* dst, const T* val, float weight)
241 {
242 *dst = (float)*val * weight;
243 // use template to unroll loop
244 VecMult<T,n-1>()(dst+1, val+1, weight);
245 }
246};
247template<typename T>
248struct VecMult<T,0> { void operator()(float*, const T*, float) {} };
249
250// variable length vector multiplier: dst[i] = val[i] * weight
251template<typename T>
252struct VecMultN {
253 void operator()(float* dst, const T* val, int nchan, float weight)
254 {
255 for (int i = 0; i < nchan; i++) dst[i] = (float)val[i] * weight;
256 }
257};
258
259typedef void (*ApplyConstFn)(float weight, float* dst, void* data, int nChan);
261inline void applyConst(float weight, float* dst, void* data, Ptex::DataType dt, int nChan)
262{
263 // dispatch specialized apply function
264 ApplyConstFn fn = applyConstFunctions[((unsigned)nChan<=4)*nChan*4 + dt];
265 fn(weight, dst, data, nChan);
266}
267
268} // end namespace Utils
269
271
272#endif
Definitions related to exported Ptex API symbol visibility.
#define PTEXAPI
Definition PtexExports.h:60
Half-precision floating-point type.
#define PTEX_NAMESPACE_END
Definition PtexVersion.h:62
Public API classes for reading, writing, caching, and filtering Ptex files.
float reciprocalPow2(int power)
Definition PtexUtils.h:102
void decodeDifference(void *data, size_t size, DataType dt)
void genRfaceids(const FaceInfo *faces, int nfaces, uint32_t *rfaceids, uint32_t *faceids)
void reduceu(const void *src, int sstride, int uw, int vw, void *dst, int dstride, DataType dt, int nchan)
void applyConst(float weight, float *dst, void *data, Ptex::DataType dt, int nChan)
Definition PtexUtils.h:261
uint32_t ones(uint32_t x)
Definition PtexUtils.h:68
bool isConstant(const void *data, int stride, int ures, int vres, int pixelSize)
void divalpha(void *data, int npixels, DataType dt, int nchannels, int alphachan)
void reduce(const void *src, int sstride, int uw, int vw, void *dst, int dstride, DataType dt, int nchan)
void deinterleave(const void *src, int sstride, int uw, int vw, void *dst, int dstride, DataType dt, int nchan)
T quarter(T val)
Definition PtexUtils.h:145
void blend(const void *src, float weight, void *dst, bool flip, int rowlen, DataType dt, int nchan)
int calcResFromWidth(float w)
Definition PtexUtils.h:111
void encodeDifference(void *data, size_t size, DataType dt)
void reducev(const void *src, int sstride, int uw, int vw, void *dst, int dstride, DataType dt, int nchan)
void fill(const void *src, void *dst, int dstride, int ures, int vres, int pixelsize)
void reduceTri(const void *src, int sstride, int w, int, void *dst, int dstride, DataType dt, int nchan)
T halve(T val)
Definition PtexUtils.h:139
void copy(const void *src, int sstride, void *dst, int dstride, int vres, int rowlen)
float smoothstep(float x, float a, float b)
Definition PtexUtils.h:121
uint32_t floor_log2(uint32_t x)
Definition PtexUtils.h:79
void ReduceFn(const void *src, int sstride, int ures, int vres, void *dst, int dstride, DataType dt, int nchannels)
Definition PtexUtils.h:167
void multalpha(void *data, int npixels, DataType dt, int nchannels, int alphachan)
void interleave(const void *src, int sstride, int uw, int vw, void *dst, int dstride, DataType dt, int nchan)
float qsmoothstep(float x, float a, float b)
Definition PtexUtils.h:129
void(* ApplyConstFn)(float weight, float *dst, void *data, int nChan)
Definition PtexUtils.h:259
bool isPowerOfTwo(int x)
Definition PtexUtils.h:63
void average(const void *src, int sstride, int uw, int vw, void *dst, DataType dt, int nchan)
ApplyConstFn applyConstFunctions[20]
uint32_t ceil_log2(uint32_t x)
Definition PtexUtils.h:90
DataType
Type of data stored in texture file.
Definition Ptexture.h:72
Half-precision (16-bit) floating-point type.
Definition PtexHalf.h:72
void operator()(float *dst, const T *val, int nchan, float weight)
Definition PtexUtils.h:230
void operator()(float *, const T *, float)
Definition PtexUtils.h:225
void operator()(float *dst, const T *val, float weight)
Definition PtexUtils.h:217
void operator()(float *dst, const T *val, int nchan, float weight)
Definition PtexUtils.h:253
void operator()(float *, const T *, float)
Definition PtexUtils.h:248
void operator()(float *dst, const T *val, float weight)
Definition PtexUtils.h:240