The spica renderer
common.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_COMMON_H_
6 #define _SPICA_COMMON_H_
7 
8 #include <cstdlib>
9 #include <cmath>
10 #include <iostream>
11 #include <string>
12 #include <typeinfo>
13 #include <type_traits>
14 
15 #if defined(_WIN32) || defined(__WIN32__)
16 #else
17 #include <cxxabi.h>
18 #endif
19 
20 // -----------------------------------------------------------------------------
21 // API export macro
22 // -----------------------------------------------------------------------------
23 
24 #if (defined(WIN32) || defined(_WIN32) || defined(WINCE) || defined(__CYGWIN__))
25 # if defined(SPICA_API_EXPORT)
26 # define SPICA_EXPORTS __declspec(dllexport)
27 # define SPICA_IMPORTS
28 # else
29 # define SPICA_EXPORTS
30 # define SPICA_IMPORTS __declspec(dllimport)
31 # endif
32 # define MEM_ALIGN(n) alignas(n)
33 #elif defined(__GNUC__) && __GNUC__ >= 4
34 # define SPICA_EXPORTS __attribute__((visibility ("default")))
35 # define SPICA_IMPORTS __attribute__((visibility ("hidden")))
36 # define MEM_ALIGN(n) __attribute__((aligned(n)))
37 #else
38 # define SPICA_EXPORTS
39 # define SPICA_IMPORTS
40 # define MEM_ALIGN(n) alignas(n)
41 #endif
42 
43 #if (defined(WIN32) || defined(_WIN32) || defined(WINCE) || defined(__CYGWIN__))
44 # define PACKED(__declare__) __pragma(pack(push,1)) __declare__ __pragma(pack(pop))
45 #else
46 # define PACKED(__declare__) __declare__ __attribute__((__packed__))
47 #endif
48 
49 // ----------------------------------------------------------------------------
50 // Parameter constants
51 // ----------------------------------------------------------------------------
52 static const double PI = 4.0 * atan(1.0);
53 static const double INV_PI = 1.0 / PI;
54 static const double INFTY = 1.0e32;
55 static const double EPS = 1.0e-12;
56 
57 // -----------------------------------------------------------------------------
58 // Assertion with message
59 // -----------------------------------------------------------------------------
60 
61 #ifndef __FUNCTION_NAME__
62  #if defined(_WIN32) || defined(__WIN32__)
63  #define __FUNCTION_NAME__ __FUNCTION__
64  #else
65  #define __FUNCTION_NAME__ __func__
66  #endif
67 #endif
68 
69 #undef NDEBUG
70 #ifndef NDEBUG
71 #define Assertion(PREDICATE, ...) \
72 do { \
73  if (!(PREDICATE)) { \
74  std::cerr << "Asssertion \"" \
75  << #PREDICATE << "\" failed in " << __FILE__ \
76  << " line " << __LINE__ \
77  << " in function \"" << (__FUNCTION_NAME__) << "\"" \
78  << " : "; \
79  fprintf(stderr, __VA_ARGS__); \
80  std::cerr << std::endl; \
81  std::abort(); \
82  } \
83 } while (false)
84 #else // NDEBUG
85 #define Assertion(PREDICATE, ...) do {} while (false)
86 #endif // NDEBUG
87 
88 // -----------------------------------------------------------------------------
89 // Message handlers
90 // -----------------------------------------------------------------------------
91 
92 #ifndef NDEBUG
93 #define MsgInfo(...) \
94 do { \
95  std::cout << "[INFO] "; \
96  fprintf(stdout, __VA_ARGS__); \
97  std::cout << std::endl; \
98 } while (false);
99 #define Warning(...) \
100 do { \
101  std::cerr << "[WARNING] "; \
102  fprintf(stderr, __VA_ARGS__); \
103  std::cerr << std::endl; \
104 } while (false);
105 #else
106 #define SpicaInfo(...)
107 #define SpicaWarn(...)
108 #endif
109 #define FatalError(...) \
110 do { \
111  std::cerr << "[ERROR] "; \
112  fprintf(stderr, __VA_ARGS__); \
113  std::cerr << std::endl; \
114  std::abort(); \
115 } while (false);
116 
117 // -----------------------------------------------------------------------------
118 // Alignment
119 // -----------------------------------------------------------------------------
120 
121 #if defined(_WIN32) || defined(__WIN32__)
122 inline void* align_alloc(size_t size, size_t alignsize) {
123  return _aligned_malloc(size, alignsize);
124 }
125 inline void align_free(void* mem) {
126  if (!mem) return;
127  _aligned_free(mem);
128 }
129 #else
130 inline void* align_alloc(size_t size, size_t alignsize) {
131  void* mem = nullptr;
132  int ret = posix_memalign((void**)&mem, alignsize, size);
133  return (ret == 0) ? mem : nullptr;
134 }
135 inline void align_free(void* mem) {
136  if (!mem) return;
137  free(mem);
138 }
139 #endif
140 
141 // ----------------------------------------------------------------------------
142 // Utility functions
143 // ----------------------------------------------------------------------------
144 
145 extern void* enabler;
146 
147 template <class T,
148  typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
149 inline T clamp(T v, T lo, T hi) {
150  if (v < lo) v = lo;
151  if (v > hi) v = hi;
152  return v;
153 }
154 
155 template <class T,
156  typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
157 inline T max3(T a, T b, T c) {
158  return std::max(a, std::max(b, c));
159 }
160 
161 template <class T,
162  typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
163 inline T min3(T a, T b, T c) {
164  return std::min(a, std::min(b, c));
165 }
166 
167 inline double lerp(double t, double v1, double v2) {
168  return (1.0 - t) * v1 + t * v2;
169 }
170 
171 #endif // _SPICA_COMMON_H_