NW4F Eft
Loading...
Searching...
No Matches
eft_Random.h
Go to the documentation of this file.
1#ifndef EFT_RANDOM_H_
2#define EFT_RANDOM_H_
3
4#include <nw/eft/eft_typeDef.h>
5
6namespace nw { namespace eft {
7
8class Random
9{
10public:
12 {
13 Init();
14 }
15
16 explicit Random(u32 seed)
17 {
18 Init(seed);
19 }
20
21 Random(u32 seed_0, u32 seed_1, u32 seed_2, u32 seed_3)
22 {
23 Init(seed_0, seed_1, seed_2, seed_3);
24 }
25
26 void Init()
27 {
28 Init(0);
29 }
30
31 void Init(u32 seed)
32 {
33 static const u32 a = 1812433253;
34 mX = (seed ^ (seed >> 30)) * a + 1;
35 mY = (mX ^ (mX >> 30)) * a + 2;
36 mZ = (mY ^ (mY >> 30)) * a + 3;
37 mW = (mZ ^ (mZ >> 30)) * a + 4;
38 }
39
40 void Init(u32 seed_0, u32 seed_1, u32 seed_2, u32 seed_3)
41 {
42 if (seed_0 == 0 && seed_1 == 0 && seed_2 == 0 && seed_3 == 0) // seeds must not be all zero.
43 Init(0);
44
45 else
46 {
47 mX = seed_0;
48 mY = seed_1;
49 mZ = seed_2;
50 mW = seed_3;
51 }
52 }
53
55 {
56 u32 t = (mX^(mX<<11));
57 mX = mY;
58 mY = mZ;
59 mZ = mW;
60 mW = (mW^(mW>>19))^(t^(t>>8));
61 return mW;
62 }
63
64 u32 GetU32(u32 ceil)
65 {
66 return static_cast<u32>(((u64)GetU32() * ceil) >> 32);
67 }
68
69 s32 GetS32Range(s32 a, s32 b)
70 {
71 return GetU32(b - a) + a;
72 }
73
75 {
76 return f32(GetU32()) * (1.0f / 4294967296.0f);
77 }
78
79 f32 GetF32(f32 ceil)
80 {
81 return GetF32() * ceil;
82 }
83
84 f32 GetF32Range(f32 a, f32 b)
85 {
86 return GetF32(b - a) + a;
87 }
88
90 {
91 return GetU32() * (1.0 / 4294967296.0);
92 }
93
94 f64 GetF64(f64 ceil)
95 {
96 return GetF64() * ceil;
97 }
98
99 f64 GetF64Range(f64 a, f64 b)
100 {
101 return GetF64(b - a) + a;
102 }
103
105 {
106 return (GetU32() & 2) - 1;
107 }
108
109 bool GetBool()
110 {
111 return static_cast<bool>(GetU32() & 1);
112 }
113
114 void GetContext(u32* num_0, u32* num_1, u32* num_2, u32* num_3) const
115 {
116 *num_0 = mX;
117 *num_1 = mY;
118 *num_2 = mZ;
119 *num_3 = mW;
120 }
121
122private:
127};
128static_assert(sizeof(Random) == 0x10, "Random size mismatch");
129
130class Heap;
131
133{
134public:
136
137 static void CreateRandomTbl(Heap* heap);
138 static void DestroyRandomTbl(Heap* heap);
139
140 void SetSeed(u32 val)
141 {
142 mVec3RndIx = u16(val) >> 0;
143 mNormalizedVec3RndIx = u16(val) >> 16;
144 mRnd = u16(val);
145 }
146
147 const nw::math::VEC3& GetVec3 () { return mVec3Tbl [ ( mVec3RndIx++ ) & cNumVec3TblMask ]; }
148 const nw::math::VEC3& GetNormalizedVec3() { return mNormalizedVec3Tbl[ ( mNormalizedVec3RndIx++ ) & cNumVec3TblMask ]; }
149
151 {
152 u32 ret = mRnd;
153 mRnd = mRnd * 1103515245 + 12345;
154 return ret;
155 }
156
158 {
159 return f32(GetU32Direct()) * (1.0f / 4294967296.0f);
160 }
161
162 /* f32 GetF32(f32 ceil)
163 {
164 return GetF32() * ceil;
165 }
166
167 f32 GetF32Range(f32 a, f32 b)
168 {
169 return GetF32(b - a) + a;
170 } */
171
173 {
174 return GetU32Direct() >> 24;
175 }
176
177 s32 GetS32(int val)
178 {
179 return static_cast<s32>(((u64)GetU32Direct() * val) >> 32);
180 }
181
182 static Random* GetGlobalRandom();
183
184private:
185 enum
186 {
189 };
190
191 static nw::math::VEC3* mVec3Tbl;
193
197
199};
200static_assert(sizeof(PtclRandom) == 8, "nw::eft::PtclRandom size mismatch");
201
202} } // namespace nw::eft
203
204#endif // EFT_RANDOM_H_
Definition eft_Heap.h:9
Definition eft_Random.h:133
u32 GetU32Direct()
Definition eft_Random.h:150
u32 mRnd
Definition eft_Random.h:196
f32 GetF32()
Definition eft_Random.h:157
static Random gRandom
Definition eft_Random.h:198
static nw::math::VEC3 * mVec3Tbl
Definition eft_Random.h:191
s32 GetS32()
Definition eft_Random.h:172
const nw::math::VEC3 & GetVec3()
Definition eft_Random.h:147
static nw::math::VEC3 * mNormalizedVec3Tbl
Definition eft_Random.h:192
s32 GetS32(int val)
Definition eft_Random.h:177
void SetSeed(u32 val)
Definition eft_Random.h:140
@ cNumVec3Tbl
Definition eft_Random.h:187
@ cNumVec3TblMask
Definition eft_Random.h:188
u16 mNormalizedVec3RndIx
Definition eft_Random.h:195
static Random * GetGlobalRandom()
Definition eft_Random.cpp:11
const nw::math::VEC3 & GetNormalizedVec3()
Definition eft_Random.h:148
u16 mVec3RndIx
Definition eft_Random.h:194
static void CreateRandomTbl(Heap *heap)
Definition eft_Random.cpp:16
static void DestroyRandomTbl(Heap *heap)
Definition eft_Random.cpp:36
Definition eft_Random.h:9
s32 GetS32Range(s32 a, s32 b)
Definition eft_Random.h:69
f32 GetF32Range(f32 a, f32 b)
Definition eft_Random.h:84
u32 GetU32(u32 ceil)
Definition eft_Random.h:64
void Init()
Definition eft_Random.h:26
Random(u32 seed)
Definition eft_Random.h:16
u32 mY
Definition eft_Random.h:124
Random()
Definition eft_Random.h:11
int GetSign()
Definition eft_Random.h:104
void Init(u32 seed_0, u32 seed_1, u32 seed_2, u32 seed_3)
Definition eft_Random.h:40
void GetContext(u32 *num_0, u32 *num_1, u32 *num_2, u32 *num_3) const
Definition eft_Random.h:114
void Init(u32 seed)
Definition eft_Random.h:31
Random(u32 seed_0, u32 seed_1, u32 seed_2, u32 seed_3)
Definition eft_Random.h:21
f64 GetF64Range(f64 a, f64 b)
Definition eft_Random.h:99
u32 GetU32()
Definition eft_Random.h:54
u32 mW
Definition eft_Random.h:126
f32 GetF32()
Definition eft_Random.h:74
f32 GetF32(f32 ceil)
Definition eft_Random.h:79
f64 GetF64()
Definition eft_Random.h:89
f64 GetF64(f64 ceil)
Definition eft_Random.h:94
bool GetBool()
Definition eft_Random.h:109
u32 mZ
Definition eft_Random.h:125
u32 mX
Definition eft_Random.h:123
Definition eft_CafeWrapper.cpp:117