/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose */ import { clamp } from '../mol-math/interpolate'; const maxFloat = 10000.0; // NOTE same constant is set in shaders const floatLogFactor = Math.log(maxFloat + 1.0); /** encode float logarithmically */ export function encodeFloatLog(value: number) { return Math.log(value + 1.0) / floatLogFactor } /** decode logarithmically encoded float */ export function decodeFloatLog(value: number) { return Math.exp(value * floatLogFactor) - 1.0 } /** encode float as normalized rgb triplet */ export function encodeFloatRGB(value: number) { value = clamp(value, 0.0, 16777216.0 - 1.0) + 1.0 const b = (value % 256) / 255.0 value = Math.floor(value / 256.0) const g = (value % 256) / 255.0 value = Math.floor(value / 256.0) const r = (value % 256) / 255.0 return [r, g, b] } /** decode float encoded as rgb triplet */ export function decodeFloatRGB(r: number, g: number, b: number) { return (Math.floor(r) * 256 * 256 + Math.floor(g) * 256 + Math.floor(b)) - 1 }