|
Ivan Mahonin |
531f67 |
#ifndef COMMON_H
|
|
Ivan Mahonin |
531f67 |
#define COMMON_H
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
#include <cmath>
|
|
Ivan Mahonin |
531f67 |
#include <cstdlib>
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
typedef float ColorReal;
|
|
Ivan Mahonin |
531f67 |
typedef double Real;
|
|
Ivan Mahonin |
531f67 |
typedef int Int;
|
|
Ivan Mahonin |
531f67 |
typedef unsigned int UInt;
|
|
Ivan Mahonin |
531f67 |
typedef long long int LongInt;
|
|
Ivan Mahonin |
531f67 |
typedef unsigned long long int ULongInt;
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
const Real realRrecision = 1e-10;
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
class Shared {
|
|
Ivan Mahonin |
531f67 |
private:
|
|
Ivan Mahonin |
531f67 |
int ref_count;
|
|
Ivan Mahonin |
531f67 |
public:
|
|
Ivan Mahonin |
531f67 |
Shared(): ref_count() { }
|
|
Ivan Mahonin |
531f67 |
Shared(const Shared&): ref_count() { }
|
|
Ivan Mahonin |
531f67 |
virtual ~Shared() { };
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
inline Shared& operator=(const Shared&) { return *this; }
|
|
Ivan Mahonin |
531f67 |
inline void reference() { ++ref_count; }
|
|
Ivan Mahonin |
531f67 |
inline void unreference() { if (--ref_count <= 0) delete this; }
|
|
Ivan Mahonin |
531f67 |
};
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
class Color {
|
|
Ivan Mahonin |
531f67 |
public:
|
|
Ivan Mahonin |
531f67 |
typedef ColorReal Channel;
|
|
Ivan Mahonin |
531f67 |
union {
|
|
Ivan Mahonin |
531f67 |
struct { Channel channels[4]; };
|
|
Ivan Mahonin |
531f67 |
struct { Channel r, g, b, a; };
|
|
Ivan Mahonin |
531f67 |
};
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
inline explicit Color(Channel r = 0.0, Channel g = 0.0, Channel b = 0.0, Channel a = 0.0):
|
|
Ivan Mahonin |
531f67 |
r(r), g(g), b(b), a(a) { }
|
|
Ivan Mahonin |
531f67 |
};
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
inline int clz(const Int &x)
|
|
Ivan Mahonin |
531f67 |
{ return x ? __builtin_clz(x) : 32; }
|
|
Ivan Mahonin |
531f67 |
inline int clz(const UInt &x)
|
|
Ivan Mahonin |
531f67 |
{ return x ? __builtin_clz(x) : 32; }
|
|
Ivan Mahonin |
531f67 |
inline int clz(const LongInt &x)
|
|
Ivan Mahonin |
531f67 |
{ return x ? __builtin_clzll(x) : 64; }
|
|
Ivan Mahonin |
531f67 |
inline int clz(const ULongInt &x)
|
|
Ivan Mahonin |
531f67 |
{ return x ? __builtin_clzll(x) : 64; }
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
inline Real flip_clamp(Real x) {
|
|
Ivan Mahonin |
531f67 |
x -= floor(0.5*x)*2.0;
|
|
Ivan Mahonin |
531f67 |
return 1.0 - fabs(1.0 - x);
|
|
Ivan Mahonin |
531f67 |
}
|
|
Ivan Mahonin |
531f67 |
|
|
Ivan Mahonin |
531f67 |
#endif
|