/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #include "binding_helpers.h" #include "script_squirrel/cobject/matrix_decl.h" #include "scene3d/mitem_event_interface.h" #include "scene3d/scene_ace_manager.h" #include "scene3d/mcamera.h" #include "scene3d/mlight.h" #include "scene3d/mobject.h" #include "scene3d/memitter.h" #include "scene3d/mtrigger.h" #include "scene3d/instance.h" #include "scene3d/scene.h" #include "scene3d/group.h" #include "motion/motion_automation_source.h" #include "script/scripted_object.h" #include "script/script_unit.h" #include "metafile/nml_object.h" #include "core/resource_factories.h" using namespace GS; using namespace GS::S3D; using namespace GS::Script; static CObjectType item_derived_types[] = { typetag_Item, typetag_Camera, typetag_Object, typetag_Light, typetag_Trigger, typetag_Emitter, typetag_Undefined }; //------------------------------------------------------------------------------ SQInteger ItemTranslate(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(i, MItem, item_derived_types) __SQ_GETVECTOR(t) __SQ_GETEND i->GetBaseItem()->SetPosition(i->GetBaseItem()->GetPosition() + t); __SQ_RETURN } SQInteger ItemRotate(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(i, MItem, item_derived_types) __SQ_GETVECTOR(e) __SQ_GETEND i->GetBaseItem()->SetRotation(i->GetBaseItem()->GetRotation() + e); __SQ_RETURN } SQInteger ItemScale(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(i, MItem, item_derived_types) __SQ_GETVECTOR(s) __SQ_GETEND i->GetBaseItem()->SetScale(i->GetBaseItem()->GetScale() * s); __SQ_RETURN } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemCastToEmitter(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Emitter) return sq_throwerror(vm, "Invalid item cast, item is not a particle emitter."); __SQ_RETURNSAFEPTR((MEmitter *)i, typetag_Emitter) } SQInteger ItemCastToCamera(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Camera) return sq_throwerror(vm, "Invalid item cast, item is not a camera."); __SQ_RETURNSAFEPTR((MCamera *)i, typetag_Camera) } SQInteger ItemCastToObject(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Object) return sq_throwerror(vm, "Invalid item cast, item is not an object."); __SQ_RETURNSAFEPTR((MObject *)i, typetag_Object) } SQInteger ItemCastToTrigger(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Trigger) return sq_throwerror(vm, "Invalid item cast, item is not a trigger."); __SQ_RETURNSAFEPTR((MTrigger *)i, typetag_Trigger) } SQInteger ItemCastToLight(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Light) return sq_throwerror(vm, "Invalid item cast, item is not a light."); __SQ_RETURNSAFEPTR((MLight *)i, typetag_Light) } SQInteger ItemCastToInstance(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(i, MItem, typetag_Item) if (i->GetItemType() != Type_Instance) return sq_throwerror(vm, "Invalid item cast, item is not an instance."); __SQ_RETURNSAFEPTR((Instance *)i, typetag_Instance) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemDerivedCastToItem(HSQUIRRELVM vm) { MItem *item = NULL; //----------------------------------- #define __GrabDerivedItem(__T__)\ {\ __T__ *i;\ CObject::Get(vm, -1, (void **)&i);\ item = i;\ }\ break; //----------------------------------- CObjectType type; if (!CObject::GetType(vm, -1, type)) return -1; switch (type) { case typetag_Camera: __GrabDerivedItem(MCamera) case typetag_Light: __GrabDerivedItem(MLight) case typetag_Object: __GrabDerivedItem(MObject) case typetag_Trigger: __GrabDerivedItem(MTrigger) case typetag_Emitter: __GrabDerivedItem(MEmitter) case typetag_Item: __GrabDerivedItem(MItem) default: break; } sq_pop(vm, 1); __SQ_RETURNSAFEPTR(item, typetag_Item) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemRegistrySetKey(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(key) GS::Variant value; HSQOBJECT o; sq_getstackobj(vm, __SQ_STACKPOS, &o); switch (sq_type(o)) { case OT_BOOL: { __SQ_GETBOOL(v) value = asbool(v); } break; case OT_INTEGER: { __SQ_GETINT(v) value = (int)v; } break; case OT_FLOAT: { __SQ_GETFLOAT(v) value = v; } break; case OT_STRING: { __SQ_GETSTRING(s) value = s; } break; default: return sq_throwerror(vm, "Unsupported key value type."); } item->GetBaseItem()->registry.CreateKey(key, &value); __SQ_GETEND __SQ_RETURN } SQInteger ItemRegistryGetKey(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(key) __SQ_GETEND GS::Variant v(-1); GS::NML::Tag *tag = item->GetBaseItem()->registry.GetTag(key); if (tag) v = tag->GetValue(); switch (v.GetType()) { case GS::Variant::VariantBool: __SQ_RETURNBOOL(v.b_value) case GS::Variant::VariantInteger: __SQ_RETURNINT(v.i_value) case GS::Variant::VariantFloat: __SQ_RETURNFLOAT(v.f_value) case GS::Variant::VariantString: __SQ_RETURNSTRING(v.s_value.c_str()) } __SQ_RETURNINT(-1) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemSetCommandList(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(list) ACEManager::Get()->LoadACECommandList(list, item); __SQ_GETEND __SQ_RETURN } SQInteger ItemResetCommandList(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(item, MItem, typetag_Item) item->ResetCommandList(); __SQ_RETURN } SQInteger ItemIsCommandListDone(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(item ? item->IsCommandListDone() : true) } //------------------------------------------------------------------------------ SQInteger ItemPrint(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __LOG__ << "Item: " << (asbool(item) ? item->name.c_str() : "Null") << " (Uid = " << (asbool(item) ? item->GetUid() : -1) << ").\n"; __SQ_RETURN } SQInteger ItemReset(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) item->Reset(); __SQ_RETURN } SQInteger ItemGetType(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNINT(item ? item->GetItemType() : 0) } SQInteger ItemRenderSetup(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSAFEPTR(f, Core::ResourceFactories, typetag_ResourceFactories) __SQ_GETEND if (item->GetBaseItem()) item->GetBaseItem()->RenderSetup(f); __SQ_RETURN } //------------------------------------------------------------------------------ #define __SQ_GETMITEMSCRIPTOBJECT(__SRC) ScriptedObject *scripted_object = __SRC->scripted_object; if (!scripted_object) return sq_throwerror(vm, "No script system in scene!"); #define __SQ_ASSERTSCRIPTUNITOPEN(__UNIT, __NAME) if (!(__UNIT)->IsOpen()) return sq_throwerror(vm, GS::String::Format("Script unit for '%s' is not open.", __NAME)); SQInteger ItemSetScript(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(script_file) __SQ_GETSTRING(script_class) __SQ_GETMITEMSCRIPTOBJECT(item) if (!scripted_object->GetUnitList().GetCount()) scripted_object->AddUnit(scripted_object->NewUnit()); if (GS::Script::Unit *unit = scripted_object->GetUnitList().ObjectAt(0)) { unit->script_file = script_file; unit->script_class = script_class; } __SQ_GETEND __SQ_RETURN } SQInteger ItemGetScriptInstance(HSQUIRRELVM vm) // LEGACY { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETMITEMSCRIPTOBJECT(item) if (!scripted_object->GetUnitList().GetCount()) return sq_throwerror(vm, GS::String::Format("Item '%s' has no script unit.", item->name.c_str())); Script::Unit *unit = scripted_object->GetUnitList()[0]; __SQ_ASSERTSCRIPTUNITOPEN(unit, item->name.c_str()) __SQ_RETURNOBJECT(((Script::SquirrelObject *)unit->Self())->object); } SQInteger ItemGetScriptInstanceCount(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETMITEMSCRIPTOBJECT(item) __SQ_RETURNINT(scripted_object->GetUnitList().GetCount()) } SQInteger ItemGetScriptInstanceFromIndex(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETEND __SQ_GETMITEMSCRIPTOBJECT(item) Script::Unit *unit = scripted_object->GetUnitList().ObjectAt(index); __SQ_ASSERTSCRIPTUNITOPEN(unit, item->name.c_str()) __SQ_RETURNOBJECT(((Script::SquirrelObject *)unit->Self())->object); } SQInteger ItemGetScriptInstanceFromClass(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(_class) __SQ_GETMITEMSCRIPTOBJECT(item) Script::Unit *_unit = 0; ListForeachPtr(Script::Unit *, unit, scripted_object->GetUnitList()) if (unit->script_class == _class) { _unit = unit; break; } __SQ_GETEND if (_unit) { __SQ_ASSERTSCRIPTUNITOPEN(_unit, item->name.c_str()) __SQ_RETURNOBJECT(((Script::SquirrelObject *)_unit->Self())->object); } return sq_throwerror(vm, "Script unit not found"); } SQInteger ItemHasScript(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(_class) __SQ_GETMITEMSCRIPTOBJECT(item) Script::Unit *_unit = 0; ListForeachPtr(Script::Unit *, unit, scripted_object->GetUnitList()) if (unit->script_class == _class) { _unit = unit; break; } __SQ_GETEND __SQ_RETURNBOOL(asbool(_unit)) } SQInteger ItemSetupScript(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETMITEMSCRIPTOBJECT(item) if (!scripted_object->GetUnitList().GetCount()) scripted_object->AddUnit(scripted_object->NewUnit()); if (Script::Unit *unit = scripted_object->GetUnitList().ObjectAt(0)) unit->Open(); __SQ_RETURN } //------------------------------------------------------------------------------ SQInteger ItemCompare(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item_a, MItem, item_derived_types) __SQ_GETCOBJECTBASE(item_b, MItem, item_derived_types) __SQ_GETEND __SQ_RETURNBOOL(item_a == item_b ? true : false) } //------------------------------------------------------------------------------ SQInteger ItemIsActive(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(item ? item->isActive() : false) } //------------------------------------------------------------------------------ SQInteger ItemIsInvisible(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(item ? item->GetBaseItem()->item_flags.IsSet(ItemFlagInvisible) : true) } SQInteger ItemSetInvisible(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETBOOL(invisible) __SQ_GETEND item->GetBaseItem()->item_flags.Raise(ItemFlagInvisible, invisible ? true : false); __SQ_RETURN } //------------------------------------------------------------------------------ static void SetItemInvisibleRecursive(Core::Item *i, bool v) { i->item_flags.Raise(ItemFlagInvisible, v); ListForeachPtr(Core::Item *, c, i->GetChildren()) SetItemInvisibleRecursive(c, v); } SQInteger ItemHierarchySetInvisible(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETBOOL(invisible) __SQ_GETEND SetItemInvisibleRecursive(item->GetBaseItem(), asbool(invisible)); __SQ_RETURN } //------------------------------------------------------------------------------ SQInteger ItemRecordLocation(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) item->SetInitialTransformation(); __SQ_RETURN } SQInteger ItemGetMinMax(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) MinMax minmax; item->GetBaseItem()->ComputeLocalMinMax(minmax); __SQ_RETURNMINMAX(minmax) } SQInteger ItemGetMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNMATRIX4(item->GetBaseItem()->GetMatrix()) } SQInteger ItemGetInverseMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNMATRIX4(item->GetBaseItem()->GetInverseMatrix()) } SQInteger ItemGetLocalMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNMATRIX4(item->GetBaseItem()->GetLocalMatrix()) } SQInteger ItemSetMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETMATRIX4(mtx) __SQ_GETEND item->GetBaseItem()->SetMatrix(mtx); __SQ_RETURN } SQInteger ItemGetRotationMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNMATRIX3(GS::Matrix3::FromMatrix4(item->GetBaseItem()->GetMatrix())) } SQInteger ItemSetRotationMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETMATRIX3(mtx) __SQ_GETEND item->GetBaseItem()->SetRotation(mtx); __SQ_RETURN } SQInteger ItemSnapshotTransformation(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) item->GetBaseItem()->SnapshotTransformation(item->GetBaseItem()->GetMatrix()); __SQ_RETURN } SQInteger ItemSnapshotMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETMATRIX4(m) __SQ_GETEND item->GetBaseItem()->SnapshotTransformation(m); __SQ_RETURN } SQInteger ItemGetGeometry(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) if (item->GetItemType() != Type_Object) return sq_throwerror(vm, "Item is not an object, cannot get geometry"); if (((MObject *)item)->render_data.IsNull()) __SQ_RETURNNULL __SQ_RETURNSAFEPTR(((MObject *)item)->render_data->geometry.c_ptr(), typetag_Geometry) } SQInteger ItemSaveGeometry(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(path) __SQ_GETSAFEPTR(f, Core::ResourceFactories, typetag_ResourceFactories) __SQ_GETEND if (item->GetItemType() != Type_Object) return sq_throwerror(vm, "Item is not an object, cannot get geometry"); else { NML::SaveToFile(*f->graphic->LoadGeometry(((MObject *)item)->geometry), path); } __SQ_RETURN } SQInteger ItemGetOpacity(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNFLOAT(item->GetBaseItem()->opacity) } SQInteger ItemSetOpacity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(a) __SQ_GETEND item->GetBaseItem()->opacity = Types::Clamp(a); __SQ_RETURN } SQInteger ItemSetPriority(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(p) __SQ_GETEND item->SetPriority(p); __SQ_RETURN } SQInteger ItemSetExcludeFromRecord(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(exclude) __SQ_GETEND __SQ_RETURN } SQInteger ItemGetExcludeFromRecord(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(false) } SQInteger ItemGetChild(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(name) __SQ_GETEND MItem *_ci = NULL; ListForeachPtr(Core::Item *, ci, item->GetBaseItem()->GetChildren()) if (Scene::LocateManagedItem(ci)->name == name) { _ci = Scene::LocateManagedItem(ci); break; } __SQ_RETURNSAFEPTR(_ci, typetag_Item) } SQInteger ItemGetName(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNSTRING(item->name.c_str()) } SQInteger ItemSetName(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(_name) item->name = _name; __SQ_GETEND __SQ_RETURN } SQInteger ItemGetRotationOrder(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNINT((int)item->GetBaseItem()->GetRotationOrder()) } SQInteger ItemSetRotationOrder(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(rorder) __SQ_GETEND item->GetBaseItem()->SetRotationOrder((Math::rOrder)rorder); __SQ_RETURN } SQInteger ItemComputeMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURN } SQInteger ItemComputeLocalMatrix(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURN } SQInteger ItemComputeMinMax(HSQUIRRELVM vm) { __SQ_GETSINGLESAFEPTR(item, MItem, typetag_Item) MinMax minmax; item->GetBaseItem()->ComputeLocalMinMax(minmax); __SQ_RETURN } SQInteger ItemSetLinkInheritsPositionOnly(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETBOOL(flag) __SQ_GETEND item->GetBaseItem()->item_flags.Raise(ItemFlagInheritPositionOnly, asbool(flag)); __SQ_RETURN } SQInteger ItemSetPosition(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) item->GetBaseItem()->SetPosition(p); __SQ_GETEND __SQ_RETURN } SQInteger ItemGetPosition(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetPosition()) } SQInteger ItemSetScale(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(s) __SQ_GETEND item->GetBaseItem()->SetScale(s); __SQ_RETURN } SQInteger ItemGetScale(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetScale()) } SQInteger ItemGetWorldPosition(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetMatrix().GetRow(3)) } SQInteger ItemGetWorldRotation(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(GS::Matrix3::FromMatrix4(item->GetBaseItem()->GetMatrix()).AsEuler()) } SQInteger ItemGetPreviousWorldPosition(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetPreviousMatrix().GetRow(3)) } SQInteger ItemSetPivot(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETEND GS::Matrix4 m; m.SetRow(3, p); item->GetBaseItem()->SetPivot(m); __SQ_RETURN } SQInteger ItemGetPivot(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetPivot().GetRow(3)) } SQInteger ItemSetRotation(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(e) __SQ_GETEND item->GetBaseItem()->SetRotation(e); __SQ_RETURN } SQInteger ItemSetRotationQuaternion(HSQUIRRELVM vm) { return ItemSetRotation(vm); } SQInteger ItemGetRotation(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->GetRotation()) } SQInteger ItemSetTarget(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(target) __SQ_GETEND item->GetBaseItem()->SetTarget(&target); __SQ_RETURN } SQInteger ItemSetNoTarget(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) item->GetBaseItem()->SetTarget(NULL); __SQ_RETURN } SQInteger ItemGetTarget(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(item->GetBaseItem()->target) } SQInteger ItemHasTarget(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(item->GetBaseItem()->item_flags.IsSet(ItemFlagHasTarget)); } SQInteger ItemGetParent(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNSAFEPTR(Scene::LocateManagedItem(item->GetBaseItem()->GetParent()), typetag_Item) } SQInteger ItemSetLink(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETCOBJECTBASEALLOWNULL(link, MItem, item_derived_types) __SQ_GETEND item->GetBaseItem()->SetParent(link ? link->GetBaseItem() : NULL); __SQ_RETURN } SQInteger ItemGetChildList(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) sq_newarray(vm, 0); ListForeachPtr(Core::Item *, i, item->GetBaseItem()->GetChildren()) { CObject::Push(vm, (void *)Scene::LocateManagedItem(i), typetag_Item); sq_arrayappend(vm, -2); } return 1; } SQInteger ItemGetScriptLogicFrequency(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNFLOAT(-1.f) } SQInteger ItemSetScriptLogicFrequency(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(fq) __SQ_GETEND // item->logic_fq = fq; __SQ_RETURN } //------------------------------------------------------------------------------ #define __SQ_GETPHYSICITEM(__I__) PhysicItem *iphysic = (__I__)->physic_item.c_ptr(); if (!iphysic) return sq_throwerror(vm, "No physics found, did you setup this item?"); SQInteger ItemGetSpeed(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNFLOAT(iphysic->GetLinearVelocity().Len()) } SQInteger ItemWake(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) iphysic->SetSleeping(false); __SQ_RETURN } SQInteger ItemSleep(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) iphysic->SetSleeping(true); __SQ_RETURN } SQInteger ItemIsSleeping(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNBOOL(iphysic->IsSleeping()) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemPhysicResetTransformation(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETVECTOR(r) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetMatrix(GS::Matrix4::TransformationMatrix(p, r, Vector4(1, 1, 1))); __SQ_RETURN } SQInteger ItemGetLinearDamping(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNFLOAT(iphysic->GetLinearDamping()) } SQInteger ItemSetLinearDamping(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(d) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetLinearDamping(d); __SQ_RETURN } SQInteger ItemSetGravityScale(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(k) __SQ_GETEND __SQ_GETPHYSICITEM(item) // item->GetPhysics()->SetGravity(item->GetScene().GetPhysics()->GetGravity() * k); __LOG_W__ << "ItemSetGravityScale(): STUB\n"; __SQ_RETURN } SQInteger ItemSetGravity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(g) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetGravity(g); __SQ_RETURN } SQInteger ItemGetGravity(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetGravity()) } SQInteger ItemGetAngularDamping(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNFLOAT(iphysic->GetAngularDamping()) } SQInteger ItemSetAngularDamping(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETFLOAT(k) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetAngularDamping(k); __SQ_RETURN } SQInteger ItemGetAngularVelocity(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetAngularVelocity()) } SQInteger ItemSetAngularVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(w) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetAngularVelocity(w); __SQ_RETURN } SQInteger ItemGetMass(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNFLOAT(item->physic_item_desc.GetMass()) } SQInteger ItemCollided(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNBOOL(false) // TODO } SQInteger ItemUpdateInertiaTensorFromCollision(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) // iphysic->SetupBody(); __LOG_E__ << "ItemUpdateInertiaTensorFromCollision::FIXME\n"; __SQ_RETURN } SQInteger ItemPhysicGetFlag(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNINT(0) } SQInteger ItemPhysicSetFlag(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(f) __SQ_GETEND __SQ_RETURN } SQInteger ItemGetPhysicMode(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNINT(item->physic_item_desc.physic_mode) } SQInteger ItemSetPhysicMode(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(m) __SQ_GETEND __SQ_GETPHYSICITEM(item) item->physic_item_desc.physic_mode = PhysicItemDesc::Mode(m); __SQ_RETURN } SQInteger ItemSetInertiaTensorAndCom(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETMATRIX3(tensor) __SQ_GETVECTOR(com) __SQ_GETEND __SQ_RETURN } SQInteger ItemPhysicSetLinearFactor(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(k) __SQ_GETEND __SQ_GETPHYSICITEM(item) item->physic_item_desc.linear_factor.Set(k); iphysic->SetLinearFactor(k); __SQ_RETURN } SQInteger ItemPhysicSetAngularFactor(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(k) __SQ_GETEND __SQ_GETPHYSICITEM(item) item->physic_item_desc.angular_factor.Set(k); iphysic->SetAngularFactor(k); __SQ_RETURN } SQInteger ItemApplyLinearForce(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(F) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->ApplyForce(F); __SQ_RETURN } SQInteger ItemApplyForce(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETVECTOR(F) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->ApplyForce(F, &p); __SQ_RETURN } SQInteger ItemApplyImpulse(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETVECTOR(J) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->ApplyImpulse(J, &p); __SQ_RETURN } SQInteger ItemApplyLinearImpulse(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(J) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->ApplyImpulse(J); __SQ_RETURN } SQInteger ItemApplyTorque(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(T) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->ApplyTorque(T); __SQ_RETURN } SQInteger ItemGetLinearAcceleration(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(Vector4(0, 0, 0)) } SQInteger ItemGetLinearVelocity(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetLinearVelocity()) } SQInteger ItemGetPreviousLinearVelocity(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetLinearVelocity()) } SQInteger ItemSetLinearVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(V) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->SetLinearVelocity(V); __SQ_RETURN } SQInteger ItemGetLocalPointVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETEND __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetLocalPointVelocity(p)) } SQInteger ItemGetWorldPointVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETEND __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetWorldPointVelocity(p)) } SQInteger ItemGetPhysicPosition(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) GS::Matrix4 m; iphysic->GetMatrix(m); __SQ_RETURNVECTOR(m.GetRow(3)) } SQInteger ItemSetPhysicPosition(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETEND __SQ_GETPHYSICITEM(item) GS::Matrix4 m; iphysic->GetMatrix(m); m.SetRow(3, p); iphysic->SetMatrix(m); __SQ_RETURN } SQInteger ItemGetPhysicPreviousPosition(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNVECTOR(Vector4(0, 0, 0)) } SQInteger ItemSetPhysicPreviousPosition(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(position) __SQ_GETEND __LOG_E__ << "OBSOLETE\n"; __SQ_RETURN } SQInteger ItemGetPhysicRotation(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) GS::Matrix4 m; iphysic->GetMatrix(m); __SQ_RETURNVECTOR(GS::Matrix3::FromMatrix4(m).AsEuler()) } SQInteger ItemSetPhysicRotation(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(r) __SQ_GETEND __SQ_GETPHYSICITEM(item) GS::Matrix4 m; iphysic->GetMatrix(m); Vector4 p, s; m.Decompose(&p, &s); iphysic->SetMatrix(GS::Matrix4::TransformationMatrix(p, r, s)); __SQ_RETURN } SQInteger ItemPhysicSynchronizeCollision(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __ERR__(__LOG_E__ << "OBSOLETE", 0) } SQInteger ItemWorldPointVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(wp) __SQ_GETEND __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetWorldPointVelocity(wp)) } SQInteger ItemPointVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(p) __SQ_GETEND __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetLocalPointVelocity(p)) } SQInteger ItemGetCenterOfMass(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_GETPHYSICITEM(item) __SQ_RETURNVECTOR(iphysic->GetCenterOfMass()) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemPhysicCharacterSetRotationMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETMATRIX3(m) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->CharacterSetRotationMatrix(m); __SQ_RETURN } SQInteger ItemPhysicCharacterSetVelocity(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETVECTOR(V) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->CharacterSetVelocity(V); __SQ_RETURN } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemPhysicVehicleSetForce(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETFLOAT(F) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->VehicleSetForce(F, index); __SQ_RETURN } SQInteger ItemPhysicVehicleSetBrake(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETFLOAT(F) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->VehicleSetBrake(F, index); __SQ_RETURN } SQInteger ItemPhysicVehicleSetSteering(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETFLOAT(v) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->VehicleSetSteering(v, index); __SQ_RETURN } SQInteger ItemPhysicVehicleSetFriction(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETFLOAT(f) __SQ_GETEND __SQ_GETPHYSICITEM(item) iphysic->VehicleSetFriction(f, index); __SQ_RETURN } SQInteger ItemPhysicVehicleGetWheelMatrix(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETEND __SQ_GETPHYSICITEM(item) __SQ_RETURNMATRIX4(iphysic->VehicleGetWheelMatrix(index)) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemGetLocalMinMax(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) MinMax mm; if (item->GetItemType() == Type_Object) { MObject *obj = (MObject *)item; if (obj->geometry.IsEmpty()) mm.Set(obj->GetMatrix().GetRow(3), obj->GetMatrix().GetRow(3)); else { if (obj->render_data.IsNull()) return sq_throwerror(vm, "Object has no render data, you need to call ObjectRenderSetup() first."); if (obj->render_data->geometry.IsNull()) return sq_throwerror(vm, "Object has no render geometry, you need to call ObjectRenderSetup() first."); mm = obj->render_data->geometry->minmax; } } __SQ_RETURNMINMAX(mm) } SQInteger ItemGetWorldMinMax(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) MinMax mm; if (item->GetItemType() == Type_Object) { MObject *obj = (MObject *)item; if (obj->geometry.IsEmpty()) mm.Set(obj->GetMatrix().GetRow(3), obj->GetMatrix().GetRow(3)); else { if (obj->render_data.IsNull()) return sq_throwerror(vm, "Object has no render data, you need to call ObjectRenderSetup() first."); if (obj->render_data->geometry.IsNull()) return sq_throwerror(vm, "Object has no render geometry, you need to call ObjectRenderSetup() first."); OBB obb(obj->render_data->geometry->minmax); obb.Transform(obj->GetMatrix()); obb.ComputeMinMax(mm); } } __SQ_RETURNMINMAX(mm) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemGetSkinBoneItemsGroup(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) if (item->GetItemType() != Type_Object) return sq_throwerror(vm, String("Item '") << item->name << "' is not an object."); MObject *o = (MObject *)item; Core::Skin *skin = o->GetSkin(); if (!skin) return sq_throwerror(vm, String("Object '") << item->name << "' has no skin."); Group *g = new Group; for (uint n = 0; n < skin->bones.GetCount(); ++n) g->Add(Scene::LocateManagedItem(skin->bones[n])); __SQ_RETURNMANAGEDSAFEPTR(g, typetag_Group) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemGetMotionCount(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNINT(item->automation_player->GetMotionList().GetCount()) } SQInteger ItemGetMotionFromIndex(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(index) __SQ_GETEND __SQ_RETURNSAFEPTR(item->automation_player->GetMotionFromIndex(index), typetag_Motion) } SQInteger ItemStopAllMotions(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) item->automation_player->DisposeAutomationSources(); __SQ_RETURN } SQInteger ItemSetMotion(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETSTRING(name) __SQ_GETFLOAT(blend) Automation::Source *source = item->automation_player->StartAutomation(new Automation::MotionSource(item->automation_player->GetMotion(name), NULL), blend, Automation::Player::SourceSet); __SQ_GETEND __SQ_RETURNSAFEPTR(source, typetag_AutomationSource) } SQInteger ItemSetMotionRelative(HSQUIRRELVM vm) { __SQ_GETSTART(2) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETBOOL(v) __SQ_GETEND item->automation_player->flags.Raise(Automation::Player::FlagRelativeMotion, asbool(v)); __SQ_RETURN } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ SQInteger ItemSetFlags(HSQUIRRELVM vm) { __SQ_GETSTART(3) __SQ_GETCOBJECTBASE(item, MItem, item_derived_types) __SQ_GETINT(flags) __SQ_GETBOOL(set_flags) __SQ_GETEND item->mitem_flags.Raise(flags, asbool(set_flags)); __SQ_RETURN } SQInteger ItemGetFlags(HSQUIRRELVM vm) { __SQ_GETSINGLE(__SQ_GETCOBJECTBASE(item, MItem, item_derived_types)) __SQ_RETURNINT(0) // item->item_flags.Get()) } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void RegisterItemBinding(HSQUIRRELVM vm) { /*# Topic: Item Type: Item Desc: The item object is the base of all scene 3d entities such as cameras, objects, lights or triggers. It stores the entity transformation and motions. Related: Scene,Camera,Object,Light,Trigger #*/ /*# Section: ItemRegistry Desc: Item registry #*/ /*# Func: ItemRegistrySetKey Proto: void:Item,string key,value Desc: Set item registry key value. #*/ sq_register(vm, ItemRegistrySetKey, "ItemRegistrySetKey", _SC(".xs.")); /*# Func: ItemRegistryGetKey Proto: value:Item,string key Desc: Get item registry key value. #*/ sq_register(vm, ItemRegistryGetKey, "ItemRegistryGetKey", _SC(".xs")); /*# Section: ItemACE Desc: ACE #*/ /*# Func: ItemSetCommandList Proto: void:Item,string command_list Desc: Set item asynchronous command list (see ACE). #*/ sq_register(vm, ItemSetCommandList, "ItemSetCommandList", _SC(".xs")); /*# Func: ItemResetCommandList Proto: void:Item Desc: Reset item asynchronous command list (see ACE). #*/ sq_register(vm, ItemResetCommandList, "ItemResetCommandList", _SC(".x")); /*# Func: ItemIsCommandListDone Proto: bool:Item Desc: Reset item asynchronous command list (see ACE). #*/ sq_register(vm, ItemIsCommandListDone, "ItemIsCommandListDone", _SC(".x")); /*# Section: ItemRender Desc: Rendering #*/ /*# Func: ItemGetMinMax Proto: MinMax:Item Desc: Return the axis aligned bounding box in world space of the item. #*/ sq_register(vm, ItemGetMinMax, "ItemGetMinMax", _SC(".x")); /*# Func: ItemGetOpacity Proto: float:Item Desc: Get item opacity. #*/ sq_register(vm, ItemGetOpacity, "ItemGetOpacity", _SC(".x")); sq_register(vm, ItemGetOpacity, "ItemGetAlpha", _SC(".x")); /*# Func: ItemSetOpacity Proto: void:Item,float opacity Desc: Set item opacity. #*/ sq_register(vm, ItemSetOpacity, "ItemSetOpacity", _SC(".xn")); sq_register(vm, ItemSetOpacity, "ItemSetAlpha", _SC(".xn")); /*# Section: ItemMotion Desc: Motion #*/ /*# Func: ItemGetMotionCount Proto: int:Item Desc: Get the number of motion in the item motion bank. #*/ sq_register(vm, ItemGetMotionCount, "ItemGetMotionCount", _SC(".x")); /*# Func: ItemGetMotionFromIndex Proto: Motion:Item,int index Desc: Get a motion from its index in the item motion bank. #*/ sq_register(vm, ItemGetMotionFromIndex, "ItemGetMotionFromIndex", _SC(".xi")); /*# Func: ItemStopAllMotions Proto: void:Item Desc: Stop all motions on this item. #*/ sq_register(vm, ItemStopAllMotions, "ItemStopAllMotions", _SC(".x")); /*# Func: ItemSetMotion Proto: AnimationSource:Item,string name,float blend Desc: Start a new motion on this item. #*/ sq_register(vm, ItemSetMotion, "ItemSetMotion", _SC(".xsn")); /*# Func: ItemSetMotionRelative Proto: void:Item,bool relative Desc: Set this item to use relative motion source. Motion started on this item will automatically be set to the correct evaluation mode (relative/absolute). #*/ sq_register(vm, ItemSetMotionRelative, "ItemSetMotionRelative", _SC(".xb")); /*# Section: ItemTransform Desc: Transformation #*/ /*# Func: TranslateItem Proto: void:Item item,Vector translation Desc: Translate an item, the translation vector is expressed in the item parent space. #*/ sq_register(vm, ItemTranslate, "TranslateItem", _SC(".xx")); /*# Func: RotateItem Proto: void:Item item,Vector rotation Desc: Rotate an item by a triplet of Euler angles stored in a vector. #*/ sq_register(vm, ItemRotate, "RotateItem", _SC(".xx")); /*# Func: ScaleItem Proto: void:Item item,Vector scale Desc: Scale an item by a triplet of scale coefficients stored in a vector. #*/ sq_register(vm, ItemScale, "ScaleItem", _SC(".xx")); /*# Func: ItemSetLinkInheritsPositionOnly Proto: void:Item,bool inherits Desc: Set the item to inherits only the position from its parent item. #*/ sq_register(vm, ItemSetLinkInheritsPositionOnly, "ItemSetLinkInheritsPositionOnly", _SC(".xb")); /*# Func: ItemGetPosition Proto: Vector:Item Desc: Get item position in parent space (world space if no parent). #*/ sq_register(vm, ItemGetPosition, "ItemGetPosition", _SC(".x")); /*# Func: ItemSetPosition Proto: void:Item,Vector position Desc: Set item position in parent space (world space if no parent). #*/ sq_register(vm, ItemSetPosition, "ItemSetPosition", _SC(".xx")); /*# Func: ItemGetScale Proto: Vector:Item Desc: Get item scale. #*/ sq_register(vm, ItemGetScale, "ItemGetScale", _SC(".x")); /*# Func: ItemSetScale Proto: void:Item,Vector scale Desc: Set item scale. #*/ sq_register(vm, ItemSetScale, "ItemSetScale", _SC(".xx")); /*# Func: ItemGetWorldPosition Proto: Vector:Item Desc: Return item position in world space. #*/ sq_register(vm, ItemGetWorldPosition, "ItemGetWorldPosition", _SC(".x")); /*# Func: ItemGetWorldRotation Proto: Vector:Item Desc: Get item rotation in world space as Euler angles (x, y, z). Example: // Get the world rotation of an item local world_rot = ItemGetWorldRotation(item) */ sq_register(vm, ItemGetWorldRotation, "ItemGetWorldRotation", _SC(".x")); /*# Func: ItemGetPreviousWorldPosition Proto: Vector:Item Desc: Return item position in world space during the previously rendered frame. #*/ sq_register(vm, ItemGetPreviousWorldPosition, "ItemGetPreviousWorldPosition", _SC(".x")); /*# Func: ItemGetRotation Proto: Vector:Item Desc: Get item rotation in Euler angles (x, y, z). #*/ sq_register(vm, ItemGetRotation, "ItemGetRotation", _SC(".x")); /*# Func: ItemSetRotation Proto: void:Item,Vector euler Desc: Set item rotation in Euler angles (x, y, z). Example: // Set the item rotation to +90 degree on the Y axis. ItemSetRotation(item, Vector(Deg(0), Deg(90), Deg(0))) #*/ sq_register(vm, ItemSetRotation, "ItemSetRotation", _SC(".xx")); /*# Func: ItemSetRotationQuaternion Proto: void:Item,Quaternion rotation Desc: Set item rotation quaternion. #*/ sq_register(vm, ItemSetRotationQuaternion, "ItemSetRotationQuaternion", _SC(".xx")); /*# Func: ItemGetPivot Proto: Vector:Item Desc: Get item pivot. #*/ sq_register(vm, ItemGetPivot, "ItemGetPivot", _SC(".x")); /*# Func: ItemSetPivot Proto: void:Item,Vector pivot Desc: Set item pivot. #*/ sq_register(vm, ItemSetPivot, "ItemSetPivot", _SC(".xx")); /*# Func: ItemComputeMatrix Proto: void:Item Desc: Compute item matrix and inverse matrix. #*/ sq_register(vm, ItemComputeMatrix, "ItemComputeMatrix", _SC(".x")); /*# Func: ItemComputeLocalMatrix Proto: void:Item Desc: Compute item local matrix. #*/ sq_register(vm, ItemComputeLocalMatrix, "ItemComputeLocalMatrix", _SC(".x")); /*# Func: ItemComputeMinMax Proto: void:Item Desc: Compute item minmax. #*/ sq_register(vm, ItemComputeMinMax, "ItemComputeMinMax", _SC(".x")); /*# Func: ItemGetParent Proto: Item:Item Desc: Get item parent item. #*/ sq_register(vm, ItemGetParent, "ItemGetParent", _SC(".x")); /*# Func: ItemSetParent Proto: void:Item,Item parent Desc: Set item parent item. #*/ sq_register(vm, ItemSetLink, "ItemSetLink", _SC(".xx")); sq_register(vm, ItemSetLink, "ItemSetParent", _SC(".xx")); /*# Func: ItemGetChildList Proto: array:Item Desc: Returns an array containing child items of this item. #*/ sq_register(vm, ItemGetChildList, "ItemGetChildList", _SC(".x")); /*# Func: ItemSetTarget Proto: void:Item,Vector world_target Desc: Set item target position in world space. #*/ sq_register(vm, ItemSetTarget, "ItemSetTarget", _SC(".xx")); /*# Func: ItemSetNoTarget Proto: void:Item Desc: Set no item target. #*/ sq_register(vm, ItemSetNoTarget, "ItemSetNoTarget", _SC(".x")); /*# Func: ItemGetTarget Proto: Vector:Item Desc: Get item target position in world space. #*/ sq_register(vm, ItemGetTarget, "ItemGetTarget", _SC(".x")); /*# Func: ItemHasTarget Proto: bool:Item Desc: Returns true if the item is set to target a specific location. #*/ sq_register(vm, ItemHasTarget, "ItemHasTarget", _SC(".x")); /*# Func: ItemGetRotationOrder Proto: RotationOrder:Item Desc: Return the item rotation order. #*/ sq_register(vm, ItemGetRotationOrder, "ItemGetRotationOrder", _SC(".x")); /*# Func: ItemSetRotationOrder Proto: void:Item,RotationOrder Desc: Set the item rotation order. #*/ sq_register(vm, ItemSetRotationOrder, "ItemSetRotationOrder", _SC(".xi")); /*# Func: ItemGetRotationMatrix Proto: Matrix3:Item Desc: Return the 3x3 item rotation matrix. #*/ sq_register(vm, ItemGetRotationMatrix, "ItemGetRotationMatrix", _SC(".x")); /*# Func: ItemSetRotationMatrix Proto: void:Item,Matrix3 rotation Desc: Set the 3x3 item rotation matrix. #*/ sq_register(vm, ItemSetRotationMatrix, "ItemSetRotationMatrix", _SC(".xx")); /*# Func: ItemGetMatrix Proto: Matrix4:Item Desc: Return the 4x4 item transformation matrix in world space. #*/ sq_register(vm, ItemGetMatrix, "ItemGetMatrix", _SC(".x")); /*# Func: ItemGetInverseMatrix Proto: Matrix4:Item Desc: Return the inverse 4x4 item transformation matrix. #*/ sq_register(vm, ItemGetInverseMatrix, "ItemGetInverseMatrix", _SC(".x")); /*# Func: ItemGetLocalMatrix Proto: Matrix4:Item Desc: Return the 4x4 item transformation matrix in parent space. #*/ sq_register(vm, ItemGetLocalMatrix, "ItemGetLocalMatrix", _SC(".x")); /*# Func: ItemSetMatrix Proto: void:Item,Matrix4 Desc: Set the 4x4 item transformation matrix. #*/ sq_register(vm, ItemSetMatrix, "ItemSetMatrix", _SC(".xx")); /*# Func: ItemRecordLocation Proto: void:Item Desc: Record item start location, item is set back to this location when reseted. #*/ sq_register(vm, ItemRecordLocation, "ItemRecordLocation", _SC(".x")); /*# Func: ItemSnapshotTransformation Proto: void:Item Desc: Snapshot current item transformation matrix to the current orientation method. #*/ sq_register(vm, ItemSnapshotTransformation, "ItemSnapshotTransformation", _SC(".x")); /*# Func: ItemSnapshotMatrix Proto: void:Item,Matrix4 Desc: Snapshot matrix as item transformation. #*/ sq_register(vm, ItemSnapshotMatrix, "ItemSnapshotMatrix", _SC(".xx")); /*# Func: ItemGetLocalMinMax Proto: MinMax:Item Desc: Return an item bounding box in local space. #*/ sq_register(vm, ItemGetLocalMinMax, "ItemGetLocalMinMax", _SC(".x")); /*# Func: ItemGetWorldMinMax Proto: MinMax:Item Desc: Return an item bounding box in world space. #*/ sq_register(vm, ItemGetWorldMinMax, "ItemGetWorldMinMax", _SC(".x")); /*# Section: ItemCast Desc: Type cast #*/ /*# Func: ItemCastToObject Proto: Object:Item Desc: Cast item to object. #*/ sq_register(vm, ItemCastToObject, "ItemCastToObject", _SC(".x")); /*# Func: ItemCastToCamera Proto: Camera:Item Desc: Cast item to camera. #*/ sq_register(vm, ItemCastToCamera, "ItemCastToCamera", _SC(".x")); /*# Func: ItemCastToTrigger Proto: Trigger:Item Desc: Cast item to trigger. #*/ sq_register(vm, ItemCastToTrigger, "ItemCastToTrigger", _SC(".x")); /*# Func: ItemCastToLight Proto: Light:Item Desc: Cast item to light. Example: local light = ItemCastToLight(item) LightSetRange(light, Mtr(20)) #*/ sq_register(vm, ItemCastToLight, "ItemCastToLight", _SC(".x")); /*# Func: ItemCastToInstance Proto: Instance:Item Desc: Cast item to instance. #*/ sq_register(vm, ItemCastToInstance, "ItemCastToInstance", _SC(".x")); /*# Func: ItemCastToEmitter Proto: Emitter:Item Desc: Cast item to emitter. #*/ sq_register(vm, ItemCastToEmitter, "ItemCastToEmitter", _SC(".x")); /*# Func: ItemDerivedCastToItem Proto: Item:ItemDerived Desc: Cast an item derived object (camera, object, light, trigger) to an item. #*/ sq_register(vm, ItemDerivedCastToItem, "ItemDerivedCastToItem", _SC(".x")); /*# Section: ItemState Desc: State #*/ /*# Func: ItemIsInvisible Proto: bool:Item Desc: Return the visibility state of the item. #*/ sq_register(vm, ItemIsInvisible, "ItemIsInvisible", _SC(".x")); /*# Func: ItemSetInvisible Proto: void:Item,bool invisible Desc: Set item display flag, item is still updated but not displayed anymore. #*/ sq_register(vm, ItemSetInvisible, "ItemSetInvisible", _SC(".xb")); /*# Func: ItemHierarchySetInvisible Proto: void:Item,bool Desc: Set item and children display flag, item and children are still updated but not displayed anymore. #*/ sq_register(vm, ItemHierarchySetInvisible, "ItemHierarchySetInvisible", _SC(".xb")); /*# Func: ItemIsActive Proto: bool:Item Desc: Return true if the given item is active, false otherwise. #*/ sq_register(vm, ItemIsActive, "ItemIsActive", _SC(".x")); /*# Section: Item Desc: General #*/ /*# Func: ItemReset Proto: void:Item Desc: Reset an item, effectively calling its OnReset script callbacks and resetting its physic state to the current item transformation. #*/ sq_register(vm, ItemReset, "ItemReset", _SC(".x")); /*# Func: ItemRenderSetup Proto: void:Item,ResourceFactory Desc: Setup the resources required to render an item. #*/ sq_register(vm, ItemRenderSetup, "ItemRenderSetup", _SC(".xx")); /*# Func: ItemSetup Proto: void:Item Desc: Setup an item. Deprecated: SceneSetupItem #*/ ; /*# Func: ItemGetType Proto: ItemType:Item Desc: Return the item type (camera, light, object, trigger, etc...). #*/ sq_register(vm, ItemGetType, "ItemGetType", _SC(".x")); /*# Func: ItemCompare Proto: bool:Item,Item Desc: Compare two items, returns true is both items are the same object. #*/ sq_register(vm, ItemCompare, "ItemCompare", _SC(".xx")); /*# Func: ItemGetGeometry Proto: Geometry:Item Desc: Get item geometry, an item may have no geometry. See: ObjectIsValid #*/ sq_register(vm, ItemGetGeometry, "ItemGetGeometry", _SC(".x")); /*# Func: ItemSaveGeometry Proto: void:Item, path Desc:save the item geometry into the path. #*/ sq_register(vm, ItemSaveGeometry, "ItemSaveGeometry", _SC(".xsx")); /*# Func: ItemSetPriority Proto: void:Item,float priority Desc: Set an item priority. #*/ sq_register(vm, ItemSetPriority, "ItemSetPriority", _SC(".xn")); /*# Func: ItemGetChild Proto: Item:Item,string name Desc: Get an item child from its name. Example: local hand = ItemGetChild(arm_item, "hand") #*/ sq_register(vm, ItemGetChild, "ItemGetChild", _SC(".xs")); /*# Func: ItemGetName Proto: string:Item Desc: Get item name. #*/ sq_register(vm, ItemGetName, "ItemGetName", _SC(".x")); /*# Func: ItemSetName Proto: void:Item,string Desc: Set item name. #*/ sq_register(vm, ItemSetName, "ItemSetName", _SC(".xs")); /*# Func: ItemGetFlags Proto: ItemFlag:Item Desc: Get item flags. #*/ sq_register(vm, ItemGetFlags, "ItemGetFlags", _SC(".x")); /*# Func: ItemSetFlags Proto: void:Item,ItemFlag flag,bool set Desc: Set or remove one or several item flags. #*/ sq_register(vm, ItemSetFlags, "ItemSetFlags", _SC(".xib")); /*# Section: ItemSkin Desc: Skinning #*/ /*# Func: ItemGetSkinBoneItemsGroup Proto: Group:Item Desc: Return the item skin bone items as an item group. See: GroupGetRootItem, GroupGetItemList #*/ sq_register(vm, ItemGetSkinBoneItemsGroup, "ItemGetSkinBoneItemsGroup", _SC(".x")); /*# Section: ItemPhysicState Desc: Physic state #*/ /*# Func: ItemWake Proto: void:Item Desc: Wake a physic item, all collision and physic evaluation will resume. #*/ sq_register(vm, ItemWake, "ItemWake", _SC(".x")); /*# Func: ItemSleep Proto: void:Item Desc: Put a physic item to sleep, all collision and physic evaluation will stop. #*/ sq_register(vm, ItemSleep, "ItemSleep", _SC(".x")); /*# Func: ItemIsSleeping Proto: bool:Item Desc: Returns true if the item is sleeping, false otherwise. #*/ sq_register(vm, ItemIsSleeping, "ItemIsSleeping", _SC(".x")); /*# Func: ItemPhysicGetFlag Proto: PhysicFlag:Item Desc: Get item physic flag. #*/ sq_register(vm, ItemPhysicGetFlag, "ItemPhysicGetFlag", _SC(".x")); /*# Func: ItemPhysicSetFlag Proto: void:Item,PhysicFlag Desc: Set item physic flag. #*/ sq_register(vm, ItemPhysicSetFlag, "ItemPhysicSetFlag", _SC(".xi")); /*# Section: ItemCharacterPhysic Desc: Character Physic #*/ /*# Func: ItemPhysicCharacterSetRotationMatrix Proto: void:Item,Matrix3 m Desc: Set physics character rotation matrix. #*/ sq_register(vm, ItemPhysicCharacterSetRotationMatrix, "ItemPhysicCharacterSetRotationMatrix", _SC(".xx")); /*# Func: ItemPhysicCharacterSetVelocity Proto: void:Item,Vector V Desc: Set physics character controller velocity. #*/ sq_register(vm, ItemPhysicCharacterSetVelocity, "ItemPhysicCharacterSetVelocity", _SC(".xx")); /*# Section: ItemVehiclePhysic Desc: Vehicle Physic #*/ /*# Func: ItemPhysicVehicleSetForce Proto: void:Item,int wheel_index,float F Desc: Set engine force F for a specific wheel in the vehicle model. #*/ sq_register(vm, ItemPhysicVehicleSetForce, "ItemPhysicVehicleSetForce", _SC(".xin")); /*# Func: ItemPhysicVehicleSetBrake Proto: void:Item,int wheel_index,float F Desc: Set brake force F for a specific wheel in the vehicle model. #*/ sq_register(vm, ItemPhysicVehicleSetBrake, "ItemPhysicVehicleSetBrake", _SC(".xin")); /*# Func: ItemPhysicVehicleSetSteering Proto: void:Item,int wheel_index,float angle Desc: Set steering on a specific wheel of the vehicle model. #*/ sq_register(vm, ItemPhysicVehicleSetSteering, "ItemPhysicVehicleSetSteering", _SC(".xin")); /*# Func: ItemPhysicVehicleSetFriction Proto: void:Item,int wheel_index,float friction_slip Desc: Set friction on a specific wheel of the vehicle model. #*/ sq_register(vm, ItemPhysicVehicleSetFriction, "ItemPhysicVehicleSetFriction", _SC(".xin")); /*# Func: ItemPhysicVehicleGetWheelMatrix Proto: Matrix4:Item,int wheel_index Desc: Get a specific wheel matrix from the vehicle model. #*/ sq_register(vm, ItemPhysicVehicleGetWheelMatrix, "ItemPhysicVehicleGetWheelMatrix", _SC(".xi")); /*# Section: ItemPhysic Desc: Physic #*/ /*# Func: ItemSetInertiaTensorAndCom Proto: void:Item,Matrix3 tensor,Vector center_of_mass Desc: Manually set the item inertia tensor and center of mass. See: ItemUpdateInertiaTensorFromCollision #*/ sq_register(vm, ItemSetInertiaTensorAndCom, "ItemSetInertiaTensorAndCom", _SC(".xxx")); /*# Func: ItemUpdateInertiaTensorFromCollision Proto: void:Item Desc: Compute item inertia tensor and center of mass from the associated collision shape description. #*/ sq_register(vm, ItemUpdateInertiaTensorFromCollision, "ItemUpdateInertiaTensorFromCollision", _SC(".x")); /*# Func: ItemGetSpeed Proto: float:Item Desc: Get item center of mass speed (in m.s). Note: This is the equivalent of ItemGetLinearVelocity(item).Len() See: ItemPointVelocity, ItemWorldPointVelocity #*/ sq_register(vm, ItemGetSpeed, "ItemGetSpeed", _SC(".x")); /*# Func: ItemApplyLinearForce Proto: void:Item,Vector force Desc: Apply a force to the item center of mass. Rotation is not affected. #*/ sq_register(vm, ItemApplyLinearForce, "ItemApplyLinearForce", _SC(".xx")); /*# Func: ItemApplyForce Proto: void:Item,Vector position,Vector force Desc: Apply a force at a specific position in world space to the item. Example: // Apply thrust to a ship item, the reactor item is parented to the ship item. local reactor_matrix = ItemGetMatrix(reactor_item) // Get the reactor position and the vector pointing toward its back (and the back of the ship). local reactor_world_position = reactor_matrix.GetPosition() local reactor_back_vector = reactor_matrix.GetBack() // Apply thrust to the ship at the position of the reactor and in the correct direction. local thrust_strength = 10.0 // the thrust strength ItemApplyForce(ship_item, reactor_world_position, reactor_back_vector * thrust_strength) #*/ sq_register(vm, ItemApplyForce, "ItemApplyForce", _SC(".xxx")); /*# Func: ItemApplyLinearImpulse Proto: void:Item,Vector impulse Desc: Apply an impulse to the item center of mass. Rotation is not affected. An impulse is an immediate change of velocity. It is expressed as the difference between the target velocity and the current velocity. See: ItemApplyImpulse Example: // Retrieve the current item linear velocity. local current_v = ItemGetLinearVelocity(item) // Compute the impulse to force the item velocity to {1, 0, 0}. local J = Vector(1, 0, 0) - current_v // Force the item linear velocity to {1, 0, 0} ItemApplyImpulse(item, J) #*/ sq_register(vm, ItemApplyLinearImpulse, "ItemApplyLinearImpulse", _SC(".xx")); /*# Func: ItemApplyImpulse Proto: void:Item,Vector position,Vector impulse Desc: Apply an impulse at a specific position in world space to the item. See: ItemApplyLinearImpulse #*/ sq_register(vm, ItemApplyImpulse, "ItemApplyImpulse", _SC(".xxx")); /*# Func: ItemApplyTorque Proto: void:Item,Vector torque Desc: Apply a torque to the item. The torque is the rotational equivalent of the force. It will increase the body angular velocity which will in turn rotate it. #*/ sq_register(vm, ItemApplyTorque, "ItemApplyTorque", _SC(".xx")); /*# Func: ItemPhysicSetLinearFactor Proto: void:Item,Vector factor Desc: Set the scale factor for all forces applied to this item linear velocity. All forces applied directly and indirectly to this item will be scaled by this factor. Example: // Restrict all motions to the XY plane by canceling out all forces Z component. ItemPhysicSetLinearFactor(item, Vector(1, 1, 0)) #*/ sq_register(vm, ItemPhysicSetLinearFactor, "ItemPhysicSetLinearFactor", _SC(".xx")); /*# Func: ItemPhysicSetAngularFactor Proto: void:Item,Vector factor Desc: Set the scale factor for all forces applied to this item angular velocity. All torques applied directly and indirectly to this item will be scaled by this factor. Example: // Restrict all rotations to the Z axis by canceling out all torques on the X and Y axises. ItemPhysicSetangularFactor(item, Vector(0, 0, 1)) #*/ sq_register(vm, ItemPhysicSetAngularFactor, "ItemPhysicSetAngularFactor", _SC(".xx")); /*# Func: ItemPhysicResetTransformation Proto: void:Item,Vector position,Vector euler Desc: Reset item physic transformation to specific location (in item local space). #*/ sq_register(vm, ItemPhysicResetTransformation, "ItemPhysicResetTransformation", _SC(".xxx")); /*# Func: ItemGetLinearDamping Proto: float:Item Desc: Get item linear damping. #*/ sq_register(vm, ItemGetLinearDamping, "ItemGetLinearDamping", _SC(".x")); /*# Func: ItemSetLinearDamping Proto: void:Item,float damping Desc: Set item linear damping by which the item linear velocity is scaled after each solver iteration.
A damping value of 1 will not affect velocity, a damping of 0 will completely cancel velocity and a damping of 0.5 will make the object appear as if moving through a thick invisible material.
Note: A small amount of damping (0.99) can help the solver as it prevents sudden change and oscillation in velocity.
Too much damping can prevent the solver from reaching a stable configuration. #*/ sq_register(vm, ItemSetLinearDamping, "ItemSetLinearDamping", _SC(".xn")); /*# Func: ItemGetAngularDamping Proto: float:Item Desc: Get item angular damping. #*/ sq_register(vm, ItemGetAngularDamping, "ItemGetAngularDamping", _SC(".x")); /*# Func: ItemSetAngularDamping Proto: void:Item,float damping Desc: Set item angular damping. This is the rotational equivalent of the linear damping. See: ItemSetLinearDamping #*/ sq_register(vm, ItemSetAngularDamping, "ItemSetAngularDamping", _SC(".xn")); /*# Func: ItemGetAngularVelocity Proto: Vector:Item Desc: Get item angular velocity (rad.s). The angular velocity is the rate of change in rotation over time. Note: The angular velocity only affects rotation, position is affected by the linear velocity. See: ItemGetLinearVelocity #*/ sq_register(vm, ItemGetAngularVelocity, "ItemGetAngularVelocity", _SC(".x")); /*# Func: ItemSetAngularVelocity Proto: void:Item,Vector angular_velocity Desc: Set item angular velocity (rad.s). Note: This function sets the item angular velocity by bypassing the physics solver. This can lead to all sorts of problems depending on the scene configuration. You are advised to perform such change using an impulse instead. See: ItemApplyAngularImpulse #*/ sq_register(vm, ItemSetAngularVelocity, "ItemSetAngularVelocity", _SC(".xx")); /*# Func: ItemGetPhysicMode Proto: PhysicMode:Item Desc: Get the current item physic mode. #*/ sq_register(vm, ItemGetPhysicMode, "ItemGetPhysicMode", _SC(".x")); /*# Func: ItemSetPhysicMode Proto: void:Item,PhysicMode mode Desc: Set item physic mode. #*/ sq_register(vm, ItemSetPhysicMode, "ItemSetPhysicMode", _SC(".xi")); /*# Func: ItemCollided Proto: bool:Item Desc: Returns true if the item collided during the last physic step, false otherwise. #*/ sq_register(vm, ItemCollided, "ItemCollided", _SC(".x")); /*# Func: ItemGetLinearAcceleration Proto: Vector:Item Desc: Get item linear acceleration (m.s²). Acceleration is the rate of change in speed over time. #*/ sq_register(vm, ItemGetLinearAcceleration, "ItemGetLinearAcceleration", _SC(".x")); /*# Func: ItemGetMass Proto: float:Item Desc: Get item mass (in Kg). #*/ sq_register(vm, ItemGetMass, "ItemGetMass", _SC(".x")); /*# Func: ItemGetCenterOfMass Proto: Vector:Item Desc: Get item center of mass position in item space. #*/ sq_register(vm, ItemGetCenterOfMass, "ItemGetCenterOfMass", _SC(".x")); /*# Func: ItemGetLocalPointVelocity Proto: Vector:Item Desc: Get an item local point velocity (m.s) in world space. #*/ sq_register(vm, ItemGetLocalPointVelocity, "ItemGetLocalPointVelocity", _SC(".x")); /*# Func: ItemGetWorldPointVelocity Proto: Vector:Item Desc: Get an item world point velocity (m.s) in world space. #*/ sq_register(vm, ItemGetWorldPointVelocity, "ItemGetWorldPointVelocity", _SC(".x")); /*# Func: ItemGetLinearVelocity Proto: Vector:Item Desc: Get the item linear velocity (m.s). Velocity is the rate of change of position over time. Note: The linear velocity only affects position, rotation is affected by the angular velocity. See: ItemGetLinearAcceleration, ItemGetAngularVelocity #*/ sq_register(vm, ItemGetLinearVelocity, "ItemGetLinearVelocity", _SC(".x")); /*# Func: ItemGetPreviousLinearVelocity Proto: Vector:Item Desc: Get item previous linear velocity (m.s). #*/ sq_register(vm, ItemGetPreviousLinearVelocity, "ItemGetPreviousLinearVelocity", _SC(".x")); /*# Func: ItemSetLinearVelocity Proto: void:Item,Vector linear_velocity Desc: Set item linear velocity (m.s). Note: This function sets the item linear velocity by bypassing the physics solver. This can lead to all sorts of problems depending on the scene configuration. You are advised to perform such change using an impulse instead. See: ItemApplyLinearImpulse #*/ sq_register(vm, ItemSetLinearVelocity, "ItemSetLinearVelocity", _SC(".xx")); /*# Func: ItemSetGravityScale Proto: void:Item,float scale Desc: Set item gravity scale (g = world_gravity * scale). #*/ sq_register(vm, ItemSetGravityScale, "ItemSetGravityScale", _SC(".xn")); /*# Func: ItemSetGravity Proto: void:Item,Vector g Desc: Set item gravity (in m.s²). Example: ItemSetGravity(item, Vector(0.0, -9.8, 0.0)) // Earth gravity. #*/ sq_register(vm, ItemSetGravity, "ItemSetGravity", _SC(".xx")); /*# Func: ItemGetGravity Proto: Vector:Item Desc: Get item gravity (m.s²). #*/ sq_register(vm, ItemGetGravity, "ItemGetGravity", _SC(".x")); /*# Func: ItemWorldPointVelocity Proto: void:Item,Vector world_position Desc: Compute the velocity of an item particle, particle position is in world space (in m.s). #*/ sq_register(vm, ItemWorldPointVelocity, "ItemWorldPointVelocity", _SC(".xx")); /*# Func: ItemPointVelocity Proto: void:Item,Vector local_position Desc: Compute the velocity of an item particle, particle position is in item space (in m.s). #*/ sq_register(vm, ItemPointVelocity, "ItemPointVelocity", _SC(".xx")); /*# Section: ItemPhysicHack Desc: Physic hacking #*/ /*# Func: ItemGetPhysicPosition Proto: Vector:Item Desc: Get item physic position. #*/ sq_register(vm, ItemGetPhysicPosition, "ItemGetPhysicPosition", _SC(".x")); /*# Func: ItemSetPhysicPosition Proto: void:Item,Vector position Desc: Set item physic position. Note: Tampering with the internal physic state is likely to cause troubles, use with extreme care! #*/ sq_register(vm, ItemSetPhysicPosition, "ItemSetPhysicPosition", _SC(".xx")); /*# Func: ItemGetPhysicPreviousPosition Proto: Vector:Item Desc: Get item physic previous position. #*/ sq_register(vm, ItemGetPhysicPreviousPosition, "ItemGetPhysicPreviousPosition", _SC(".x")); /*# Func: ItemGetPhysicRotation Proto: Vector:Item Desc: Get item physic rotation. #*/ sq_register(vm, ItemGetPhysicRotation, "ItemGetPhysicRotation", _SC(".x")); /*# Func: ItemSetPhysicRotation Proto: void:Item,Vector euler Desc: Set item physic rotation. Note: Tampering with the internal physic state is likely to cause troubles, use with extreme care! #*/ sq_register(vm, ItemSetPhysicRotation, "ItemSetPhysicRotation", _SC(".xx")); /*# Func: ItemPhysicSynchronizeCollision Proto: void:Item Desc: Synchronize the collision interface to the physic interface. #*/ sq_register(vm, ItemPhysicSynchronizeCollision, "ItemPhysicSynchronizeCollision", _SC(".x")); /*# Section: ItemScript Desc: Script #*/ /*# Func: ItemSetScript Proto: void:Item,String file,String class Desc: Set item script file and class to instantiate for the item first script unit. #*/ sq_register(vm, ItemSetScript, "ItemSetScript", _SC(".xss")); /*# Func: ItemSetupScript Proto: void:Item Desc: Setup item script. #*/ sq_register(vm, ItemSetupScript, "ItemSetupScript", _SC(".x")); /*# Func: ItemGetScriptInstance Proto: instance:Item Desc: Get an item script instance on its first script unit. See: ItemGetScriptInstanceFromClass Example: local enemy_item = SceneFindItem(g_scene, "an_enemy") local enemy = ItemGetScriptInstance(enemy_item) // Instance can be used to call the script assigned to the item. enemy->TakeHit(20) #*/ sq_register(vm, ItemGetScriptInstance, "ItemGetScriptInstance", _SC(".x")); /*# Func: ItemGetScriptInstanceCount Proto: int:Item Desc: Get the number of script instance available on an item. #*/ sq_register(vm, ItemGetScriptInstanceCount, "ItemGetScriptInstanceCount", _SC(".x")); /*# Func: ItemGetScriptInstanceFromIndex Proto: instance:Item,int index Desc: Get an item script instance from its index. See: ItemGetScriptInstanceFromClass #*/ sq_register(vm, ItemGetScriptInstanceFromIndex, "ItemGetScriptInstanceFromIndex", _SC(".xi")); /*# Func: ItemGetScriptInstanceFromClass Proto: instance:Item,string class_name Desc: Get an item script instance from the name of the class it instantiates. Example: local enemy_item = SceneFindItem(g_scene, "an_enemy") local ai = ItemGetScriptInstanceFromClass(item, "AIComponent") // Instance can be used to call the AIComponent instance assigned to the enemy item. ai->Flee() #*/ sq_register(vm, ItemGetScriptInstanceFromClass, "ItemGetScriptInstanceFromClass", _SC(".xs")); #if 1 sq_register(vm, ItemSetPhysicPreviousPosition, "ItemSetPhysicPreviousPosition", _SC(".xx")); #endif /*# Func: ItemHasScript Proto: bool:Item,string class_name Desc: Test if a specific script is assigned to an item. The script is identified by its class name. Example: // Will return true if this script is instantiated for this item. local has_some_component = ItemHasScript(item, "AComponentClass") #*/ sq_register(vm, ItemHasScript, "ItemHasScript", _SC(".xs")); /*# Section: ItemDebug Desc: Debug #*/ /*# Func: ItemPrint Proto: void:Item Desc: Print item instance address in memory. #*/ sq_register(vm, ItemPrint, "ItemPrint", _SC(".x")); /*# Enum: PhysicMode Values: PhysicModeNone,PhysicModeStatic,PhysicModeDynamic,PhysicModeKinematic #*/ sq_pushstring(vm, "PhysicModeNone", -1); sq_pushinteger(vm, PhysicItemDesc::Mode_None); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicModeStatic", -1); sq_pushinteger(vm, PhysicItemDesc::Mode_Static); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicModeDynamic", -1); sq_pushinteger(vm, PhysicItemDesc::Mode_Dynamic); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicModeKinematic", -1); sq_pushinteger(vm, PhysicItemDesc::Mode_Kinematic); sq_newslot(vm, -3, true); #if 1 sq_pushstring(vm, "PhysicModeRigidBody", -1); sq_pushinteger(vm, PhysicItemDesc::Mode_Dynamic); sq_newslot(vm, -3, true); sq_pushstring(vm, "OrientationEuler", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "OrientationMatrix", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "OrientationQuaternion", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "OrientationExternal", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); #endif /*# Enum: PhysicFlag Values: PhysicFlagNone,PhysicFlagNoGravity,PhysicFlagNoForceField,PhysicFlagMobile,PhysicFlagGhost #*/ sq_pushstring(vm, "PhysicFlagNone", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicFlagNoGravity", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicFlagNoForceField", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicFlagMobile", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); sq_pushstring(vm, "PhysicFlagGhost", -1); sq_pushinteger(vm, 0); sq_newslot(vm, -3, true); /*# Enum: RotationOrder Values: RotationOrderDefault,RotationOrderZYX,RotationOrderYZX,RotationOrderZXY,RotationOrderXZY,RotationOrderYXZ,RotationOrderXYZ,RotationOrderXY #*/ sq_pushstring(vm, "RotationOrderDefault", -1); sq_pushinteger(vm, Math::rOrder_Default); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderZYX", -1); sq_pushinteger(vm, Math::rOrder_ZYX); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderYZX", -1); sq_pushinteger(vm, Math::rOrder_YZX); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderZXY", -1); sq_pushinteger(vm, Math::rOrder_ZXY); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderXZY", -1); sq_pushinteger(vm, Math::rOrder_XZY); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderYXZ", -1); sq_pushinteger(vm, Math::rOrder_YXZ); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderXYZ", -1); sq_pushinteger(vm, Math::rOrder_XYZ); sq_newslot(vm, -3, true); sq_pushstring(vm, "RotationOrderXY", -1); sq_pushinteger(vm, Math::rOrder_XY); sq_newslot(vm, -3, true); /*# Enum: ItemType Values: ItemTypeNone,ItemTypeCamera,ItemTypeObject,ItemTypeLight,ItemTypeTrigger,ItemTypeEmitter,ItemTypeInstance #*/ sq_pushstring(vm, "ItemTypeNone", -1); sq_pushinteger(vm, Type_None); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeCamera", -1); sq_pushinteger(vm, Type_Camera); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeObject", -1); sq_pushinteger(vm, Type_Object); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeLight", -1); sq_pushinteger(vm, Type_Light); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeTrigger", -1); sq_pushinteger(vm, Type_Trigger); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeEmitter", -1); sq_pushinteger(vm, Type_Emitter); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemTypeInstance", -1); sq_pushinteger(vm, Type_Instance); sq_newslot(vm, -3, true); /*# Enum: ItemFlag Values: ItemFlagNone,ItemFlagBillboard,ItemFlagSolveOverlap #*/ sq_pushstring(vm, "ItemFlagNone", -1); sq_pushinteger(vm, MItem::Flag_None); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemFlagBillboard", -1); sq_pushinteger(vm, MItem::Flag_Billboard); sq_newslot(vm, -3, true); sq_pushstring(vm, "ItemFlagSolveOverlap", -1); sq_pushinteger(vm, MItem::Flag_SolveOverlap); sq_newslot(vm, -3, true); sq_pushstring(vm, "NullGeometry", -1); CObject::Push(vm, NULL, typetag_Geometry); sq_newslot(vm, -3, true); } //------------------------------------------------------------------------------