📄 dsp1.cpp
字号:
// Rotate matrix around the Z axis using Azimuth angle (Aas) RotateZ(vM,ANGLE_TO_RAD(Aas)); // Rotate matrix around the Y axis using Zenith angle (Azs) RotateY(vM,ANGLE_TO_RAD(Azs)); // Calculate translation. double lfe = double(Lfe); vT[0] = (-vM[2][0] * lfe) + double(Fx); vT[1] = (-vM[2][1] * lfe) + double(Fy); vT[2] = (-vM[2][2] * lfe) + double(Fz); // Calculate DSP1.vPlaneD DSP1.vPlaneD = -(vT[0]*vT[0] + vT[1]*vT[1] + vT[2]*vT[2]); // Calculate DSP1.vHorizon DSP1.vHorizon = vM[1][2] != 0.0 ? ((-vM[2][2] * DSP1.vFov) / vM[1][2]) : 0.0; ///////////////////////////// // Calculate output values // ///////////////////////////// // Sky background X-scroll position Vof = int16(uint8(Aas)); // We should do some more checking on this // Horizon // (Sky background bottom position) double h = DSP1.vHorizon + SCREEN_CENTER_Y + 1.0; h *= SCREEN_BASE_Y; CLIP16(h); Vva = int16(h); // Start coordinate of mode7 layer // at left screen border, and horizon position VECTOR vCxy; DSP1.ScreenToGround(vCxy, -(SCREEN_WIDTH/2.0), DSP1.vHorizon + 1.0); vCxy[0] += SCREEN_CENTER_X; vCxy[0] *= SCREEN_BASE_X; vCxy[1] += SCREEN_CENTER_Y; vCxy[1] *= SCREEN_BASE_Y; Cx = int16(vCxy[0]); Cy = int16(vCxy[1]); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////DSP1_Raster::DSP1_Raster( int16 Vs ){ SHOW_FUNC_START(); double vs = (double(Vs) / SCREEN_BASE_Y) - SCREEN_CENTER_X; VECTOR vL,vR,vN; DSP1.ScreenToGround(vL, -(SCREEN_WIDTH/2.0), vs); DSP1.ScreenToGround(vR, SCREEN_WIDTH/2.0, vs); DSP1.ScreenToGround(vN, -(SCREEN_WIDTH/2.0), vs + 1.0); double a = (vR[0] - vL[0]) * -MODE7_RESOLUTION; double b = (vR[1] - vL[1]) * -MODE7_RESOLUTION; double c = (vN[0] - vL[0]) * -MODE7_RESOLUTION; double d = (vN[1] - vL[1]) * -MODE7_RESOLUTION; CLIP16(a); CLIP16(b); CLIP16(c); CLIP16(d); An = int16(a); Bn = int16(b); Cn = int16(c); Dn = int16(d); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////DSP1_Target::DSP1_Target( int16 h, int16 v ){ SHOW_FUNC_START(); double H = (double(h) / SCREEN_BASE_X) - SCREEN_CENTER_X; double V = (double(v) / SCREEN_BASE_Y) - SCREEN_CENTER_Y; VECTOR xy; DSP1.ScreenToGround(xy, H, V); xy[0] *= MODE7_RESOLUTION; xy[1] *= MODE7_RESOLUTION; CLIP16(xy[0]); CLIP16(xy[1]); X = int16(xy[0]); Y = int16(xy[1]); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////DSP1_Triangle::DSP1_Triangle (int16 A, int16 r){ A = (A / 256) & 255; S = SinTable2 [A] * r / 65536; C = CosTable2 [A] * r / 65536;}////////////////////////////////////////////////////////////////////DSP1_Radius::DSP1_Radius( int16 x, int16 y, int16 z ){ SHOW_FUNC_START(); int32 l = int32(x)*int32(x) + int32(y)*int32(y) + int32(z)*int32(z); Ll = int16(l); Lh = int16(l>>16); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////int16 DSP1_Range( int16 x, int16 y, int16 z, int16 r ){ SHOW_FUNC_START(); int32 l = int32(x)*int32(x) + int32(y)*int32(y) + int32(z)*int32(z) - int32(r)*int32(r); SHOW_FUNC_END(); return int16(l); //return int16(l>>16); // Should it be like this instead???}////////////////////////////////////////////////////////////////////int16 DSP1_Distance( int16 x, int16 y, int16 z ){ SHOW_FUNC_START(); int32 l = int32(x)*int32(x) + int32(y)*int32(y) + int32(z)*int32(z); l = int32(sqrt(l)); CLIP16(l); SHOW_FUNC_END(); return int16(l);}////////////////////////////////////////////////////////////////////DSP1_Rotate::DSP1_Rotate (int16 A, int16 x1, int16 y1){ A = (A / 256) & 255; x2 = (x1 * CosTable2 [A] + y1 * SinTable2 [A]) / 65536; y2 = (x1 * -SinTable2 [A] + y1 * CosTable2 [A]) / 65536;#if 0 SHOW_FUNC_START(); double a = ANGLE_TO_RAD(A); double s = sin(a); double c = cos(a); double x = c * double(x1) - s * double(y1); double y = s * double(x1) + c * double(y1); CLIP16(x); CLIP16(y); x2 = int16(x); y2 = int16(y); SHOW_FUNC_END();#endif}////////////////////////////////////////////////////////////////////DSP1_Polar::DSP1_Polar( int8 Za, int8 Xa, int8 Ya, int16 x, int16 y, int16 z ){ SHOW_FUNC_START(); VECTOR v; v[0] = double(x); v[1] = double(y); v[2] = double(z); MATRIX m; UnitMatrix(m); RotateY(m,ANGLE_TO_RAD(Ya)); RotateX(m,ANGLE_TO_RAD(Xa)); RotateZ(m,ANGLE_TO_RAD(Za)); RotateVector(v,m); CLIP16(v[0]); CLIP16(v[1]); CLIP16(v[2]); X = int16(v[0]); Y = int16(v[1]); Z = int16(v[2]); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////void DSP1_Attitude( int16 m, int8 Za, int8 Xa, int8 Ya, AttitudeMatrix Matrix ){ SHOW_FUNC_START(); MATRIX &mat = DSP1.GetMatrix(Matrix); UnitMatrix( mat, double(m) / 32768.0 ); RotateZ( mat, ANGLE_TO_RAD(Za) ); RotateX( mat, ANGLE_TO_RAD(Xa) ); RotateY( mat, ANGLE_TO_RAD(Ya) ); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////DSP1_Objective::DSP1_Objective( int16 x, int16 y, int16 z, AttitudeMatrix Matrix ){ SHOW_FUNC_START(); MATRIX &mat = DSP1.GetMatrix(Matrix); VECTOR v; v[0] = double(x); v[1] = double(y); v[2] = double(z); TransposeRotateVector(v,mat); CLIP16(v[0]); CLIP16(v[1]); CLIP16(v[2]); F = int16(v[0]); L = int16(v[1]); U = int16(v[2]); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////DSP1_Subjective::DSP1_Subjective( int16 F, int16 L, int16 U, AttitudeMatrix Matrix ){ SHOW_FUNC_START(); MATRIX &mat = DSP1.GetMatrix(Matrix); VECTOR v; v[0] = double(F); v[1] = double(L); v[2] = double(U); RotateVector(v,mat); CLIP16(v[0]); CLIP16(v[1]); CLIP16(v[2]); X = int16(v[0]); Y = int16(v[1]); Z = int16(v[2]); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////int16 DSP1_Scalar( int16 x, int16 y, int16 z, AttitudeMatrix Matrix ){ SHOW_FUNC_START(); MATRIX &mat = DSP1.GetMatrix(Matrix); double s = mat[0][0] * double(x) + mat[0][1] * double(y) + mat[0][2] * double(z); CLIP16(s); SHOW_FUNC_END(); return int16(s);}////////////////////////////////////////////////////////////////////DSP1_Gyrate::DSP1_Gyrate( int8 Zi, int8 Xi, int8 Yi, int8 dU, int8 dF, int8 dL ){ SHOW_FUNC_START(); double zi = ANGLE_TO_RAD(Zi); double xi = ANGLE_TO_RAD(Xi); double yi = ANGLE_TO_RAD(Yi); double du = ANGLE_TO_RAD(dU); double df = ANGLE_TO_RAD(dF); double dl = ANGLE_TO_RAD(dL); double sxi = 1 / cos(xi); // sec(xi) ???? double cyi = cos(yi); double syi = sin(yi); double txi = tan(xi); double z0 = zi + sxi * (du * cyi - df * syi); double x0 = xi + (du * syi + df * cyi); double y0 = yi - txi * (du * cyi + df * syi) + dl; Z0 = int8(z0); X0 = int8(x0); Y0 = int8(y0); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////int16 DSP1_Multiply( int16 k, int16 I ){ SHOW_FUNC_START(); int32 v = (int32(k) * int32(I)) >> 15; if(v < -32768) v = -32768; else if(v > 32767) v = 32767; SHOW_FUNC_END(); return int16(v);}////////////////////////////////////////////////////////////////////DSP1_Inverse::DSP1_Inverse( int16 a, int16 b ){ SHOW_FUNC_START(); double m =double(ldexp(double(a) / 32768.0, b)); m = 1.0 / m; int c; m = double(frexp(m,&c)); if(m == 1.0) { c++; m = 0.5; } m *= 32768.0; CLIP16(m); A = int16(m); B = int16(c); SHOW_FUNC_END();}////////////////////////////////////////////////////////////////////int CosTable[256]={ 65536, 65516, 65457, 65358, 65220, 65043, 64826, 64571, 64276, 63943, 63571, 63161, 62713, 62227, 61704, 61144, 60546, 59912, 59243, 58537, 57796, 57020, 56210, 55367, 54489, 53579, 52637, 51663, 50658, 49622, 48556, 47461, 46338, 45187, 44008, 42803, 41572, 40316, 39036, 37732, 36406, 35057, 33688, 32298, 30889, 29461, 28015, 26553, 25074, 23581, 22073, 20552, 19018, 17473, 15918, 14353, 12779, 11198, 9610, 8016, 6417, 4814, 3209, 1601, -6, -1615, -3222, -4828, -6430, -8029, -9623, -11211, -12792, -14366, -15931, -17486, -19031, -20565, -22086, -23593, -25087, -26565, -28028, -29473, -30901, -32310, -33700, -35069, -36417, -37743, -39047, -40327, -41583, -42813, -44018, -45197, -46348, -47471, -48565, -49631, -50666, -51671, -52645, -53587, -54497, -55374, -56217, -57027, -57802, -58543, -59248, -59918, -60551, -61148, -61709, -62232, -62717, -63165, -63575, -63946, -64279, -64573, -64828, -65044, -65221, -65359, -65457, -65516, -65535, -65515, -65456, -65357, -65219, -65041, -64824, -64568, -64273, -63940, -63568, -63158, -62709, -62223, -61699, -61139, -60541, -59907, -59237, -58531, -57790, -57014, -56203, -55359, -54482, -53571, -52629, -51654, -50649, -49613, -48547, -47452, -46328, -45177, -43998, -42793, -41562, -40306, -39025, -37721, -36395, -35046, -33676, -32286, -30877, -29449, -28003, -26540, -25062, -23568, -22060, -20539, -19005, -17460, -15905, -14340, -12766, -11184, -9596, -8002, -6403, -4801, -3195, -1588, 20, 1628, 3236, 4841, 6444, 8043, 9636, 11224, 12806, 14379, 15944, 17500, 19044, 20578, 22099, 23606, 25099, 26578, 28040, 29485, 30913, 32322, 33711, 35080, 36428, 37754, 39058, 40338, 41593, 42824, 44028, 45206, 46357, 47480, 48575, 49640, 50675, 51680, 52653, 53595, 54504, 55381, 56224, 57034, 57809, 58549, 59254, 59923, 60557, 61153, 61713, 62236, 62721, 63168, 63578, 63949, 64281, 64575, 64830, 65046, 65223, 65360, 65458, 65516, };int SinTable[256]={ 0, 1608, 3215, 4821, 6424, 8022, 9616, 11204, 12786, 14359, 15924, 17480, 19025, 20558, 22079, 23587, 25081, 26559, 28021, 29467, 30895, 32304, 33694, 35063, 36411, 37738, 39041, 40322, 41577, 42808, 44013, 45192, 46343, 47466, 48561, 49626, 50662, 51667, 52641, 53583, 54493, 55370, 56214, 57024, 57799, 58540, 59245, 59915, 60549, 61146, 61706, 62229, 62715, 63163, 63573, 63944, 64277, 64572, 64827, 65043, 65221, 65358, 65457, 65516, 65535, 65516, 65456, 65357, 65219, 65042, 64825, 64569, 64275, 63941, 63570, 63159, 62711, 62225, 61702, 61141, 60544, 59910, 59240, 58534, 57793, 57017, 56207, 55363, 54486, 53575, 52633, 51659, 50653, 49617, 48552, 47457, 46333, 45182, 44003, 42798, 41567, 40311, 39031, 37727, 36400, 35052, 33682, 32292, 30883, 29455, 28009, 26547, 25068, 23574, 22067, 20545, 19012, 17467, 15911, 14346, 12772, 11191, 9603, 8009, 6410, 4807, 3202, 1594, -13, -1622, -3229, -4834, -6437, -8036, -9630, -11218, -12799, -14373, -15938, -17493, -19038, -20571, -22092, -23600, -25093, -26571, -28034, -29479, -30907, -32316, -33705, -35075, -36423, -37749, -39052, -40332, -41588, -42818, -44023, -45201, -46352, -47476, -48570, -49635, -50671, -51675, -52649, -53591, -54501, -55377, -56221, -57030, -57806, -58546, -59251, -59921, -60554, -61151, -61711, -62234, -62719, -63167, -63576, -63947, -64280, -64574, -64829, -65045, -65222, -65359, -65458, -65516, -65535, -65515, -65456, -65356, -65218, -65040, -64823, -64567, -64272, -63938, -63566, -63156, -62707, -62221, -61697, -61136, -60538, -59904, -59234, -58528, -57786, -57010, -56200, -55356, -54478, -53567, -52625, -51650, -50645, -49609, -48543, -47447, -46324, -45172, -43993, -42788, -41556, -40300, -39020, -37716, -36389, -35040, -33670, -32280, -30871, -29443, -27997, -26534, -25056, -23562, -22054, -20532, -18999, -17454, -15898, -14333, -12759, -11178, -9589, -7995, -6397, -4794, -3188, -1581, };int16 DSPOp00 (int16 K, int16 I){ return ((int32) K * I / 32768);}double ScreenLX1 = 0;double ScreenLY1 = 0;double ScreenLZ1 = 0;double RasterRX = 0;double RasterLX = 0;double RasterRY = 0;double RasterLY = 0;double RasterRZ = 0;double RasterLZ = 0;double Distance = 0;double RasterLSlopeX = 0;double RasterLSlopeY = 0;double RasterLSlopeZ = 0;double RasterRSlopeX = 0;double RasterRSlopeY = 0;double RasterRSlopeZ = 0;double GroundLX = 0;double GroundLY = 0;double GroundRX = 0;double GroundRY = 0;int32 ViewerAX = 0;int32 ViewerAY = 0;int32 ViewerAZ = 0;double ViewerX0 = 0;double ViewerX1 = 0;double ViewerY1 = 0;double ViewerZ1 = 0;double ViewerX = 0;double ViewerY = 0;double ViewerZ = 0;double ScreenX = 0;double ScreenY = 0;double ScreenZ = 0;double NumberOfSlope = 0;void DSPOp02 (){ double azs = Op02AZS * 6.2832 / 65536.0; double aas = Op02AAS * 6.2832 / 65536.0; ViewerZ1 = -cos (azs); ViewerX1 = sin (azs) * sin (aas); ViewerY1 = sin (azs) * cos (-aas); ViewerX = Op02FX - ViewerX1 * Op02LFE; ViewerY = Op02FY - ViewerY1 * Op02LFE; ViewerZ = Op02FZ - ViewerZ1 * Op02LFE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -