diff Engine/OurMath.cpp @ 2499:68cdef6879a0

engine folder
author Ritor1
date Fri, 19 Sep 2014 02:57:42 +0600
parents
children 1bcadc6dd203
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Engine/OurMath.cpp	Fri Sep 19 02:57:42 2014 +0600
@@ -0,0 +1,256 @@
+#define _CRTDBG_MAP_ALLOC
+#include <stdlib.h>
+#include <crtdbg.h>
+
+#include "OurMath.h"
+#include "MM7_data.h"
+
+//----- (00452969) --------------------------------------------------------
+stru193_math::stru193_math()
+{
+  double v3; // ST18_8@2
+
+  this->pTanTable[0] = 0;
+  this->pCosTable[0] = 65536;
+  this->pInvCosTable[0] = 65536;
+  for(int i = 1; i < (signed int)this->uIntegerHalfPi; i++)
+  {
+    v3 = (double)i * 3.141592653589793 / (double)uIntegerPi;
+    pTanTable[i] = (signed __int64)(tan(v3) * (double)this->pCosTable[0] + 0.5);
+    pCosTable[i] = (signed __int64)(cos(v3) * (double)this->pCosTable[0] + 0.5);
+    pInvCosTable[i] = (signed __int64)(1.0 / cos(v3) * (double)this->pCosTable[0] + 0.5);
+  }
+  for(int i = this->uIntegerHalfPi; i < 520; i++)
+  {
+    this->pTanTable[i] = 0xEFFFFFFFu;
+    this->pCosTable[i] = 0;
+    this->pInvCosTable[i] = 0xEFFFFFFFu;
+  }
+}
+
+
+//----- (00402CAE) --------------------------------------------------------
+int stru193_math::Cos(int angle)
+{
+  int v2; // eax@1
+
+  //a2: (angle - uIntegerHalfPi)    for  sin(angle)
+  //    (angle)                     for  cos(angle)
+
+  v2 = uDoublePiMask & angle;
+
+  if ( v2 > uIntegerPi )
+    v2 = uIntegerDoublePi - v2;
+  if ( v2 >= uIntegerHalfPi )
+    return -pCosTable[uIntegerPi - v2];
+  else
+    return pCosTable[v2];
+}
+
+
+//----- (0045281E) --------------------------------------------------------
+//    Calculates atan2(y/x)
+// return value: angle in integer format (multiplier of Pi/1024)  
+unsigned int stru193_math::Atan2(int x, int y)
+{
+  signed int quadrant;
+  __int64 dividend;
+  int quotient;
+  int lowIdx;
+  int highIdx;
+  int angle;
+
+  int X = x;
+  int Y = y;
+
+  if ( abs(X) < 65536 )
+  {
+    if ( (abs(Y) >> 15) >= abs(X) )
+      X = 0;
+  }
+
+  if ( !X )
+  {
+    if ( Y > 0 )
+    {
+      return uIntegerHalfPi;   //Pi/2
+    }
+    else
+    {
+      return uIntegerHalfPi + uIntegerPi; //3*(Pi/2)
+    }
+  }
+
+  if ( Y )
+  {
+    if ( X < 0 )
+    {
+      X = -X;
+      if ( Y > 0 )
+      {
+        quadrant = 4;        
+      }
+      else
+      {
+        quadrant = 3;        
+      }      
+    }
+    else
+    {
+      if ( Y > 0 )
+      {
+        quadrant = 1;       
+      }
+      else
+      {
+        quadrant = 2;
+      }      
+    }
+
+    if ( Y < 0 )
+      Y = -Y;
+
+    LODWORD(dividend) = Y << 16;
+    HIDWORD(dividend) = Y >> 16;
+    quotient = dividend / X;        
+
+    //looks like binary search
+    {
+      int i;
+      highIdx = uIntegerHalfPi;
+      lowIdx = 0;
+
+      for (i = 0; i < 6; ++i)
+      {        
+        if (quotient <= pTanTable[(lowIdx + highIdx) / 2])      
+          highIdx = (lowIdx + highIdx) / 2;
+        else
+          lowIdx = (lowIdx + highIdx) / 2;    
+      }
+    }
+
+    angle = lowIdx + 1;
+    while ( angle < (highIdx - 1) && quotient >= pTanTable[angle] )
+      ++angle;
+
+    switch (quadrant)
+    {
+    case 1: //X > 0, Y > 0
+      return angle;        
+
+    case 2: //X > 0, Y < 0
+      return uIntegerDoublePi - angle;   //2*Pi - angle
+
+    case 3: //X > 0, Y < 0
+      return uIntegerPi + angle;        //Pi + angle 
+
+    case 4: //X < 0, Y > 0
+      return uIntegerPi - angle;        //Pi - angle  
+    }
+
+    //should newer get here
+    return 0;
+  }
+
+  if ( X < 0 )    //Y == 0, X < 0
+    return uIntegerPi;  
+
+  return 0;
+}
+
+//----- (0042EBDB) --------------------------------------------------------
+int stru193_math::Sin(int angle)
+{
+  return Cos(angle - this->uIntegerHalfPi);
+}
+
+//----- (0042EBBE) --------------------------------------------------------
+//----- (004453C0) mm6-----------------------------------------------------
+//----- (004A1760) mm6_chinese---------------------------------------------
+__int64 fixpoint_mul(int a1, int a2)
+{
+  return ((__int64)a1 * (__int64)a2) >> 16;
+}
+
+__int64 fixpoint_dot(int x1, int x2, int y1, int y2, int z1, int z2)
+{
+  return fixpoint_mul(x1, x2) +
+    fixpoint_mul(y1, y2) +
+    fixpoint_mul(z1, z2);
+}
+
+//----- (004A1780) mm6_chinese---------------------------------------------
+__int64 fixpoint_div(int a1, int a2)
+{
+  return ((__int64)a1 << 16) / a2;
+}
+
+__int64 fixpoint_sub_unknown(int a1, int a2)
+{
+  return (((__int64)a1 << 16) * a2) >> 16;
+}
+
+//----- (0048B561) --------------------------------------------------------
+int fixpoint_from_float(float val)
+{
+  //  float X.Yf -> int XXXX YYYY
+  int left = floorf((val - 0.5f) + 0.5f);
+  int right = floorf((val - left) * 65536.0f);
+  return (left << 16) | right;
+}
+
+int fixpoint_from_int(int lhv, int rhv)
+{
+  return (lhv << 16) | rhv;
+}
+
+
+//----- (00452A9E) --------------------------------------------------------
+int integer_sqrt(int val)
+{
+///////////////////////////////
+//Получение квадратного корня//
+///////////////////////////////
+
+  signed int result; // eax@2
+  unsigned int v2; // edx@3
+  unsigned int v3; // edi@3
+  int v5; // esi@4
+
+  if (val < 1)
+    return val;
+
+  v2 = 0;
+  v3 = val;
+  result = 0;
+  for (uint i = 0; i < 16; ++i)
+  {
+    result *= 2;
+    v2 = (v3 >> 30) | 4 * v2;
+    v5 = 2 * result + 1;
+    v3 *= 4;
+    if ( v2 >= v5 )
+    {
+      ++result;
+      v2 -= v5;
+    }
+  }
+  if ( val - result * result >= (unsigned int)(result - 1) )
+    ++result;
+  return result;
+}
+
+//----- (00452B2E) --------------------------------------------------------
+int __fastcall GetDiceResult(unsigned int uNumDice, unsigned int uDiceSides)
+{
+  int v3; // esi@1
+
+  v3 = 0;
+  if ( uDiceSides )
+  {
+    for ( uint i = 0; i < uNumDice; ++i)
+      v3 += rand() % uDiceSides + 1;
+    return v3;
+  }
+  return 0;
+}