2
0
Эх сурвалжийг харах

Add stable random generator.

Eugene Kozlov 9 жил өмнө
parent
commit
89fb47f550

+ 3 - 1
Source/Urho3D/AngelScript/MathAPI.cpp

@@ -257,13 +257,14 @@ static void RegisterVector2(asIScriptEngine* engine)
     engine->RegisterObjectProperty("Vector2", "float x", offsetof(Vector2, x_));
     engine->RegisterObjectProperty("Vector2", "float y", offsetof(Vector2, y_));
 
+    engine->RegisterGlobalFunction("float StableRandom(const Vector2&in)", asFUNCTIONPR(StableRandom, (const Vector2&), float), asCALL_CDECL);
+    engine->RegisterGlobalFunction("float StableRandom(float)", asFUNCTIONPR(StableRandom, (float), float), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorLerp(const Vector2&in, const Vector2&in, const Vector2&in)", asFUNCTIONPR(VectorLerp, (const Vector2&, const Vector2&, const Vector2&), Vector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorMin(const Vector2&in, const Vector2&in)", asFUNCTIONPR(VectorMin, (const Vector2&, const Vector2&), Vector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorMax(const Vector2&in, const Vector2&in)", asFUNCTIONPR(VectorMax, (const Vector2&, const Vector2&), Vector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorFloor(const Vector2&in)", asFUNCTIONPR(VectorFloor, (const Vector2&), Vector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorRound(const Vector2&in)", asFUNCTIONPR(VectorFloor, (const Vector2&), Vector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector2 VectorCeil(const Vector2&in)", asFUNCTIONPR(VectorFloor, (const Vector2&), Vector2), asCALL_CDECL);
-
     engine->RegisterGlobalFunction("IntVector2 VectorFloorToInt(const Vector2&in)", asFUNCTIONPR(VectorFloorToInt, (const Vector2&), IntVector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("IntVector2 VectorRoundToInt(const Vector2&in)", asFUNCTIONPR(VectorRoundToInt, (const Vector2&), IntVector2), asCALL_CDECL);
     engine->RegisterGlobalFunction("IntVector2 VectorCeilToInt(const Vector2&in)", asFUNCTIONPR(VectorCeilToInt, (const Vector2&), IntVector2), asCALL_CDECL);
@@ -353,6 +354,7 @@ static void RegisterVector3(asIScriptEngine* engine)
     engine->RegisterObjectProperty("Vector3", "float y", offsetof(Vector3, y_));
     engine->RegisterObjectProperty("Vector3", "float z", offsetof(Vector3, z_));
 
+    engine->RegisterGlobalFunction("float StableRandom(const Vector3&in)", asFUNCTIONPR(StableRandom, (const Vector3&), float), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector3 VectorLerp(const Vector3&in, const Vector3&in, const Vector3&in)", asFUNCTIONPR(VectorLerp, (const Vector3&, const Vector3&, const Vector3&), Vector3), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector3 VectorMin(const Vector3&in, const Vector3&in)", asFUNCTIONPR(VectorMin, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL);
     engine->RegisterGlobalFunction("Vector3 VectorMax(const Vector3&in, const Vector3&in)", asFUNCTIONPR(VectorMax, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL);

+ 2 - 0
Source/Urho3D/LuaScript/pkgs/Math/Vector2.pkg

@@ -77,3 +77,5 @@ IntVector2 VectorRoundToInt(const Vector2& vec);
 IntVector2 VectorCeilToInt(const Vector2& vec);
 IntVector2 VectorMin(const IntVector2& lhs, const IntVector2& rhs);
 IntVector2 VectorMax(const IntVector2& lhs, const IntVector2& rhs);
+float StableRandom(const Vector2& seed);
+float StableRandom(float seed);

+ 1 - 0
Source/Urho3D/LuaScript/pkgs/Math/Vector3.pkg

@@ -54,3 +54,4 @@ Vector3 VectorMax(const Vector3& lhs, const Vector3& rhs);
 Vector3 VectorFloor(const Vector3& vec);
 Vector3 VectorRound(const Vector3& vec);
 Vector3 VectorCeil(const Vector3& vec);
+float StableRandom(const Vector3& seed);

+ 1 - 1
Source/Urho3D/Math/MathDefs.h

@@ -155,7 +155,7 @@ template <class T> T Sqrt(T x) { return sqrt(x); }
 /// Return floating-point remainder of X/Y.
 template <class T> T Mod(T x, T y) { return fmod(x, y); }
 
-/// Return fractional part of passed value in range [0, 1].
+/// Return fractional part of passed value in range [0, 1).
 template <class T> T Fract(T value) { return value - floor(value); }
 
 /// Round value down.

+ 7 - 0
Source/Urho3D/Math/Vector2.h

@@ -374,4 +374,11 @@ inline IntVector2 VectorMin(const IntVector2& lhs, const IntVector2& rhs) { retu
 /// Per-component max of two 2-vectors.
 inline IntVector2 VectorMax(const IntVector2& lhs, const IntVector2& rhs) { return IntVector2(Max(lhs.x_, rhs.x_), Max(lhs.y_, rhs.y_)); }
 
+/// Return a random value from [0, 1) from 2-vector seed.
+/// http://stackoverflow.com/questions/12964279/whats-the-origin-of-this-glsl-rand-one-liner
+inline float StableRandom(const Vector2& seed) { return Fract(Sin(seed.DotProduct(Vector2(12.9898f, 78.233f)) * M_RADTODEG) * 43758.5453f); }
+
+/// Return a random value from [0, 1) from scalar seed.
+inline float StableRandom(float seed) { return StableRandom(Vector2(seed, seed)); }
+
 }

+ 3 - 0
Source/Urho3D/Math/Vector3.h

@@ -302,4 +302,7 @@ inline Vector3 VectorRound(const Vector3& vec) { return Vector3(Round(vec.x_), R
 /// Per-component ceil of 3-vector.
 inline Vector3 VectorCeil(const Vector3& vec) { return Vector3(Ceil(vec.x_), Ceil(vec.y_), Ceil(vec.z_)); }
 
+/// Return a random value from [0, 1) from 3-vector seed.
+inline float StableRandom(const Vector3& seed) { return StableRandom(Vector2(StableRandom(Vector2(seed.x_, seed.y_)), seed.z_)); }
+
 }