[DEV] better rayscale and add callback on debug display
This commit is contained in:
parent
2ffa87dd73
commit
9fb437ed21
23
ege/Ray.cpp
23
ege/Ray.cpp
@ -9,6 +9,9 @@
|
|||||||
#include <ege/Ray.h>
|
#include <ege/Ray.h>
|
||||||
#include <ege/debug.h>
|
#include <ege/debug.h>
|
||||||
|
|
||||||
|
#include <BulletDynamics/Dynamics/btDynamicsWorld.h>
|
||||||
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
||||||
|
|
||||||
#undef __class__
|
#undef __class__
|
||||||
#define __class__ "Ray"
|
#define __class__ "Ray"
|
||||||
|
|
||||||
@ -36,4 +39,22 @@ std::ostream& ege::operator <<(std::ostream& _os, const ege::Ray& _obj) {
|
|||||||
_os << _obj.getDirection();
|
_os << _obj.getDirection();
|
||||||
_os << "}";
|
_os << "}";
|
||||||
return _os;
|
return _os;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ege::Ray::testRay(ege::physics::Engine& _engine) {
|
||||||
|
vec3 start = m_origin;
|
||||||
|
vec3 stop = m_origin+m_direction*1000.0f;
|
||||||
|
// Start and End are vectors
|
||||||
|
btCollisionWorld::ClosestRayResultCallback rayCallback(start, stop);
|
||||||
|
EGE_ERROR("Process Raycast :");
|
||||||
|
// Perform raycast
|
||||||
|
_engine.getDynamicWorld()->rayTest(start, stop, rayCallback);
|
||||||
|
if(rayCallback.hasHit()) {
|
||||||
|
vec3 end = rayCallback.m_hitPointWorld;
|
||||||
|
vec3 normal = rayCallback.m_hitNormalWorld;
|
||||||
|
EGE_ERROR(" hit at point=" << end << " normal=" << normal);
|
||||||
|
} else {
|
||||||
|
EGE_ERROR(" No Hit");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
#define __EGE_RAY_H__
|
#define __EGE_RAY_H__
|
||||||
|
|
||||||
#include <etk/math/Vector3D.h>
|
#include <etk/math/Vector3D.h>
|
||||||
|
namespace ege {
|
||||||
|
class Ray;
|
||||||
|
};
|
||||||
|
#include <ege/physics/Engine.h>
|
||||||
|
|
||||||
namespace ege {
|
namespace ege {
|
||||||
class Ray {
|
class Ray {
|
||||||
@ -61,6 +65,8 @@ namespace ege {
|
|||||||
* @param[in] _direction The ray's direction.
|
* @param[in] _direction The ray's direction.
|
||||||
*/
|
*/
|
||||||
void set(const vec3& _origin, const vec3& _direction);
|
void set(const vec3& _origin, const vec3& _direction);
|
||||||
|
public:
|
||||||
|
void testRay(ege::physics::Engine& _engine);
|
||||||
};
|
};
|
||||||
std::ostream& operator <<(std::ostream& _os, const ege::Ray& _obj);
|
std::ostream& operator <<(std::ostream& _os, const ege::Ray& _obj);
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,11 @@
|
|||||||
#ifndef __EGE_PHYSICS_ENGINE_H__
|
#ifndef __EGE_PHYSICS_ENGINE_H__
|
||||||
#define __EGE_PHYSICS_ENGINE_H__
|
#define __EGE_PHYSICS_ENGINE_H__
|
||||||
|
|
||||||
|
namespace ege {
|
||||||
|
namespace physics {
|
||||||
|
class Engine;
|
||||||
|
};
|
||||||
|
};
|
||||||
#include <etk/types.h>
|
#include <etk/types.h>
|
||||||
#include <etk/math/Vector3D.h>
|
#include <etk/math/Vector3D.h>
|
||||||
#include <etk/math/Matrix4.h>
|
#include <etk/math/Matrix4.h>
|
||||||
|
@ -29,9 +29,15 @@
|
|||||||
|
|
||||||
#undef __class__
|
#undef __class__
|
||||||
#define __class__ "Scene"
|
#define __class__ "Scene"
|
||||||
|
namespace etk {
|
||||||
|
template<> std::string to_string<std::shared_ptr<ewol::resource::Colored3DObject> >(const std::shared_ptr<ewol::resource::Colored3DObject>& _value) {
|
||||||
|
return "{{ERROR}}";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
ege::widget::Scene::Scene() :
|
ege::widget::Scene::Scene() :
|
||||||
m_cameraName("default") {
|
signalDisplayDebug(*this, "drawDebug", "Call to draw debug after all elements"),
|
||||||
|
m_cameraName("default") {
|
||||||
addObjectType("ege::widget::Scene");
|
addObjectType("ege::widget::Scene");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +120,7 @@ void ege::widget::Scene::onDraw() {
|
|||||||
for (int32_t iii=m_displayElementOrdered.size()-1; iii >= 0; iii--) {
|
for (int32_t iii=m_displayElementOrdered.size()-1; iii >= 0; iii--) {
|
||||||
m_displayElementOrdered[iii].element->drawDebug(m_debugDrawProperty, camera);
|
m_displayElementOrdered[iii].element->drawDebug(m_debugDrawProperty, camera);
|
||||||
}
|
}
|
||||||
|
signalDisplayDebug.emit(m_debugDrawProperty);
|
||||||
} else {
|
} else {
|
||||||
EGE_WARNING("No Dynamic world ...");
|
EGE_WARNING("No Dynamic world ...");
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ class btDynamicsWorld;
|
|||||||
#include <LinearMath/btScalar.h>
|
#include <LinearMath/btScalar.h>
|
||||||
class btVector3;
|
class btVector3;
|
||||||
#include <ewol/widget/Widget.h>
|
#include <ewol/widget/Widget.h>
|
||||||
|
#include <ewol/signal/Signal.h>
|
||||||
|
|
||||||
namespace ege {
|
namespace ege {
|
||||||
namespace widget {
|
namespace widget {
|
||||||
@ -39,6 +40,8 @@ namespace ege {
|
|||||||
protected:
|
protected:
|
||||||
std::shared_ptr<ege::Environement> m_env;
|
std::shared_ptr<ege::Environement> m_env;
|
||||||
std::shared_ptr<ewol::resource::Colored3DObject> m_debugDrawProperty;
|
std::shared_ptr<ewol::resource::Colored3DObject> m_debugDrawProperty;
|
||||||
|
public:
|
||||||
|
ewol::Signal<std::shared_ptr<ewol::resource::Colored3DObject>/*, std::shared_ptr<ege::Camera>*/> signalDisplayDebug;
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* @brief Constructor of the widget classes
|
* @brief Constructor of the widget classes
|
||||||
|
@ -82,6 +82,7 @@ void appl::Windows::init() {
|
|||||||
tmpWidget->setFill(bvec2(true,true));
|
tmpWidget->setFill(bvec2(true,true));
|
||||||
tmpWidget->setCamera("basic");
|
tmpWidget->setCamera("basic");
|
||||||
setSubWidget(tmpWidget);
|
setSubWidget(tmpWidget);
|
||||||
|
tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug);
|
||||||
}
|
}
|
||||||
std::shared_ptr<ege::resource::Mesh> myMesh;
|
std::shared_ptr<ege::resource::Mesh> myMesh;
|
||||||
// Create an external box :
|
// Create an external box :
|
||||||
@ -151,26 +152,22 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
|
|||||||
vec2 pos = relativePosition(_event.getPos());
|
vec2 pos = relativePosition(_event.getPos());
|
||||||
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
|
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
|
||||||
APPL_INFO("pos=" << pos << " ray = " << ray);
|
APPL_INFO("pos=" << pos << " ray = " << ray);
|
||||||
|
ray.testRay(m_env->getPhysicEngine());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
btCollisionWorld::ClosestRayResultCallback RayCallback(
|
void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj) {
|
||||||
btVector3(out_origin.x, out_origin.y, out_origin.z),
|
EWOL_INFO("draw user debug");
|
||||||
btVector3(out_direction.x, out_direction.y, out_direction.z)
|
etk::Color<float> tmpColor(0.0, 1.0, 0.0, 0.3);
|
||||||
);
|
std::vector<vec3> vertices;
|
||||||
dynamicsWorld->rayTest(
|
vertices.push_back(vec3(100,0,0));
|
||||||
btVector3(out_origin.x, out_origin.y, out_origin.z),
|
vertices.push_back(vec3(100,100,0));
|
||||||
btVector3(out_direction.x, out_direction.y, out_direction.z),
|
vertices.push_back(vec3(100,100,100));
|
||||||
RayCallback
|
mat4 mat;
|
||||||
);
|
mat.identity();
|
||||||
|
mat.translate(vec3(0,0,0));
|
||||||
if(RayCallback.hasHit()) {
|
_obj->draw(vertices, tmpColor, mat);
|
||||||
std::ostringstream oss;
|
|
||||||
oss << "mesh " << (int)RayCallback.m_collisionObject->getUserPointer();
|
|
||||||
message = oss.str();
|
|
||||||
}else{
|
|
||||||
message = "background";
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <ewol/widget/Windows.h>
|
#include <ewol/widget/Windows.h>
|
||||||
#include <ege/Environement.h>
|
#include <ege/Environement.h>
|
||||||
#include <ege/camera/View.h>
|
#include <ege/camera/View.h>
|
||||||
|
#include <ewol/resource/Colored3DObject.h>
|
||||||
|
|
||||||
namespace appl {
|
namespace appl {
|
||||||
class Windows : public ewol::widget::Windows {
|
class Windows : public ewol::widget::Windows {
|
||||||
@ -27,6 +28,7 @@ namespace appl {
|
|||||||
private:
|
private:
|
||||||
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
|
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
|
||||||
bool onEventInput(const ewol::event::Input& _event);
|
bool onEventInput(const ewol::event::Input& _event);
|
||||||
|
void onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user