HGE and Python (again)

Discussion in 'Python' started by Cro, Dec 11, 2008.

  1. Cro

    Cro Guest

    Good day.

    I've been trying to port HGE (http://hge.relishgames.com) to Python
    for more than 4 months now...
    HGE is a hardware accelerated 2D game engine.
    It comes with the source and examples. In the folder "include", you
    can find "hge.h", the file that i am talking about in all the post.

    #
    I tried to load the DLL functions with Python Ctypes like this :
    Code:
    [color=blue][color=green][color=darkred]
    >>> from ctypes import *
    >>> HGE = cdll.LoadLibrary("C:/hge181/hge")
    >>> HGE.hgeCreate(0x180)[/color][/color][/color]
    
    But i get this error : "Procedure called with not enough arguments (4
    bytes missing) or wrong calling convention".
    The call should be done with hgeCreate(HGE_VERSION) and the constant
    is defined as "#define HGE_VERSION 0x180"...
    Number 0x180 means 384 in Python. I don't mean what it means in C.
    So i am stuck.

    I also tried to modify the "hge.h" file on line 408, and export the
    rest of the classes...
    Code:
    __declspec (dllexport) hgeVertex;
    __declspec (dllexport) hgeTriple;
    __declspec (dllexport) hgeQuad;
    __declspec (dllexport) hgeInputEvent;
    
    But after compilation, i am not able to access them from Python
    "ctypes". They seem to remain invisible. Perhaps i am not doing it
    right?...

    #
    I tried Cython.
    I tried to load "hge.h" in Cython and use the structures.
    The first error i get is at line 173: "typedef bool (*hgeCallback)
    ();". I am not that good in C/C++ to understand what it means. So i
    commented it...
    The second big error is at line 408: "extern "C" { EXPORT HGE * CALL
    hgeCreate(int ver); }". This should be the DLL export. I comented that
    too...

    I used this code in Cython, loading from "hge.h":
    Code:
    # file HGE.pyx
    cdef extern from "windows.h":
       pass
    
    cdef extern from "hge.h":
       pass
    
    And i get this errors:
    Code:
    ...\hge.h(215) : error C2061: syntax error : identifier 'hgeVertex'
    ...\hge.h(218) : error C2059: syntax error : '}'
    ...\hge.h(226) : error C2061: syntax error : identifier 'hgeVertex'
    ...\hge.h(229) : error C2059: syntax error : '}'
    ...\hge.h(274) : error C2061: syntax error : identifier 'HGE'
    ...\hge.h(274) : error C2059: syntax error : ';'
    ...\hge.h(275) : error C2449: found '{' at file scope (missing function
    header?)
    ...\hge.h(407) : error C2059: syntax error : '}'
    
    Then i tried to define hgeVertex in Cython like:
    Code:
    struct hgeVertex:
       float x, y      # screen position
       float z         # Z-buffer depth 0..1
       DWORD col      # color
       float tx, ty      # texture coordinates
    
    But i get the exact same errors.
    If i comment all the structures hgeVertex and Triple and Quad and the
    HGE class, the Cython file compiles !... But it's not useful at all.
    My Cython is okay, i compiled a few programs before, so that's not a
    problem...

    #
    Then i tried Swig (and it worked with the examples )... But the
    problems with "hge,h" seem to be somewhat similar.
    I call swig like this : "swig -c++ -python hge.i"
    And the file "hge.i" contains:
    Code:
    /* File : hge.i */
    %module hge
    
    %{
    #include "hge.h"
    %}
    
    /* Let's just grab the original header file here */
    %include "hge.h"
    
    And the error i get after commenting the HGE callback and DLL export
    is this : "hge.h(276): Error: Syntax error in input(3)." Line 276 is
    exactly the first call of HGE class : "virtual void CALL Release() =
    0;".

    #
    I tried Boost.Python (and it works with embedding and extending
    examples), but i could't compile "hge.h" even after commenting the
    structures and classes. I have to write some wrapper code in "hge.h"
    and i am probably doing it completely wrong.
    Code:
    BOOST_PYTHON_MODULE(hge)
    {
    	using namespace boost::python;
    	class_<hgeVertex> base("hgeVertex");
    }
    
    So i am stuck again...

    I am not that good in neither C or Python.

    Can anyone suggest any ideas? Please?
    I really really really want to port HGE in Python. It's the greatest
    game engine i have ever seen. The particle engine is EXCELLENT and i
    need it.

    Thank you in advance.
     
    Cro, Dec 11, 2008
    #1
    1. Advertising

  2. Cro schrieb:
    > Good day.
    >
    > I've been trying to port HGE (http://hge.relishgames.com) to Python
    > for more than 4 months now...
    > HGE is a hardware accelerated 2D game engine.
    > It comes with the source and examples. In the folder "include", you
    > can find "hge.h", the file that i am talking about in all the post.
    >
    > #
    > I tried to load the DLL functions with Python Ctypes like this :
    >
    Code:
    [color=green][color=darkred]
    >>>> from ctypes import *
    >>>> HGE = cdll.LoadLibrary("C:/hge181/hge")
    >>>> HGE.hgeCreate(0x180)[/color][/color]
    > 
    > But i get this error : "Procedure called with not enough arguments (4
    > bytes missing) or wrong calling convention".
    > The call should be done with hgeCreate(HGE_VERSION) and the constant
    > is defined as "#define HGE_VERSION 0x180"...
    > Number 0x180 means 384 in Python. I don't mean what it means in C.
    > So i am stuck.


    You are aware that ctypes knows another call for windows dlls with
    another calling convention?

    http://docs.python.org/library/ctypes.html#loading-dynamic-link-libraries

    Looking at the headers, I see

    #define CALL __stdcall

    So to me it looks as if you use the wrong DLL-loading mechanism.

    Diez
     
    Diez B. Roggisch, Dec 11, 2008
    #2
    1. Advertising

  3. Cro

    Cro Guest

    Good day.

    Thank you so much for your answer Diez!

    I managed to call HGE dll the way you told:
    >>> HGE = windll.LoadLibrary("C:/hge181/hge")
    >>> HGE.hgeCreate(0x180)

    But it's not helpful. It would mean that i have to re-create all the
    header files from "include" directory in python, and all helper
    functions from the "libs" to be able to use hge in the same way as the
    original.
    So ctypes is not what i need. It's a big step!

    I also tried swig, a lot.
    A lot, a lot, a lot of examples. Hacking examples and stuff.
    And i managed to compile "hge.h" header and call the structs and HGE
    main class. I don't seem to be able to acces the "enums", but that's
    not a big problem.
    How i did that, if anyone wants to know: There are 4 files.
    - There is "example.cxx", that includes "hge.h" in the proper C++ way
    and defines a HGE* hge=0 just like in the tutorials.
    - Then is "hge.h", the original file, with ONE line commented: line
    408 with the DLL EXPORT. Ah, and one more thing. I had to delete ALL
    "CALL" keywords from HGE class, because if one CALL appears, the swig
    compiler flags the line as error. So, for now, no stdcall.
    - Then is "example.i", with "#include "hge.h"" and "%include "hge.h"".
    Simple as that.
    - And then, there is setup.py. "example_module = Extension('_example',
    sources=['example_wrap.cxx', 'example.cxx'],)"
    That's it. I compile it all like this:

    swig -c++ -python example.i
    setup build_ext --inplace

    So it's a huge step for me. The compiler i have in my system is
    mingw-3.4.5. I don't know if it's good for this. Maybe i should try a
    MS compiler instead?

    Next things i want to do:
    - try to compile the project with a MS compiles. Visual studio 7.1 or
    somethin.
    - learn if i can do stdcalls from swig !!! This is the most important.
    - try to compile one normal hge tutorial WITHOUT including "hge.lib"
    and "hgehelp.lib". All functions defined there can be included just
    like normal headers, the source is there and i compiled the libs
    myself. I need this step because i don't think i can include lib files
    in a swig project.
    - try to do all i did in swig, with Cython. It's pretty easy to use
    and faster from what i know.

    So i must learn to to stdcalls from swig.
    Can anyone suggest how to do that?

    I mean, i have lines like:
    virtual void CALL Release(); // in HGE class.
    And:
    void CALL HGE_Impl::Release()
    {
    //... // In the "c" file.
    }
    , where CALL is defined as "#define CALL __stdcall".
    I simply can't make this kind of classes so work in swig.

    Thank you very much.
     
    Cro, Dec 13, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. amit
    Replies:
    0
    Views:
    413
  2. che
    Replies:
    2
    Views:
    524
  3. abcd

    Importing again and again

    abcd, Jun 8, 2006, in forum: Python
    Replies:
    9
    Views:
    342
    Maric Michaud
    Jun 9, 2006
  4. Ò»Ê×Ê«

    A design problem I met again and again.

    Ò»Ê×Ê«, Apr 1, 2009, in forum: Python
    Replies:
    24
    Views:
    757
    Dennis Lee Bieber
    Apr 4, 2009
  5. Alexander Burger

    jsf 2.0 datatable reload again and again

    Alexander Burger, Sep 23, 2010, in forum: Java
    Replies:
    14
    Views:
    4,425
    Arved Sandstrom
    Sep 26, 2010
Loading...

Share This Page