From 1b1c9ed887fb0eea4b2d32b39af13d783193f88f Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 2 Dec 2014 22:04:25 +0100 Subject: [PATCH] [DEV] correct multiple view interface --- ege/camera/Camera.h | 2 +- ege/camera/View.cpp | 41 ++++++++++++++++++++++---- ege/camera/View.h | 2 ++ sample/DoubleView/appl/Windows.cpp | 46 +++++++++++++++++++++++------- 4 files changed, 75 insertions(+), 16 deletions(-) diff --git a/ege/camera/Camera.h b/ege/camera/Camera.h index 20f9827..f2ba8ea 100644 --- a/ege/camera/Camera.h +++ b/ege/camera/Camera.h @@ -19,7 +19,7 @@ namespace ege { - class Camera { + class Camera : public std::enable_shared_from_this{ public: /** * @brief Constructor. diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index 27d454f..fc604f9 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -60,6 +60,13 @@ vec3 ege::camera::View::getViewVector() const { return m_target - m_eye; } +float ege::camera::View::getTetha() { + return tansformPositionToAngle(-getViewVector()).x(); +} + +float ege::camera::View::getPsy() { + return tansformPositionToAngle(-getViewVector()).y(); +} ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { vec2 cameraAngleOffset(m_angleView*0.5f*_offset.x(), _offset.y()*0.5f*m_angleView/m_aspectRatio); @@ -90,10 +97,34 @@ ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { void ege::camera::View::drawDebug(const std::shared_ptr& _draw, const std::shared_ptr& _camera) { mat4 mat; + if (_camera != shared_from_this()) { + mat.identity(); + vec2 angles = tansformPositionToAngle(-getViewVector()); + mat.rotate(vec3(0,0,1), angles.x() - M_PI/2.0f); + mat.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); + mat.translate(vec3(0,0,getViewVector().length())); + mat.rotate(vec3(0,0,1), m_angle); + //mat.translate(vec3(m_eye.x(), m_eye.y(), m_eye.z())); + _draw->drawSquare(vec3(2,2,2), mat, etk::Color(0.0f, 0.0f, 1.0f, 1.0f)); + std::vector EwolVertices; + EwolVertices.push_back(vec3(0,0,0)); + EwolVertices.push_back(vec3(-5,-5,-5)); + EwolVertices.push_back(vec3(5,-5,-5)); + + EwolVertices.push_back(vec3(0,0,0)); + EwolVertices.push_back(vec3(5,-5,-5)); + EwolVertices.push_back(vec3(5,5,-5)); + + EwolVertices.push_back(vec3(0,0,0)); + EwolVertices.push_back(vec3(5,5,-5)); + EwolVertices.push_back(vec3(-5,5,-5)); + + EwolVertices.push_back(vec3(0,0,0)); + EwolVertices.push_back(vec3(-5,5,-5)); + EwolVertices.push_back(vec3(-5,-5,-5)); + _draw->draw(EwolVertices, etk::Color(0.0f, 0.0f, 1.0f, 0.5f), mat); + } mat.identity(); - vec2 angles = tansformPositionToAngle(-getViewVector()); - mat.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); - mat.rotate(vec3(0,0,1), angles.x() - M_PI/2.0f); - mat.translate(m_eye); - _draw->drawSquare(vec3(5,5,5), mat, etk::Color(0.0f, 0.0f, 1.0f, 1.0f)); + mat.translate(m_target); + _draw->drawSphere(1, 3, 3, mat, etk::Color(0.0f, 0.0f, 1.0f, 1.0f)); } diff --git a/ege/camera/View.h b/ege/camera/View.h index 86764c0..225ff3c 100644 --- a/ege/camera/View.h +++ b/ege/camera/View.h @@ -78,6 +78,8 @@ namespace ege { public: virtual ege::Ray getRayFromScreen(const vec2& _offset); virtual void drawDebug(const std::shared_ptr& _draw, const std::shared_ptr& _camera); + virtual float getTetha(); + virtual float getPsy(); }; }; }; diff --git a/sample/DoubleView/appl/Windows.cpp b/sample/DoubleView/appl/Windows.cpp index 3fba713..cbc838f 100644 --- a/sample/DoubleView/appl/Windows.cpp +++ b/sample/DoubleView/appl/Windows.cpp @@ -82,8 +82,11 @@ void appl::Windows::init() { std::shared_ptr camera2 = std::make_shared(vec3(100,0,0), vec3(0,0,0)); m_env->addCamera("front", camera2); // Create basic Camera - std::shared_ptr camera3 = std::make_shared(vec3(0,100,0), vec3(0,0,0)); - m_env->addCamera("left", camera3); + std::shared_ptr camera3 = std::make_shared(vec3(20,20,100), vec3(0,0,0)); + m_env->addCamera("top", camera3); + // Create basic Camera + std::shared_ptr camera4 = std::make_shared(vec3(0,100,0), vec3(0,0,0)); + m_env->addCamera("left", camera4); std::shared_ptr tmpSizerVert = ewol::widget::Sizer::create(ewol::widget::Sizer::modeVert); if (tmpSizerVert == nullptr) { @@ -121,7 +124,7 @@ void appl::Windows::init() { } else { tmpWidget->setExpand(bvec2(true,true)); tmpWidget->setFill(bvec2(true,true)); - tmpWidget->setCamera("left"); + tmpWidget->setCamera("top"); tmpSizerHori->subWidgetAdd(tmpWidget); tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug); } @@ -192,14 +195,14 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { } return true; } else if (_event.getId() == 4) { - ploppp += 0.2f; - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + ploppp += 0.01f; + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*ploppp); } else if (_event.getId() == 5) { - ploppp -= 0.2f; + ploppp -= 0.01f; if (ploppp == 0) { ploppp = 1.0f; } - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*ploppp); } else if (_event.getId() == 3) { if (_event.getStatus() == ewol::key::statusDown) { m_oldScreenPos = relativePosition(_event.getPos()); @@ -207,12 +210,35 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { } else if (_event.getStatus() == ewol::key::statusMove) { vec2 pos = relativePosition(_event.getPos()); m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f; - m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.05f; - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.01f; + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*ploppp); m_oldScreenPos = relativePosition(_event.getPos()); return true; } - } + } else if (_event.getId() == 2) { + if (_event.getStatus() == ewol::key::statusDown) { + m_oldScreenPos = relativePosition(_event.getPos()); + return true; + } else if (_event.getStatus() == ewol::key::statusMove) { + vec2 pos = relativePosition(_event.getPos())*0.2; + pos -= m_oldScreenPos*0.2; + float cameraAngle = m_camera->getTetha(); + vec3 newPos = vec3(std::sin(cameraAngle)*pos.x() + std::cos(cameraAngle)*pos.y(), + std::cos(cameraAngle)*pos.x() + std::sin(cameraAngle)*pos.y(), + 0); + APPL_ERROR("apply offset = " << newPos << " from pos=" << pos << " angle=" << cameraAngle); + newPos += m_camera->getTarget(); + newPos.setMin(vec3(200,200,200)); + newPos.setMax(vec3(-200,-200,-200)); + m_camera->setTarget(newPos); + m_oldScreenPos = relativePosition(_event.getPos()); + return true; + } + } else if (_event.getId() == 10) { + m_camera->setAngle(m_camera->getAngle() + 0.01f); + } else if (_event.getId() == 11) { + m_camera->setAngle(m_camera->getAngle() - 0.01f); + } return false; }