aboutsummaryrefslogtreecommitdiff
path: root/source/c4.c
blob: 163341be8b6e93dc5109504eb9cb817348dabf6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "../copyright"

#include <math.h>
#include <stdlib.h>
#include "c4.h"
#include "memmap.h"

int16_t C4WFXVal;
int16_t C4WFYVal;
int16_t C4WFZVal;
int16_t C4WFX2Val;
int16_t C4WFY2Val;
int16_t C4WFDist;
int16_t C4WFScale;

static double tanval;
static double c4x, c4y, c4z;
static double c4x2, c4y2, c4z2;

void C4TransfWireFrame()
{
   c4x = (double) C4WFXVal;
   c4y = (double) C4WFYVal;
   c4z = (double) C4WFZVal - 0x95;

   // Rotate X
   tanval = -(double) C4WFX2Val * 3.14159265 * 2 / 128;
   c4y2 = c4y * cos(tanval) - c4z * sin(tanval);
   c4z2 = c4y * sin(tanval) + c4z * cos(tanval);

   // Rotate Y
   tanval = -(double)C4WFY2Val * 3.14159265 * 2 / 128;
   c4x2 = c4x * cos(tanval) + c4z2 * sin(tanval);
   c4z = c4x * - sin(tanval) + c4z2 * cos(tanval);

   // Rotate Z
   tanval = -(double) C4WFDist * 3.14159265 * 2 / 128;
   c4x = c4x2 * cos(tanval) - c4y2 * sin(tanval);
   c4y = c4x2 * sin(tanval) + c4y2 * cos(tanval);

   // Scale
   C4WFXVal = (int16_t)(c4x * (double)C4WFScale / (0x90 * (c4z + 0x95)) * 0x95);
   C4WFYVal = (int16_t)(c4y * (double)C4WFScale / (0x90 * (c4z + 0x95)) * 0x95);
}

void C4TransfWireFrame2()
{
   c4x = (double)C4WFXVal;
   c4y = (double)C4WFYVal;
   c4z = (double)C4WFZVal;

   // Rotate X
   tanval = -(double) C4WFX2Val * 3.14159265 * 2 / 128;
   c4y2 = c4y * cos(tanval) - c4z * sin(tanval);
   c4z2 = c4y * sin(tanval) + c4z * cos(tanval);

   // Rotate Y
   tanval = -(double) C4WFY2Val * 3.14159265 * 2 / 128;
   c4x2 = c4x * cos(tanval) + c4z2 * sin(tanval);
   c4z = c4x * -sin(tanval) + c4z2 * cos(tanval);

   // Rotate Z
   tanval = -(double)C4WFDist * 3.14159265 * 2 / 128;
   c4x = c4x2 * cos(tanval) - c4y2 * sin(tanval);
   c4y = c4x2 * sin(tanval) + c4y2 * cos(tanval);

   // Scale
   C4WFXVal = (int16_t)(c4x * (double)C4WFScale / 0x100);
   C4WFYVal = (int16_t)(c4y * (double)C4WFScale / 0x100);
}

void C4CalcWireFrame()
{
   C4WFXVal = C4WFX2Val - C4WFXVal;
   C4WFYVal = C4WFY2Val - C4WFYVal;
   if (abs(C4WFXVal) > abs(C4WFYVal))
   {
      C4WFDist = abs(C4WFXVal) + 1;
      C4WFYVal = (int16_t)(256 * (double) C4WFYVal / abs(C4WFXVal));
      if (C4WFXVal < 0)
         C4WFXVal = -256;
      else
         C4WFXVal = 256;
   }
   else
   {
      if (C4WFYVal != 0)
      {
         C4WFDist = abs(C4WFYVal) + 1;
         C4WFXVal = (int16_t)(256 * (double)C4WFXVal / abs(C4WFYVal));
         if (C4WFYVal < 0)
            C4WFYVal = -256;
         else
            C4WFYVal = 256;
      }
      else
         C4WFDist = 0;
   }
}

int16_t C41FXVal;
int16_t C41FYVal;
int16_t C41FAngleRes;
int16_t C41FDist;
int16_t C41FDistVal;

void C4Op1F()
{
   if (C41FXVal == 0)
   {
      if (C41FYVal > 0)
         C41FAngleRes = 0x80;
      else
         C41FAngleRes = 0x180;
   }
   else
   {
      tanval = (double) C41FYVal / C41FXVal;
      C41FAngleRes = (int16_t)(atan(tanval) / (3.141592675 * 2) * 512);
      if (C41FXVal < 0)
         C41FAngleRes += 0x100;
      C41FAngleRes &= 0x1FF;
   }
}

void C4Op15()
{
   tanval = sqrt((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal);
   C41FDist = (int16_t) tanval;
}

void C4Op0D()
{
   tanval = sqrt((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal);
   tanval = C41FDistVal / tanval;
   C41FYVal = (int16_t)(C41FYVal * tanval * 0.99);
   C41FXVal = (int16_t)(C41FXVal * tanval * 0.98);
}

#ifdef ZSNES_C4
void C4LoaDMem(char* C4RAM)
{
   memmove(C4RAM + (READ_WORD(C4RAM + 0x1f45) & 0x1fff),
           S9xGetMemPointer(READ_3WORD(C4RAM + 0x1f40)),
           READ_WORD(C4RAM + 0x1f43));
}
#endif