//================================================// // Render_Frame() // //================================================// void render_frame(void) { if(m_pKeyboard) { m_pKeyboard->Acquire(); } ProcessMouse(); ProcessKeyboard(); QueryPerformanceCounter (&LI_CurrentCount); D_CurrentCount = LI_CurrentCount.QuadPart; D_RealTime = D_CurrentCount; D_TimePassed = D_RealTime - D_PreviousRealTime; D_RealTimePassed = D_TimePassed/D_CountFrequency; D_PreviousRealTime = D_RealTime; FPS = 1/D_RealTimePassed; ViewportInfo.Width = SCREEN_WIDTH; ViewportInfo.Height = SCREEN_HEIGHT; ViewportInfo.X = 0; ViewportInfo.Y = 0; d3ddev->SetViewport(&ViewportInfo); d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 212, 208, 200), 1.0f, 0); d3ddev->BeginScene(); //=================\\ // Keyboard Camera \\ //=================\\ static int QStarted = 0; static int AStarted = 0; static int WStarted = 0; static int SStarted = 0; static int EStarted = 0; static int DStarted = 0; static int RStarted = 0; static int FStarted = 0; if (CamFOV == 60) { if (WDown) { if (WStarted == 0) { if (CamPitch > -.03) CamPitch -= 0.0001f*60/FPS; // WStarted = 1; } } else WStarted = 0; if (SDown) { if (SStarted == 0) { if (CamPitch < .03) CamPitch += 0.0001*60/FPS; // SStarted = 1; } } else SStarted = 0; if (ADown) { if (AStarted == 0) { if (CamYaw < .03) CamYaw += 0.0001f*60/FPS; // AStarted = 1; } } else AStarted = 0; if (DDown) { if (DStarted == 0) { if (CamYaw > -.03) CamYaw -= 0.0001f*60/FPS; // DStarted = 1; } } else DStarted = 0; if (QDown) { if (QStarted == 0) { if (CamRoll > -.03) CamRoll -= 0.0001f*60/FPS; // QStarted = 1; } } else QStarted = 0; if (EDown) { if (EStarted == 0) { if (CamRoll <.03) CamRoll += 0.0001f*60/FPS; // EStarted = 1; } } else EStarted = 0; if (RDown) { if (RStarted == 0) { CamRoll *= 0.97f; CamPitch *=0.97f; CamYaw *=0.97f; if (CamYaw < 0.0001f & CamYaw > -0.0001f) CamYaw = 0; if (CamPitch < 0.0001f & CamPitch > -0.0001f) CamPitch = 0; if (CamRoll < 0.0001f & CamRoll > -0.0001f) CamRoll = 0; // RStarted = 1; } } else RStarted = 0; if (FDown) { if (FStarted == 0) { //FStarted = 1; } } else FStarted = 0; if (VDown) { } if (CDown) { if (!TexChanged) { } TexChanged = 1; } else { TexChanged = 0; } if (Five_Down) { CameraTranslation.x *= 0.97f; CameraTranslation.y *= 0.97f; CameraTranslation.z *= 0.97f; if (CameraTranslation.x < 0.00001f & CameraTranslation.x > -.00001) CameraTranslation.x = 0; if (CameraTranslation.y < 0.00001f & CameraTranslation.y > -.00001) CameraTranslation.y = 0; if (CameraTranslation.z < 0.00001f & CameraTranslation.z > -.00001) CameraTranslation.z = 0; } if (Eight_Down) { CameraTranslation -= CameraFront * (Eight_Thrust*60/FPS); if (Eight_Thrust < MaxThrust*60/FPS) Eight_Thrust += ThrustStep*60/FPS; } else { if (Eight_Thrust > 0) Eight_Thrust -= ThrustStep*60/FPS; if (Eight_Thrust - ThrustStep*60/FPS < 0) Eight_Thrust = 0; } if (Two_Down) { CameraTranslation += CameraFront * (Two_Thrust*60/FPS); if (Two_Thrust < MaxThrust*60/FPS) Two_Thrust += ThrustStep*60/FPS; } else { if (Two_Thrust > 0) Two_Thrust -= ThrustStep*60/FPS; if (Two_Thrust - ThrustStep*60/FPS < 0) Two_Thrust = 0; } if (Nine_Down) { CameraTranslation += CameraUp * Nine_Thrust*60/FPS; if (Nine_Thrust < MaxThrust*60/FPS) Nine_Thrust += ThrustStep*60/FPS; } else { if (Nine_Thrust > 0) Nine_Thrust -= ThrustStep*60/FPS; if (Nine_Thrust - ThrustStep*60/FPS < 0) Nine_Thrust = 0; } if (Three_Down) { CameraTranslation -= CameraUp * Three_Thrust*60/FPS; if (Three_Thrust < MaxThrust*60/FPS) Three_Thrust += ThrustStep*60/FPS; } else { if (Three_Thrust > 0) Three_Thrust -= ThrustStep*60/FPS; if (Three_Thrust - ThrustStep*60/FPS < 0) Three_Thrust = 0; } if (Four_Down) { CameraTranslation += CameraRight * Four_Thrust*60/FPS; if (Four_Thrust < MaxThrust*60/FPS) Four_Thrust += ThrustStep*60/FPS; } else { if (Four_Thrust > 0) Four_Thrust -= ThrustStep*60/FPS; if (Four_Thrust - ThrustStep*60/FPS < 0) Four_Thrust = 0; } if (Six_Down) { CameraTranslation -= CameraRight * Six_Thrust*60/FPS; if (Six_Thrust < MaxThrust*60/FPS) Six_Thrust += ThrustStep*60/FPS; } else { if (Six_Thrust > 0) Six_Thrust -= ThrustStep*60/FPS; if (Six_Thrust - ThrustStep*60/FPS < 0) Six_Thrust = 0; } } CameraPosition += CameraTranslation; CamSpeed = D3DXVec3Length(&CameraTranslation); if (CamSpeed > 0.5f) { D3DXVec3Normalize(&CameraTranslation, &CameraTranslation); CameraTranslation *= 0.5f; } D3DXQuaternionRotationMatrix(&matViewQuatIn,&matView); //Step 1 D3DXQuaternionRotationYawPitchRoll(&matViewQuat,CamYaw,CamPitch,CamRoll); //Step 2 D3DXMatrixRotationQuaternion(&matViewChange,&matViewQuat); D3DXQuaternionMultiply(&matViewQuatOut,&matViewQuatIn,&matViewQuat); //Step 3 D3DXQuaternionNormalize(&matViewQuatOut, &matViewQuatOut); //Step 4 D3DXMatrixRotationQuaternion(&matViewOut,&matViewQuatOut); //Step 5 D3DXMatrixTranslation(&matView, //Step 6 CameraPosition.x, CameraPosition.y, CameraPosition.z); matView = matView * matViewOut; //Step 7 d3ddev->SetTransform(D3DTS_VIEW, &(matView)); //Step 8 matView2 = matView; CameraFront = D3DXVECTOR3 (0.0f,0.0f,1.0f); CameraRight = D3DXVECTOR3 (1.0f,0.0f,0.0f); CameraUp = D3DXVECTOR3 (0.0f,-1.0f,0.0f); TempDeterminant = D3DXMatrixDeterminant(&matViewOut); D3DXMatrixInverse(&TempCameraMat, &TempDeterminant, &matViewOut); D3DXVec3Transform(&TempCameraVec, &CameraFront, &TempCameraMat); CameraFront = D3DXVECTOR3 (TempCameraVec.x,TempCameraVec.y,TempCameraVec.z); D3DXVec3Transform(&TempCameraVec, &CameraRight, &TempCameraMat); CameraRight = D3DXVECTOR3 (TempCameraVec.x,TempCameraVec.y,TempCameraVec.z); D3DXVec3Transform(&TempCameraVec, &CameraUp, &TempCameraMat); CameraUp = D3DXVECTOR3 (TempCameraVec.x,TempCameraVec.y,TempCameraVec.z); D3DXMATRIX matProjection; // the projection transform matrix D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(CamFOV), // the horizontal field of view (SCREEN_HEIGHT/.75)/SCREEN_HEIGHT, // the aspect ratio 0.001f, // the near view-plane 3000.0f); // the far view-plane d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection matProj2 = matProjection; D3DXMatrixScaling(&matScale, 10, 10, 10); D3DXMatrixTranslation(&matTranslate, -CameraPosition.x, -CameraPosition.y, -CameraPosition.z); D3DXMatrixRotationX(&matRotateX, GalaxyXAxis); // the rotation matrix D3DXMatrixRotationY(&matRotateY, GalaxyYAxis); // the rotation matrix D3DXMatrixRotationZ(&matRotateZ, 0); // the rotation matrix d3ddev->SetTransform(D3DTS_WORLD, &(matScale*matRotateX*matRotateY*matRotateZ*matTranslate)); // set the world transform; matWorld2 = matScale*matRotateX*matRotateY*matRotateZ*matTranslate; d3ddev->SetMaterial(&material[0]); // set the material for the subset d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); // turn off the 3D lighting for the background Blend = 255; GalaxyBlend=D3DCOLOR_ARGB(Blend,Blend,Blend,Blend); d3ddev->SetRenderState(D3DRS_BLENDFACTOR, GalaxyBlend); d3ddev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_BLENDFACTOR); d3ddev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVBLENDFACTOR); ViewportInfo.Width = 1019; ViewportInfo.Height = 768; ViewportInfo.X = 256; ViewportInfo.Y = 5; d3ddev->SetViewport(&ViewportInfo); d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0), 1.0f, 0); CamFOV = 60; d3ddev->GetTransform(D3DTS_WORLD, &matWorld2); d3ddev->GetTransform(D3DTS_VIEW, &matView2); d3ddev->GetTransform(D3DTS_PROJECTION, &matProj2); /* D3DXMATRIXA16 matWorldViewProj = matWorld2 * matView2 * matProj2; constantTable->SetMatrix(d3ddev, "WorldViewProj", &matWorldViewProj); constantTable->SetFloat(d3ddev,"ColorIn1", ShaderColor.w); constantTable->SetFloat(d3ddev,"ColorIn2", ShaderColor.x); constantTable->SetFloat(d3ddev,"ColorIn3", ShaderColor.y); constantTable->SetFloat(d3ddev,"AlphaIn1", ShaderColor.z); d3ddev->SetVertexDeclaration(vertexDecl); d3ddev->SetVertexShader(vertexShader); d3ddev->SetPixelShader(pixelShader); */ d3ddev->SetTexture(0, texture[1]); Galaxy->DrawSubset(0); //draw Galaxy d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0), 1.0f, 0); DustRendered = 0; DustFaces = 0; static float TempDistance; for (int i=0;iPos())); DustCloud[i]->Update(d3ddev, TempDistance, DustCloudSize, 1, 0); if(i > NumStars && i < NumPlanets+NumStars) DustCloud[i]->Orbit(DustCloud[DustCloud[i]->OrbitTrgt]->Pos(), FPS); if (i < NumStars) { if(TempDistance > 10) DustCloud[i]->Scl(TempDistance/10000); else if (TempDistance >3) DustCloud[i]->Scl((TempDistance-3)/(7)*(.001-StarScale)+StarScale); else DustCloud[i]->Scl(StarScale); d3ddev->SetTexture(0, DustCloud[i]->Tex()); } else if (i < NumPlanets+NumStars) { if(TempDistance > 5) DustCloud[i]->Scl((TempDistance-5)/(15)*(PlanetScale-0.0005f)+0.0005); else if (TempDistance >1) DustCloud[i]->Scl((TempDistance-1)/(4)*(0.0005f-PlanetScale)+PlanetScale); else DustCloud[i]->Scl(PlanetScale); d3ddev->SetTexture(0, DustCloud[i]->Tex()); } else { DustCloud[i]->Scl(TempDistance/15000); d3ddev->SetTexture(0, NULL); } if(TempDistance<20) // Render Planets only if you are within 20 units of them DustCloud[i]->RenderSphere(d3ddev, 0); else if (i < NumStars || i > NumPlanets+NumStars) // Render Stars and Ship Markers with ulimited range DustCloud[i]->Render(d3ddev, 0); } //==========\\ // Left Frame \\ //==============\\ RECT font_rect; ViewportInfo.Width = 246; ViewportInfo.Height = 768; ViewportInfo.X = 5; ViewportInfo.Y = 5; d3ddev->SetViewport(&ViewportInfo); d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0), 1.0f, 0); SetRect(&font_rect,10,5,50,100); sprintf_s(StringBuffer,"%.0f Text Screen Pos X", DustScreenPos.x); screen_text = StringBuffer; g_font->DrawText(NULL, //pSprite screen_text.c_str(), //pString -1, //Count &font_rect, //pRect DT_LEFT|DT_NOCLIP,//Format, 0xFFFFFFFF); //Color SetRect(&font_rect,10,25,50,100); sprintf_s(StringBuffer,"%.0f Text Screen Pos Y", DustScreenPos.y); screen_text = StringBuffer; g_font->DrawText(NULL, //pSprite screen_text.c_str(), //pString -1, //Count &font_rect, //pRect DT_LEFT|DT_NOCLIP,//Format, 0xFFFFFFFF); //Color SetRect(&font_rect,10,165,50,100); sprintf_s(StringBuffer,"%.4f Camera Position X", CameraPosition.x); screen_text = StringBuffer; g_font->DrawText(NULL, //pSprite screen_text.c_str(), //pString -1, //Count &font_rect, //pRect DT_LEFT|DT_NOCLIP,//Format, 0xFFFFFFFF); //Color SetRect(&font_rect,10,185,50,100); sprintf_s(StringBuffer,"%.4f Camera Position Y", CameraPosition.y); screen_text = StringBuffer; g_font->DrawText(NULL, //pSprite screen_text.c_str(), //pString -1, //Count &font_rect, //pRect DT_LEFT|DT_NOCLIP,//Format, 0xFFFFFFFF); //Color SetRect(&font_rect,10,205,50,100); sprintf_s(StringBuffer,"%.4f Camera Position Z", CameraPosition.z); screen_text = StringBuffer; g_font->DrawText(NULL, //pSprite screen_text.c_str(), //pString -1, //Count &font_rect, //pRect DT_LEFT|DT_NOCLIP,//Format, 0xFFFFFFFF); //Color //============\\ // Bottom Frame \\ //================\\ ViewportInfo.Width = 1270; ViewportInfo.Height = 246; ViewportInfo.X = 5; ViewportInfo.Y = 776; d3ddev->SetViewport(&ViewportInfo); d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0), 1.0f, 0); SpritePos.x=10.0f + ViewportInfo.X; SpritePos.y=10.0f + ViewportInfo.Y; SpritePos.z=0.0f; sprite->Begin(D3DXSPRITE_ALPHABLEND); for (int i = 0;i<100;i++) { if (i < 70) { D3DXMatrixTransformation2D( &SpriteScale, &(D3DXVECTOR2(18.0f,797.0f)), 0.0, &(D3DXVECTOR2(1.0f,1.2f)), &(D3DXVECTOR2(18.0f,786.0f)), 0.0f, &(D3DXVECTOR2(0.0f,0.0f))); sprite->SetTransform(&SpriteScale); sprite->Draw(texture[14],NULL,NULL,&SpritePos,D3DCOLOR_XRGB(255, 210, 0)); } else if (i < 80) { D3DXMatrixTransformation2D( &SpriteScale, &(D3DXVECTOR2(18.0f,797.0f)), 0.0, &(D3DXVECTOR2(1.0f,1.0f)), &(D3DXVECTOR2(18.0f,786.0f)), 0.0f, &(D3DXVECTOR2(0.0f,0.0f))); sprite->SetTransform(&SpriteScale); sprite->Draw(texture[14],NULL,NULL,&SpritePos,D3DCOLOR_XRGB(0, 110, 190)); } else { D3DXMatrixTransformation2D( &SpriteScale, &(D3DXVECTOR2(18.0f,797.0f)), 0.0, &(D3DXVECTOR2(1.0f,1.0f)), &(D3DXVECTOR2(18.0f,786.0f)), 0.0f, &(D3DXVECTOR2(0.0f,0.0f))); sprite->SetTransform(&SpriteScale); sprite->Draw(texture[15],NULL,NULL,&SpritePos,D3DCOLOR_XRGB(0, 190, 94)); } SpritePos.x += 9; } sprite->End(); d3ddev->EndScene(); d3ddev->Present(NULL, NULL, NULL, NULL); return; }