Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
6.2 KiB

#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;
}