/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2008-08-01 // Updated : 2008-09-23 // Licence : This source is under MIT License // File : glm/core/func_noise.inl /////////////////////////////////////////////////////////////////////////////////////////////////// namespace glm { namespace core{ namespace function{ namespace noise{ // noise1 template inline genType noise1 ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise1' only accept floating-point values"); int iNbr = int(x + genType(3) / genType(2)) * 1103515245 + 12345; return genType(int(iNbr / genType(65536)) % 32768) / genType(32767); } template inline typename detail::tvec2::value_type noise1 ( detail::tvec2 const & x ) { T tmp(0); for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) tmp += x[i]; return noise1(tmp); } template inline typename detail::tvec3::value_type noise1 ( detail::tvec3 const & x ) { T tmp(0); for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) tmp += x[i]; return noise1(tmp); } template inline typename detail::tvec4::value_type noise1 ( detail::tvec4 const & x ) { T tmp(0); for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) tmp += x[i]; return noise1(tmp); } // noise2 template inline detail::tvec2 noise2 ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise2' only accept floating-point values"); genType f1 = x * genType(1103515245) + genType(12345); genType f2 = f1 * genType(1103515245) + genType(12345); return detail::tvec2( noise1(f1), noise1(f2)); } template inline detail::tvec2 noise2 ( detail::tvec2 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise2' only accept floating-point values"); T f0(0); for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); return detail::tvec2( noise1(f1), noise1(f2)); } template inline detail::tvec2 noise2 ( detail::tvec3 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise2' only accept floating-point values"); T f0(0); for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); return detail::tvec2( noise1(f1), noise1(f2)); } template inline detail::tvec2 noise2 ( detail::tvec4 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise2' only accept floating-point values"); T f0(0); for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); return detail::tvec2( noise1(f1), noise1(f2)); } // noise3 template inline detail::tvec3 noise3 ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise3' only accept floating-point values"); genType f1 = x * genType(1103515245) + genType(12345); genType f2 = f1 * genType(1103515245) + genType(12345); genType f3 = f2 * genType(1103515245) + genType(12345); return detail::tvec3( noise1(f1), noise1(f2), noise1(f3)); } template inline detail::tvec3 noise3 ( detail::tvec2 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise3' only accept floating-point values"); T f0(0); for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); return detail::tvec3( noise1(f1), noise1(f2), noise1(f3)); } template inline detail::tvec3 noise3 ( detail::tvec3 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise3' only accept floating-point values"); T f0(0); for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); return detail::tvec3( noise1(f1), noise1(f2), noise1(f3)); } template inline detail::tvec3 noise3 ( detail::tvec4 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise3' only accept floating-point values"); T f0(0); for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); return detail::tvec3( noise1(f1), noise1(f2), noise1(f3)); } // noise4 template inline detail::tvec4 noise4 ( genType const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise4' only accept floating-point values"); genType f1 = x * genType(1103515245) + genType(12345); genType f2 = f1 * genType(1103515245) + genType(12345); genType f3 = f2 * genType(1103515245) + genType(12345); genType f4 = f3 * genType(1103515245) + genType(12345); return detail::tvec4( noise1(f1), noise1(f2), noise1(f3), noise1(f4)); } template inline detail::tvec4 noise4 ( detail::tvec2 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise4' only accept floating-point values"); T f0(0); for(typename detail::tvec2::size_type i = 0; i < detail::tvec2::value_size(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); T f4 = f3 * T(1103515245) + T(12345); return detail::tvec4( noise1(f1), noise1(f2), noise1(f3), noise1(f4)); } template inline detail::tvec4 noise4 ( detail::tvec3 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise4' only accept floating-point values"); T f0(0); for(typename detail::tvec3::size_type i = 0; i < detail::tvec3::value_size()(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); T f4 = f3 * T(1103515245) + T(12345); return detail::tvec4( noise1(f1), noise1(f2), noise1(f3), noise1(f4)); } template inline detail::tvec4 noise4 ( detail::tvec4 const & x ) { GLM_STATIC_ASSERT(detail::type::is_float, "'noise4' only accept floating-point values"); T f0(0); for(typename detail::tvec4::size_type i = 0; i < detail::tvec4::value_size()(); ++i) f0 += x[i]; T f1 = f0 * T(1103515245) + T(12345); T f2 = f1 * T(1103515245) + T(12345); T f3 = f2 * T(1103515245) + T(12345); T f4 = f3 * T(1103515245) + T(12345); return detail::tvec4( noise1(f1), noise1(f2), noise1(f3), noise1(f4)); } }//namespace noise }//namespace function }//namespace core }//namespace glm