[C++-sig] PhysX3.x Wrapping Problems

Peter Armbrüster arm at rfh-koeln.de
Tue Jan 28 17:33:18 CET 2014


Dear Boost.python, C++ and Py++ Experts,

 

this is my first post in your excellent Forum.

 

I have chosen as the wrapper software the boost.python/Py++ Package to write
a physx 3.x Wrapper, because I think it is the best.

Many many thanks to David Abrahams and Roman Yakovenko for the great Tools.

 

The wrapping of old versions physx 2.x had made no problems.

And now I come across a  very big problem at the 3.x Versions.

All wrappings of classes works very well.

The problem only exists in the PhysX free functions, which are responsible
for the initialization of PhysX.

 

I try to explain with a reduced Example.

The initialization of PhysX starts with create of foundation :

 

0 static PxFoundation *mFoundation = NULL;

1 static PxDefaultErrorCallback gDefaultErrorCallback; 
2 static PxDefaultAllocator gDefaultAllocatorCallback; 
3 mFoundation = PxCreateFoundation(PX_PHYSICS_VERSION,
gDefaultAllocatorCallback, gDefaultErrorCallback); 4
4 if(!mFoundation) 

5   fatalError("PxCreateFoundation failed!"); 

 

The wrapped python program generate a runtime error at line 3: RuntimeError:
Access violation - no RTTI data!

Its impossible to get mFoundation.

 

 

 

Notes: 

- physx comes as SDK:  only Headers, libs and dlls.

- PxFoundation is a Abstract class:

 

class PX_FOUNDATION_API PxFoundation
{
public:
   virtual   void release() = 0;
   virtual PxErrorCallback& getErrorCallback() const = 0;
   virtual void setErrorLevel(PxErrorCode::Enum mask =
PxErrorCode::eMASK_ALL) = 0;
   virtual PxErrorCode::Enum getErrorLevel() const = 0;
   virtual PxBroadcastingAllocator& getAllocator() const = 0;
   virtual PxAllocatorCallback& getAllocatorCallback() const = 0;
   virtual bool getReportAllocationNames() const = 0;
   virtual void setReportAllocationNames(bool value) = 0;

   virtual ~PxFoundation() {}
};

 

- The wrapping of PxFoundation makes no problem.

 

 

To make sure that I made no mistake with the  initialization of PhysX, I
tried a different solution.

A small function InitPhysX create the foundation, and  GetFoundation get
this.

 

C++ Code:


using namespace physx;

PxU32 PHYSICS_VERSION = PX_PHYSICS_VERSION;  
static PxFoundation *mFoundation = NULL;
static PxDefaultErrorCallback gDefaultErrorCallback;
static PxDefaultAllocator gDefaultAllocatorCallback;


PxFoundation* GetFoundation(){
   return mFoundation;
}

void InitPhysX() {
   mFoundation = PxCreateFoundation(
      PX_PHYSICS_VERSION,
      gDefaultAllocatorCallback,
      gDefaultErrorCallback);

   if(!mFoundation)
      printf("ERROR: PxCreateFoundation failed!\n");

   else
      printf("PxCreateFoundation created!\n");
}

 

The wrapped python program: 

 

1 import _physx324_d as PX

2 PX.InitPhysX()

3 foundation = PX.GetFoundation()

 

I get on line 2 the message: "PxCreateFoundation created!" 
=> OK!

 

On Line 3 the same error RuntimeError: Access violation - no RTTI data!

 

Now i check the wrappings of PxCreateFoundation in
_physx324_d_free_functions.pypp.cpp

 

void register_free_functions(){

    . . .

 

    { //::GetFoundation
    
        typedef ::physx::PxFoundation * ( *GetFoundation_function_type )(
);
        
        bp::def( 
            "GetFoundation"
            , GetFoundation_function_type( &::GetFoundation )
            , bp::return_value_policy< bp::reference_existing_object >() );
    
    }

 

    . . . 

 

 

I think: return_value_policy< bp::reference_existing_object > thats right!?

 

Then a debug session with PTVS, start with a break point in InitPhysX 

and inspect the mFoundation after the successful generation.

Its a vptr with 9 Entries => thats right, PxFoundation has 9 Methods.

That's all what I can see, because I have no source code and no pdb
(symbols).

 

I place the next Breakpoint in

PxFoundation* GetFoundation(){
   return mFoundation;
}

 

to search the Error location.

 

Then followed a trace trip through the code, for me is a journey through an
unreadable jungles of wrapper C + + code.

Unfortunately, I am not an C++Expert.

The Error is not to find for me.

 

 

The same problem occurs with PxCreatePhysics.

 

My work enviroment:

·  Windows 7 x64

·  Python 2.7

·  physxVersion 3.24  (i try: 3.01, 3.23, 3.3, same problem) 

·  visualStudioVersion 11 (i try: VS 9 and  VS 10,  same problem)  

·  PythonTools for Visual Studio (PTVS)

·  Boost 1.55 (i try: 1.45,  same problem) 

·  gccxml 0.9

·  pyplusplus 1.0 svn 1.5.1

·  pygccxml 1.0 svn 1.5.1

 

 

 

What is my mistake?

I would be very grateful if someone could an expert help.

Thanks for your response.

 

    Peter Armold

 

 

 

 

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20140128/0b2f2743/attachment-0001.html>


More information about the Cplusplus-sig mailing list