Porting code from FreeBasic problem

BlitzMax Forums/BlitzMax Programming/Porting code from FreeBasic problem

KronosUK(Posted 2011) [#1]
Hello I am trying to port over Frank Dodds rather excellent Irrlicht wrapper for FreeBasic to Blitzmax however I have hit a snag with a particular form of function that returns a type from the dll.

For example take this key input code.

The relevant Freebasic code is as follows


wrapper code

TYPE IRR_KEY_EVENT
    key as uinteger
    direction as uinteger
    flags as uinteger
END TYPE

declare function IrrReadKeyEvent alias "IrrReadKeyEvent" () as IRR_KEY_EVENT PTR


Program code
DIM KeyEvent as IRR_KEY_EVENT PTR

KeyEvent = IrrReadKeyEvent 



My blitzmax code is like this:


wrapper code

Type IRR_KEY_EVENT
    Field key:Int
    Field direction:Int
    Field flags:Int
End Type

Global _IrrReadKeyEvent:IRR_KEY_EVENT()"win32" = getprocaddress(lib_irrw,"IrrReadKeyEvent")

Function IrrReadKeyEvent:Irr_Key_Event()
Return _IrrReadKeyEvent()
End Function

program code

Local KeyEvent:IRR_KEY_EVENT = New IRR_KEY_EVENT


KeyEvent = IrrReadKeyEvent()
DebugLog "Keyevent "+KeyEvent.key +" "+keyevent.direction+" "+keyevent.flags




My code runs but KeyEvent doesn't appear to hold any values when a key is pressed as only zeros are printed out.

This is a problem I am having for all functions that return or manipulate types.

Any ideas what I need to do to make this work?

Last edited 2011


KronosUK(Posted 2011) [#2]
Doesn't seem to like byte ptr's in arrays either..sigh


AdamRedwoods(Posted 2011) [#3]
I think passing types/classes from C++ to Bmax is difficult, since the padding and sizes is different.

Usually what is done, is a "glue" file is created to handle the type/class in C++, then in that glue file, functions are created to handle the Getters, Setters for the type/class.

*SOMETIMES* you can get the type to match the class, and then you can pass a BYTE PTR and cast the byte pointer in a type. Although, I must admit, it is not as reliable and can be frustrating. Better to use the C++ glue.

Brucey's modules are a GREAT reference for how glue is used. You can also look at my Quicktime glue, but I think I use only one class.

Last edited 2011


Kryzon(Posted 2011) [#4]
G-Man also made a fully functional BMax Irrlicht wrapper, so you should consider that as well.


KronosUK(Posted 2011) [#5]
Yes I am aware of Gman's wrapper and N3xtd but these are both rather literal ports of the irrlicht functions whereas Frank Dodds makes things a little simpler and has some nifty additional functions added in.

I guess there is no option but to investigate making a glue file but my knowledge of c is very limited.

I'll check out some of Brucey's modules as suggested.

Last edited 2011


Kryzon(Posted 2011) [#6]
Oh sure, but I wasn't suggesting GMan's wrapper for you to use, but rather check how he glued the source files and BMax classes. I'm sure Brucey's are great reference too, but that wrapper deals specifically with Irrlicht.


KronosUK(Posted 2011) [#7]
I have made a little progress with the above problem and I can get key events without using any glue.

However the C side of things is not so good.

Can anyone tell me why this won't compile

IrrlichtHeader.h

struct IrrVector
{
    Float x;
    Float y;
    Float z;
};



IrrlichtHeader.cpp
import "IrrlichtHeader.h"

void GetScreenCoordinatesFrom3DPosition(struct IrrVector *vector, Int *x, Int *y)
{
    HMODULE Module = LoadLibrary (_T("irrlichtwrapper.dll"));
    If (Null == Module)
        {
           //Error
    }
    FARPROC addr;
    addr = GetProcAddress (Module, _T("IrrGetScreenCoordinatesFrom3DPosition"));
    If (Null == addr)
    {
       //Error
    }
    addr(x, y, &vector);

} 



test program
Import "IrrlichtHeader.cpp"

Type IRR_VECTOR
    Field x:Float
    Field y:Float
    Field z:Float
End Type

Extern
GetScreenCoordinatesFrom3DPosition(vector:IRR_VECTOR, x:Int, y:Int)
End Extern



Last edited 2011