[DEV] add shape cone, cylinder, sphere, capsule

This commit is contained in:
Edouard DUPIN 2017-05-22 23:07:35 +02:00
parent d154b0c901
commit 3c6c79b8bd
17 changed files with 439 additions and 127 deletions

View File

@ -80,7 +80,7 @@ void ege::physics::Component::generate() {
continue;
}
switch (it->getType()) {
case ege::physics::Shape::type::box : {
case ege::physics::Shape::type::box: {
EGE_DEBUG(" Box");
const ege::physics::shape::Box* tmpElement = it->toBox();
if (tmpElement == nullptr) {
@ -106,15 +106,15 @@ void ege::physics::Component::generate() {
m_listProxyShape.push_back(proxyShape);
break;
}
case ege::physics::Shape::type::cylinder : {
case ege::physics::Shape::type::cylinder: {
EGE_DEBUG(" Cylinder");
const ege::physics::shape::Cylinder* tmpElement = it->toCylinder();
if (tmpElement == nullptr) {
EGE_ERROR(" Cylinder ==> can not cast in Cylinder");
continue;
}
// Create the box shape
rp3d::CylinderShape* shape = new rp3d::CylinderShape(tmpElement->getSize().x(), tmpElement->getSize().y());
// Create the Cylinder shape
rp3d::CylinderShape* shape = new rp3d::CylinderShape(tmpElement->getRadius(), tmpElement->getSize());
rp3d::Vector3 position(it->getOrigin().x(),
it->getOrigin().y(),
it->getOrigin().z());
@ -127,49 +127,49 @@ void ege::physics::Component::generate() {
m_listProxyShape.push_back(proxyShape);
break;
}
case ege::physics::Shape::type::capsule : {
case ege::physics::Shape::type::capsule: {
EGE_DEBUG(" Capsule");
const ege::physics::shape::Capsule* tmpElement = it->toCapsule();
if (tmpElement == nullptr) {
EGE_ERROR(" Capsule ==> can not cast in Capsule");
continue;
}
/*
btCollisionShape* tmpShape = new btCapsuleShape(tmpElement->getRadius(), tmpElement->getHeight());
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);
}
}
*/
// Create the Capsule shape
rp3d::CapsuleShape* shape = new rp3d::CapsuleShape(tmpElement->getRadius(), tmpElement->getSize());
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);
break;
}
case ege::physics::Shape::type::cone : {
case ege::physics::Shape::type::cone: {
EGE_DEBUG(" Cone");
const ege::physics::shape::Cone* tmpElement = it->toCone();
if (tmpElement == nullptr) {
EGE_ERROR(" Cone ==> can not cast in Cone");
continue;
}
/*
btCollisionShape* tmpShape = new btConeShape(tmpElement->getRadius(), tmpElement->getHeight());
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);
}
}
*/
// Create the Cone shape
rp3d::ConeShape* shape = new rp3d::ConeShape(tmpElement->getRadius(), tmpElement->getSize());
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);
break;
}
case ege::physics::Shape::type::sphere : {
case ege::physics::Shape::type::sphere: {
EGE_DEBUG(" Sphere");
const ege::physics::shape::Sphere* tmpElement = it->toSphere();
if (tmpElement == nullptr) {
@ -188,21 +188,9 @@ void ege::physics::Component::generate() {
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) {
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);
}
}
*/
break;
}
case ege::physics::Shape::type::convexHull : {
case ege::physics::Shape::type::convexHull: {
EGE_DEBUG(" convexHull");
const ege::physics::shape::ConvexHull* tmpElement = it->toConvexHull();
if (tmpElement == nullptr) {
@ -225,7 +213,7 @@ void ege::physics::Component::generate() {
}
default :
EGE_DEBUG(" ???");
// TODO : UNKNOW type ...
// TODO: UNKNOW type ...
break;
}
}
@ -352,7 +340,7 @@ void ege::physics::Component::drawShape(ememory::SharedPtr<ewol::resource::Color
_draw->drawSquare(tmpElement->getSize(), transformationMatrixLocal, tmpColor);
break;
}
case ege::physics::Shape::type::cylinder : {
case ege::physics::Shape::type::cylinder: {
EGE_DEBUG(" Cylinder");
const ege::physics::shape::Cylinder* tmpElement = it->toCylinder();
if (tmpElement == nullptr) {
@ -364,52 +352,40 @@ void ege::physics::Component::drawShape(ememory::SharedPtr<ewol::resource::Color
mat4 transformationMatrixLocal(mmm);
transformationMatrixLocal.transpose();
transformationMatrixLocal = transformationMatrix * transformationMatrixLocal;
//_draw->drawSphere(radius, 10, 10, _transformationMatrix, tmpColor);
_draw->drawCylinder(tmpElement->getRadius(), tmpElement->getSize(), 10, 10, transformationMatrixLocal, tmpColor);
break;
}
case ege::physics::Shape::type::capsule : {
case ege::physics::Shape::type::capsule: {
EGE_DEBUG(" Capsule");
const ege::physics::shape::Capsule* tmpElement = it->toCapsule();
if (tmpElement == nullptr) {
EGE_ERROR(" Capsule ==> can not cast in Capsule");
continue;
}
/*
btCollisionShape* tmpShape = new btCapsuleShape(tmpElement->getRadius(), tmpElement->getHeight());
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->drawCapsule(tmpElement->getRadius(), tmpElement->getSize(), 10, 10, transformationMatrixLocal, tmpColor);
break;
}
case ege::physics::Shape::type::cone : {
case ege::physics::Shape::type::cone: {
EGE_DEBUG(" Cone");
const ege::physics::shape::Cone* tmpElement = it->toCone();
if (tmpElement == nullptr) {
EGE_ERROR(" Cone ==> can not cast in Cone");
continue;
}
/*
btCollisionShape* tmpShape = new btConeShape(tmpElement->getRadius(), tmpElement->getHeight());
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->drawCone(tmpElement->getRadius(), tmpElement->getSize(), 10, 10, transformationMatrixLocal, tmpColor);
break;
}
case ege::physics::Shape::type::sphere : {
case ege::physics::Shape::type::sphere: {
EGE_DEBUG(" Sphere");
const ege::physics::shape::Sphere* tmpElement = it->toSphere();
if (tmpElement == nullptr) {
@ -424,7 +400,7 @@ void ege::physics::Component::drawShape(ememory::SharedPtr<ewol::resource::Color
_draw->drawSphere(tmpElement->getRadius(), 10, 10, transformationMatrixLocal, tmpColor);
break;
}
case ege::physics::Shape::type::convexHull : {
case ege::physics::Shape::type::convexHull: {
EGE_DEBUG(" convexHull");
const ege::physics::shape::ConvexHull* tmpElement = it->toConvexHull();
if (tmpElement == nullptr) {
@ -447,7 +423,7 @@ void ege::physics::Component::drawShape(ememory::SharedPtr<ewol::resource::Color
}
default :
EGE_DEBUG(" ???");
// TODO : UNKNOW type ...
// TODO: UNKNOW type ...
break;
}
}

View File

@ -17,9 +17,9 @@ bool ege::physics::shape::Capsule::parse(const char* _line) {
EGE_VERBOSE(" radius=" << m_radius);
return true;
}
if(strncmp(_line, "height:", 7) == 0) {
sscanf(&_line[7], "%f", &m_height );
EGE_VERBOSE(" height=" << m_height);
if(strncmp(_line, "size:", 5) == 0) {
sscanf(&_line[5], "%f", &m_size );
EGE_VERBOSE(" height=" << m_size);
return true;
}
return false;

View File

@ -15,7 +15,9 @@ namespace ege {
namespace shape {
class Capsule : public ege::physics::Shape {
public:
Capsule() {};
Capsule() :
m_radius(1.0f),
m_size(1.0f) {};
virtual ~Capsule() {};
public:
virtual bool parse(const char* _line);
@ -23,26 +25,32 @@ namespace ege {
public:
virtual enum ege::physics::Shape::type getType() const {
return ege::physics::Shape::type::capsule;
};
}
private:
float m_radius;
public:
float getRadius() const {
return m_radius;
};
}
void setRadius(float _radius) {
m_radius = _radius;
}
private:
float m_height;
float m_size;
public:
float getHeight() const {
return m_height;
};
float getSize() const {
return m_size;
}
void setSize(float _size) {
m_size = _size;
}
public:
virtual const ege::physics::shape::Capsule* toCapsule() const {
return this;
};
}
virtual ege::physics::shape::Capsule* toCapsule() {
return this;
};
}
};
}
}

View File

@ -17,9 +17,9 @@ bool ege::physics::shape::Cone::parse(const char* _line) {
EGE_VERBOSE(" radius=" << m_radius);
return true;
}
if(strncmp(_line, "height:", 7) == 0) {
sscanf(&_line[7], "%f", &m_height );
EGE_VERBOSE(" height=" << m_height);
if(strncmp(_line, "size:", 5) == 0) {
sscanf(&_line[5], "%f", &m_size );
EGE_VERBOSE(" size=" << m_size);
return true;
}
return false;

View File

@ -27,13 +27,19 @@ namespace ege {
public:
float getRadius() const {
return m_radius;
};
}
void setRadius(float _radius) {
m_radius = _radius;
}
private:
float m_height;
float m_size;
public:
float getHeight() const {
return m_height;
};
float getSize() const {
return m_size;
}
void setSize(float _size) {
m_size = _size;
}
public:
virtual const ege::physics::shape::Cone* toCone() const {
return this;

View File

@ -11,9 +11,14 @@ bool ege::physics::shape::Cylinder::parse(const char* _line) {
if (ege::physics::Shape::parse(_line) == true) {
return true;
}
if(strncmp(_line, "half-extents:", 13) == 0) {
sscanf(&_line[13], "%f %f %f", &m_size.m_floats[0], &m_size.m_floats[1], &m_size.m_floats[2] );
EGE_VERBOSE(" halfSize=" << m_size);
if(strncmp(_line, "radius:", 7) == 0) {
sscanf(&_line[7], "%f", &m_radius );
EGE_VERBOSE(" radius=" << m_radius);
return true;
}
if(strncmp(_line, "size:", 5) == 0) {
sscanf(&_line[5], "%f", &m_size );
EGE_VERBOSE(" size=" << m_size);
return true;
}
return false;

View File

@ -15,7 +15,9 @@ namespace ege {
namespace shape {
class Cylinder : public ege::physics::Shape {
public:
Cylinder() {};
Cylinder() :
m_radius(1.0f),
m_size(1.0f) {};
virtual ~Cylinder() {};
public:
virtual bool parse(const char* _line);
@ -25,11 +27,23 @@ namespace ege {
return ege::physics::Shape::type::cylinder;
};
private:
vec3 m_size;
float m_radius;
public:
vec3 getSize() const {
float getRadius() const {
return m_radius;
}
void setRadius(float _radius) {
m_radius = _radius;
}
private:
float m_size;
public:
float getSize() const {
return m_size;
};
}
void setSize(float _size) {
m_size = _size;
}
public:
virtual const ege::physics::shape::Cylinder* toCylinder() const {
return this;

View File

@ -25,7 +25,7 @@ namespace ege {
return ege::physics::Shape::type::sphere;
};
private:
float m_radius; // props["radius"] = obj.scale.x
float m_radius;
public:
float getRadius() const {
return m_radius;

View File

@ -42,9 +42,24 @@ namespace ege {
const etk::Color<float>& _color=etk::color::green,
int32_t _lats = 10,
int32_t _longs = 10);
static ememory::SharedPtr<ege::resource::Mesh> createCylinder(float _size=1.0f,
static ememory::SharedPtr<ege::resource::Mesh> createCylinder(float _radius = 1.0f,
float _size = 1.0f,
const std::string& _materialName="basics",
const etk::Color<float>& _color=etk::color::green);
const etk::Color<float>& _color=etk::color::green,
int32_t _lats = 10,
int32_t _longs = 10);
static ememory::SharedPtr<ege::resource::Mesh> createCapsule(float _radius = 1.0f,
float _size = 1.0f,
const std::string& _materialName="basics",
const etk::Color<float>& _color=etk::color::green,
int32_t _lats = 10,
int32_t _longs = 10);
static ememory::SharedPtr<ege::resource::Mesh> createCone(float _radius = 1.0f,
float _size = 1.0f,
const std::string& _materialName="basics",
const etk::Color<float>& _color=etk::color::green,
int32_t _lats = 10,
int32_t _longs = 10);
public:
/**
* @not_in_doc

View File

@ -0,0 +1,104 @@
/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license MPL v2.0 (see license file)
*/
#include <ege/debug.hpp>
#include <ege/resource/Mesh.hpp>
ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createCapsule(float _radius, float _size, const std::string& _materialName, const etk::Color<float>& _color, int32_t _lats, int32_t _longs) {
EGE_VERBOSE(" create a capsule _size=" << _size << " _materialName=" << _materialName << " _color=" << _color);
ememory::SharedPtr<ege::resource::Mesh> out = ege::resource::Mesh::create("---", "DATA:color3.prog");
if (out != nullptr) {
ememory::SharedPtr<ege::Material> material = ememory::makeShared<ege::Material>();
// 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);
// center to border (TOP)
float offset = _size*0.5f;
for(int32_t iii=_lats/2+1; iii<=_lats; ++iii) {
float lat0 = M_PI * (-0.5f + float(iii - 1) / _lats);
float y0 = _radius*sin(lat0);
float yr0 = _radius*cos(lat0);
float lat1 = M_PI * (-0.5f + float(iii) / _lats);
float y1 = _radius*sin(lat1);
float yr1 = _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 z = sin(lng);
vec3 v1 = vec3(x * yr1, y1+offset, z * yr1);
vec3 v4 = vec3(x * yr0, y0+offset, z * yr0);
lng = 2 * M_PI * float(jjj) / _longs;
x = cos(lng);
z = sin(lng);
vec3 v2 = vec3(x * yr1, y1+offset, z * yr1);
vec3 v3 = vec3(x * yr0, y0+offset, z * yr0);
out->addQuad(_materialName, v1, v2, v3, v4, _color);
}
}
// Cylinder
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
float y = _size*0.5f;
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, y, z);
vec3 v2b = vec3(x, -y, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, y, z);
vec3 v3b = vec3(x, -y, z);
out->addQuad(_materialName, v2, v3, v3b, v2b, _color);
}
// center to border (BUTTOM)
offset = -_size*0.5f;
for(int32_t iii=0; iii<=_lats/2; ++iii) {
float lat0 = M_PI * (-0.5f + float(iii - 1) / _lats);
float y0 = _radius*sin(lat0);
float yr0 = _radius*cos(lat0);
float lat1 = M_PI * (-0.5f + float(iii) / _lats);
float y1 = _radius*sin(lat1);
float yr1 = _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 z = sin(lng);
vec3 v1 = vec3(x * yr1, y1+offset, z * yr1);
vec3 v4 = vec3(x * yr0, y0+offset, z * yr0);
lng = 2 * M_PI * float(jjj) / _longs;
x = cos(lng);
z = sin(lng);
vec3 v2 = vec3(x * yr1, y1+offset, z * yr1);
vec3 v3 = vec3(x * yr0, y0+offset, z * yr0);
out->addQuad(_materialName, v1, v2, v3, v4, _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;
}

64
ege/resource/MeshCone.cpp Normal file
View File

@ -0,0 +1,64 @@
/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license MPL v2.0 (see license file)
*/
#include <ege/debug.hpp>
#include <ege/resource/Mesh.hpp>
ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createCone(float _radius, float _size, const std::string& _materialName, const etk::Color<float>& _color, int32_t _lats, int32_t _longs) {
EGE_VERBOSE(" create a cylinder _size=" << _size << " _materialName=" << _materialName << " _color=" << _color);
ememory::SharedPtr<ege::resource::Mesh> out = ege::resource::Mesh::create("---", "DATA:color3.prog");
if (out != nullptr) {
ememory::SharedPtr<ege::Material> material = ememory::makeShared<ege::Material>();
// 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);
// center to border (TOP)
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
vec3 v1 = vec3(0.0f, -_size/2, 0.0f);
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, _size/2, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, _size/2, z);
out->addTriangle(_materialName, v1, v2, v3, _color);
}
// center to border (BUTTOM)
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
vec3 v1 = vec3(0.0f, _size/2, 0.0f);
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, _size/2, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, _size/2, z);
out->addTriangle(_materialName, v1, v3, v2, _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;
}

View File

@ -7,8 +7,8 @@
#include <ege/debug.hpp>
#include <ege/resource/Mesh.hpp>
ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createCylinder(float _size, const std::string& _materialName, const etk::Color<float>& _color) {
EGE_VERBOSE(" create a cube _size=" << _size << " _materialName=" << _materialName << " _color=" << _color);
ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createCylinder(float _radius, float _size, const std::string& _materialName, const etk::Color<float>& _color, int32_t _lats, int32_t _longs) {
EGE_VERBOSE(" create a cylinder _size=" << _size << " _materialName=" << _materialName << " _color=" << _color);
ememory::SharedPtr<ege::resource::Mesh> out = ege::resource::Mesh::create("---", "DATA:color3.prog");
if (out != nullptr) {
ememory::SharedPtr<ege::Material> material = ememory::makeShared<ege::Material>();
@ -22,12 +22,59 @@ ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createCylinder(floa
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);
// center to border (TOP)
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
float y = _size*0.5f;
vec3 v1 = vec3(0.0f, y, 0.0f);
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, y, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, y, z);
out->addTriangle(_materialName, v1, v3, v2, _color);
}
// Cylinder
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
float y = _size*0.5f;
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, y, z);
vec3 v2b = vec3(x, -y, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, y, z);
vec3 v3b = vec3(x, -y, z);
out->addQuad(_materialName, v2, v3, v3b, v2b, _color);
}
// center to border (BUTTOM)
for(int32_t jjj=0; jjj<_longs; ++jjj) {
float lng = 2.0f * M_PI * float(jjj - 1) / _longs;
float y = _size*-0.5f;
vec3 v1 = vec3(0.0f, y, 0.0f);
float x = cos(lng)*_radius;
float z = sin(lng)*_radius;
vec3 v2 = vec3(x, y, z);
lng = 2.0f * M_PI * float(jjj) / _longs;
x = cos(lng)*_radius;
z = sin(lng)*_radius;
vec3 v3 = vec3(x, y, z);
out->addTriangle(_materialName, v1, v2, v3, _color);
}
out->setNormalMode(ege::resource::Mesh::normalMode::face);
out->calculateNormaleFace(_materialName);
// generate the VBO

View File

@ -21,31 +21,30 @@ ememory::SharedPtr<ege::resource::Mesh> ege::resource::Mesh::createSphere(float
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 y0 = _radius*sin(lat0);
float yr0 = _radius*cos(lat0);
float lat1 = M_PI * (-0.5f + float(iii) / _lats);
float z1 = _radius*sin(lat1);
float zr1 = _radius*cos(lat1);
float y1 = _radius*sin(lat1);
float yr1 = _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);
float z = sin(lng);
vec3 v1 = vec3(x * yr1, y1, z * yr1);
vec3 v4 = vec3(x * yr0, y0, z * yr0);
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);
z = sin(lng);
vec3 v2 = vec3(x * yr1, y1, z * yr1);
vec3 v3 = vec3(x * yr0, y0, z * yr0);
out->addTriangle(_materialName, v1, v3, v2, _color);
out->addTriangle(_materialName, v1, v4, v3, _color);
out->addTriangle(_materialName, v1, v2, v3, _color);
out->addTriangle(_materialName, v1, v3, v4, _color);
}
}
out->setNormalMode(ege::resource::Mesh::normalMode::face);

View File

@ -54,6 +54,8 @@ def configure(target, my_module):
'ege/resource/MeshCube.cpp',
'ege/resource/MeshSphere.cpp',
'ege/resource/MeshCylinder.cpp',
'ege/resource/MeshCapsule.cpp',
'ege/resource/MeshCone.cpp',
'ege/resource/MeshObj.cpp',
'ege/resource/ParticuleMesh.cpp',
'ege/resource/tools/icoSphere.cpp',

View File

@ -18,6 +18,9 @@
#include <ege/Entity.hpp>
#include <ege/physics/shape/Box.hpp>
#include <ege/physics/shape/Sphere.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>
@ -189,6 +192,75 @@ void appl::Windows::init() {
// add it ..
m_env->addEntity(element);
}
myMesh = ege::resource::Mesh::createCylinder(4, 8, "basics", etk::color::blue);
if (myMesh != nullptr) {
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
// 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::physics::shape::Cylinder> physic = ememory::makeShared<ege::physics::shape::Cylinder>();
physic->setRadius(4.01);
physic->setSize(8.01);
physic->setMass(500000);
componentPhysics->addShape(physic);
componentPhysics->generate();
element->addComponent(componentPhysics);
// add it ..
m_env->addEntity(element);
}
myMesh = ege::resource::Mesh::createCapsule(4, 8, "basics", etk::color::purple);
if (myMesh != nullptr) {
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
// 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::physics::shape::Capsule> physic = ememory::makeShared<ege::physics::shape::Capsule>();
physic->setRadius(4.01);
physic->setSize(8.01);
physic->setMass(500000);
componentPhysics->addShape(physic);
componentPhysics->generate();
element->addComponent(componentPhysics);
// add it ..
m_env->addEntity(element);
}
myMesh = ege::resource::Mesh::createCone(4, 8, "basics", etk::color::purple);
if (myMesh != nullptr) {
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
// add all component:
// 1st Position component:
etk::Transform3D transform(vec3(20, 20,-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::physics::shape::Cone> physic = ememory::makeShared<ege::physics::shape::Cone>();
physic->setRadius(4.01);
physic->setSize(8.01);
physic->setMass(500000);
componentPhysics->addShape(physic);
componentPhysics->generate();
element->addComponent(componentPhysics);
// add it ..
m_env->addEntity(element);
}
m_env->propertyStatus.set(ege::gameStart);
}
/*