You are not off-topic Chris.
In fact, I implemented this:
Code: Select all
coiCameraHandle myCamera = create_camera("mycam");
camera_set_position(myCamera, 0, 0, 80);
camera_lookat(myCamera, 0, 0, -300);
'coiCameraHandle' is referring to a void pointer, but it's 'type safe', using the same trick as So0os mentioned:
Code: Select all
#define COI_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
And in the header:
Code: Select all
COI_DECLARE_HANDLE(coiCameraHandle);
...
DLL coiCameraHandle create_camera(const char* name);
DLL coiCameraHandle get_camera(const char* camera_name);
DLL void camera_set_near_clip_distance(coiCameraHandle camera_handle, coiReal d);
In the C++ code:
Code: Select all
DLLEXP coiCameraHandle create_camera(const char* camera_name)
{
Ogre::Camera* camera = Ogre::Root::getSingletonPtr()->getSceneManager("scene-manager")->createCamera(camera_name);
return (coiCameraHandle)reinterpret_cast<void*>(camera);
}
DLLEXP void camera_set_near_clip_distance(coiCameraHandle camera_handle, coiReal d)
{
Ogre::Camera* camera = reinterpret_cast<Ogre::Camera*>(camera_handle);
camera->setNearClipDistance( d );
}
I stole it from Bullet!
Other handles needs to be created: coiEntityHandle, coiWhatevarHandle..
It's actually neat.
