51 #ifndef AI_VERTEX_H_INC
52 #define AI_VERTEX_H_INC
55 # pragma GCC system_header
60 #include <assimp/ai_assert.h>
72 template <
typename T0,
typename T1,
typename TRES = T0>
struct plus {
73 TRES operator() (
const T0& t0,
const T1& t1)
const {
77 template <
typename T0,
typename T1,
typename TRES = T0>
struct minus {
78 TRES operator() (
const T0& t0,
const T1& t1)
const {
82 template <
typename T0,
typename T1,
typename TRES = T0>
struct multiplies {
83 TRES operator() (
const T0& t0,
const T1& t1)
const {
87 template <
typename T0,
typename T1,
typename TRES = T0>
struct divides {
88 TRES operator() (
const T0& t0,
const T1& t1)
const {
113 ai_assert(idx < msh->mNumVertices);
116 if (msh->HasNormals()) {
120 if (msh->HasTangentsAndBitangents()) {
125 for (
unsigned int i = 0; msh->HasTextureCoords(i); ++i) {
129 for (
unsigned int i = 0; msh->HasVertexColors(i); ++i) {
130 colors[i] = msh->
mColors[i][idx];
137 ai_assert(idx < msh->mNumVertices);
140 if (msh->HasNormals()) {
144 if (msh->HasTangentsAndBitangents()) {
149 for (
unsigned int i = 0; msh->HasTextureCoords(i); ++i) {
153 for (
unsigned int i = 0; msh->HasVertexColors(i); ++i) {
154 colors[i] = msh->
mColors[i][idx];
163 Vertex& operator -= (
const Vertex& v) {
168 Vertex& operator *= (ai_real v) {
173 Vertex& operator /= (ai_real v) {
181 ai_assert(idx<out->mNumVertices);
184 if (out->HasNormals()) {
188 if (out->HasTangentsAndBitangents()) {
193 for(
unsigned int i = 0; out->HasTextureCoords(i); ++i) {
197 for(
unsigned int i = 0; out->HasVertexColors(i); ++i) {
198 out->
mColors[i][idx] = colors[i];
206 template <
template <
typename t>
class op>
static Vertex BinaryOp(
const Vertex& v0,
const Vertex& v1) {
210 res.position = op<aiVector3D>()(v0.position,v1.position);
211 res.normal = op<aiVector3D>()(v0.normal,v1.normal);
212 res.tangent = op<aiVector3D>()(v0.tangent,v1.tangent);
213 res.bitangent = op<aiVector3D>()(v0.bitangent,v1.bitangent);
216 res.texcoords[i] = op<aiVector3D>()(v0.texcoords[i],v1.texcoords[i]);
219 res.colors[i] = op<aiColor4D>()(v0.colors[i],v1.colors[i]);
226 template <
template <
typename,
typename,
typename>
class op>
static Vertex BinaryOp(
const Vertex& v0, ai_real f) {
230 res.position = op<aiVector3D,ai_real,aiVector3D>()(v0.position,f);
231 res.normal = op<aiVector3D,ai_real,aiVector3D>()(v0.normal,f);
232 res.tangent = op<aiVector3D,ai_real,aiVector3D>()(v0.tangent,f);
233 res.bitangent = op<aiVector3D,ai_real,aiVector3D>()(v0.bitangent,f);
236 res.texcoords[i] = op<aiVector3D,ai_real,aiVector3D>()(v0.texcoords[i],f);
239 res.colors[i] = op<aiColor4D,ai_real,aiColor4D>()(v0.colors[i],f);
246 template <
template <
typename,
typename,
typename>
class op>
static Vertex BinaryOp(ai_real f,
const Vertex& v0) {
250 res.position = op<ai_real,aiVector3D,aiVector3D>()(f,v0.position);
251 res.normal = op<ai_real,aiVector3D,aiVector3D>()(f,v0.normal);
252 res.tangent = op<ai_real,aiVector3D,aiVector3D>()(f,v0.tangent);
253 res.bitangent = op<ai_real,aiVector3D,aiVector3D>()(f,v0.bitangent);
256 res.texcoords[i] = op<ai_real,aiVector3D,aiVector3D>()(f,v0.texcoords[i]);
259 res.colors[i] = op<ai_real,aiColor4D,aiColor4D>()(f,v0.colors[i]);
275 AI_FORCE_INLINE Vertex operator + (
const Vertex& v0,
const Vertex& v1) {
276 return Vertex::BinaryOp<std::plus>(v0,v1);
279 AI_FORCE_INLINE Vertex operator - (
const Vertex& v0,
const Vertex& v1) {
280 return Vertex::BinaryOp<std::minus>(v0,v1);
283 AI_FORCE_INLINE Vertex operator * (
const Vertex& v0,ai_real f) {
284 return Vertex::BinaryOp<Intern::multiplies>(v0,f);
287 AI_FORCE_INLINE Vertex operator / (
const Vertex& v0,ai_real f) {
288 return Vertex::BinaryOp<Intern::multiplies>(v0,1.f/f);
291 AI_FORCE_INLINE Vertex operator * (ai_real f,
const Vertex& v0) {
292 return Vertex::BinaryOp<Intern::multiplies>(f,v0);
297 #endif // AI_VERTEX_H_INC