/* Animation system initialization function. * ARGUMENTS: * - window: * HWND hWnd; * RETURNS: None. */ VOID DS1_AnimInit( HWND hWnd ) { INT i; PIXELFORMATDESCRIPTOR pfd = {0}; LARGE_INTEGER t; memset(&DS1_Anim, 0, sizeof(ds1ANIM)); /* Store window and create memory device context */ DS1_Anim.hWnd = hWnd; DS1_Anim.hDC = GetDC(hWnd); DS1_Anim.NumOfUnits = 0; /* OpenGL init: pixel format setup */ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; pfd.cColorBits = 32; pfd.cDepthBits = 32; i = ChoosePixelFormat(DS1_Anim.hDC, &pfd); DescribePixelFormat(DS1_Anim.hDC, i, sizeof(pfd), &pfd); SetPixelFormat(DS1_Anim.hDC, i, &pfd); /* OpenGL init: setup rendering context */ DS1_Anim.hGLRC = wglCreateContext(DS1_Anim.hDC); wglMakeCurrent(DS1_Anim.hDC, DS1_Anim.hGLRC); /* OpenGL init: setup extensions: GLEW library */ if (glewInit() != GLEW_OK || !(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)) { wglMakeCurrent(NULL, NULL); wglDeleteContext(DS1_Anim.hGLRC); ReleaseDC(DS1_Anim.hWnd, DS1_Anim.hDC); exit(0); } /* Timer initialization */ QueryPerformanceFrequency(&t); DS1_TimePerSec = t.QuadPart; QueryPerformanceCounter(&t); DS1_StartTime = DS1_OldTime = DS1_OldTimeFPS = t.QuadPart; DS1_PauseTime = 0; DS1_RndMatrWorld = MatrixIdentity(); DS1_RndMatrProj = MatrFrustum(-1, 1, -1, 1, 1, 100); DS1_RndMatrView = MatrView(VecSet(0, 0, 3), VecSet(0, 0, 0), VecSet(0, 1, 0)); /* OpenGL specific initialization */ glClearColor((FLT)100 / 255, (FLT)200 / 255, (FLT)150 / 255, 1); /* RGB(100, 200, 150) glClearColor(0.3, 0.5, 0.7, 1); */ DS1_Anim.ShNo = 1; glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DS1_RndPrg = DS1_RndShaderLoad( (DS1_Anim.ShNo == 1) ? DS1_SHADER_NAME_1 : DS1_SHADER_NAME_2); /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */ } /* End of 'DS1_ANIMInit' function */
/* Функция построения объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * as3UNIT_MODEL *Uni; * - указатель на контекст анимации: * as3ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID AS3_AnimUnitRender( as3UNIT_MODEL *Uni, as3ANIM *Ani ) { INT i, j; AS3_RndMatrView = MatrView(VecSet(8, 8, 8), VecSet(0, 0, 0), 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); glEnable(GL_DEPTH_TEST); for (i = -2; i < 2; i++) for (j = -2; j < 2; j++) { AS3_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrTranslate(Ani->JX * 228, Ani->JY * 228, 0), MatrScale(0.1, 0.1, 0.1)), MatrRotateY(30 * Ani->Time + Ani->JR * 180)), MatrTranslate(j * 2.5, 0, i * 2.5 + 228 * Ani->JZ)); glColor3d(i & 1, j & 1, 1 - ((i & 1) + (j & 1)) / 2); AS3_RndGObjDraw(&Uni->Model); } } /* End of 'AS3_AnimUnitRender' function */
/* Функция построения объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * AO5UNIT_MODEL *Uni; * - указатель на контекст анимации: * AO5ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID AO5_AnimUnitRender( ao5UNIT_MODEL *Uni, ao5ANIM *Ani ) { INT i, j; static BOOL ok = TRUE; AO5_RndMatrView = MatrView(VecSet(0, 5, 10), VecSet(0, 0, 0), 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); glEnable(GL_DEPTH_TEST); if (ok) AO5_RndMatrWorld = MatrMulMatr(MatrRotateY(30 * Ani->Time + 180), MatrTranslate(0, -1.5, 0)); else AO5_RndMatrWorld = MatrMulMatr(MatrRotateX(90), MatrRotateZ(90)); if(Ani->KeysClick['Z']) ok = !ok; for (i = 0; i < 1; i++) for (j = 0; j < 1; j++) { glColor3d(i & 1, j & 1, 1 - ((i & 1) + (j & 1)) / 2); AO5_GeomDraw(&Uni->Model); } //MatrMulMatr(MatrRotateZ(30 * sin(Ani->Time * 3.0)), MatrRotateY(30 * Ani->Time)); //AO5_GeomDraw(&Uni->Geom); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Uni->TextId); //AO5_PrimDraw(&Uni->Pr); } /* End of 'AO5_AnimUnitRender' function */
/* Unit clock inter frame events handle function. * ARGUMENTS: * - self-pointer to unit object: * vg4UNIT_CLOCK *Uni; * - animation context: * vg4ANIM *Ani; * RETURNS: None. */ static VOID VG4_UnitResponse( vg4UNIT_CLOCK *Uni, vg4ANIM *Ani ) { DBL r; if (Ani->Keys[VK_SPACE]) VG4_AnimAddUnit(VG4_UnitCreateBall()); if (Ani->Keys['C']) VG4_AnimAddUnit(VG4_UnitCreateCube()); if (Ani->KeysClick[VK_RETURN] && Ani->Keys[VK_MENU]) VG4_AnimFlipFullScreen(); if (Ani->KeysClick[VK_ESCAPE]) VG4_AnimDoExit(); if (Ani->KeysClick['P']) Ani->IsPause = !Ani->IsPause; /* Uni->Pos.Y += Ani->JY * Ani->GlobalDeltaTime; */ Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateX(59 * Ani->JY * Ani->GlobalDeltaTime)); Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateY(59 * Ani->JX * Ani->GlobalDeltaTime)); if (Ani->Keys[VK_LBUTTON]) { Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateY(59 * Ani->Mdx * Ani->GlobalDeltaTime)); Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateX(59 * Ani->Mdy * Ani->GlobalDeltaTime)); } Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateY(59 * Ani->Keys[VK_RIGHT] * Ani->GlobalDeltaTime)); Uni->Pos = VecMulMatr43(Uni->Pos, MatrRotateY(-59 * Ani->Keys[VK_LEFT] * Ani->GlobalDeltaTime)); r = VecLen(Uni->Pos); Uni->Pos = VecMulNum(Uni->Pos, (r + Ani->Mdz * Ani->DeltaTime * 0.1) / r); VG4_RndMatrView = MatrView(Uni->Pos, VecSet(0, 0, 0), VecSet(0, 1, 0)); } /* End of 'VG4_UnitResponse' function */
VOID IK3_AnimUnit( HWND hWnd ) { INT i; LARGE_INTEGER t; PIXELFORMATDESCRIPTOR pfd = {0}; memset(&IK3_Anim, 0, sizeof(ik3Anim)); /* Store window and create memory device context */ IK3_Anim.hWnd = hWnd; IK3_Anim.hDC = GetDC(hWnd); /* OpenGL init: pixel format setup */ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; pfd.cColorBits = 32; pfd.cDepthBits = 32; i = ChoosePixelFormat(IK3_Anim.hDC, &pfd); DescribePixelFormat(IK3_Anim.hDC, i, sizeof(pfd), &pfd); SetPixelFormat(IK3_Anim.hDC, i, &pfd); /* OpenGL init: setup rendering context */ IK3_Anim.hGLRC = wglCreateContext(IK3_Anim.hDC); wglMakeCurrent(IK3_Anim.hDC, IK3_Anim.hGLRC); /* OpenGL init: setup extensions: GLEW library */ if (glewInit() != GLEW_OK || !(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)) { wglMakeCurrent(NULL, NULL); wglDeleteContext(IK3_Anim.hGLRC); ReleaseDC(IK3_Anim.hWnd, IK3_Anim.hDC); exit(0); } QueryPerformanceFrequency(&t); IK3_TimePerSec = t.QuadPart; QueryPerformanceCounter(&t); IK3_StartTime = IK3_OldTime = IK3_OldTimeFPS = t.QuadPart; IK3_PauseTime = 0; IK3_RndMatrWorld = MatrIdentity(); IK3_RndMatrView = MatrView(VecSet(0, 1, 0), VecSet(0, 0, 0), VecSet(0, 1, 0)); IK3_RndMatrProj = MatrFrustum(-1, 1, -1, 1, 1, 100); IK3_RndProjDist = 3; IK3_RndFarClip = 3000; IK3_RndProjSize = 3; /* OpenGL specific initialization */ glClearColor(0.3, 0.5, 0.7, 1); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); IK3_RndPrg = IK3_RndShaderLoad("a"); /* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */ }
/* Функция построения объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * ak1UNIT_BALL *Uni; * - указатель на контекст анимации: * ak1ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID AK1_AnimCowRender( ak1UNIT_COW *Uni, ak1ANIM *Ani ) { int i, l = -1; DBL X1 = Ani->PosX; AK1_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrRotateX(Ani->AngleX), MatrRotateY(Ani->AngleY)), MatrScale(10, 10, 10)); AK1_RndMatrView = MatrView(VecSet(8, 8, 8), VecSet(0, 0, 0), VecSet(0, 1, 0)); SetDCPenColor(Ani->hDC, RGB(255, 255, 255)); // AK1_RndGObjDraw(&Uni->Model); for (i = 0; i < 3; i++) { Ani->PosX = X1 + (i + l) * 600; AK1_RndGObjDraw(&Uni->Model); } Ani->PosX = X1; } /* End of 'ak1_AnimUnitRender' function */
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)); }
/* Функция построения объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * vg4UNIT_MODEL *Uni; * - указатель на контекст анимации: * vg4ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID VG4_AnimUnitRender( vg4UNIT_MODEL *Uni, vg4ANIM *Ani ) { INT i; VG4_RndMatrView = MatrView(VecSet(8, 8, 8), VecSet(0, 0, 0), VecSet(0, 1, 0)); for (i = 0; i < 8; i++) { VG4_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrMulMatr( MatrTranslate(Ani->JX * 59, Ani->JY * 88, 0), MatrScale(0.1, 0.1, 0.1)), MatrRotateY(30 * Ani->Time + Ani->JR * 180)), MatrTranslate((i - 2) * 2, 0, 100 * Ani->JZ)); VG4_RndGObjDraw(&Uni->Model); } } /* End of 'VG4_AnimUnitRender' function */
/* Функция обновления межкадровых параметров объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * ao5UNIT_CTRL *Uni; * - указатель на контекст анимации: * ao5ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID AO5_AnimUnitResponse( ao5UNIT_CTRL *Uni, ao5ANIM *Ani ) { VEC Move, Dir, At; if (Ani->Keys[VK_ESCAPE]) AO5_AnimDoExit(); if (Ani->KeysClick['F']) AO5_AnimFlipFullScreen(); if (Ani->KeysClick['P']) AO5_AnimSetPause(!Ani->IsPause); /* позиционирование корабля */ //Uni->Omega = -3000 * Ani->JX * Ani->DeltaTime; //Uni->Head += -3 * 30 * Ani->JR * Ani->DeltaTime; Dir = VectorTransform(VecSet(0, 0, 1), MatrRotateY(Uni->Head)); //Uni->V += -3 * Ani->JY * Ani->DeltaTime; //Uni->V *= max(1 - Ani->GlobalDeltaTime, 0); if(Ani->Keys['D']) Uni->Head -= 1; if(Ani->Keys['A']) Uni->Head += 1; if(Ani->Keys['W']) Uni->V = -5; else if(Ani->Keys['S']) Uni->V = 5; else Uni->V = 0; Uni->Pos = VecAddVec(Uni->Pos, VecMulNum(Dir, Uni->V * Ani->DeltaTime)); Uni->Pos = VecAddVec(Uni->Pos, VecMulNum(VectorTransform(Dir, MatrRotateY(-90)), Uni->V)); //Uni->Pos.Y += 30 * (Ani->JButs[1] - Ani->JButs[2]) * Ani->DeltaTime; Uni->At = VecSubVec(Uni->Pos, VecMulNum(Dir, 100)); Uni->At.Y += 10; Move = VecSubVec(Uni->At, Uni->CPos); Uni->CPos = VecAddVec(Uni->CPos, VecMulNum(Move, Ani->DeltaTime)); AO5_RndMatrView = MatrView(Uni->CPos, Uni->Pos, VecSet(0, 1, 0)); AO5_RndMatrWorld = MatrMulMatr(MatrMulMatr(MatrRotateY(Uni->Head), MatrTranslate(Uni->Pos.X, Uni->Pos.Y, Uni->Pos.Z)), MatrScale(0.1, 0.1, 0.1)); } /* End of 'AO5_AnimUnitResponse' function */
/* Функция обновления межкадровых параметров объекта анимации. * АРГУМЕНТЫ: * - указатель на "себя" - сам объект анимации: * vg4UNIT_CTRL *Uni; * - указатель на контекст анимации: * vg4ANIM *Ani; * ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. */ static VOID VG4_AnimUnitResponse( vg4UNIT_CTRL *Uni, vg4ANIM *Ani ) { VEC Dir, Move; static FLT y = -0.067452297, z = 2.6340842; static DBL time = 5; time += VG4_Anim.GlobalDeltaTime; if (time > 5) { time = 0; VG4_ShaderFree(Uni->Axes.ProgId); VG4_ShaderFree(Uni->Helic.ProgId); Uni->Helic.ProgId = VG4_ShaderLoad("HELIC"); Uni->Axes.ProgId = VG4_ShaderLoad("AXIS"); Uni->Sph.ProgId = Uni->Axes.ProgId; } /* позиционирование вертолета */ Uni->Omega = -3000 * Ani->JR * Ani->DeltaTime; Uni->Head += -3 * 30 * Ani->JR * Ani->DeltaTime; Dir = VecMulMatr3(VecSet(0, 0, 1), MatrRotateY(Uni->Head)); Uni->V += -30 * Ani->JY * Ani->DeltaTime; Uni->V *= max(1 - Ani->GlobalDeltaTime, 0); Uni->Pos = VecAddVec(Uni->Pos, VecMulNum(Dir, Uni->V * Ani->DeltaTime)); Uni->Pos = VecAddVec(Uni->Pos, VecMulNum(VecMulMatr3(Dir, MatrRotateY(-90)), 30 * Ani->JX * Ani->DeltaTime)); Uni->Pos.Y += 30 * (Ani->JButs[1] - Ani->JButs[2]) * Ani->DeltaTime; /* точка "интереса" */ Uni->At = VecSubVec(Uni->Pos, VecMulNum(Dir, 9)); Uni->At.Y += 5.30; Move = VecSubVec(Uni->At, Uni->CPos); Uni->CPos = VecAddVec(Uni->CPos, VecMulNum(Move, Ani->DeltaTime)); VG4_RndMatrView = MatrView(Uni->CPos, Uni->Pos, 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->Keys[VK_ESCAPE]) VG4_AnimDoExit(); if (Ani->KeysClick['F']) VG4_AnimFlipFullScreen(); if (Ani->KeysClick['P']) VG4_AnimSetPause(!Ani->IsPause); /* анимация вертолета */ Uni->Helic.Prims[2].M = MatrRotateY(999 * Ani->Time); Uni->Helic.Prims[4].M = MatrMulMatr(MatrMulMatr(MatrTranslate(0, y, z), MatrRotateX(888 * Ani->Time)), MatrTranslate(0, -y, -z)); y += Ani->Keys[VK_ADD] * Ani->GlobalDeltaTime * 0.1 - Ani->Keys[VK_SUBTRACT] * Ani->GlobalDeltaTime * 0.1; z += Ani->Keys['A'] * Ani->GlobalDeltaTime * 0.1 - Ani->Keys['Z'] * Ani->GlobalDeltaTime * 0.1; } /* End of 'VG4_AnimUnitResponse' 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 */