494 lines
16 KiB
C++
494 lines
16 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "script_squirrel/legacy/binding_helpers.h"
|
|
#include "project/project.h"
|
|
#include "scene3d/scene.h"
|
|
#include "ui/ui_camera.h"
|
|
#include "ui/ui.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::Core;
|
|
using namespace GS::Script;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectGetClock(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
__SQ_RETURNSAFEPTR(project->clock.c_ptr(), typetag_Clock)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectSetAll2DLayerOffset(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(3)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETFLOAT(x)
|
|
__SQ_GETFLOAT(y)
|
|
__SQ_GETEND
|
|
|
|
ListForeachPtr(ProjectLayer *, layer, project->layer_list)
|
|
if (layer->inst)
|
|
if (S2D::Scene *scene = layer->inst->instance_2d)
|
|
{
|
|
scene->offset_matrix = Matrix3::IdentityMatrix();
|
|
scene->offset_matrix.m[0][2] = x / scene->GetCurrentCamera()->resolution.x;
|
|
scene->offset_matrix.m[1][2] = y / scene->GetCurrentCamera()->resolution.y;
|
|
}
|
|
|
|
__SQ_RETURN
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectLayerGetScene(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(layer, ProjectLayer, typetag_ProjectLayer)
|
|
if (!layer->inst)
|
|
return sq_throwerror(vm, "No scene in project layer");
|
|
__SQ_RETURNSAFEPTR(layer->inst, typetag_ProjectScene)
|
|
}
|
|
SQInteger ProjectLayerSetZOrder(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(layer, ProjectLayer, typetag_ProjectLayer)
|
|
__SQ_GETFLOAT(zorder)
|
|
__SQ_GETEND
|
|
layer->zorder = zorder;
|
|
__SQ_RETURN
|
|
}
|
|
SQInteger ProjectLayerGetZOrder(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(layer, ProjectLayer, typetag_ProjectLayer)
|
|
__SQ_RETURNFLOAT(layer->zorder)
|
|
}
|
|
SQInteger ProjectAddLayer(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(3)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSAFEPTR(instance, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_GETFLOAT(zorder)
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(project->AddLayer(instance, zorder), typetag_ProjectLayer)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectNewScene3D(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
__SQ_RETURNMANAGEDSAFEPTR(project->Instantiate(new S3D::Scene(project->vm)), typetag_ProjectScene)
|
|
}
|
|
SQInteger ProjectNewScene2D(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
__SQ_RETURNMANAGEDSAFEPTR(project->Instantiate(new S2D::Scene(project->vm)), typetag_ProjectScene)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectGetSceneLayerList(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_GETEND
|
|
|
|
sq_newarray(vm, 0);
|
|
for (uint n = 0; n < project->layer_list.GetCount(); ++n)
|
|
{
|
|
ProjectLayer *layer = project->layer_list[n];
|
|
if (layer->inst == scene)
|
|
{
|
|
CObject::Push(vm, (void *)layer, typetag_ProjectLayer);
|
|
sq_arrayappend(vm, -2);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
SQInteger ProjectInstantiateScene(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(path)
|
|
sq_collectgarbage(vm);
|
|
ProjectSceneInstance *project_scene = project->Instantiate(path);
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(project_scene, typetag_ProjectScene)
|
|
}
|
|
SQInteger ProjectSceneIsActive(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_GETEND
|
|
__SQ_RETURNBOOL(project && scene ? project->IsActive(*scene) : false)
|
|
}
|
|
SQInteger ProjectSceneActivate(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(3)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_GETBOOL(active)
|
|
__SQ_GETEND
|
|
project->Activate(*scene, active ? true : false);
|
|
__SQ_RETURN
|
|
}
|
|
SQInteger ProjectUnloadScene(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_GETEND
|
|
project->Delete(scene);
|
|
__SQ_RETURN
|
|
}
|
|
SQInteger ProjectFindScene(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(path)
|
|
ProjectSceneInstance *inst = project->FindSceneInstance(path);
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(inst, typetag_ProjectScene)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectSceneGetType(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
__SQ_RETURNINT(scene->GetType())
|
|
}
|
|
SQInteger ProjectSceneGetInstance(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
|
|
switch (scene->GetType())
|
|
{
|
|
case ProjectSceneInstance::Type_Scene2d:
|
|
__SQ_RETURNSAFEPTR(scene->instance_2d, typetag_Scene2d)
|
|
case ProjectSceneInstance::Type_Scene3d:
|
|
__SQ_RETURNSAFEPTR(scene->instance_3d, typetag_Scene3d)
|
|
|
|
default: break;
|
|
}
|
|
return sq_throwerror(vm, "Invalid project scene");
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectGetFileName(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
__SQ_RETURNSTRING(project->name.CutFilePath().toUtf8())
|
|
}
|
|
SQInteger ProjectGetFilePath(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
__SQ_RETURNSTRING(project->name.CutFileName().toUtf8())
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectSceneSetGlobal(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(scene, ProjectSceneInstance, typetag_ProjectScene)
|
|
if (scene && (scene->GetType() == ProjectSceneInstance::Type_Scene3d))
|
|
scene->instance_3d->SetAsScriptGlobalScene();
|
|
__SQ_RETURN
|
|
}
|
|
SQInteger ProjectGetScriptInstance(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
if (!project)
|
|
return sq_suspendvm(vm);
|
|
if (!project->script_unit->Self())
|
|
return sq_throwerror(vm, "No script assigned to this project.");
|
|
__SQ_RETURNOBJECT(((Script::SquirrelObject *)project->script_unit->Self())->object);
|
|
}
|
|
SQInteger ProjectEnd(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSINGLESAFEPTR(project, Project, typetag_Project)
|
|
if (project)
|
|
project->flags.Set(Project::ProjectFlagEnd);
|
|
// exit(0);
|
|
__SQ_RETURN
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
SQInteger ProjectLoadFont(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(path)
|
|
FontEx *font = project->font_cache->LoadFont(path);
|
|
if (!font)
|
|
return sq_throwerror(vm, String::Format("Failed to load font '%s'.", path));
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(font, typetag_Font)
|
|
}
|
|
SQInteger ProjectLoadFontAliased(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(3)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(path)
|
|
__SQ_GETSTRING(alias)
|
|
FontEx *font = project->font_cache->LoadFont(path, alias);
|
|
if (!font)
|
|
return sq_throwerror(vm, String::Format("Failed to load font '%s' under alias '%s'.", path, alias));
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(font, typetag_Font)
|
|
}
|
|
SQInteger ProjectDeleteFontAlias(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(alias)
|
|
project->font_cache->DeleteAlias(alias);
|
|
__SQ_GETEND
|
|
__SQ_RETURN
|
|
}
|
|
SQInteger ProjectGetFont(HSQUIRRELVM vm)
|
|
{
|
|
__SQ_GETSTART(2)
|
|
__SQ_GETSAFEPTR(project, Project, typetag_Project)
|
|
__SQ_GETSTRING(path)
|
|
FontEx *font = project->font_cache->GetAliasedFont(path);
|
|
if (!font)
|
|
return sq_throwerror(vm, String::Format("Font '%s' not found.", path));
|
|
__SQ_GETEND
|
|
__SQ_RETURNSAFEPTR(font, typetag_Font)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void RegisterProjectBinding(HSQUIRRELVM vm)
|
|
{
|
|
/*#
|
|
Topic: Project
|
|
Type: Project
|
|
Type: ProjectLayer
|
|
#*/
|
|
|
|
/*#
|
|
Section: ProjectGeneral
|
|
Desc: General project functions
|
|
#*/
|
|
/*#
|
|
Func: ProjectGetClock
|
|
Proto: Clock:Project
|
|
Desc: Get the project clock object.
|
|
#*/
|
|
sq_register(vm, ProjectGetClock, "ProjectGetClock", _SC(".x"));
|
|
/*#
|
|
Func: ProjectGetScriptInstance
|
|
Proto: Instance:Project
|
|
Desc: Get the project script instance.
|
|
#*/
|
|
sq_register(vm, ProjectGetScriptInstance, "ProjectGetScriptInstance", _SC(".x"));
|
|
/*#
|
|
Func: ProjectEnd
|
|
Proto: void:Project
|
|
Desc: Exit project.
|
|
#*/
|
|
sq_register(vm, ProjectEnd, "ProjectEnd", _SC(".x"));
|
|
|
|
/*#
|
|
Section: ProjectFontManagement
|
|
Desc: UI Font management functions
|
|
#*/
|
|
/*#
|
|
Func: ProjectLoadFont
|
|
Proto: Font:Project, string path
|
|
Desc: Load a TrueType font in the project font cache.
|
|
#*/
|
|
sq_register(vm, ProjectLoadFont, "ProjectLoadFont", _SC(".xs"));
|
|
sq_register(vm, ProjectLoadFont, "ProjectLoadUIFont", _SC(".xs"));
|
|
/*#
|
|
Func: ProjectLoadFontAliased
|
|
Proto: Font:Project, string path, string alias
|
|
Desc: Load a TrueType font under a specific alias.
|
|
#*/
|
|
sq_register(vm, ProjectLoadFontAliased, "ProjectLoadFontAliased", _SC(".xss"));
|
|
sq_register(vm, ProjectLoadFontAliased, "ProjectLoadUIFontAliased", _SC(".xss"));
|
|
/*#
|
|
Func: ProjectDeleteFontAlias
|
|
Proto: void:Project, string alias
|
|
Desc: Delete a font alias from the font cache.
|
|
#*/
|
|
sq_register(vm, ProjectDeleteFontAlias, "ProjectDeleteFontAlias", _SC(".xs"));
|
|
sq_register(vm, ProjectDeleteFontAlias, "ProjectDeleteUIFontAlias", _SC(".xs"));
|
|
/*#
|
|
Func: ProjectGetFont
|
|
Proto: Font:Project, string name
|
|
Desc: Retrieve a font from its name.
|
|
#*/
|
|
sq_register(vm, ProjectGetFont, "ProjectGetFont", _SC(".xs"));
|
|
sq_register(vm, ProjectGetFont, "ProjectGetUIFont", _SC(".xs"));
|
|
|
|
/*#
|
|
Section: ProjectLayerManagement
|
|
Desc: Layer management functions
|
|
#*/
|
|
/*#
|
|
Func: ProjectLayerGetScene
|
|
Proto: ProjectScene:ProjectLayer
|
|
Desc: Return the scene instance a layer is displaying.
|
|
#*/
|
|
sq_register(vm, ProjectLayerGetScene, "ProjectLayerGetScene", _SC(".x"));
|
|
/*#
|
|
Func: ProjectAddLayer
|
|
Proto: ProjectLayer:Project,ProjectScene,float zorder
|
|
Desc: Create a new layer to display a project scene.
|
|
Note: A scene can be added to several layers at once.
|
|
#*/
|
|
sq_register(vm, ProjectAddLayer, "ProjectAddLayer", _SC(".xxn"));
|
|
/*#
|
|
Func: ProjectLayerSetZOrder
|
|
Proto: void:ProjectLayer,float
|
|
Desc: Set layer Z order.
|
|
Note: Smaller Z values are closer to the viewer.
|
|
#*/
|
|
sq_register(vm, ProjectLayerSetZOrder, "ProjectLayerSetZOrder", _SC(".xn"));
|
|
/*#
|
|
Func: ProjectLayerGetZOrder
|
|
Proto: float:ProjectLayer
|
|
Desc: Get layer Z order.
|
|
#*/
|
|
sq_register(vm, ProjectLayerGetZOrder, "ProjectLayerGetZOrder", _SC(".x"));
|
|
|
|
/*#
|
|
Func: ProjectSetAll2DLayerOffset
|
|
Proto: void:Project,float x,float y
|
|
Desc: Set the offset of all 2d layer in the current project stack. The offset is specified in the layer reference resolution.
|
|
#*/
|
|
sq_register(vm, ProjectSetAll2DLayerOffset, "ProjectSetAll2DLayerOffset", _SC(".xnn"));
|
|
|
|
/*#
|
|
Section: ProjectSceneManagement
|
|
Desc: Scene management functions
|
|
#*/
|
|
/*#
|
|
Func: ProjectNewScene3D
|
|
Proto: ProjectScene:Project
|
|
Desc: Create a new scene 3D.
|
|
Note: You need to add the newly created scene to a project layer to display it.
|
|
Example:
|
|
local project_scene = ProjectNewScene3D(g_project)
|
|
ProjectAddLayer(g_project, project_scene, 0.5) // add the 3d scene to a project layer with Z offset of 0.5
|
|
#*/
|
|
sq_register(vm, ProjectNewScene3D, "ProjectNewScene", _SC(".x"));
|
|
sq_register(vm, ProjectNewScene3D, "ProjectNewScene3D", _SC(".x"));
|
|
/*#
|
|
Func: ProjectNewScene2D
|
|
Proto: ProjectScene:Project
|
|
Desc: Create a new scene 2D.
|
|
Note: You need to add the newly created scene to a project layer to display it.
|
|
Example:
|
|
local project_scene = ProjectNewScene2D(g_project)
|
|
ProjectAddLayer(g_project, project_scene, 0.5) // add the 2d scene to a project layer with Z offset of 0.5
|
|
#*/
|
|
sq_register(vm, ProjectNewScene2D, "ProjectNewScene2D", _SC(".x"));
|
|
|
|
/*#
|
|
Func: ProjectFindScene
|
|
Proto: ProjectScene:Project,string path
|
|
Desc: Returns an instance of a specific scene in the project, returns an invalid object if no such instance could be found.
|
|
#*/
|
|
sq_register(vm, ProjectFindScene, "ProjectFindScene", _SC(".xs"));
|
|
/*#
|
|
Func: ProjectGetSceneLayerList
|
|
Proto: Array:Project,ProjectScene
|
|
Desc: Return all the project layers displaying a specific scene instance. A scene might be displayed by several different layers (eg. in order to display a split-screen view).
|
|
#*/
|
|
sq_register(vm, ProjectGetSceneLayerList, "ProjectGetSceneLayerList", _SC(".xx"));
|
|
|
|
/*#
|
|
Func: ProjectSceneIsActive
|
|
Proto: bool:Project,ProjectScene
|
|
Desc: Return the active state of a project scene.
|
|
#*/
|
|
sq_register(vm, ProjectSceneIsActive, "ProjectSceneIsActive", _SC(".xx"));
|
|
sq_register(vm, ProjectSceneIsActive, "ProjectIsSceneActive", _SC(".xx"));
|
|
/*#
|
|
Func: ProjectSceneActivate
|
|
Proto: void:Project,ProjectScene,bool
|
|
Desc: Activate or deactivate a project scene. When deactivated a scene is not updated or displayed anymore.
|
|
#*/
|
|
sq_register(vm, ProjectSceneActivate, "ProjectSceneActivate", _SC(".xxb"));
|
|
sq_register(vm, ProjectSceneActivate, "ProjectActivateScene", _SC(".xxb"));
|
|
/*#
|
|
Func: ProjectInstantiateScene
|
|
Proto: ProjectScene:Project,string path
|
|
Desc: Instantiate a project scene.
|
|
Note: You need to add the project scene to a layer to display it. This function will detect the type of scene to instantiate, 2d or 3d, from the input file.
|
|
See: ProjectSceneGetType, ProjectDeleteScene
|
|
Example:
|
|
local project_scene = ProjectInstantiateScene(g_project, "scene_file.nms")
|
|
ProjectAddLayer(g_project, project_scene, 0.5)
|
|
#*/
|
|
sq_register(vm, ProjectInstantiateScene, "ProjectInstantiateScene", _SC(".xs"));
|
|
/*#
|
|
Func: ProjectSceneSetGlobal
|
|
Proto: void:ProjectScene
|
|
Desc: Register scene as the global scene script object (g_scene).
|
|
Note: The project automatically updates g_scene before updating or displaying a scene.
|
|
#*/
|
|
sq_register(vm, ProjectSceneSetGlobal, "ProjectSceneSetGlobal", _SC(".x"));
|
|
/*#
|
|
Func: ProjectDeleteScene
|
|
Proto: void:Project,ProjectScene
|
|
Desc: Delete a project scene.
|
|
Note: All layers displaying this scene will be destroyed as well.
|
|
#*/
|
|
sq_register(vm, ProjectUnloadScene, "ProjectDeleteScene", _SC(".xx"));
|
|
sq_register(vm, ProjectUnloadScene, "ProjectUnloadScene", _SC(".xx"));
|
|
/*#
|
|
Func: ProjectSceneGetType
|
|
Proto: ProjectSceneType:ProjectScene
|
|
Desc: Get a project scene type.
|
|
#*/
|
|
sq_register(vm, ProjectSceneGetType, "ProjectSceneGetType", _SC(".x"));
|
|
/*#
|
|
Func: ProjectSceneGetInstance
|
|
Proto: Scene:ProjectScene
|
|
Desc: Get the scene object of type Scene or UI from a project scene object.
|
|
Example:
|
|
local scene = ProjectSceneGetInstace(project_scene) // this project scene encapsulates a 3d scene
|
|
SceneAddLight(scene, "MyLight")
|
|
#*/
|
|
sq_register(vm, ProjectSceneGetInstance, "ProjectSceneGetInstance", _SC(".x"));
|
|
|
|
/*#
|
|
Func: ProjectGetFileName
|
|
Proto: String:Project
|
|
Desc: Return the project file name, without the project path.
|
|
See: ProjectGetFilePath
|
|
#*/
|
|
sq_register(vm, ProjectGetFileName, "ProjectGetFileName", _SC(".x"));
|
|
/*#
|
|
Func: ProjectGetFilePath
|
|
Proto: String:Project
|
|
Desc: Return the project path.
|
|
See: ProjectGetFileName
|
|
#*/
|
|
sq_register(vm, ProjectGetFilePath, "ProjectGetFilePath", _SC(".x"));
|
|
|
|
/*#
|
|
Enum: ProjectSceneType
|
|
Values: ProjectSceneTypeScene2d,ProjectSceneTypeScene3d
|
|
#*/
|
|
sq_pushstring(vm, "ProjectSceneTypeScene2d", -1); sq_pushinteger(vm, ProjectSceneInstance::Type_Scene2d); sq_newslot(vm, -3, true);
|
|
sq_pushstring(vm, "ProjectSceneTypeScene3d", -1); sq_pushinteger(vm, ProjectSceneInstance::Type_Scene3d); sq_newslot(vm, -3, true);
|
|
|
|
sq_pushstring(vm, "NullItem", -1); CObject::Push(vm, NULL, typetag_Item); sq_newslot(vm, -3, true);
|
|
}
|
|
//------------------------------------------------------------------------------
|