[DEV] correct multiple view interface
This commit is contained in:
parent
fd45ef5f77
commit
1b1c9ed887
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
|
|
||||||
namespace ege {
|
namespace ege {
|
||||||
class Camera {
|
class Camera : public std::enable_shared_from_this<Camera>{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Constructor.
|
* @brief Constructor.
|
||||||
|
@ -60,6 +60,13 @@ vec3 ege::camera::View::getViewVector() const {
|
|||||||
return m_target - m_eye;
|
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) {
|
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);
|
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<ewol::resource::Colored3DObject>& _draw, const std::shared_ptr<ege::Camera>& _camera) {
|
void ege::camera::View::drawDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _draw, const std::shared_ptr<ege::Camera>& _camera) {
|
||||||
mat4 mat;
|
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<float>(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
|
std::vector<vec3> 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<float>(0.0f, 0.0f, 1.0f, 0.5f), mat);
|
||||||
|
}
|
||||||
mat.identity();
|
mat.identity();
|
||||||
vec2 angles = tansformPositionToAngle(-getViewVector());
|
mat.translate(m_target);
|
||||||
mat.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y());
|
_draw->drawSphere(1, 3, 3, mat, etk::Color<float>(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
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<float>(0.0f, 0.0f, 1.0f, 1.0f));
|
|
||||||
}
|
}
|
||||||
|
@ -78,6 +78,8 @@ namespace ege {
|
|||||||
public:
|
public:
|
||||||
virtual ege::Ray getRayFromScreen(const vec2& _offset);
|
virtual ege::Ray getRayFromScreen(const vec2& _offset);
|
||||||
virtual void drawDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _draw, const std::shared_ptr<ege::Camera>& _camera);
|
virtual void drawDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _draw, const std::shared_ptr<ege::Camera>& _camera);
|
||||||
|
virtual float getTetha();
|
||||||
|
virtual float getPsy();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -82,8 +82,11 @@ void appl::Windows::init() {
|
|||||||
std::shared_ptr<ege::camera::View> camera2 = std::make_shared<ege::camera::View>(vec3(100,0,0), vec3(0,0,0));
|
std::shared_ptr<ege::camera::View> camera2 = std::make_shared<ege::camera::View>(vec3(100,0,0), vec3(0,0,0));
|
||||||
m_env->addCamera("front", camera2);
|
m_env->addCamera("front", camera2);
|
||||||
// Create basic Camera
|
// Create basic Camera
|
||||||
std::shared_ptr<ege::camera::View> camera3 = std::make_shared<ege::camera::View>(vec3(0,100,0), vec3(0,0,0));
|
std::shared_ptr<ege::camera::View> camera3 = std::make_shared<ege::camera::View>(vec3(20,20,100), vec3(0,0,0));
|
||||||
m_env->addCamera("left", camera3);
|
m_env->addCamera("top", camera3);
|
||||||
|
// Create basic Camera
|
||||||
|
std::shared_ptr<ege::camera::View> camera4 = std::make_shared<ege::camera::View>(vec3(0,100,0), vec3(0,0,0));
|
||||||
|
m_env->addCamera("left", camera4);
|
||||||
|
|
||||||
std::shared_ptr<ewol::widget::Sizer> tmpSizerVert = ewol::widget::Sizer::create(ewol::widget::Sizer::modeVert);
|
std::shared_ptr<ewol::widget::Sizer> tmpSizerVert = ewol::widget::Sizer::create(ewol::widget::Sizer::modeVert);
|
||||||
if (tmpSizerVert == nullptr) {
|
if (tmpSizerVert == nullptr) {
|
||||||
@ -121,7 +124,7 @@ void appl::Windows::init() {
|
|||||||
} else {
|
} else {
|
||||||
tmpWidget->setExpand(bvec2(true,true));
|
tmpWidget->setExpand(bvec2(true,true));
|
||||||
tmpWidget->setFill(bvec2(true,true));
|
tmpWidget->setFill(bvec2(true,true));
|
||||||
tmpWidget->setCamera("left");
|
tmpWidget->setCamera("top");
|
||||||
tmpSizerHori->subWidgetAdd(tmpWidget);
|
tmpSizerHori->subWidgetAdd(tmpWidget);
|
||||||
tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug);
|
tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug);
|
||||||
}
|
}
|
||||||
@ -192,14 +195,14 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (_event.getId() == 4) {
|
} else if (_event.getId() == 4) {
|
||||||
ploppp += 0.2f;
|
ploppp += 0.01f;
|
||||||
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() == 5) {
|
} else if (_event.getId() == 5) {
|
||||||
ploppp -= 0.2f;
|
ploppp -= 0.01f;
|
||||||
if (ploppp == 0) {
|
if (ploppp == 0) {
|
||||||
ploppp = 1.0f;
|
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) {
|
} else if (_event.getId() == 3) {
|
||||||
if (_event.getStatus() == ewol::key::statusDown) {
|
if (_event.getStatus() == ewol::key::statusDown) {
|
||||||
m_oldScreenPos = relativePosition(_event.getPos());
|
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) {
|
} else if (_event.getStatus() == ewol::key::statusMove) {
|
||||||
vec2 pos = relativePosition(_event.getPos());
|
vec2 pos = relativePosition(_event.getPos());
|
||||||
m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f;
|
m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f;
|
||||||
m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.05f;
|
m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.01f;
|
||||||
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);
|
||||||
m_oldScreenPos = relativePosition(_event.getPos());
|
m_oldScreenPos = relativePosition(_event.getPos());
|
||||||
return true;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user