Changeset 503 for trunk/src/core


Ignore:
Timestamp:
06/28/16 21:09:19 (9 years ago)
Author:
epyon
Message:
  • nv::random - support for different rng sources
  • nv::types - fixes and better support
  • nv::mesh_creator - full range transform
  • nv::context - buffer mask as separate type
  • nv::lua - initializations from lua::state instead of lua_State
  • nv::lua - initial support for rtti
Location:
trunk/src/core
Files:
1 added
1 edited

Legend:

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

    r487 r503  
    1919#define NV_MT_TWIST(u, v)  ( (NV_MT_MIXBITS(u, v) >> 1) ^ ( (v) & 1UL ? mt_matrix_a : 0UL) )
    2020
    21 void random::mt_init( uint32 seed )
     21nv::random& random::get()
     22{
     23        static random default_rng;
     24        return default_rng;
     25}
     26
     27void random_mersenne::mt_init( uint32 seed )
    2228{
    2329        m_state[0] = static_cast<uint32>( seed & mt_full_mask );
     
    3440
    3541
    36 void random::mt_update()
     42void random_mersenne::mt_update()
    3743{
    3844        uint32 *p = m_state;
     
    5157
    5258
    53 uint32 random::mt_uint32()
     59uint32 random_mersenne::mt_uint32()
    5460{
    5561        uint32 r;
     
    7076}
    7177
    72 random::random( random::seed_type seed /*= 0 */ )
     78random_mersenne::random_mersenne( random_mersenne::seed_type seed /*= 0 */ )
    7379        : m_next( nullptr ), m_remaining( 0 ), m_seeded( 0 )
    7480{
    75         mt_init( seed == 0 ? randomized_seed() : seed );
    76 }
    77 
    78 random::seed_type random::set_seed( random::seed_type seed /*= 0 */ )
    79 {
    80         if ( seed == 0 ) seed = randomized_seed();
     81        mt_init( seed );
     82}
     83
     84random_mersenne::seed_type random_mersenne::set_seed( random_mersenne::seed_type seed /*= 0 */ )
     85{
    8186        mt_init( seed );
    8287        return seed;
    8388}
    8489
    85 nv::random& random::get()
    86 {
    87         static random default_rng;
    88         return default_rng;
    89 }
    90 
    91 random::result_type random::rand()
     90random_mersenne::result_type random_mersenne::rand()
    9291{
    9392        return mt_uint32();
    9493}
    9594
    96 uint32 random::urand( uint32 val )
    97 {
    98         uint32 x, max = mt_full_mask - ( mt_full_mask % val );
    99         while ( ( x = rand() ) >= max );
    100         return x / ( max / val );
    101 }
    102 
    103 random::seed_type random::randomized_seed()
     95random_base::seed_type random_base::randomized_seed()
    10496{
    10597        // TODO: this seems off, as it might often seed the same, use general time
     
    108100}
    109101
    110 nv::vec2 nv::random::precise_unit_vec2()
     102nv::vec2 nv::random_base::precise_unit_vec2()
    111103{
    112104        f32 angle = frand( math::pi<f32>() * 2.f );
     
    114106}
    115107
    116 nv::vec3 nv::random::precise_unit_vec3()
     108nv::vec3 nv::random_base::precise_unit_vec3()
    117109{
    118110        f32 cos_theta = frange( -1.0f, 1.0f );
     
    126118}
    127119
    128 nv::vec2 nv::random::fast_disk_point()
     120nv::vec2 nv::random_base::fast_disk_point()
    129121{
    130122        f32 r1 = frand();
     
    135127}
    136128
    137 nv::vec2 nv::random::precise_disk_point()
     129nv::vec2 nv::random_base::precise_disk_point()
    138130{
    139131        f32 r = sqrt( frand() );
     
    142134}
    143135
    144 nv::vec3 nv::random::fast_sphere_point()
     136nv::vec3 nv::random_base::fast_sphere_point()
    145137{
    146138        f32 rad     = frand();
     
    156148}
    157149
    158 nv::vec3 nv::random::precise_sphere_point()
     150nv::vec3 nv::random_base::precise_sphere_point()
    159151{
    160152        f32 radius = pow( frand(), 1.f/3.f );
     
    169161}
    170162
    171 nv::vec2 nv::random::precise_ellipse_point( const vec2& radii )
     163nv::vec2 nv::random_base::precise_ellipse_point( const vec2& radii )
    172164{
    173165        vec2 p = range( -radii, radii );
     
    184176}
    185177
    186 nv::vec3 nv::random::precise_ellipsoid_point( const vec3& radii )
     178nv::vec3 nv::random_base::precise_ellipsoid_point( const vec3& radii )
    187179{
    188180        vec3 p = range( -radii, radii );
     
    199191}
    200192
    201 nv::vec2 nv::random::fast_hollow_disk_point( f32 iradius, f32 oradius )
     193nv::vec2 nv::random_base::fast_hollow_disk_point( f32 iradius, f32 oradius )
    202194{
    203195        f32 idist2 = iradius * iradius;
     
    207199}
    208200
    209 nv::vec2 nv::random::precise_hollow_disk_point( f32 iradius, f32 oradius )
     201nv::vec2 nv::random_base::precise_hollow_disk_point( f32 iradius, f32 oradius )
    210202{
    211203        return fast_hollow_disk_point( iradius, oradius );
    212204}
    213205
    214 nv::vec3 nv::random::fast_hollow_sphere_point( f32 iradius, f32 oradius )
     206nv::vec3 nv::random_base::fast_hollow_sphere_point( f32 iradius, f32 oradius )
    215207{
    216208        f32 idist3 = iradius * iradius * iradius;
     
    220212}
    221213
    222 nv::vec3 nv::random::precise_hollow_sphere_point( f32 iradius, f32 oradius )
     214nv::vec3 nv::random_base::precise_hollow_sphere_point( f32 iradius, f32 oradius )
    223215{
    224216        return fast_hollow_sphere_point( iradius, oradius );
     
    226218
    227219
    228 nv::vec2 nv::random::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )
     220nv::vec2 nv::random_base::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )
    229221{
    230222        vec2 iradii2 = iradii * iradii;
     
    241233}
    242234
    243 nv::vec2 nv::random::precise_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )
     235nv::vec2 nv::random_base::precise_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )
    244236{
    245237        return fast_hollow_ellipse_point( iradii, oradii );
    246238}
    247239
    248 nv::vec3 nv::random::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )
     240nv::vec3 nv::random_base::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )
    249241{
    250242        vec3 iradii2 = iradii * iradii;
     
    267259}
    268260
    269 nv::vec3 nv::random::precise_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )
     261nv::vec3 nv::random_base::precise_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )
    270262{
    271263        return fast_hollow_ellipsoid_point( iradii, oradii );
    272264}
    273265
     266nv::random_xor128::random_xor128( seed_type seed /*= randomized_seed() */ )
     267{
     268        set_seed( seed );
     269}
     270
     271nv::random_base::seed_type nv::random_xor128::set_seed( seed_type seed /*= 0 */ )
     272{
     273        uint32 s = 4294967296 - seed;
     274        m_state[0] = 123456789 * s;
     275        m_state[1] = 362436069 * s;
     276        m_state[2] = 521288629 * s;
     277        m_state[3] = 88675123 * s;
     278        return seed;
     279}
     280
     281nv::random_base::result_type nv::random_xor128::rand()
     282{
     283        uint32 t = m_state[0];
     284        t ^= t << 11;
     285        t ^= t >> 8;
     286        m_state[0] = m_state[1]; m_state[1] = m_state[2]; m_state[2] = m_state[3];
     287        m_state[3] ^= m_state[3] >> 19;
     288        m_state[3] ^= t;
     289        return m_state[3];
     290}
Note: See TracChangeset for help on using the changeset viewer.