[DEV] Add calculation of the normal and the vertex normal for mesh
This commit is contained in:
parent
71af7fe7d2
commit
c56289dbfd
@ -69,6 +69,8 @@ class VertexNode {
|
|||||||
|
|
||||||
ewol::Mesh::Mesh(etk::UString genName) :
|
ewol::Mesh::Mesh(etk::UString genName) :
|
||||||
ewol::Resource(genName),
|
ewol::Resource(genName),
|
||||||
|
m_enableFaceNormal(false),
|
||||||
|
m_enableVertexNormal(false),
|
||||||
m_numberOfElments(0),
|
m_numberOfElments(0),
|
||||||
m_texture1(NULL)
|
m_texture1(NULL)
|
||||||
{
|
{
|
||||||
@ -81,7 +83,8 @@ ewol::Mesh::Mesh(etk::UString genName) :
|
|||||||
m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation");
|
m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation");
|
||||||
m_GLtexID = m_GLprogram->GetUniform("EW_texID");
|
m_GLtexID = m_GLprogram->GetUniform("EW_texID");
|
||||||
}
|
}
|
||||||
ewol::resource::Keep("w", m_verticesVBO);
|
// this is the properties of the buffer requested : "r"/"w" + "-" + buffer type "f"=flaot "i"=integer
|
||||||
|
ewol::resource::Keep("w-fff", m_verticesVBO);
|
||||||
}
|
}
|
||||||
|
|
||||||
ewol::Mesh::~Mesh(void)
|
ewol::Mesh::~Mesh(void)
|
||||||
@ -129,6 +132,49 @@ void ewol::Mesh::Draw(mat4& positionMatrix)
|
|||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER,0);
|
glBindBuffer(GL_ARRAY_BUFFER,0);
|
||||||
}
|
}
|
||||||
|
// normal calculation of the normal face is really easy :
|
||||||
|
void ewol::Mesh::CalculateNormaleFace(void)
|
||||||
|
{
|
||||||
|
m_listFacesNormal.Clear();
|
||||||
|
// TODO : Preallocation of the vertex :
|
||||||
|
|
||||||
|
if( true==m_enableFaceNormal
|
||||||
|
|| true==m_enableVertexNormal) {
|
||||||
|
for(int32_t iii=0 ; iii<m_listFaces.Size() ; iii++) {
|
||||||
|
// for all case, We use only the 3 vertex for quad element, in theory 3D modeler export element in triangle if it is not a real plane.
|
||||||
|
vec3 normal = btCross(m_listVertex[m_listFaces[iii].m_vertex[0]]-m_listVertex[m_listFaces[iii].m_vertex[1]],
|
||||||
|
m_listVertex[m_listFaces[iii].m_vertex[1]]-m_listVertex[m_listFaces[iii].m_vertex[2]]);
|
||||||
|
m_listFacesNormal.PushBack(normal.normalized());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ewol::Mesh::CalculateNormaleEdge(void)
|
||||||
|
{
|
||||||
|
m_listVertexNormal.Clear();
|
||||||
|
// TODO : Preallocation of the vertex :
|
||||||
|
|
||||||
|
if(true==m_enableVertexNormal) {
|
||||||
|
for(int32_t iii=0 ; iii<m_listVertex.Size() ; iii++) {
|
||||||
|
vec3 normal(0,0,0);
|
||||||
|
// add the vertex from all the element in the list for face when the element in the face ...
|
||||||
|
for(int32_t jjj=0 ; jjj<m_listFaces.Size() ; jjj++) {
|
||||||
|
if( m_listFaces[jjj].m_vertex[0] == iii
|
||||||
|
|| m_listFaces[jjj].m_vertex[1] == iii
|
||||||
|
|| m_listFaces[jjj].m_vertex[2] == iii
|
||||||
|
|| ( m_listFaces[jjj].m_nbElement == 4
|
||||||
|
&& m_listFaces[jjj].m_vertex[3] == iii) ) {
|
||||||
|
normal += m_listFacesNormal[jjj];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (normal == vec3(0,0,0)) {
|
||||||
|
m_listVertexNormal.PushBack(vec3(1,1,1));
|
||||||
|
} else {
|
||||||
|
m_listVertexNormal.PushBack(normal.normalized());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// for debugging ...
|
// for debugging ...
|
||||||
//#define PRINT_HALF (1)
|
//#define PRINT_HALF (1)
|
||||||
@ -136,6 +182,9 @@ void ewol::Mesh::Draw(mat4& positionMatrix)
|
|||||||
void ewol::Mesh::GenerateVBO(void)
|
void ewol::Mesh::GenerateVBO(void)
|
||||||
{
|
{
|
||||||
m_numberOfElments = 0;
|
m_numberOfElments = 0;
|
||||||
|
// calculate the normal of all faces if needed
|
||||||
|
CalculateNormaleFace();
|
||||||
|
CalculateNormaleEdge();
|
||||||
// TODO : Set a better display system, this one is the worst I known ...
|
// TODO : Set a better display system, this one is the worst I known ...
|
||||||
for (int32_t iii=0; iii<m_listFaces.Size() ; iii++) {
|
for (int32_t iii=0; iii<m_listFaces.Size() ; iii++) {
|
||||||
#ifdef PRINT_HALF
|
#ifdef PRINT_HALF
|
||||||
@ -425,7 +474,7 @@ void ewol::Mesh::InternalSubdivide(bool smooth)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (true==smooth) {
|
if (true==smooth) {
|
||||||
EWOL_DEBUG(" ==> Update middle edge points position");
|
//EWOL_DEBUG(" ==> Update middle edge points position");
|
||||||
// reposition the Middle point of the edge
|
// reposition the Middle point of the edge
|
||||||
for(int32_t iii=0; iii<listVertex.Size(); iii++) {
|
for(int32_t iii=0; iii<listVertex.Size(); iii++) {
|
||||||
if(NULL == listVertex[iii]) {
|
if(NULL == listVertex[iii]) {
|
||||||
@ -458,7 +507,7 @@ void ewol::Mesh::InternalSubdivide(bool smooth)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EWOL_DEBUG(" ==> Update old points position");
|
//EWOL_DEBUG(" ==> Update old points position");
|
||||||
/*
|
/*
|
||||||
Formule de calcule :
|
Formule de calcule :
|
||||||
- calculate F the barycenter of k Face center nearest
|
- calculate F the barycenter of k Face center nearest
|
||||||
@ -504,9 +553,11 @@ void ewol::Mesh::InternalSubdivide(bool smooth)
|
|||||||
EWOL_WARNING("Case not coded, result not predictible ...");
|
EWOL_WARNING("Case not coded, result not predictible ...");
|
||||||
} else {
|
} else {
|
||||||
vec3 newPos = (val_F + 2*val_R + (countFace-3)*val_P)/countFace;
|
vec3 newPos = (val_F + 2*val_R + (countFace-3)*val_P)/countFace;
|
||||||
|
/*
|
||||||
if (newPos != val_P) {
|
if (newPos != val_P) {
|
||||||
EWOL_DEBUG("update position : " << newPos << " <== " << val_P << " count=" << countFace);
|
EWOL_DEBUG("update position : " << newPos << " <== " << val_P << " count=" << countFace);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// update the position :
|
// update the position :
|
||||||
listVertex[iii]->SetPos(newPos);
|
listVertex[iii]->SetPos(newPos);
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,9 @@ namespace ewol
|
|||||||
};
|
};
|
||||||
class Mesh : public ewol::Resource
|
class Mesh : public ewol::Resource
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
bool m_enableFaceNormal;
|
||||||
|
bool m_enableVertexNormal;
|
||||||
protected:
|
protected:
|
||||||
ewol::Program* m_GLprogram;
|
ewol::Program* m_GLprogram;
|
||||||
int32_t m_GLPosition;
|
int32_t m_GLPosition;
|
||||||
@ -66,8 +69,10 @@ namespace ewol
|
|||||||
int32_t m_numberOfElments;
|
int32_t m_numberOfElments;
|
||||||
protected:
|
protected:
|
||||||
etk::Vector<vec3> m_listVertex; //!< List of all vertex in the element
|
etk::Vector<vec3> m_listVertex; //!< List of all vertex in the element
|
||||||
etk::Vector<vec2> m_listUV; //!< List of all UV point in the mesh (for the specify texture)
|
etk::Vector<vec2> m_listUV; //!< List of all UV point in the mesh (for the specify texture)
|
||||||
etk::Vector<Face> m_listFaces; //!< List of all Face for the mesh
|
etk::Vector<Face> m_listFaces; //!< List of all Face for the mesh
|
||||||
|
etk::Vector<vec3> m_listFacesNormal; //!< List of all Face normal, when calculated
|
||||||
|
etk::Vector<vec3> m_listVertexNormal; //!< List of all Face normal, when calculated
|
||||||
protected:
|
protected:
|
||||||
ewol::VirtualBufferObject* m_verticesVBO;
|
ewol::VirtualBufferObject* m_verticesVBO;
|
||||||
ewol::TextureFile* m_texture1;
|
ewol::TextureFile* m_texture1;
|
||||||
@ -77,7 +82,6 @@ namespace ewol
|
|||||||
virtual const char* GetType(void) { return "ewol::Mesh"; };
|
virtual const char* GetType(void) { return "ewol::Mesh"; };
|
||||||
virtual void Draw(mat4& positionMatrix);
|
virtual void Draw(mat4& positionMatrix);
|
||||||
void GenerateVBO(void);
|
void GenerateVBO(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// some addition basic funtion that permit to create or overwrite some caracterstics :
|
// some addition basic funtion that permit to create or overwrite some caracterstics :
|
||||||
void CreateCube(void);
|
void CreateCube(void);
|
||||||
@ -85,6 +89,16 @@ namespace ewol
|
|||||||
void Subdivide(int32_t numberOfTime, bool smooth);
|
void Subdivide(int32_t numberOfTime, bool smooth);
|
||||||
protected:
|
protected:
|
||||||
void InternalSubdivide(bool smooth);
|
void InternalSubdivide(bool smooth);
|
||||||
|
public:
|
||||||
|
void StatusFaceNormal(bool newState) {
|
||||||
|
m_enableFaceNormal = newState;
|
||||||
|
}
|
||||||
|
void StatusVertexNormal(bool newState) {
|
||||||
|
m_enableVertexNormal = newState;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
void CalculateNormaleFace(void);
|
||||||
|
void CalculateNormaleEdge(void);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user