Changeset 372 for trunk/src/core


Ignore:
Timestamp:
05/22/15 16:50:38 (10 years ago)
Author:
epyon
Message:
  • further removal of C++ std lib headers
  • partial implementation of type_traits
  • move/forward/swap in stl/utility.hh
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/random.cc

    r319 r372  
    77#include "nv/core/random.hh"
    88#include "nv/core/time.hh"
     9#include <random>
    910
    1011using namespace nv;
    1112
    1213random::random( random::seed_type seed /*= 0 */ )
    13         : rng( seed == 0 ? randomized_seed() : seed )
    14 {
    15        
     14{
     15        static_assert( sizeof( std::mt19937 ) < sizeof( random::m_data ), "No room for mersenne twister!" );
     16        new (m_data)std::mt19937( seed == 0 ? randomized_seed() : seed );
    1617}
    1718
    1819random::seed_type random::randomize()
    1920{
     21        std::mt19937& rng = *(( std::mt19937* )m_data);
    2022        seed_type seed = randomized_seed();
    2123        rng.seed( seed );
     
    2527void random::set_seed( random::seed_type seed /*= 0 */ )
    2628{
     29        std::mt19937& rng = *( ( std::mt19937* )m_data );
    2730        rng.seed( seed == 0 ? randomized_seed() : seed );
    2831}
     
    3639random::result_type random::rand()
    3740{
     41        std::mt19937& rng = *( ( std::mt19937* )m_data );
    3842        return rng();
    3943}
     
    4145sint32 random::srand( sint32 val )
    4246{
     47        std::mt19937& rng = *( ( std::mt19937* )m_data );
    4348        std::uniform_int_distribution<sint32> dist( 0, val - 1 );
    4449        return dist( rng );
     
    4752uint32 random::urand( uint32 val )
    4853{
     54        std::mt19937& rng = *( ( std::mt19937* )m_data );
    4955        std::uniform_int_distribution<uint32> dist( 0, val - 1 );
    5056        return dist( rng );
     
    5359f32 random::frand( f32 val )
    5460{
     61        std::mt19937& rng = *( ( std::mt19937* )m_data );
    5562        std::uniform_real_distribution<f32> dist( 0, val );
    5663        return dist( rng );
     
    5966sint32 random::srange( sint32 min, sint32 max )
    6067{
     68        std::mt19937& rng = *( ( std::mt19937* )m_data );
    6169        std::uniform_int_distribution<sint32> dist( min, max );
    6270        return dist( rng );
     
    6573uint32 random::urange( uint32 min, uint32 max )
    6674{
     75        std::mt19937& rng = *( ( std::mt19937* )m_data );
    6776        std::uniform_int_distribution<uint32> dist( min, max );
    6877        return dist( rng );
     
    7180f32 random::frange( f32 min, f32 max )
    7281{
     82        std::mt19937& rng = *( ( std::mt19937* )m_data );
    7383        std::uniform_real_distribution<f32> dist( min, max );
    7484        return dist( rng );
     
    7787uint32 random::dice( uint32 count, uint32 sides )
    7888{
     89        std::mt19937& rng = *( ( std::mt19937* )m_data );
    7990        std::uniform_int_distribution<uint32> dist( 1, sides );
    8091        uint32 result = 0;
     
    8899random::seed_type random::randomized_seed()
    89100{
     101        // TODO: this seems off, as it might often seed the same, use general time
     102        // instead
    90103        return narrow_cast< seed_type >( get_ticks() );
    91104}
     
    93106nv::vec2 nv::random::precise_unit_vec2()
    94107{
     108        std::mt19937& rng = *( ( std::mt19937* )m_data );
    95109        std::uniform_real_distribution<f32> dist( 0, glm::pi<float>() * 2.f );
    96110        float angle = dist( rng );
     
    100114nv::vec3 nv::random::precise_unit_vec3()
    101115{
     116        std::mt19937& rng = *( ( std::mt19937* )m_data );
    102117        std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f );
    103118        std::uniform_real_distribution<f32> dist02pi( 0.0f, 2*glm::pi<float>() );
     
    114129nv::vec2 nv::random::fast_disk_point()
    115130{
     131        std::mt19937& rng = *( ( std::mt19937* )m_data );
    116132        std::uniform_real_distribution<f32> dist( 0.0f, 1.0f );
    117133        float r1 = dist( rng );
     
    124140nv::vec2 nv::random::precise_disk_point()
    125141{
     142        std::mt19937& rng = *( ( std::mt19937* )m_data );
    126143        std::uniform_real_distribution<f32> unit( 0.0f, 1.0f );
    127144        std::uniform_real_distribution<f32> angle( 0.0f, glm::pi<float>() );
     
    133150nv::vec3 nv::random::fast_sphere_point()
    134151{
     152        std::mt19937& rng = *( ( std::mt19937* )m_data );
    135153        std::uniform_real_distribution<f32> dist01( 0.0f, 1.0f );
    136154        std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f );
     
    150168nv::vec3 nv::random::precise_sphere_point()
    151169{
     170        std::mt19937& rng = *( ( std::mt19937* )m_data );
    152171        std::uniform_real_distribution<f32> dist01( 0.0f, 1.0f );
    153172        std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f );
     
    166185nv::vec2 nv::random::precise_ellipse_point( const vec2& radii )
    167186{
     187        std::mt19937& rng = *( ( std::mt19937* )m_data );
    168188        std::uniform_real_distribution<f32> distx( -radii.x, radii.x );
    169189        std::uniform_real_distribution<f32> disty( -radii.y, radii.y );
     
    184204nv::vec3 nv::random::precise_ellipsoid_point( const vec3& radii )
    185205{
     206        std::mt19937& rng = *( ( std::mt19937* )m_data );
    186207        std::uniform_real_distribution<f32> distx( -radii.x, radii.x );
    187208        std::uniform_real_distribution<f32> disty( -radii.y, radii.y );
     
    204225nv::vec2 nv::random::fast_hollow_disk_point( float iradius, float oradius )
    205226{
     227        std::mt19937& rng = *( ( std::mt19937* )m_data );
    206228        float idist2 = iradius * iradius;
    207229        float odist2 = oradius * oradius;
     
    217239nv::vec3 nv::random::fast_hollow_sphere_point( float iradius, float oradius )
    218240{
     241        std::mt19937& rng = *( ( std::mt19937* )m_data );
    219242        float idist3 = iradius * iradius * iradius;
    220243        float odist3 = oradius * oradius * oradius;
     
    231254nv::vec2 nv::random::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )
    232255{
    233         vec2 iradii2    = iradii * iradii;
     256        std::mt19937& rng = *( ( std::mt19937* )m_data );
     257        vec2 iradii2 = iradii * iradii;
    234258        vec2 opoint     = ellipse_edge( oradii );
    235259        vec2 opoint2    = opoint * opoint;
     
    251275nv::vec3 nv::random::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )
    252276{
    253         vec3 iradii2    = iradii * iradii;
     277        std::mt19937& rng = *( ( std::mt19937* )m_data );
     278        vec3 iradii2 = iradii * iradii;
    254279        vec3 opoint     = ellipsoid_edge( oradii );
    255280        vec3 opoint2    = opoint * opoint;
Note: See TracChangeset for help on using the changeset viewer.