/xbmc/visualizations/Vortex/angelscript/add_on/scriptmath3d/scriptmath3d.cpp

http://github.com/xbmc/xbmc · C++ · 331 lines · 254 code · 53 blank · 24 comment · 8 complexity · 9fbca77ae2d477931721271ada7cc421 MD5 · raw file

  1. #include <assert.h>
  2. #include <string.h> // strstr
  3. #include <new> // new()
  4. #include <math.h>
  5. #include "scriptmath3d.h"
  6. BEGIN_AS_NAMESPACE
  7. Vector3::Vector3()
  8. {
  9. x = 0;
  10. y = 0;
  11. z = 0;
  12. }
  13. Vector3::Vector3(const Vector3 &other)
  14. {
  15. x = other.x;
  16. y = other.y;
  17. z = other.z;
  18. }
  19. Vector3::Vector3(float _x, float _y, float _z)
  20. {
  21. x = _x;
  22. y = _y;
  23. z = _z;
  24. }
  25. bool operator==(const Vector3 &a, const Vector3 &b)
  26. {
  27. return (a.x == b.x) && (a.y == b.y) && (a.z == b.z);
  28. }
  29. bool operator!=(const Vector3 &a, const Vector3 &b)
  30. {
  31. return !(a == b);
  32. }
  33. Vector3 &Vector3::operator=(const Vector3 &other)
  34. {
  35. x = other.x;
  36. y = other.y;
  37. z = other.z;
  38. return *this;
  39. }
  40. Vector3 &Vector3::operator+=(const Vector3 &other)
  41. {
  42. x += other.x;
  43. y += other.y;
  44. z += other.z;
  45. return *this;
  46. }
  47. Vector3 &Vector3::operator-=(const Vector3 &other)
  48. {
  49. x -= other.x;
  50. y -= other.y;
  51. z -= other.z;
  52. return *this;
  53. }
  54. Vector3 &Vector3::operator*=(float s)
  55. {
  56. x *= s;
  57. y *= s;
  58. z *= s;
  59. return *this;
  60. }
  61. Vector3 &Vector3::operator/=(float s)
  62. {
  63. x /= s;
  64. y /= s;
  65. z /= s;
  66. return *this;
  67. }
  68. float Vector3::length() const
  69. {
  70. return sqrtf(x*x + y*y + z*z);
  71. }
  72. Vector3 operator+(const Vector3 &a, const Vector3 &b)
  73. {
  74. // Return a new object as a script handle
  75. Vector3 res(a.x + b.x, a.y + b.y, a.z + b.z);
  76. return res;
  77. }
  78. Vector3 operator-(const Vector3 &a, const Vector3 &b)
  79. {
  80. // Return a new object as a script handle
  81. Vector3 res(a.x - b.x, a.y - b.y, a.z - b.z);
  82. return res;
  83. }
  84. Vector3 operator*(float s, const Vector3 &v)
  85. {
  86. // Return a new object as a script handle
  87. Vector3 res(v.x * s, v.y * s, v.z * s);
  88. return res;
  89. }
  90. Vector3 operator*(const Vector3 &v, float s)
  91. {
  92. // Return a new object as a script handle
  93. Vector3 res(v.x * s, v.y * s, v.z * s);
  94. return res;
  95. }
  96. Vector3 operator/(const Vector3 &v, float s)
  97. {
  98. // Return a new object as a script handle
  99. Vector3 res(v.x / s, v.y / s, v.z / s);
  100. return res;
  101. }
  102. //-----------------------
  103. // AngelScript functions
  104. //-----------------------
  105. static void Vector3DefaultConstructor(Vector3 *self)
  106. {
  107. new(self) Vector3();
  108. }
  109. static void Vector3CopyConstructor(const Vector3 &other, Vector3 *self)
  110. {
  111. new(self) Vector3(other);
  112. }
  113. static void Vector3InitConstructor(float x, float y, float z, Vector3 *self)
  114. {
  115. new(self) Vector3(x,y,z);
  116. }
  117. //-----------------------
  118. // Generic calling convention
  119. //-----------------------
  120. static void Vector3DefaultConstructor_Generic(asIScriptGeneric *gen)
  121. {
  122. Vector3 *self = (Vector3*)gen->GetObject();
  123. new(self) Vector3();
  124. }
  125. static void Vector3CopyConstructor_Generic(asIScriptGeneric *gen)
  126. {
  127. Vector3 *other = (Vector3*)gen->GetArgObject(0);
  128. Vector3 *self = (Vector3*)gen->GetObject();
  129. Vector3CopyConstructor(*other, self);
  130. }
  131. static void Vector3InitConstructor_Generic(asIScriptGeneric *gen)
  132. {
  133. float x = gen->GetArgFloat(0);
  134. float y = gen->GetArgFloat(1);
  135. float z = gen->GetArgFloat(2);
  136. Vector3 *self = (Vector3*)gen->GetObject();
  137. Vector3InitConstructor(x,y,z,self);
  138. }
  139. static void Vector3Equal_Generic(asIScriptGeneric *gen)
  140. {
  141. Vector3 *a = (Vector3*)gen->GetObject();
  142. Vector3 *b = (Vector3*)gen->GetArgAddress(0);
  143. bool r = *a == *b;
  144. *(bool*)gen->GetAddressOfReturnLocation() = r;
  145. }
  146. static void Vector3Length_Generic(asIScriptGeneric *gen)
  147. {
  148. Vector3 *s = (Vector3*)gen->GetObject();
  149. gen->SetReturnFloat(s->length());
  150. }
  151. static void Vector3AddAssign_Generic(asIScriptGeneric *gen)
  152. {
  153. Vector3 *a = (Vector3*)gen->GetArgAddress(0);
  154. Vector3 *thisPointer = (Vector3*)gen->GetObject();
  155. *thisPointer += *a;
  156. gen->SetReturnAddress(thisPointer);
  157. }
  158. static void Vector3SubAssign_Generic(asIScriptGeneric *gen)
  159. {
  160. Vector3 *a = (Vector3*)gen->GetArgAddress(0);
  161. Vector3 *thisPointer = (Vector3*)gen->GetObject();
  162. *thisPointer -= *a;
  163. gen->SetReturnAddress(thisPointer);
  164. }
  165. static void Vector3MulAssign_Generic(asIScriptGeneric *gen)
  166. {
  167. float s = gen->GetArgFloat(0);
  168. Vector3 *thisPointer = (Vector3*)gen->GetObject();
  169. *thisPointer *= s;
  170. gen->SetReturnAddress(thisPointer);
  171. }
  172. static void Vector3DivAssign_Generic(asIScriptGeneric *gen)
  173. {
  174. float s = gen->GetArgFloat(0);
  175. Vector3 *thisPointer = (Vector3*)gen->GetObject();
  176. *thisPointer /= s;
  177. gen->SetReturnAddress(thisPointer);
  178. }
  179. static void Vector3Add_Generic(asIScriptGeneric *gen)
  180. {
  181. Vector3 *a = (Vector3*)gen->GetObject();
  182. Vector3 *b = (Vector3*)gen->GetArgAddress(0);
  183. Vector3 res = *a + *b;
  184. gen->SetReturnObject(&res);
  185. }
  186. static void Vector3Sub_Generic(asIScriptGeneric *gen)
  187. {
  188. Vector3 *a = (Vector3*)gen->GetObject();
  189. Vector3 *b = (Vector3*)gen->GetArgAddress(0);
  190. Vector3 res = *a - *b;
  191. gen->SetReturnObject(&res);
  192. }
  193. static void Vector3FloatMulVector3_Generic(asIScriptGeneric *gen)
  194. {
  195. float s = gen->GetArgFloat(0);
  196. Vector3 *v = (Vector3*)gen->GetObject();
  197. Vector3 res = s * *v;
  198. gen->SetReturnObject(&res);
  199. }
  200. static void Vector3Vector3MulFloat_Generic(asIScriptGeneric *gen)
  201. {
  202. Vector3 *v = (Vector3*)gen->GetObject();
  203. float s = gen->GetArgFloat(0);
  204. Vector3 res = *v * s;
  205. gen->SetReturnObject(&res);
  206. }
  207. static void Vector3Vector3DivFloat_Generic(asIScriptGeneric *gen)
  208. {
  209. Vector3 *v = (Vector3*)gen->GetObject();
  210. float s = gen->GetArgFloat(0);
  211. Vector3 res = *v / s;
  212. gen->SetReturnObject(&res);
  213. }
  214. //--------------------------------
  215. // Registration
  216. //-------------------------------------
  217. void RegisterScriptMath3D_Native(asIScriptEngine *engine)
  218. {
  219. int r;
  220. // Register the type
  221. r = engine->RegisterObjectType("vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA); assert( r >= 0 );
  222. // Register the object properties
  223. r = engine->RegisterObjectProperty("vector3", "float x", offsetof(Vector3, x)); assert( r >= 0 );
  224. r = engine->RegisterObjectProperty("vector3", "float y", offsetof(Vector3, y)); assert( r >= 0 );
  225. r = engine->RegisterObjectProperty("vector3", "float z", offsetof(Vector3, z)); assert( r >= 0 );
  226. // Register the constructors
  227. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Vector3DefaultConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  228. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(const vector3 &in)", asFUNCTION(Vector3CopyConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  229. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(Vector3InitConstructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  230. // Register the operator overloads
  231. r = engine->RegisterObjectMethod("vector3", "vector3 &opAddAssign(const vector3 &in)", asMETHODPR(Vector3, operator+=, (const Vector3 &), Vector3&), asCALL_THISCALL); assert( r >= 0 );
  232. r = engine->RegisterObjectMethod("vector3", "vector3 &opSubAssign(const vector3 &in)", asMETHODPR(Vector3, operator-=, (const Vector3 &), Vector3&), asCALL_THISCALL); assert( r >= 0 );
  233. r = engine->RegisterObjectMethod("vector3", "vector3 &opMulAssign(float)", asMETHODPR(Vector3, operator*=, (float), Vector3&), asCALL_THISCALL); assert( r >= 0 );
  234. r = engine->RegisterObjectMethod("vector3", "vector3 &opDivAssign(float)", asMETHODPR(Vector3, operator/=, (float), Vector3&), asCALL_THISCALL); assert( r >= 0 );
  235. r = engine->RegisterObjectMethod("vector3", "bool opEquals(const vector3 &in) const", asFUNCTIONPR(operator==, (const Vector3&, const Vector3&), bool), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  236. r = engine->RegisterObjectMethod("vector3", "vector3 opAdd(const vector3 &in) const", asFUNCTIONPR(operator+, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  237. r = engine->RegisterObjectMethod("vector3", "vector3 opSub(const vector3 &in) const", asFUNCTIONPR(operator-, (const Vector3&, const Vector3&), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  238. r = engine->RegisterObjectMethod("vector3", "vector3 opMul(float) const", asFUNCTIONPR(operator*, (const Vector3&, float), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  239. r = engine->RegisterObjectMethod("vector3", "vector3 opMul_r(float) const", asFUNCTIONPR(operator*, (float, const Vector3&), Vector3), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  240. r = engine->RegisterObjectMethod("vector3", "vector3 opDiv(float) const", asFUNCTIONPR(operator/, (const Vector3&, float), Vector3), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  241. // Register the object methods
  242. r = engine->RegisterObjectMethod("vector3", "float length() const", asMETHOD(Vector3,length), asCALL_THISCALL); assert( r >= 0 );
  243. }
  244. void RegisterScriptMath3D_Generic(asIScriptEngine *engine)
  245. {
  246. int r;
  247. // Register the type
  248. r = engine->RegisterObjectType("vector3", sizeof(Vector3), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CA); assert( r >= 0 );
  249. // Register the object properties
  250. r = engine->RegisterObjectProperty("vector3", "float x", offsetof(Vector3, x)); assert( r >= 0 );
  251. r = engine->RegisterObjectProperty("vector3", "float y", offsetof(Vector3, y)); assert( r >= 0 );
  252. r = engine->RegisterObjectProperty("vector3", "float z", offsetof(Vector3, z)); assert( r >= 0 );
  253. // Register the constructors
  254. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Vector3DefaultConstructor_Generic), asCALL_GENERIC); assert( r >= 0 );
  255. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(const vector3 &in)", asFUNCTION(Vector3CopyConstructor_Generic), asCALL_GENERIC); assert( r >= 0 );
  256. r = engine->RegisterObjectBehaviour("vector3", asBEHAVE_CONSTRUCT, "void f(float, float, float)", asFUNCTION(Vector3InitConstructor_Generic), asCALL_GENERIC); assert( r >= 0 );
  257. // Register the operator overloads
  258. r = engine->RegisterObjectMethod("vector3", "vector3 &opAddAssign(const vector3 &in)", asFUNCTION(Vector3AddAssign_Generic), asCALL_GENERIC); assert( r >= 0 );
  259. r = engine->RegisterObjectMethod("vector3", "vector3 &opSubAssign(const vector3 &in)", asFUNCTION(Vector3SubAssign_Generic), asCALL_GENERIC); assert( r >= 0 );
  260. r = engine->RegisterObjectMethod("vector3", "vector3 &opMulAssign(float)", asFUNCTION(Vector3MulAssign_Generic), asCALL_GENERIC); assert( r >= 0 );
  261. r = engine->RegisterObjectMethod("vector3", "vector3 &opDivAssign(float)", asFUNCTION(Vector3DivAssign_Generic), asCALL_GENERIC); assert( r >= 0 );
  262. r = engine->RegisterObjectMethod("vector3", "bool opEquals(const vector3 &in) const", asFUNCTION(Vector3Equal_Generic), asCALL_GENERIC); assert( r >= 0 );
  263. r = engine->RegisterObjectMethod("vector3", "vector3 opAdd(const vector3 &in) const", asFUNCTION(Vector3Add_Generic), asCALL_GENERIC); assert( r >= 0 );
  264. r = engine->RegisterObjectMethod("vector3", "vector3 opSub(const vector3 &in) const", asFUNCTION(Vector3Sub_Generic), asCALL_GENERIC); assert( r >= 0 );
  265. r = engine->RegisterObjectMethod("vector3", "vector3 opMul_r(float) const", asFUNCTION(Vector3FloatMulVector3_Generic), asCALL_GENERIC); assert( r >= 0 );
  266. r = engine->RegisterObjectMethod("vector3", "vector3 opMul(float) const", asFUNCTION(Vector3Vector3MulFloat_Generic), asCALL_GENERIC); assert( r >= 0 );
  267. r = engine->RegisterObjectMethod("vector3", "vector3 opDiv(float) const", asFUNCTION(Vector3Vector3DivFloat_Generic), asCALL_GENERIC); assert( r >= 0 );
  268. // Register the object methods
  269. r = engine->RegisterObjectMethod("vector3", "float length() const", asFUNCTION(Vector3Length_Generic), asCALL_GENERIC); assert( r >= 0 );
  270. }
  271. void RegisterScriptMath3D(asIScriptEngine *engine)
  272. {
  273. if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") )
  274. RegisterScriptMath3D_Generic(engine);
  275. else
  276. RegisterScriptMath3D_Native(engine);
  277. }
  278. END_AS_NAMESPACE