nuclear@6: #include nuclear@6: #include "xfermap.h" nuclear@6: nuclear@6: TransferFunc::~TransferFunc() nuclear@6: { nuclear@6: } nuclear@6: nuclear@6: nuclear@6: // ---- TransferWindow ---- nuclear@6: nuclear@6: TransferWindow::TransferWindow() nuclear@6: { nuclear@6: soft_rad = 0.5; nuclear@6: for(int i=0; i<4; i++) { nuclear@6: low[i] = 0.5; nuclear@6: high[i] = 2.0; nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: void TransferWindow::set_interval(float a, float b) nuclear@6: { nuclear@6: float v0 = std::min(a, b); nuclear@6: float v1 = std::max(a, b); nuclear@6: nuclear@6: for(int i=0; i<4; i++) { nuclear@6: low[i] = v0; nuclear@6: high[i] = v1; nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: void TransferWindow::set_interval(float *rgba_low, float *rgba_high) nuclear@6: { nuclear@6: for(int i=0; i<4; i++) { nuclear@6: low[i] = std::min(rgba_low[i], rgba_high[i]); nuclear@6: high[i] = std::max(rgba_low[i], rgba_high[i]); nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: void TransferWindow::set_interval_rgba(int channel, float a, float b) nuclear@6: { nuclear@6: low[channel] = std::min(a, b); nuclear@6: high[channel] = std::max(a, b); nuclear@6: } nuclear@6: nuclear@6: void TransferWindow::set_soft_radius(float s) nuclear@6: { nuclear@6: soft_rad = s; nuclear@6: } nuclear@6: nuclear@6: float TransferWindow::get_soft_radius() const nuclear@6: { nuclear@6: return soft_rad; nuclear@6: } nuclear@6: nuclear@6: static inline float smoothstep(float a, float b, float x) nuclear@6: { nuclear@6: if(x < a) return 0.0f; nuclear@6: if(x >= b) return 1.0f; nuclear@6: nuclear@6: float t = (x - a) / (b - a); nuclear@6: return t * t * (3.0f - 2.0f * t); nuclear@6: } nuclear@6: nuclear@6: float TransferWindow::map(float x) const nuclear@6: { nuclear@6: return smoothstep(low[3] - soft_rad, high[3] - soft_rad, x) * nuclear@6: (1.0 - smoothstep(low[3] + soft_rad, high[3] + soft_rad, x)); nuclear@6: } nuclear@6: nuclear@6: void TransferWindow::map(float x, float *rgba_value) const nuclear@6: { nuclear@6: for(int i=0; i<4; i++) { nuclear@6: float val = smoothstep(low[i] - soft_rad, high[i] - soft_rad, x); nuclear@6: val *= 1.0 - smoothstep(low[i] + soft_rad, high[i] + soft_rad, x); nuclear@6: rgba_value[i] = val; nuclear@6: } nuclear@6: }