random_node.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. type random_node_t = {
  2. base?: logic_node_t;
  3. };
  4. let random_node_a: i32;
  5. let random_node_b: i32;
  6. let random_node_c: i32;
  7. let random_node_d: i32 = -1;
  8. function random_node_create(raw: ui_node_t, args: f32_array_t): random_node_t {
  9. let n: random_node_t = {};
  10. n.base = logic_node_create(n);
  11. n.base.get = random_node_get;
  12. return n;
  13. }
  14. function random_node_get(self: random_node_t, from: i32): logic_node_value_t {
  15. let min: f32 = logic_node_input_get(self.base.inputs[0])._f32;
  16. let max: f32 = logic_node_input_get(self.base.inputs[1])._f32;
  17. let v: logic_node_value_t = { _f32: min + random_node_get_float() * (max - min) };
  18. return v;
  19. }
  20. function random_node_get_int(): i32 {
  21. if (random_node_d == -1) {
  22. random_node_set_seed(352124);
  23. }
  24. // Courtesy of https://github.com/Kode/Kha/blob/main/Sources/kha/math/Random.hx
  25. let t: i32 = (random_node_a + random_node_b | 0) + random_node_d | 0;
  26. random_node_d = random_node_d + 1 | 0;
  27. let urandom_node_b: u32 = random_node_b;
  28. random_node_a = random_node_b ^ urandom_node_b >> 9;
  29. random_node_b = random_node_c + (random_node_c << 3) | 0;
  30. let urandom_node_c: u32 = random_node_c;
  31. random_node_c = random_node_c << 21 | urandom_node_c >> 11;
  32. random_node_c = random_node_c + t | 0;
  33. return t & 0x7fffffff;
  34. }
  35. function random_node_set_seed(seed: i32) {
  36. random_node_d = seed;
  37. random_node_a = 0x36aef51a;
  38. random_node_b = 0x21d4b3eb;
  39. random_node_c = 0xf2517abf;
  40. // Immediately skip a few possibly poor results the easy way
  41. for (let i: i32 = 0; i < 15; ++i) {
  42. random_node_get_int();
  43. }
  44. }
  45. function random_node_get_seed(): i32 {
  46. return random_node_d;
  47. }
  48. function random_node_get_float(): f32 {
  49. return random_node_get_int() / 0x7fffffff;
  50. }
  51. let random_node_def: ui_node_t = {
  52. id: 0,
  53. name: _tr("Random"),
  54. type: "random_node",
  55. x: 0,
  56. y: 0,
  57. color: 0xffb34f5a,
  58. inputs: [
  59. {
  60. id: 0,
  61. node_id: 0,
  62. name: _tr("Min"),
  63. type: "VALUE",
  64. color: 0xffa1a1a1,
  65. default_value: f32_array_create_x(0.0),
  66. min: 0.0,
  67. max: 1.0,
  68. precision: 100,
  69. display: 0
  70. },
  71. {
  72. id: 0,
  73. node_id: 0,
  74. name: _tr("Max"),
  75. type: "VALUE",
  76. color: 0xffa1a1a1,
  77. default_value: f32_array_create_x(1.0),
  78. min: 0.0,
  79. max: 1.0,
  80. precision: 100,
  81. display: 0
  82. }
  83. ],
  84. outputs: [
  85. {
  86. id: 0,
  87. node_id: 0,
  88. name: _tr("Value"),
  89. type: "VALUE",
  90. color: 0xffa1a1a1,
  91. default_value: f32_array_create_x(0.5),
  92. min: 0.0,
  93. max: 1.0,
  94. precision: 100,
  95. display: 0
  96. }
  97. ],
  98. buttons: [],
  99. width: 0
  100. };