ground_utils.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma once
  2. #include "../gl/render_constants.h"
  3. #include <cmath>
  4. #include <cstdint>
  5. namespace Render::Ground {
  6. using std::uint32_t;
  7. namespace MathConstants {
  8. inline constexpr float k_two_pi = ::Render::GL::MathConstants::k_two_pi;
  9. }
  10. namespace HashConstants {
  11. inline constexpr uint32_t k_spatial_hash_prime_1 = 73856093U;
  12. inline constexpr uint32_t k_spatial_hash_prime_2 = 19349663U;
  13. inline constexpr uint32_t k_spatial_hash_prime_3 = 83492791U;
  14. inline constexpr uint32_t k_linear_congruential_multiplier = 1664525U;
  15. inline constexpr uint32_t k_linear_congruential_increment = 1013904223U;
  16. inline constexpr uint32_t k_xor_shift_amount_17 = 17;
  17. inline constexpr uint32_t k_xor_shift_amount_11 = 11;
  18. inline constexpr uint32_t k_xor_shift_amount_15 = 15;
  19. inline constexpr uint32_t k_xor_shift_amount_14 = 14;
  20. inline constexpr uint32_t k_hash_mix_multiplier_1 = 0xed5ad4bbU;
  21. inline constexpr uint32_t k_hash_mix_multiplier_2 = 0xac4c1b51U;
  22. inline constexpr uint32_t k_hash_mix_multiplier_3 = 0x31848babU;
  23. inline constexpr float k_noise_frequency_x = 127.1F;
  24. inline constexpr float k_noise_frequency_y = 311.7F;
  25. inline constexpr float k_noise_amplitude = 43758.5453123F;
  26. inline constexpr float k_temporal_variation_frequency = 37.0F;
  27. } // namespace HashConstants
  28. inline auto hash_coords(int x, int z, uint32_t salt = 0U) -> uint32_t {
  29. auto const ux =
  30. static_cast<uint32_t>(x * HashConstants::k_spatial_hash_prime_1);
  31. auto const uz =
  32. static_cast<uint32_t>(z * HashConstants::k_spatial_hash_prime_2);
  33. return ux ^ uz ^ (salt * HashConstants::k_spatial_hash_prime_3);
  34. }
  35. inline auto rand_01(uint32_t &state) -> float {
  36. state = state * HashConstants::k_linear_congruential_multiplier +
  37. HashConstants::k_linear_congruential_increment;
  38. return static_cast<float>((state >> ::Render::GL::BitShift::Shift8) &
  39. ::Render::GL::BitShift::Mask24Bit) /
  40. ::Render::GL::BitShift::Mask24BitFloat;
  41. }
  42. inline auto remap(float value, float min_out, float max_out) -> float {
  43. return min_out + (max_out - min_out) * value;
  44. }
  45. inline auto hash_to_01(uint32_t h) -> float {
  46. h ^= h >> HashConstants::k_xor_shift_amount_17;
  47. h *= HashConstants::k_hash_mix_multiplier_1;
  48. h ^= h >> HashConstants::k_xor_shift_amount_11;
  49. h *= HashConstants::k_hash_mix_multiplier_2;
  50. h ^= h >> HashConstants::k_xor_shift_amount_15;
  51. h *= HashConstants::k_hash_mix_multiplier_3;
  52. h ^= h >> HashConstants::k_xor_shift_amount_14;
  53. return static_cast<float>((h >> ::Render::GL::BitShift::Shift8) &
  54. ::Render::GL::BitShift::Mask24Bit) /
  55. ::Render::GL::BitShift::Mask24BitFloat;
  56. }
  57. inline auto noise_hash(float x, float y) -> float {
  58. float const n = std::sin(x * HashConstants::k_noise_frequency_x +
  59. y * HashConstants::k_noise_frequency_y) *
  60. HashConstants::k_noise_amplitude;
  61. return n - std::floor(n);
  62. }
  63. } // namespace Render::Ground