| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204 |
- /****************************************************************************
- Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
- http://www.cocos.com
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated engine source code (the "Software"), a limited,
- worldwide, royalty-free, non-assignable, revocable and non-exclusive license
- to use Cocos Creator solely to develop games on your target platforms. You shall
- not use Cocos Creator software for developing other software or tools that's
- used for developing games. You are not granted to publish, distribute,
- sublicense, and/or sell copies of Cocos Creator.
- The software or tools in this License Agreement are licensed, not sold.
- Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- #include "jsb_conversions.hpp"
- #include <sstream>
- #include <regex>
- // seval to native
- bool seval_to_int32(const se::Value& v, int32_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toInt32();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_uint32(const se::Value& v, uint32_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toUint32();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_int8(const se::Value& v, int8_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toInt8();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_uint8(const se::Value& v, uint8_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toUint8();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_int16(const se::Value& v, int16_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toInt16();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_uint16(const se::Value& v, uint16_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toUint16();
- return true;
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean() ? 1 : 0;
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_boolean(const se::Value& v, bool* ret)
- {
- assert(ret != nullptr);
- if (v.isBoolean())
- {
- *ret = v.toBoolean();
- }
- else if (v.isNumber())
- {
- *ret = v.toInt32() != 0 ? true : false;
- }
- else if (v.isNullOrUndefined())
- {
- *ret = false;
- }
- else if (v.isObject())
- {
- *ret = true;
- }
- else if (v.isString())
- {
- *ret = v.toString().empty() ? false : true;
- }
- else
- {
- *ret = false;
- assert(false);
- }
- return true;
- }
- bool seval_to_float(const se::Value& v, float* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toFloat();
- if (!std::isnan(*ret))
- return true;
- }
- *ret = 0.0f;
- return false;
- }
- bool seval_to_double(const se::Value& v, double* ret)
- {
- if (v.isNumber())
- {
- *ret = v.toNumber();
- if (!std::isnan(*ret))
- return true;
- }
- *ret = 0.0;
- return false;
- }
- bool seval_to_long(const se::Value& v, long* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toLong();
- return true;
- }
- *ret = 0L;
- return false;
- }
- bool seval_to_ulong(const se::Value& v, unsigned long* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = v.toUlong();
- return true;
- }
- *ret = 0UL;
- return false;
- }
- bool seval_to_longlong(const se::Value& v, long long* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = (long long)v.toLong();
- return true;
- }
- *ret = 0LL;
- return false;
- }
- bool seval_to_ssize(const se::Value& v, ssize_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = (ssize_t)v.toLong();
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_size(const se::Value& v, size_t* ret)
- {
- assert(ret != nullptr);
- if (v.isNumber())
- {
- *ret = (size_t)v.toLong();
- return true;
- }
- *ret = 0;
- return false;
- }
- bool seval_to_std_string(const se::Value& v, std::string* ret)
- {
- assert(ret != nullptr);
- *ret = v.toStringForce();
- return true;
- }
- bool seval_to_Vec2(const se::Value& v, cocos2d::Vec2* pt)
- {
- assert(pt != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Vec2 failed!");
- se::Object* obj = v.toObject();
- se::Value x;
- se::Value y;
- bool ok = obj->getProperty("x", &x);
- SE_PRECONDITION3(ok && x.isNumber(), false, *pt = cocos2d::Vec2::ZERO);
- ok = obj->getProperty("y", &y);
- SE_PRECONDITION3(ok && y.isNumber(), false, *pt = cocos2d::Vec2::ZERO);
- pt->x = x.toFloat();
- pt->y = y.toFloat();
- return true;
- }
- bool seval_to_Vec3(const se::Value& v, cocos2d::Vec3* pt)
- {
- assert(pt != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Vec3 failed!");
- se::Object* obj = v.toObject();
- se::Value x;
- se::Value y;
- se::Value z;
- bool ok = obj->getProperty("x", &x);
- SE_PRECONDITION3(ok && x.isNumber(), false, *pt = cocos2d::Vec3::ZERO);
- ok = obj->getProperty("y", &y);
- SE_PRECONDITION3(ok && y.isNumber(), false, *pt = cocos2d::Vec3::ZERO);
- ok = obj->getProperty("z", &z);
- SE_PRECONDITION3(ok && z.isNumber(), false, *pt = cocos2d::Vec3::ZERO);
- pt->x = x.toFloat();
- pt->y = y.toFloat();
- pt->z = z.toFloat();
- return true;
- }
- bool seval_to_Vec4(const se::Value& v, cocos2d::Vec4* pt)
- {
- assert(pt != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Vec4 failed!");
- pt->x = pt->y = pt->z = pt->w = 0.0f;
- se::Object* obj = v.toObject();
- se::Value x;
- se::Value y;
- se::Value z;
- se::Value w;
- bool ok = obj->getProperty("x", &x);
- SE_PRECONDITION3(ok && x.isNumber(), false, *pt = cocos2d::Vec4::ZERO);
- ok = obj->getProperty("y", &y);
- SE_PRECONDITION3(ok && y.isNumber(), false, *pt = cocos2d::Vec4::ZERO);
- ok = obj->getProperty("z", &z);
- SE_PRECONDITION3(ok && z.isNumber(), false, *pt = cocos2d::Vec4::ZERO);
- ok = obj->getProperty("w", &w);
- SE_PRECONDITION3(ok && w.isNumber(), false, *pt = cocos2d::Vec4::ZERO);
- pt->x = x.toFloat();
- pt->y = y.toFloat();
- pt->z = z.toFloat();
- pt->w = w.toFloat();
- return true;
- }
- bool seval_to_mat(const se::Value& v, int length, float* out)
- {
- assert(out != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Matrix failed!");
- se::Object* obj = v.toObject();
-
- se::Value tmp;
- char propName[3] = {0};
- for (int i = 0; i < length; ++i)
- {
- snprintf(propName, 3, "m%2d", i);
- obj->getProperty(propName, &tmp);
- *(out + i) = tmp.toFloat();
- }
- return true;
- }
- bool seval_to_Mat4(const se::Value& v, cocos2d::Mat4* mat)
- {
- assert(mat != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Matrix4 failed!");
- se::Object* obj = v.toObject();
- if (obj->isTypedArray())
- {
- // typed array
- SE_PRECONDITION2(obj->isTypedArray(), false, "Convert parameter to Matrix4 failed!");
-
- size_t length = 0;
- uint8_t* ptr = nullptr;
- obj->getTypedArrayData(&ptr, &length);
-
- memcpy(mat->m, ptr, length);
- }
- else {
- bool ok = false;
- se::Value tmp;
- std::string prefix = "m";
- for (uint32_t i = 0; i < 16; ++i)
- {
- std::string name;
- if (i < 10)
- {
- name = prefix + "0" + std::to_string(i);
- }
- else
- {
- name = prefix + std::to_string(i);
- }
- ok = obj->getProperty(name.c_str(), &tmp);
- SE_PRECONDITION3(ok, false, *mat = cocos2d::Mat4::IDENTITY);
- if (tmp.isNumber())
- {
- mat->m[i] = tmp.toFloat();
- }
- else
- {
- SE_REPORT_ERROR("%u, not supported type in matrix", i);
- *mat = cocos2d::Mat4::IDENTITY;
- return false;
- }
- tmp.setUndefined();
- }
- }
- return true;
- }
- bool seval_to_Size(const se::Value& v, cocos2d::Size* size)
- {
- assert(size != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Size failed!");
- se::Object* obj = v.toObject();
- se::Value width;
- se::Value height;
- bool ok = obj->getProperty("width", &width);
- SE_PRECONDITION3(ok && width.isNumber(), false, *size = cocos2d::Size::ZERO);
- ok = obj->getProperty("height", &height);
- SE_PRECONDITION3(ok && height.isNumber(), false, *size = cocos2d::Size::ZERO);
- size->width = width.toFloat();
- size->height = height.toFloat();
- return true;
- }
- //bool seval_to_Rect(const se::Value& v, cocos2d::Rect* rect)
- //{
- // assert(rect != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Rect failed!");
- // se::Object* obj = v.toObject();
- // se::Value x;
- // se::Value y;
- // se::Value width;
- // se::Value height;
- //
- // bool ok = obj->getProperty("x", &x);
- // SE_PRECONDITION3(ok && x.isNumber(), false, *rect = cocos2d::Rect::ZERO);
- // ok = obj->getProperty("y", &y);
- // SE_PRECONDITION3(ok && y.isNumber(), false, *rect = cocos2d::Rect::ZERO);
- // ok = obj->getProperty("width", &width);
- // SE_PRECONDITION3(ok && width.isNumber(), false, *rect = cocos2d::Rect::ZERO);
- // ok = obj->getProperty("height", &height);
- // SE_PRECONDITION3(ok && height.isNumber(), false, *rect = cocos2d::Rect::ZERO);
- // rect->origin.x = x.toFloat();
- // rect->origin.y = y.toFloat();
- // rect->size.width = width.toFloat();
- // rect->size.height = height.toFloat();
- //
- // return true;
- //}
- bool seval_to_Color3B(const se::Value& v, cocos2d::Color3B* color)
- {
- assert(color != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Color3B failed!");
- se::Object* obj = v.toObject();
- se::Value r;
- se::Value g;
- se::Value b;
- bool ok = obj->getProperty("r", &r);
- SE_PRECONDITION3(ok && r.isNumber(), false, *color = cocos2d::Color3B::BLACK);
- ok = obj->getProperty("g", &g);
- SE_PRECONDITION3(ok && g.isNumber(), false, *color = cocos2d::Color3B::BLACK);
- ok = obj->getProperty("b", &b);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color3B::BLACK);
- color->r = (GLubyte)r.toUint16();
- color->g = (GLubyte)g.toUint16();
- color->b = (GLubyte)b.toUint16();
- return true;
- }
- bool seval_to_Color4B(const se::Value& v, cocos2d::Color4B* color)
- {
- assert(color != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Color4B failed!");
- se::Object* obj = v.toObject();
- se::Value r;
- se::Value g;
- se::Value b;
- se::Value a;
- bool ok = obj->getProperty("r", &r);
- SE_PRECONDITION3(ok && r.isNumber(), false, *color = cocos2d::Color4B::BLACK);
- ok = obj->getProperty("g", &g);
- SE_PRECONDITION3(ok && g.isNumber(), false, *color = cocos2d::Color4B::BLACK);
- ok = obj->getProperty("b", &b);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color4B::BLACK);
- ok = obj->getProperty("a", &a);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color4B::BLACK);
- color->r = (GLubyte)r.toUint16();
- color->g = (GLubyte)g.toUint16();
- color->b = (GLubyte)b.toUint16();
- color->a = (GLubyte)a.toUint16();
- return true;
- }
- bool seval_to_Color4F(const se::Value& v, cocos2d::Color4F* color)
- {
- assert(color != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Color4F failed!");
- se::Object* obj = v.toObject();
- se::Value r;
- se::Value g;
- se::Value b;
- se::Value a;
- bool ok = obj->getProperty("r", &r);
- SE_PRECONDITION3(ok && r.isNumber(), false, *color = cocos2d::Color4F::BLACK);
- ok = obj->getProperty("g", &g);
- SE_PRECONDITION3(ok && g.isNumber(), false, *color = cocos2d::Color4F::BLACK);
- ok = obj->getProperty("b", &b);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color4F::BLACK);
- ok = obj->getProperty("a", &a);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color4F::BLACK);
- color->r = r.toFloat();
- color->g = g.toFloat();
- color->b = b.toFloat();
- color->a = a.toFloat();
- return true;
- }
- bool seval_to_Color3F(const se::Value& v, cocos2d::Color3F* color)
- {
- assert(color != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Color3F failed!");
- se::Object* obj = v.toObject();
- se::Value r;
- se::Value g;
- se::Value b;
- bool ok = obj->getProperty("r", &r);
- SE_PRECONDITION3(ok && r.isNumber(), false, *color = cocos2d::Color3F::BLACK);
- ok = obj->getProperty("g", &g);
- SE_PRECONDITION3(ok && g.isNumber(), false, *color = cocos2d::Color3F::BLACK);
- ok = obj->getProperty("b", &b);
- SE_PRECONDITION3(ok && b.isNumber(), false, *color = cocos2d::Color3F::BLACK);
- color->r = r.toFloat();
- color->g = g.toFloat();
- color->b = b.toFloat();
- return true;
- }
- bool seval_to_ccvalue(const se::Value& v, cocos2d::Value* ret)
- {
- assert(ret != nullptr);
- bool ok = true;
- if (v.isObject())
- {
- se::Object* jsobj = v.toObject();
- if (!jsobj->isArray())
- {
- // It's a normal js object.
- cocos2d::ValueMap dictVal;
- ok = seval_to_ccvaluemap(v, &dictVal);
- SE_PRECONDITION3(ok, false, *ret = cocos2d::Value::Null);
- *ret = cocos2d::Value(dictVal);
- }
- else
- {
- // It's a js array object.
- cocos2d::ValueVector arrVal;
- ok = seval_to_ccvaluevector(v, &arrVal);
- SE_PRECONDITION3(ok, false, *ret = cocos2d::Value::Null);
- *ret = cocos2d::Value(arrVal);
- }
- }
- else if (v.isString())
- {
- *ret = v.toString();
- }
- else if (v.isNumber())
- {
- *ret = v.toNumber();
- }
- else if (v.isBoolean())
- {
- *ret = v.toBoolean();
- }
- else if (v.isNullOrUndefined())
- {
- *ret = cocos2d::Value::Null;
- }
- else
- {
- SE_PRECONDITION2(false, false, "type not supported!");
- }
- return ok;
- }
- bool seval_to_ccvaluemap(const se::Value& v, cocos2d::ValueMap* ret)
- {
- assert(ret != nullptr);
- if (v.isNullOrUndefined())
- {
- ret->clear();
- return true;
- }
- SE_PRECONDITION3(v.isObject(), false, ret->clear());
- SE_PRECONDITION3(!v.isNullOrUndefined(), false, ret->clear());
- se::Object* obj = v.toObject();
- cocos2d::ValueMap& dict = *ret;
- std::vector<std::string> allKeys;
- SE_PRECONDITION3(obj->getAllKeys(&allKeys), false, ret->clear());
- bool ok = false;
- se::Value value;
- cocos2d::Value ccvalue;
- for (const auto& key : allKeys)
- {
- SE_PRECONDITION3(obj->getProperty(key.c_str(), &value), false, ret->clear());
- ok = seval_to_ccvalue(value, &ccvalue);
- SE_PRECONDITION3(ok, false, ret->clear());
- dict.emplace(key, ccvalue);
- }
- return true;
- }
- static bool isNumberString(const std::string& str)
- {
- for (const auto& c : str)
- {
- if (!isdigit(c))
- return false;
- }
- return true;
- }
- bool seval_to_ccvaluemapintkey(const se::Value& v, cocos2d::ValueMapIntKey* ret)
- {
- assert(ret != nullptr);
- if (v.isNullOrUndefined())
- {
- ret->clear();
- return true;
- }
- SE_PRECONDITION3(v.isObject(), false, ret->clear());
- SE_PRECONDITION3(!v.isNullOrUndefined(), false, ret->clear());
- se::Object* obj = v.toObject();
- cocos2d::ValueMapIntKey& dict = *ret;
- std::vector<std::string> allKeys;
- SE_PRECONDITION3(obj->getAllKeys(&allKeys), false, ret->clear());
- bool ok = false;
- se::Value value;
- cocos2d::Value ccvalue;
- for (const auto& key : allKeys)
- {
- SE_PRECONDITION3(obj->getProperty(key.c_str(), &value), false, ret->clear());
- if (!isNumberString(key))
- {
- SE_LOGD("seval_to_ccvaluemapintkey, found not numeric key: %s", key.c_str());
- continue;
- }
- int intKey = atoi(key.c_str());
- ok = seval_to_ccvalue(value, &ccvalue);
- SE_PRECONDITION3(ok, false, ret->clear());
- dict.emplace(intKey, ccvalue);
- }
-
- return true;
- }
- bool seval_to_ccvaluevector(const se::Value& v, cocos2d::ValueVector* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION3(v.isObject(), false, ret->clear());
- se::Object* obj = v.toObject();
- SE_PRECONDITION3(obj->isArray(), false, ret->clear());
- uint32_t len = 0;
- obj->getArrayLength(&len);
- bool ok = false;
- se::Value value;
- cocos2d::Value ccvalue;
- for (uint32_t i = 0; i < len; ++i)
- {
- if (obj->getArrayElement(i, &value))
- {
- ok = seval_to_ccvalue(value, &ccvalue);
- SE_PRECONDITION3(ok, false, ret->clear());
- ret->push_back(ccvalue);
- }
- }
-
- return true;
- }
- bool sevals_variadic_to_ccvaluevector(const se::ValueArray& args, cocos2d::ValueVector* ret)
- {
- bool ok = false;
- cocos2d::Value ccvalue;
- for (const auto& arg : args)
- {
- ok = seval_to_ccvalue(arg, &ccvalue);
- SE_PRECONDITION3(ok, false, ret->clear());
- ret->push_back(ccvalue);
- }
- return true;
- }
- bool seval_to_blendfunc(const se::Value& v, cocos2d::BlendFunc* ret)
- {
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to BlendFunc failed!");
- se::Object* obj = v.toObject();
- se::Value value;
- bool ok = false;
- ok = obj->getProperty("src", &value);
- SE_PRECONDITION3(ok, false, *ret = cocos2d::BlendFunc::DISABLE);
- ret->src = value.toUint32();
- ok = obj->getProperty("dst", &value);
- SE_PRECONDITION3(ok, false, *ret = cocos2d::BlendFunc::DISABLE);
- ret->dst = value.toUint32();
- return true;
- }
- bool seval_to_std_vector_string(const se::Value& v, std::vector<std::string>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of String failed!");
- se::Object* obj = v.toObject();
- SE_PRECONDITION2(obj->isArray(), false, "Convert parameter to vector of String failed!");
- uint32_t len = 0;
- if (obj->getArrayLength(&len))
- {
- se::Value value;
- for (uint32_t i = 0; i < len; ++i)
- {
- SE_PRECONDITION3(obj->getArrayElement(i, &value) && value.isString(), false, ret->clear());
- ret->push_back(value.toString());
- }
- return true;
- }
- ret->clear();
- return true;
- }
- bool seval_to_std_vector_int(const se::Value& v, std::vector<int>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of int failed!");
- se::Object* obj = v.toObject();
- if (obj->isArray())
- {
- uint32_t len = 0;
- if (obj->getArrayLength(&len))
- {
- se::Value value;
- for (uint32_t i = 0; i < len; ++i)
- {
- SE_PRECONDITION3(obj->getArrayElement(i, &value) && value.isNumber(), false, ret->clear());
- ret->push_back(value.toInt32());
- }
- return true;
- }
- }
- else if (obj->isTypedArray())
- {
- size_t bytesPerElements = 0;
- uint8_t* data = nullptr;
- size_t dataBytes = 0;
- se::Object::TypedArrayType type = obj->getTypedArrayType();
- #define SE_UINT8_PTR_TO_INT(ptr) (*((uint8_t*)(ptr)))
- #define SE_UINT16_PTR_TO_INT(ptr) (*((uint16_t*)(ptr)))
- #define SE_UINT32_PTR_TO_INT(ptr) (*((uint32_t*)(ptr)))
- if (obj->getTypedArrayData(&data, &dataBytes))
- {
- for (size_t i = 0; i < dataBytes; i += bytesPerElements)
- {
- switch (type) {
- case se::Object::TypedArrayType::INT8:
- case se::Object::TypedArrayType::UINT8:
- case se::Object::TypedArrayType::UINT8_CLAMPED:
- ret->push_back(SE_UINT8_PTR_TO_INT(data + i));
- bytesPerElements = 1;
- break;
- case se::Object::TypedArrayType::INT16:
- case se::Object::TypedArrayType::UINT16:
- ret->push_back(SE_UINT16_PTR_TO_INT(data + i));
- bytesPerElements = 2;
- break;
- case se::Object::TypedArrayType::INT32:
- case se::Object::TypedArrayType::UINT32:
- ret->push_back(SE_UINT32_PTR_TO_INT(data + i));
- bytesPerElements = 4;
- break;
- default:
- SE_LOGE("Unsupported typed array: %d\n", (int)type);
- assert(false);
- break;
- }
- }
- }
- #undef SE_UINT8_PTR_TO_INT
- #undef SE_UINT16_PTR_TO_INT
- #undef SE_UINT32_PTR_TO_INT
- return true;
- }
- else
- {
- assert(false);
- }
- ret->clear();
- return true;
- }
- bool seval_to_std_vector_uint16(const se::Value& v, std::vector<uint16_t>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of uint16 failed!");
- se::Object* obj = v.toObject();
-
- if (obj->isArray())
- {
- uint32_t len = 0;
- if (obj->getArrayLength(&len))
- {
- se::Value value;
- for (uint32_t i = 0; i < len; ++i)
- {
- SE_PRECONDITION3(obj->getArrayElement(i, &value) && value.isNumber(), false, ret->clear());
- ret->push_back(value.toUint16());
- }
- return true;
- }
- }
- else if (obj->isTypedArray())
- {
- size_t bytesPerElements = 0;
- uint8_t* data = nullptr;
- size_t dataBytes = 0;
- se::Object::TypedArrayType type = obj->getTypedArrayType();
-
- if (obj->getTypedArrayData(&data, &dataBytes))
- {
- for (size_t i = 0; i < dataBytes; i += bytesPerElements)
- {
- switch (type) {
- case se::Object::TypedArrayType::INT16:
- case se::Object::TypedArrayType::UINT16:
- ret->push_back(*((uint16_t*)(data + i)));
- bytesPerElements = 2;
- break;
- default:
- SE_LOGE("Unsupported typed array: %d\n", (int)type);
- assert(false);
- break;
- }
- }
- }
- return true;
- }
- else
- {
- assert(false);
- }
- ret->clear();
- return true;
- }
- bool seval_to_std_vector_float(const se::Value& v, std::vector<float>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of float failed!");
- se::Object* obj = v.toObject();
- SE_PRECONDITION2(obj->isArray(), false, "Convert parameter to vector of float failed!");
- uint32_t len = 0;
- if (obj->getArrayLength(&len))
- {
- se::Value value;
- for (uint32_t i = 0; i < len; ++i)
- {
- SE_PRECONDITION3(obj->getArrayElement(i, &value) && value.isNumber(), false, ret->clear());
- ret->push_back(value.toFloat());
- }
- return true;
- }
- ret->clear();
- return true;
- }
- bool seval_to_std_vector_Vec2(const se::Value& v, std::vector<cocos2d::Vec2>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of Vec2 failed!");
- se::Object* obj = v.toObject();
- SE_PRECONDITION2(obj->isArray(), false, "Convert parameter to vector of Vec2 failed!");
- uint32_t len = 0;
- if (obj->getArrayLength(&len))
- {
- se::Value value;
- cocos2d::Vec2 pt;
- for (uint32_t i = 0; i < len; ++i)
- {
- SE_PRECONDITION3(obj->getArrayElement(i, &value) && seval_to_Vec2(value, &pt), false, ret->clear());
- ret->push_back(pt);
- }
- return true;
- }
- ret->clear();
- return true;
- }
- //bool seval_to_std_vector_Touch(const se::Value& v, std::vector<cocos2d::Touch*>* ret)
- //{
- // assert(ret != nullptr);
- // assert(v.isObject());
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of Touch failed!");
- // se::Object* obj = v.toObject();
- // assert(obj->isArray());
- // SE_PRECONDITION2(obj->isArray(), false, "Convert parameter to vector of Touch failed!");
- // uint32_t len = 0;
- // if (obj->getArrayLength(&len))
- // {
- // se::Value value;
- // cocos2d::Touch* touch = nullptr;
- // for (uint32_t i = 0; i < len; ++i)
- // {
- // SE_PRECONDITION3(obj->getArrayElement(i, &value), false, ret->clear());
- // assert(value.isObject());
- // touch = (cocos2d::Touch*)value.toObject()->getPrivateData();
- // ret->push_back(touch);
- // }
- // return true;
- // }
- //
- // ret->clear();
- // return false;
- //}
- bool seval_to_std_map_string_string(const se::Value& v, std::map<std::string, std::string>* ret)
- {
- assert(ret != nullptr);
- if (v.isNullOrUndefined())
- {
- ret->clear();
- return true;
- }
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to map of String to String failed!");
- SE_PRECONDITION3(!v.isNullOrUndefined(), false, ret->clear());
- se::Object* obj = v.toObject();
- std::vector<std::string> allKeys;
- SE_PRECONDITION3(obj->getAllKeys(&allKeys), false, ret->clear());
- bool ok = false;
- se::Value value;
- std::string strValue;
- for (const auto& key : allKeys)
- {
- SE_PRECONDITION3(obj->getProperty(key.c_str(), &value), false, ret->clear());
- ok = seval_to_std_string(value, &strValue);
- SE_PRECONDITION3(ok, false, ret->clear());
- ret->emplace(key, strValue);
- }
-
- return true;
- }
- //
- //bool seval_to_Quaternion(const se::Value& v, cocos2d::Quaternion* ret)
- //{
- // assert(ret != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Quaternion failed!");
- // se::Object* obj = v.toObject();
- // bool ok = false;
- // se::Value tmp;
- //
- // ok = obj->getProperty("x", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = cocos2d::Quaternion::ZERO);
- // ret->x = tmp.toFloat();
- //
- // ok = obj->getProperty("y", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = cocos2d::Quaternion::ZERO);
- // ret->y = tmp.toFloat();
- //
- // ok = obj->getProperty("z", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = cocos2d::Quaternion::ZERO);
- // ret->z = tmp.toFloat();
- //
- // ok = obj->getProperty("w", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = cocos2d::Quaternion::ZERO);
- // ret->w = tmp.toFloat();
- //
- // return true;
- //}
- //
- //bool seval_to_AffineTransform(const se::Value& v, cocos2d::AffineTransform* ret)
- //{
- // static cocos2d::AffineTransform ZERO = {0, 0, 0, 0, 0, 0};
- //
- // assert(ret != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to AffineTransform failed!");
- // se::Value tmp;
- // se::Object* obj = v.toObject();
- // bool ok = false;
- //
- // ok = obj->getProperty("a", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->a = tmp.toFloat();
- //
- // ok = obj->getProperty("b", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->b = tmp.toFloat();
- //
- // ok = obj->getProperty("c", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->c = tmp.toFloat();
- //
- // ok = obj->getProperty("d", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->d = tmp.toFloat();
- //
- // ok = obj->getProperty("tx", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->tx = tmp.toFloat();
- //
- // ok = obj->getProperty("ty", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->ty = tmp.toFloat();
- //
- // return true;
- //}
- //bool seval_to_Viewport(const se::Value& v, cocos2d::experimental::Viewport* ret)
- //{
- // static cocos2d::experimental::Viewport ZERO = {0, 0, 0, 0};
- //
- // assert(ret != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Viewport failed!");
- // se::Value tmp;
- // se::Object* obj = v.toObject();
- // bool ok = false;
- //
- // ok = obj->getProperty("left", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->_left = tmp.toFloat();
- //
- // ok = obj->getProperty("bottom", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->_bottom = tmp.toFloat();
- //
- // ok = obj->getProperty("width", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->_width = tmp.toFloat();
- //
- // ok = obj->getProperty("height", &tmp);
- // SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- // ret->_height = tmp.toFloat();
- //
- // return true;
- //}
- bool seval_to_Data(const se::Value& v, cocos2d::Data* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject() && v.toObject()->isTypedArray(), false, "Convert parameter to Data failed!");
- uint8_t* ptr = nullptr;
- size_t length = 0;
- bool ok = v.toObject()->getTypedArrayData(&ptr, &length);
- if (ok)
- {
- ret->copy(ptr, length);
- }
- else
- {
- ret->clear();
- }
- return ok;
- }
- bool seval_to_DownloaderHints(const se::Value& v, cocos2d::network::DownloaderHints* ret)
- {
- static cocos2d::network::DownloaderHints ZERO = {0, 0, ""};
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to DownloaderHints failed!");
- se::Value tmp;
- se::Object* obj = v.toObject();
- bool ok = false;
- ok = obj->getProperty("countOfMaxProcessingTasks", &tmp);
- SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- ret->countOfMaxProcessingTasks = tmp.toUint32();
- ok = obj->getProperty("timeoutInSeconds", &tmp);
- SE_PRECONDITION3(ok && tmp.isNumber(), false, *ret = ZERO);
- ret->timeoutInSeconds = tmp.toUint32();
- ok = obj->getProperty("tempFileNameSuffix", &tmp);
- SE_PRECONDITION3(ok && tmp.isString(), false, *ret = ZERO);
- ret->tempFileNameSuffix = tmp.toString();
- return ok;
- }
- //
- //bool seval_to_TTFConfig(const se::Value& v, cocos2d::TTFConfig* ret)
- //{
- // se::Value js_fontFilePath;
- // se::Value js_fontSize;
- // se::Value js_outlineSize;
- // se::Value js_glyphs;
- // se::Value js_customGlyphs;
- // se::Value js_distanceFieldEnable;
- //
- // std::string fontFilePath,customGlyphs;
- //
- // bool ok = v.isObject();
- // if (ok)
- // {
- // se::Object* obj = v.toObject();
- // if (obj->getProperty("fontFilePath", &js_fontFilePath) && js_fontFilePath.isString())
- // {
- // ok &= seval_to_std_string(js_fontFilePath, &ret->fontFilePath);
- // }
- //
- // if (obj->getProperty("fontSize", &js_fontSize) && js_fontSize.isNumber())
- // {
- // ret->fontSize = (float)js_fontSize.toNumber();
- // }
- //
- // if (obj->getProperty("outlineSize", &js_outlineSize) && js_outlineSize.isNumber())
- // {
- // ret->outlineSize = (int)js_outlineSize.toNumber();
- // }
- //
- // if (obj->getProperty("glyphs", &js_glyphs) && js_glyphs.isNumber())
- // {
- // ret->glyphs = (cocos2d::GlyphCollection)(js_glyphs.toInt32());
- // }
- //
- // if (obj->getProperty("customGlyphs", &js_customGlyphs) && js_customGlyphs.isString())
- // {
- // ok &= seval_to_std_string(js_customGlyphs,&customGlyphs);
- // }
- // if(ret->glyphs == cocos2d::GlyphCollection::CUSTOM && !customGlyphs.empty())
- // ret->customGlyphs = customGlyphs.c_str();
- // else
- // ret->customGlyphs = "";
- //
- // if (obj->getProperty("distanceFieldEnable", &js_distanceFieldEnable) && js_distanceFieldEnable.isBoolean())
- // {
- // ret->distanceFieldEnabled = js_distanceFieldEnable.toBoolean();
- // }
- // }
- //
- // SE_PRECONDITION2(ok, false, "Error processing arguments");
- //
- // return true;
- //}
- //
- //bool seval_to_b2Vec2(const se::Value& v, b2Vec2* ret)
- //{
- // static b2Vec2 ZERO(0.0f, 0.0f);
- // assert(ret != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to b2Vec2 failed!");
- // se::Object* obj = v.toObject();
- // se::Value x;
- // se::Value y;
- // bool ok = obj->getProperty("x", &x);
- // SE_PRECONDITION3(ok && x.isNumber(), false, *ret = ZERO);
- // ok = obj->getProperty("y", &y);
- // SE_PRECONDITION3(ok && y.isNumber(), false, *ret = ZERO);
- // ret->x = x.toFloat();
- // ret->y = y.toFloat();
- // return true;
- //}
- //
- //bool seval_to_b2AABB(const se::Value& v, b2AABB* ret)
- //{
- // static b2AABB ZERO;
- // static bool __isFirst = true;
- // if (__isFirst)
- // {
- // ZERO.lowerBound.x = ZERO.lowerBound.y = 0;
- // ZERO.upperBound.x = ZERO.upperBound.y = 0;
- // __isFirst = false;
- // }
- //
- // assert(ret != nullptr);
- // SE_PRECONDITION2(v.isObject(), false, "Convert parameter to b2AABB failed!");
- // se::Object* obj = v.toObject();
- //
- // bool ok = false;
- // se::Value tmp;
- // ok = obj->getProperty("lowerBound", &tmp);
- // SE_PRECONDITION3(ok && tmp.isObject(), false, *ret = ZERO);
- // ok = seval_to_b2Vec2(tmp, &ret->lowerBound);
- // SE_PRECONDITION3(ok, false, *ret = ZERO);
- //
- // ok = obj->getProperty("upperBound", &tmp);
- // SE_PRECONDITION3(ok && tmp.isObject(), false, *ret = ZERO);
- // ok = seval_to_b2Vec2(tmp, &ret->upperBound);
- // SE_PRECONDITION3(ok, false, *ret = ZERO);
- //
- // return true;
- //}
- #if USE_GFX_RENDERER
- bool seval_to_Rect(const se::Value& v, cocos2d::renderer::Rect* rect)
- {
- assert(rect != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to Rect failed!");
- se::Object* obj = v.toObject();
- se::Value x;
- se::Value y;
- se::Value width;
- se::Value height;
- bool ok = obj->getProperty("x", &x);
- SE_PRECONDITION3(ok && x.isNumber(), false, *rect = cocos2d::renderer::Rect::ZERO);
- ok = obj->getProperty("y", &y);
- SE_PRECONDITION3(ok && y.isNumber(), false, *rect = cocos2d::renderer::Rect::ZERO);
- ok = obj->getProperty("w", &width);
- SE_PRECONDITION3(ok && width.isNumber(), false, *rect = cocos2d::renderer::Rect::ZERO);
- ok = obj->getProperty("h", &height);
- SE_PRECONDITION3(ok && height.isNumber(), false, *rect = cocos2d::renderer::Rect::ZERO);
- rect->x = x.toFloat();
- rect->y = y.toFloat();
- rect->w = width.toFloat();
- rect->h = height.toFloat();
- return true;
- }
- bool seval_to_std_vector_Texture(const se::Value& v, std::vector<cocos2d::renderer::Texture*>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject() && v.toObject()->isArray(), false, "Convert parameter to vector of Texture failed!");
- se::Object* obj = v.toObject();
- uint32_t len = 0;
- if (obj->getArrayLength(&len) && len > 0)
- {
- for (uint32_t i = 0; i < len; ++i)
- {
- se::Value textureVal;
- if (obj->getArrayElement(i, &textureVal) && textureVal.isObject())
- {
- cocos2d::renderer::Texture* texture = nullptr;
- seval_to_native_ptr(textureVal, &texture);
- ret->push_back(texture);
- }
- }
- return true;
- }
- ret->clear();
- return true;
- }
- bool seval_to_std_vector_RenderTarget(const se::Value& v, std::vector<cocos2d::renderer::RenderTarget*>* ret)
- {
- assert(false);
- return true;
- }
- bool seval_to_TextureOptions(const se::Value& v, cocos2d::renderer::Texture::Options* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to TextureOption failed!");
- se::Object* obj = v.toObject();
- se::Value images;
- if (obj->getProperty("images", &images) && images.isObject() && images.toObject()->isArray())
- {
- uint32_t len = 0;
- se::Object* arr = images.toObject();
- if (arr->getArrayLength(&len))
- {
- se::Value imageVal;
- for (uint32_t i = 0; i < len; ++i)
- {
- if (arr->getArrayElement(i, &imageVal))
- {
- if (imageVal.isObject() && imageVal.toObject()->isTypedArray())
- {
- cocos2d::renderer::Texture::Image img;
- imageVal.toObject()->getTypedArrayData(&img.data, &img.length);
- ret->images.push_back(img);
- }
- else if (imageVal.isNull())
- {
- ret->images.push_back(cocos2d::renderer::Texture::Image());
- }
- else
- {
- SE_LOGE("Texture image isn't a typed array object or null!");
- assert(false);
- }
- }
- }
- }
- }
- se::Value tmp;
- if (obj->getProperty("genMipmaps", &tmp))
- {
- seval_to_boolean(tmp, &ret->hasMipmap);
- }
- if (obj->getProperty("width", &tmp))
- {
- seval_to_uint16(tmp, &ret->width);
- }
- if (obj->getProperty("height", &tmp))
- {
- seval_to_uint16(tmp, &ret->height);
- }
- if (obj->getProperty("glInternalFormat", &tmp))
- {
- seval_to_uint32(tmp, &ret->glInternalFormat);
- }
-
- if (obj->getProperty("glFormat", &tmp))
- {
- seval_to_uint32(tmp, &ret->glFormat);
- }
-
- if (obj->getProperty("glType", &tmp))
- {
- seval_to_uint32(tmp, &ret->glType);
- }
- if (obj->getProperty("anisotropy", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_int32(tmp, &ret->anisotropy);
- }
- }
- if (obj->getProperty("minFilter", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_int8(tmp, (int8_t*)&ret->minFilter);
- }
- }
- if (obj->getProperty("magFilter", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_int8(tmp, (int8_t*)&ret->magFilter);
- }
- }
- if (obj->getProperty("mipFilter", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_int8(tmp, (int8_t*)&ret->mipFilter);
- }
- }
- if (obj->getProperty("wrapS", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_uint16(tmp, (uint16_t*)&ret->wrapS);
- }
- }
- if (obj->getProperty("wrapT", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_uint16(tmp, (uint16_t*)&ret->wrapT);
- }
- }
- if (obj->getProperty("flipY", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_boolean(tmp, &ret->flipY);
- }
- }
- if (obj->getProperty("premultiplyAlpha", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_boolean(tmp, &ret->premultiplyAlpha);
- }
- }
-
- if (obj->getProperty("compressed", &tmp))
- {
- if (!tmp.isUndefined())
- {
- seval_to_boolean(tmp, &ret->compressed);
- }
- }
- return true;
- }
- bool seval_to_TextureSubImageOption(const se::Value& v, cocos2d::renderer::Texture::SubImageOption* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to TextureSubImageOption failed!");
- se::Object* obj = v.toObject();
-
- uint32_t* ptr = nullptr;
- size_t length = 0;
- obj->getTypedArrayData((uint8_t**)(&ptr), &length);
-
- *ret = cocos2d::renderer::Texture2D::SubImageOption(
- *ptr, // x
- *(ptr + 1), // y
- *(ptr + 2), // width
- *(ptr + 3), // height
- *(ptr + 4), // level
- *(ptr + 5), // flipY
- *(ptr + 6) // premultiplyAlpha
- );
-
- uint32_t imageDataLength = *(ptr + 7);
- ret->imageData = (uint8_t*)(ptr + 8);
- ret->imageDataLength = imageDataLength;
- return true;
- }
- bool seval_to_TextureImageOption(const se::Value& v, cocos2d::renderer::Texture::ImageOption* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to TextureImageOption failed!");
- se::Object* obj = v.toObject();
- se::Value imageVal;
- if (obj->getProperty("image", &imageVal) && imageVal.isObject() && imageVal.toObject()->isTypedArray())
- {
- cocos2d::renderer::Texture::Image img;
- imageVal.toObject()->getTypedArrayData(&img.data, &img.length);
- ret->image = img;
- }
- se::Value tmp;
- if (obj->getProperty("width", &tmp))
- {
- seval_to_uint16(tmp, &ret->width);
- }
- if (obj->getProperty("level", &tmp))
- {
- seval_to_int32(tmp, &ret->level);
- }
- if (obj->getProperty("height", &tmp))
- {
- seval_to_uint16(tmp, &ret->height);
- }
- if (obj->getProperty("flipY", &tmp))
- {
- seval_to_boolean(tmp, &ret->flipY);
- }
- if (obj->getProperty("premultiplyAlpha", &tmp))
- {
- seval_to_boolean(tmp, &ret->premultiplyAlpha);
- }
- return true;
- }
- bool ccvaluevector_to_EffectPass(const se::Object* v, cocos2d::Vector<cocos2d::renderer::Pass*>* ret)
- {
- assert(ret != nullptr);
- assert(v->isArray());
-
- uint32_t len;
- v->getArrayLength(&len);
-
- for (uint32_t i = 0; i < len; i++) {
- se::Value value;
- if (v->getArrayElement(i, &value) && value.isObject()) {
- se::Object* obj = value.toObject();
- se::Value passValue;
-
- std::string name = "";
- std::unordered_map<size_t, cocos2d::renderer::Effect::Property> properties;
- cocos2d::ValueMap defines;
-
- if (obj->getProperty("_properties", &passValue) && passValue.isObject()) {
- seval_to_EffectProperty(passValue, &properties);
- }
- if (obj->getProperty("_defines", &passValue) && passValue.isObject()) {
- seval_to_ccvaluemap(passValue, &defines);
- }
- if (obj->getProperty("_programName", &passValue) && passValue.isString()) {
- name = passValue.toString();
- }
- cocos2d::renderer::Pass* cobj = new (std::nothrow) cocos2d::renderer::Pass(name, properties, defines);
-
- // stage
- std::string stage = "";
- if (obj->getProperty("_stage", &passValue) && passValue.isString()) {
- stage = passValue.toString();
- }
- cobj->setStage(stage);
-
- // cull mode
- cocos2d::renderer::CullMode cullMode;
- if (obj->getProperty("_cullMode", &passValue) && passValue.isNumber()) {
- cullMode = (cocos2d::renderer::CullMode)passValue.toUint32();
- }
- cobj->setCullMode(cullMode);
-
- // blend
- bool blendTest;
- cocos2d::renderer::BlendOp blendEq;
- cocos2d::renderer::BlendFactor blendSrc;
- cocos2d::renderer::BlendFactor blendDst;
- cocos2d::renderer::BlendOp blendAlphaEq;
- cocos2d::renderer::BlendFactor blendSrcAlpha;
- cocos2d::renderer::BlendFactor blendDstAlpha;
- uint32_t blendColor;
- if (obj->getProperty("_blend", &passValue) && passValue.isBoolean()) {
- blendTest = passValue.toBoolean();
- }
- if (obj->getProperty("_blendEq", &passValue) && passValue.isNumber()) {
- blendEq = (cocos2d::renderer::BlendOp)passValue.toUint32();
- }
- if (obj->getProperty("_blendSrc", &passValue) && passValue.isNumber()) {
- blendSrc = (cocos2d::renderer::BlendFactor)passValue.toUint32();
- }
- if (obj->getProperty("_blendDst", &passValue) && passValue.isNumber()) {
- blendDst = (cocos2d::renderer::BlendFactor)passValue.toUint32();
- }
- if (obj->getProperty("_blendAlphaEq", &passValue) && passValue.isNumber()) {
- blendAlphaEq = (cocos2d::renderer::BlendOp)passValue.toUint32();
- }
- if (obj->getProperty("_blendSrcAlpha", &passValue) && passValue.isNumber()) {
- blendSrcAlpha = (cocos2d::renderer::BlendFactor)passValue.toUint32();
- }
- if (obj->getProperty("_blendDstAlpha", &passValue) && passValue.isNumber()) {
- blendDstAlpha = (cocos2d::renderer::BlendFactor)passValue.toUint32();
- }
- if (obj->getProperty("_blendColor", &passValue) && passValue.isNumber()) {
- blendColor = passValue.toUint32();
- }
- cobj->setBlend(
- blendTest,
- blendEq,
- blendSrc,
- blendDst,
- blendAlphaEq,
- blendSrcAlpha,
- blendDstAlpha,
- blendColor
- );
-
- // depth
- bool depthTest;
- bool depthWrite;
- cocos2d::renderer::DepthFunc depthFunc;
- if (obj->getProperty("_depthTest", &passValue) && passValue.isBoolean()) {
- depthTest = passValue.toBoolean();
- }
- if (obj->getProperty("_depthWrite", &passValue) && passValue.isBoolean()) {
- depthWrite = passValue.toBoolean();
- }
- if (obj->getProperty("_depthFunc", &passValue) && passValue.isNumber()) {
- depthFunc = (cocos2d::renderer::DepthFunc)passValue.toUint32();
- }
- cobj->setDepth(
- depthTest,
- depthWrite,
- depthFunc
- );
-
- // stencil
-
- // front
- cocos2d::renderer::StencilFunc stencilFuncFront;
- uint32_t stencilRefFront;
- uint32_t stencilMaskFront;
- cocos2d::renderer::StencilOp stencilFailOpFront;
- cocos2d::renderer::StencilOp stencilZFailOpFront;
- cocos2d::renderer::StencilOp stencilZPassOpFront;
- uint32_t stencilWriteMaskFront;
-
- if (obj->getProperty("_stencilFuncFront", &passValue) && passValue.isNumber()) {
- stencilFuncFront = (cocos2d::renderer::StencilFunc)passValue.toUint32();
- }
- if (obj->getProperty("_stencilRefFront", &passValue) && passValue.isNumber()) {
- stencilRefFront = passValue.toUint32();
- }
- if (obj->getProperty("_stencilMaskFront", &passValue) && passValue.isNumber()) {
- stencilMaskFront = passValue.toUint32();
- }
- if (obj->getProperty("_stencilFailOpFront", &passValue) && passValue.isNumber()) {
- stencilFailOpFront = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilZFailOpFront", &passValue) && passValue.isNumber()) {
- stencilZFailOpFront = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilZPassOpFront", &passValue) && passValue.isNumber()) {
- stencilZPassOpFront = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilWriteMaskFront", &passValue) && passValue.isNumber()) {
- stencilWriteMaskFront = passValue.toUint32();
- }
- cobj->setStencilFront(
- stencilFuncFront,
- stencilRefFront,
- stencilMaskFront,
- stencilFailOpFront,
- stencilZFailOpFront,
- stencilZPassOpFront,
- stencilWriteMaskFront
- );
-
-
- // back
- cocos2d::renderer::StencilFunc stencilFuncBack;
- uint32_t stencilRefBack;
- uint32_t stencilMaskBack;
- cocos2d::renderer::StencilOp stencilFailOpBack;
- cocos2d::renderer::StencilOp stencilZFailOpBack;
- cocos2d::renderer::StencilOp stencilZPassOpBack;
- uint32_t stencilWriteMaskBack;
- if (obj->getProperty("_stencilFuncBack", &passValue) && passValue.isNumber()) {
- stencilFuncBack = (cocos2d::renderer::StencilFunc)passValue.toUint32();
- }
- if (obj->getProperty("_stencilRefBack", &passValue) && passValue.isNumber()) {
- stencilRefBack = passValue.toUint32();
- }
- if (obj->getProperty("_stencilMaskBack", &passValue) && passValue.isNumber()) {
- stencilMaskBack = passValue.toUint32();
- }
- if (obj->getProperty("_stencilFailOpBack", &passValue) && passValue.isNumber()) {
- stencilFailOpBack = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilZFailOpBack", &passValue) && passValue.isNumber()) {
- stencilZFailOpBack = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilZPassOpBack", &passValue) && passValue.isNumber()) {
- stencilZPassOpBack = (cocos2d::renderer::StencilOp)passValue.toUint32();
- }
- if (obj->getProperty("_stencilWriteMaskBack", &passValue) && passValue.isNumber()) {
- stencilWriteMaskBack = passValue.toUint32();
- }
- cobj->setStencilBack(
- stencilFuncBack,
- stencilRefBack,
- stencilMaskBack,
- stencilFailOpBack,
- stencilZFailOpBack,
- stencilZPassOpBack,
- stencilWriteMaskBack
- );
-
- cobj->autorelease();
- ret->pushBack(cobj);
- }
- }
-
- return true;
- }
- bool seval_to_EffectTechnique(const se::Value& v, cocos2d::renderer::Technique** ret)
- {
- SE_PRECONDITION2(v.isObject(), false, "Convert Effect Technique failed!");
-
- se::Object* obj = v.toObject();
-
- std::vector<std::string> allKeys;
- obj->getAllKeys(&allKeys);
-
-
- se::Value value;
-
- std::string name = "";
- if (obj->getProperty("_name", &value) && value.isObject()) {
- name = value.toString();
- }
-
- cocos2d::Vector<cocos2d::renderer::Pass*> passes;
- if (obj->getProperty("_passes", &value) && value.isObject()) {
- ccvaluevector_to_EffectPass(value.toObject(), &passes);
- *ret = new (std::nothrow) cocos2d::renderer::Technique(name, passes);
- (*ret)->autorelease();
- return true;
- }
-
- return false;
- }
- bool seval_to_EffectAsset(const se::Value& v, cocos2d::Vector<cocos2d::renderer::Technique*>* ret)
- {
- // techniques
- se::Object* techs = v.toObject();
- bool ok = techs->isArray();
- SE_PRECONDITION2(ok, false, "Convert Effect Asset Failed!");
-
- uint32_t len = 0;
- techs->getArrayLength(&len);
- for (uint32_t i = 0; i < len; ++i)
- {
- se::Value val;
- if (techs->getArrayElement(i, &val) && val.isObject())
- {
- cocos2d::renderer::Technique* tech = nullptr;
- ok &= seval_to_EffectTechnique(val, &tech);
- SE_PRECONDITION2(ok, false, "Effect Technique Create Failed!");
- ret->pushBack(tech);
- }
- }
- return true;
- }
- bool seval_to_EffectProperty(const se::Value& v, std::unordered_map<size_t, cocos2d::renderer::Effect::Property>* ret)
- {
- assert(ret != nullptr);
- if (v.isNullOrUndefined())
- {
- ret->clear();
- return true;
- }
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to EffectProperty failed!");
- se::Object* obj = v.toObject();
- std::vector<std::string> keys;
- obj->getAllKeys(&keys);
- for (const auto& key : keys)
- {
- se::Value value;
- if (obj->getProperty(key.c_str(), &value) && value.isObject())
- {
- cocos2d::renderer::Technique::Parameter property;
- seval_to_TechniqueParameter(value, &property);
- size_t hashName = std::hash<std::string>{}(key);
- ret->emplace(hashName, property);
- }
- }
- return true;
- }
- bool seval_to_EffectDefineTemplate(const se::Value& v, std::vector<cocos2d::ValueMap>* ret)
- {
- assert(ret != nullptr);
- bool ok = v.isObject() && v.toObject()->isArray();
- SE_PRECONDITION2(ok, false, "Convert parameter to EffectDefineTemplate failed!");
- se::Object* obj = v.toObject();
- uint32_t len = 0;
- obj->getArrayLength(&len);
- for (uint32_t i = 0; i < len; ++i)
- {
- se::Value value;
- cocos2d::ValueMap valMap;
- if (obj->getArrayElement(i, &value) && value.isObject())
- {
- if (seval_to_ccvaluemap(value, &valMap))
- {
- ret->push_back(std::move(valMap));
- }
- }
- }
- return true;
- }
- bool seval_to_Effect_setProperty(std::string& name, const se::Value& v, cocos2d::renderer::EffectBase* effect, int passIdx, bool directly)
- {
- auto& passes = effect->getPasses();
- size_t start = 0, end = passes.size();
- if (passIdx != -1) {
- start = passIdx; end = passIdx + 1;
- }
- for (size_t i = start; i < end; i++)
- {
- const auto& pass = passes.at(i);
- auto prop = pass->getProperty(name);
- if (!prop) {
- continue;
- }
-
- cocos2d::renderer::Technique::Parameter param;
-
- auto paramType = prop->getType();
- switch (paramType)
- {
- case cocos2d::renderer::Technique::Parameter::Type::INT:
- {
- int32_t value;
- seval_to_int32(v, &value);
- param = cocos2d::renderer::Technique::Parameter(name, paramType, &value);
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT:
- {
- float value;
- seval_to_float(v, &value);
- param = cocos2d::renderer::Technique::Parameter(name, paramType, &value);
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::INT2:
- case cocos2d::renderer::Technique::Parameter::Type::INT3:
- case cocos2d::renderer::Technique::Parameter::Type::INT4:
- {
- se::Object* obj = v.toObject();
- SE_PRECONDITION2(obj->isTypedArray(), false, "Convert parameter to int array failed!");
-
- uint8_t* data = nullptr;
- size_t len = 0;
- obj->getTypedArrayData(&data, &len);
- uint8_t el = cocos2d::renderer::Technique::Parameter::getElements(paramType);
- uint8_t count = (len / sizeof(int)) / el;
-
- if (directly)
- {
- param = cocos2d::renderer::Technique::Parameter(name, paramType, obj, count);
- }
- else
- {
- param = cocos2d::renderer::Technique::Parameter(name, paramType, (int*)data, count);
-
- }
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT2:
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT3:
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT4:
- case cocos2d::renderer::Technique::Parameter::Type::MAT4:
- case cocos2d::renderer::Technique::Parameter::Type::MAT3:
- case cocos2d::renderer::Technique::Parameter::Type::MAT2:
- case cocos2d::renderer::Technique::Parameter::Type::COLOR3:
- case cocos2d::renderer::Technique::Parameter::Type::COLOR4:
- {
- se::Object* obj = v.toObject();
- SE_PRECONDITION2(obj->isTypedArray(), false, "Convert parameter to float array failed!");
-
- uint8_t* data = nullptr;
- size_t len = 0;
- obj->getTypedArrayData(&data, &len);
- uint8_t el = cocos2d::renderer::Technique::Parameter::getElements(paramType);
- uint8_t count = (len / sizeof(float)) / el;
-
- if (directly)
- {
- param = cocos2d::renderer::Technique::Parameter(name, paramType, obj, count);
- }
- else
- {
- param = cocos2d::renderer::Technique::Parameter(name, paramType, (float*)data, count);
- }
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D:
- case cocos2d::renderer::Technique::Parameter::Type::TEXTURE_CUBE:
- {
- if (v.isNull()) {
- cocos2d::renderer::Texture* texture = nullptr;
- param = cocos2d::renderer::Technique::Parameter(name, paramType, texture);
- }
- else {
- se::Object* obj = v.toObject();
- if (obj->isArray())
- {
- uint32_t arrLen = 0;
- obj->getArrayLength(&arrLen);
- if (arrLen == 1)
- {
- cocos2d::renderer::Texture* texture = nullptr;
- seval_to_native_ptr(v, &texture);
- param = cocos2d::renderer::Technique::Parameter(name, paramType, texture);
- }
- else
- {
- std::vector<cocos2d::renderer::Texture*> textures;
- for (uint32_t i = 0; i < arrLen; ++i)
- {
- se::Value texVal;
- obj->getArrayElement(i, &texVal);
- cocos2d::renderer::Texture* tmpTex = nullptr;
- seval_to_native_ptr(texVal, &tmpTex);
- textures.push_back(tmpTex);
- }
- param = cocos2d::renderer::Technique::Parameter(name, paramType, textures);
- }
- }
- else
- {
- cocos2d::renderer::Texture* texture = nullptr;
- seval_to_native_ptr(v, &texture);
- param = cocos2d::renderer::Technique::Parameter(name, paramType, texture);
- }
- }
-
- break;
- }
- default:
- assert(false);
- break;
- }
-
- pass->setProperty(name, param);
- }
-
- return true;
- }
- bool seval_to_TechniqueParameter(const se::Value& v, cocos2d::renderer::Technique::Parameter* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to TechniqueParameter failed!");
- se::Object* obj = v.toObject();
- se::Value tmp;
- std::string name;
- uint8_t size = 0;
- size_t len = 0;
- double number = 0.0;
- void* value = nullptr;
- cocos2d::renderer::Technique::Parameter::Type type = cocos2d::renderer::Technique::Parameter::Type::UNKNOWN;
- std::vector<cocos2d::renderer::Texture*> textures;
- cocos2d::renderer::Texture* texture = nullptr;
- // std::vector<std::string> keys;
- // obj->getAllKeys(&keys);
- // for (auto& key: keys)
- // {
- //// SE_LOGD("key: %s\n", key.c_str());
- // }
- bool ok = false;
- if (obj->getProperty("updateSubImage", &tmp))
- {
- //IDEA: perhaps it could be cube.
- type = cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D;
- size = 1;
- seval_to_native_ptr(v, &texture);
- }
- else
- {
- if (obj->getProperty("name", &tmp))
- {
- ok = seval_to_std_string(tmp, &name);
- SE_PRECONDITION2(ok, false, "Convert Parameter name failed!");
- }
- if (obj->getProperty("type", &tmp))
- {
- uint8_t typeValue = 0;
- ok = seval_to_uint8(tmp, &typeValue);
- SE_PRECONDITION2(ok, false, "Convert Parameter type failed!");
- type = (cocos2d::renderer::Technique::Parameter::Type)typeValue;
- }
- if (obj->getProperty("size", &tmp))
- {
- ok = seval_to_uint8(tmp, &size);
- SE_PRECONDITION2(ok, false, "Convert Parameter size failed!");
- }
- if (obj->getProperty("value", &tmp))
- {
- if (tmp.isNumber())
- {
- number = tmp.toNumber();
- size = 1;
- len = 4;
- }
- else if (tmp.isObject())
- {
- se::Object* valObj = tmp.toObject();
- if (valObj->isArray())
- {
- ok = (type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D ||
- type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_CUBE);
- SE_PRECONDITION2(ok, false, "Convert Parameter val failed!");
- uint32_t arrLen = 0;
- valObj->getArrayLength(&arrLen);
- for (uint32_t i = 0; i < arrLen; ++i)
- {
- se::Value texVal;
- valObj->getArrayElement(i, &texVal);
- cocos2d::renderer::Texture* tmpTex = nullptr;
- seval_to_native_ptr(texVal, &tmpTex);
- textures.push_back(tmpTex);
- }
- }
- else if (valObj->isTypedArray())
- {
- uint8_t* data = nullptr;
- if (valObj->getTypedArrayData(&data, &len))
- {
- value = data;
- }
- }
- else if (valObj->isArrayBuffer())
- {
- uint8_t* data = nullptr;
- if (valObj->getArrayBufferData(&data, &len))
- {
- value = data;
- }
- }
- else
- {
- ok = (type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D ||
- type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_CUBE);
-
- //SE_PRECONDITION2(ok, false, "Convert Parameter val failed!");
- if (ok)
- {
- seval_to_native_ptr(tmp, &texture);
- }
- }
- }
- else
- {
- //assert(false);
- }
- }
- }
- switch (type) {
- case cocos2d::renderer::Technique::Parameter::Type::INT:
- case cocos2d::renderer::Technique::Parameter::Type::INT2:
- case cocos2d::renderer::Technique::Parameter::Type::INT3:
- case cocos2d::renderer::Technique::Parameter::Type::INT4:
- {
- if (size == 1)
- {
- int intVal = (int)number;
- cocos2d::renderer::Technique::Parameter param(name, type, &intVal, 1);
- *ret = std::move(param);
- }
- else
- {
- uint8_t el = cocos2d::renderer::Technique::Parameter::getElements(type);
- uint8_t count = (len / sizeof(float)) / el;
- cocos2d::renderer::Technique::Parameter param(name, type, (int*)value, count);
- *ret = std::move(param);
- }
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT:
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT2:
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT3:
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT4:
- case cocos2d::renderer::Technique::Parameter::Type::COLOR3:
- case cocos2d::renderer::Technique::Parameter::Type::COLOR4:
- case cocos2d::renderer::Technique::Parameter::Type::MAT2:
- case cocos2d::renderer::Technique::Parameter::Type::MAT3:
- case cocos2d::renderer::Technique::Parameter::Type::MAT4:
- {
- if (size == 1)
- {
- float floatVal = (float)number;
- cocos2d::renderer::Technique::Parameter param(name, type, &floatVal, 1);
- *ret = std::move(param);
- }
- else
- {
- uint8_t el = cocos2d::renderer::Technique::Parameter::getElements(type);
- uint8_t count = (len / sizeof(float)) / el;
- cocos2d::renderer::Technique::Parameter param(name, type, (float*)value, count);
- *ret = std::move(param);
- }
- break;
- }
- case cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D:
- case cocos2d::renderer::Technique::Parameter::Type::TEXTURE_CUBE:
- {
- if (size == 1)
- {
- cocos2d::renderer::Technique::Parameter param(name, type, texture);
- *ret = std::move(param);
- }
- else
- {
- cocos2d::renderer::Technique::Parameter param(name, type, textures);
- *ret = std::move(param);
- }
- break;
- }
- default:
- assert(false);
- break;
- }
- return true;
- }
- bool seval_to_std_vector_TechniqueParameter(const se::Value& v, std::vector<cocos2d::renderer::Technique::Parameter>* ret)
- {
- assert(ret != nullptr);
- if (v.isNullOrUndefined())
- {
- ret->clear();
- return true;
- }
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of TechniqueParameter failed!");
- se::Object* obj = v.toObject();
- uint32_t len = 0;
- obj->getArrayLength(&len);
- ret->reserve(len);
- for (uint32_t i = 0; i < len; ++i)
- {
- se::Value data;
- if (obj->getArrayElement(i, &data))
- {
- cocos2d::renderer::Technique::Parameter parameter;
- seval_to_TechniqueParameter(data, ¶meter);
- ret->push_back(std::move(parameter));
- }
- }
- return true;
- }
- namespace
- {
- void adjustShaderSource(std::string& shaderSource)
- {
- #if CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
- shaderSource = std::regex_replace(shaderSource, std::regex("precision\\s+(lowp|mediump|highp)\\s+float\\s*?;"), "");
- shaderSource = std::regex_replace(shaderSource, std::regex("\\s(lowp|mediump|highp)\\s"), " ");
- #endif
- }
- }
- bool seval_to_ProgramLib_Template(const se::Value& v, cocos2d::renderer::ProgramLib::Template* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to ProgramLib Template failed!");
- se::Object* obj = v.toObject();
- bool ok = false;
- se::Value tmp;
- if (obj->getProperty("id", &tmp))
- {
- ok = seval_to_uint32(tmp, &ret->id);
- SE_PRECONDITION2(ok, false, "Convert id failed!");
- }
- if (obj->getProperty("name", &tmp))
- {
- ok = seval_to_std_string(tmp, &ret->name);
- SE_PRECONDITION2(ok, false, "Convert name failed!");
- }
- if (obj->getProperty("vert", &tmp))
- {
- ok = seval_to_std_string(tmp, &ret->vert);
- SE_PRECONDITION2(ok, false, "Convert vert failed!");
- adjustShaderSource(ret->vert);
- }
- if (obj->getProperty("frag", &tmp))
- {
- ok = seval_to_std_string(tmp, &ret->frag);
- SE_PRECONDITION2(ok, false, "Convert frag failed!");
- adjustShaderSource(ret->frag);
- }
- if (obj->getProperty("defines", &tmp))
- {
- ok = seval_to_ccvaluevector(tmp, &ret->defines);
- SE_PRECONDITION2(ok, false, "Convert defines failed!");
- }
- return true;
- }
- bool seval_to_std_vector_ProgramLib_Template(const se::Value& v, std::vector<cocos2d::renderer::ProgramLib::Template>* ret)
- {
- assert(ret != nullptr);
- SE_PRECONDITION2(v.isObject(), false, "Convert parameter to vector of ProgramLib Template failed!");
- se::Object* obj = v.toObject();
- uint32_t len = 0;
- obj->getArrayLength(&len);
- ret->reserve(len);
- for (uint32_t i = 0; i < len; ++i)
- {
- se::Value data;
- if (obj->getArrayElement(i, &data))
- {
- cocos2d::renderer::ProgramLib::Template parameter;
- if (seval_to_ProgramLib_Template(data, ¶meter))
- {
- ret->push_back(std::move(parameter));
- }
- }
- }
- return true;
- }
- #endif // USE_GFX_RENDERER > 0
- //////////////////////////////////////////////////////////////////////////////////
- // native to seval
- bool int32_to_seval(int32_t v, se::Value* ret)
- {
- ret->setInt32(v);
- return true;
- }
- bool uint32_to_seval(uint32_t v, se::Value* ret)
- {
- ret->setUint32(v);
- return true;
- }
- bool int16_to_seval(uint16_t v, se::Value* ret)
- {
- ret->setInt16(v);
- return true;
- }
- bool uint16_to_seval(uint16_t v, se::Value* ret)
- {
- ret->setUint16(v);
- return true;
- }
- bool int8_to_seval(int8_t v, se::Value* ret)
- {
- ret->setInt8(v);
- return true;
- }
- bool uint8_to_seval(uint8_t v, se::Value* ret)
- {
- ret->setUint8(v);
- return true;
- }
- bool boolean_to_seval(bool v, se::Value* ret)
- {
- ret->setBoolean(v);
- return true;
- }
- bool float_to_seval(float v, se::Value* ret)
- {
- ret->setFloat(v);
- return true;
- }
- bool double_to_seval(double v, se::Value* ret)
- {
- ret->setNumber(v);
- return true;
- }
- bool long_to_seval(long v, se::Value* ret)
- {
- ret->setLong(v);
- return true;
- }
- bool ulong_to_seval(unsigned long v, se::Value* ret)
- {
- ret->setUlong(v);
- return true;
- }
- bool longlong_to_seval(long long v, se::Value* ret)
- {
- ret->setLong((long)v);
- return true;
- }
- bool ssize_to_seval(ssize_t v, se::Value* ret)
- {
- ret->setLong((long)v);
- return true;
- }
- bool size_to_seval(size_t v, se::Value* ret)
- {
- ret->setLong((unsigned long)v);
- return true;
- }
- bool std_string_to_seval(const std::string& v, se::Value* ret)
- {
- ret->setString(v);
- return true;
- }
- bool Vec2_to_seval(const cocos2d::Vec2& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("x", se::Value(v.x));
- obj->setProperty("y", se::Value(v.y));
- ret->setObject(obj);
- return true;
- }
- bool Vec3_to_seval(const cocos2d::Vec3& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("x", se::Value(v.x));
- obj->setProperty("y", se::Value(v.y));
- obj->setProperty("z", se::Value(v.z));
- ret->setObject(obj);
- return true;
- }
- bool Vec4_to_seval(const cocos2d::Vec4& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("x", se::Value(v.x));
- obj->setProperty("y", se::Value(v.y));
- obj->setProperty("z", se::Value(v.z));
- obj->setProperty("w", se::Value(v.w));
- ret->setObject(obj);
- return true;
- }
- bool Mat4_to_seval(const cocos2d::Mat4& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createArrayObject(16));
- for (uint8_t i = 0; i < 16; ++i)
- {
- obj->setArrayElement(i, se::Value(v.m[i]));
- }
- ret->setObject(obj);
- return true;
- }
- bool Size_to_seval(const cocos2d::Size& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("width", se::Value(v.width));
- obj->setProperty("height", se::Value(v.height));
- ret->setObject(obj);
- return true;
- }
- bool Rect_to_seval(const cocos2d::Rect& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("x", se::Value(v.origin.x));
- obj->setProperty("y", se::Value(v.origin.y));
- obj->setProperty("width", se::Value(v.size.width));
- obj->setProperty("height", se::Value(v.size.height));
- ret->setObject(obj);
- return true;
- }
- bool Color3B_to_seval(const cocos2d::Color3B& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("r", se::Value(v.r));
- obj->setProperty("g", se::Value(v.g));
- obj->setProperty("b", se::Value(v.b));
- obj->setProperty("a", se::Value(255));
- ret->setObject(obj);
- return true;
- }
- bool Color4B_to_seval(const cocos2d::Color4B& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("r", se::Value(v.r));
- obj->setProperty("g", se::Value(v.g));
- obj->setProperty("b", se::Value(v.b));
- obj->setProperty("a", se::Value(v.a));
- ret->setObject(obj);
- return true;
- }
- bool Color4F_to_seval(const cocos2d::Color4F& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("r", se::Value(v.r));
- obj->setProperty("g", se::Value(v.g));
- obj->setProperty("b", se::Value(v.b));
- obj->setProperty("a", se::Value(v.a));
- ret->setObject(obj);
- return true;
- }
- bool Color3F_to_seval(const cocos2d::Color3F& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("r", se::Value(v.r));
- obj->setProperty("g", se::Value(v.g));
- obj->setProperty("b", se::Value(v.b));
- ret->setObject(obj);
- return true;
- }
- bool ccvalue_to_seval(const cocos2d::Value& v, se::Value* ret)
- {
- assert(ret != nullptr);
- bool ok = true;
- switch (v.getType())
- {
- case cocos2d::Value::Type::NONE:
- ret->setNull();
- break;
- case cocos2d::Value::Type::UNSIGNED:
- ret->setUint32(v.asUnsignedInt());
- break;
- case cocos2d::Value::Type::BOOLEAN:
- ret->setBoolean(v.asBool());
- break;
- case cocos2d::Value::Type::FLOAT:
- case cocos2d::Value::Type::DOUBLE:
- ret->setNumber(v.asDouble());
- break;
- case cocos2d::Value::Type::INTEGER:
- ret->setInt32(v.asInt());
- break;
- case cocos2d::Value::Type::STRING:
- ret->setString(v.asString());
- break;
- case cocos2d::Value::Type::VECTOR:
- ok = ccvaluevector_to_seval(v.asValueVector(), ret);
- break;
- case cocos2d::Value::Type::MAP:
- ok = ccvaluemap_to_seval(v.asValueMap(), ret);
- break;
- case cocos2d::Value::Type::INT_KEY_MAP:
- ok = ccvaluemapintkey_to_seval(v.asIntKeyMap(), ret);
- break;
- default:
- SE_LOGE("Could not the way to convert cocos2d::Value::Type (%d) type!", (int)v.getType());
- ok = false;
- break;
- }
- return ok;
- }
- bool ccvaluemap_to_seval(const cocos2d::ValueMap& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- bool ok = true;
- for (const auto& e : v)
- {
- const std::string& key = e.first;
- const cocos2d::Value& value = e.second;
- if (key.empty())
- continue;
- se::Value tmp;
- if (!ccvalue_to_seval(value, &tmp))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- obj->setProperty(key.c_str(), tmp);
- }
- if (ok)
- ret->setObject(obj);
- return ok;
- }
- bool ccvaluemapintkey_to_seval(const cocos2d::ValueMapIntKey& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- bool ok = true;
- for (const auto& e : v)
- {
- std::stringstream keyss;
- keyss << e.first;
- std::string key = keyss.str();
- const cocos2d::Value& value = e.second;
- if (key.empty())
- continue;
- se::Value tmp;
- if (!ccvalue_to_seval(value, &tmp))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- obj->setProperty(key.c_str(), tmp);
- }
- if (ok)
- ret->setObject(obj);
- return ok;
- }
- bool ccvaluevector_to_seval(const cocos2d::ValueVector& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createArrayObject(v.size()));
- bool ok = true;
- uint32_t i = 0;
- for (const auto& value : v)
- {
- se::Value tmp;
- if (!ccvalue_to_seval(value, &tmp))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- obj->setArrayElement(i, tmp);
- ++i;
- }
- if (ok)
- ret->setObject(obj);
- return ok;
- }
- bool blendfunc_to_seval(const cocos2d::BlendFunc& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("src", se::Value(v.src));
- obj->setProperty("dst", se::Value(v.dst));
- ret->setObject(obj);
- return true;
- }
- namespace {
- template<typename T>
- bool std_vector_T_to_seval(const std::vector<T>& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createArrayObject(v.size()));
- bool ok = true;
- uint32_t i = 0;
- for (const auto& value : v)
- {
- if (!obj->setArrayElement(i, se::Value(value)))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- ++i;
- }
- if (ok)
- ret->setObject(obj);
- return ok;
- }
- }
- bool std_vector_string_to_seval(const std::vector<std::string>& v, se::Value* ret)
- {
- return std_vector_T_to_seval(v, ret);
- }
- bool std_vector_int_to_seval(const std::vector<int>& v, se::Value* ret)
- {
- return std_vector_T_to_seval(v, ret);
- }
- bool std_vector_uint16_to_seval(const std::vector<uint16_t>& v, se::Value* ret)
- {
- return std_vector_T_to_seval(v, ret);
- }
- bool std_vector_float_to_seval(const std::vector<float>& v, se::Value* ret)
- {
- return std_vector_T_to_seval(v, ret);
- }
- //bool std_vector_Touch_to_seval(const std::vector<cocos2d::Touch*>& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject arr(se::Object::createArrayObject(v.size()));
- //
- // uint32_t i = 0;
- // se::Value tmp;
- // bool ok = true;
- // for (const auto& touch : v)
- // {
- // if (!native_ptr_to_seval<cocos2d::Touch>(touch, &tmp))
- // {
- // ok = false;
- // break;
- // }
- // arr->setArrayElement(i, tmp);
- // ++i;
- // }
- // if (ok)
- // ret->setObject(arr);
- // else
- // ret->setUndefined();
- //
- // return ok;
- //}
- bool std_map_string_string_to_seval(const std::map<std::string, std::string>& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- bool ok = true;
- for (const auto& e : v)
- {
- const std::string& key = e.first;
- const std::string& value = e.second;
- if (key.empty())
- continue;
- se::Value tmp;
- if (!std_string_to_seval(value, &tmp))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- obj->setProperty(key.c_str(), tmp);
- }
- if (ok)
- ret->setObject(obj);
-
- return ok;
- }
- namespace
- {
- enum class DataType
- {
- INT,
- FLOAT
- };
-
- void toVec2(void* data, DataType type, se::Value* ret)
- {
- int32_t* intptr = (int32_t*)data;
- float* floatptr = (float*)data;
- cocos2d::Vec2 vec2;
- if (DataType::INT == type)
- {
- vec2.x = *intptr;
- vec2.y = *(intptr + 1);
- }
- else
- {
- vec2.x = *floatptr;
- vec2.y = *(floatptr + 1);
- }
-
- Vec2_to_seval(vec2, ret);
- }
-
- void toVec3(void* data, DataType type, se::Value* ret)
- {
- int32_t* intptr = (int32_t*)data;
- float* floatptr = (float*)data;
- cocos2d::Vec3 vec3;
- if (DataType::INT == type)
- {
- vec3.x = *intptr;
- vec3.y = *(intptr + 1);
- vec3.z = *(intptr + 2);
- }
- else
- {
- vec3.x = *floatptr;
- vec3.y = *(floatptr + 1);
- vec3.z = *(floatptr + 2);
- }
-
- Vec3_to_seval(vec3, ret);
- }
-
- void toVec4(void* data, DataType type, se::Value* ret)
- {
- int32_t* intptr = (int32_t*)data;
- float* floatptr = (float*)data;
- cocos2d::Vec4 vec4;
- if (DataType::INT == type)
- {
- vec4.x = *intptr;
- vec4.y = *(intptr + 1);
- vec4.z = *(intptr + 2);
- vec4.w = *(intptr + 3);
- }
- else
- {
- vec4.x = *floatptr;
- vec4.y = *(floatptr + 1);
- vec4.z = *(floatptr + 2);
- vec4.w = *(floatptr + 3);
- }
-
- Vec4_to_seval(vec4, ret);
- }
-
- void toMat(float* data, int num, se::Value* ret)
- {
- se::HandleObject obj(se::Object::createPlainObject());
-
- char propName[4] = {0};
- for (int i = 0; i < num; ++i)
- {
- if (i < 10)
- snprintf(propName, 3, "m0%d", i);
- else
- snprintf(propName, 3, "m%d", i);
-
- obj->setProperty(propName, se::Value(*(data + i)));
- }
- ret->setObject(obj);
- }
- }
- bool ManifestAsset_to_seval(const cocos2d::extension::ManifestAsset& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("md5", se::Value(v.md5));
- obj->setProperty("path", se::Value(v.path));
- obj->setProperty("compressed", se::Value(v.compressed));
- obj->setProperty("size", se::Value(v.size));
- obj->setProperty("downloadState", se::Value(v.downloadState));
- ret->setObject(obj);
-
- return true;
- }
- //IDEA: why v has to be a pointer?
- //bool uniform_to_seval(const cocos2d::Uniform* v, se::Value* ret)
- //{
- // assert(v != nullptr && ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- // obj->setProperty("location", se::Value(v->location));
- // obj->setProperty("size", se::Value(v->size));
- // obj->setProperty("type", se::Value(v->type));
- // obj->setProperty("name", se::Value(v->name));
- // ret->setObject(obj);
- //
- // return true;
- //}
- //
- //
- //bool Quaternion_to_seval(const cocos2d::Quaternion& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- // obj->setProperty("x", se::Value(v.x));
- // obj->setProperty("y", se::Value(v.y));
- // obj->setProperty("z", se::Value(v.z));
- // obj->setProperty("w", se::Value(v.w));
- // ret->setObject(obj);
- //
- // return true;
- //}
- //
- //bool AffineTransform_to_seval(const cocos2d::AffineTransform& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- // obj->setProperty("a", se::Value(v.a));
- // obj->setProperty("b", se::Value(v.b));
- // obj->setProperty("c", se::Value(v.c));
- // obj->setProperty("d", se::Value(v.d));
- // obj->setProperty("tx", se::Value(v.tx));
- // obj->setProperty("ty", se::Value(v.ty));
- // ret->setObject(obj);
- //
- // return true;
- //}
- //bool Viewport_to_seval(const cocos2d::experimental::Viewport& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- // obj->setProperty("left", se::Value(v._left));
- // obj->setProperty("bottom", se::Value(v._bottom));
- // obj->setProperty("width", se::Value(v._width));
- // obj->setProperty("height", se::Value(v._height));
- // ret->setObject(obj);
- //
- // return true;
- //}
- bool Data_to_seval(const cocos2d::Data& v, se::Value* ret)
- {
- assert(ret != nullptr);
- if (v.isNull())
- {
- ret->setNull();
- }
- else
- {
- se::HandleObject obj(se::Object::createTypedArray(se::Object::TypedArrayType::UINT8, v.getBytes(), v.getSize()));
- ret->setObject(obj, true);
- }
- return true;
- }
- bool DownloadTask_to_seval(const cocos2d::network::DownloadTask& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("identifier", se::Value(v.identifier));
- obj->setProperty("requestURL", se::Value(v.requestURL));
- obj->setProperty("storagePath", se::Value(v.storagePath));
- ret->setObject(obj);
- return true;
- }
- bool std_vector_EffectDefine_to_seval(const std::vector<cocos2d::ValueMap>& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject arr(se::Object::createArrayObject(v.size()));
- ret->setObject(arr);
-
- uint32_t i = 0;
- for (const auto&valueMap : v)
- {
- se::Value out = se::Value::Null;
- ccvaluemap_to_seval(valueMap, &out);
- arr->setArrayElement(i, out);
-
- ++i;
- }
-
- return true;
- }
- #if USE_GFX_RENDERER
- bool Rect_to_seval(const cocos2d::renderer::Rect& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createPlainObject());
- obj->setProperty("x", se::Value(v.x));
- obj->setProperty("y", se::Value(v.y));
- obj->setProperty("w", se::Value(v.w));
- obj->setProperty("h", se::Value(v.h));
- ret->setObject(obj);
- return true;
- }
- bool EffectProperty_to_seval(const cocos2d::renderer::Effect::Property& v, se::Value* ret)
- {
- assert(ret != nullptr);
-
- auto type = v.getType();
- if (type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_2D || type == cocos2d::renderer::Technique::Parameter::Type::TEXTURE_CUBE)
- {
- auto count = v.getCount();
- if (0 == count)
- {
- *ret = se::Value::Null;
- }
- else if (1 == count)
- {
- se::Value val;
- native_ptr_to_seval<cocos2d::renderer::Texture>(v.getTexture(), &val);
- *ret = val;
- }
- else
- {
- auto texArray = v.getTextureArray();
- se::HandleObject arr(se::Object::createArrayObject(count));
- for (uint8_t i = 0; i < count; ++i)
- {
- se::Value val;
- native_ptr_to_seval<cocos2d::renderer::Texture>(texArray[0], &val);
- arr->setArrayElement(i, val);
- }
- ret->setObject(arr);
- }
- }
- else
- {
- void* data = v.getValue();
- switch (type) {
- case cocos2d::renderer::Technique::Parameter::Type::INT:
- ret->setInt32(*((int32_t*)data));
- break;
- case cocos2d::renderer::Technique::Parameter::Type::INT2:
- toVec2(data, DataType::INT, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::INT3:
- toVec3(data, DataType::INT, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::INT4:
- toVec4(data, DataType::INT, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT:
- ret->setFloat(*((float*)data));
- break;
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT2:
- toVec2(data, DataType::FLOAT, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT3:
- toVec3(data, DataType::FLOAT, ret);
- case cocos2d::renderer::Technique::Parameter::Type::FLOAT4:
- toVec4(data, DataType::FLOAT, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::MAT2:
- toMat((float*)data, 4, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::MAT3:
- toMat((float*)data, 9, ret);
- break;
- case cocos2d::renderer::Technique::Parameter::Type::MAT4:
- toMat((float*)data, 16, ret);
- break;
- default:
- assert(false);
- break;
- }
- }
-
- return true;
- }
- bool std_unorderedmap_string_EffectProperty_to_seval(const std::unordered_map<std::string, cocos2d::renderer::Effect::Property>& v, se::Value* ret)
- {
- assert(ret != nullptr);
-
- se::HandleObject obj(se::Object::createPlainObject());
- bool ok = true;
- for (const auto& e : v)
- {
- const std::string& key = e.first;
- const cocos2d::renderer::Effect::Property& value = e.second;
-
- if (key.empty())
- continue;
-
- se::Value tmp;
- if (!EffectProperty_to_seval(value, &tmp))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
-
- obj->setProperty(key.c_str(), tmp);
- }
-
- if (ok)
- ret->setObject(obj);
-
- return ok;
- }
- // Box2d
- //bool b2Vec2_to_seval(const b2Vec2& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- // obj->setProperty("x", se::Value(v.x));
- // obj->setProperty("y", se::Value(v.y));
- // ret->setObject(obj);
- //
- // return true;
- //}
- //
- //bool b2Manifold_to_seval(const b2Manifold* v, se::Value* ret)
- //{
- // assert(v != nullptr);
- // assert(ret != nullptr);
- // bool ok = false;
- // se::HandleObject obj(se::Object::createPlainObject());
- //
- // do
- // {
- // se::Value tmp;
- // ok = b2Vec2_to_seval(v->localPoint, &tmp);
- // if (!ok) break;
- // obj->setProperty("localPoint", tmp);
- //
- // ok = b2Vec2_to_seval(v->localNormal, &tmp);
- // if (!ok) break;
- // obj->setProperty("localNormal", tmp);
- //
- // obj->setProperty("pointCount", se::Value(v->pointCount));
- // obj->setProperty("type", se::Value((int32_t)v->type));
- //
- // se::HandleObject arr(se::Object::createArrayObject(v->pointCount));
- //
- // for (int32 i = 0; i < v->pointCount; ++i)
- // {
- // const b2ManifoldPoint& p = v->points[i];
- //
- // se::HandleObject arrElement(se::Object::createPlainObject());
- //
- // arrElement->setProperty("normalImpulse", se::Value(p.normalImpulse));
- // arrElement->setProperty("tangentImpulse", se::Value(p.tangentImpulse));
- // se::Value localPointVal;
- // ok = b2Vec2_to_seval(p.localPoint, &localPointVal);
- // if (!ok) break;
- // arrElement->setProperty("localPoint", localPointVal);
- //
- // arr->setArrayElement(i, se::Value(arrElement));
- // }
- //
- // if (ok)
- // obj->setProperty("points", se::Value(arr));
- //
- // } while(false);
- //
- // if (ok)
- // ret->setObject(obj);
- // else
- // ret->setNull();
- // return false;
- //}
- //
- //bool b2AABB_to_seval(const b2AABB& v, se::Value* ret)
- //{
- // assert(ret != nullptr);
- // se::HandleObject obj(se::Object::createPlainObject());
- //
- // se::HandleObject lowerBound(se::Object::createPlainObject());
- // lowerBound->setProperty("x", se::Value(v.lowerBound.x));
- // lowerBound->setProperty("y", se::Value(v.lowerBound.y));
- //
- // obj->setProperty("lowerBound", se::Value(lowerBound));
- //
- // se::HandleObject upperBound(se::Object::createPlainObject());
- // upperBound->setProperty("x", se::Value(v.upperBound.x));
- // upperBound->setProperty("y", se::Value(v.upperBound.y));
- //
- // obj->setProperty("upperBound", se::Value(upperBound));
- //
- // ret->setObject(obj);
- //
- // return true;
- //}
- bool VertexFormat_to_seval(const cocos2d::renderer::VertexFormat& v, se::Value* ret)
- {
- assert(false);
- return true;
- }
- bool TechniqueParameter_to_seval(const cocos2d::renderer::Technique::Parameter& v, se::Value* ret)
- {
- assert(ret != nullptr);
- // type
- se::Object* param = se::Object::createPlainObject();
- se::Value typeVal;
- auto type = v.getType();
- int32_to_seval((int32_t)type, &typeVal);
- param->setProperty("type", typeVal);
-
- // name
- se::Value nameVal;
- std_string_to_seval(v.getName(), &nameVal);
- param->setProperty("name", nameVal);
-
- ret->setObject(param);
- return true;
- }
- bool std_vector_TechniqueParameter_to_seval(const std::vector<cocos2d::renderer::Technique::Parameter>& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject arr(se::Object::createArrayObject(v.size()));
- ret->setObject(arr);
- uint32_t i = 0;
- for (const auto& param : v)
- {
- se::Value out = se::Value::Null;
- TechniqueParameter_to_seval(param, &out);
- arr->setArrayElement(i, out);
- ++i;
- }
- return true;
- }
- bool std_vector_RenderTarget_to_seval(const std::vector<cocos2d::renderer::RenderTarget*>& v, se::Value* ret)
- {
- assert(false);
- return true;
- }
- #endif // USE_GFX_RENDERER > 0
- // Spine conversions
- #if USE_SPINE
- bool seval_to_spine_Vector_String(const se::Value& v, spine::Vector<spine::String>* ret)
- {
- assert(ret != nullptr);
- assert(v.isObject());
- se::Object* obj = v.toObject();
- assert(obj->isArray());
-
- bool ok = true;
- uint32_t len = 0;
- ok = obj->getArrayLength(&len);
- if (!ok)
- {
- ret->clear();
- return false;
- }
-
- se::Value tmp;
- for (uint32_t i = 0; i < len; ++i)
- {
- ok = obj->getArrayElement(i, &tmp);
- if (!ok || !tmp.isObject())
- {
- ret->clear();
- return false;
- }
-
- const char* str = tmp.toString().c_str();
- ret->add(str);
- }
-
- return true;
- }
- bool spine_Vector_String_to_seval(const spine::Vector<spine::String>& v, se::Value* ret)
- {
- assert(ret != nullptr);
- se::HandleObject obj(se::Object::createArrayObject(v.size()));
- bool ok = true;
-
- spine::Vector<spine::String> tmpv = v;
- for (uint32_t i = 0, count = (uint32_t)tmpv.size(); i < count; i++)
- {
- if (!obj->setArrayElement(i, se::Value(tmpv[i].buffer())))
- {
- ok = false;
- ret->setUndefined();
- break;
- }
- }
-
- if (ok)
- ret->setObject(obj);
-
- return ok;
- }
- #endif
|