TimeSourceWin32::TimeSourceWin32() { LARGE_INTEGER frequency; ::QueryPerformanceFrequency(&frequency); POMDOG_ASSERT_MESSAGE(0 != frequency.QuadPart, "High-resolution performance counter not supported by installed hardware."); secondsPerTick = 1.0 / frequency.QuadPart; }
T Clamp(const T& x, const T& min, const T& max) { static_assert(std::is_arithmetic<T>::value || Detail::IsTaggedFloatingPoint<T>::value, ""); POMDOG_ASSERT_MESSAGE(min < max, "In Clamp, maxval is out of range"); if (x < min) { return min; } if (x > max) { return max; } return x; }
FloatingPointMatrix3x2<T> FloatingPointMatrix3x2<T>::Invert(const FloatingPointMatrix3x2& matrix) { auto const determinant = matrix.Determinant(); static_assert(std::is_same<decltype(matrix.Determinant()), T>::value, "determinant is T"); POMDOG_ASSERT_MESSAGE(T{0} != determinant, "This is singular matrix"); auto const inverseDeterminant = T{1} / determinant; auto const offsetX = matrix(2, 0); auto const offsetY = matrix(2, 1); return { matrix(1, 1) * inverseDeterminant, -matrix(0, 1) * inverseDeterminant, -matrix(1, 0) * inverseDeterminant, matrix(0, 0) * inverseDeterminant, (matrix(1, 0) * offsetY - offsetX * matrix(1, 1)) * inverseDeterminant, (offsetX * matrix(0, 1) - matrix(0, 0) * offsetY) * inverseDeterminant}; }
const T& FloatingPointMatrix3x2<T>::operator()(std::size_t row, std::size_t column) const { POMDOG_ASSERT_MESSAGE(row < RowSize, "row: out of range"); POMDOG_ASSERT_MESSAGE(column < ColumnSize, "column: out of range"); return m[row][column]; }