blender/source/gameengine/Ketsji/CMakeLists.txt
Porteries Tristan 95164a09a7 BGE: generic python callback list + replace KX_PythonSeq.
I made this patch to declared a python list without converting all elements in python object (too slow) or use a CListValue which required CValue items (too expensive in memory).  In the case of a big list of points like a collision contacts points list, to use a CListValue we must implement a new class based on CValue for 3D vector to create a python proxy even if mathutils do it perfectly, we must also convert all points (frequently ~100 points) when fill the CListValue even if the list is not used (in the case of the collision callback). The easy way is to use callback (it doesn't worth to do an inheritance) which convert the item in PyObject only during an acces.
5 callbacks are used :
- Check if the list is valid = allow acces (like PyObjectPlus.invalid)
- Get the list size
- Get an item in the list by index.
- Get an item name in the list by index (used for operator `list["name"]`)
- Set an item in the list at the index position.
All of these callback take as first argument the client instance.
Why do we use a void * for the client instance ? : In KX_PythonInitTypes.cpp we have to initialize each python inherited class, if we use a template (the only other way) we must add this class each time we use a new type with in KX_PythonInitTypes.cpp

To check if the list can be accessed from python by the user, we check if the python proxy,  which is the `m_base` member, is still a valid proxy like in PyObjectPlus. But we can use a callback for more control of user access (e.g a list of collision point invalidate a frame later, in this case no real python owner).

This python list is easily defined with :
```
CPythonCallBackList(
void *client, // The client instance
PyObject *base, // The python instance which owned this list, used to know if the list is valid (like in KX_PythonSeq)
bool (*checkValid)(void *), // A callback to check if this list is till valid (optional)
int (*getSize)(void *), // A callback to get size
PyObject *(*getItem)(void *, int), // A callback to get an item
const char *(*getItemName)(void *, int), // A callback to get an item name (optional) use for acces by string key
bool (*setItem)(void *, int, PyObject *) // A callback to set an item (optional)
)
```
To show its usecase i replaced the odd KX_PythonSeq, it modify KX_Gameobject.sensors/controllers/actuators, SCA_IController.sensors/actuators and BL_ArmatureObject.constraints/channels.

Example : {F245193}, See message in console, press R to erase the object and see invalid proxy error message.

Reviewers: brita_, #game_python, youle, campbellbarton, moguri, agoose77, sergey

Reviewed By: campbellbarton, moguri, agoose77, sergey

Subscribers: sergey

Projects: #game_engine

Differential Revision: https://developer.blender.org/D1363
2015-10-26 20:27:08 +01:00

268 lines
5.9 KiB
CMake

# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# The Original Code is Copyright (C) 2006, Blender Foundation
# All rights reserved.
#
# The Original Code is: all of this file.
#
# Contributor(s): Jacques Beaurain.
#
# ***** END GPL LICENSE BLOCK *****
set(INC
.
KXNetwork
../BlenderRoutines
../Converter
../Expressions
../GameLogic
../Network
../Network/LoopBackNetwork
../Physics/common
../Rasterizer
../Rasterizer/RAS_OpenGLRasterizer
../SceneGraph
../../blender
../../blender/blenfont
../../blender/blenkernel
../../blender/blenlib
../../blender/blenloader
../../blender/gpu
../../blender/imbuf
../../blender/makesdna
../../blender/makesrna
../../blender/python
../../blender/python/generic
../../blender/python/mathutils
../../../intern/container
../../../intern/glew-mx
../../../intern/guardedalloc
../../../intern/string
)
set(INC_SYS
../../../intern/moto/include
../../../extern/recastnavigation/Recast/Include
../../../extern/recastnavigation/Detour/Include
${PTHREADS_INCLUDE_DIRS}
${GLEW_INCLUDE_PATH}
${BOOST_INCLUDE_DIR}
)
set(SRC
BL_Action.cpp
BL_ActionManager.cpp
BL_BlenderShader.cpp
BL_Material.cpp
BL_Shader.cpp
BL_Texture.cpp
KX_ArmatureSensor.cpp
KX_BlenderMaterial.cpp
KX_Camera.cpp
KX_CameraActuator.cpp
KX_CameraIpoSGController.cpp
KX_CharacterWrapper.cpp
KX_ConstraintActuator.cpp
KX_ConstraintWrapper.cpp
KX_Dome.cpp
KX_EmptyObject.cpp
KX_FontObject.cpp
KX_GameActuator.cpp
KX_GameObject.cpp
KX_IpoConvert.cpp
KX_IPO_SGController.cpp
KX_IpoActuator.cpp
KX_KetsjiEngine.cpp
KX_Light.cpp
KX_LightIpoSGController.cpp
KX_MaterialIpoController.cpp
KX_MeshProxy.cpp
KX_MotionState.cpp
KX_MouseActuator.cpp
KX_MouseFocusSensor.cpp
KX_NavMeshObject.cpp
KX_NearSensor.cpp
KX_ObColorIpoSGController.cpp
KX_ObjectActuator.cpp
KX_ObstacleSimulation.cpp
KX_OrientationInterpolator.cpp
KX_ParentActuator.cpp
KX_PolyProxy.cpp
KX_PositionInterpolator.cpp
KX_PyConstraintBinding.cpp
KX_PyMath.cpp
KX_PythonInit.cpp
KX_PythonInitTypes.cpp
KX_PythonMain.cpp
KX_RadarSensor.cpp
KX_RayCast.cpp
KX_RayEventManager.cpp
KX_RaySensor.cpp
KX_SCA_AddObjectActuator.cpp
KX_SCA_DynamicActuator.cpp
KX_SCA_EndObjectActuator.cpp
KX_SCA_ReplaceMeshActuator.cpp
KX_SG_BoneParentNodeRelationship.cpp
KX_SG_NodeRelationships.cpp
KX_ScalarInterpolator.cpp
KX_ScalingInterpolator.cpp
KX_Scene.cpp
KX_SceneActuator.cpp
KX_SoundActuator.cpp
KX_StateActuator.cpp
KX_SteeringActuator.cpp
KX_TimeCategoryLogger.cpp
KX_TimeLogger.cpp
KX_TouchEventManager.cpp
KX_TouchSensor.cpp
KX_TrackToActuator.cpp
KX_VehicleWrapper.cpp
KX_VertexProxy.cpp
KX_VisibilityActuator.cpp
KX_WorldInfo.cpp
KX_WorldIpoController.cpp
BL_Action.h
BL_ActionManager.h
BL_BlenderShader.h
BL_Material.h
BL_Shader.h
BL_Texture.h
KX_ArmatureSensor.h
KX_BlenderMaterial.h
KX_Camera.h
KX_CameraActuator.h
KX_CameraIpoSGController.h
KX_CharacterWrapper.h
KX_ClientObjectInfo.h
KX_ConstraintActuator.h
KX_ConstraintWrapper.h
KX_Dome.h
KX_EmptyObject.h
KX_FontObject.h
KX_GameActuator.h
KX_GameObject.h
KX_IInterpolator.h
KX_IpoConvert.h
KX_IPOTransform.h
KX_IPO_SGController.h
KX_IScalarInterpolator.h
KX_ISceneConverter.h
KX_ISystem.h
KX_IpoActuator.h
KX_KetsjiEngine.h
KX_Light.h
KX_LightIpoSGController.h
KX_MaterialIpoController.h
KX_MeshProxy.h
KX_MotionState.h
KX_MouseActuator.h
KX_MouseFocusSensor.h
KX_NavMeshObject.h
KX_NearSensor.h
KX_ObColorIpoSGController.h
KX_ObjectActuator.h
KX_ObstacleSimulation.h
KX_OrientationInterpolator.h
KX_ParentActuator.h
KX_PhysicsEngineEnums.h
KX_PolyProxy.h
KX_PositionInterpolator.h
KX_PyConstraintBinding.h
KX_PyMath.h
KX_PythonInit.h
KX_PythonInitTypes.h
KX_PythonMain.h
KX_RadarSensor.h
KX_RayCast.h
KX_RayEventManager.h
KX_RaySensor.h
KX_SCA_AddObjectActuator.h
KX_SCA_DynamicActuator.h
KX_SCA_EndObjectActuator.h
KX_SCA_ReplaceMeshActuator.h
KX_SG_BoneParentNodeRelationship.h
KX_SG_NodeRelationships.h
KX_ScalarInterpolator.h
KX_ScalingInterpolator.h
KX_Scene.h
KX_SceneActuator.h
KX_SoundActuator.h
KX_StateActuator.h
KX_SteeringActuator.h
KX_TimeCategoryLogger.h
KX_TimeLogger.h
KX_TouchEventManager.h
KX_TouchSensor.h
KX_TrackToActuator.h
KX_VehicleWrapper.h
KX_VertexProxy.h
KX_VisibilityActuator.h
KX_WorldInfo.h
KX_WorldIpoController.h
# orphan headers (not apart of a library)
../Physics/common/PHY_DynamicTypes.h
../Physics/common/PHY_ICharacter.h
../Physics/common/PHY_IController.h
../Physics/common/PHY_IGraphicController.h
../Physics/common/PHY_IMotionState.h
../Physics/common/PHY_IPhysicsController.h
../Physics/common/PHY_IPhysicsEnvironment.h
../Physics/common/PHY_IVehicle.h
../Physics/common/PHY_Pro.h
)
add_definitions(${GL_DEFINITIONS})
if(WITH_IMAGE_DDS)
add_definitions(-DWITH_DDS)
endif()
if(WITH_SDL)
list(APPEND INC_SYS
${SDL_INCLUDE_DIR}
)
add_definitions(-DWITH_SDL)
endif()
if(WITH_CODEC_FFMPEG)
add_definitions(-DWITH_FFMPEG)
endif()
if(WITH_AUDASPACE)
add_definitions(${AUDASPACE_DEFINITIONS})
list(APPEND INC_SYS
${AUDASPACE_C_INCLUDE_DIRS}
${AUDASPACE_PY_INCLUDE_DIRS}
)
endif()
if(WITH_BULLET)
list(APPEND INC
../Physics/Bullet
)
list(APPEND INC_SYS
${BULLET_INCLUDE_DIRS}
)
add_definitions(-DWITH_BULLET)
endif()
blender_add_lib(ge_logic_ketsji "${SRC}" "${INC}" "${INC_SYS}")