JSGraphics.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  2. // Please see LICENSE.md in repository root for license information
  3. // https://github.com/AtomicGameEngine/AtomicGameEngine
  4. #include "JSGraphics.h"
  5. #include "JSVM.h"
  6. #include <Atomic/Graphics/Material.h>
  7. #include <Atomic/Graphics/Light.h>
  8. namespace Atomic
  9. {
  10. static int Light_SetShadowCascade(duk_context* ctx)
  11. {
  12. //CascadeParameters(float split1, float split2, float split3, float split4, float fadeStart, float biasAutoAdjust = 1.0f) :
  13. int numargs = duk_get_top(ctx);
  14. float split1;
  15. float split2;
  16. float split3;
  17. float split4;
  18. float fadeStart;
  19. float biasAutoAdjust = 1.0f;
  20. split1 = (float) duk_to_number(ctx, 0);
  21. split2 = (float) duk_to_number(ctx, 1);
  22. split3 = (float) duk_to_number(ctx, 2);
  23. split4 = (float) duk_to_number(ctx, 3);
  24. fadeStart = (float) duk_to_number(ctx, 4);
  25. if (numargs == 6)
  26. biasAutoAdjust = (float) duk_to_number(ctx, 5);
  27. CascadeParameters cparms(split1, split2, split3, split4, fadeStart, biasAutoAdjust);
  28. duk_push_this(ctx);
  29. Light* light = js_to_class_instance<Light>(ctx, -1, 0);
  30. light->SetShadowCascade(cparms);
  31. return 0;
  32. }
  33. static int Light_SetShadowCascadeParameter(duk_context* ctx)
  34. {
  35. int index = (int) duk_require_number(ctx, 0);
  36. float value = (float) duk_require_number(ctx, 1);
  37. duk_push_this(ctx);
  38. Light* light = js_to_class_instance<Light>(ctx, -1, 0);
  39. CascadeParameters parms = light->GetShadowCascade();
  40. switch (index)
  41. {
  42. case 0:
  43. parms.splits_[0] = value;
  44. break;
  45. case 1:
  46. parms.splits_[1] = value;
  47. break;
  48. case 2:
  49. parms.splits_[2] = value;
  50. break;
  51. case 3:
  52. parms.splits_[3] = value;
  53. break;
  54. case 4:
  55. parms.fadeStart_ = value;
  56. break;
  57. case 5:
  58. parms.biasAutoAdjust_ = value;
  59. break;
  60. }
  61. light->SetShadowCascade(parms);
  62. return 0;
  63. }
  64. static int Light_GetShadowCascade(duk_context* ctx)
  65. {
  66. duk_push_this(ctx);
  67. Light* light = js_to_class_instance<Light>(ctx, -1, 0);
  68. const CascadeParameters& parms = light->GetShadowCascade();
  69. duk_push_array(ctx);
  70. duk_push_number(ctx, parms.splits_[0]);
  71. duk_put_prop_index(ctx, -2, 0);
  72. duk_push_number(ctx, parms.splits_[1]);
  73. duk_put_prop_index(ctx, -2, 1);
  74. duk_push_number(ctx, parms.splits_[2]);
  75. duk_put_prop_index(ctx, -2, 2);
  76. duk_push_number(ctx, parms.splits_[3]);
  77. duk_put_prop_index(ctx, -2, 3);
  78. duk_push_number(ctx, parms.fadeStart_);
  79. duk_put_prop_index(ctx, -2, 4);
  80. duk_push_number(ctx, parms.biasAutoAdjust_);
  81. duk_put_prop_index(ctx, -2, 5);
  82. return 1;
  83. }
  84. static int Light_SetShadowBias(duk_context* ctx)
  85. {
  86. float constantBias = (float) duk_to_number(ctx, 0);
  87. float slopeScaledBias = (float) duk_to_number(ctx, 1);
  88. BiasParameters bparms(constantBias, slopeScaledBias);
  89. duk_push_this(ctx);
  90. Light* light = js_to_class_instance<Light>(ctx, -1, 0);
  91. light->SetShadowBias(bparms);
  92. return 0;
  93. }
  94. // Material
  95. static int Material_SetShaderParameter(duk_context* ctx)
  96. {
  97. duk_push_this(ctx);
  98. Material* material = js_to_class_instance<Material>(ctx, -1, 0);
  99. const char* name = duk_require_string(ctx, 0);
  100. String value = duk_require_string(ctx, 1);
  101. const Variant& v = material->GetShaderParameter(name);
  102. if (v == Variant::EMPTY)
  103. return 0;
  104. Variant vset;
  105. vset.FromString(v.GetType(), value);
  106. material->SetShaderParameter(name, vset);
  107. return 0;
  108. }
  109. static int Material_GetShaderParameters(duk_context* ctx)
  110. {
  111. duk_push_this(ctx);
  112. Material* material = js_to_class_instance<Material>(ctx, -1, 0);
  113. const HashMap<StringHash, MaterialShaderParameter>& params = material->GetShaderParameters();
  114. duk_push_array(ctx);
  115. unsigned j = 0;
  116. for (HashMap<StringHash, MaterialShaderParameter>::ConstIterator i = params.Begin(); i != params.End(); ++i)
  117. {
  118. duk_push_object(ctx);
  119. duk_push_string(ctx, i->second_.name_.CString());
  120. duk_put_prop_string(ctx, -2, "name");
  121. js_push_variant(ctx, i->second_.value_);
  122. duk_put_prop_string(ctx, -2, "value");
  123. duk_push_string(ctx, i->second_.value_.ToString().CString());
  124. duk_put_prop_string(ctx, -2, "valueString");
  125. duk_push_string(ctx, i->second_.value_.GetTypeName().CString());
  126. duk_put_prop_string(ctx, -2, "typeName");
  127. duk_push_number(ctx, (double) i->second_.value_.GetType());
  128. duk_put_prop_string(ctx, -2, "type");
  129. duk_put_prop_index(ctx, -2, j++);
  130. }
  131. return 1;
  132. }
  133. static int Material_GetTextureUnitName(duk_context* ctx)
  134. {
  135. duk_push_string(ctx, Material::GetTextureUnitName((TextureUnit) ((int) duk_get_number(ctx, 0))).CString());
  136. return 1;
  137. }
  138. void jsapi_init_graphics(JSVM* vm)
  139. {
  140. duk_context* ctx = vm->GetJSContext();
  141. js_class_get_prototype(ctx, "Atomic", "Light");
  142. duk_push_c_function(ctx, Light_SetShadowCascade, DUK_VARARGS);
  143. duk_put_prop_string(ctx, -2, "setShadowCascade");
  144. duk_push_c_function(ctx, Light_SetShadowCascadeParameter, 2);
  145. duk_put_prop_string(ctx, -2, "setShadowCascadeParameter");
  146. duk_push_c_function(ctx, Light_GetShadowCascade, 0);
  147. duk_put_prop_string(ctx, -2, "getShadowCascade");
  148. duk_push_c_function(ctx, Light_SetShadowBias, 2);
  149. duk_put_prop_string(ctx, -2, "setShadowBias");
  150. duk_pop(ctx);
  151. js_class_get_prototype(ctx, "Atomic", "Material");
  152. duk_push_c_function(ctx, Material_GetShaderParameters, 0);
  153. duk_put_prop_string(ctx, -2, "getShaderParameters");
  154. duk_push_c_function(ctx, Material_SetShaderParameter, 2);
  155. duk_put_prop_string(ctx, -2, "setShaderParameter");
  156. duk_pop(ctx);
  157. // static methods
  158. js_class_get_constructor(ctx, "Atomic", "Material");
  159. duk_push_c_function(ctx, Material_GetTextureUnitName, 1);
  160. duk_put_prop_string(ctx, -2, "getTextureUnitName");
  161. duk_pop(ctx);
  162. }
  163. }