first commit

This commit is contained in:
2026-06-22 11:49:35 +02:00
commit d805f2ba86
619 changed files with 126873 additions and 0 deletions

View File

@ -0,0 +1,58 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT__
#define __COBJECT__
#include "script/script_engine_types.h"
#include "script_squirrel/squirrel_vm.h"
#include "thread/mutex.h"
namespace GS {
namespace Script {
struct EngineVM;
/*!
@short Weak/shared reference to native C/C++ objects for the Squirrel VM.
@author Emmanuel Julien (ejulien@gsworks.fr)
*/
class CObject
{
EngineVM *vm;
public:
/// Pop safe user pointer.
static bool Get(HSQUIRRELVM, int stack_index, void **, CObjectType = typetag_Undefined);
/// Get safe user pointer type.
static bool GetType(HSQUIRRELVM, int idx, CObjectType &);
// Get a base object from derived types.
static bool GetBase(HSQUIRRELVM, int idx, void **, CObjectType *derived_types);
/// Push safe user pointer.
static bool Push(HSQUIRRELVM, void *, CObjectType, bool managed = false);
/// Initialize reference to a native type.
void Initialize(CObjectType, void *, bool managed);
/// Release reference to a native type.
void Release();
bool managed;
List <CObject *> ::Item *list_item; // Needs to be cached for fast deletion.
CObjectType type;
void *native;
CObject(EngineVM *vm, CObjectType = typetag_Undefined, void *p = 0, bool managed = false);
~CObject();
};
} // Script
} // GS
#endif // __COBJECT__

View File

@ -0,0 +1,20 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_DECL
#define __COBJECT_DECL
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
namespace GS { class CObject; }
_DECL_CLASS(CObject);
_DECL_NATIVE_CONSTRUCTION(CObject, GS::CObject);
#endif // __COBJECT_DECL

View File

@ -0,0 +1,20 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_GEOMETRY_TEMPLATE_DECL__
#define __COBJECT_GEOMETRY_TEMPLATE_DECL__
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
class nGeometryTemplate;
_DECL_CLASS(GeometryTemplate)
_DECL_NATIVE_CONSTRUCTION(GeometryTemplate, nGeometryTemplate)
#endif // __COBJECT_GEOMETRY_TEMPLATE_DECL__

View File

@ -0,0 +1,25 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_MATRIX_DECL__
#define __COBJECT_MATRIX_DECL__
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
namespace GS {
class Matrix3;
class Matrix4;
}
_DECL_CLASS(Matrix3)
_DECL_NATIVE_CONSTRUCTION(Matrix3, GS::Matrix3)
_DECL_CLASS(Matrix4)
_DECL_NATIVE_CONSTRUCTION(Matrix4, GS::Matrix4)
#endif // __COBJECT_MATRIX_DECL__

View File

@ -0,0 +1,24 @@
/* -----------------------------------------------------------------------------
nEngine - GSFramework
Copyright 2001-2012 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_QUATERNION_DECL__
#define __COBJECT_QUATERNION_DECL__
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
#ifndef _T
#define _T
#endif
struct nQuaternion;
_DECL_CLASS(Quaternion)
_DECL_NATIVE_CONSTRUCTION(Quaternion, nQuaternion)
#endif // __COBJECT_QUATERNION_DECL__

View File

@ -0,0 +1,239 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __CU_BINDING_UTILS__
#define __CU_BINDING_UTILS__
#include "squirrel.h"
#include "script_squirrel/cobject/squirrel_object.h"
namespace GS {
namespace Script {
class CObject;
}
}
struct ScriptClassMemberDecl
{
const SQChar *name;
SQFUNCTION func;
int params;
const SQChar *typemask;
};
struct SquirrelClassDecl
{
const SQChar *name;
const SQChar *base;
const ScriptClassMemberDecl *members;
};
struct ScriptConstantDecl
{
const SQChar *name;
SQObjectType type;
union value
{
value(int v = 0) { i = v; }
value(float v) { f = v; }
value(const SQChar *v) { s = v; }
float f;
int i;
const SQChar *s;
} val;
};
struct ScriptNamespaceDecl
{
const SQChar *name;
const ScriptClassMemberDecl *members;
const ScriptConstantDecl *constants;
const ScriptClassMemberDecl *delegate;
};
//------------------------------------------------------------------------------
#define case_ItemDerived \
case typetag_Camera: \
case typetag_Object: \
case typetag_Light: \
case typetag_Trigger: \
case typetag_Item:
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _GetCObject(_CPP_CLASS, _TYPETAG, _VAR, _IDX) \
_CPP_CLASS *_VAR = NULL; \
{ \
_GetParamAt(GS::Script::CObject, CObject, _IDX) \
if (self->type != _TYPETAG) \
return sa.ThrowError("Invalid type"); \
if (!self->native) \
return sa.ThrowError("Object is null"); \
_VAR = (_CPP_CLASS *)self->native; \
}
#define _GetSelfNonNull \
_GetSelf(GS::Script::CObject, CObject); \
if (!self->native) \
return sa.ThrowError("Object is null");
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _BEGIN_CLASS(classname)\
SQInteger __##classname##__SCypeof(HSQUIRRELVM v)\
{\
sq_pushstring(v,_SC(#classname),-1);\
return 1;\
}\
struct ScriptClassMemberDecl __##classname##_members[] = {\
{_SC("_SCypeof"),__##classname##__SCypeof,1,NULL},
#define _BEGIN_NAMESPACE(xnamespace) struct ScriptClassMemberDecl __##xnamespace##_members[] = {
#define _BEGIN_NAMESPACE_CONSTANTS(xnamespace) {NULL,NULL,NULL,NULL}}; \
struct ScriptConstantDecl __##xnamespace##_constants[] = {
#define _BEGIN_DELEGATE(xnamespace) struct ScriptClassMemberDecl __##xnamespace##_delegate[] = {
#define _DELEGATE(xnamespace) __##xnamespace##_delegate
#define _END_DELEGATE(classname) {NULL,NULL,NULL,NULL}};
#define _CONSTANT(name,type,val) {_SC(#name),type,val},
#define _CONSTANT_IMPL(name,type) {_SC(#name),type,name},
#define _MEMBER_FUNCTION(classname,name,nparams,typemask) \
{_SC(#name),__##classname##_##name,nparams,typemask},
#define _END_NAMESPACE(classname,delegate) {NULL,OT_NULL,0}}; \
struct ScriptNamespaceDecl __##classname##_decl = { \
_SC(#classname), __##classname##_members,__##classname##_constants,delegate };
#define _END_CLASS(classname) {NULL,NULL,NULL,NULL}}; \
struct SquirrelClassDecl __##classname##_decl = { \
_SC(#classname), NULL, __##classname##_members };
#define _END_CLASS_INHERITANCE(classname,base) {NULL,NULL,NULL,NULL}}; \
struct SquirrelClassDecl __##classname##_decl = { \
_SC(#classname), _SC(#base), __##classname##_members };
#define _MEMBER_FUNCTION_IMPL(classname,name) \
SQInteger __##classname##_##name(HSQUIRRELVM v) \
{ \
StackHandler sa(v);
#define _END_IMPL }
#define _INIT_STATIC_NAMESPACE(vm,classname) CreateStaticNamespace(vm,&__##classname##_decl);
#define _INIT_CLASS(vm,classname)CreateClass(vm,&__##classname##_decl);
#define _DECL_STATIC_NAMESPACE(xnamespace) extern struct ScriptNamespaceDecl __##xnamespace##_decl;
#define _DECL_CLASS(classname) extern struct SquirrelClassDecl __##classname##_decl;
#define _GetSelf(cppclass,scriptclass) \
cppclass *self = NULL; \
if (SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)&__##scriptclass##_decl))) \
return sq_throwerror(v,_SC("Invalid instance type"));\
if (!self)\
return sa.ThrowError("Internal failure");
#define _GetParamAt(cppclass,scriptclass,idx) \
cppclass *self = NULL; \
if (SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&self,(SQUserPointer)&__##scriptclass##_decl))) \
return sq_throwerror(v,_SC("Invalid instance type")); \
if (!self) \
return sa.ThrowError("Internal failure");
#define _CHECK_INST_PARAM_RAW(pname,idx,cppclass,scriptclass) \
cppclass *pname = NULL; \
if (SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&pname,(SQUserPointer)&__##scriptclass##_decl))) pname = NULL;
//------------------------------------------------------------------------------
#define _GetTypedParam(pname,idx,cppclass,scriptclass) \
cppclass *pname = NULL; \
if (SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&pname,(SQUserPointer)&__##scriptclass##_decl))) \
return sq_throwerror(v,_SC("Invalid instance type"));
#define _CHECK_INST_PARAM_COBJECT(__PARAM__, __IDX__, __CPPCLASS__) \
__CPPCLASS__ *__PARAM__ = NULL; \
{ \
_GetTypedParam(c_object, __IDX__, GS::CObject, CObject) \
if (!c_object->c_object) \
return sq_throwerror(v, "C Object is null"); \
__PARAM__ = (__CPPCLASS__ *)c_object->c_object; \
}
#define _CHECK_INST_PARAM_BREAK(pname,idx,cppclass,scriptclass) \
cppclass *pname = NULL; \
if (SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&pname,(SQUserPointer)&__##scriptclass##_decl))) \
break;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _CLASS_SCAG(classname) ((SQUserPointer)&__##classname##_decl)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _DECL_NATIVE_CONSTRUCTION(classname,cppclass)\
bool push_##classname(HSQUIRRELVM v, const cppclass &quat);\
SquirrelObject new_##classname(HSQUIRRELVM v, const cppclass &quat);
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _IMPL_NATIVE_CONSTRUCTION(classname, cppclass)\
static SQInteger classname##_release_hook(SQUserPointer p, SQInteger size)\
{\
if (p)\
{\
cppclass *pv = (cppclass *)p;\
delete pv;\
}\
return 0;\
}\
bool push_##classname(HSQUIRRELVM vm, const cppclass &quat)\
{\
cppclass *newquat = new cppclass;\
*newquat = quat;\
if (!CreateNativeClassInstance(vm,#classname,newquat,classname##_release_hook))\
{\
delete newquat;\
return false;\
}\
return true;\
}\
::SquirrelObject new_##classname(HSQUIRRELVM vm, const cppclass &quat)\
{\
::SquirrelObject ret(vm);\
if (push_##classname(vm, quat))\
{\
ret.AttachToStackObject(-1);\
sq_pop(vm, 1);\
}\
return ret;\
}\
int construct_##classname(HSQUIRRELVM vm, cppclass *p)\
{\
sq_setinstanceup(vm, 1, p);\
sq_setreleasehook(vm, 1, classname##_release_hook);\
return 1;\
}
//------------------------------------------------------------------------------
bool CreateStaticClass(HSQUIRRELVM v, SquirrelClassDecl *cd);
bool CreateStaticNamespace(HSQUIRRELVM v, ScriptNamespaceDecl *sn);
bool CreateClass(HSQUIRRELVM v, SquirrelClassDecl *cd);
bool InitScriptClasses(HSQUIRRELVM v);
bool CreateNativeClassInstance(HSQUIRRELVM v, const SQChar *classname, SQUserPointer ud, SQRELEASEHOOK hook);
int refcounted_release_hook(SQUserPointer p, int size);
int construct_RefCounted(void *p);
//------------------------------------------------------------------------------
#define _SA_RETURN_OBJECT(__EXP__) { ::SquirrelObject o = __EXP__; return sa.Return(o); }
#define _ReturnCObject(__OBJECT__, __TYPE__) { GS::Script::CObject::Push(v, __OBJECT__, __TYPE__); return 1; }
//------------------------------------------------------------------------------
#endif // __CU_BINDING_UTILS__

View File

@ -0,0 +1,187 @@
#ifndef _SQUIRREL_OBJECT_H_
#define _SQUIRREL_OBJECT_H_
class SquirrelObject
{
// friend class SquirrelVM;
public:
SquirrelObject(HSQUIRRELVM vm);
virtual ~SquirrelObject();
SquirrelObject(const SquirrelObject &o);
SquirrelObject(HSQOBJECT &o);
SquirrelObject & operator =(const SquirrelObject &o);
SquirrelObject & operator =(int n);
void Append(const SquirrelObject &o);
void AttachToStackObject(int idx);
SquirrelObject Clone();
bool SetValue(const SquirrelObject &key,const SquirrelObject &val);
bool SetValue(SQInteger key,const SquirrelObject &val);
bool SetValue(int key,bool b);
bool SetValue(int key,int n);
bool SetValue(int key,float f);
bool SetValue(int key,const SQChar *s);
bool SetValue(const SQChar *key,const SquirrelObject &val);
bool SetValue(const SQChar *key,bool b);
bool SetValue(const SQChar *key,int n);
bool SetValue(const SQChar *key,float f);
bool SetValue(const SQChar *key,const SQChar *s);
bool SetInstanceUP(SQUserPointer up);
bool IsNull() const;
bool IsNumeric() const;
int Len() const;
bool SetDelegate(SquirrelObject &obj);
SquirrelObject GetDelegate();
const SQChar* ToString();
bool ToBool();
SQInteger ToInteger();
SQFloat ToFloat();
SQUserPointer GetInstanceUP(SQUserPointer tag) const;
SquirrelObject GetValue(const SQChar *key) const;
bool Exists(const SQChar *key) const;
float GetFloat(const SQChar *key) const;
int GetInt(const SQChar *key) const;
const SQChar *GetString(const SQChar *key) const;
bool GetBool(const SQChar *key) const;
SquirrelObject GetValue(int key) const;
float GetFloat(int key) const;
int GetInt(int key) const;
const SQChar *GetString(int key) const;
bool GetBool(int key) const;
SquirrelObject GetAttributes(const SQChar *key = 0);
SQObjectType GetType();
HSQOBJECT &GetObject(){return _o;}
bool BeginIteration();
bool Next(SquirrelObject &key,SquirrelObject &value);
void EndIteration();
private:
bool GetSlot(const SQChar *name) const;
bool GetSlot(int key) const;
HSQOBJECT _o;
HSQUIRRELVM vm;
};
struct StackHandler {
StackHandler(HSQUIRRELVM v) {
_top = sq_gettop(v);
this->v = v;
}
SQFloat GetFloat(int idx) {
SQFloat x = 0.0f;
if(idx > 0 && idx <= _top) {
sq_getfloat(v,idx,&x);
}
return x;
}
SQInteger GetInt(int idx) {
SQInteger x = 0;
if(idx > 0 && idx <= _top) {
sq_getinteger(v,idx,&x);
}
return x;
}
HSQOBJECT GetObject(int idx) {
HSQOBJECT x;
if(idx > 0 && idx <= _top) {
sq_resetobject(&x);
sq_getstackobj(v,idx,&x);
}
return x;
}
const SQChar *GetString(int idx)
{
const SQChar *x = 0;
if(idx > 0 && idx <= _top) {
sq_getstring(v,idx,&x);
}
return x;
}
SQUserPointer GetUserPointer(int idx)
{
SQUserPointer x = 0;
if(idx > 0 && idx <= _top) {
sq_getuserpointer(v,idx,&x);
}
return x;
}
SQUserPointer GetInstanceUp(int idx,SQUserPointer tag)
{
SQUserPointer self;
if(SQ_FAILED(sq_getinstanceup(v,idx,(SQUserPointer*)&self,tag)))
return 0;
return self;
}
SQUserPointer GetUserdata(int idx,SQUserPointer tag)
{
SQUserPointer otag;
SQUserPointer up;
if(idx > 0 && idx <= _top) {
if(SQ_SUCCEEDED(sq_getuserdata(v,idx,&up,&otag))) {
if(tag == otag)
return up;
}
}
return 0;
}
bool GetBool(int idx)
{
SQBool ret;
if(idx > 0 && idx <= _top) {
if(SQ_SUCCEEDED(sq_getbool(v,idx,&ret)))
return ret ? true : false;
}
return false;
}
int GetType(int idx)
{
if(idx > 0 && idx <= _top) {
return sq_gettype(v,idx);
}
return -1;
}
SQInteger GetParamCount() {
return _top;
}
int Return(const SQChar *s)
{
sq_pushstring(v,s,-1);
return 1;
}
int Return(float f)
{
sq_pushfloat(v,f);
return 1;
}
int Return(int i)
{
sq_pushinteger(v,i);
return 1;
}
int Return(unsigned int i)
{
sq_pushinteger(v,i);
return 1;
}
int Return(bool b)
{
sq_pushbool(v,b);
return 1;
}
int Return(SquirrelObject &o)
{
sq_pushobject(v,o.GetObject());
return 1;
}
int Return() { return 0; }
SQInteger ThrowError(const SQChar *error) {
return sq_throwerror(v,error);
}
private:
SQInteger _top;
HSQUIRRELVM v;
};
#endif //_SQUIRREL_OBJECT_H_

View File

@ -0,0 +1,18 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
------------------------------------------------------------------------------*/
#ifndef __UC_BINDING__
#define __UC_BINDING__
#include "squirrel.h"
/// Register fast OO Squirrel binding.
void RegisterUCBinding(HSQUIRRELVM vm);
#endif // __UC_BINDING__

View File

@ -0,0 +1,19 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_UV_DECL__
#define __COBJECT_UV_DECL__
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
#include "math/vector.h"
_DECL_CLASS(UV)
_DECL_NATIVE_CONSTRUCTION(UV, GS::Vector2)
#endif // __COBJECT_UV_DECL__

View File

@ -0,0 +1,20 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __COBJECT_VECTOR_DECL__
#define __COBJECT_VECTOR_DECL__
#include "script_squirrel/cobject/squirrel_bindings_utils.h"
namespace GS { struct Vector4; }
_DECL_CLASS(Vector)
_DECL_NATIVE_CONSTRUCTION(Vector, GS::Vector4)
#endif // __COBJECT_VECTOR_DECL__