Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-05-14 11:59:44 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-05-14 11:59:44 +0400
commitd257586fe6d59f9a7c622b460fbe38a168fb5428 (patch)
tree48a84265c142ea1f7b7b96ce6dec1c5ed506ab3a /source/gameengine
parentd2cff7307d26ada0dd34949d0a9fbb3c37c72f19 (diff)
BGE Py API
scene.active_camera can now be set so you can more easily set the current camera from python scripts without using an actuator. ConvertPythonToCamera utility function to get a camera from a python string or KX_Camera type.
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp54
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h3
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp21
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h3
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp97
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.h2
-rw-r--r--source/gameengine/PyDoc/GameTypes.py41
8 files changed, 121 insertions, 104 deletions
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 3ea01cca5ca..df39faf8b22 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -933,3 +933,57 @@ PyObject* KX_Camera::pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *
PyObject* KX_Camera::pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{ return PyInt_FromLong(INTERSECT); }
+
+bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix)
+{
+ if (value==NULL) {
+ PyErr_Format(PyExc_TypeError, "%s, python pointer NULL, should never happen", error_prefix);
+ *object = NULL;
+ return false;
+ }
+
+ if (value==Py_None) {
+ *object = NULL;
+
+ if (py_none_ok) {
+ return true;
+ } else {
+ PyErr_Format(PyExc_TypeError, "%s, expected KX_Camera or a KX_Camera name, None is invalid", error_prefix);
+ return false;
+ }
+ }
+
+ if (PyString_Check(value)) {
+ STR_String value_str = PyString_AsString(value);
+ *object = KX_GetActiveScene()->FindCamera(value_str);
+
+ if (*object) {
+ return true;
+ } else {
+ PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_Camera in this scene", error_prefix, PyString_AsString(value));
+ return false;
+ }
+ }
+
+ if (PyObject_TypeCheck(value, &KX_Camera::Type)) {
+ *object = static_cast<KX_Camera*>BGE_PROXY_REF(value);
+
+ /* sets the error */
+ if (*object==NULL) {
+ PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix);
+ return false;
+ }
+
+ return true;
+ }
+
+ *object = NULL;
+
+ if (py_none_ok) {
+ PyErr_Format(PyExc_TypeError, "%s, expect a KX_Camera, a string or None", error_prefix);
+ } else {
+ PyErr_Format(PyExc_TypeError, "%s, expect a KX_Camera or a string", error_prefix);
+ }
+
+ return false;
+} \ No newline at end of file
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index e99a0594701..ce8bbb8d656 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -41,6 +41,9 @@
#include "IntValue.h"
#include "RAS_CameraData.h"
+/* utility conversion function */
+bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix);
+
class KX_Camera : public KX_GameObject
{
Py_Header;
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 4d01d96ced4..fe9fb8bb583 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -1819,9 +1819,7 @@ PyObject* KX_GameObject::py_getattro_dict() {
int KX_GameObject::py_setattro(PyObject *attr, PyObject *value) // py_setattro method
{
- int ret;
-
- ret= py_setattro__internal(attr, value);
+ int ret= py_setattro__internal(attr, value);
if (ret==PY_SET_ATTR_SUCCESS) {
/* remove attribute in our own dict to avoid double ups */
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index 84c6d374386..e3622c211ff 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -1703,13 +1703,27 @@ PyObject* KX_Scene::pyattr_get_active_camera(void *self_v, const KX_PYATTRIBUTE_
return self->GetActiveCamera()->GetProxy();
}
+
+int KX_Scene::pyattr_set_active_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_Scene* self= static_cast<KX_Scene*>(self_v);
+ KX_Camera *camOb;
+
+ if (!ConvertPythonToCamera(value, &camOb, false, "scene.active_camera = value: KX_Scene"))
+ return PY_SET_ATTR_FAIL;
+
+ self->SetActiveCamera(camOb);
+ return PY_SET_ATTR_SUCCESS;
+}
+
+
PyAttributeDef KX_Scene::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", KX_Scene, pyattr_get_name),
KX_PYATTRIBUTE_RO_FUNCTION("objects", KX_Scene, pyattr_get_objects),
KX_PYATTRIBUTE_RO_FUNCTION("objects_inactive", KX_Scene, pyattr_get_objects_inactive), KX_PYATTRIBUTE_RO_FUNCTION("lights", KX_Scene, pyattr_get_lights),
KX_PYATTRIBUTE_RO_FUNCTION("cameras", KX_Scene, pyattr_get_cameras),
KX_PYATTRIBUTE_RO_FUNCTION("lights", KX_Scene, pyattr_get_lights),
- KX_PYATTRIBUTE_RO_FUNCTION("active_camera", KX_Scene, pyattr_get_active_camera),
+ KX_PYATTRIBUTE_RW_FUNCTION("active_camera", KX_Scene, pyattr_get_active_camera, pyattr_set_active_camera),
KX_PYATTRIBUTE_BOOL_RO("suspended", KX_Scene, m_suspend),
KX_PYATTRIBUTE_BOOL_RO("activity_culling", KX_Scene, m_activity_culling),
KX_PYATTRIBUTE_FLOAT_RW("activity_culling_radius", 0.5f, FLT_MAX, KX_Scene, m_activity_box_radius),
@@ -1717,15 +1731,14 @@ PyAttributeDef KX_Scene::Attributes[] = {
{ NULL } //Sentinel
};
-
PyObject* KX_Scene::py_getattro__internal(PyObject *attr)
{
py_getattro_up(PyObjectPlus);
}
-int KX_Scene::py_setattro__internal(PyObject *attr, PyObject *pyvalue)
+int KX_Scene::py_setattro__internal(PyObject *attr, PyObject *value)
{
- return PyObjectPlus::py_setattro(attr, pyvalue);
+ py_setattro_up(PyObjectPlus);
}
PyObject* KX_Scene::py_getattro(PyObject *attr)
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index 128f8d23135..5191ea9f23f 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -566,11 +566,12 @@ public:
static PyObject* pyattr_get_lights(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_cameras(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_active_camera(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_active_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
virtual PyObject* py_getattro(PyObject *attr); /* name, active_camera, gravity, suspended, viewport, framing, activity_culling, activity_culling_radius */
virtual PyObject* py_getattro_dict();
- virtual int py_setattro(PyObject *attr, PyObject *pyvalue);
+ virtual int py_setattro(PyObject *attr, PyObject *value);
virtual int py_delattro(PyObject *attr);
virtual PyObject* py_repr(void) { return PyString_FromString(GetName().ReadPtr()); }
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp
index 64edb6cd6d5..1b790ec9824 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp
@@ -264,7 +264,7 @@ PyMethodDef KX_SceneActuator::Methods[] =
//Deprecated functions ------>
{"setUseRestart", (PyCFunction) KX_SceneActuator::sPySetUseRestart, METH_VARARGS, (PY_METHODCHAR)SetUseRestart_doc},
{"setScene", (PyCFunction) KX_SceneActuator::sPySetScene, METH_VARARGS, (PY_METHODCHAR)SetScene_doc},
- {"setCamera", (PyCFunction) KX_SceneActuator::sPySetCamera, METH_VARARGS, (PY_METHODCHAR)SetCamera_doc},
+ {"setCamera", (PyCFunction) KX_SceneActuator::sPySetCamera, METH_O, (PY_METHODCHAR)SetCamera_doc},
{"getUseRestart", (PyCFunction) KX_SceneActuator::sPyGetUseRestart, METH_NOARGS, (PY_METHODCHAR)GetUseRestart_doc},
{"getScene", (PyCFunction) KX_SceneActuator::sPyGetScene, METH_NOARGS, (PY_METHODCHAR)GetScene_doc},
{"getCamera", (PyCFunction) KX_SceneActuator::sPyGetCamera, METH_NOARGS, (PY_METHODCHAR)GetCamera_doc},
@@ -308,51 +308,21 @@ int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_
KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self);
KX_Camera *camOb;
- if(value==Py_None)
- {
- if (actuator->m_camera)
- actuator->m_camera->UnregisterActuator(actuator);
-
+ if (!ConvertPythonToCamera(value, &camOb, true, "actu.camera = value: KX_SceneActuator"))
+ return PY_SET_ATTR_FAIL;
+
+ if (actuator->m_camera)
+ actuator->m_camera->UnregisterActuator(actuator);
+
+ if(camOb==NULL) {
actuator->m_camera= NULL;
- return 0;
}
-
- if (PyObject_TypeCheck(value, &KX_Camera::Type))
- {
- KX_Camera *camOb= static_cast<KX_Camera*>BGE_PROXY_REF(value);
-
- if(camOb==NULL)
- {
- PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
- return 1;
- }
-
- if (actuator->m_camera)
- actuator->m_camera->UnregisterActuator(actuator);
-
+ else {
actuator->m_camera = camOb;
actuator->m_camera->RegisterActuator(actuator);
- return 0;
- }
-
- if (PyString_Check(value))
- {
- char *camName = PyString_AsString(value);
-
- camOb = actuator->FindCamera(camName);
- if (camOb)
- {
- if (actuator->m_camera)
- actuator->m_camera->UnregisterActuator(actuator);
- actuator->m_camera = camOb;
- actuator->m_camera->RegisterActuator(actuator);
- return 0;
- }
- PyErr_SetString(PyExc_TypeError, "not a valid camera name");
- return 1;
}
- PyErr_SetString(PyExc_TypeError, "expected a string or a camera object reference");
- return 1;
+
+ return PY_SET_ATTR_SUCCESS;
}
@@ -431,47 +401,24 @@ const char KX_SceneActuator::SetCamera_doc[] =
"setCamera(camera)\n"
"\t- camera: string\n"
"\tSet the camera to switch to.\n" ;
-PyObject* KX_SceneActuator::PySetCamera(PyObject* args)
+PyObject* KX_SceneActuator::PySetCamera(PyObject* value)
{
ShowDeprecationWarning("setCamera()", "the camera property");
- PyObject *cam;
- if (PyArg_ParseTuple(args, "O!:setCamera", &KX_Camera::Type, &cam))
- {
- KX_Camera *new_camera;
-
- new_camera = static_cast<KX_Camera*>BGE_PROXY_REF(cam);
- if(new_camera==NULL)
- {
- PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
- return NULL;
- }
-
- if (m_camera)
- m_camera->UnregisterActuator(this);
-
- m_camera= new_camera;
-
- m_camera->RegisterActuator(this);
- Py_RETURN_NONE;
- }
- PyErr_Clear();
-
- /* one argument: a scene, ignore the rest */
- char *camName;
- if(!PyArg_ParseTuple(args, "s:setCamera", &camName))
- {
+ KX_Camera *camOb;
+
+ if (!ConvertPythonToCamera(value, &camOb, true, "actu.setCamera(value): KX_SceneActuator"))
return NULL;
+
+ if (m_camera)
+ m_camera->UnregisterActuator(this);
+
+ if(camOb==NULL) {
+ m_camera= NULL;
}
-
- KX_Camera *camOb = FindCamera(camName);
- if (camOb)
- {
- if (m_camera)
- m_camera->UnregisterActuator(this);
+ else {
m_camera = camOb;
m_camera->RegisterActuator(this);
}
-
Py_RETURN_NONE;
}
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.h b/source/gameengine/Ketsji/KX_SceneActuator.h
index 315e97e8f70..2412dd02590 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.h
+++ b/source/gameengine/Ketsji/KX_SceneActuator.h
@@ -108,7 +108,7 @@ class KX_SceneActuator : public SCA_IActuator
/* 5. getScene: */
KX_PYMETHOD_DOC_NOARGS(KX_SceneActuator,GetScene);
/* 6. setCamera: */
- KX_PYMETHOD_DOC_VARARGS(KX_SceneActuator,SetCamera);
+ KX_PYMETHOD_DOC_O(KX_SceneActuator,SetCamera);
/* 7. getCamera: */
KX_PYMETHOD_DOC_NOARGS(KX_SceneActuator,GetCamera);
diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py
index 6758824611c..e560489f91f 100644
--- a/source/gameengine/PyDoc/GameTypes.py
+++ b/source/gameengine/PyDoc/GameTypes.py
@@ -235,7 +235,7 @@ class SCA_IController(SCA_ILogicBrick):
"""
Get the controllers state bitmask, this can be used with the GameObject's state to test if the the controller is active.
This for instance will always be true however you could compare with a previous state to see when the state was activated.
- GameLogic.getCurrentController().getState() & GameLogic.getCurrentController().getOwner().getState()
+ GameLogic.getCurrentController().state & GameLogic.getCurrentController().owner.state
@deprecated: Use the L{state} property
@rtype: int
"""
@@ -2126,7 +2126,7 @@ class KX_LightObject(KX_GameObject):
import GameLogic
co = GameLogic.getCurrentController()
- light = co.getOwner()
+ light = co.owner
light.energy = 1.0
light.colour = [1.0, 0.0, 0.0]
@@ -2187,8 +2187,8 @@ class KX_MeshProxy(SCA_IObject):
The correct method of iterating over every L{KX_VertexProxy} in a game object::
import GameLogic
- co = GameLogic.getcurrentController()
- obj = co.getOwner()
+ co = GameLogic.getCurrentController()
+ obj = co.owner
m_i = 0
mesh = obj.getMesh(m_i) # There can be more than one mesh...
@@ -3177,9 +3177,9 @@ class KX_PolygonMaterial:
self.pass_no = 0
return False
- obj = GameLogic.getCurrentController().getOwner()
+ obj = GameLogic.getCurrentController().owner
- mesh = obj.getMesh(0)
+ mesh = obj.meshes[0]
for mat in mesh.materials:
mat.setCustomMaterial(MyMaterial())
@@ -3596,8 +3596,8 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
)
co = GameLogic.getCurrentController()
- obj = co.getOwner()
- act = co.getActuator("LOD." + obj.name)
+ obj = co.owner
+ act = co.actuators["LOD." + obj.name]
cam = GameLogic.getCurrentScene().active_camera
def Depth(pos, plane):
@@ -3684,7 +3684,7 @@ class KX_Scene(PyObjectPlus):
# Get the depth of an object in the camera view.
import GameLogic
- obj = GameLogic.getCurrentController().getOwner()
+ obj = GameLogic.getCurrentController().owner
cam = GameLogic.getCurrentScene().active_camera
# Depth is negative and decreasing further from the camera
@@ -3692,19 +3692,20 @@ class KX_Scene(PyObjectPlus):
@bug: All attributes are read only at the moment.
- @ivar name: The scene's name
+ @ivar name: The scene's name, (read-only).
@type name: string
- @ivar objects: A list of objects in the scene.
+ @ivar objects: A list of objects in the scene, (read-only).
@type objects: L{CListValue} of L{KX_GameObject}
- @ivar objects_inactive: A list of objects on background layers (used for the addObject actuator).
+ @ivar objects_inactive: A list of objects on background layers (used for the addObject actuator), (read-only).
@type objects_inactive: L{CListValue} of L{KX_GameObject}
- @ivar lights: A list of lights in the scene.
+ @ivar lights: A list of lights in the scene, (read-only).
@type lights: L{CListValue} of L{KX_LightObject}
- @ivar cameras: A list of cameras in the scene.
+ @ivar cameras: A list of cameras in the scene, (read-only).
@type cameras: L{CListValue} of L{KX_Camera}
- @ivar active_camera: The current active camera
+ @ivar active_camera: The current active camera.
+ @note: this can be set directly from python to avoid using the L{KX_SceneActuator}
@type active_camera: L{KX_Camera}
- @ivar suspended: True if the scene is suspended.
+ @ivar suspended: True if the scene is suspended, (read-only).
@type suspended: boolean
@ivar activity_culling: True if the scene is activity culling
@type activity_culling: boolean
@@ -5328,7 +5329,7 @@ class KX_Camera(KX_GameObject):
Example::
import GameLogic
co = GameLogic.getCurrentController()
- cam = co.GetOwner()
+ cam = co.owner
# A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0]
if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE):
@@ -5344,7 +5345,7 @@ class KX_Camera(KX_GameObject):
Example::
import GameLogic
co = GameLogic.getCurrentController()
- cam = co.GetOwner()
+ cam = co.owner
# Box to test...
box = []
@@ -5374,7 +5375,7 @@ class KX_Camera(KX_GameObject):
Example::
import GameLogic
co = GameLogic.getCurrentController()
- cam = co.GetOwner()
+ cam = co.owner
# Test point [0.0, 0.0, 0.0]
if (cam.pointInsideFrustum([0.0, 0.0, 0.0])):
@@ -5451,7 +5452,7 @@ class KX_Camera(KX_GameObject):
[1.0/cam.scaling[0], 1.0/cam.scaling[1], 1.0/cam.scaling[2], 1.0])
co = GameLogic.getCurrentController()
- cam = co.getOwner()
+ cam = co.owner
cam.setProjectionMatrix(Perspective(cam)))
@type matrix: 4x4 matrix.