30 template <u
int32_t Size,
typename StorageType,
typename OperationType>
39 template <u
int32_t Size,
typename StorageType,
typename OperationType>
42 for(
uint32_t ct = 0; ct < Size; ct++)
44 m_tElements[ct] = tFillValue;
53 template <u
int32_t Size,
typename StorageType,
typename OperationType>
56 POLYVOX_STATIC_ASSERT(Size == 2,
"This constructor should only be used for vectors with two elements.");
68 template <u
int32_t Size,
typename StorageType,
typename OperationType>
71 POLYVOX_STATIC_ASSERT(Size == 3,
"This constructor should only be used for vectors with three elements.");
86 template <u
int32_t Size,
typename StorageType,
typename OperationType>
89 POLYVOX_STATIC_ASSERT(Size == 4,
"This constructor should only be used for vectors with four elements.");
101 template <u
int32_t Size,
typename StorageType,
typename OperationType>
104 std::memcpy(m_tElements, vector.m_tElements,
sizeof(StorageType) * Size);
116 template <u
int32_t Size,
typename StorageType,
typename OperationType>
117 template <
typename CastType>
120 for(
uint32_t ct = 0; ct < Size; ++ct)
122 m_tElements[ct] =
static_cast<StorageType
>(vector.
getElement(ct));
129 template <u
int32_t Size,
typename StorageType,
typename OperationType>
147 template <u
int32_t Size,
typename StorageType,
typename OperationType>
154 std::memcpy(m_tElements, rhs.m_tElements,
sizeof(StorageType) * Size);
164 template <u
int32_t Size,
typename StorageType,
typename OperationType>
168 for(
uint32_t ct = 0; ct < Size; ++ct)
170 if(m_tElements[ct] != rhs.m_tElements[ct])
185 template <u
int32_t Size,
typename StorageType,
typename OperationType>
188 return !(*
this == rhs);
200 template <u
int32_t Size,
typename StorageType,
typename OperationType>
203 for(
uint32_t ct = 0; ct < Size; ++ct)
205 if (m_tElements[ct] < rhs.m_tElements[ct])
207 if (rhs.m_tElements[ct] < m_tElements[ct])
218 template <u
int32_t Size,
typename StorageType,
typename OperationType>
221 for(
uint32_t ct = 0; ct < Size; ++ct)
223 m_tElements[ct] += rhs.m_tElements[ct];
233 template <u
int32_t Size,
typename StorageType,
typename OperationType>
236 for(
uint32_t ct = 0; ct < Size; ++ct)
238 m_tElements[ct] -= rhs.m_tElements[ct];
248 template <u
int32_t Size,
typename StorageType,
typename OperationType>
251 for(
uint32_t ct = 0; ct < Size; ++ct)
253 m_tElements[ct] *= rhs.m_tElements[ct];
263 template <u
int32_t Size,
typename StorageType,
typename OperationType>
266 for(
uint32_t ct = 0; ct < Size; ++ct)
268 m_tElements[ct] /= rhs.m_tElements[ct];
278 template <u
int32_t Size,
typename StorageType,
typename OperationType>
281 for(
uint32_t ct = 0; ct < Size; ++ct)
283 m_tElements[ct] *= rhs;
293 template <u
int32_t Size,
typename StorageType,
typename OperationType>
296 for(
uint32_t ct = 0; ct < Size; ++ct)
298 m_tElements[ct] /= rhs;
309 template <u
int32_t Size,
typename StorageType,
typename OperationType>
323 template <u
int32_t Size,
typename StorageType,
typename OperationType>
337 template <u
int32_t Size,
typename StorageType,
typename OperationType>
351 template <u
int32_t Size,
typename StorageType,
typename OperationType>
365 template <u
int32_t Size,
typename StorageType,
typename OperationType>
379 template <u
int32_t Size,
typename StorageType,
typename OperationType>
393 template <u
int32_t Size,
typename StorageType,
typename OperationType>
394 std::ostream& operator<<(std::ostream& os, const Vector<Size, StorageType, OperationType>& vector)
397 for(
uint32_t ct = 0; ct < Size; ++ct)
414 template <u
int32_t Size,
typename StorageType,
typename OperationType>
417 POLYVOX_ASSERT(index < Size,
"Attempted to access invalid vector element.");
418 return m_tElements[index];
424 template <u
int32_t Size,
typename StorageType,
typename OperationType>
427 return m_tElements[0];
433 template <u
int32_t Size,
typename StorageType,
typename OperationType>
436 return m_tElements[1];
442 template <u
int32_t Size,
typename StorageType,
typename OperationType>
445 POLYVOX_STATIC_ASSERT(Size >= 3,
"You can only get the 'z' component from a vector with at least three elements.");
447 return m_tElements[2];
453 template <u
int32_t Size,
typename StorageType,
typename OperationType>
456 POLYVOX_STATIC_ASSERT(Size >= 4,
"You can only get the 'w' component from a vector with at least four elements.");
458 return m_tElements[3];
465 template <u
int32_t Size,
typename StorageType,
typename OperationType>
468 POLYVOX_ASSERT(index < Size,
"Attempted to access invalid vector element.");
469 m_tElements[index] = tValue;
477 template <u
int32_t Size,
typename StorageType,
typename OperationType>
491 template <u
int32_t Size,
typename StorageType,
typename OperationType>
494 POLYVOX_STATIC_ASSERT(Size >= 3,
"You can only use this version of setElements() on a vector with at least three elements.");
508 template <u
int32_t Size,
typename StorageType,
typename OperationType>
511 POLYVOX_STATIC_ASSERT(Size >= 4,
"You can only use this version of setElements() on a vector with at least four elements.");
522 template <u
int32_t Size,
typename StorageType,
typename OperationType>
531 template <u
int32_t Size,
typename StorageType,
typename OperationType>
540 template <u
int32_t Size,
typename StorageType,
typename OperationType>
543 POLYVOX_STATIC_ASSERT(Size >= 3,
"You can only set the 'w' component from a vector with at least three elements.");
551 template <u
int32_t Size,
typename StorageType,
typename OperationType>
554 POLYVOX_STATIC_ASSERT(Size >= 4,
"You can only set the 'w' component from a vector with at least four elements.");
563 template <u
int32_t Size,
typename StorageType,
typename OperationType>
566 return sqrt(static_cast<float>(lengthSquared()));
572 template <u
int32_t Size,
typename StorageType,
typename OperationType>
575 OperationType tLengthSquared =
static_cast<OperationType
>(0);
576 for(
uint32_t ct = 0; ct < Size; ++ct)
578 tLengthSquared +=
static_cast<OperationType
>(m_tElements[ct]) * static_cast<OperationType>(m_tElements[ct]);
580 return tLengthSquared;
592 template <u
int32_t Size,
typename StorageType,
typename OperationType>
595 return acos(static_cast<float>(dot(vector)) / (vector.
length() * this->length()));
610 template <u
int32_t Size,
typename StorageType,
typename OperationType>
613 StorageType i = vector.
getZ() * this->getY() - vector.
getY() * this->getZ();
614 StorageType j = vector.
getX() * this->getZ() - vector.
getZ() * this->getX();
615 StorageType k = vector.
getY() * this->getX() - vector.
getX() * this->getY();
626 template <u
int32_t Size,
typename StorageType,
typename OperationType>
629 OperationType dotProduct =
static_cast<OperationType
>(0);
630 for(
uint32_t ct = 0; ct < Size; ++ct)
632 dotProduct +=
static_cast<OperationType
>(m_tElements[ct]) * static_cast<OperationType>(rhs.m_tElements[ct]);
644 template <u
int32_t Size,
typename StorageType,
typename OperationType>
647 float fLength = this->length();
648 for(
uint32_t ct = 0; ct < Size; ++ct)
651 m_tElements[ct] /= fLength;
652 POLYVOX_ASSERT(m_tElements[ct] == m_tElements[ct],
"Obtained NAN during vector normalisation. Perhaps the input vector was too short?");