Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cameraz #156

Open
wants to merge 87 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
7ce37e0
add CCubeProjection.hpp, ILinearProjection.hpp & IProjection.hpp head…
AnastaZIuk Oct 20, 2024
e239229
add range_value_t to IProjection
AnastaZIuk Oct 20, 2024
5e03922
create IProjectionRange, pair with IProjection, use concepts for spec…
AnastaZIuk Oct 21, 2024
6196c61
save draft of CVirtualCameraEvent.hpp & ICameraControl.hpp, update so…
AnastaZIuk Oct 21, 2024
80be87d
update ICameraControl & CVirtualCameraEvent, add processVirtualEvent
AnastaZIuk Oct 23, 2024
3af8c07
put CVirtualCameraEvent logic into ICameraController, update the clas…
AnastaZIuk Oct 23, 2024
fdd47a7
add more getters & setters to ICameraController, remove some content …
AnastaZIuk Oct 23, 2024
3ed3727
save work, make classes compile (but runtime crashes), mark TODOs for…
AnastaZIuk Oct 24, 2024
038c5d7
create ICamera.hpp interface for all types of cameraz, update IProjec…
AnastaZIuk Oct 25, 2024
242a871
improve IProjection, make the matrix private & allow to change it wit…
AnastaZIuk Oct 25, 2024
0415999
address https://github.com/Devsh-Graphics-Programming/Nabla/pull/760/…
AnastaZIuk Oct 25, 2024
84f35e5
init default keys to virtual events, make ICameraController<T> inheri…
AnastaZIuk Oct 25, 2024
d8ff36a
split responsibilities & update sources
AnastaZIuk Oct 26, 2024
e0c66bd
add updateOrthonormalMatrix
AnastaZIuk Oct 26, 2024
0574d72
start eliminating first runtime bugs & typos
AnastaZIuk Oct 26, 2024
221e112
add debug asserts for matrix base checks
AnastaZIuk Oct 28, 2024
13613c3
fix another bugs, make the rotation work!
AnastaZIuk Oct 28, 2024
db77a10
movement fixes, finally gimbal fully controls camera position & orien…
AnastaZIuk Oct 28, 2024
ae2b520
small typo
AnastaZIuk Oct 28, 2024
d21bd96
accumulate move & rotation deltas, add setOrientation & correct proce…
AnastaZIuk Oct 29, 2024
ccbb37c
remove old test methods
AnastaZIuk Oct 30, 2024
d3f325d
remove gimbal member from camera interface, have matrix precision typ…
AnastaZIuk Nov 2, 2024
f9fce56
move virtual events outside templates into CVirtualGimbalEvent, have …
AnastaZIuk Nov 3, 2024
2f44640
bad typo
AnastaZIuk Nov 3, 2024
1ad781f
create CGeneralPurposeGimbal & IGimbal (which will apply to any kind …
AnastaZIuk Nov 6, 2024
4428dbb
change keys lookup table, add scale events to CVirtualGimbalEvent::Vi…
AnastaZIuk Nov 6, 2024
32d89b8
lets call manipulate only one by putting all virtual events into sing…
AnastaZIuk Nov 6, 2024
58099cf
Add key-mapping UI window. Virtual events handling fixed! I was not e…
AnastaZIuk Nov 7, 2024
1ed826f
create keysmapping.hpp with displayKeyMappingsAndVirtualStates utilit…
AnastaZIuk Nov 7, 2024
4d32863
create CCameraController, update ICameraController, have mouse contro…
AnastaZIuk Nov 8, 2024
c991edf
rename + refactor ICameraController to more abstract IGimbalControlle…
AnastaZIuk Nov 11, 2024
797ba40
accumulate transform in FPS camera' base_t::World case with respect t…
AnastaZIuk Nov 12, 2024
ae20180
I need more space for more viewports, allow to resize the window
AnastaZIuk Nov 14, 2024
6a39b3d
set better initial position & orientation of camera, cleanup in GC sh…
AnastaZIuk Nov 15, 2024
5c41b35
pull master & resolve conflicts
AnastaZIuk Nov 15, 2024
bdcc4c4
update the UI example to use TRI buffer & smooth resize surface -> I …
AnastaZIuk Nov 15, 2024
65efa99
fix some init bugs
AnastaZIuk Nov 15, 2024
2c42869
play with aspect ratio, make projection work in GUI window on window …
AnastaZIuk Nov 15, 2024
c1063e2
Make room for multiple geometry creator scene frame-buffers, add seco…
AnastaZIuk Nov 18, 2024
d6db4a7
display second gizmo on the scene (and make it capable of manipulatio…
AnastaZIuk Nov 18, 2024
334651d
add `inline const matrix<precision_t, 3, 4> operator()() const` IGimb…
AnastaZIuk Nov 22, 2024
c170c5d
add virtual getIdentifier to camera interface, display matrices for b…
AnastaZIuk Nov 22, 2024
df0d702
one step ahead to imguizmo controller - display the scene from second…
AnastaZIuk Dec 2, 2024
6cd5e18
fix gizmo manipulation bugs, make sure a model is manipulated only on…
AnastaZIuk Dec 3, 2024
e678f22
add toRetardedImguizmoTRSInput, have nicely aligned *local base* orie…
AnastaZIuk Dec 4, 2024
f157b4f
make the imguizmo controller work for translations
AnastaZIuk Dec 4, 2024
8324b19
fix ManipulationMode::World manipulations, treat impulses as relative…
AnastaZIuk Dec 4, 2024
5fd1d45
save work to continue tomorrow - start adjusting to comments regardin…
AnastaZIuk Dec 5, 2024
c5f3287
make CCubeProjection use IQuadProjection & IProjection interface, upd…
AnastaZIuk Dec 6, 2024
10e08f0
add some getters to IQuadProjection
AnastaZIuk Dec 10, 2024
11585e2
remove templates from ICamera interface, hardcode 64bit for its gimba…
AnastaZIuk Dec 12, 2024
7085418
fix a typo which broke my projections, comment out a few debug windows
AnastaZIuk Dec 12, 2024
bf7bfed
add camera selection with mouse disabled on move, display camera prop…
AnastaZIuk Dec 12, 2024
ded92d8
have virtual events mapping per camera in node tree, disable all gizm…
AnastaZIuk Dec 12, 2024
5e5c681
modify projection parameters independently of camera, improve TRS edi…
AnastaZIuk Dec 13, 2024
2242bf1
increase FBOs resolution, make full screen mode work again after updates
AnastaZIuk Dec 13, 2024
85747c6
disable WiP features (display on red or vanish)
AnastaZIuk Dec 13, 2024
1d799e1
add help text for disabling/enabling selected camera movement
AnastaZIuk Dec 13, 2024
73c2a6a
Release & RWDI will need closer look, comment out more WiP
AnastaZIuk Dec 13, 2024
6ad873e
allow to manipulate model gizmos in ortho mode, add sliders to move/r…
AnastaZIuk Dec 14, 2024
c615d58
allow to pick combo with object type when TRS editor has object from …
AnastaZIuk Dec 14, 2024
10fe3b2
forgot to remove old struct from ICamera interface, also use ImGuiSli…
AnastaZIuk Dec 14, 2024
3ea910c
create `CPlanarProjection.hpp` & `IPlanarProjection.hpp` classes, add…
AnastaZIuk Dec 17, 2024
e34cb66
planar projections are bound to controllers, now I need to fix manipu…
AnastaZIuk Dec 18, 2024
1332a87
use `struct CPlanarProjectionWithMeta : public CPlanarProjection<plan…
AnastaZIuk Dec 19, 2024
a5e77b0
fix gizmo ID stack usage
AnastaZIuk Dec 19, 2024
e89b1c1
set render window constraints to avoid aspect ratio glitches & divisi…
AnastaZIuk Dec 20, 2024
237dd43
control active render window by switching between bound planar & proj…
AnastaZIuk Dec 20, 2024
4f0e0e8
preserve virtual active event state when required & use bound project…
AnastaZIuk Dec 21, 2024
ae342b5
correct projection updates
AnastaZIuk Dec 21, 2024
1c8f289
added cameraz.json to builtin resources
YasInvolved Dec 22, 2024
c5d6b11
move default config to app_resources
YasInvolved Dec 22, 2024
cb06b71
allow to pick object from the scene in TRS editor, add more help-texts
AnastaZIuk Dec 22, 2024
dbc9baa
load default config if file specified in parameter is not found
YasInvolved Dec 22, 2024
5c26d48
Merge branch 'cameraz' of github.com:Devsh-Graphics-Programming/Nabla…
YasInvolved Dec 22, 2024
7a96b2b
make DepthFboAttachmentFormat (gc scene fbo) EF_D32_SFLOAT to increas…
AnastaZIuk Dec 22, 2024
2dcdb56
split viewports and planars in JSON
YasInvolved Dec 22, 2024
53c626f
replace cerr with logFail to improve logging
YasInvolved Dec 22, 2024
454289e
moved data parsing to before gfx initialization
YasInvolved Dec 22, 2024
db0b2af
switch to system cursor when outside of viewport
YasInvolved Dec 22, 2024
5a888aa
ImGuizmo last invocation cache needs to be inspected, add a few comments
AnastaZIuk Dec 23, 2024
0f3f6d3
Merge branch 'yas_cameraz' of github.com:Devsh-Graphics-Programming/N…
AnastaZIuk Dec 23, 2024
374f5cf
fix a little loading bug after the merge
AnastaZIuk Dec 23, 2024
6ed9686
minor visual bug with cursor
AnastaZIuk Dec 23, 2024
6231737
add new Free Lock camera to the scene, update cameras.json input, fix…
AnastaZIuk Dec 23, 2024
38168d3
make default positioning sexy, update input constants
AnastaZIuk Dec 23, 2024
9f9c77e
create COrbitCamera.hpp & add to the demo example
AnastaZIuk Dec 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 109 additions & 76 deletions 61_UI/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@

#include "common.hpp"

#include "camera/CCubeProjection.hpp"
#include "camera/ICameraControl.hpp"
#include "glm/glm/ext/matrix_clip_space.hpp" // TODO: TESTING

// FPS Camera, TESTS
using projection_matrix_t = float32_t4x4;
using camera_t = Camera<projection_matrix_t>;
using gimbal_t = camera_t::CGimbal;
using projection_t = camera_t::base_t::projection_t;

/*
Renders scene texture to an offline
framebuffer which color attachment
Expand Down Expand Up @@ -166,28 +176,26 @@ class UISampleApp final : public examples::SimpleWindowedApplication
pass.ui.manager->registerListener([this]() -> void
{
ImGuiIO& io = ImGui::GetIO();

camera.setProjectionMatrix([&]()
{
static matrix4SIMD projection;
auto* projection = camera->getProjection();

if (isPerspective)
if(isLH)
projection = matrix4SIMD::buildProjectionMatrixPerspectiveFovLH(core::radians(fov), io.DisplaySize.x / io.DisplaySize.y, zNear, zFar);
{
if (isLH)
projection->setMatrix(buildProjectionMatrixPerspectiveFovLH(glm::radians(fov), io.DisplaySize.x / io.DisplaySize.y, zNear, zFar));
else
projection = matrix4SIMD::buildProjectionMatrixPerspectiveFovRH(core::radians(fov), io.DisplaySize.x / io.DisplaySize.y, zNear, zFar);
projection->setMatrix(buildProjectionMatrixPerspectiveFovRH(glm::radians(fov), io.DisplaySize.x / io.DisplaySize.y, zNear, zFar));
}
else
{
float viewHeight = viewWidth * io.DisplaySize.y / io.DisplaySize.x;

if(isLH)
projection = matrix4SIMD::buildProjectionMatrixOrthoLH(viewWidth, viewHeight, zNear, zFar);
if (isLH)
projection->setMatrix(buildProjectionMatrixOrthoLH(viewWidth, viewHeight, zNear, zFar));
else
projection = matrix4SIMD::buildProjectionMatrixOrthoRH(viewWidth, viewHeight, zNear, zFar);
projection->setMatrix(buildProjectionMatrixOrthoRH(viewWidth, viewHeight, zNear, zFar));
}

return projection;
}());
}

ImGuizmo::SetOrthographic(false);
ImGuizmo::BeginFrame();
Expand Down Expand Up @@ -246,15 +254,11 @@ class UISampleApp final : public examples::SimpleWindowedApplication

if (viewDirty || firstFrame)
{
core::vectorSIMDf cameraPosition(cosf(camYAngle)* cosf(camXAngle)* transformParams.camDistance, sinf(camXAngle)* transformParams.camDistance, sinf(camYAngle)* cosf(camXAngle)* transformParams.camDistance);
core::vectorSIMDf cameraTarget(0.f, 0.f, 0.f);
const static core::vectorSIMDf up(0.f, 1.f, 0.f);

camera.setPosition(cameraPosition);
camera.setTarget(cameraTarget);
camera.setBackupUpVector(up);
float32_t3 cameraPosition(cosf(camYAngle)* cosf(camXAngle)* transformParams.camDistance, sinf(camXAngle)* transformParams.camDistance, sinf(camYAngle)* cosf(camXAngle)* transformParams.camDistance);
float32_t3 cameraTarget(0.f, 0.f, 0.f);

camera.recomputeViewMatrix();
gimbal->setPosition(cameraPosition);
camera->setTarget(cameraTarget);

firstFrame = false;
}
Expand Down Expand Up @@ -322,35 +326,34 @@ class UISampleApp final : public examples::SimpleWindowedApplication

static struct
{
core::matrix4SIMD view, projection, model;
float32_t4x4 view, projection, model;
} imguizmoM16InOut;

ImGuizmo::SetID(0u);
const auto& projectionMatrix = camera->getProjection()->getMatrix();

imguizmoM16InOut.view = core::transpose(matrix4SIMD(camera.getViewMatrix()));
imguizmoM16InOut.projection = core::transpose(camera.getProjectionMatrix());
imguizmoM16InOut.model = core::transpose(core::matrix4SIMD(pass.scene->object.model));
ImGuizmo::SetID(0u);
imguizmoM16InOut.view = transpose(getMatrix3x4As4x4(camera->getViewMatrix()));
imguizmoM16InOut.projection = transpose(projectionMatrix);
imguizmoM16InOut.model = transpose(getMatrix3x4As4x4(pass.scene->object.model));
{
if (flipGizmoY) // note we allow to flip gizmo just to match our coordinates
imguizmoM16InOut.projection[1][1] *= -1.f; // https://johannesugb.github.io/gpu-programming/why-do-opengl-proj-matrices-fail-in-vulkan/

transformParams.editTransformDecomposition = true;
EditTransform(imguizmoM16InOut.view.pointer(), imguizmoM16InOut.projection.pointer(), imguizmoM16InOut.model.pointer(), transformParams);
EditTransform(&imguizmoM16InOut.view[0][0], &imguizmoM16InOut.projection[0][0], &imguizmoM16InOut.model[0][0], transformParams);
}

// to Nabla + update camera & model matrices
const auto& view = camera.getViewMatrix();
const auto& projection = camera.getProjectionMatrix();

const auto& view = camera->getViewMatrix();

// TODO: make it more nicely
const_cast<core::matrix3x4SIMD&>(view) = core::transpose(imguizmoM16InOut.view).extractSub3x4(); // a hack, correct way would be to use inverse matrix and get position + target because now it will bring you back to last position & target when switching from gizmo move to manual move (but from manual to gizmo is ok)
camera.setProjectionMatrix(projection); // update concatanated matrix
const_cast<float32_t3x4&>(view) = float32_t3x4(transpose(imguizmoM16InOut.view)); // a hack, correct way would be to use inverse matrix and get position + target because now it will bring you back to last position & target when switching from gizmo move to manual move (but from manual to gizmo is ok)
{
static nbl::core::matrix3x4SIMD modelView, normal;
static nbl::core::matrix4SIMD modelViewProjection;
static float32_t3x4 modelView, normal;
static float32_t4x4 modelViewProjection;

auto& hook = pass.scene->object;
hook.model = core::transpose(imguizmoM16InOut.model).extractSub3x4();
hook.model = float32_t3x4(transpose(imguizmoM16InOut.model));
{
const auto& references = pass.scene->getResources().objects;
const auto type = static_cast<ObjectType>(gcIndex);
Expand All @@ -362,13 +365,17 @@ class UISampleApp final : public examples::SimpleWindowedApplication

auto& ubo = hook.viewParameters;

modelView = nbl::core::concatenateBFollowedByA(view, hook.model);
modelView.getSub3x3InverseTranspose(normal);
modelViewProjection = nbl::core::concatenateBFollowedByA(camera.getConcatenatedMatrix(), hook.model);
modelView = concatenateBFollowedByA<float>(view, hook.model);

// TODO
//modelView.getSub3x3InverseTranspose(normal);

memcpy(ubo.MVP, modelViewProjection.pointer(), sizeof(ubo.MVP));
memcpy(ubo.MV, modelView.pointer(), sizeof(ubo.MV));
memcpy(ubo.NormalMat, normal.pointer(), sizeof(ubo.NormalMat));
auto concatMatrix = mul(projectionMatrix, getMatrix3x4As4x4(view));
modelViewProjection = mul(concatMatrix, getMatrix3x4As4x4(hook.model));

memcpy(ubo.MVP, &modelViewProjection[0][0], sizeof(ubo.MVP));
memcpy(ubo.MV, &modelView[0][0], sizeof(ubo.MV));
memcpy(ubo.NormalMat, &normal[0][0], sizeof(ubo.NormalMat));

// object meta display
{
Expand Down Expand Up @@ -403,9 +410,18 @@ class UISampleApp final : public examples::SimpleWindowedApplication
ImGui::Separator();
};

addMatrixTable("Model Matrix", "ModelMatrixTable", 3, 4, pass.scene->object.model.pointer());
addMatrixTable("Camera View Matrix", "ViewMatrixTable", 3, 4, view.pointer());
addMatrixTable("Camera View Projection Matrix", "ViewProjectionMatrixTable", 4, 4, projection.pointer(), false);
auto& orientation = gimbal->getOrthonornalMatrix();

addMatrixTable("Model Matrix", "ModelMatrixTable", 3, 4, &pass.scene->object.model[0][0]);

addMatrixTable("Right", "OrientationRightVec", 1, 3, &gimbal->getXAxis()[0]);
addMatrixTable("Up", "OrientationUpVec", 1, 3, &gimbal->getYAxis()[0]);
addMatrixTable("Forward", "OrientationForwardVec", 1, 3, &gimbal->getZAxis()[0]);
addMatrixTable("Position", "PositionForwardVec", 1, 3, &gimbal->getPosition()[0]);

//addMatrixTable("Camera Gimbal Orientation Matrix", "OrientationMatrixTable", 3, 3, &orientation[0][0]);
addMatrixTable("Camera Gimbal View Matrix", "ViewMatrixTable", 3, 4, &view[0][0]);
addMatrixTable("Camera Gimbal Projection Matrix", "ProjectionMatrixTable", 4, 4, &projectionMatrix[0][0], false);

ImGui::End();
}
Expand Down Expand Up @@ -487,7 +503,19 @@ class UISampleApp final : public examples::SimpleWindowedApplication
m_surface->recreateSwapchain();
m_winMgr->show(m_window.get());
oracle.reportBeginFrameRecord();
camera.mapKeysToArrows();

/*
TESTS, TODO: remove all once finished work & integrate with the example properly
*/

const float32_t3 position(cosf(camYAngle)* cosf(camXAngle)* transformParams.camDistance, sinf(camXAngle)* transformParams.camDistance, sinf(camYAngle)* cosf(camXAngle)* transformParams.camDistance),
target(0.f, 0.f, 0.f);

auto projection = make_smart_refctd_ptr<projection_t>();
projection->setMatrix(buildProjectionMatrixPerspectiveFovLH(glm::radians(fov), float(m_window->getWidth()) / float(m_window->getHeight()), zNear, zFar));

gimbal = make_smart_refctd_ptr<gimbal_t>(position);
camera = make_smart_refctd_ptr<camera_t>(core::smart_refctd_ptr(gimbal), core::smart_refctd_ptr(projection), target);

return true;
}
Expand Down Expand Up @@ -666,8 +694,8 @@ class UISampleApp final : public examples::SimpleWindowedApplication

inline void update()
{
camera.setMoveSpeed(moveSpeed);
camera.setRotateSpeed(rotateSpeed);
camera->setMoveSpeed(moveSpeed);
camera->setRotateSpeed(rotateSpeed);

static std::chrono::microseconds previousEventTimestamp{};

Expand All @@ -692,54 +720,58 @@ class UISampleApp final : public examples::SimpleWindowedApplication
std::vector<SMouseEvent> mouse{};
std::vector<SKeyboardEvent> keyboard{};
} capturedEvents;

if (move)
camera->begin(nextPresentationTimestamp);

if (move) camera.beginInputProcessing(nextPresentationTimestamp);
mouse.consumeEvents([&](const IMouseEventChannel::range_t& events) -> void
{
mouse.consumeEvents([&](const IMouseEventChannel::range_t& events) -> void
for (const auto& e : events) // here capture
{
if (move)
camera.mouseProcess(events); // don't capture the events, only let camera handle them with its impl

for (const auto& e : events) // here capture
{
if (e.timeStamp < previousEventTimestamp)
continue;
if (e.timeStamp < previousEventTimestamp)
continue;

previousEventTimestamp = e.timeStamp;
capturedEvents.mouse.emplace_back(e);
previousEventTimestamp = e.timeStamp;
capturedEvents.mouse.emplace_back(e);

if (e.type == nbl::ui::SMouseEvent::EET_SCROLL)
gcIndex = std::clamp<uint16_t>(int16_t(gcIndex) + int16_t(core::sign(e.scrollEvent.verticalScroll)), int64_t(0), int64_t(OT_COUNT - (uint8_t)1u));
}
}, m_logger.get());
if (e.type == nbl::ui::SMouseEvent::EET_SCROLL)
gcIndex = std::clamp<uint16_t>(int16_t(gcIndex) + int16_t(core::sign(e.scrollEvent.verticalScroll)), int64_t(0), int64_t(OT_COUNT - (uint8_t)1u));
}
}, m_logger.get());

keyboard.consumeEvents([&](const IKeyboardEventChannel::range_t& events) -> void
{
for (const auto& e : events) // here capture
{
if (move)
camera.keyboardProcess(events); // don't capture the events, only let camera handle them with its impl

for (const auto& e : events) // here capture
{
if (e.timeStamp < previousEventTimestamp)
continue;
if (e.timeStamp < previousEventTimestamp)
continue;

previousEventTimestamp = e.timeStamp;
capturedEvents.keyboard.emplace_back(e);
}
}, m_logger.get());
}
if (move) camera.endInputProcessing(nextPresentationTimestamp);
previousEventTimestamp = e.timeStamp;
capturedEvents.keyboard.emplace_back(e);
}
}, m_logger.get());

const auto cursorPosition = m_window->getCursorControl()->getPosition();

nbl::ext::imgui::UI::SUpdateParameters params =
nbl::ext::imgui::UI::SUpdateParameters params =
{
.mousePosition = nbl::hlsl::float32_t2(cursorPosition.x, cursorPosition.y) - nbl::hlsl::float32_t2(m_window->getX(), m_window->getY()),
.displaySize = { m_window->getWidth(), m_window->getHeight() },
.mouseEvents = { capturedEvents.mouse.data(), capturedEvents.mouse.size() },
.keyboardEvents = { capturedEvents.keyboard.data(), capturedEvents.keyboard.size() }
};

if (move)
{
const auto virtualMouseEvents = camera->processMouse(params.mouseEvents);
const auto virtualKeyboardEvents = camera->processKeyboard(params.keyboardEvents);

camera->manipulate({ virtualMouseEvents.data(), virtualMouseEvents.size()});
camera->manipulate({ virtualKeyboardEvents.data(), virtualKeyboardEvents.size()});

camera->end(nextPresentationTimestamp);
}

pass.ui.manager->update(params);
}

Expand Down Expand Up @@ -781,7 +813,8 @@ class UISampleApp final : public examples::SimpleWindowedApplication
C_UI ui;
} pass;

Camera camera = Camera(core::vectorSIMDf(0, 0, 0), core::vectorSIMDf(0, 0, 0), core::matrix4SIMD());
core::smart_refctd_ptr<gimbal_t> gimbal;
core::smart_refctd_ptr<ICamera<projection_matrix_t>> camera;
video::CDumbPresentationOracle oracle;

uint16_t gcIndex = {}; // note: this is dirty however since I assume only single object in scene I can leave it now, when this example is upgraded to support multiple objects this needs to be changed
Expand Down
Loading