random_node.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. id : 0,
  86. node_id : 0,
  87. name : _tr("Value"),
  88. type : "VALUE",
  89. color : 0xffa1a1a1,
  90. default_value : f32_array_create_x(0.5),
  91. min : 0.0,
  92. max : 1.0,
  93. precision : 100,
  94. display : 0
  95. } ],
  96. buttons : [],
  97. width : 0,
  98. flags : 0
  99. };