/* Begin of 'WinMain' function */ INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, CHAR *CmdLine, INT ShowCmd ) { MATR m = {{ {2, 0, 0, 0}, {1, 2, 0, 0}, {1, 1, 2, 0}, {1, 1, 1, 2} }}; DBL g; m = MatrIdentity(); m = MatrTranslate(VecSet(1, 2, 3)); m = MatrScale(VecSet(1, 2, 3)); m = MatrRotateX(30); m = MatrRotateY(30); m = MatrRotateZ(30); m = MatrRotate(30, VecSet(1, 2, 3)); m = MatrMulMatr(MatrRotateX(90), MatrScale(VecSet(2, 2, 2))); m = MatrInverse(m); g = MatrDeterm(m); m = MatrTranspose(m); return 0; }/* Begin of 'WinMain' function */
static VOID DrawUnitInPosition( ok2GEOM *Geo, ok2ANIM *Ani, FLT Scale, FLT Rad, FLT Angle ) { FLT unscale = 1.0 / Scale; Ani->MatrWorld = MatrMulMatr(MatrRotate(Angle, 0.0, 1.0, 0.0), Ani->MatrWorld); Ani->MatrWorld = MatrMulMatr(MatrTranslate(Rad, 0.0, 0.0), Ani->MatrWorld); Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrScale(Scale, Scale, Scale)); OK2_GeomDraw(Geo); Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrScale(unscale, unscale, unscale)); Ani->MatrWorld = MatrMulMatr(MatrTranslate(-Rad, 0.0, 0.0), Ani->MatrWorld); //Ani->MatrWorld = MatrMulMatr(MatrRotate(-Angle, 0.0, 1.0, 0.0), Ani->MatrWorld); }
static VOID MP2_UnitResponse( mp2CONTROL *Uni, mp2ANIM *Ani ) { DBL r; VEC Dir = VecNormalize(VecSubVec(View, Uni->Pos)), Right = VecNormalize(VecCrossVec(Dir, VecSet(0, 1, 0))); if (Ani->Keys['T']) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (Ani->Keys['Y']) glPolygonMode(GL_FRONT, GL_LINE); if (Ani->Keys['U']) glPolygonMode(GL_BACK, GL_LINE); /*if (Ani->Keys[VK_SPACE]) MP2_AnimAddUnit(MP2_UnitCreateBall()); */ if (Ani->KeysClick['C']) MP2_AnimAddUnit(MP2_UnitCreateCube(/*Rnd1() * 4, Rnd1() * 4, Rnd1() * 4*/0, 0, 0)); if (Ani->KeysClick['V']) MP2_AnimAddUnit(MP2_UnitCreateSTATICMODEL(/*Rnd1() * 4, Rnd1() * 4, Rnd1() * 4*/0, 0, 0)); if (Ani->KeysClick[VK_RETURN] && Ani->Keys[VK_MENU]) MP2_FlipFullScreen(MP2_Anim.hWnd); /*if (Ani->KeysClick[VK_ESCAPE]) MP2_AnimDoExit();*/ if (Ani->KeysClick['P']) Ani->IsPause = !Ani->IsPause; /* Uni->Pos.Y += Ani->JY * Ani->GlobalDeltaTime; */ Uni->Pos = PointTransform(Uni->Pos, MatrRotate((50 * Ani->JY * Ani->GlobalDeltaTime), Right)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->JX * Ani->GlobalDeltaTime)); if (Ani->Keys[VK_LBUTTON]) { Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->Mdx * Ani->GlobalDeltaTime)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateX(10 * Ani->Mdy * Ani->GlobalDeltaTime)); } View.X += Ani->JZ / 10; View.Z += Ani->JR / 10; Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(10 * Ani->Keys[VK_RIGHT] * Ani->GlobalDeltaTime)); Uni->Pos = PointTransform(Uni->Pos, MatrRotateY(-10 * Ani->Keys[VK_LEFT] * Ani->GlobalDeltaTime)); r = VecLen(Uni->Pos); Uni->Pos = VecMulNum(Uni->Pos, (r + (-Ani->Mdz) * Ani->DeltaTime * 1.0) / r); MP2_RndMatrView = MatrView(VecAddVec(Uni->Pos, View), View, VecSet(0, 1, 0)); }
/* ‘ункци¤ построени¤ объекта анимации. * ј–√”ћ≈Ќ“џ: * - указатель на "себ¤" - сам объект анимации: * ok2UNIT_CUBE *Unit; * - указатель на контекст анимации: * ok2ANIM *Ani; * ¬ќ«¬–јўј≈ћќ≈ «Ќј„≈Ќ»≈: Ќет. */ static VOID CubeUnitRender( ok2UNIT_CUBE *Unit, ok2ANIM *Ani ) { /* INT i, s = 5, N = 0; VEC p = {1, 0, 0}; static FLT Delta = 0.1; MATR WVP; Delta += Ani->JZ * Ani->GlobalDeltaTime; //Ani->MatrWorld = MatrRotateY(30); //Ani->MatrView = MatrLookAt(VecSet(15, 15, 15), VecSet(0, 0, 0), VecSet(0, 1, 0)); Ani->MatrView = MatrLookAt(PointTransform(VecSet(20, 20, Ani->JX * Delta + 20), MatrRotateX(80 * Ani->JY)), VecSet(0, 0, 0), VecSet(0, 1, 0)); Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrRotateX(Ani->DeltaTime * 80)); for (i = 0; i < 12; i++) { Ani->MatrWorld = MatrMulMatr(MatrTranslate(0.0, 5.0, 0.0), Ani->MatrWorld); Ani->MatrWorld = MatrMulMatr(MatrRotate(30, 1.0, 0.0, 1.0), Ani->MatrWorld); WVP = MatrMulMatr(Ani->MatrWorld, MatrMulMatr(Ani->MatrView, Ani->MatrProjection)); glLoadMatrixf(WVP.A[0]); OK2_RndGObjDraw(&Unit->Cow, Ani->hDC); } //OK2_RndGObjDraw(&Unit->Cow, Ani->hDC); */ INT i; MATR WVP; static DBL time; /* оси и позици¤ наблюдател¤ */ Ani->MatrWorld = MatrIdenity(); Ani->MatrView = MatrLookAt( PointTransform(PointTransform(VecSet(25, 25, 25), MatrRotateY(Ani->JR * 180)), MatrRotateZ(Ani->JY * 180)), VecSet(0, 0, 0), VecSet(0, 1, 0)); WVP = MatrMulMatr(OK2_Anim.MatrWorld, MatrMulMatr(OK2_Anim.MatrView, OK2_Anim.MatrProjection)); glLoadMatrixf(WVP.A[0]); glLineWidth(3); glBegin(GL_LINES); glColor3d(1, 0.5, 0.5); glVertex3d(-3, 0, 0); glVertex4d(1, 0, 0, 0); glColor3d(0.5, 1, 0.5); glVertex3d(0, -3, 0); glVertex4d(0, 1, 0, 0); glColor3d(0.5, 0.5, 1); glVertex3d(0, 0, -3); glVertex4d(0, 0, 1, 0); glEnd(); glColorMask(1, 1, 1, 0); for (i = -3; i < 30; i++) { glBegin(GL_TRIANGLE_STRIP); glVertex3d(-0.1, -0.1, i); glVertex3d(-0.1, 0.1, i); glVertex3d( 0.1, -0.1, i); glVertex3d( 0.1, 0.1, i); glEnd(); } /* –исуем примитивы */ time += Ani->GlobalDeltaTime; if (time > 1) { time = 0; OK2_ShadProgClose(OK2_ShaderProg); OK2_ShaderProg = OK2_ShadProgInit("a.vert", "a.frag"); } glLineWidth(1); if (Ani->Keys['Q']) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //Ani->MatrWorld = MatrTranslate(0, 0, 0.30 * sin(Ani->Time)); Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrRotateY(30.0 * Ani->Time)); /* for (i = 0; i < 12; i++) { Ani->MatrWorld = MatrMulMatr(MatrRotate(30.0, 0.0, 1.0, 0.0), Ani->MatrWorld); Ani->MatrWorld = MatrMulMatr(MatrTranslate(1.0, 0.0, 0.0), Ani->MatrWorld); OK2_GeomDraw(&Unit->Geom); } */ /* for (i = 0; i < 6; i++) DrawUnitInPosition(&Unit->Geom[i], Ani, Unit->Scale`[i], 10.0, 30.0); */ Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrScale(0.001, 0.001, 0.001)); for (i = 0; i < 12; i++) { Ani->MatrWorld = MatrMulMatr(MatrRotate(30.0, 0.0, 1.0, 0.0), Ani->MatrWorld); Ani->MatrWorld = MatrMulMatr(MatrTranslate(20000.0, 0.0, 0.0), Ani->MatrWorld); //Ani->MatrWorld = MatrMulMatr(MatrRotate(30.0, 0.0, 1.0, 0.0), Ani->MatrWorld); OK2_GeomDraw(&Unit->Geom[3]); Ani->MatrWorld = MatrMulMatr(MatrTranslate(-20000.0, 0.0, 0.0), Ani->MatrWorld); } //Ani->MatrWorld = MatrMulMatr(Ani->MatrWorld, MatrScale(50, 50, 50)); } /* End of 'OK2_AnimUnitRender' function */
/* Функция построения объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * as3UNIT_MODEL *Uni; * - указатель на контекст анимации: * as3ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID AS3_AnimUnitRender(as3UNIT_MODEL *Uni, as3ANIM *Ani) { static INT i = 0, j = 0, k = 0; if (Ani->JR > 0) k += 105; if (Ani->JR < -0.0002) k -= 105; if (Ani->JZ > 0) i += 105; if (Ani->JZ < -0.0002) i -= 105; if (Ani->JY > 0) j += 1000; AS3_RndMatrView = MatrView(VecSet(600 + k, 600 + k, 600 + k), VecSet(i, 0, i), VecSet(0, 1, 0)); if (Ani->KeysClick['W']) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (Ani->KeysClick['Q']) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (Ani->KeysClick['S']) j = 1; glEnable(GL_DEPTH_TEST); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(0.00001141552511 * 365 * j * Ani->Time, 0, 1, 0), //Земля MatrScale(100, 100, 100)), MatrTranslate(0, -50, 1200)), MatrRotateY(0.00001141552511 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId); AS3_GeomDraw(&Uni->Geom[0]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(0, 0, 1, 0), //Солнце MatrScale(800, 800, 800)), MatrTranslate(0, 0, 0)), MatrRotateY(0)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId1); AS3_GeomDraw(&Uni->Geom[1]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(0.6 * 0.0004 * j * Ani->Time, 0, 1, 0), //Меркурий MatrScale(30, 30, 30)), MatrTranslate(0, 0, 800)), MatrRotateY(0.0004 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId2); AS3_GeomDraw(&Uni->Geom[2]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(-1.1 * 0.0001 * j * Ani->Time, 0, 1, 0), //Венера MatrScale(100, 100, 100)), MatrTranslate(0, 0, 1000)), MatrRotateY(0.0001 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId3); AS3_GeomDraw(&Uni->Geom[3]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(669 * 0.000006 * j * Ani->Time, 0, 1, 0), //Марс MatrScale(90, 90, 90)), MatrTranslate(0, 0, 1500)), MatrRotateY(0.000006 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId4); AS3_GeomDraw(&Uni->Geom[4]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(10683 * 0.0000009 * j * Ani->Time, 0, 1, 0), //Юпитер MatrScale(500, 500, 500)), MatrTranslate(0, 0, 1800)), MatrRotateY(0.0000009 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId5); AS3_GeomDraw(&Uni->Geom[5]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(21170 * 0.0000004 * j * Ani->Time, 0, 1, 0), //Сатурн MatrScale(400, 400, 400)), MatrTranslate(0, 0, 2500)), MatrRotateY(0.0000004 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId6); AS3_GeomDraw(&Uni->Geom[6]); /* AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(100 * Ani->Time, 0, 1, 0), //0.004050925925925926 MatrScale(10, 8, 10)), MatrTranslate(0, 0, 2500)), MatrRotateX(-90)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId61); AS3_GeomDraw(&Uni->Geom[7]); */ AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(43800 * 0.0000001 * j * Ani->Time, 0, 1, 0), //Уран MatrScale(350, 350, 350)), MatrTranslate(0, 0, 3000)), MatrRotateY(0.0000001 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId7); AS3_GeomDraw(&Uni->Geom[8]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(86036 * 0.00000007 * j * Ani->Time, 0, 1, 0), //Нептун MatrScale(350, 350, 350)), MatrTranslate(0, 0, 3500)), MatrRotateY(0.00000007 * j * Ani->Time)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId8); AS3_GeomDraw(&Uni->Geom[9]); AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrRotate(0, 0, 1, 0), // nebo MatrScale(20000, 20000, 20000)), MatrTranslate(0, 0, 0)), MatrRotateY(0)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId9); AS3_GeomDraw(&Uni->Geom[10]); } /* End of 'AS3_AnimUnitRender' function */