#define STRICT #define D3D_OVERLOADS #include "StdAfx.h" //#include "Settings.h" //#include "Resource.h" //#include "Material.h" IDirectDrawSurface7* CreateTextureFromFile(char* filename); //****************************************************************************************** #ifndef SAFE_RELEASE #define SAFE_RELEASE(p) if(p){(p)->Release();(p)=NULL;}else{}; #endif //****************************************************************************************** BOOL g_bNeedZBuffer = TRUE; DWORD g_dwWidth,g_dwHeight; const char* g_szKeyname = "Software\\Microsoft\\D3DClock"; BOOL g_bHardwareTL; DWORD g_dwVBMemType; IDirect3D7* g_pD3D=NULL; DWORD g_dwLastTickCount; CSeaLife g_SeaLife; DWORD g_dwBaseTime=0; //Settings g_Settings; const float pi2 = 3.1415926536f*2.0f; //****************************************************************************************** //****************************************************************************************** int WINAPI WinMain(HINSTANCE instance , HINSTANCE prev_instance , LPSTR cmd_line , int show) { return DXSvrMain(instance , prev_instance , cmd_line , show); } //****************************************************************************************** LRESULT WINAPI ScreenSaverProc(HWND wnd , UINT msg , WPARAM wParam , LPARAM lParam) { return DefDXScreenSaverProc(wnd , msg , wParam , lParam); } //****************************************************************************************** BOOL ScreenSaverInit() { // Get settings //g_Settings.ReadFromReg(); // Grab pixel width and height of the window we're in g_pXContext->GetBufferSize(&g_dwWidth , &g_dwHeight); TRACE("Buffer size is (%d,%d)\n" , g_dwWidth , g_dwHeight); // Set up the projection matrix to something sensible D3DXMATRIX projection; D3DXMatrixPerspectiveFovLH(&projection , 1.3f , float(g_dwHeight)/float(g_dwWidth) , 0.1f , 100.0f); g_pDevice->SetTransform(D3DTRANSFORMSTATE_PROJECTION , projection); // Set up the initial camera to something sensible D3DXMATRIX camera; D3DXMatrixLookAtLH(&camera , &D3DXVECTOR3(0,0,-2.3f) , &D3DXVECTOR3(0,0,0) , &D3DXVECTOR3(0,1,0)); g_pDevice->SetTransform(D3DTRANSFORMSTATE_VIEW , camera); // Set a matt white default material D3DMATERIAL7 mat; mat.ambient = mat.diffuse = D3DXCOLOR(1,1,1,0); mat.specular = mat.emissive = D3DXCOLOR(0,0,0,0); mat.power = 0; g_pDevice->SetMaterial(&mat); // Figure out if the device is HW or SW T&L D3DDEVICEDESC7 devdesc = {sizeof(devdesc)}; g_pDevice->GetCaps(&devdesc); if (devdesc.dwDevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { TRACE("Is hardware T&L\n"); g_bHardwareTL = TRUE; g_dwVBMemType = 0; } else { TRACE("Is software T&L\n"); g_bHardwareTL = FALSE; g_dwVBMemType = D3DVBCAPS_SYSTEMMEMORY; } // Grab the D3D object (we'll need it) g_pD3D = g_pXContext->GetD3D(); // Set up some global renderstates g_pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE , TRUE); g_pDevice->SetTextureStageState(0 , D3DTSS_MAGFILTER , D3DTFG_LINEAR); g_pDevice->SetTextureStageState(0 , D3DTSS_MINFILTER , D3DTFN_LINEAR); g_pDevice->SetTextureStageState(0 , D3DTSS_MIPFILTER , D3DTFP_LINEAR); g_pDevice->SetTextureStageState(1 , D3DTSS_MAGFILTER , D3DTFG_LINEAR); g_pDevice->SetTextureStageState(1 , D3DTSS_MINFILTER , D3DTFN_LINEAR); g_pDevice->SetTextureStageState(1 , D3DTSS_MIPFILTER , D3DTFP_LINEAR); g_pDevice->SetRenderState(D3DRENDERSTATE_TEXTUREPERSPECTIVE , TRUE); // Set up lighting g_pDevice->SetRenderState(D3DRENDERSTATE_LIGHTING , TRUE); g_pDevice->SetRenderState(D3DRENDERSTATE_AMBIENT , 0xff222222); g_pDevice->SetRenderState(D3DRENDERSTATE_AMBIENTMATERIALSOURCE , D3DMCS_MATERIAL); g_pDevice->SetRenderState(D3DRENDERSTATE_DIFFUSEMATERIALSOURCE , D3DMCS_MATERIAL); g_pDevice->SetRenderState(D3DRENDERSTATE_SPECULARMATERIALSOURCE , D3DMCS_MATERIAL); g_pDevice->SetRenderState(D3DRENDERSTATE_EMISSIVEMATERIALSOURCE , D3DMCS_MATERIAL); D3DLIGHT7 light; light.dltType = D3DLIGHT_POINT; light.dcvDiffuse = D3DXCOLOR(1,1,1,1); light.dcvSpecular = D3DXCOLOR(1,1,1,0); light.dcvAmbient = D3DXCOLOR(0,0,0,1); light.dvPosition = D3DXVECTOR3(0,0,-2); light.dvDirection = D3DXVECTOR3(0,0,1); light.dvRange = D3DLIGHT_RANGE_MAX; light.dvFalloff = 0; light.dvAttenuation0 = 0; light.dvAttenuation1 = 0; light.dvAttenuation2 = 0.3f; light.dvTheta = light.dvPhi = 0; g_pDevice->SetLight(0 , &light); g_pDevice->LightEnable(0 , TRUE); // Set texture transform (we always use the same one, if we do use one) D3DXMATRIX texmatrix; D3DXMatrixIdentity(&texmatrix); texmatrix.m00 = texmatrix.m11 = 0.5f; texmatrix.m30 = texmatrix.m31 = 0.5f; g_pDevice->SetTransform(D3DTRANSFORMSTATE_TEXTURE0 , texmatrix); g_pDevice->SetTransform(D3DTRANSFORMSTATE_TEXTURE1 , texmatrix); g_dwLastTickCount = GetTickCount(); g_dwBaseTime=timeGetTime(); g_SeaLife.InitDeviceObjects(g_pDevice,NULL); g_SeaLife.OneTimeSceneInit(); return TRUE; } //****************************************************************************************** void ScreenSaverShutdown() { g_SeaLife.DeleteDeviceObjects(); g_SeaLife.FinalCleanup(); SAFE_RELEASE(g_pD3D); //g_Settings.ReleaseMaterialSettings(); } //****************************************************************************************** void ScreenSaverDrawFrame() { DWORD tick = GetTickCount(); DWORD elapsed = tick - g_dwLastTickCount; g_dwLastTickCount = tick; float felapsed = float(elapsed); static float theta,phi,xang,yang; FLOAT fTime = (timeGetTime() - g_dwBaseTime) * 0.001f; g_SeaLife.FrameMove(fTime); g_pXContext->RestoreSurfaces(); //g_pXContext->Clear(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER); //g_pDevice->BeginScene(); //TODO DRAW g_SeaLife.Render(g_pDevice); //g_pDevice->EndScene(); Flip(); } BOOL ScreenSaverDoConfig() { return TRUE; }