00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "asIrrHelper.h"
00018 #include "asRect.h"
00019 #include "asDimension2d.h"
00020 #include "asVector2d.h"
00021
00022
00023
00027 template<typename T>
00028 void constructor(void *memory)
00029 {
00030 new (memory) rect<T>();
00031 }
00032
00036 template<typename T>
00037 void constructor(const position2d<T> &pos, const dimension2d<T> &size, void *memory)
00038 {
00039 new (memory) rect<T>(pos, size);
00040 }
00041
00045 template<typename T>
00046 void constructor(const position2d<T> &upperLeft, const position2d<T> &lowerRight, void *memory)
00047 {
00048 new (memory) rect<T>(upperLeft, lowerRight);
00049 }
00050
00054 template<typename T>
00055 void deconstructor(void *memory)
00056 {
00057 ((rect<T>*)memory)->~rect<T>();
00058 }
00059
00060
00065 template<typename T>
00066 void bindRectT(asIScriptEngine *engine, const char *typeName, const char *asType)
00067 {
00068
00069 int r;
00070 std::stringstream ss;
00071
00072
00073 r = engine->RegisterObjectType(typeName, sizeof(rect<T>), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert(r >= 0);
00074
00075
00076
00077 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, "void f()", asFUNCTIONPR(constructor<T>,
00078 (void*), void), asCALL_CDECL_OBJLAST); assert(r >= 0);
00079
00080 ss.str("");
00081 ss << "void f(const " << getVector2dName(asType) << " &in, const " << getDimension2dName(asType) << " &in)";
00082 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, ss.str().c_str(), asFUNCTIONPR(constructor<T>,
00083 (const position2d<T>&, const dimension2d<T>&, void*), void),
00084 asCALL_CDECL_OBJLAST); assert(r >= 0);
00085
00086 ss.str("");
00087 ss << "void f(const " << getVector2dName(asType) << " &in, const " << getVector2dName(asType) << " &in)";
00088 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_CONSTRUCT, ss.str().c_str(), asFUNCTIONPR(constructor<T>,
00089 (const position2d<T>&, const position2d<T>&, void*), void),
00090 asCALL_CDECL_OBJLAST); assert(r >= 0);
00091
00092 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_DESTRUCT, "void f()", asFUNCTION(deconstructor<T>),
00093 asCALL_CDECL_OBJLAST); assert(r >= 0);
00094
00095
00096 ss.str("");
00097 ss << typeName << " f(const " << typeName << " &in, const " << getVector2dName(asType) << "&in)";
00098 std::string declActionType = ss.str();
00099
00100 ss.str("");
00101 ss << typeName << "& f(const " << getVector2dName(asType) << "&in)";
00102 std::string declAssignType = ss.str();
00103
00104
00105 r = engine->RegisterGlobalBehaviour(asBEHAVE_ADD, declActionType.c_str(),
00106 asFUNCTIONPR((add< rect<T>, rect<T>, position2d<T> >),
00107 (const rect<T>&, const position2d<T>&), rect<T>),
00108 asCALL_CDECL); assert(r >= 0);
00109
00110
00111 ss.str("");
00112 ss << typeName << "& f(const " << getVector2dName(asType) << "&in)";
00113 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_ADD_ASSIGN, declAssignType.c_str(),
00114 asMETHODPR(rect<T>, operator+=, (const position2d<T>&),
00115 rect<T>&), asCALL_THISCALL); assert(r >= 0);
00116
00117
00118 r = engine->RegisterGlobalBehaviour(asBEHAVE_SUBTRACT, declActionType.c_str(),
00119 asFUNCTIONPR((substract< rect<T>, rect<T>, position2d<T> >),
00120 (const rect<T>&, const position2d<T>&), rect<T>),
00121 asCALL_CDECL); assert(r >= 0);
00122
00123
00124 r = engine->RegisterObjectBehaviour(typeName, asBEHAVE_SUB_ASSIGN, declAssignType.c_str(),
00125 asMETHODPR(rect<T>, operator-=, (const position2d<T>&),
00126 rect<T>&), asCALL_THISCALL); assert(r >= 0);
00127
00128
00129 ss.str("");
00130 ss << "bool f(const " << typeName << " &in, const " << typeName << " &in)";
00131 std::string declComparison = ss.str();
00132
00133 r = engine->RegisterGlobalBehaviour(asBEHAVE_EQUAL, declComparison.c_str(), asFUNCTIONPR(equal< rect<T> >,
00134 (const rect<T>&, const rect<T>&), bool), asCALL_CDECL); assert(r >= 0);
00135 r = engine->RegisterGlobalBehaviour(asBEHAVE_NOTEQUAL, declComparison.c_str(), asFUNCTIONPR(not_equal< rect<T> >,
00136 (const rect<T>&, const rect<T>&), bool), asCALL_CDECL); assert(r >= 0);
00137 r = engine->RegisterGlobalBehaviour(asBEHAVE_LESSTHAN, declComparison.c_str(), asFUNCTIONPR(less_than< rect<T> >,
00138 (const rect<T>&, const rect<T>&), bool), asCALL_CDECL); assert(r >= 0);
00139
00140
00141 ss.str("");
00142 ss << "void addInternalPoint(const " << getVector2dName(asType) << " &in)";
00143 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00144 asMETHODPR(rect<T>, addInternalPoint, (const position2d<T>&), void),
00145 asCALL_THISCALL); assert(r >= 0);
00146
00147 ss.str("");
00148 ss << "void clipAgainst(const " << typeName << " &in)";
00149 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00150 asMETHOD(rect<T>, clipAgainst), asCALL_THISCALL); assert(r >= 0);
00151
00152 ss.str("");
00153 ss << "void constrainTo(const " << typeName << " &in)";
00154 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00155 asMETHOD(rect<T>, constrainTo), asCALL_THISCALL); assert(r >= 0);
00156
00157 ss.str("");
00158 ss << asType << " getArea()";
00159 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00160 asMETHOD(rect<T>, getArea), asCALL_THISCALL); assert(r >= 0);
00161
00162 ss.str("");
00163 ss << getVector2dName(asType) << " getCenter()";
00164 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00165 asMETHOD(rect<T>, getCenter), asCALL_THISCALL); assert(r >= 0);
00166
00167 ss.str("");
00168 ss << asType << " getHeight()";
00169 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00170 asMETHOD(rect<T>, getHeight), asCALL_THISCALL); assert(r >= 0);
00171
00172 ss.str("");
00173 ss << getDimension2dName(asType) << " getSize()";
00174 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00175 asMETHOD(rect<T>, getSize), asCALL_THISCALL); assert(r >= 0);
00176
00177 ss.str("");
00178 ss << asType << " getWidth()";
00179 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00180 asMETHOD(rect<T>, getWidth), asCALL_THISCALL); assert(r >= 0);
00181
00182 ss.str("");
00183 ss << "bool isPointInside(const " << getVector2dName(asType) << " &in)";
00184 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00185 asMETHOD(rect<T>, isPointInside), asCALL_THISCALL); assert(r >= 0);
00186
00187 ss.str("");
00188 ss << "bool isRectCollided(const " << typeName << " &in)";
00189 r = engine->RegisterObjectMethod(typeName, ss.str().c_str(),
00190 asMETHOD(rect<T>, isRectCollided), asCALL_THISCALL); assert(r >= 0);
00191
00192 r = engine->RegisterObjectMethod(typeName, "bool isValid()",
00193 asMETHOD(rect<T>, isValid), asCALL_THISCALL); assert(r >= 0);
00194
00195 r = engine->RegisterObjectMethod(typeName, "void repair()",
00196 asMETHOD(rect<T>, repair), asCALL_THISCALL); assert(r >= 0);
00197
00198
00199 ss.str("");
00200 ss << getVector2dName(asType) << " LowerRightCorner";
00201 r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(rect<T>, LowerRightCorner)); assert(r >= 0);
00202
00203 ss.str("");
00204 ss << getVector2dName(asType) << " UpperLeftCorner";
00205 r = engine->RegisterObjectProperty(typeName, ss.str().c_str(), offsetof(rect<T>, UpperLeftCorner)); assert(r >= 0);
00206 }
00207
00210 void bindRect(asIScriptEngine *engine)
00211 {
00212 bindRectT<f32>(engine, "rectf", "f32");
00213 bindRectT<s32>(engine, "recti", "s32");
00214 }
00215
00218 std::string getRectName(const std::string &asType)
00219 {
00220 if(asType == "f32") return std::string("rectf");
00221 if(asType == "s32") return std::string("recti");
00222 else return std::string("");
00223 }
00224
00225