⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp1.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    // 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 + -