[DEV] better rayscale and add callback on debug display

This commit is contained in:
Edouard DUPIN 2014-11-25 21:25:24 +01:00
parent 2ffa87dd73
commit 9fb437ed21
7 changed files with 61 additions and 20 deletions

View File

@ -9,6 +9,9 @@
#include <ege/Ray.h>
#include <ege/debug.h>
#include <BulletDynamics/Dynamics/btDynamicsWorld.h>
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
#undef __class__
#define __class__ "Ray"
@ -36,4 +39,22 @@ std::ostream& ege::operator <<(std::ostream& _os, const ege::Ray& _obj) {
_os << _obj.getDirection();
_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");
}
}

View File

@ -10,6 +10,10 @@
#define __EGE_RAY_H__
#include <etk/math/Vector3D.h>
namespace ege {
class Ray;
};
#include <ege/physics/Engine.h>
namespace ege {
class Ray {
@ -61,6 +65,8 @@ namespace ege {
* @param[in] _direction The ray's 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);
};

View File

@ -9,6 +9,11 @@
#ifndef __EGE_PHYSICS_ENGINE_H__
#define __EGE_PHYSICS_ENGINE_H__
namespace ege {
namespace physics {
class Engine;
};
};
#include <etk/types.h>
#include <etk/math/Vector3D.h>
#include <etk/math/Matrix4.h>

View File

@ -29,9 +29,15 @@
#undef __class__
#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() :
m_cameraName("default") {
signalDisplayDebug(*this, "drawDebug", "Call to draw debug after all elements"),
m_cameraName("default") {
addObjectType("ege::widget::Scene");
}
@ -114,6 +120,7 @@ void ege::widget::Scene::onDraw() {
for (int32_t iii=m_displayElementOrdered.size()-1; iii >= 0; iii--) {
m_displayElementOrdered[iii].element->drawDebug(m_debugDrawProperty, camera);
}
signalDisplayDebug.emit(m_debugDrawProperty);
} else {
EGE_WARNING("No Dynamic world ...");
}

View File

@ -32,6 +32,7 @@ class btDynamicsWorld;
#include <LinearMath/btScalar.h>
class btVector3;
#include <ewol/widget/Widget.h>
#include <ewol/signal/Signal.h>
namespace ege {
namespace widget {
@ -39,6 +40,8 @@ namespace ege {
protected:
std::shared_ptr<ege::Environement> m_env;
std::shared_ptr<ewol::resource::Colored3DObject> m_debugDrawProperty;
public:
ewol::Signal<std::shared_ptr<ewol::resource::Colored3DObject>/*, std::shared_ptr<ege::Camera>*/> signalDisplayDebug;
protected:
/**
* @brief Constructor of the widget classes

View File

@ -82,6 +82,7 @@ void appl::Windows::init() {
tmpWidget->setFill(bvec2(true,true));
tmpWidget->setCamera("basic");
setSubWidget(tmpWidget);
tmpWidget->signalDisplayDebug.bind(shared_from_this(), &appl::Windows::onCallbackDisplayDebug);
}
std::shared_ptr<ege::resource::Mesh> myMesh;
// Create an external box :
@ -151,26 +152,22 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
vec2 pos = relativePosition(_event.getPos());
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
APPL_INFO("pos=" << pos << " ray = " << ray);
ray.testRay(m_env->getPhysicEngine());
return true;
}
return false;
}
/*
btCollisionWorld::ClosestRayResultCallback RayCallback(
btVector3(out_origin.x, out_origin.y, out_origin.z),
btVector3(out_direction.x, out_direction.y, out_direction.z)
);
dynamicsWorld->rayTest(
btVector3(out_origin.x, out_origin.y, out_origin.z),
btVector3(out_direction.x, out_direction.y, out_direction.z),
RayCallback
);
if(RayCallback.hasHit()) {
std::ostringstream oss;
oss << "mesh " << (int)RayCallback.m_collisionObject->getUserPointer();
message = oss.str();
}else{
message = "background";
void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj) {
EWOL_INFO("draw user debug");
etk::Color<float> tmpColor(0.0, 1.0, 0.0, 0.3);
std::vector<vec3> vertices;
vertices.push_back(vec3(100,0,0));
vertices.push_back(vec3(100,100,0));
vertices.push_back(vec3(100,100,100));
mat4 mat;
mat.identity();
mat.translate(vec3(0,0,0));
_obj->draw(vertices, tmpColor, mat);
}
*/

View File

@ -12,6 +12,7 @@
#include <ewol/widget/Windows.h>
#include <ege/Environement.h>
#include <ege/camera/View.h>
#include <ewol/resource/Colored3DObject.h>
namespace appl {
class Windows : public ewol::widget::Windows {
@ -27,6 +28,7 @@ namespace appl {
private:
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
bool onEventInput(const ewol::event::Input& _event);
void onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj);
};
};