38
38
#include "KX_Python.h"
39
39
#include "KX_PyMath.h"
40
40
KX_Camera::KX_Camera(void* sgReplicationInfo,
41
SG_Callbacks callbacks,
42
const RAS_CameraData& camdata,
46
KX_GameObject(sgReplicationInfo,callbacks),
50
m_frustum_culling(frustum_culling),
51
m_set_projection_matrix(false),
52
m_set_frustum_center(false),
53
m_delete_node(delete_node)
41
SG_Callbacks callbacks,
42
const RAS_CameraData& camdata,
46
KX_GameObject(sgReplicationInfo,callbacks),
50
m_frustum_culling(frustum_culling),
51
m_set_projection_matrix(false),
52
m_set_frustum_center(false),
53
m_delete_node(delete_node)
55
55
// setting a name would be nice...
667
667
if (PyVecTo(value, point))
669
return PyLong_FromSsize_t(PointInsideFrustum(point)); /* new ref */
669
return PyLong_FromLong(PointInsideFrustum(point)); /* new ref */
672
672
PyErr_SetString(PyExc_TypeError, "camera.pointInsideFrustum(point): KX_Camera, expected point argument.");
715
PyObject* KX_Camera::pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
715
PyObject *KX_Camera::pyattr_get_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
717
KX_Camera* self= static_cast<KX_Camera*>(self_v);
717
KX_Camera* self = static_cast<KX_Camera*>(self_v);
718
718
return PyBool_FromLong(self->m_camdata.m_perspective);
721
721
int KX_Camera::pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
723
KX_Camera* self= static_cast<KX_Camera*>(self_v);
723
KX_Camera* self = static_cast<KX_Camera*>(self_v);
724
724
int param = PyObject_IsTrue( value );
725
725
if (param == -1) {
726
726
PyErr_SetString(PyExc_AttributeError, "camera.perspective = bool: KX_Camera, expected True/False or 0/1");
732
732
return PY_SET_ATTR_SUCCESS;
735
PyObject* KX_Camera::pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
735
PyObject *KX_Camera::pyattr_get_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
737
KX_Camera* self= static_cast<KX_Camera*>(self_v);
737
KX_Camera* self = static_cast<KX_Camera*>(self_v);
738
738
return PyFloat_FromDouble(self->m_camdata.m_lens);
741
741
int KX_Camera::pyattr_set_lens(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
743
KX_Camera* self= static_cast<KX_Camera*>(self_v);
743
KX_Camera* self = static_cast<KX_Camera*>(self_v);
744
744
float param = PyFloat_AsDouble(value);
745
745
if (param == -1) {
746
746
PyErr_SetString(PyExc_AttributeError, "camera.lens = float: KX_Camera, expected a float greater then zero");
752
752
return PY_SET_ATTR_SUCCESS;
755
PyObject* KX_Camera::pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
755
PyObject *KX_Camera::pyattr_get_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
757
KX_Camera* self= static_cast<KX_Camera*>(self_v);
757
KX_Camera* self = static_cast<KX_Camera*>(self_v);
758
758
return PyFloat_FromDouble(self->m_camdata.m_scale);
761
761
int KX_Camera::pyattr_set_ortho_scale(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
763
KX_Camera* self= static_cast<KX_Camera*>(self_v);
763
KX_Camera* self = static_cast<KX_Camera*>(self_v);
764
764
float param = PyFloat_AsDouble(value);
765
765
if (param == -1) {
766
766
PyErr_SetString(PyExc_AttributeError, "camera.ortho_scale = float: KX_Camera, expected a float greater then zero");
772
772
return PY_SET_ATTR_SUCCESS;
775
PyObject* KX_Camera::pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
775
PyObject *KX_Camera::pyattr_get_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
777
KX_Camera* self= static_cast<KX_Camera*>(self_v);
777
KX_Camera* self = static_cast<KX_Camera*>(self_v);
778
778
return PyFloat_FromDouble(self->m_camdata.m_clipstart);
781
781
int KX_Camera::pyattr_set_near(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
783
KX_Camera* self= static_cast<KX_Camera*>(self_v);
783
KX_Camera* self = static_cast<KX_Camera*>(self_v);
784
784
float param = PyFloat_AsDouble(value);
785
785
if (param == -1) {
786
786
PyErr_SetString(PyExc_AttributeError, "camera.near = float: KX_Camera, expected a float greater then zero");
792
792
return PY_SET_ATTR_SUCCESS;
795
PyObject* KX_Camera::pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
795
PyObject *KX_Camera::pyattr_get_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
797
KX_Camera* self= static_cast<KX_Camera*>(self_v);
797
KX_Camera* self = static_cast<KX_Camera*>(self_v);
798
798
return PyFloat_FromDouble(self->m_camdata.m_clipend);
801
801
int KX_Camera::pyattr_set_far(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
803
KX_Camera* self= static_cast<KX_Camera*>(self_v);
803
KX_Camera* self = static_cast<KX_Camera*>(self_v);
804
804
float param = PyFloat_AsDouble(value);
805
805
if (param == -1) {
806
806
PyErr_SetString(PyExc_AttributeError, "camera.far = float: KX_Camera, expected a float greater then zero");
816
PyObject* KX_Camera::pyattr_get_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
816
PyObject *KX_Camera::pyattr_get_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
818
KX_Camera* self= static_cast<KX_Camera*>(self_v);
818
KX_Camera* self = static_cast<KX_Camera*>(self_v);
819
819
return PyBool_FromLong(self->GetViewport());
822
822
int KX_Camera::pyattr_set_use_viewport(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
824
KX_Camera* self= static_cast<KX_Camera*>(self_v);
824
KX_Camera* self = static_cast<KX_Camera*>(self_v);
825
825
int param = PyObject_IsTrue( value );
826
826
if (param == -1) {
827
827
PyErr_SetString(PyExc_AttributeError, "camera.useViewport = bool: KX_Camera, expected True or False");
835
PyObject* KX_Camera::pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
835
PyObject *KX_Camera::pyattr_get_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
837
KX_Camera* self= static_cast<KX_Camera*>(self_v);
837
KX_Camera* self = static_cast<KX_Camera*>(self_v);
838
838
return PyObjectFrom(self->GetProjectionMatrix());
841
841
int KX_Camera::pyattr_set_projection_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
843
KX_Camera* self= static_cast<KX_Camera*>(self_v);
843
KX_Camera* self = static_cast<KX_Camera*>(self_v);
844
844
MT_Matrix4x4 mat;
845
845
if (!PyMatTo(value, mat))
846
846
return PY_SET_ATTR_FAIL;
849
849
return PY_SET_ATTR_SUCCESS;
852
PyObject* KX_Camera::pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
852
PyObject *KX_Camera::pyattr_get_modelview_matrix(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
854
KX_Camera* self= static_cast<KX_Camera*>(self_v);
854
KX_Camera* self = static_cast<KX_Camera*>(self_v);
855
855
return PyObjectFrom(self->GetModelviewMatrix());
858
PyObject* KX_Camera::pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
858
PyObject *KX_Camera::pyattr_get_camera_to_world(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
860
KX_Camera* self= static_cast<KX_Camera*>(self_v);
860
KX_Camera* self = static_cast<KX_Camera*>(self_v);
861
861
return PyObjectFrom(self->GetCameraToWorld());
864
PyObject* KX_Camera::pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
864
PyObject *KX_Camera::pyattr_get_world_to_camera(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
866
KX_Camera* self= static_cast<KX_Camera*>(self_v);
866
KX_Camera* self = static_cast<KX_Camera*>(self_v);
867
867
return PyObjectFrom(self->GetWorldToCamera());
871
PyObject* KX_Camera::pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
872
{ return PyLong_FromSsize_t(INSIDE); }
873
PyObject* KX_Camera::pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
874
{ return PyLong_FromSsize_t(OUTSIDE); }
875
PyObject* KX_Camera::pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
876
{ return PyLong_FromSsize_t(INTERSECT); }
879
bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix)
871
PyObject *KX_Camera::pyattr_get_INSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
872
{ return PyLong_FromLong(INSIDE); }
873
PyObject *KX_Camera::pyattr_get_OUTSIDE(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
874
{ return PyLong_FromLong(OUTSIDE); }
875
PyObject *KX_Camera::pyattr_get_INTERSECT(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
876
{ return PyLong_FromLong(INTERSECT); }
879
bool ConvertPythonToCamera(PyObject *value, KX_Camera **object, bool py_none_ok, const char *error_prefix)
881
881
if (value==NULL) {
882
882
PyErr_Format(PyExc_TypeError, "%s, python pointer NULL, should never happen", error_prefix);
967
967
m_modelmatrix.getValue(modelmatrix);
968
968
m_projmatrix.getValue(projmatrix);
970
glGetIntegerv(GL_VIEWPORT, viewport);
970
viewport = KX_GetActiveEngine()->GetCanvas()->GetViewPort();
972
972
gluProject(vect[0], vect[1], vect[2], modelmatrix, projmatrix, viewport, &win[0], &win[1], &win[2]);
977
977
vect[1] = 1.0 - vect[1]; //to follow Blender window coordinate system (Top-Down)
979
PyObject* ret = PyTuple_New(2);
979
PyObject *ret = PyTuple_New(2);
981
981
PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(vect[0]));
982
982
PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(vect[1]));
1010
1010
m_modelmatrix.getValue(modelmatrix);
1011
1011
m_projmatrix.getValue(projmatrix);
1013
glGetIntegerv(GL_VIEWPORT, viewport);
1013
viewport = KX_GetActiveEngine()->GetCanvas()->GetViewPort();
1015
1015
vect[0] = x * viewport[2];
1016
1016
vect[1] = y * viewport[3];
1040
1040
if (!PyArg_ParseTuple(args,"ddd|s:getScreenRay",&x,&y,&dist,&propName))
1043
PyObject* argValue = PyTuple_New(2);
1043
PyObject *argValue = PyTuple_New(2);
1044
1044
PyTuple_SET_ITEM(argValue, 0, PyFloat_FromDouble(x));
1045
1045
PyTuple_SET_ITEM(argValue, 1, PyFloat_FromDouble(y));
1049
1049
Py_DECREF(argValue);
1050
1050
PyErr_SetString(PyExc_TypeError,
1051
"Error in getScreenRay. Invalid 2D coordinate. Expected a normalized 2D screen coordinate, a distance and an optional property argument");
1051
"Error in getScreenRay. Invalid 2D coordinate. "
1052
"Expected a normalized 2D screen coordinate, "
1053
"a distance and an optional property argument");
1054
1056
Py_DECREF(argValue);