BGE PyAPI fixes
authorCampbell Barton <ideasman42@gmail.com>
Wed, 3 Jun 2009 04:12:59 +0000 (04:12 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 3 Jun 2009 04:12:59 +0000 (04:12 +0000)
- CValue warning ShowDeprecationWarning("val = ob.attr", "val = ob['attr']"); had false positives because of python using getattr() internally. Only show the wanring now when a CValue is found.
- Py functions that accepted a vector and a GameObject were slowed down by PySequence_Check() first called on the GameObject, though this would fail it would try and get attributes from the game object - ending up in ~8 attribute lookups each time. Avoiding PySequence_Check() makes ob.getDistanceTo(otherOb) over twice as fast.

- Joystick hat events could crash the BGE for joysticks with more then 4 hats.
- PLY Import failed on PLY files from Carve, added some extra types.

release/scripts/ply_import.py
source/gameengine/Expressions/PyObjectPlus.h
source/gameengine/Expressions/Value.cpp
source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
source/gameengine/Ketsji/KX_PyMath.h

index 43129ec01e91dee6766904fcf6cf4d214c546001..29e8ce4836187a3dce52ba99aae8c00eb311604b 100644 (file)
@@ -149,6 +149,7 @@ def read(filename):
                      'uint8': 'B',
                      'int16': 'h',
                      'uint16': 'H',
+                     'ushort': 'H',
                      'int': 'i',
                      'int32': 'i',
                      'uint': 'I',
@@ -156,6 +157,7 @@ def read(filename):
                      'float': 'f',
                      'float32': 'f',
                      'float64': 'd',
+                     'double': 'd',
                      'string': 's'}
        obj_spec = object_spec()
 
index 45797fe797564400823d1fcd25d0eaf6792a25b8..369c00782cc7dc28049854cdcb1c594394a9cf38 100644 (file)
@@ -141,7 +141,7 @@ typedef struct {
 #define BGE_PROXY_PYOWNS(_self) (((PyObjectPlus_Proxy *)_self)->py_owns)
 
 /* Note, sometimes we dont care what BGE type this is as long as its a proxy */
-#define BGE_PROXY_CHECK_TYPE(_self) ((_self)->ob_type->tp_dealloc == py_base_dealloc)
+#define BGE_PROXY_CHECK_TYPE(_self) ((_self)->ob_type->tp_dealloc == PyObjectPlus::py_base_dealloc)
 
 
                                                                // This must be the first line of each 
index 7f4ed388442676494b076bb016242ab2f0c2de51..e6ef9733da8bcf93fd63f0bc7072edc4cb4da086 100644 (file)
@@ -555,15 +555,16 @@ PyAttributeDef CValue::Attributes[] = {
 
 
 PyObject*      CValue::py_getattro(PyObject *attr)
-{
-       ShowDeprecationWarning("val = ob.attr", "val = ob['attr']");
-       
+{      
        char *attr_str= PyString_AsString(attr);
        CValue* resultattr = GetProperty(attr_str);
        if (resultattr)
        {
+               /* only show the wanting here because python inspects for __class__ and KX_MeshProxy uses CValues name attr */
+               ShowDeprecationWarning("val = ob.attr", "val = ob['attr']");
+               
                PyObject* pyconvert = resultattr->ConvertValueToPython();
-       
+               
                if (pyconvert)
                        return pyconvert;
                else
index 66193a2f4b92dce3f9ec1865dbc8c1a591369c72..53d3be35f92b61ec836e2860ca10eece904b3bcf 100644 (file)
@@ -45,7 +45,7 @@ void SCA_Joystick::OnAxisMotion(SDL_Event* sdl_event)
 /* See notes below in the event loop */
 void SCA_Joystick::OnHatMotion(SDL_Event* sdl_event)
 {
-       if(sdl_event->jhat.hat >= JOYAXIS_MAX)
+       if(sdl_event->jhat.hat >= JOYHAT_MAX)
                return;
 
        m_hat_array[sdl_event->jhat.hat]= sdl_event->jhat.value;
index 00f7c5cad9346f0627c0873b77dcdd204dbbb8ca..a7ce4bc6930a57cb0c9a4d00124603b721651a30 100644 (file)
@@ -40,6 +40,7 @@
 #include "MT_Matrix4x4.h"
 
 #include "KX_Python.h"
+#include "PyObjectPlus.h"
 
 inline unsigned int Size(const MT_Matrix4x4&)          { return 4; }
 inline unsigned int Size(const MT_Matrix3x3&)          { return 3; }
@@ -116,6 +117,19 @@ bool PyVecTo(PyObject* pyval, T& vec)
                
                return true;
        }
+       else if (BGE_PROXY_CHECK_TYPE(pyval))
+       {       /* note, include this check because PySequence_Check does too much introspection
+                * on the PyObject (like getting its __class__, on a BGE type this means searching up
+                * the parent list each time only to discover its not a sequence.
+                * GameObjects are often used as an alternative to vectors so this is a common case
+                * better to do a quick check for it, likely the error below will be ignored.
+                * 
+                * This is not 'correct' since we have proxy type CListValues's which could
+                * contain floats/ints but there no cases of CValueLists being this way
+                */
+               PyErr_Format(PyExc_AttributeError, "expected a sequence type");
+               return false;
+       }
        else if (PySequence_Check(pyval))
        {
                unsigned int numitems = PySequence_Size(pyval);