146 lines
4.3 KiB
C++
146 lines
4.3 KiB
C++
/** @file
|
|
* @author Edouard DUPIN
|
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
* @license MPL v2.0 (see license file)
|
|
*/
|
|
|
|
#include <ege/debug.hpp>
|
|
#include <ege/widget/Scene.hpp>
|
|
#include <echrono/Steady.hpp>
|
|
#include <echrono/Duration.hpp>
|
|
|
|
#include <cmath>
|
|
#include <ege/debug.hpp>
|
|
#include <ewol/ewol.hpp>
|
|
#include <ewol/object/Manager.hpp>
|
|
#include <gale/renderer/openGL/openGL.hpp>
|
|
#include <etk/math/Matrix4x4.hpp>
|
|
|
|
namespace etk {
|
|
template<> etk::String toString<ememory::SharedPtr<ewol::resource::Colored3DObject> >(const ememory::SharedPtr<ewol::resource::Colored3DObject>& _value) {
|
|
return "{{ERROR}}";
|
|
}
|
|
};
|
|
|
|
ege::widget::Scene::Scene() :
|
|
signalDisplayDebug(this, "drawDebug", "Call to draw debug after all entitys"),
|
|
propertyDebugPhysic(this, "debugPhysic",
|
|
false,
|
|
"Display debug of the physic interface"),
|
|
propertyDebugNormal(this, "debugMeshNormal",
|
|
false,
|
|
"Display debug of the mesh normal of each face"),
|
|
propertyDebugApplication(this, "debugApplication",
|
|
false,
|
|
"Display debug of the application"),
|
|
m_cameraName("default") {
|
|
addObjectType("ege::widget::Scene");
|
|
}
|
|
|
|
void ege::widget::Scene::init() {
|
|
ewol::Widget::init();
|
|
setKeyboardRepeat(false);
|
|
propertyCanFocus.set(true);
|
|
m_PCH = getObjectManager().periodicCall.connect(this, &ege::widget::Scene::periodicCall);
|
|
m_debugDrawProperty = ewol::resource::Colored3DObject::create();
|
|
}
|
|
|
|
ege::widget::Scene::~Scene() {
|
|
|
|
}
|
|
|
|
void ege::widget::Scene::onRegenerateDisplay() {
|
|
if (needRedraw() == true) {
|
|
// Update the curent camera with the aspect ratio
|
|
if (m_env != nullptr) {
|
|
ememory::SharedPtr<ege::Camera> camera = m_env->getCamera(m_cameraName);
|
|
if (camera != nullptr) {
|
|
camera->setSceenSize(getSize());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//#define SCENE_DISPLAY_SPEED
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
#ifdef SCENE_DISPLAY_SPEED
|
|
static echrono::Steady g_startTime;
|
|
static int32_t g_counterNbTimeDisplay = 0;
|
|
#endif
|
|
|
|
#define NUMBER_OF_SUB_PASS (0)
|
|
|
|
|
|
void ege::widget::Scene::onDraw() {
|
|
#ifdef SCENE_DISPLAY_SPEED
|
|
g_counterNbTimeDisplay++;
|
|
g_startTime = echrono::Steady::now();
|
|
#endif
|
|
gale::openGL::clearColor(etk::color::black);
|
|
m_env->render(echrono::Duration(1.0/60.0), m_cameraName);
|
|
signalDisplayDebug.emit(m_debugDrawProperty);
|
|
#ifdef SCENE_DISPLAY_SPEED
|
|
echrono::Duration localTime = echrono::Steady::now() - g_startTime;
|
|
if (localTime>1) {
|
|
EWOL_ERROR(" scene : " << localTime << " " << g_counterNbTimeDisplay);
|
|
} else {
|
|
EWOL_DEBUG(" scene : " << localTime << " " << g_counterNbTimeDisplay);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void ege::widget::Scene::periodicCall(const ewol::event::Time& _event) {
|
|
markToRedraw();
|
|
}
|
|
|
|
//#define SCENE_BRUT_PERFO_TEST
|
|
|
|
void ege::widget::Scene::systemDraw(const ewol::DrawProperty& _displayProp) {
|
|
#ifdef SCENE_BRUT_PERFO_TEST
|
|
int64_t tmp___startTime0 = ewol::getTime();
|
|
#endif
|
|
//EGE_INFO("DRAW ...");
|
|
gale::openGL::bindBuffer(0);
|
|
gale::openGL::push();
|
|
// here we invert the reference of the standard openGl view because the reference in the common display is Top left and not buttom left
|
|
gale::openGL::setViewPort(m_origin, m_size);
|
|
// configure render with the camera...
|
|
ememory::SharedPtr<ege::Camera> camera = m_env->getCamera(m_cameraName);
|
|
if (camera != nullptr) {
|
|
camera->configureOpenGL();
|
|
}
|
|
onDraw();
|
|
gale::openGL::pop();
|
|
#ifdef SCENE_BRUT_PERFO_TEST
|
|
float tmp___localTime1 = (float)(ewol::getTime() - tmp___startTime0) / 1000.0f;
|
|
EWOL_DEBUG(" SCENE render : " << tmp___localTime1 << "ms ");
|
|
#endif
|
|
}
|
|
|
|
|
|
void ege::widget::Scene::setCamera(const etk::String& _cameraName) {
|
|
if (m_cameraName == _cameraName) {
|
|
return;
|
|
}
|
|
m_cameraName = _cameraName;
|
|
// Update camera aspect ratio:
|
|
ememory::SharedPtr<ege::Camera> camera = m_env->getCamera(m_cameraName);
|
|
if (camera != nullptr) {
|
|
camera->setSceenSize(m_size);
|
|
}
|
|
}
|
|
|
|
void ege::widget::Scene::calculateSize() {
|
|
ewol::Widget::calculateSize();
|
|
// Update camera aspect ratio:
|
|
ememory::SharedPtr<ege::Camera> camera = m_env->getCamera(m_cameraName);
|
|
if (camera != nullptr) {
|
|
camera->setSceenSize(m_size);
|
|
}
|
|
}
|
|
|
|
//#include <esignal/details/Signal.hxx>
|
|
//ESIGNAL_DECLARE_SIGNAL(ememory::SharedPtr<ewol::resource::Colored3DObject>);
|
|
|