JSMath.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "JSVM.h"
  2. #include <Atomic/Math/Ray.h>
  3. namespace Atomic
  4. {
  5. bool duk_get_vector2(duk_context* ctx, duk_idx_t idx, Vector2& vec2)
  6. {
  7. idx = duk_normalize_index(ctx, idx);
  8. // check that we are an array of length 3
  9. if (!duk_is_array(ctx, idx) || duk_get_length(ctx, idx) != 2)
  10. return false;
  11. // get the array values
  12. duk_get_prop_index(ctx, idx, 0);
  13. duk_get_prop_index(ctx, idx, 1);
  14. if (!duk_is_number(ctx, -2) || !duk_is_number(ctx, -1))
  15. {
  16. // pop off and return false
  17. duk_pop_2(ctx);
  18. return false;
  19. }
  20. vec2.x_ = (float) duk_to_number(ctx, -2);
  21. vec2.y_ = (float) duk_to_number(ctx, -1);
  22. duk_pop_2(ctx);
  23. return true;
  24. }
  25. bool duk_set_vector2(duk_context* ctx, duk_idx_t idx, const Vector2& vec2)
  26. {
  27. idx = duk_normalize_index(ctx, idx);
  28. if (!duk_is_array(ctx, idx))
  29. return false;
  30. duk_push_number(ctx, vec2.x_);
  31. duk_put_prop_index(ctx, idx, 0);
  32. duk_push_number(ctx, vec2.y_);
  33. duk_put_prop_index(ctx, idx, 1);
  34. return true;
  35. }
  36. void duk_push_new_vector2(duk_context* ctx, const Vector2& vec2)
  37. {
  38. duk_push_array(ctx);
  39. duk_set_vector2(ctx, -1, vec2);
  40. }
  41. bool duk_get_vector3(duk_context* ctx, duk_idx_t idx, Vector3& vec3)
  42. {
  43. idx = duk_normalize_index(ctx, idx);
  44. // check that we are an array of length 3
  45. if (!duk_is_array(ctx, idx) || duk_get_length(ctx, idx) != 3)
  46. return false;
  47. // get the array values
  48. duk_get_prop_index(ctx, idx, 0);
  49. duk_get_prop_index(ctx, idx, 1);
  50. duk_get_prop_index(ctx, idx, 2);
  51. if (!duk_is_number(ctx, -3) || !duk_is_number(ctx, -2) || !duk_is_number(ctx, -1))
  52. {
  53. // pop off and return false
  54. duk_pop_3(ctx);
  55. return false;
  56. }
  57. vec3.x_ = (float) duk_to_number(ctx, -3);
  58. vec3.y_ = (float) duk_to_number(ctx, -2);
  59. vec3.z_ = (float) duk_to_number(ctx, -1);
  60. duk_pop_3(ctx);
  61. return true;
  62. }
  63. bool duk_set_vector3(duk_context* ctx, duk_idx_t idx, const Vector3& vec3)
  64. {
  65. idx = duk_normalize_index(ctx, idx);
  66. if (!duk_is_array(ctx, idx))
  67. return false;
  68. duk_push_number(ctx, vec3.x_);
  69. duk_put_prop_index(ctx, idx, 0);
  70. duk_push_number(ctx, vec3.y_);
  71. duk_put_prop_index(ctx, idx, 1);
  72. duk_push_number(ctx, vec3.z_);
  73. duk_put_prop_index(ctx, idx, 2);
  74. return true;
  75. }
  76. void duk_push_new_vector3(duk_context* ctx, const Vector3& vec3)
  77. {
  78. duk_push_array(ctx);
  79. duk_set_vector3(ctx, -1, vec3);
  80. }
  81. bool duk_get_ray(duk_context* ctx, duk_idx_t idx, Ray& ray)
  82. {
  83. idx = duk_normalize_index(ctx, idx);
  84. // check that we are an object
  85. if (!duk_is_object(ctx, idx))
  86. return false;
  87. duk_get_prop_string(ctx, idx, "origin");
  88. duk_get_prop_string(ctx, idx, "direction");
  89. if (!duk_get_vector3(ctx, -2, ray.origin_) || !duk_get_vector3(ctx, -1, ray.direction_))
  90. {
  91. duk_pop_2(ctx);
  92. return false;
  93. }
  94. duk_pop_2(ctx);
  95. return true;
  96. }
  97. bool duk_set_ray(duk_context* ctx, duk_idx_t idx, const Ray& ray)
  98. {
  99. idx = duk_normalize_index(ctx, idx);
  100. if (!duk_is_object(ctx, idx))
  101. return false;
  102. duk_push_new_vector3(ctx, ray.origin_);
  103. duk_put_prop_string(ctx, idx, "origin");
  104. duk_push_new_vector3(ctx, ray.direction_);
  105. duk_put_prop_string(ctx, idx, "direction");
  106. return true;
  107. }
  108. void duk_push_new_ray(duk_context* ctx, const Ray& ray)
  109. {
  110. duk_push_object(ctx);
  111. duk_set_ray(ctx, -1, ray);
  112. }
  113. }