[DEV] set Y as up vector ==> more common and correct the raytacing exemple
This commit is contained in:
parent
7d51944355
commit
8cbe9d1a80
@ -79,13 +79,13 @@ vec2 ege::Camera::tansformPositionToAngle(vec3 _vect) {
|
|||||||
if (distance == 0.0f) {
|
if (distance == 0.0f) {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
out.setY(std::asin(_vect.z()/distance));
|
out.setY(std::asin(_vect.y()/distance));
|
||||||
_vect.setZ(0.0f);
|
_vect.setY(0.0f);
|
||||||
if (_vect.x() == 0 && _vect.y() == 0) {
|
if (_vect.x() == 0 && _vect.z() == 0) {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
_vect.normalize();
|
_vect.normalize();
|
||||||
out.setX(std::asin(_vect.y()));
|
out.setX(std::asin(_vect.z()));
|
||||||
if (_vect.x() < 0) {
|
if (_vect.x() < 0) {
|
||||||
out.setX(out.x()*-1 - M_PI);
|
out.setX(out.x()*-1 - M_PI);
|
||||||
}
|
}
|
||||||
|
@ -11,23 +11,29 @@
|
|||||||
#include <ege/Ray.hpp>
|
#include <ege/Ray.hpp>
|
||||||
|
|
||||||
void ege::camera::View::update() {
|
void ege::camera::View::update() {
|
||||||
//m_matrix = etk::matLookAt(m_eye, m_target, m_up);
|
/*
|
||||||
|
vec3 m_up(0,1,0);
|
||||||
|
m_matrix = etk::matLookAt(m_eye, m_target, m_up);
|
||||||
|
//m_matrix.transpose();
|
||||||
//m_matrix.translate(m_eye);
|
//m_matrix.translate(m_eye);
|
||||||
|
*/
|
||||||
|
// The camera view to the-z axis ...
|
||||||
m_matrix.identity();
|
m_matrix.identity();
|
||||||
|
// basic camera rotation
|
||||||
m_matrix.rotate(vec3(0,0,1), -m_angle);
|
m_matrix.rotate(vec3(0,0,1), -m_angle);
|
||||||
|
|
||||||
vec3 pos = -getViewVector();
|
vec3 pos = -getViewVector();
|
||||||
vec2 angles = tansformPositionToAngle(pos);
|
vec2 angles = tansformPositionToAngle(pos);
|
||||||
float distance = pos.length();
|
float distance = pos.length();
|
||||||
|
|
||||||
m_matrix.translate(vec3(0,0,-distance));
|
m_matrix.translate(vec3(0,0,-distance));
|
||||||
m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y());
|
m_matrix.rotate(vec3(1,0,0), angles.y());
|
||||||
m_matrix.rotate(vec3(0,0,1), -angles.x()-M_PI/2.0f);
|
m_matrix.rotate(vec3(0,1,0), angles.x()-M_PI/2.0f);
|
||||||
m_matrix.translate(-m_target);
|
m_matrix.translate(-m_target);
|
||||||
|
|
||||||
EGE_DEBUG("Camera properties : distance=" << distance );
|
EGE_DEBUG("Camera properties : distance=" << distance );
|
||||||
EGE_DEBUG(" psy=" << angles.y());
|
EGE_DEBUG(" psy=" << angles.y());
|
||||||
EGE_DEBUG(" Tetha=" << angles.x());
|
EGE_DEBUG(" Tetha=" << angles.x());
|
||||||
EGE_DEBUG(" m_eye=" << etk::to_string(m_eye));
|
EGE_DEBUG(" m_eye=" << m_eye);
|
||||||
}
|
}
|
||||||
|
|
||||||
ege::camera::View::View(const vec3& _eye, const vec3& _target, float _angle) :
|
ege::camera::View::View(const vec3& _eye, const vec3& _target, float _angle) :
|
||||||
@ -68,13 +74,12 @@ 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);
|
||||||
#if 1
|
#if 1
|
||||||
// It is not the best way to create the ray but it work . (My knowlege is not enought now ...)
|
// It is not the best way to create the ray but it work . (My knowlege is not enought now ...)
|
||||||
mat4 inverse = m_matrix.invert();
|
|
||||||
vec3 screenOffset(0,0,-1);
|
vec3 screenOffset(0,0,-1);
|
||||||
screenOffset = screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.x());
|
screenOffset = screenOffset.rotate(vec3(0,1,0), -cameraAngleOffset.x());
|
||||||
screenOffset = screenOffset.rotate(vec3(1,0,0), -cameraAngleOffset.y());
|
screenOffset = screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.y());
|
||||||
vec2 angles = tansformPositionToAngle(-getViewVector());
|
vec2 angles = tansformPositionToAngle(getViewVector());
|
||||||
screenOffset = screenOffset.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y());
|
screenOffset = screenOffset.rotate(vec3(1,0,0), angles.y());
|
||||||
screenOffset = screenOffset.rotate(vec3(0,0,1), angles.x() - M_PI/2.0f);
|
screenOffset = screenOffset.rotate(vec3(0,1,0), -angles.x() - M_PI/2.0f);
|
||||||
vec3 direction = screenOffset;
|
vec3 direction = screenOffset;
|
||||||
#else
|
#else
|
||||||
// lA PROJECTION TOURNE EN FONCTION DE L'ANGLE
|
// lA PROJECTION TOURNE EN FONCTION DE L'ANGLE
|
||||||
|
@ -73,6 +73,7 @@ void ege::widget::Scene::onDraw() {
|
|||||||
#endif
|
#endif
|
||||||
gale::openGL::clearColor(etk::color::black);
|
gale::openGL::clearColor(etk::color::black);
|
||||||
m_env->render(echrono::Duration(1.0/60.0), m_cameraName);
|
m_env->render(echrono::Duration(1.0/60.0), m_cameraName);
|
||||||
|
signalDisplayDebug.emit(m_debugDrawProperty);
|
||||||
#ifdef SCENE_DISPLAY_SPEED
|
#ifdef SCENE_DISPLAY_SPEED
|
||||||
echrono::Duration localTime = echrono::Steady::now() - g_startTime;
|
echrono::Duration localTime = echrono::Steady::now() - g_startTime;
|
||||||
if (localTime>1) {
|
if (localTime>1) {
|
||||||
|
@ -288,20 +288,6 @@ void appl::Windows::init() {
|
|||||||
}
|
}
|
||||||
m_env->propertyStatus.set(ege::gameStart);
|
m_env->propertyStatus.set(ege::gameStart);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
namespace appl {
|
|
||||||
class EntityHerit : public ege::EntityPhysic {
|
|
||||||
public:
|
|
||||||
EntityHerit(const ememory::SharedPtr<ege::Environement>& _env, bool _autoRigidBody=true) :
|
|
||||||
ege::EntityPhysic(_env, _autoRigidBody) {
|
|
||||||
setCollisionDetectionStatus(true);
|
|
||||||
}
|
|
||||||
virtual void onCollisionDetected(const ememory::SharedPtr<ege::Entity>& _obj, const vec3& _point, const vec3& _normal) {
|
|
||||||
APPL_WARNING("[" << getUID() << "] collision : pos=" << _point << " norm=" <<_normal);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
||||||
|
@ -14,10 +14,15 @@
|
|||||||
#include <ege/widget/Scene.hpp>
|
#include <ege/widget/Scene.hpp>
|
||||||
#include <ege/camera/View.hpp>
|
#include <ege/camera/View.hpp>
|
||||||
#include <etk/tool.hpp>
|
#include <etk/tool.hpp>
|
||||||
#include <ege/elements/ElementBase.hpp>
|
#include <ege/Entity.hpp>
|
||||||
#include <ege/elements/ElementPhysic.hpp>
|
#include <ege/physics/shape/Box.hpp>
|
||||||
#include <ege/physicsShape/PhysicsBox.hpp>
|
#include <ege/physics/shape/Sphere.hpp>
|
||||||
#include <ege/physicsShape/PhysicsSphere.hpp>
|
#include <ege/physics/shape/Cylinder.hpp>
|
||||||
|
#include <ege/physics/shape/Capsule.hpp>
|
||||||
|
#include <ege/physics/shape/Cone.hpp>
|
||||||
|
#include <ege/position/Component.hpp>
|
||||||
|
#include <ege/render/Component.hpp>
|
||||||
|
#include <ege/physics/Component.hpp>
|
||||||
|
|
||||||
appl::Windows::Windows() :
|
appl::Windows::Windows() :
|
||||||
m_angleTetha(0),
|
m_angleTetha(0),
|
||||||
@ -61,7 +66,7 @@ static ememory::SharedPtr<ege::resource::Mesh> createViewBoxStar() {
|
|||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
ememory::SharedPtr<ege::physics::Component> componentPhysicsPlop;
|
||||||
|
|
||||||
void appl::Windows::init() {
|
void appl::Windows::init() {
|
||||||
ewol::widget::Windows::init();
|
ewol::widget::Windows::init();
|
||||||
@ -75,7 +80,7 @@ void appl::Windows::init() {
|
|||||||
|
|
||||||
// Create basic Camera
|
// Create basic Camera
|
||||||
m_camera = ememory::makeShared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0));
|
m_camera = ememory::makeShared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0));
|
||||||
m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy)));
|
m_camera->setEye(vec3(100*std::sin(m_angleTetha),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha)));
|
||||||
m_env->addCamera("basic", m_camera);
|
m_env->addCamera("basic", m_camera);
|
||||||
|
|
||||||
ememory::SharedPtr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create();
|
ememory::SharedPtr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create();
|
||||||
@ -124,7 +129,7 @@ void appl::Windows::init() {
|
|||||||
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
|
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
|
||||||
// add all component:
|
// add all component:
|
||||||
// 1st Position component:
|
// 1st Position component:
|
||||||
etk::Transform3D transform(vec3(20,-10,10), etk::Quaternion::identity());
|
etk::Transform3D transform(vec3(-20,10,0), etk::Quaternion::identity());
|
||||||
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
|
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
|
||||||
//element->addComponent(componentPosition);
|
//element->addComponent(componentPosition);
|
||||||
// 2nd something to diplay:
|
// 2nd something to diplay:
|
||||||
@ -132,6 +137,7 @@ void appl::Windows::init() {
|
|||||||
element->addComponent(componentRender);
|
element->addComponent(componentRender);
|
||||||
// 3rd some physic:
|
// 3rd some physic:
|
||||||
ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform);
|
ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform);
|
||||||
|
componentPhysicsPlop = componentPhysics;
|
||||||
ememory::SharedPtr<ege::physics::shape::Box> physic = ememory::makeShared<ege::physics::shape::Box>();
|
ememory::SharedPtr<ege::physics::shape::Box> physic = ememory::makeShared<ege::physics::shape::Box>();
|
||||||
physic->setSize(vec3(3.01,3.01,3.01));
|
physic->setSize(vec3(3.01,3.01,3.01));
|
||||||
physic->setMass(50000);
|
physic->setMass(50000);
|
||||||
@ -146,7 +152,7 @@ void appl::Windows::init() {
|
|||||||
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
|
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
|
||||||
// add all component:
|
// add all component:
|
||||||
// 1st Position component:
|
// 1st Position component:
|
||||||
etk::Transform3D transform(vec3(-20,10,10), etk::Quaternion::identity());
|
etk::Transform3D transform(vec3(20,10,0), etk::Quaternion::identity());
|
||||||
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
|
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
|
||||||
//element->addComponent(componentPosition);
|
//element->addComponent(componentPosition);
|
||||||
// 2nd something to diplay:
|
// 2nd something to diplay:
|
||||||
@ -166,28 +172,43 @@ void appl::Windows::init() {
|
|||||||
m_env->propertyStatus.set(ege::gameStart);
|
m_env->propertyStatus.set(ege::gameStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<vec3> listpos;
|
||||||
bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
||||||
static float ploppp=1;
|
static float ploppp=1;
|
||||||
if (_event.getId() == 1) {
|
if (_event.getId() == 1) {
|
||||||
vec2 pos = relativePosition(_event.getPos());
|
if (_event.getStatus() == gale::key::status::down) {
|
||||||
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
|
vec2 pos = relativePosition(_event.getPos());
|
||||||
m_ray = ray;
|
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
|
||||||
APPL_DEBUG("pos=" << pos << " ray = " << ray);
|
m_ray = std::make_pair(ray.getOrigin(), ray.getOrigin()+ray.getDirection()*50000);
|
||||||
m_destination = ray.testRay(m_env->getPhysicEngine());
|
APPL_DEBUG("pos=" << pos << " ray = " << ray);
|
||||||
std::pair<ememory::SharedPtr<ege::Element>, std::pair<vec3,vec3>> result = ray.testRayObject(m_env->getPhysicEngine());
|
ememory::SharedPtr<ege::physics::Engine> engine = ememory::dynamicPointerCast<ege::physics::Engine>(m_env->getEngine("physics"));
|
||||||
if (result.first != nullptr) {
|
if (engine != nullptr) {
|
||||||
APPL_INFO("Select Object :" << result.first->getUID());
|
/*
|
||||||
|
std::pair<ememory::SharedPtr<ege::physic::Component>, std::pair<vec3,vec3>> result = engine->testRayObject(m_ray);
|
||||||
|
if (result.first != nullptr) {
|
||||||
|
APPL_INFO("Select Object :" << result.first->getUID());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
std::pair<vec3,vec3> result = engine->testRay(ray);
|
||||||
|
if (result.second != vec3(0,0,0)) {
|
||||||
|
APPL_INFO("impact at: pos=" << result.first << " normal=" << result.second);
|
||||||
|
m_destination = std::make_pair(result.first, result.first+result.second*50);
|
||||||
|
m_ray.second = result.first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
} else if (_event.getId() == 4) {
|
} else if (_event.getId() == 4) {
|
||||||
ploppp += 0.2f;
|
ploppp += 0.2f;
|
||||||
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),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp);
|
||||||
|
listpos.push_back(m_camera->getEye());
|
||||||
} else if (_event.getId() == 5) {
|
} else if (_event.getId() == 5) {
|
||||||
ploppp -= 0.2f;
|
ploppp -= 0.2f;
|
||||||
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),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp);
|
||||||
|
listpos.push_back(m_camera->getEye());
|
||||||
} else if (_event.getId() == 3) {
|
} else if (_event.getId() == 3) {
|
||||||
if (_event.getStatus() == gale::key::status::down) {
|
if (_event.getStatus() == gale::key::status::down) {
|
||||||
m_oldScreenPos = relativePosition(_event.getPos());
|
m_oldScreenPos = relativePosition(_event.getPos());
|
||||||
@ -196,7 +217,8 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
|||||||
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.05f;
|
||||||
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),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp);
|
||||||
|
listpos.push_back(m_camera->getEye());
|
||||||
m_oldScreenPos = relativePosition(_event.getPos());
|
m_oldScreenPos = relativePosition(_event.getPos());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -211,14 +233,14 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resour
|
|||||||
// Display ray line
|
// Display ray line
|
||||||
if (true) {
|
if (true) {
|
||||||
static std::vector<vec3> vertices;
|
static std::vector<vec3> vertices;
|
||||||
if (m_ray.getOrigin() != vec3(0,0,0)) {
|
if (m_ray.first != vec3(0,0,0)) {
|
||||||
vertices.push_back(m_ray.getOrigin());
|
vertices.push_back(m_ray.first);
|
||||||
vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*50);
|
vertices.push_back(m_ray.second);
|
||||||
// prevent Ray removing with empty
|
// prevent Ray removing with empty
|
||||||
m_ray.setOrigin(vec3(0,0,0));
|
m_ray.first = vec3(0,0,0);
|
||||||
}
|
}
|
||||||
if (vertices.size() > 250) {
|
if (vertices.size() > 250) {
|
||||||
vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250);
|
vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-25);
|
||||||
}
|
}
|
||||||
obj->drawLine(vertices, etk::Color<float>(0.0, 1.0, 0.0, 0.8), mat);
|
obj->drawLine(vertices, etk::Color<float>(0.0, 1.0, 0.0, 0.8), mat);
|
||||||
}
|
}
|
||||||
@ -227,13 +249,24 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resour
|
|||||||
static std::vector<vec3> vertices;
|
static std::vector<vec3> vertices;
|
||||||
if (m_destination.second != vec3(0,0,0)) {
|
if (m_destination.second != vec3(0,0,0)) {
|
||||||
vertices.push_back(m_destination.first);
|
vertices.push_back(m_destination.first);
|
||||||
vertices.push_back(m_destination.first + m_destination.second*20);
|
vertices.push_back(m_destination.second);
|
||||||
m_destination.second = vec3(0,0,0);
|
m_destination.second = vec3(0,0,0);
|
||||||
}
|
}
|
||||||
if (vertices.size() > 250) {
|
if (vertices.size() > 250) {
|
||||||
vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250);
|
vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-25);
|
||||||
}
|
}
|
||||||
obj->drawLine(vertices, etk::Color<float>(1.0, 0.0, 0.0, 0.8), mat);
|
obj->drawLine(vertices, etk::Color<float>(1.0, 0.0, 0.0, 0.8), mat);
|
||||||
}
|
}
|
||||||
|
if (listpos.size() >= 1) {
|
||||||
|
vec3 last(0,0,0);
|
||||||
|
static std::vector<vec3> vertices;
|
||||||
|
for (auto &it: listpos) {
|
||||||
|
vertices.push_back(last);
|
||||||
|
last = it;
|
||||||
|
vertices.push_back(last);
|
||||||
|
|
||||||
|
}
|
||||||
|
obj->drawLine(vertices, etk::Color<float>(1.0, 1.0, 0.0, 0.8), mat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <ege/Environement.hpp>
|
#include <ege/Environement.hpp>
|
||||||
#include <ege/camera/View.hpp>
|
#include <ege/camera/View.hpp>
|
||||||
#include <ewol/resource/Colored3DObject.hpp>
|
#include <ewol/resource/Colored3DObject.hpp>
|
||||||
|
#include <ege/Ray.hpp>
|
||||||
|
|
||||||
namespace appl {
|
namespace appl {
|
||||||
class Windows : public ewol::widget::Windows {
|
class Windows : public ewol::widget::Windows {
|
||||||
@ -26,7 +27,7 @@ namespace appl {
|
|||||||
private:
|
private:
|
||||||
bool onEventInput(const ewol::event::Input& _event);
|
bool onEventInput(const ewol::event::Input& _event);
|
||||||
void onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resource::Colored3DObject>& _obj);
|
void onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resource::Colored3DObject>& _obj);
|
||||||
ege::Ray m_ray;
|
std::pair<vec3,vec3> m_ray;
|
||||||
float m_angleTetha;
|
float m_angleTetha;
|
||||||
float m_anglePsy;
|
float m_anglePsy;
|
||||||
vec2 m_oldScreenPos;
|
vec2 m_oldScreenPos;
|
||||||
|
@ -28,7 +28,7 @@ def get_maintainer():
|
|||||||
return ["Mr DUPIN Edouard <yui.heero@gmail.com>"]
|
return ["Mr DUPIN Edouard <yui.heero@gmail.com>"]
|
||||||
|
|
||||||
def get_version():
|
def get_version():
|
||||||
return [0,1]
|
return [0,2]
|
||||||
|
|
||||||
def configure(target, my_module):
|
def configure(target, my_module):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user