2022-06-30 17:52:28 +08:00

1801 lines
48 KiB
C++

/****************************************************************************
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;
//}
//////////////////////////////////////////////////////////////////////////////////
// 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
};
}
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;
}