mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-14 03:33:49 +01:00
0c6385cb92
Usually something like __IRR_SOME_GUARD_INCLUDED__ replaced by IRR_SOME_GUARD_INCLUDED. Removing underscores at the end wasn't necessary, but more symmetric (probably the reason they got added there as well). While this touches every header it shouldn't affect users (I hope). Also a few whitespace changes to unify whitespace usage a bit. And a bunch of spelling fixes in comments. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6252 dfc29bdd-3216-0410-991c-e03cc46cb475
281 lines
8.5 KiB
C++
281 lines
8.5 KiB
C++
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
#ifndef S_3D_VERTEX_H_INCLUDED
|
|
#define S_3D_VERTEX_H_INCLUDED
|
|
|
|
#include "vector3d.h"
|
|
#include "vector2d.h"
|
|
#include "SColor.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace video
|
|
{
|
|
|
|
//! Enumeration for all vertex types there are.
|
|
enum E_VERTEX_TYPE
|
|
{
|
|
//! Standard vertex type used by the Irrlicht engine, video::S3DVertex.
|
|
EVT_STANDARD = 0,
|
|
|
|
//! Vertex with two texture coordinates, video::S3DVertex2TCoords.
|
|
/** Usually used for geometry with lightmaps or other special materials. */
|
|
EVT_2TCOORDS,
|
|
|
|
//! Vertex with a tangent and binormal vector, video::S3DVertexTangents.
|
|
/** Usually used for tangent space normal mapping.
|
|
Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2.
|
|
*/
|
|
EVT_TANGENTS
|
|
};
|
|
|
|
//! Array holding the built in vertex type names
|
|
const char* const sBuiltInVertexTypeNames[] =
|
|
{
|
|
"standard",
|
|
"2tcoords",
|
|
"tangents",
|
|
0
|
|
};
|
|
|
|
//! standard vertex used by the Irrlicht engine.
|
|
struct S3DVertex
|
|
{
|
|
//! default constructor
|
|
S3DVertex() {}
|
|
|
|
//! constructor
|
|
S3DVertex(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
|
|
: Pos(x,y,z), Normal(nx,ny,nz), Color(c), TCoords(tu,tv) {}
|
|
|
|
//! constructor
|
|
S3DVertex(const core::vector3df& pos, const core::vector3df& normal,
|
|
SColor color, const core::vector2d<f32>& tcoords)
|
|
: Pos(pos), Normal(normal), Color(color), TCoords(tcoords) {}
|
|
|
|
//! Position
|
|
core::vector3df Pos;
|
|
|
|
//! Normal vector
|
|
core::vector3df Normal;
|
|
|
|
//! Color
|
|
SColor Color;
|
|
|
|
//! Texture coordinates
|
|
core::vector2d<f32> TCoords;
|
|
|
|
bool operator==(const S3DVertex& other) const
|
|
{
|
|
return ((Pos == other.Pos) && (Normal == other.Normal) &&
|
|
(Color == other.Color) && (TCoords == other.TCoords));
|
|
}
|
|
|
|
bool operator!=(const S3DVertex& other) const
|
|
{
|
|
return ((Pos != other.Pos) || (Normal != other.Normal) ||
|
|
(Color != other.Color) || (TCoords != other.TCoords));
|
|
}
|
|
|
|
bool operator<(const S3DVertex& other) const
|
|
{
|
|
return ((Pos < other.Pos) ||
|
|
((Pos == other.Pos) && (Normal < other.Normal)) ||
|
|
((Pos == other.Pos) && (Normal == other.Normal) && (Color < other.Color)) ||
|
|
((Pos == other.Pos) && (Normal == other.Normal) && (Color == other.Color) && (TCoords < other.TCoords)));
|
|
}
|
|
|
|
//! Get type of the class
|
|
static E_VERTEX_TYPE getType()
|
|
{
|
|
return EVT_STANDARD;
|
|
}
|
|
|
|
//\param d d=0 returns other, d=1 returns this, values between interpolate.
|
|
S3DVertex getInterpolated(const S3DVertex& other, f32 d)
|
|
{
|
|
d = core::clamp(d, 0.0f, 1.0f);
|
|
return S3DVertex(Pos.getInterpolated(other.Pos, d),
|
|
Normal.getInterpolated(other.Normal, d),
|
|
Color.getInterpolated(other.Color, d),
|
|
TCoords.getInterpolated(other.TCoords, d));
|
|
}
|
|
};
|
|
|
|
|
|
//! Vertex with two texture coordinates.
|
|
/** Usually used for geometry with lightmaps
|
|
or other special materials.
|
|
*/
|
|
struct S3DVertex2TCoords : public S3DVertex
|
|
{
|
|
//! default constructor
|
|
S3DVertex2TCoords() : S3DVertex() {}
|
|
|
|
//! constructor with two different texture coords, but no normal
|
|
S3DVertex2TCoords(f32 x, f32 y, f32 z, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2)
|
|
: S3DVertex(x,y,z, 0.0f, 0.0f, 0.0f, c, tu,tv), TCoords2(tu2,tv2) {}
|
|
|
|
//! constructor with two different texture coords, but no normal
|
|
S3DVertex2TCoords(const core::vector3df& pos, SColor color,
|
|
const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
|
|
: S3DVertex(pos, core::vector3df(), color, tcoords), TCoords2(tcoords2) {}
|
|
|
|
//! constructor with all values
|
|
S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal, const SColor& color,
|
|
const core::vector2d<f32>& tcoords, const core::vector2d<f32>& tcoords2)
|
|
: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords2) {}
|
|
|
|
//! constructor with all values
|
|
S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv, f32 tu2, f32 tv2)
|
|
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu2,tv2) {}
|
|
|
|
//! constructor with the same texture coords and normal
|
|
S3DVertex2TCoords(f32 x, f32 y, f32 z, f32 nx, f32 ny, f32 nz, SColor c, f32 tu, f32 tv)
|
|
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), TCoords2(tu,tv) {}
|
|
|
|
//! constructor with the same texture coords and normal
|
|
S3DVertex2TCoords(const core::vector3df& pos, const core::vector3df& normal,
|
|
SColor color, const core::vector2d<f32>& tcoords)
|
|
: S3DVertex(pos, normal, color, tcoords), TCoords2(tcoords) {}
|
|
|
|
//! constructor from S3DVertex
|
|
S3DVertex2TCoords(S3DVertex& o) : S3DVertex(o) {}
|
|
|
|
//! Second set of texture coordinates
|
|
core::vector2d<f32> TCoords2;
|
|
|
|
//! Equality operator
|
|
bool operator==(const S3DVertex2TCoords& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this)==other) &&
|
|
(TCoords2 == other.TCoords2));
|
|
}
|
|
|
|
//! Inequality operator
|
|
bool operator!=(const S3DVertex2TCoords& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this)!=other) ||
|
|
(TCoords2 != other.TCoords2));
|
|
}
|
|
|
|
bool operator<(const S3DVertex2TCoords& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this) < other) ||
|
|
((static_cast<S3DVertex>(*this) == other) && (TCoords2 < other.TCoords2)));
|
|
}
|
|
|
|
static E_VERTEX_TYPE getType()
|
|
{
|
|
return EVT_2TCOORDS;
|
|
}
|
|
|
|
//\param d d=0 returns other, d=1 returns this, values between interpolate.
|
|
S3DVertex2TCoords getInterpolated(const S3DVertex2TCoords& other, f32 d)
|
|
{
|
|
d = core::clamp(d, 0.0f, 1.0f);
|
|
return S3DVertex2TCoords(Pos.getInterpolated(other.Pos, d),
|
|
Normal.getInterpolated(other.Normal, d),
|
|
Color.getInterpolated(other.Color, d),
|
|
TCoords.getInterpolated(other.TCoords, d),
|
|
TCoords2.getInterpolated(other.TCoords2, d));
|
|
}
|
|
};
|
|
|
|
|
|
//! Vertex with a tangent and binormal vector.
|
|
/** Usually used for tangent space normal mapping.
|
|
Usually tangent and binormal get send to shaders as texture coordinate sets 1 and 2.
|
|
*/
|
|
struct S3DVertexTangents : public S3DVertex
|
|
{
|
|
//! default constructor
|
|
S3DVertexTangents() : S3DVertex() { }
|
|
|
|
//! constructor
|
|
S3DVertexTangents(f32 x, f32 y, f32 z, f32 nx=0.0f, f32 ny=0.0f, f32 nz=0.0f,
|
|
SColor c = 0xFFFFFFFF, f32 tu=0.0f, f32 tv=0.0f,
|
|
f32 tanx=0.0f, f32 tany=0.0f, f32 tanz=0.0f,
|
|
f32 bx=0.0f, f32 by=0.0f, f32 bz=0.0f)
|
|
: S3DVertex(x,y,z, nx,ny,nz, c, tu,tv), Tangent(tanx,tany,tanz), Binormal(bx,by,bz) { }
|
|
|
|
//! constructor
|
|
S3DVertexTangents(const core::vector3df& pos, SColor c,
|
|
const core::vector2df& tcoords)
|
|
: S3DVertex(pos, core::vector3df(), c, tcoords) { }
|
|
|
|
//! constructor
|
|
S3DVertexTangents(const core::vector3df& pos,
|
|
const core::vector3df& normal, SColor c,
|
|
const core::vector2df& tcoords,
|
|
const core::vector3df& tangent=core::vector3df(),
|
|
const core::vector3df& binormal=core::vector3df())
|
|
: S3DVertex(pos, normal, c, tcoords), Tangent(tangent), Binormal(binormal) { }
|
|
|
|
//! Tangent vector along the x-axis of the texture
|
|
core::vector3df Tangent;
|
|
|
|
//! Binormal vector (tangent x normal)
|
|
core::vector3df Binormal;
|
|
|
|
bool operator==(const S3DVertexTangents& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this)==other) &&
|
|
(Tangent == other.Tangent) &&
|
|
(Binormal == other.Binormal));
|
|
}
|
|
|
|
bool operator!=(const S3DVertexTangents& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this)!=other) ||
|
|
(Tangent != other.Tangent) ||
|
|
(Binormal != other.Binormal));
|
|
}
|
|
|
|
bool operator<(const S3DVertexTangents& other) const
|
|
{
|
|
return ((static_cast<S3DVertex>(*this) < other) ||
|
|
((static_cast<S3DVertex>(*this) == other) && (Tangent < other.Tangent)) ||
|
|
((static_cast<S3DVertex>(*this) == other) && (Tangent == other.Tangent) && (Binormal < other.Binormal)));
|
|
}
|
|
|
|
static E_VERTEX_TYPE getType()
|
|
{
|
|
return EVT_TANGENTS;
|
|
}
|
|
|
|
S3DVertexTangents getInterpolated(const S3DVertexTangents& other, f32 d)
|
|
{
|
|
d = core::clamp(d, 0.0f, 1.0f);
|
|
return S3DVertexTangents(Pos.getInterpolated(other.Pos, d),
|
|
Normal.getInterpolated(other.Normal, d),
|
|
Color.getInterpolated(other.Color, d),
|
|
TCoords.getInterpolated(other.TCoords, d),
|
|
Tangent.getInterpolated(other.Tangent, d),
|
|
Binormal.getInterpolated(other.Binormal, d));
|
|
}
|
|
};
|
|
|
|
|
|
|
|
inline u32 getVertexPitchFromType(E_VERTEX_TYPE vertexType)
|
|
{
|
|
switch (vertexType)
|
|
{
|
|
case video::EVT_2TCOORDS:
|
|
return sizeof(video::S3DVertex2TCoords);
|
|
case video::EVT_TANGENTS:
|
|
return sizeof(video::S3DVertexTangents);
|
|
default:
|
|
return sizeof(video::S3DVertex);
|
|
}
|
|
}
|
|
|
|
|
|
} // end namespace video
|
|
} // end namespace irr
|
|
|
|
#endif
|