From 3f22081cedb6b84078c5a81346635f6335be106e Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 22 May 2017 21:44:21 +0200 Subject: [PATCH] [DEV] add sphere in usable shape --- ege/physics/Component.cpp | 30 +++++++++------- ege/resource/Mesh.hpp | 8 +++++ ege/resource/MeshCube.cpp | 2 +- ege/resource/MeshCylinder.cpp | 39 ++++++++++++++++++++ ege/resource/MeshSphere.cpp | 59 +++++++++++++++++++++++++++++++ lutin_ege.py | 2 ++ sample/Collision/appl/Windows.cpp | 28 +++++++++++++-- 7 files changed, 152 insertions(+), 16 deletions(-) create mode 100644 ege/resource/MeshCylinder.cpp create mode 100644 ege/resource/MeshSphere.cpp diff --git a/ege/physics/Component.cpp b/ege/physics/Component.cpp index ab3ee4e..0a65fae 100644 --- a/ege/physics/Component.cpp +++ b/ege/physics/Component.cpp @@ -176,6 +176,18 @@ void ege::physics::Component::generate() { EGE_ERROR(" Sphere ==> can not cast in Sphere"); continue; } + // Create the box shape + rp3d::SphereShape* shape = new rp3d::SphereShape(tmpElement->getRadius()); + rp3d::Vector3 position(it->getOrigin().x(), + it->getOrigin().y(), + it->getOrigin().z()); + rp3d::Quaternion orientation(it->getQuaternion().x(), + it->getQuaternion().y(), + it->getQuaternion().z(), + it->getQuaternion().w()); + rp3d::Transform transform(position, orientation); + rp3d::ProxyShape* proxyShape = m_rigidBody->addCollisionShape(shape, transform, it->getMass()); + m_listProxyShape.push_back(proxyShape); /* btCollisionShape* tmpShape = new btSphereShape(tmpElement->getRadius()); if (tmpShape != nullptr) { @@ -404,18 +416,12 @@ void ege::physics::Component::drawShape(ememory::SharedPtr can not cast in Sphere"); continue; } - /* - btCollisionShape* tmpShape = new btSphereShape(tmpElement->getRadius()); - if (tmpShape != nullptr) { - if (outputShape == nullptr) { - return tmpShape; - } else { - vec4 qqq = tmpElement->getQuaternion(); - const btTransform localTransform(btQuaternion(qqq.x(),qqq.y(),qqq.z(),qqq.w()), tmpElement->getOrigin()); - outputShape->addChildShape(localTransform, tmpShape); - } - } - */ + etk::Transform3D transformLocal(it->getOrigin(), it->getOrientation()); + transformLocal.getOpenGLMatrix(mmm); + mat4 transformationMatrixLocal(mmm); + transformationMatrixLocal.transpose(); + transformationMatrixLocal = transformationMatrix * transformationMatrixLocal; + _draw->drawSphere(tmpElement->getRadius(), 10, 10, transformationMatrixLocal, tmpColor); break; } case ege::PhysicsShape::convexHull : { diff --git a/ege/resource/Mesh.hpp b/ege/resource/Mesh.hpp index cbc6542..d89cd11 100644 --- a/ege/resource/Mesh.hpp +++ b/ege/resource/Mesh.hpp @@ -37,6 +37,14 @@ namespace ege { static ememory::SharedPtr createCube(float _size=1.0f, const std::string& _materialName="basics", const etk::Color& _color=etk::color::green); + static ememory::SharedPtr createSphere(float _size=1.0f, + const std::string& _materialName="basics", + const etk::Color& _color=etk::color::green, + int32_t _lats = 10, + int32_t _longs = 10); + static ememory::SharedPtr createCylinder(float _size=1.0f, + const std::string& _materialName="basics", + const etk::Color& _color=etk::color::green); public: /** * @not_in_doc diff --git a/ege/resource/MeshCube.cpp b/ege/resource/MeshCube.cpp index e11b5aa..7298bcf 100644 --- a/ege/resource/MeshCube.cpp +++ b/ege/resource/MeshCube.cpp @@ -8,7 +8,7 @@ #include ememory::SharedPtr ege::resource::Mesh::createCube(float _size, const std::string& _materialName, const etk::Color& _color) { - EGE_ERROR(" create a cube _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); + EGE_VERBOSE(" create a cube _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:color3.prog"); if (out != nullptr) { ememory::SharedPtr material = ememory::makeShared(); diff --git a/ege/resource/MeshCylinder.cpp b/ege/resource/MeshCylinder.cpp new file mode 100644 index 0000000..3a0886b --- /dev/null +++ b/ege/resource/MeshCylinder.cpp @@ -0,0 +1,39 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2011, Edouard DUPIN, all right reserved + * @license MPL v2.0 (see license file) + */ + +#include +#include + +ememory::SharedPtr ege::resource::Mesh::createCylinder(float _size, const std::string& _materialName, const etk::Color& _color) { + EGE_VERBOSE(" create a cube _size=" << _size << " _materialName=" << _materialName << " _color=" << _color); + ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:color3.prog"); + if (out != nullptr) { + ememory::SharedPtr material = ememory::makeShared(); + // set the element material properties : + material->setAmbientFactor(vec4(1,1,1,1)); + material->setDiffuseFactor(vec4(0,0,0,1)); + material->setSpecularFactor(vec4(0,0,0,1)); + material->setShininess(1); + material->setRenderMode(gale::openGL::renderMode::triangle); + out->addMaterial(_materialName, material); + + out->addFaceIndexing(_materialName); + + out->addQuad(_materialName, vec3(-1,-1,-1)*_size, vec3(-1, 1,-1)*_size, vec3( 1, 1,-1)*_size, vec3( 1,-1,-1)*_size, _color); + out->addQuad(_materialName, vec3(-1, 1, 1)*_size, vec3(-1,-1, 1)*_size, vec3( 1,-1, 1)*_size, vec3( 1, 1, 1)*_size, _color); + out->addQuad(_materialName, vec3(-1,-1,-1)*_size, vec3(-1,-1, 1)*_size, vec3(-1, 1, 1)*_size, vec3(-1, 1,-1)*_size, _color); + out->addQuad(_materialName, vec3( 1,-1, 1)*_size, vec3( 1,-1,-1)*_size, vec3( 1, 1,-1)*_size, vec3( 1, 1, 1)*_size, _color); + out->addQuad(_materialName, vec3(-1,-1, 1)*_size, vec3(-1,-1,-1)*_size, vec3( 1,-1,-1)*_size, vec3( 1,-1, 1)*_size, _color); + out->addQuad(_materialName, vec3(-1, 1,-1)*_size, vec3(-1, 1, 1)*_size, vec3( 1, 1, 1)*_size, vec3( 1, 1,-1)*_size, _color); + out->setNormalMode(ege::resource::Mesh::normalMode::face); + out->calculateNormaleFace(_materialName); + // generate the VBO + out->generateVBO(); + } else { + EGE_ERROR("can not create the basic mesh interface"); + } + return out; +} \ No newline at end of file diff --git a/ege/resource/MeshSphere.cpp b/ege/resource/MeshSphere.cpp new file mode 100644 index 0000000..b2993b6 --- /dev/null +++ b/ege/resource/MeshSphere.cpp @@ -0,0 +1,59 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2011, Edouard DUPIN, all right reserved + * @license MPL v2.0 (see license file) + */ + +#include +#include + +ememory::SharedPtr ege::resource::Mesh::createSphere(float _radius, const std::string& _materialName, const etk::Color& _color, int32_t _lats, int32_t _longs) { + EGE_VERBOSE(" create a sphere _size=" << _radius << " _materialName=" << _materialName << " _color=" << _color); + ememory::SharedPtr out = ege::resource::Mesh::create("---", "DATA:color3.prog"); + if (out != nullptr) { + ememory::SharedPtr material = ememory::makeShared(); + // set the element material properties : + material->setAmbientFactor(vec4(1,1,1,1)); + material->setDiffuseFactor(vec4(0,0,0,1)); + material->setSpecularFactor(vec4(0,0,0,1)); + material->setShininess(1); + material->setRenderMode(gale::openGL::renderMode::triangle); + out->addMaterial(_materialName, material); + + out->addFaceIndexing(_materialName); + + for(int32_t iii=0; iii<=_lats; ++iii) { + float lat0 = M_PI * (-0.5f + float(iii - 1) / _lats); + float z0 = _radius*sin(lat0); + float zr0 = _radius*cos(lat0); + + float lat1 = M_PI * (-0.5f + float(iii) / _lats); + float z1 = _radius*sin(lat1); + float zr1 = _radius*cos(lat1); + + for(int32_t jjj=0; jjj<_longs; ++jjj) { + float lng = 2.0f * M_PI * float(jjj - 1) / _longs; + float x = cos(lng); + float y = sin(lng); + vec3 v1 = vec3(x * zr1, y * zr1, z1); + vec3 v4 = vec3(x * zr0, y * zr0, z0); + + lng = 2 * M_PI * float(jjj) / _longs; + x = cos(lng); + y = sin(lng); + vec3 v2 = vec3(x * zr1, y * zr1, z1); + vec3 v3 = vec3(x * zr0, y * zr0, z0); + + out->addTriangle(_materialName, v1, v3, v2, _color); + out->addTriangle(_materialName, v1, v4, v3, _color); + } + } + out->setNormalMode(ege::resource::Mesh::normalMode::face); + out->calculateNormaleFace(_materialName); + // generate the VBO + out->generateVBO(); + } else { + EGE_ERROR("can not create the basic mesh interface"); + } + return out; +} \ No newline at end of file diff --git a/lutin_ege.py b/lutin_ege.py index 2e26deb..7749df7 100644 --- a/lutin_ege.py +++ b/lutin_ege.py @@ -52,6 +52,8 @@ def configure(target, my_module): 'ege/resource/MeshEmf.cpp', 'ege/resource/MeshGird.cpp', 'ege/resource/MeshCube.cpp', + 'ege/resource/MeshSphere.cpp', + 'ege/resource/MeshCylinder.cpp', 'ege/resource/MeshObj.cpp', 'ege/resource/ParticuleMesh.cpp', 'ege/resource/tools/icoSphere.cpp', diff --git a/sample/Collision/appl/Windows.cpp b/sample/Collision/appl/Windows.cpp index 2c5fd89..3e84eba 100644 --- a/sample/Collision/appl/Windows.cpp +++ b/sample/Collision/appl/Windows.cpp @@ -137,7 +137,7 @@ void appl::Windows::init() { // 3rd some physic: ememory::SharedPtr componentPhysics = ememory::makeShared(m_env, transform); ememory::SharedPtr physic = ememory::makeShared(); - physic->setSize(vec3(3.2,3.2,3.2)); + physic->setSize(vec3(3.01,3.01,3.01)); physic->setMass(300000); componentPhysics->addShape(physic); componentPhysics->generate(); @@ -159,7 +159,7 @@ void appl::Windows::init() { // 3rd some physic: ememory::SharedPtr componentPhysics = ememory::makeShared(m_env, transform); ememory::SharedPtr physic = ememory::makeShared(); - physic->setSize(vec3(3.2,3.2,3.2)); + physic->setSize(vec3(3.01,3.01,3.01)); physic->setMass(50000); componentPhysics->addShape(physic); componentPhysics->generate(); @@ -167,6 +167,28 @@ void appl::Windows::init() { // add it .. m_env->addElement(element); } + myMesh = ege::resource::Mesh::createSphere(4, "basics", etk::color::blue); + if (myMesh != nullptr) { + ememory::SharedPtr element = ememory::makeShared(m_env); + // add all component: + // 1st Position component: + etk::Transform3D transform(vec3(-20,10,10), etk::Quaternion::identity()); + //ememory::SharedPtr componentPosition = ememory::makeShared(transform); + //element->addComponent(componentPosition); + // 2nd something to diplay: + ememory::SharedPtr componentRender = ememory::makeShared(myMesh); + element->addComponent(componentRender); + // 3rd some physic: + ememory::SharedPtr componentPhysics = ememory::makeShared(m_env, transform); + ememory::SharedPtr physic = ememory::makeShared(); + physic->setRadius(4.01); + physic->setMass(500000); + componentPhysics->addShape(physic); + componentPhysics->generate(); + element->addComponent(componentPhysics); + // add it .. + m_env->addElement(element); + } m_env->propertyStatus.set(ege::gameStart); } /* @@ -207,7 +229,7 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { // 3rd some physic: ememory::SharedPtr componentPhysics = ememory::makeShared(m_env, transform); ememory::SharedPtr physic = ememory::makeShared(); - physic->setSize(vec3(1.1,1.1,1.1)); + physic->setSize(vec3(1.01,1.01,1.01)); physic->setMass(1000); componentPhysics->setType(ege::physics::Component::type::bodyDynamic); componentPhysics->addShape(physic);