Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_HWBUFFER_VERTEXFORMAT_H__
00009 #define __SP_HWBUFFER_VERTEXFORMAT_H__
00010
00011
00012 #include "Base/spStandard.hpp"
00013 #include "Base/spInputOutputString.hpp"
00014 #include "Base/spMath.hpp"
00015 #include "Base/spMaterialConfigTypes.hpp"
00016
00017 #include <vector>
00018
00019
00020 namespace sp
00021 {
00022 namespace video
00023 {
00024
00025
00027 enum EVertexFormatFlags
00028 {
00029 VERTEXFORMAT_COORD = 0x01,
00030 VERTEXFORMAT_COLOR = 0x02,
00031 VERTEXFORMAT_NORMAL = 0x04,
00032 VERTEXFORMAT_BINORMAL = 0x08,
00033 VERTEXFORMAT_TANGENT = 0x10,
00034 VERTEXFORMAT_FOGCOORD = 0x20,
00035 VERTEXFORMAT_TEXCOORDS = 0x40,
00036 VERTEXFORMAT_UNIVERSAL = 0x80,
00037 };
00038
00040 enum EVertexAttributes
00041 {
00042 ATTRIBUTE_COORD,
00043 ATTRIBUTE_COLOR,
00044 ATTRIBUTE_NORMAL,
00045 ATTRIBUTE_BINORMAL,
00046 ATTRIBUTE_TANGENT,
00047 ATTRIBUTE_FOGCOORD,
00048 ATTRIBUTE_TEXCOORD0,
00049 ATTRIBUTE_TEXCOORD1,
00050 ATTRIBUTE_TEXCOORD2,
00051 ATTRIBUTE_TEXCOORD3,
00052 ATTRIBUTE_TEXCOORD4,
00053 ATTRIBUTE_TEXCOORD5,
00054 ATTRIBUTE_TEXCOORD6,
00055 ATTRIBUTE_TEXCOORD7,
00056 ATTRIBUTE_UNIVERSAL,
00057 };
00058
00060 struct SVertexAttribute
00061 {
00062 SVertexAttribute() :
00063 Size (0 ),
00064 Offset (0 ),
00065 Type (DATATYPE_FLOAT ),
00066 hasDefaultSetting (false ),
00067 isReference (false )
00068 {
00069 }
00070 SVertexAttribute(
00071 s32 InitSize, const io::stringc InitName = "", const ERendererDataTypes InitType = DATATYPE_FLOAT,
00072 bool DefaultSetting = true, bool InitNormalize = false) :
00073 Size (InitSize ),
00074 Offset (0 ),
00075 Type (InitType ),
00076 Name (InitName ),
00077 Normalize (InitNormalize ),
00078 hasDefaultSetting (DefaultSetting ),
00079 isReference (false )
00080 {
00081 }
00082 ~SVertexAttribute()
00083 {
00084 }
00085
00086
00087 s32 Size;
00088 s32 Offset;
00089 ERendererDataTypes Type;
00090 io::stringc Name;
00091 bool Normalize;
00092 bool hasDefaultSetting;
00093 bool isReference;
00094 };
00095
00096
00098 class SP_EXPORT VertexFormat
00099 {
00100
00101 public:
00102
00103 virtual ~VertexFormat();
00104
00105
00106
00108 io::stringc getIdentifier() const;
00109
00111 virtual u32 getFormatSize() const;
00112
00114 static s32 getDataTypeSize(const ERendererDataTypes Type);
00115
00116
00117
00119 inline s32 getFlags() const
00120 {
00121 return Flags_;
00122 }
00123
00124 inline void setName(const io::stringc &Name)
00125 {
00126 Name_ = Name;
00127 }
00128 inline io::stringc getName() const
00129 {
00130 return Name_;
00131 }
00132
00133 inline const SVertexAttribute& getCoord() const
00134 {
00135 return Coord_;
00136 }
00137 inline const SVertexAttribute& getColor() const
00138 {
00139 return Color_;
00140 }
00141 inline const SVertexAttribute& getNormal() const
00142 {
00143 return Normal_;
00144 }
00145 inline const SVertexAttribute& getBinormal() const
00146 {
00147 return Binormal_;
00148 }
00149 inline const SVertexAttribute& getTangent() const
00150 {
00151 return Tangent_;
00152 }
00153 inline const SVertexAttribute& getFogCoord() const
00154 {
00155 return FogCoord_;
00156 }
00157
00158 inline const std::vector<SVertexAttribute>& getTexCoords() const
00159 {
00160 return TexCoords_;
00161 }
00162 inline const std::vector<SVertexAttribute>& getUniversals() const
00163 {
00164 return Universals_;
00165 }
00166
00167 protected:
00168
00169 friend class Direct3D11RenderSystem;
00170 friend class Direct3D11Shader;
00171
00172
00173
00174 VertexFormat();
00175 VertexFormat(const io::stringc &Name, s32 Flags);
00176
00177 virtual void getFormatSize(u32 &Size) const;
00178 void addComponentFormatSize(u32 &Size, const SVertexAttribute &Attrib) const;
00179
00180 void constructComponent(
00181 const EVertexFormatFlags Type, SVertexAttribute &Attrib, s32 &Offset, s32 MinSize, s32 MaxSize
00182 );
00183 virtual void constructFormat();
00184
00185
00186
00187 inline void addFlag(const EVertexFormatFlags Flag)
00188 {
00189 Flags_ |= Flag;
00190 }
00191 inline void removeFlag(const EVertexFormatFlags Flag)
00192 {
00193 if (Flags_ & Flag)
00194 Flags_ ^= Flag;
00195 }
00196
00197
00198
00199 s32 Flags_;
00200 io::stringc Name_;
00201
00202 SVertexAttribute Coord_;
00203 SVertexAttribute Color_;
00204 SVertexAttribute Normal_;
00205 SVertexAttribute Binormal_;
00206 SVertexAttribute Tangent_;
00207 SVertexAttribute FogCoord_;
00208
00209 std::vector<SVertexAttribute> TexCoords_;
00210 std::vector<SVertexAttribute> Universals_;
00211
00212 void* InputLayout_;
00213
00214 };
00215
00216
00217 }
00218
00219 }
00220
00221
00222 #endif
00223
00224
00225
00226