187 lines
6.2 KiB
C++
187 lines
6.2 KiB
C++
/** @file
|
|
* @author Edouard DUPIN
|
|
* @copyright 2013, Edouard DUPIN, all right reserved
|
|
* @license MPL v2.0 (see license file)
|
|
*/
|
|
|
|
|
|
#include <ewol/object/Object.hpp>
|
|
#include <ewol/object/Manager.hpp>
|
|
#include <ege/camera/ControlBase.hpp>
|
|
#include <ege/debug.hpp>
|
|
|
|
|
|
ege::camera::ControlBase::ControlBase() :
|
|
m_destinationCameraOffset(0,0,0),
|
|
m_angleTetha(0.0f),
|
|
m_anglePsy(0.0f),
|
|
m_distance(1.0f) {
|
|
|
|
}
|
|
|
|
void ege::camera::ControlBase::setCamera(const ememory::SharedPtr<ege::camera::View>& _camera) {
|
|
m_camera.reset();
|
|
m_PCH.disconnect();
|
|
if (_camera == nullptr) {
|
|
return;
|
|
}
|
|
m_camera = _camera;
|
|
m_camera->setTarget(vec3(0,0,0));
|
|
m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*m_distance);
|
|
m_PCH = ewol::Object::getObjectManager().periodicCall.connect(this, &ege::camera::ControlBase::periodicCall);
|
|
}
|
|
|
|
|
|
|
|
bool ege::camera::ControlBase::onEventEntry(const ewol::event::Entry& _event) {
|
|
if (_event.getType() == gale::key::keyboard::left) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset += vec3(1,0,0);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset -= vec3(1,0,0);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::right) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset -= vec3(1,0,0);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset += vec3(1,0,0);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::up) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset += vec3(0,1,0);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset -= vec3(0,1,0);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::down) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset -= vec3(0,1,0);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset += vec3(0,1,0);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::pageUp) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset += vec3(0,0,1);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset -= vec3(0,0,1);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::pageDown) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_destinationCameraOffset -= vec3(0,0,1);
|
|
} else if (_event.getStatus() == gale::key::status::up) {
|
|
m_destinationCameraOffset += vec3(0,0,1);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::start) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_camera->setAngle(m_camera->getAngle() + 0.01f);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::end) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_camera->setAngle(m_camera->getAngle() - 0.01f);
|
|
}
|
|
return true;
|
|
}
|
|
if (_event.getType() == gale::key::keyboard::insert) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_camera->setXAngleView(m_camera->getXAngleView() + 0.01f);
|
|
}
|
|
return true;
|
|
}
|
|
if ( _event.getType() == gale::key::keyboard::character
|
|
&& _event.getChar() == u32char::Suppress) {
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_camera->setXAngleView(m_camera->getXAngleView() - 0.01f);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool ege::camera::ControlBase::onEventInput(const ewol::event::Input& _event, const vec2& _relativePosition) {
|
|
if (m_camera == nullptr) {
|
|
return false;
|
|
}
|
|
if (_event.getId() == 4) {
|
|
// scrool button ==> zoom in
|
|
m_distance += 0.01f;
|
|
m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*m_distance);
|
|
return true;
|
|
} else if (_event.getId() == 5) {
|
|
// scrool button ==> zoom OUT
|
|
m_distance -= 0.01f;
|
|
if (m_distance <= 0.05f) {
|
|
m_distance = 0.05f;
|
|
}
|
|
m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*m_distance);
|
|
return true;
|
|
} else if (_event.getId() == 3) {
|
|
// Middle button ==> move around the target position
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_oldScreenPos = _relativePosition;
|
|
} else if (_event.getStatus() == gale::key::status::move) {
|
|
vec2 pos = _relativePosition;
|
|
m_angleTetha += (m_oldScreenPos.x()-pos.x())*0.02f;
|
|
m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.01f;
|
|
m_camera->setEye(m_camera->getTarget() + vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),80*std::cos(m_anglePsy))*m_distance);
|
|
m_oldScreenPos = _relativePosition;
|
|
}
|
|
return true;
|
|
} else if (_event.getId() == 2) {
|
|
// Middle button ==> move the camera view axis
|
|
if (_event.getStatus() == gale::key::status::down) {
|
|
m_oldScreenPos = _relativePosition;
|
|
} else if (_event.getStatus() == gale::key::status::move) {
|
|
vec2 pos = _relativePosition*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);
|
|
EGE_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;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void ege::camera::ControlBase::periodicCall(const ewol::event::Time& _event) {
|
|
if (m_camera == nullptr) {
|
|
return;
|
|
}
|
|
if ( m_destinationCameraOffset.x() < 0.7f
|
|
&& m_destinationCameraOffset.x() > -0.7f) {
|
|
m_destinationCameraOffset.setX(0.0f);
|
|
}
|
|
if ( m_destinationCameraOffset.y() < 0.7f
|
|
&& m_destinationCameraOffset.y() > -0.7f) {
|
|
m_destinationCameraOffset.setY(0.0f);
|
|
}
|
|
if ( m_destinationCameraOffset.z() < 0.7f
|
|
&& m_destinationCameraOffset.z() > -0.7f) {
|
|
m_destinationCameraOffset.setZ(0.0f);
|
|
}
|
|
float delta = _event.getDeltaCall();
|
|
vec3 tmp = m_destinationCameraOffset * delta * 30.0f;
|
|
m_camera->setTarget(m_camera->getTarget() + tmp);
|
|
m_camera->setEye(m_camera->getEye() + tmp);
|
|
}
|
|
|