Hue shift + events to camera
This commit is contained in:
@@ -90,25 +90,51 @@ void MagnumItem::setCount(qint8 count) {
|
|||||||
void MagnumItem::keyPressEvent(QKeyEvent *evt) {
|
void MagnumItem::keyPressEvent(QKeyEvent *evt) {
|
||||||
switch (evt->key()) {
|
switch (evt->key()) {
|
||||||
case Qt::Key_L:
|
case Qt::Key_L:
|
||||||
// if (m_camera->lagging() > 0.0f) {
|
auto camera = m_renderer->camera();
|
||||||
// m_camera->setLagging(0.0f);
|
if (camera) {
|
||||||
// } else {
|
if (camera->lagging() > 0.0f) {
|
||||||
// m_camera->setLagging(0.85f);
|
camera->setLagging(0.0f);
|
||||||
// }
|
} else {
|
||||||
|
camera->setLagging(0.85f);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
evt->accept();
|
evt->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagnumItem::mousePressEvent(QMouseEvent *evt) {
|
void MagnumItem::mousePressEvent(QMouseEvent *evt) {
|
||||||
|
if (auto camera = m_renderer->camera()) {
|
||||||
|
camera->initTransformation({evt->pos().x(), evt->pos().y()});
|
||||||
|
}
|
||||||
|
evt->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagnumItem::mouseReleaseEvent(QMouseEvent *evt) {
|
void MagnumItem::mouseReleaseEvent(QMouseEvent *evt) {
|
||||||
|
evt->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagnumItem::mouseMoveEvent(QMouseEvent *evt) {}
|
void MagnumItem::mouseMoveEvent(QMouseEvent *evt) {
|
||||||
|
if (!evt->buttons())
|
||||||
|
return;
|
||||||
|
if (auto camera = m_renderer->camera()) {
|
||||||
|
if (evt->modifiers() & Qt::ShiftModifier) {
|
||||||
|
camera->translate({evt->pos().x(), evt->pos().y()});
|
||||||
|
} else {
|
||||||
|
camera->rotate({evt->pos().x(), evt->pos().y()});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
evt->accept();
|
||||||
|
}
|
||||||
|
|
||||||
void MagnumItem::wheelEvent(QWheelEvent *evt) {}
|
void MagnumItem::wheelEvent(QWheelEvent *evt) {
|
||||||
|
if (auto camera = m_renderer->camera()) {
|
||||||
|
const Float delta = evt->delta();
|
||||||
|
if (Math::abs(delta) < 1.0e-2f)
|
||||||
|
return;
|
||||||
|
camera->zoom(delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class CleanupJob : public QRunnable {
|
class CleanupJob : public QRunnable {
|
||||||
public:
|
public:
|
||||||
|
@@ -20,23 +20,20 @@ MagnumRenderer::MagnumRenderer() :
|
|||||||
m_init(false),
|
m_init(false),
|
||||||
m_count(1) {}
|
m_count(1) {}
|
||||||
|
|
||||||
MagnumRenderer::~MagnumRenderer() {}
|
MagnumRenderer::~MagnumRenderer() {
|
||||||
|
delete m_subjectObject;
|
||||||
|
delete m_subjectDrawable;
|
||||||
|
delete m_gridObject;
|
||||||
|
}
|
||||||
|
|
||||||
void MagnumRenderer::t(const float t) {
|
void MagnumRenderer::t(const float t) {
|
||||||
if (m_subjectObject != nullptr && m_subjectObject->parent()) {
|
if (m_subjectDrawable)
|
||||||
m_subjectObject->resetTransformation();
|
m_subjectDrawable->t(t);
|
||||||
m_subjectObject->translate(Vector3{0.f, 1.f, 0.f});
|
|
||||||
m_subjectObject->rotateY(Rad(t*Math::Constants<float>::pi()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagnumRenderer::hue(float hue) {
|
void MagnumRenderer::hue(float hue) {
|
||||||
if (m_subjectShader.id()) {
|
if (m_subjectDrawable)
|
||||||
auto const color = Color3::fromHsv({Rad(hue), 1.f, 1.f});
|
m_subjectDrawable->hue(hue);
|
||||||
m_subjectShader
|
|
||||||
.setDiffuseColor(color)
|
|
||||||
.setAmbientColor(Color3::fromHsv({color.hue(), 1.0f, 0.3f}));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MagnumRenderer::count(int count) {
|
void MagnumRenderer::count(int count) {
|
||||||
@@ -44,6 +41,10 @@ void MagnumRenderer::count(int count) {
|
|||||||
m_subjectDrawable->count(count);
|
m_subjectDrawable->count(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Containers::Optional<ArcBallCamera> MagnumRenderer::camera() {
|
||||||
|
return m_camera;
|
||||||
|
}
|
||||||
|
|
||||||
void MagnumRenderer::lazyInitialize() {
|
void MagnumRenderer::lazyInitialize() {
|
||||||
if (m_init) return;
|
if (m_init) return;
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ void MagnumRenderer::lazyInitialize() {
|
|||||||
m_gridShader = Shaders::Flat3D{};
|
m_gridShader = Shaders::Flat3D{};
|
||||||
m_gridShader.setColor(COLOR_GRID);
|
m_gridShader.setColor(COLOR_GRID);
|
||||||
|
|
||||||
new GridDrawable{*m_gridObject, m_gridShader, m_grid, m_drawables};
|
m_gridDrawable = new GridDrawable{*m_gridObject, m_gridShader, m_grid, m_drawables};
|
||||||
}
|
}
|
||||||
|
|
||||||
// The Camera
|
// The Camera
|
||||||
@@ -150,10 +151,14 @@ void SubjectDrawable::draw(const Matrix4 &transformation,
|
|||||||
static const float width = 3.f;
|
static const float width = 3.f;
|
||||||
float x = -float(m_count)/2.f * width + width/2.f;
|
float x = -float(m_count)/2.f * width + width/2.f;
|
||||||
for (int i = 0; i < m_count; i++) {
|
for (int i = 0; i < m_count; i++) {
|
||||||
|
const auto color = Color3::fromHsv({Rad(m_hue+float(i)*.2f), 1.f, 1.f});
|
||||||
|
m_shader
|
||||||
|
.setDiffuseColor(color)
|
||||||
|
.setAmbientColor(Color3::fromHsv({color.hue(), 1.0f, 0.3f}));
|
||||||
m_shader
|
m_shader
|
||||||
.setTransformationMatrix(
|
.setTransformationMatrix(
|
||||||
transformation *
|
transformation *
|
||||||
Matrix4::translation({x, 0.f, 0.f}))
|
Matrix4::translation({x, Math::sin(Rad(m_t*2.f+float(i))), 0.f}))
|
||||||
.draw(m_mesh);
|
.draw(m_mesh);
|
||||||
x += width;
|
x += width;
|
||||||
}
|
}
|
||||||
@@ -162,3 +167,11 @@ void SubjectDrawable::draw(const Matrix4 &transformation,
|
|||||||
void SubjectDrawable::count(int count) {
|
void SubjectDrawable::count(int count) {
|
||||||
m_count = count;
|
m_count = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SubjectDrawable::hue(float hue) {
|
||||||
|
m_hue = hue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubjectDrawable::t(float t) {
|
||||||
|
m_t = t;
|
||||||
|
}
|
||||||
|
@@ -46,11 +46,15 @@ public:
|
|||||||
|
|
||||||
void draw(const Matrix4 &transformation, SceneGraph::Camera3D &camera);
|
void draw(const Matrix4 &transformation, SceneGraph::Camera3D &camera);
|
||||||
void count(int count);
|
void count(int count);
|
||||||
|
void hue(float hue);
|
||||||
|
void t(float t);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Shaders::Phong &m_shader;
|
Shaders::Phong &m_shader;
|
||||||
GL::Mesh &m_mesh;
|
GL::Mesh &m_mesh;
|
||||||
int m_count;
|
int m_count;
|
||||||
|
float m_hue;
|
||||||
|
float m_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MagnumRenderer {
|
class MagnumRenderer {
|
||||||
@@ -68,6 +72,7 @@ public:
|
|||||||
void t(float t);
|
void t(float t);
|
||||||
void hue(float hue);
|
void hue(float hue);
|
||||||
void count(int count);
|
void count(int count);
|
||||||
|
Containers::Optional<ArcBallCamera> camera();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void lazyInitialize();
|
void lazyInitialize();
|
||||||
@@ -91,6 +96,7 @@ private:
|
|||||||
GL::Mesh m_grid{NoCreate};
|
GL::Mesh m_grid{NoCreate};
|
||||||
Shaders::Flat3D m_gridShader{NoCreate};
|
Shaders::Flat3D m_gridShader{NoCreate};
|
||||||
Object3D* m_gridObject{nullptr};
|
Object3D* m_gridObject{nullptr};
|
||||||
|
GridDrawable* m_gridDrawable{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAGNUM_RENDER_H
|
#endif // MAGNUM_RENDER_H
|
||||||
|
@@ -93,8 +93,8 @@ ApplicationWindow {
|
|||||||
count: count.value
|
count: count.value
|
||||||
|
|
||||||
SequentialAnimation on t {
|
SequentialAnimation on t {
|
||||||
NumberAnimation { to: 1; duration: 2500; easing.type: Easing.InQuad }
|
NumberAnimation { to: 10; duration: 10000; easing.type: Easing.InQuad }
|
||||||
NumberAnimation { to: 0; duration: 2500; easing.type: Easing.OutQuad }
|
NumberAnimation { to: 0; duration: 10000; easing.type: Easing.OutQuad }
|
||||||
loops: Animation.Infinite
|
loops: Animation.Infinite
|
||||||
running: true
|
running: true
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user