diff --git a/changes.txt b/changes.txt index b91bb00e..0000a6de 100644 --- a/changes.txt +++ b/changes.txt @@ -1,6 +1,8 @@ -------------------------- Changes in 1.9 (not yet released) +- Change in UV's for top/bottom center vertex in CGeometryCreator::createCylinderMesh +- Add some default UV's in CGeometryCreator::createConeMesh - Bugfix: CTriangleSelector::getTriangles with bounding-box parameter no longer ignores an additionally passed matrix transformation in the box check - Fix: CGUITabControl now catching EMIE_LMOUSE_PRESSED_DOWN - Add options for transparency node sorting algorithm. diff --git a/include/IGeometryCreator.h b/include/IGeometryCreator.h index 48df39b4..5e411432 100644 --- a/include/IGeometryCreator.h +++ b/include/IGeometryCreator.h @@ -135,8 +135,8 @@ public: //! Create an arrow mesh, composed of a cylinder and a cone. /** - \param tessellationCylinder Number of quads composing the cylinder. - \param tessellationCone Number of triangles composing the cone's roof. + \param tessellationCylinder Number of quads composing half the cylinder. + \param tessellationCone Number of triangles composing half the cone's roof. \param height Total height of the arrow \param cylinderHeight Total height of the cylinder, should be lesser than total height @@ -168,7 +168,7 @@ public: /** \param radius Radius of the cylinder. \param length Length of the cylinder. - \param tessellation Number of quads around the circumference of the cylinder. + \param tessellation Number of quads around half the circumference of the cylinder. \param color The color of the cylinder. \param closeTop If true, close the ends of the cylinder, otherwise leave them open. \param oblique X-offset (shear) of top compared to bottom. @@ -191,7 +191,7 @@ public: /** \param radius Radius of the cone. \param length Length of the cone. - \param tessellation Number of quads around the circumference of the cone. + \param tessellation Number of triangles around half the circumference of the cone. \param colorTop The color of the top of the cone. \param colorBottom The color of the bottom of the cone. \param oblique (to be documented) diff --git a/source/Irrlicht/CGeometryCreator.cpp b/source/Irrlicht/CGeometryCreator.cpp index 4c793b60..8aa12ba9 100644 --- a/source/Irrlicht/CGeometryCreator.cpp +++ b/source/Irrlicht/CGeometryCreator.cpp @@ -841,7 +841,7 @@ IMesh* CGeometryCreator::createCylinderMesh(f32 radius, f32 length, v.Normal.X = 0.f; v.Normal.Y = -1.f; v.Normal.Z = 0.f; - v.TCoords.X = 1.f; + v.TCoords.X = 0.5f; v.TCoords.Y = 1.f; buffer->Vertices.push_back(v); @@ -867,7 +867,7 @@ IMesh* CGeometryCreator::createCylinderMesh(f32 radius, f32 length, v.Normal.X = 0.f; v.Normal.Y = 1.f; v.Normal.Z = 0.f; - v.TCoords.X = 0.f; + v.TCoords.X = 0.5f; v.TCoords.Y = 0.f; buffer->Vertices.push_back(v); @@ -903,32 +903,34 @@ IMesh* CGeometryCreator::createConeMesh(f32 radius, f32 length, u32 tessellation { SMeshBuffer* buffer = new SMeshBuffer(); + // TODO: For backward compatibility tessellation is per semi-circle + // We probably need another parameter to allow odd numbered tesselation without breaking existing code :-( + if ( tessellation > 0 ) + tessellation = 2*tessellation; + if ( tessellation < 2 ) + tessellation = 2; + const f32 angleStep = (core::PI * 2.f ) / tessellation; - const f32 angleStepHalf = angleStep*0.5f; video::S3DVertex v; - u32 i; + v.Pos.Y = 0.f; v.Color = colorTop; - for ( i = 0; i != tessellation; ++i ) + for (u32 i = 0; i != tessellation; ++i ) { - f32 angle = angleStep * f32(i); + const f32 angle = angleStep * f32(i); + const f32 cosAngle = cosf(angle); + const f32 sinAngle = sinf(angle); - v.Pos.X = radius * cosf(angle); - v.Pos.Y = 0.f; - v.Pos.Z = radius * sinf(angle); - v.Normal = v.Pos; - v.Normal.normalize(); - buffer->Vertices.push_back(v); - - angle += angleStepHalf; - v.Pos.X = radius * cosf(angle); - v.Pos.Y = 0.f; - v.Pos.Z = radius * sinf(angle); + v.TCoords.X = (1.f+cosAngle)*0.5f; + v.TCoords.Y = (1.f+sinAngle)*0.5f; + v.Pos.X = radius * cosAngle; + v.Pos.Z = radius * sinAngle; v.Normal = v.Pos; v.Normal.normalize(); buffer->Vertices.push_back(v); } + const u32 nonWrappedSize = buffer->Vertices.size() - 1; // close top @@ -938,18 +940,20 @@ IMesh* CGeometryCreator::createConeMesh(f32 radius, f32 length, u32 tessellation v.Normal.X = 0.f; v.Normal.Y = 1.f; v.Normal.Z = 0.f; + v.TCoords.X = 0.5f; + v.TCoords.Y = 0.5f; buffer->Vertices.push_back(v); u32 index = buffer->Vertices.size() - 1; - for ( i = 0; i != nonWrappedSize; i += 1 ) + for (u32 i = 0; i != nonWrappedSize; ++i) { buffer->Indices.push_back(i + 0); buffer->Indices.push_back(index); buffer->Indices.push_back(i + 1); } - buffer->Indices.push_back(i + 0); + buffer->Indices.push_back(nonWrappedSize); buffer->Indices.push_back(index); buffer->Indices.push_back(0); @@ -961,11 +965,13 @@ IMesh* CGeometryCreator::createConeMesh(f32 radius, f32 length, u32 tessellation v.Normal.X = 0.f; v.Normal.Y = -1.f; v.Normal.Z = 0.f; + v.TCoords.X = 0.5f; + v.TCoords.Y = 0.5f; buffer->Vertices.push_back(v); index = buffer->Vertices.size() - 1; - for ( i = 0; i != nonWrappedSize; i += 1 ) + for (u32 i = 0; i != nonWrappedSize; i += 1 ) { buffer->Indices.push_back(index); buffer->Indices.push_back(i + 0); @@ -973,7 +979,7 @@ IMesh* CGeometryCreator::createConeMesh(f32 radius, f32 length, u32 tessellation } buffer->Indices.push_back(index); - buffer->Indices.push_back(i + 0); + buffer->Indices.push_back(nonWrappedSize); buffer->Indices.push_back(0); buffer->recalculateBoundingBox();