// ======================================================================== // // Copyright 2009-2017 Intel Corporation // // // // Licensed under the Apache License, Version 2.0 (the "License"); // // you may not use this file except in compliance with the License. // // You may obtain a copy of the License at // // // // http://www.apache.org/licenses/LICENSE-2.0 // // // // Unless required by applicable law or agreed to in writing, software // // distributed under the License is distributed on an "AS IS" BASIS, // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // // See the License for the specific language governing permissions and // // limitations under the License. // // ======================================================================== // #pragma once #include "../sys/platform.h" #include #define _USE_MATH_DEFINES #include // using cmath causes issues under Windows #include namespace embree { static const float one_over_255 = 1.0f/255.0f; static const float min_rcp_input = 1E-18f; // for abs(x) >= min_rcp_input the newton raphson rcp calculation does not fail /* we consider floating point numbers in that range as valid input numbers */ static float FLT_LARGE = 1.844E18f; static struct TrueTy { __forceinline operator bool( ) const { return true; } } True MAYBE_UNUSED; static struct FalseTy { __forceinline operator bool( ) const { return false; } } False MAYBE_UNUSED; static struct ZeroTy { __forceinline operator double ( ) const { return 0; } __forceinline operator float ( ) const { return 0; } __forceinline operator long long( ) const { return 0; } __forceinline operator unsigned long long( ) const { return 0; } __forceinline operator long ( ) const { return 0; } __forceinline operator unsigned long ( ) const { return 0; } __forceinline operator int ( ) const { return 0; } __forceinline operator unsigned int ( ) const { return 0; } __forceinline operator short ( ) const { return 0; } __forceinline operator unsigned short ( ) const { return 0; } __forceinline operator char ( ) const { return 0; } __forceinline operator unsigned char ( ) const { return 0; } } zero MAYBE_UNUSED; static struct OneTy { __forceinline operator double ( ) const { return 1; } __forceinline operator float ( ) const { return 1; } __forceinline operator long long( ) const { return 1; } __forceinline operator unsigned long long( ) const { return 1; } __forceinline operator long ( ) const { return 1; } __forceinline operator unsigned long ( ) const { return 1; } __forceinline operator int ( ) const { return 1; } __forceinline operator unsigned int ( ) const { return 1; } __forceinline operator short ( ) const { return 1; } __forceinline operator unsigned short ( ) const { return 1; } __forceinline operator char ( ) const { return 1; } __forceinline operator unsigned char ( ) const { return 1; } } one MAYBE_UNUSED; static struct NegInfTy { __forceinline operator double ( ) const { return -std::numeric_limits::infinity(); } __forceinline operator float ( ) const { return -std::numeric_limits::infinity(); } __forceinline operator long long( ) const { return std::numeric_limits::min(); } __forceinline operator unsigned long long( ) const { return std::numeric_limits::min(); } __forceinline operator long ( ) const { return std::numeric_limits::min(); } __forceinline operator unsigned long ( ) const { return std::numeric_limits::min(); } __forceinline operator int ( ) const { return std::numeric_limits::min(); } __forceinline operator unsigned int ( ) const { return std::numeric_limits::min(); } __forceinline operator short ( ) const { return std::numeric_limits::min(); } __forceinline operator unsigned short ( ) const { return std::numeric_limits::min(); } __forceinline operator char ( ) const { return std::numeric_limits::min(); } __forceinline operator unsigned char ( ) const { return std::numeric_limits::min(); } } neg_inf MAYBE_UNUSED; static struct PosInfTy { __forceinline operator double ( ) const { return std::numeric_limits::infinity(); } __forceinline operator float ( ) const { return std::numeric_limits::infinity(); } __forceinline operator long long( ) const { return std::numeric_limits::max(); } __forceinline operator unsigned long long( ) const { return std::numeric_limits::max(); } __forceinline operator long ( ) const { return std::numeric_limits::max(); } __forceinline operator unsigned long ( ) const { return std::numeric_limits::max(); } __forceinline operator int ( ) const { return std::numeric_limits::max(); } __forceinline operator unsigned int ( ) const { return std::numeric_limits::max(); } __forceinline operator short ( ) const { return std::numeric_limits::max(); } __forceinline operator unsigned short ( ) const { return std::numeric_limits::max(); } __forceinline operator char ( ) const { return std::numeric_limits::max(); } __forceinline operator unsigned char ( ) const { return std::numeric_limits::max(); } } inf MAYBE_UNUSED, pos_inf MAYBE_UNUSED; static struct NaNTy { __forceinline operator double( ) const { return std::numeric_limits::quiet_NaN(); } __forceinline operator float ( ) const { return std::numeric_limits::quiet_NaN(); } } nan MAYBE_UNUSED; static struct UlpTy { __forceinline operator double( ) const { return std::numeric_limits::epsilon(); } __forceinline operator float ( ) const { return std::numeric_limits::epsilon(); } } ulp MAYBE_UNUSED; static struct PiTy { __forceinline operator double( ) const { return double(M_PI); } __forceinline operator float ( ) const { return float(M_PI); } } pi MAYBE_UNUSED; static struct OneOverPiTy { __forceinline operator double( ) const { return double(M_1_PI); } __forceinline operator float ( ) const { return float(M_1_PI); } } one_over_pi MAYBE_UNUSED; static struct TwoPiTy { __forceinline operator double( ) const { return double(2.0*M_PI); } __forceinline operator float ( ) const { return float(2.0*M_PI); } } two_pi MAYBE_UNUSED; static struct OneOverTwoPiTy { __forceinline operator double( ) const { return double(0.5*M_1_PI); } __forceinline operator float ( ) const { return float(0.5*M_1_PI); } } one_over_two_pi MAYBE_UNUSED; static struct FourPiTy { __forceinline operator double( ) const { return double(4.0*M_PI); } __forceinline operator float ( ) const { return float(4.0*M_PI); } } four_pi MAYBE_UNUSED; static struct OneOverFourPiTy { __forceinline operator double( ) const { return double(0.25*M_1_PI); } __forceinline operator float ( ) const { return float(0.25*M_1_PI); } } one_over_four_pi MAYBE_UNUSED; static struct StepTy { } step MAYBE_UNUSED; static struct ReverseStepTy { } reverse_step MAYBE_UNUSED; static struct EmptyTy { } empty MAYBE_UNUSED; static struct FullTy { } full MAYBE_UNUSED; }