mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|