From 869361d1261cd7a58d766227a99259c341132775 Mon Sep 17 00:00:00 2001 From: IvanPragma Date: Thu, 28 Oct 2021 16:28:11 +0500 Subject: [PATCH 1/5] Creating the opportunity to change camera attributes from python layer --- .../python/methods/python_methods_graphics.cc | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/src/ballistica/python/methods/python_methods_graphics.cc b/src/ballistica/python/methods/python_methods_graphics.cc index 8e642ec9..8dce1c4e 100644 --- a/src/ballistica/python/methods/python_methods_graphics.cc +++ b/src/ballistica/python/methods/python_methods_graphics.cc @@ -1,6 +1,7 @@ // Released under the MIT License. See LICENSE for details. #include "ballistica/python/methods/python_methods_graphics.h" +#include "ballistica/graphics/camera.h" #include "ballistica/game/game.h" #include "ballistica/graphics/graphics.h" @@ -16,6 +17,84 @@ namespace ballistica { #pragma clang diagnostic push #pragma ide diagnostic ignored "hicpp-signed-bitwise" +auto PyGetCameraPosition(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + Platform::SetLastPyCall("get_camera_position"); + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + Camera* cam = g_graphics->camera(); + cam->get_position(&x, &y, &z); + return Py_BuildValue("(fff)", x, y, z); + BA_PYTHON_CATCH; +} + +auto PyGetCameraTarget(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + Platform::SetLastPyCall("get_camera_target"); + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + Camera* cam = g_graphics->camera(); + cam->target_smoothed(&x, &y, &z); + return Py_BuildValue("(fff)", x, y, z); + BA_PYTHON_CATCH; +} + +auto PySetCameraPosition(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + Platform::SetLastPyCall("set_camera_position"); + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + static const char* kwlist[] = {"x", "y", "z", nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "fff", + const_cast(kwlist), &x, &y, &z)) { + return nullptr; + } + assert(g_game); + g_graphics->camera()->SetPosition(x, y, z); + Py_RETURN_NONE; + BA_PYTHON_CATCH; +} + +auto PySetCameraTarget(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + Platform::SetLastPyCall("set_camera_target"); + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + static const char* kwlist[] = { "x", "y", "z", nullptr }; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "fff", + const_cast(kwlist), &x, &y, &z)) { + return nullptr; + } + assert(g_game); + g_graphics->camera()->SetTarget(x, y, z); + Py_RETURN_NONE; + BA_PYTHON_CATCH; +} + +auto PySetCameraManual(PyObject* self, PyObject* args, PyObject* keywds) + -> PyObject* { + BA_PYTHON_TRY; + Platform::SetLastPyCall("set_camera_manual"); + bool value = false; + static const char* kwlist[] = {"value", nullptr}; + if (!PyArg_ParseTupleAndKeywords(args, keywds, "b", + const_cast(kwlist), &value)) { + return nullptr; + } + assert(g_game); + g_graphics->camera()->SetManual(value); + Py_RETURN_NONE; + BA_PYTHON_CATCH; +} + auto PyCharStr(PyObject* self, PyObject* args, PyObject* keywds) -> PyObject* { BA_PYTHON_TRY; Platform::SetLastPyCall("charstr"); @@ -232,6 +311,36 @@ auto PythonMethodsGraphics::GetMethods() -> std::vector { "Return the currently selected display resolution for fullscreen\n" "display. Returns None if resolutions cannot be directly set."}, + {"get_camera_position", (PyCFunction)PyGetCameraPosition, + METH_VARARGS | METH_KEYWORDS, + "get_camera_position() -> tuple[float, float, float]\n" + "\n" + "(internal)"}, + + {"get_camera_target", (PyCFunction)PyGetCameraTarget, + METH_VARARGS | METH_KEYWORDS, + "get_camera_target() -> tuple[float, float, float]\n" + "\n" + "(internal)"}, + + {"set_camera_position", (PyCFunction)PySetCameraPosition, + METH_VARARGS | METH_KEYWORDS, + "set_camera_position(x: float, y: float, z: float) -> None\n" + "\n" + "(internal)"}, + + {"set_camera_target", (PyCFunction)PySetCameraTarget, + METH_VARARGS | METH_KEYWORDS, + "set_camera_target(x: float, y: float, z: float) -> None\n" + "\n" + "(internal)"}, + + {"set_camera_manual", (PyCFunction)PySetCameraManual, + METH_VARARGS | METH_KEYWORDS, + "set_camera_manual(value: bool) -> None\n" + "\n" + "(internal)"}, + {"has_gamma_control", PyHasGammaControl, METH_VARARGS, "has_gamma_control() -> bool\n" "\n" From 7a34b38a88c05c437db61adef10116e826dfc02d Mon Sep 17 00:00:00 2001 From: IvanPragma Date: Thu, 28 Oct 2021 16:50:47 +0500 Subject: [PATCH 2/5] Add myself to CONTRIBUTORS.md --- CONTRIBUTORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d9832f9c..9cb2458f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -26,3 +26,6 @@ ### Ritiek Malhotra - Just <3 BombSquad + +### Ivan Ms +- Few camera features From ec0fbfacefdab3a4271324197df48ac212e58126 Mon Sep 17 00:00:00 2001 From: IvanPragma Date: Thu, 28 Oct 2021 19:41:37 +0500 Subject: [PATCH 3/5] Update python_methods_graphics.cc --- src/ballistica/python/methods/python_methods_graphics.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ballistica/python/methods/python_methods_graphics.cc b/src/ballistica/python/methods/python_methods_graphics.cc index 8dce1c4e..0296ff6b 100644 --- a/src/ballistica/python/methods/python_methods_graphics.cc +++ b/src/ballistica/python/methods/python_methods_graphics.cc @@ -1,9 +1,9 @@ // Released under the MIT License. See LICENSE for details. #include "ballistica/python/methods/python_methods_graphics.h" -#include "ballistica/graphics/camera.h" #include "ballistica/game/game.h" +#include "ballistica/graphics/camera.h" #include "ballistica/graphics/graphics.h" #include "ballistica/graphics/text/text_graphics.h" #include "ballistica/platform/platform.h" @@ -68,9 +68,9 @@ auto PySetCameraTarget(PyObject* self, PyObject* args, PyObject* keywds) float x = 0.0f; float y = 0.0f; float z = 0.0f; - static const char* kwlist[] = { "x", "y", "z", nullptr }; + static const char* kwlist[] = {"x", "y", "z", nullptr}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "fff", - const_cast(kwlist), &x, &y, &z)) { + const_cast(kwlist), &x, &y, &z)) { return nullptr; } assert(g_game); From 4886e3f96bba0dcb3b2924f03126ad613c97a832 Mon Sep 17 00:00:00 2001 From: Ivan Ms <74207898+IvanPragma@users.noreply.github.com> Date: Wed, 3 Nov 2021 18:03:42 +0500 Subject: [PATCH 4/5] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e216e22..55159a46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 1.6.6 (20394) - Beginning work on moving to new asset system. +- Added methods for changing camera attributes to the _ba module. ### 1.6.5 (20394) - Added co-op support to server builds (thanks Dliwk!) From ba6915c3baf6c5a09b483626b1f95a073160a097 Mon Sep 17 00:00:00 2001 From: IvanPragma Date: Fri, 5 Nov 2021 00:59:53 +0500 Subject: [PATCH 5/5] After make preflight --- assets/src/ba_data/python/._ba_sources_hash | 2 +- assets/src/ba_data/python/_ba.py | 40 +++++++++++++++++++ src/ballistica/input/device/joystick.cc | 20 ++++------ .../python/methods/python_methods_graphics.cc | 4 +- src/ballistica/scene/node/image_node.cc | 4 +- src/ballistica/scene/node/terrain_node.cc | 6 +-- src/ballistica/scene/node/text_node.cc | 10 ++--- 7 files changed, 61 insertions(+), 25 deletions(-) diff --git a/assets/src/ba_data/python/._ba_sources_hash b/assets/src/ba_data/python/._ba_sources_hash index e4b6e04e..af8b1a5c 100644 --- a/assets/src/ba_data/python/._ba_sources_hash +++ b/assets/src/ba_data/python/._ba_sources_hash @@ -1 +1 @@ -291441930138756424684870937756526517762 \ No newline at end of file +206834682288822241335693999070871022992 \ No newline at end of file diff --git a/assets/src/ba_data/python/_ba.py b/assets/src/ba_data/python/_ba.py index b8620a00..cfb99e35 100644 --- a/assets/src/ba_data/python/_ba.py +++ b/assets/src/ba_data/python/_ba.py @@ -2008,6 +2008,22 @@ def get_appconfig_default_value(key: str) -> Any: return _uninferrable() +def get_camera_position() -> tuple[float, ...]: + """get_camera_position() -> tuple[float, ...] + + (internal) + """ + return (0.0, 0.0, 0.0) + + +def get_camera_target() -> tuple[float, ...]: + """get_camera_target() -> tuple[float, ...] + + (internal) + """ + return (0.0, 0.0, 0.0) + + def get_chat_messages() -> list[str]: """get_chat_messages() -> list[str] @@ -3485,6 +3501,30 @@ def set_authenticate_clients(enable: bool) -> None: return None +def set_camera_manual(value: bool) -> None: + """set_camera_manual(value: bool) -> None + + (internal) + """ + return None + + +def set_camera_position(x: float, y: float, z: float) -> None: + """set_camera_position(x: float, y: float, z: float) -> None + + (internal) + """ + return None + + +def set_camera_target(x: float, y: float, z: float) -> None: + """set_camera_target(x: float, y: float, z: float) -> None + + (internal) + """ + return None + + def set_debug_speed_exponent(speed: int) -> None: """set_debug_speed_exponent(speed: int) -> None diff --git a/src/ballistica/input/device/joystick.cc b/src/ballistica/input/device/joystick.cc index d82e8f82..480828e0 100644 --- a/src/ballistica/input/device/joystick.cc +++ b/src/ballistica/input/device/joystick.cc @@ -672,9 +672,8 @@ void Joystick::HandleSDLEvent(const SDL_Event* e) { e2.jaxis.axis = static_cast_check_fit(analog_lr_); dpad_right_held_ = (e->type == SDL_JOYBUTTONDOWN); e2.jaxis.value = static_cast_check_fit( - dpad_right_held_ ? (dpad_left_held_ ? 0 : 32767) - : dpad_left_held_ ? -32767 - : 0); + dpad_right_held_ ? (dpad_left_held_ ? 0 : 32767) + : dpad_left_held_ ? -32767 : 0); e = &e2; } else if (e->jbutton.button == left_button_ || e->jbutton.button == left_button2_) { @@ -682,9 +681,8 @@ void Joystick::HandleSDLEvent(const SDL_Event* e) { e2.jaxis.axis = static_cast_check_fit(analog_lr_); dpad_left_held_ = (e->type == SDL_JOYBUTTONDOWN); e2.jaxis.value = static_cast_check_fit( - dpad_right_held_ ? (dpad_left_held_ ? 0 : 32767) - : dpad_left_held_ ? -32767 - : 0); + dpad_right_held_ ? (dpad_left_held_ ? 0 : 32767) + : dpad_left_held_ ? -32767 : 0); e = &e2; } else if (e->jbutton.button == up_button_ || e->jbutton.button == up_button2_) { @@ -692,9 +690,8 @@ void Joystick::HandleSDLEvent(const SDL_Event* e) { e2.jaxis.axis = static_cast_check_fit(analog_ud_); dpad_up_held_ = (e->type == SDL_JOYBUTTONDOWN); e2.jaxis.value = static_cast_check_fit( - dpad_up_held_ ? (dpad_down_held_ ? 0 : -32767) - : dpad_down_held_ ? 32767 - : 0); + dpad_up_held_ ? (dpad_down_held_ ? 0 : -32767) + : dpad_down_held_ ? 32767 : 0); e = &e2; } else if (e->jbutton.button == down_button_ || e->jbutton.button == down_button2_) { @@ -702,9 +699,8 @@ void Joystick::HandleSDLEvent(const SDL_Event* e) { e2.jaxis.axis = static_cast_check_fit(analog_ud_); dpad_down_held_ = (e->type == SDL_JOYBUTTONDOWN); e2.jaxis.value = static_cast_check_fit( - dpad_up_held_ ? (dpad_down_held_ ? 0 : -32767) - : dpad_down_held_ ? 32767 - : 0); + dpad_up_held_ ? (dpad_down_held_ ? 0 : -32767) + : dpad_down_held_ ? 32767 : 0); e = &e2; } break; diff --git a/src/ballistica/python/methods/python_methods_graphics.cc b/src/ballistica/python/methods/python_methods_graphics.cc index 0296ff6b..454fa817 100644 --- a/src/ballistica/python/methods/python_methods_graphics.cc +++ b/src/ballistica/python/methods/python_methods_graphics.cc @@ -313,13 +313,13 @@ auto PythonMethodsGraphics::GetMethods() -> std::vector { {"get_camera_position", (PyCFunction)PyGetCameraPosition, METH_VARARGS | METH_KEYWORDS, - "get_camera_position() -> tuple[float, float, float]\n" + "get_camera_position() -> tuple[float, ...]\n" "\n" "(internal)"}, {"get_camera_target", (PyCFunction)PyGetCameraTarget, METH_VARARGS | METH_KEYWORDS, - "get_camera_target() -> tuple[float, float, float]\n" + "get_camera_target() -> tuple[float, ...]\n" "\n" "(internal)"}, diff --git a/src/ballistica/scene/node/image_node.cc b/src/ballistica/scene/node/image_node.cc index c9e1d723..ab0fcbb8 100644 --- a/src/ballistica/scene/node/image_node.cc +++ b/src/ballistica/scene/node/image_node.cc @@ -214,8 +214,8 @@ void ImageNode::Draw(FrameDef* frame_def) { } RenderPass& pass(*(vr_use_fixed ? frame_def->GetOverlayFixedPass() - : front_ ? frame_def->overlay_front_pass() - : frame_def->overlay_pass())); + : front_ ? frame_def->overlay_front_pass() + : frame_def->overlay_pass())); // If the pass we're drawing into changes dimensions, recalc. // Otherwise we break if a window is resized. diff --git a/src/ballistica/scene/node/terrain_node.cc b/src/ballistica/scene/node/terrain_node.cc index 338975f6..f674fc63 100644 --- a/src/ballistica/scene/node/terrain_node.cc +++ b/src/ballistica/scene/node/terrain_node.cc @@ -219,9 +219,9 @@ void TerrainNode::Draw(FrameDef* frame_def) { if (vr_only_ && !IsVRMode()) { return; } - ObjectComponent c(overlay_ ? frame_def->overlay_3d_pass() - : background_ ? frame_def->beauty_pass_bg() - : frame_def->beauty_pass()); + ObjectComponent c(overlay_ ? frame_def->overlay_3d_pass() + : background_ ? frame_def->beauty_pass_bg() + : frame_def->beauty_pass()); c.SetWorldSpace(true); c.SetTexture(color_texture_); if (lighting_) { diff --git a/src/ballistica/scene/node/text_node.cc b/src/ballistica/scene/node/text_node.cc index 10a0c0f8..bb838dfa 100644 --- a/src/ballistica/scene/node/text_node.cc +++ b/src/ballistica/scene/node/text_node.cc @@ -379,11 +379,11 @@ void TextNode::Draw(FrameDef* frame_def) { // make sure we're up to date Update(); - RenderPass& pass(*(in_world_ - ? frame_def->overlay_3d_pass() - : (vr_use_fixed ? frame_def->GetOverlayFixedPass() - : front_ ? frame_def->overlay_front_pass() - : frame_def->overlay_pass()))); + RenderPass& pass( + *(in_world_ ? frame_def->overlay_3d_pass() + : (vr_use_fixed ? frame_def->GetOverlayFixedPass() + : front_ ? frame_def->overlay_front_pass() + : frame_def->overlay_pass()))); if (big_) { if (text_group_dirty_) { TextMesh::HAlign h_align;