view Math.h @ 1528:270627b54ed4

Fix Vec3<T>::Normalize_float().
author yoctozepto
date Fri, 06 Sep 2013 09:29:17 +0200
parents f0551cd4cbc9
children 499761153844
line wrap: on
line source

#pragma once

#include <cassert>
#include <limits>

/*  186 */
#pragma pack(push, 1)
struct stru193_math
{
  stru193_math();
  int Cos(int angle);
  unsigned int Atan2(int x, int y);
  int Sin(int angle);

  int pTanTable[520];
  int pCosTable[520];
  int pInvCosTable[520];
  static const unsigned int uIntegerPi = 1024;
  static const unsigned int uIntegerHalfPi = 512;
  static const unsigned int uIntegerDoublePi = 2048;
  static const unsigned int uDoublePiMask = 2047;
  static const unsigned int uPiMask = 1023;
  static const unsigned int uHalfPiMask = 511;
};
#pragma pack(pop)

int fixpoint_sub0(int, int);
int fixpoint_div(int, int);
int fixpoint_mul(int, int);
int fixpoint_from_float(float value);

template <typename FloatType>
inline int bankersRounding(
  const FloatType& value
  ) {
    assert("Method unsupported for this type" && false);
    return value;
}

template<> inline int bankersRounding<float>(const float& inValue)
{
  union Cast
  {
    double d;
    long l;
  };
  volatile Cast c;
  c.d = inValue + 6755399441055744.0;
  return c.l;
}

#pragma push_macro("max")
#undef max
template<> inline int bankersRounding<double>(const double& inValue)
{
  double maxValue = std::numeric_limits<int>::max();
  assert(maxValue - 6755399441055744.0 >= inValue);
  union Cast
  {
    double d;
    long l;
  };
  volatile Cast c;
  c.d = inValue + 6755399441055744.0;
  return c.l;
}
#pragma pop_macro("max")

extern struct stru193_math *stru_5C6E00;