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:
Diffstat (limited to 'source/gameengine/Ketsji/KX_MouseActuator.cpp')
-rw-r--r--source/gameengine/Ketsji/KX_MouseActuator.cpp539
1 files changed, 0 insertions, 539 deletions
diff --git a/source/gameengine/Ketsji/KX_MouseActuator.cpp b/source/gameengine/Ketsji/KX_MouseActuator.cpp
deleted file mode 100644
index 6aa0d588b50..00000000000
--- a/source/gameengine/Ketsji/KX_MouseActuator.cpp
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * ***** 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.
- *
- * Contributor(s): Geoffrey Gollmer, Jorge Bernal
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "KX_MouseActuator.h"
-#include "KX_KetsjiEngine.h"
-#include "SCA_MouseManager.h"
-#include "SCA_IInputDevice.h"
-#include "RAS_ICanvas.h"
-#include "KX_GameObject.h"
-#include "MT_Vector3.h"
-#include "MT_Scalar.h"
-#include "MT_assert.h"
-#include "limits.h"
-
-#include "BLI_math.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* Native functions */
-/* ------------------------------------------------------------------------- */
-
-KX_MouseActuator::KX_MouseActuator(
- SCA_IObject* gameobj,
-
- KX_KetsjiEngine* ketsjiEngine,
- SCA_MouseManager* eventmgr,
- int acttype,
- bool visible,
- bool* use_axis,
- float* threshold,
- bool* reset,
- int* object_axis,
- bool* local,
- float* sensitivity,
- float* limit_x,
- float* limit_y
-):
- SCA_IActuator(gameobj, KX_ACT_MOUSE),
- m_ketsji(ketsjiEngine),
- m_eventmgr(eventmgr),
- m_type(acttype),
- m_visible(visible),
- m_use_axis_x(use_axis[0]),
- m_use_axis_y(use_axis[1]),
- m_reset_x(reset[0]),
- m_reset_y(reset[1]),
- m_local_x(local[0]),
- m_local_y(local[1])
-{
- m_canvas = m_ketsji->GetCanvas();
- m_oldposition[0] = m_oldposition[1] = -1.f;
- m_limit_x[0] = limit_x[0];
- m_limit_x[1] = limit_x[1];
- m_limit_y[0] = limit_y[0];
- m_limit_y[1] = limit_y[1];
- m_threshold[0] = threshold[0];
- m_threshold[1] = threshold[1];
- m_object_axis[0] = object_axis[0];
- m_object_axis[1] = object_axis[1];
- m_sensitivity[0] = sensitivity[0];
- m_sensitivity[1] = sensitivity[1];
- m_angle[0] = 0.f;
- m_angle[1] = 0.f;
-}
-
-KX_MouseActuator::~KX_MouseActuator()
-{
-}
-
-bool KX_MouseActuator::Update()
-{
- bool result = false;
-
- bool bNegativeEvent = IsNegativeEvent();
- RemoveAllEvents();
-
- if (bNegativeEvent)
- return false; // do nothing on negative events
-
- KX_GameObject *parent = static_cast<KX_GameObject *>(GetParent());
-
- m_mouse = ((SCA_MouseManager *)m_eventmgr)->GetInputDevice();
-
- switch (m_type) {
- case KX_ACT_MOUSE_VISIBILITY:
- {
- if (m_visible) {
- if (m_canvas) {
- m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
- }
- }
- else {
- if (m_canvas) {
- m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
- }
- }
- break;
- }
- case KX_ACT_MOUSE_LOOK:
- {
- if (m_mouse) {
-
- float position[2];
- float movement[2];
- MT_Vector3 rotation;
- float setposition[2] = {0.0f};
- float center_x = 0.5f, center_y = 0.5f;
-
- getMousePosition(position);
-
- movement[0] = position[0];
- movement[1] = position[1];
-
- //preventing undesired drifting when resolution is odd
- if ((m_canvas->GetWidth() % 2) != 0) {
- center_x = ((m_canvas->GetWidth() - 1.0f) / 2.0f) / (m_canvas->GetWidth());
- }
- if ((m_canvas->GetHeight() % 2) != 0) {
- center_y = ((m_canvas->GetHeight() - 1.0f) / 2.0f) / (m_canvas->GetHeight());
- }
-
- //preventing initial skipping.
- if ((m_oldposition[0] <= -0.9f) && (m_oldposition[1] <= -0.9f)) {
-
- if (m_reset_x) {
- m_oldposition[0] = center_x;
- }
- else {
- m_oldposition[0] = position[0];
- }
-
- if (m_reset_y) {
- m_oldposition[1] = center_y;
- }
- else {
- m_oldposition[1] = position[1];
- }
- setMousePosition(m_oldposition[0], m_oldposition[1]);
- break;
- }
-
- //Calculating X axis.
- if (m_use_axis_x) {
-
- if (m_reset_x) {
- setposition[0] = center_x;
- movement[0] -= center_x;
- }
- else {
- setposition[0] = position[0];
- movement[0] -= m_oldposition[0];
- }
-
- movement[0] *= -1.0f;
-
- /* Don't apply the rotation when we are under a certain threshold for mouse
- movement */
-
- if (((movement[0] > (m_threshold[0] / 10.0f)) ||
- ((movement[0] * (-1.0f)) > (m_threshold[0] / 10.0f)))) {
-
- movement[0] *= m_sensitivity[0];
-
- if ((m_limit_x[0] != 0.0f) && ((m_angle[0] + movement[0]) <= m_limit_x[0])) {
- movement[0] = m_limit_x[0] - m_angle[0];
- }
-
- if ((m_limit_x[1] != 0.0f) && ((m_angle[0] + movement[0]) >= m_limit_x[1])) {
- movement[0] = m_limit_x[1] - m_angle[0];
- }
-
- m_angle[0] += movement[0];
-
- switch (m_object_axis[0]) {
- case KX_ACT_MOUSE_OBJECT_AXIS_X:
- {
- rotation = MT_Vector3(movement[0], 0.0f, 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Y:
- {
- rotation = MT_Vector3(0.0f, movement[0], 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Z:
- {
- rotation = MT_Vector3(0.0f, 0.0f, movement[0]);
- break;
- }
- default:
- break;
- }
- parent->ApplyRotation(rotation, m_local_x);
- }
- }
- else {
- setposition[0] = center_x;
- }
-
- //Calculating Y axis.
- if (m_use_axis_y) {
-
- if (m_reset_y) {
- setposition[1] = center_y;
- movement[1] -= center_y;
- }
- else {
- setposition[1] = position[1];
- movement[1] -= m_oldposition[1];
- }
-
- movement[1] *= -1.0f;
-
- /* Don't apply the rotation when we are under a certain threshold for mouse
- movement */
-
- if (((movement[1] > (m_threshold[1] / 10.0f)) ||
- ((movement[1] * (-1.0f)) > (m_threshold[1] / 10.0f)))) {
-
- movement[1] *= m_sensitivity[1];
-
- if ((m_limit_y[0] != 0.0f) && ((m_angle[1] + movement[1]) <= m_limit_y[0])) {
- movement[1] = m_limit_y[0] - m_angle[1];
- }
-
- if ((m_limit_y[1] != 0.0f) && ((m_angle[1] + movement[1]) >= m_limit_y[1])) {
- movement[1] = m_limit_y[1] - m_angle[1];
- }
-
- m_angle[1] += movement[1];
-
- switch (m_object_axis[1])
- {
- case KX_ACT_MOUSE_OBJECT_AXIS_X:
- {
- rotation = MT_Vector3(movement[1], 0.0f, 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Y:
- {
- rotation = MT_Vector3(0.0f, movement[1], 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Z:
- {
- rotation = MT_Vector3(0.0f, 0.0f, movement[1]);
- break;
- }
- default:
- break;
- }
- parent->ApplyRotation(rotation, m_local_y);
- }
- }
- else {
- setposition[1] = center_y;
- }
-
- // only trigger mouse event when it is necessary
- if (m_oldposition[0] != position[0] || m_oldposition[1] != position[1]) {
- setMousePosition(setposition[0], setposition[1]);
- }
-
- m_oldposition[0] = position[0];
- m_oldposition[1] = position[1];
-
- }
- else {
- //printf("\nNo input device detected for mouse actuator\n");
- }
- break;
- }
- default:
- break;
- }
- return result;
-}
-
-bool KX_MouseActuator::isValid(KX_MouseActuator::KX_ACT_MOUSE_MODE mode)
-{
- return ((mode > KX_ACT_MOUSE_NODEF) && (mode < KX_ACT_MOUSE_MAX));
-}
-
-
-CValue* KX_MouseActuator::GetReplica()
-{
- KX_MouseActuator* replica = new KX_MouseActuator(*this);
-
- replica->ProcessReplica();
- return replica;
-}
-
-void KX_MouseActuator::ProcessReplica()
-{
- SCA_IActuator::ProcessReplica();
-}
-
-void KX_MouseActuator::getMousePosition(float* pos)
-{
- MT_assert(m_mouse);
- const SCA_InputEvent & xevent = m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEX);
- const SCA_InputEvent & yevent = m_mouse->GetEventValue(SCA_IInputDevice::KX_MOUSEY);
-
- pos[0] = m_canvas->GetMouseNormalizedX(xevent.m_eventval);
- pos[1] = m_canvas->GetMouseNormalizedY(yevent.m_eventval);
-}
-
-void KX_MouseActuator::setMousePosition(float fx, float fy)
-{
- int x, y;
-
- x = (int)(fx * m_canvas->GetWidth());
- y = (int)(fy * m_canvas->GetHeight());
-
- m_canvas->SetMousePosition(x, y);
-}
-
-#ifdef WITH_PYTHON
-
-/* ------------------------------------------------------------------------- */
-/* Python functions */
-/* ------------------------------------------------------------------------- */
-
-/* Integration hooks ------------------------------------------------------- */
-PyTypeObject KX_MouseActuator::Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "KX_MouseActuator",
- sizeof(PyObjectPlus_Proxy),
- 0,
- py_base_dealloc,
- 0,
- 0,
- 0,
- 0,
- py_base_repr,
- 0,0,0,0,0,0,0,0,0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- 0,0,0,0,0,0,0,
- Methods,
- 0,
- 0,
- &SCA_IActuator::Type,
- 0,0,0,0,0,0,
- py_base_new
-};
-
-PyMethodDef KX_MouseActuator::Methods[] = {
- {"reset", (PyCFunction) KX_MouseActuator::sPyReset, METH_NOARGS,"reset() : undo rotation caused by actuator\n"},
- {NULL,NULL} //Sentinel
-};
-
-
-
-PyAttributeDef KX_MouseActuator::Attributes[] = {
- KX_PYATTRIBUTE_BOOL_RW("visible", KX_MouseActuator, m_visible),
- KX_PYATTRIBUTE_BOOL_RW("use_axis_x", KX_MouseActuator, m_use_axis_x),
- KX_PYATTRIBUTE_BOOL_RW("use_axis_y", KX_MouseActuator, m_use_axis_y),
- KX_PYATTRIBUTE_FLOAT_ARRAY_RW("threshold", 0.0f, 0.5f, KX_MouseActuator, m_threshold, 2),
- KX_PYATTRIBUTE_BOOL_RW("reset_x", KX_MouseActuator, m_reset_x),
- KX_PYATTRIBUTE_BOOL_RW("reset_y", KX_MouseActuator, m_reset_y),
- KX_PYATTRIBUTE_INT_ARRAY_RW("object_axis", 0, 2, 1, KX_MouseActuator, m_object_axis, 2),
- KX_PYATTRIBUTE_BOOL_RW("local_x", KX_MouseActuator, m_local_x),
- KX_PYATTRIBUTE_BOOL_RW("local_y", KX_MouseActuator, m_local_y),
- KX_PYATTRIBUTE_FLOAT_ARRAY_RW("sensitivity", -FLT_MAX, FLT_MAX, KX_MouseActuator, m_sensitivity, 2),
- KX_PYATTRIBUTE_RW_FUNCTION("limit_x", KX_MouseActuator, pyattr_get_limit_x, pyattr_set_limit_x),
- KX_PYATTRIBUTE_RW_FUNCTION("limit_y", KX_MouseActuator, pyattr_get_limit_y, pyattr_set_limit_y),
- KX_PYATTRIBUTE_RW_FUNCTION("angle", KX_MouseActuator, pyattr_get_angle, pyattr_set_angle),
- { NULL } //Sentinel
-};
-
-PyObject* KX_MouseActuator::pyattr_get_limit_x(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
- return Py_BuildValue("[f,f]", (self->m_limit_x[0] / (float)M_PI * 180.0f), (self->m_limit_x[1] / (float)M_PI * 180.0f));
-}
-
-int KX_MouseActuator::pyattr_set_limit_x(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- PyObject *item1, *item2;
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
-
- if (!PyList_Check(value))
- return PY_SET_ATTR_FAIL;
-
- if (PyList_Size(value) != 2)
- return PY_SET_ATTR_FAIL;
-
- item1 = PyList_GET_ITEM(value, 0);
- item2 = PyList_GET_ITEM(value, 1);
-
- if (!(PyFloat_Check(item1)) || !(PyFloat_Check(item2))) {
- return PY_SET_ATTR_FAIL;
- }
- else {
- self->m_limit_x[0] = (float)((PyFloat_AsDouble(item1) * M_PI) / 180.0f);
- self->m_limit_x[1] = (float)((PyFloat_AsDouble(item2) * M_PI) / 180.0f);
- }
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-PyObject* KX_MouseActuator::pyattr_get_limit_y(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
- return Py_BuildValue("[f,f]", (self->m_limit_y[0] / (float)M_PI * 180.0f), (self->m_limit_y[1] / (float)M_PI * 180.0f));
-}
-
-int KX_MouseActuator::pyattr_set_limit_y(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- PyObject *item1, *item2;
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
-
- if (!PyList_Check(value))
- return PY_SET_ATTR_FAIL;
-
- if (PyList_Size(value) != 2)
- return PY_SET_ATTR_FAIL;
-
- item1 = PyList_GET_ITEM(value, 0);
- item2 = PyList_GET_ITEM(value, 1);
-
- if (!(PyFloat_Check(item1)) || !(PyFloat_Check(item2))) {
- return PY_SET_ATTR_FAIL;
- }
- else {
- self->m_limit_y[0] = (float)((PyFloat_AsDouble(item1) * M_PI) / 180.0f);
- self->m_limit_y[1] = (float)((PyFloat_AsDouble(item2) * M_PI) / 180.0f);
- }
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-PyObject* KX_MouseActuator::pyattr_get_angle(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
-{
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
- return Py_BuildValue("[f,f]", (self->m_angle[0] / (float)M_PI * 180.0f), (self->m_angle[1] / (float)M_PI * 180.0f));
-}
-
-int KX_MouseActuator::pyattr_set_angle(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
-{
- PyObject *item1, *item2;
- KX_MouseActuator* self= static_cast<KX_MouseActuator*>(self_v);
-
- if (!PyList_Check(value))
- return PY_SET_ATTR_FAIL;
-
- if (PyList_Size(value) != 2)
- return PY_SET_ATTR_FAIL;
-
- item1 = PyList_GET_ITEM(value, 0);
- item2 = PyList_GET_ITEM(value, 1);
-
- if (!(PyFloat_Check(item1)) || !(PyFloat_Check(item2))) {
- return PY_SET_ATTR_FAIL;
- }
- else {
- self->m_angle[0] = ((float)(PyFloat_AsDouble(item1) * M_PI) / 180.0f);
- self->m_angle[1] = ((float)(PyFloat_AsDouble(item2) * M_PI) / 180.0f);
- }
-
- return PY_SET_ATTR_SUCCESS;
-}
-
-PyObject* KX_MouseActuator::PyReset()
-{
- MT_Vector3 rotation;
- KX_GameObject *parent = static_cast<KX_GameObject *>(GetParent());
-
- switch (m_object_axis[0]) {
- case KX_ACT_MOUSE_OBJECT_AXIS_X:
- {
- rotation = MT_Vector3(-1.0f * m_angle[0], 0.0f, 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Y:
- {
- rotation = MT_Vector3(0.0f, -1.0f * m_angle[0], 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Z:
- {
- rotation = MT_Vector3(0.0f, 0.0f, -1.0f * m_angle[0]);
- break;
- }
- default:
- break;
- }
- parent->ApplyRotation(rotation, m_local_x);
-
- switch (m_object_axis[1]) {
- case KX_ACT_MOUSE_OBJECT_AXIS_X:
- {
- rotation = MT_Vector3(-1.0f * m_angle[1], 0.0f, 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Y:
- {
- rotation = MT_Vector3(0.0f, -1.0f * m_angle[1], 0.0f);
- break;
- }
- case KX_ACT_MOUSE_OBJECT_AXIS_Z:
- {
- rotation = MT_Vector3(0.0f, 0.0f, -1.0f * m_angle[1]);
- break;
- }
- default:
- break;
- }
- parent->ApplyRotation(rotation, m_local_y);
-
- m_angle[0] = 0.0f;
- m_angle[1] = 0.0f;
-
- Py_RETURN_NONE;
-}
-
-#endif /* WITH_PYTHON */