mirror of https://github.com/axmolengine/axmol.git
756 lines
30 KiB
C++
756 lines
30 KiB
C++
/*
|
|
* Created by ucchen on 2/12/14.
|
|
* Copyright (c) 2014-2016 Chukong Technologies Inc.
|
|
* Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* 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 "scripting/js-bindings/manual/spine/jsb_cocos2dx_spine_manual.h"
|
|
#include "scripting/js-bindings/manual/ScriptingCore.h"
|
|
#include "scripting/js-bindings/manual/cocos2d_specifics.hpp"
|
|
#include "editor-support/spine/spine-cocos2dx.h"
|
|
|
|
using namespace spine;
|
|
|
|
std::unordered_map<spTrackEntry*, JSObject*> _spTrackEntryMap;
|
|
|
|
jsval speventdata_to_jsval(JSContext* cx, spEventData& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
JS::RootedValue jsname(cx, c_string_to_jsval(cx, v.name));
|
|
JS::RootedValue jsstr(cx, c_string_to_jsval(cx, v.stringValue));
|
|
bool ok = JS_DefineProperty(cx, tmp, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "intValue", v.intValue, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "floatValue", v.floatValue, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "stringValue", jsstr, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spevent_to_jsval(JSContext* cx, spEvent& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
JS::RootedValue jsdata(cx, speventdata_to_jsval(cx, *v.data));
|
|
JS::RootedValue jsstr(cx, c_string_to_jsval(cx, v.stringValue));
|
|
bool ok = JS_DefineProperty(cx, tmp, "data", jsdata, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "intValue", v.intValue, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "floatValue", v.floatValue, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "stringValue", jsstr, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spbonedata_to_jsval(JSContext* cx, const spBoneData* v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
// root haven't parent
|
|
JS::RootedValue parentVal(cx);
|
|
if (strcmp(v->name, "root") && v->parent)
|
|
parentVal = spbonedata_to_jsval(cx, v->parent);
|
|
|
|
JS::RootedValue jsname(cx, c_string_to_jsval(cx, v->name));
|
|
bool ok = JS_DefineProperty(cx, tmp, "index", v->index, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "parent", parentVal,JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "length", v->length, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "x", v->x, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "y", v->y, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "rotation", v->rotation, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "scaleX", v->scaleX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "scaleY", v->scaleY, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "shearX", v->shearX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "shearY", v->shearY, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "transformMode", v->transformMode, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spbone_to_jsval(JSContext* cx, spBone& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
// root haven't parent
|
|
JS::RootedValue parentVal(cx);
|
|
if (strcmp(v.data->name, "root") && v.parent)
|
|
parentVal = spbone_to_jsval(cx, *v.parent);
|
|
|
|
JS::RootedValue jsdata(cx, spbonedata_to_jsval(cx, v.data));
|
|
bool ok = JS_DefineProperty(cx, tmp, "data", jsdata, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "parent", parentVal, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "x", v.x, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "y", v.y, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "rotation", v.rotation, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "scaleX", v.scaleX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "scaleY", v.scaleY, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "shearX", v.shearX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "shearY", v.shearY, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "m00", v.a, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "m01", v.b, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "worldX", v.worldX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "m10", v.c, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "m11", v.d, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "worldY", v.worldY, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
/*
|
|
JS_DefineProperty(cx, tmp, "worldRotation", v.worldRotation, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "worldScaleX", v.worldScaleX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "worldScaleY", v.worldScaleY, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
*/
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spskeleton_to_jsval(JSContext* cx, spSkeleton& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
bool ok = JS_DefineProperty(cx, tmp, "x", v.x, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "y", v.y, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "flipX", v.flipX, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "flipY", v.flipY, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "time", v.time, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "boneCount", v.bonesCount, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "slotCount", v.slotsCount, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spattachment_to_jsval(JSContext* cx, spAttachment& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
JS::RootedValue jsname(cx, c_string_to_jsval(cx, v.name));
|
|
bool ok = JS_DefineProperty(cx, tmp, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "type", v.type, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spColor_to_jsval(JSContext* cx, const spColor* v)
|
|
{
|
|
if (!v)
|
|
return JSVAL_NULL;
|
|
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
bool ok = JS_DefineProperty(cx, tmp, "r", v->r, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "g", v->g, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "b", v->b, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
else
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spslotdata_to_jsval(JSContext* cx, spSlotData& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
JS::RootedValue jsname(cx, c_string_to_jsval(cx, v.name));
|
|
JS::RootedValue jsattachmentName(cx, c_string_to_jsval(cx, v.attachmentName));
|
|
JS::RootedValue jsboneData(cx, spbonedata_to_jsval(cx, v.boneData));
|
|
JS::RootedValue jscolor(cx, spColor_to_jsval(cx, &v.color));
|
|
JS::RootedValue jsdarkColor(cx, spColor_to_jsval(cx, v.darkColor));
|
|
bool ok = JS_DefineProperty(cx, tmp, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "attachmentName", jsattachmentName, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "color", jscolor, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "darkColor", jsdarkColor, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "blendMode", v.blendMode, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "boneData", jsboneData, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "index", v.index, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spslot_to_jsval(JSContext* cx, spSlot& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
JS::RootedValue jsbone(cx, spbone_to_jsval(cx, *v.bone));
|
|
JS::RootedValue jsattachment(cx, spattachment_to_jsval(cx, *v.attachment));
|
|
JS::RootedValue jsdata(cx, spslotdata_to_jsval(cx, *v.data));
|
|
JS::RootedValue jscolor(cx, spColor_to_jsval(cx, &v.color));
|
|
JS::RootedValue jsdarkColor(cx, spColor_to_jsval(cx, v.darkColor));
|
|
bool ok = JS_DefineProperty(cx, tmp, "color", jscolor, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "darkColor", jsdarkColor, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "bone", jsbone, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
//JS_DefineProperty(cx, tmp, "skeleton", spskeleton_to_jsval(cx, *v.skeleton), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "attachment", jsattachment, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "data", jsdata, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "attachmentVerticesCapacity", v.attachmentVerticesCapacity, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "attachmentVerticesCount", v.attachmentVerticesCount, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "attachmentVertices", *v.attachmentVertices, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval sptimeline_to_jsval(JSContext* cx, spTimeline& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
bool ok = JS_DefineProperty(cx, tmp, "type", v.type, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spanimationstate_to_jsval(JSContext* cx, spAnimationState& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
bool ok = JS_DefineProperty(cx, tmp, "timeScale", v.timeScale, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "trackCount", v.tracksCount, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
jsval spanimation_to_jsval(JSContext* cx, spAnimation& v)
|
|
{
|
|
JS::RootedObject tmp(cx, JS_NewObject(cx, nullptr, JS::NullPtr(), JS::NullPtr()));
|
|
if (!tmp) return JSVAL_NULL;
|
|
|
|
JS::RootedValue jsname(cx, c_string_to_jsval(cx, v.name));
|
|
JS::RootedValue jstimelines(cx, sptimeline_to_jsval(cx, **v.timelines));
|
|
bool ok = JS_DefineProperty(cx, tmp, "duration", v.duration, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "timelineCount", v.timelinesCount, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "name", jsname, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
|
|
JS_DefineProperty(cx, tmp, "timelines", jstimelines, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
if (ok)
|
|
{
|
|
return OBJECT_TO_JSVAL(tmp);
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
JSClass *jsb_spine_TrackEntry_class;
|
|
JSObject *jsb_spine_TrackEntry_prototype;
|
|
|
|
bool jsb_spine_TrackEntry_get_next(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
JS::RootedObject jsthis(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(jsthis);
|
|
spTrackEntry* cobj = (spTrackEntry *)(proxy ? proxy->ptr : NULL);
|
|
if (cobj) {
|
|
JS::RootedValue jsret(cx, JS::NullValue());
|
|
if (cobj->next)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *cobj->next);
|
|
}
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
else {
|
|
CCLOGERROR("jsb_spine_TrackEntry_get_next : Invalid Native Object");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool jsb_spine_TrackEntry_get_mixingFrom(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
JS::RootedObject jsthis(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(jsthis);
|
|
spTrackEntry* cobj = (spTrackEntry *)(proxy ? proxy->ptr : NULL);
|
|
if (cobj) {
|
|
JS::RootedValue jsret(cx, JS::NullValue());
|
|
if (cobj->mixingFrom)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *cobj->mixingFrom);
|
|
}
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
else {
|
|
CCLOGERROR("jsb_spine_TrackEntry_get_previous : Invalid Native Object");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void js_spine_TrackEntry_finalize(JSFreeOp *fop, JSObject *obj) {
|
|
std::unordered_map<spTrackEntry*, JSObject*>::iterator existed = _spTrackEntryMap.begin();
|
|
while (existed != _spTrackEntryMap.end()) {
|
|
if (existed->second == obj)
|
|
{
|
|
_spTrackEntryMap.erase(existed);
|
|
break;
|
|
}
|
|
++existed;
|
|
}
|
|
}
|
|
|
|
void js_register_spine_TrackEntry(JSContext *cx, JS::HandleObject global)
|
|
{
|
|
jsb_spine_TrackEntry_class = (JSClass *)calloc(1, sizeof(JSClass));
|
|
jsb_spine_TrackEntry_class->name = "TrackEntry";
|
|
jsb_spine_TrackEntry_class->addProperty = JS_PropertyStub;
|
|
jsb_spine_TrackEntry_class->delProperty = JS_DeletePropertyStub;
|
|
jsb_spine_TrackEntry_class->getProperty = JS_PropertyStub;
|
|
jsb_spine_TrackEntry_class->setProperty = JS_StrictPropertyStub;
|
|
jsb_spine_TrackEntry_class->enumerate = JS_EnumerateStub;
|
|
jsb_spine_TrackEntry_class->resolve = JS_ResolveStub;
|
|
jsb_spine_TrackEntry_class->convert = JS_ConvertStub;
|
|
jsb_spine_TrackEntry_class->finalize = js_spine_TrackEntry_finalize;
|
|
jsb_spine_TrackEntry_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
|
|
|
|
static JSPropertySpec properties[] =
|
|
{
|
|
JS_PSG("mixingFrom", jsb_spine_TrackEntry_get_mixingFrom, JSPROP_PERMANENT | JSPROP_ENUMERATE),
|
|
JS_PSG("next", jsb_spine_TrackEntry_get_next, JSPROP_PERMANENT | JSPROP_ENUMERATE),
|
|
JS_PS_END
|
|
};
|
|
|
|
jsb_spine_TrackEntry_prototype = JS_InitClass(cx, global, JS::NullPtr(), jsb_spine_TrackEntry_class, nullptr, 0, properties, nullptr, nullptr, nullptr);
|
|
}
|
|
|
|
jsval sptrackentry_to_jsval(JSContext* cx, spTrackEntry& v)
|
|
{
|
|
JS::RootedObject entry(cx);
|
|
std::unordered_map<spTrackEntry*, JSObject*>::iterator existed = _spTrackEntryMap.find(&v);
|
|
bool found = existed != _spTrackEntryMap.end();
|
|
if (found)
|
|
{
|
|
entry.set(existed->second);
|
|
}
|
|
else
|
|
{
|
|
JS::RootedObject proto(cx, jsb_spine_TrackEntry_prototype);
|
|
entry.set(JS_NewObject(cx, jsb_spine_TrackEntry_class, proto, JS::NullPtr()));
|
|
}
|
|
|
|
JS::RootedValue entryVal(cx, OBJECT_TO_JSVAL(entry));
|
|
if (entryVal.isObject())
|
|
{
|
|
JS::RootedValue val(cx, spanimation_to_jsval(cx, *v.animation));
|
|
bool ok = JS_SetProperty(cx, entry, "animation", val);
|
|
val.set(INT_TO_JSVAL(v.trackIndex));
|
|
ok &= JS_SetProperty(cx, entry, "trackIndex", val);
|
|
val.set(INT_TO_JSVAL(v.loop));
|
|
ok &= JS_SetProperty(cx, entry, "loop", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.eventThreshold));
|
|
ok &= JS_SetProperty(cx, entry, "eventThreshold", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.attachmentThreshold));
|
|
ok &= JS_SetProperty(cx, entry, "attachmentThreshold", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.drawOrderThreshold));
|
|
ok &= JS_SetProperty(cx, entry, "drawOrderThreshold", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.animationStart));
|
|
ok &= JS_SetProperty(cx, entry, "animationStart", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.animationEnd));
|
|
ok &= JS_SetProperty(cx, entry, "animationEnd", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.animationLast));
|
|
ok &= JS_SetProperty(cx, entry, "animationLast", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.nextAnimationLast));
|
|
ok &= JS_SetProperty(cx, entry, "nextAnimationLast", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.delay));
|
|
ok &= JS_SetProperty(cx, entry, "delay", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.trackTime));
|
|
ok &= JS_SetProperty(cx, entry, "trackTime", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.trackLast));
|
|
ok &= JS_SetProperty(cx, entry, "trackLast", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.nextTrackLast));
|
|
ok &= JS_SetProperty(cx, entry, "nextTrackLast", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.trackEnd));
|
|
ok &= JS_SetProperty(cx, entry, "trackEnd", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.timeScale));
|
|
ok &= JS_SetProperty(cx, entry, "timeScale", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.alpha));
|
|
ok &= JS_SetProperty(cx, entry, "alpha", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.mixTime));
|
|
ok &= JS_SetProperty(cx, entry, "mixTime", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.mixDuration));
|
|
ok &= JS_SetProperty(cx, entry, "mixDuration", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.interruptAlpha));
|
|
ok &= JS_SetProperty(cx, entry, "interruptAlpha", val);
|
|
val.set(DOUBLE_TO_JSVAL(v.totalAlpha));
|
|
ok &= JS_SetProperty(cx, entry, "totalAlpha", val);
|
|
|
|
if (v.timelinesRotation)
|
|
val.set(DOUBLE_TO_JSVAL(*v.timelinesRotation));
|
|
else
|
|
val.set(JSVAL_NULL);
|
|
ok &= JS_SetProperty(cx, entry, "timelinesRotation", val);
|
|
|
|
val.set(INT_TO_JSVAL(v.timelinesRotationCount));
|
|
ok &= JS_SetProperty(cx, entry, "timelinesRotationCount", val);
|
|
|
|
if (ok)
|
|
{
|
|
if (!found)
|
|
{
|
|
_spTrackEntryMap.emplace(&v, entry);
|
|
}
|
|
return entryVal;
|
|
}
|
|
}
|
|
|
|
return JSVAL_NULL;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_findBone(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
SkeletonRenderer* cobj = (SkeletonRenderer *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 1) {
|
|
const char* arg0;
|
|
std::string arg0_tmp; ok &= jsval_to_std_string(cx, args.get(0), &arg0_tmp); arg0 = arg0_tmp.c_str();
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
spBone* ret = cobj->findBone(arg0);
|
|
jsval jsret = JSVAL_NULL;
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = spbone_to_jsval(cx, *ret);
|
|
}
|
|
} while (0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_findSlot(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
SkeletonRenderer* cobj = (SkeletonRenderer *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 1) {
|
|
const char* arg0;
|
|
std::string arg0_tmp; ok &= jsval_to_std_string(cx, args.get(0), &arg0_tmp); arg0 = arg0_tmp.c_str();
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
spSlot* ret = cobj->findSlot(arg0);
|
|
jsval jsret = JSVAL_NULL;
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = spslot_to_jsval(cx, *ret);
|
|
}
|
|
} while (0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_setDebugBones(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
SkeletonRenderer* cobj = (SkeletonRenderer *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 1) {
|
|
bool enable = args.get(0).toBoolean();
|
|
cobj->setDebugBonesEnabled(enable);
|
|
|
|
args.rval().setUndefined();
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_setDebugSolots(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
SkeletonRenderer* cobj = (SkeletonRenderer *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 1) {
|
|
bool enable = args.get(0).toBoolean();
|
|
cobj->setDebugSlotsEnabled(enable);
|
|
|
|
args.rval().setUndefined();
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_getAttachment(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
SkeletonRenderer* cobj = (SkeletonRenderer*)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 2) {
|
|
const char* arg0;
|
|
std::string arg0_tmp; ok &= jsval_to_std_string(cx, args.get(0), &arg0_tmp); arg0 = arg0_tmp.c_str();
|
|
const char* arg1;
|
|
std::string arg1_tmp; ok &= jsval_to_std_string(cx, args.get(1), &arg1_tmp); arg1 = arg1_tmp.c_str();
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
spAttachment* ret = cobj->getAttachment(arg0, arg1);
|
|
jsval jsret = JSVAL_NULL;
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = spattachment_to_jsval(cx, *ret);
|
|
}
|
|
} while(0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_getCurrent(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
spine::SkeletonAnimation* cobj = (spine::SkeletonAnimation *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 1) {
|
|
int arg0;
|
|
ok &= jsval_to_int32(cx, args.get(0), (int32_t *)&arg0);
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
spTrackEntry* ret = cobj->getCurrent(arg0);
|
|
jsval jsret = JSVAL_NULL;
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *ret);
|
|
}
|
|
} while (0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
else if (argc == 0) {
|
|
spTrackEntry* ret = cobj->getCurrent();
|
|
jsval jsret = JSVAL_NULL;
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *ret);
|
|
}
|
|
} while (0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_setAnimation(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
spine::SkeletonAnimation* cobj = (spine::SkeletonAnimation *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 3) {
|
|
int arg0;
|
|
ok &= jsval_to_int32(cx, args.get(0), (int32_t *)&arg0);
|
|
|
|
const char* arg1;
|
|
std::string arg1_tmp; ok &= jsval_to_std_string(cx, args.get(1), &arg1_tmp); arg1 = arg1_tmp.c_str();
|
|
|
|
bool arg2 = JS::ToBoolean(args.get(2));
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
|
|
spTrackEntry* ret = cobj->setAnimation(arg0, arg1, arg2);
|
|
jsval jsret = JSVAL_NULL;
|
|
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *ret);
|
|
}
|
|
} while(0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
bool jsb_cocos2dx_spine_addAnimation(JSContext *cx, uint32_t argc, jsval *vp)
|
|
{
|
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
bool ok = true;
|
|
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
|
|
js_proxy_t *proxy = jsb_get_js_proxy(obj);
|
|
spine::SkeletonAnimation* cobj = (spine::SkeletonAnimation *)(proxy ? proxy->ptr : NULL);
|
|
JSB_PRECONDITION2( cobj, cx, false, "Invalid Native Object");
|
|
if (argc == 3) {
|
|
int arg0;
|
|
ok &= jsval_to_int32(cx, args.get(0), (int32_t *)&arg0);
|
|
|
|
const char* arg1;
|
|
std::string arg1_tmp; ok &= jsval_to_std_string(cx, args.get(1), &arg1_tmp); arg1 = arg1_tmp.c_str();
|
|
|
|
bool arg2 = JS::ToBoolean(args.get(2));
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
|
|
spTrackEntry* ret = cobj->addAnimation(arg0, arg1, arg2);
|
|
jsval jsret = JSVAL_NULL;
|
|
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *ret);
|
|
}
|
|
} while(0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
} else if (argc == 4) {
|
|
int arg0;
|
|
ok &= jsval_to_int32(cx, args.get(0), (int32_t *)&arg0);
|
|
|
|
const char* arg1;
|
|
std::string arg1_tmp; ok &= jsval_to_std_string(cx, args.get(1), &arg1_tmp); arg1 = arg1_tmp.c_str();
|
|
|
|
bool arg2 = JS::ToBoolean(args.get(2));
|
|
|
|
double arg3;
|
|
ok &= JS::ToNumber(cx, args.get(3), &arg3);
|
|
JSB_PRECONDITION2(ok, cx, false, "Error processing arguments");
|
|
|
|
spTrackEntry* ret = cobj->addAnimation(arg0, arg1, arg2, arg3);
|
|
jsval jsret = JSVAL_NULL;
|
|
|
|
do {
|
|
if (ret)
|
|
{
|
|
jsret = sptrackentry_to_jsval(cx, *ret);
|
|
}
|
|
} while(0);
|
|
|
|
args.rval().set(jsret);
|
|
return true;
|
|
}
|
|
|
|
JS_ReportError(cx, "wrong number of arguments: %d, was expecting %d", argc, 1);
|
|
return false;
|
|
}
|
|
|
|
|
|
extern JSObject* jsb_spine_SkeletonRenderer_prototype;
|
|
extern JSObject* jsb_spine_SkeletonAnimation_prototype;
|
|
|
|
void register_all_cocos2dx_spine_manual(JSContext* cx, JS::HandleObject global)
|
|
{
|
|
js_register_spine_TrackEntry(cx, global);
|
|
|
|
JS::RootedObject skeletonRenderer(cx, jsb_spine_SkeletonRenderer_prototype);
|
|
JS_DefineFunction(cx, skeletonRenderer, "findBone", jsb_cocos2dx_spine_findBone, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonRenderer, "findSlot", jsb_cocos2dx_spine_findSlot, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonRenderer, "setDebugBones", jsb_cocos2dx_spine_setDebugBones, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonRenderer, "setDebugSolots", jsb_cocos2dx_spine_setDebugSolots, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonRenderer, "getAttachment", jsb_cocos2dx_spine_getAttachment, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
|
|
JS::RootedObject skeletonAnimation(cx, jsb_spine_SkeletonAnimation_prototype);
|
|
JS_DefineFunction(cx, skeletonAnimation, "getCurrent", jsb_cocos2dx_spine_getCurrent, 1, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonAnimation, "setAnimation", jsb_cocos2dx_spine_setAnimation, 3, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
JS_DefineFunction(cx, skeletonAnimation, "addAnimation", jsb_cocos2dx_spine_addAnimation, 4, JSPROP_ENUMERATE | JSPROP_PERMANENT);
|
|
}
|