ckdev

Members
  • Content count

    1
  • Joined

  • Last visited

Community Reputation

103 Neutral

About ckdev

  • Rank
    Newbie
  1. The Problem I've attempted to register an object method ( asEngine_RegisterObjectMethod ) that takes in a GlobalData* and a uint, than returns a ref type.  Something about returning the ref however seems to cause the function to pass in an invalid pointer as the first parameter.  Modifying the function to return a non-generic type seems to correct the problem.   What I am trying to do -- Bigger Picture I want to retrieve some data in the form of a void* and easily pass it around to various other bound functions. In this simple example I want to retrieve a void* from an object as a generic handle, cast that handle, than pass that handle to another C-style function.   I want to able to return a void* as a ref ( or ref@, not sure since ref seems to be a special case), then cast that to a Entity@ and pass it along to a registered function that can take an Entity*.   I'd also like to avoid needing the user to register a cast function if they don't need to.  It seems like CScriptHandle can already be casted from one handle type to another.   This is ideally how I want the angelscript to look when the user attempts to get/pass around the data. GLOBALDATA@ GlobalData = GetGlobalData(); ENTITY@ Entity = cast<ENTITY>(GlobalData.GetData( 2 )); if( Entity !is null ){     Entity_ProcessEntity( Entity ); } I have registered the CScriptHandle type with the asEngine, however I seem to be missing something important during the implementation as things are not working as expected.   This is what the simplified C++ modules look like. static class GlobalData { public: void* GetData( uint index ){ return _data[index]; } private: void** _data[10]; } GlobalDataInstance; //C-Style interface for GlobalData GlobalData* GlobalData_GetGlobalData( void ){ return &GlobalDataInstance; } void* GlobalData_GetData( GlobalData* globalData, uint index ){ return globalData->GetData(index); } void Entity_ProcessEntity( Entity* entity ){     entity->DoWork(); } This is how they are registered with asEngine Result = asEngine_RegisterGlobalFunction( Engine, "GLOBALDATA@ GetGlobalData()", asFUNCTION_t( &GlobalData_GetGlobalData), asCALL_CDECL ); Result = asEngine_RegisterObjectType( Engine, "GLOBALDATA", 0, asOBJ_REF | asOBJ_NOCOUNT ); Result = asEngine_RegisterObjectMethod( Engine, "GLOBALDATA",   "ref GetData( uint Index) const",  asFUNCTION_t(&GlobalData_GetData), asCALL_CDECL_OBJFIRST ); Result = asEngine_RegisterGlobalFunction( Engine, "void Entity_ProcessEntity( ENTITY@ entity)", asFUNCTION_t( &Entity_ProcessEntity), asCALL_CDECL ); asEngine_RegisterObjectMethod( Engine, "GLOBALDATA",   "ref GetData( uint Index) const",  asFUNCTION_t(&GlobalData_GetData), asCALL_CDECL_OBJFIRST ); This seems to be where the problem is occuring.  The GlobalData* provided here is not valid.  It is not null, however it is not GlobalDataInstance.   It could be that CScriptHandle is not the right solution for what i want to do, which is why I've included all of the additional information.