[DEV] nearly work but the object does not update their positions ..

This commit is contained in:
Edouard DUPIN 2017-05-19 22:05:43 +02:00
parent d72cefd665
commit 80793fb4da
7 changed files with 143 additions and 57 deletions

View File

@ -499,14 +499,14 @@ void ege::Environement::render(const echrono::Duration& _delta, const std::strin
if(it == nullptr) { if(it == nullptr) {
continue; continue;
} }
EGE_INFO(" render: " << it->getType()); EGE_VERBOSE(" render: " << it->getType());
it->render(_delta, camera); it->render(_delta, camera);
} }
} }
void ege::Environement::onCallbackPeriodicCall(const ewol::event::Time& _event) { void ege::Environement::onCallbackPeriodicCall(const ewol::event::Time& _event) {
float curentDelta = _event.getDeltaCall(); float curentDelta = _event.getDeltaCall();
EGE_INFO("periodic call : " << _event); EGE_VERBOSE("periodic call : " << _event);
// small hack to change speed ... // small hack to change speed ...
curentDelta *= *propertyRatio; curentDelta *= *propertyRatio;
// check if the processing is availlable // check if the processing is availlable
@ -517,7 +517,7 @@ void ege::Environement::onCallbackPeriodicCall(const ewol::event::Time& _event)
int32_t lastGameTime = m_gameTime*0.000001f; int32_t lastGameTime = m_gameTime*0.000001f;
m_gameTime += curentDelta; m_gameTime += curentDelta;
if (lastGameTime != (int32_t)(m_gameTime*0.000001f)) { if (lastGameTime != (int32_t)(m_gameTime*0.000001f)) {
EGE_INFO(" Emit Signal"); EGE_VERBOSE(" Emit Signal");
signalPlayTimeChange.emit(m_gameTime*0.000001f); signalPlayTimeChange.emit(m_gameTime*0.000001f);
} }
@ -526,16 +526,16 @@ void ege::Environement::onCallbackPeriodicCall(const ewol::event::Time& _event)
// update camera positions: // update camera positions:
for (auto &it : m_listCamera) { for (auto &it : m_listCamera) {
if (it.second != nullptr) { if (it.second != nullptr) {
EGE_INFO(" update camera : '" << it.first << "'"); EGE_VERBOSE(" update camera : '" << it.first << "'");
it.second->periodicCall(curentDelta); it.second->periodicCall(curentDelta);
} }
} }
EGE_INFO(" step simulation : " << curentDelta); EGE_VERBOSE(" step simulation : " << curentDelta);
for (auto &it: m_engine) { for (auto &it: m_engine) {
if(it == nullptr) { if(it == nullptr) {
continue; continue;
} }
EGE_INFO(" update: " << it->getType()); EGE_VERBOSE(" update: " << it->getType());
it->update(echrono::Duration(double(curentDelta))); it->update(echrono::Duration(double(curentDelta)));
} }

View File

@ -42,6 +42,23 @@ ege::physics::Component::Component(ememory::SharedPtr<ege::Environement> _env, c
m_rigidBody = m_engine->getDynamicWorld()->createRigidBody(transform); m_rigidBody = m_engine->getDynamicWorld()->createRigidBody(transform);
} }
void ege::physics::Component::setType(enum ege::physics::Component::type _type) {
if (m_rigidBody == nullptr) {
return;
}
switch(_type) {
case ege::physics::Component::type::bodyStatic:
m_rigidBody->setType(rp3d::STATIC);
break;
case ege::physics::Component::type::bodyKinematic:
m_rigidBody->setType(rp3d::KINEMATIC);
break;
case ege::physics::Component::type::bodyDynamic:
m_rigidBody->setType(rp3d::DYNAMIC);
break;
}
}
ege::physics::Component::~Component() { ege::physics::Component::~Component() {
if (m_rigidBody == nullptr) { if (m_rigidBody == nullptr) {
return; return;
@ -73,7 +90,8 @@ void ege::physics::Component::generate() {
tmpElement->getSize().y(), tmpElement->getSize().y(),
tmpElement->getSize().z()); tmpElement->getSize().z());
// Create the box shape // Create the box shape
rp3d::BoxShape shape(halfExtents); rp3d::BoxShape* shape = new rp3d::BoxShape(halfExtents);
m_listShape.push_back(shape);
rp3d::Vector3 position(tmpElement->getOrigin().x(), rp3d::Vector3 position(tmpElement->getOrigin().x(),
tmpElement->getOrigin().y(), tmpElement->getOrigin().y(),
tmpElement->getOrigin().z()); tmpElement->getOrigin().z());
@ -82,7 +100,8 @@ void ege::physics::Component::generate() {
tmpElement->getQuaternion().z(), tmpElement->getQuaternion().z(),
tmpElement->getQuaternion().w()); tmpElement->getQuaternion().w());
rp3d::Transform transform(position, orientation); rp3d::Transform transform(position, orientation);
m_rigidBody->addCollisionShape(&shape, transform, 4.0f /* mass */); rp3d::ProxyShape* proxyShape = m_rigidBody->addCollisionShape(shape, transform, 4.0f /* mass */);
m_listProxyShape.push_back(proxyShape);
break; break;
} }
case ege::PhysicsShape::cylinder : { case ege::PhysicsShape::cylinder : {
@ -93,7 +112,7 @@ void ege::physics::Component::generate() {
continue; continue;
} }
// Create the box shape // Create the box shape
rp3d::CylinderShape shape(tmpElement->getSize().x(), tmpElement->getSize().y()); rp3d::CylinderShape* shape = new rp3d::CylinderShape(tmpElement->getSize().x(), tmpElement->getSize().y());
rp3d::Vector3 position(tmpElement->getOrigin().x(), rp3d::Vector3 position(tmpElement->getOrigin().x(),
tmpElement->getOrigin().y(), tmpElement->getOrigin().y(),
tmpElement->getOrigin().z()); tmpElement->getOrigin().z());
@ -102,7 +121,8 @@ void ege::physics::Component::generate() {
tmpElement->getQuaternion().z(), tmpElement->getQuaternion().z(),
tmpElement->getQuaternion().w()); tmpElement->getQuaternion().w());
rp3d::Transform transform(position, orientation); rp3d::Transform transform(position, orientation);
m_rigidBody->addCollisionShape(&shape, transform, 4.0f /* mass */); rp3d::ProxyShape* proxyShape = m_rigidBody->addCollisionShape(shape, transform, 4.0f /* mass */);
m_listProxyShape.push_back(proxyShape);
break; break;
} }
case ege::PhysicsShape::capsule : { case ege::PhysicsShape::capsule : {
@ -197,6 +217,46 @@ void ege::physics::Component::generate() {
} }
} }
vec3 ege::physics::Component::getLinearVelocity() const {
if (m_rigidBody == nullptr) {
return vec3(0,0,0);
}
rp3d::Vector3 value = m_rigidBody->getLinearVelocity();
return vec3(value.x,
value.y,
value.z);
}
void ege::physics::Component::setLinearVelocity(const vec3& _linearVelocity) {
if (m_rigidBody == nullptr) {
return;
}
rp3d::Vector3 value(_linearVelocity.x(),
_linearVelocity.y(),
_linearVelocity.z());
m_rigidBody->setLinearVelocity(value);
}
vec3 ege::physics::Component::getAngularVelocity() const {
if (m_rigidBody == nullptr) {
return vec3(0,0,0);
}
rp3d::Vector3 value = m_rigidBody->getAngularVelocity();
return vec3(value.x,
value.y,
value.z);
}
void ege::physics::Component::setAngularVelocity(const vec3& _angularVelocity) {
if (m_rigidBody == nullptr) {
return;
}
rp3d::Vector3 value(_angularVelocity.x(),
_angularVelocity.y(),
_angularVelocity.z());
m_rigidBody->setAngularVelocity(value);
}
const std::vector<ememory::SharedPtr<ege::PhysicsShape>>& ege::physics::Component::getShape() const { const std::vector<ememory::SharedPtr<ege::PhysicsShape>>& ege::physics::Component::getShape() const {
return m_shape; return m_shape;
} }

View File

@ -23,6 +23,8 @@ namespace ege {
protected: protected:
ememory::SharedPtr<ege::physics::Engine> m_engine; ememory::SharedPtr<ege::physics::Engine> m_engine;
rp3d::RigidBody* m_rigidBody; rp3d::RigidBody* m_rigidBody;
std::vector<rp3d::CollisionShape*> m_listShape;
std::vector<rp3d::ProxyShape*> m_listProxyShape;
public: public:
/** /**
* @brief Create a basic position component (no orientation and position (0,0,0)) * @brief Create a basic position component (no orientation and position (0,0,0))
@ -36,6 +38,13 @@ namespace ege {
~Component(); ~Component();
public: public:
virtual const std::string& getType() const; virtual const std::string& getType() const;
enum class type {
bodyDynamic,
bodyStatic,
bodyKinematic
};
void setType(enum ege::physics::Component::type _type);
/** /**
* @brief set a new transformation * @brief set a new transformation
* @param[in] _transform transformation of the position * @param[in] _transform transformation of the position
@ -46,6 +55,26 @@ namespace ege {
* @return Transformation of the position * @return Transformation of the position
*/ */
etk::Transform3D getTransform() const; etk::Transform3D getTransform() const;
/**
* @brief Get the linear velocity.
* @return The linear velocity vector of the body
*/
vec3 getLinearVelocity() const;
/**
* @brief Set the linear velocity.
* @param[in] _linearVelocity The linear velocity vector of the body
*/
void setLinearVelocity(const vec3& _linearVelocity);
/**
* @brief Get the angular velocity.
* @return The angular velocity vector of the body
*/
vec3 getAngularVelocity() const;
/**
* @brief Set the angular velocity.
* @param[in] _linearVelocity The angular velocity vector of the body
*/
void setAngularVelocity(const vec3& _angularVelocity);
protected: protected:
std::vector<ememory::SharedPtr<ege::PhysicsShape>> m_shape; //!< collision shape module ... (independent of bullet lib) std::vector<ememory::SharedPtr<ege::PhysicsShape>> m_shape; //!< collision shape module ... (independent of bullet lib)
public: public:

View File

@ -80,6 +80,7 @@ void ege::render::Component::draw(int32_t _pass) {
//EGE_INFO(" mat = " << mat4(mmm)); //EGE_INFO(" mat = " << mat4(mmm));
mat4 transformationMatrix(mmm); mat4 transformationMatrix(mmm);
//mat4 transformationMatrix = mat4(mmm) * etk::matScale(vec3(20,20,20)); //mat4 transformationMatrix = mat4(mmm) * etk::matScale(vec3(20,20,20));
transformationMatrix.transpose();
// TODO: check this : transformationMatrix.transpose(); // TODO: check this : transformationMatrix.transpose();
m_mesh->draw(transformationMatrix); m_mesh->draw(transformationMatrix);
} }

View File

@ -36,7 +36,7 @@ namespace ege {
const std::string& _materialName="basics"); const std::string& _materialName="basics");
static ememory::SharedPtr<ege::resource::Mesh> createCube(float _size=1.0f, static ememory::SharedPtr<ege::resource::Mesh> createCube(float _size=1.0f,
const std::string& _materialName="basics", const std::string& _materialName="basics",
const etk::Color<float>& _color=etk::color::white); const etk::Color<float>& _color=etk::color::green);
public: public:
/** /**
* @not_in_doc * @not_in_doc

View File

@ -71,6 +71,7 @@ void ege::widget::Scene::onDraw() {
g_counterNbTimeDisplay++; g_counterNbTimeDisplay++;
g_startTime = echrono::Steady::now(); g_startTime = echrono::Steady::now();
#endif #endif
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);
#if 0 #if 0
// draw constant object: // draw constant object:

View File

@ -22,6 +22,7 @@
#include <ege/position/Component.hpp> #include <ege/position/Component.hpp>
#include <ege/render/Component.hpp> #include <ege/render/Component.hpp>
#include <ege/physics/Component.hpp> #include <ege/physics/Component.hpp>
#include <ege/Ray.hpp>
appl::Windows::Windows() { appl::Windows::Windows() {
addObjectType("appl::Windows"); addObjectType("appl::Windows");
@ -121,7 +122,7 @@ void appl::Windows::init() {
m_env->addElement(element); m_env->addElement(element);
} }
// create cubes ... // create cubes ...
myMesh = ege::resource::Mesh::createCube(3); myMesh = ege::resource::Mesh::createCube(3, "basics", etk::color::green);
if (myMesh != nullptr) { if (myMesh != nullptr) {
ememory::SharedPtr<ege::Element> element = ememory::makeShared<ege::Element>(m_env); ememory::SharedPtr<ege::Element> element = ememory::makeShared<ege::Element>(m_env);
// add all component: // add all component:
@ -141,41 +142,26 @@ void appl::Windows::init() {
element->addComponent(componentPhysics); element->addComponent(componentPhysics);
// add it .. // add it ..
m_env->addElement(element); m_env->addElement(element);
}
/* myMesh = ege::resource::Mesh::createCube(3, "basics", etk::color::orange);
//ememory::SharedPtr<ege::ElementBase> element = ememory::makeShared<ege::ElementBase>(m_env); if (myMesh != nullptr) {
ememory::SharedPtr<ege::ElementPhysic> element = ememory::makeShared<ege::ElementPhysic>(m_env); ememory::SharedPtr<ege::Element> element = ememory::makeShared<ege::Element>(m_env);
// add physic interface: // add all component:
// 1st Position component:
etk::Transform3D transform(vec3(20,-10,10), etk::Quaternion::identity());
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
//element->addComponent(componentPosition);
// 2nd something to diplay:
ememory::SharedPtr<ege::render::Component> componentRender = ememory::makeShared<ege::render::Component>(myMesh);
element->addComponent(componentRender);
// 3rd some physic:
ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform);
ememory::SharedPtr<ege::PhysicsBox> physic = ememory::makeShared<ege::PhysicsBox>(); ememory::SharedPtr<ege::PhysicsBox> physic = ememory::makeShared<ege::PhysicsBox>();
physic->setSize(vec3(3.2,3.2,3.2)); physic->setSize(vec3(3.2,3.2,3.2));
myMesh->addPhysicElement(physic); componentPhysics->addShape(physic);
componentPhysics->generate();
element->setMesh(myMesh); element->addComponent(componentPhysics);
element->createRigidBody(4000000); // add it ..
element->setPosition(vec3(20,10,10));
element->setMass(1000);
m_env->addElement(element);
*/
}
myMesh = ege::resource::Mesh::createCube(3);
if (myMesh != nullptr) {
//element = ememory::makeShared<ege::ElementBase>(m_env);
ememory::SharedPtr<ege::ElementPhysic> element = ememory::makeShared<ege::ElementPhysic>(m_env);
// add physic interface:
ememory::SharedPtr<ege::PhysicsSphere> physic = ememory::makeShared<ege::PhysicsSphere>();
physic->setRadius(4.5f);
myMesh->addPhysicElement(physic);
element->setMesh(myMesh);
element->createRigidBody(4000000);
element->setPosition(vec3(20,-10,10));
element->setMass(3000);
element->iaEnable();
m_env->addElement(element); m_env->addElement(element);
} }
m_env->propertyStatus.set(ege::gameStart); m_env->propertyStatus.set(ege::gameStart);
@ -200,25 +186,34 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
if (_event.getId() == 1) { if (_event.getId() == 1) {
if (_event.getStatus() == gale::key::status::down) { if (_event.getStatus() == gale::key::status::down) {
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);
ememory::SharedPtr<ege::resource::Mesh> myMesh; ememory::SharedPtr<ege::resource::Mesh> myMesh;
myMesh = ege::resource::Mesh::createCube(1, "basics", etk::color::green); myMesh = ege::resource::Mesh::createCube(1, "basics", etk::color::orange);
if (myMesh != nullptr) { if (myMesh != nullptr) {
ememory::SharedPtr<appl::ElementHerit> element = ememory::makeShared<appl::ElementHerit>(m_env); ememory::SharedPtr<ege::Element> element = ememory::makeShared<ege::Element>(m_env);
// add all component:
// 1st Position component:
etk::Transform3D transform(ray.getOrigin(), etk::Quaternion::identity());
//ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
//element->addComponent(componentPosition);
// 2nd something to diplay:
ememory::SharedPtr<ege::render::Component> componentRender = ememory::makeShared<ege::render::Component>(myMesh);
element->addComponent(componentRender);
// 3rd some physic:
ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform);
ememory::SharedPtr<ege::PhysicsBox> physic = ememory::makeShared<ege::PhysicsBox>(); ememory::SharedPtr<ege::PhysicsBox> physic = ememory::makeShared<ege::PhysicsBox>();
physic->setSize(vec3(1.01,1.01,1.01)); physic->setSize(vec3(1.1,1.1,1.1));
myMesh->addPhysicElement(physic); componentPhysics->setType(ege::physics::Component::type::bodyDynamic);
element->setMesh(myMesh); componentPhysics->addShape(physic);
element->createRigidBody(4000000); componentPhysics->generate();
element->setPosition(ray.getOrigin()); // set has dynamic object (can move)
element->setMass(20); //APPL_CRITICAL("velocity : " << ray.getDirection()*100);
element->setLinearVelocity(ray.getDirection()*100); componentPhysics->setLinearVelocity(ray.getDirection()*1000);
element->addComponent(componentPhysics);
// add it ..
m_env->addElement(element); m_env->addElement(element);
APPL_INFO("Create cube at position " << ray.getOrigin() << " velocity: " << ray.getDirection()*100);
} }
*/
return true; return true;
} }
} else if (_event.getId() == 4) { } else if (_event.getId() == 4) {