📄 mirror.cpp
字号:
#if !defined (parm)
#define parm
#include<windows.h>
#include<d3dx9.h>
#endif
#include<mmsystem.h>
#include"MyFont.h"
#include"stdio.h"
//================
LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9 g_pDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pMirror=NULL;
LPDIRECT3DTEXTURE9 g_pMirrortex=NULL;
LPDIRECT3DTEXTURE9 g_pWalltex=NULL;
LPD3DXMESH g_pTeapotmesh=NULL;
LPD3DXMESH g_pSpheremesh=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pMyTexture=NULL;
LPDIRECT3DTEXTURE9 g_pMytex=NULL;
struct MIRROR
{
float x,y,z;
float nx,ny,nz;
float tu,tv;
#define D3DFVF_MIRROR (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
};
CMyFont *g_pFont=NULL;
CMyFont *g_pHelp=NULL;
DWORD g_StartTime=0;
DWORD g_Frames=0;
//================
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=============
HRESULT InitD3D(HWND hwnd)
{
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp,sizeof(d3dpp) );
d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDevice) ) )
return E_FAIL;
g_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
g_pDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
g_pDevice->SetRenderState(D3DRS_ZENABLE,true);
// 初始化字体
g_pFont=new CMyFont(g_pDevice,"宋体",15,true,true,false);
g_pHelp=new CMyFont(g_pDevice,"隶书",15,true,true,false);
return S_OK;
}
//================================
HRESULT DrawMirror()
{
MIRROR vertices[]=
{
// The First rectangle
{-1.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,0.0f},
{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 1.0f,0.0f},
{-1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 1.0f,1.0f},
{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,1.0f},
//the second rectangle
{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,0.0f},
{1.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 1.0f,0.0f},
{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 1.0f,1.0f},
{1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,1.0f}
};
g_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
g_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
g_pDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
void *pVertices;
if(FAILED(g_pDevice->CreateVertexBuffer(sizeof(vertices),0,
D3DFVF_MIRROR,D3DPOOL_DEFAULT,
&g_pMirror,NULL) ) )
return E_FAIL;
g_pMirror->Lock(0,sizeof(vertices),(void * *)&pVertices,0);
memcpy(pVertices,vertices,sizeof(vertices) );
g_pMirror->Unlock();
// Set Transform
D3DXMATRIX matWorld;
D3DXMatrixScaling(&matWorld,1.0f,1.0f,1.0f);
g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);
// Set Material
D3DMATERIAL9 mtr;
ZeroMemory(&mtr,sizeof(mtr) );
mtr.Diffuse.r=mtr.Ambient.r=1.0f;
mtr.Diffuse.g=mtr.Ambient.g=1.0f;
mtr.Diffuse.b=mtr.Ambient.b=1.0f;
mtr.Diffuse.a=mtr.Ambient.a=0.5f;//set alpha to 50%
g_pDevice->SetMaterial(&mtr);
// Draw Objects
g_pDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
g_pDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
g_pDevice->SetFVF(D3DFVF_MIRROR);
g_pDevice->SetStreamSource(0,g_pMirror,0,sizeof(MIRROR) );
//Draw mirror plane
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"mirror.jpg",&g_pMirrortex)) )
{
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//mirror.jpg",&g_pMirrortex)) )
{
return E_FAIL;
}
}
g_pDevice->SetTexture(0,g_pMirrortex);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
g_pDevice->SetTexture(0,NULL);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
//Draw the wall plane
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"wall.jpg",&g_pWalltex)) )
{
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//wall.jpg",&g_pWalltex)) )
{
return E_FAIL;
}
}
g_pDevice->SetTexture(0,g_pWalltex);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,2);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
g_pDevice->SetTexture(0,NULL);
g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
return S_OK;
}
//===============================
HRESULT DrawTeapot()
{
// Create Teapot From D3DX function
D3DXCreateTeapot(g_pDevice,&g_pTeapotmesh,0);
//Set transform
D3DXMATRIX matWorld;
D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,2.0f);
g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);
// Set Material
D3DMATERIAL9 mtr;
ZeroMemory(&mtr,sizeof(mtr) );
mtr.Diffuse.r=mtr.Ambient.r=0.2f;
mtr.Diffuse.g=mtr.Ambient.g=0.2f;
mtr.Diffuse.b=mtr.Ambient.b=1.0f;
mtr.Diffuse.a=mtr.Ambient.a=0.5f;
g_pDevice->SetMaterial(&mtr);
// Draw Teapot
g_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
if(::GetAsyncKeyState('O'))
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);
if(::GetAsyncKeyState('I'))
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
if(::GetAsyncKeyState('A'))
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_DESTALPHA);
if(::GetAsyncKeyState('C'))
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
if(::GetAsyncKeyState('D'))
g_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_DESTCOLOR);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
g_pTeapotmesh->DrawSubset(0);
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
return S_OK;
}
//================================
HRESULT DrawSphere()
{
D3DXCreateSphere(g_pDevice,1,30,30,&g_pSpheremesh,0);
D3DXMATRIX matWorld;
D3DXMatrixTranslation(&matWorld,-1.0f,0.0f,-2.0f);
g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);
// Set Material
D3DMATERIAL9 mtr;
ZeroMemory(&mtr,sizeof(mtr) );
mtr.Diffuse.r=mtr.Ambient.r=1.0f;
mtr.Diffuse.g=mtr.Ambient.g=0.0f;
mtr.Diffuse.b=mtr.Ambient.b=1.0f;
mtr.Diffuse.a=mtr.Ambient.a=0.5f;
mtr.Specular.r=mtr.Specular.g=mtr.Specular.b=0.5f;
mtr.Power=50;
g_pDevice->SetMaterial(&mtr);
g_pSpheremesh->DrawSubset(0);
return S_OK;
}
//\\\\\\\=========================
void DrawMyText( )
{
char buffer[255];
DWORD g_Duration=(timeGetTime()-g_StartTime)/1000;
if(g_Duration>0)
{
DWORD g_FramesFPS=g_Frames/g_Duration;
sprintf(buffer,"Duration:%d Seconds,Frames:%d ,FPS:%d",g_Duration,
g_Frames,g_FramesFPS);
}
else
{
sprintf(buffer,"Calculating...");
}
g_pFont->DrawText(buffer,0,0,0xffff00ff);
}
//===================================
void DrawHelp()
{
char help[255];
sprintf(help,"Press Key 'O','I','D','C',OR 'A',for different results");
g_pHelp->DrawText(help,10,50,0xff00ff00);
}
//
///\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\==
HRESULT DrawMyTexture()
{
MIRROR vertices[]=
{ // The First rectangle
{-1.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,0.0f},
{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 3.0f,0.0f},
{-1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 3.0f,3.0f},
{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,3.0f},
//the second rectangle
{0.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,0.0f},
{1.0f,0.5f,0.0f,0.0f,0.0f,1.0f, 3.0f,0.0f},
{0.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 3.0f,3.0f},
{1.0f,-0.5f,0.0f,0.0f,0.0f,1.0f, 0.0f,3.0f}
};
void *pVertices;
g_pDevice->CreateVertexBuffer(sizeof(vertices),0,D3DFVF_MIRROR,D3DPOOL_DEFAULT,
&g_pMyTexture,NULL);
g_pMyTexture->Lock(0,sizeof(vertices),(void **)&pVertices,0);
memcpy(pVertices,vertices,sizeof(vertices) );
g_pMyTexture->Unlock();
// Set Transform
D3DXMATRIX matWorld;
D3DXMatrixScaling(&matWorld,1.0f,1.0f,1.0f);
g_pDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pDevice->SetTransform(D3DTS_PROJECTION,&matProj);
// Set Material
D3DMATERIAL9 mtr;
ZeroMemory(&mtr,sizeof(mtr) );
mtr.Diffuse.r=mtr.Ambient.r=1.0f;
mtr.Diffuse.g=mtr.Ambient.g=1.0f;
mtr.Diffuse.b=mtr.Ambient.b=1.0f;
mtr.Diffuse.a=mtr.Ambient.a=0.5f;//set alpha to 50%
g_pDevice->SetMaterial(&mtr);
g_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
g_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
g_pDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
g_pDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
g_pDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
// g_pDevice->SetSamplerState(0,D3DSAMP_BORDERCOLOR,0Xff00ff00);
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"wall.jpg",&g_pMytex)) )
{
if(FAILED(D3DXCreateTextureFromFile(g_pDevice,"..//wall.jpg",&g_pMytex)) )
{
return E_FAIL;
}
}
g_pDevice->SetTexture(0,g_pMytex);
g_pDevice->SetStreamSource(0,g_pMyTexture,0,sizeof(MIRROR) ) ;
g_pDevice->SetFVF(D3DFVF_MIRROR);
g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,2);
g_pDevice->SetTexture(0,NULL);
return S_OK;
}
//=================================
void Cleanup()
{
if(g_pMytex)
{
g_pMytex->Release();
g_pMytex=NULL;
}
if(g_pMyTexture!=NULL)
{
g_pMyTexture->Release();
g_pMyTexture=NULL;
}
if(g_pHelp!=NULL)
{
delete g_pHelp;
g_pHelp=NULL;
}
if(g_pFont!=NULL)
{
delete g_pFont;
g_pFont=NULL;
}
if(g_pSpheremesh!=NULL)
{
g_pSpheremesh->Release();
g_pSpheremesh=NULL;
}
if(g_pTeapotmesh!=NULL)
{
g_pTeapotmesh->Release();
g_pTeapotmesh=NULL;
}
if(g_pMirrortex!=NULL)
{
g_pMirrortex->Release();
g_pMirrortex=NULL;
}
if(g_pWalltex!=NULL)
{
g_pWalltex->Release();
g_pWalltex=NULL;
}
if(g_pMirror!=NULL)
{
g_pMirror->Release();
g_pMirror=NULL;
}
if(g_pDevice!=NULL)
{
g_pDevice->Release();
g_pDevice=NULL;
}
if(g_pD3D!=NULL)
{
g_pD3D->Release();
g_pD3D=NULL;
}
}
//================================
void SetLight()
{
D3DLIGHT9 light;
ZeroMemory( &light,sizeof(light) );
light.Type= D3DLIGHT_DIRECTIONAL;
light.Diffuse.r=0.0f;
light.Diffuse.g=0.0f;
light.Diffuse.b=1.0f;
light.Ambient.r=light.Ambient.g=light.Ambient.b=0.5f;
light.Diffuse.a=light.Ambient.a=1.0f;
light.Specular.r=light.Specular.g=light.Specular.b=1.0f;
D3DXVECTOR3 vecDir;
// vecDir = D3DXVECTOR3(0.0f,0.0f,-1.0f);
float rotate=float((timeGetTime()/50)%360);
vecDir = D3DXVECTOR3(float(sin(rotate)),0.0f,float(cos(rotate)));
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
light.Range = 1000.0f;
g_pDevice->SetRenderState(D3DRS_SPECULARENABLE,TRUE);
g_pDevice->LightEnable(0,true);
g_pDevice->SetLight(0,&light);
}
//================================
void SetCamera()
{
D3DXMATRIX matView;
int x=(timeGetTime()/20)%360;
float eye_x=float(10.0f*sin(x*D3DX_PI/180));
float eye_z=float(10.0f*cos(x*D3DX_PI/180));
D3DXVECTOR3 eye(eye_x,0.0f,
eye_z);
D3DXVECTOR3 lookat(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&matView,&eye,&lookat,&up);
g_pDevice->SetTransform(D3DTS_VIEW,&matView);
}
//================================
void Render()
{
g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xff000000,1.0f,0);
if(SUCCEEDED(g_pDevice->BeginScene() ) )
{
//===========================
SetLight();
SetCamera();
g_pDevice->SetRenderState(D3DRS_LASTPIXEL,false);
// DrawMyTexture();
DrawSphere();
DrawTeapot();
// DrawMirror();
DrawMyText();
DrawHelp();
//===============================
g_pDevice->EndScene();
}
g_Frames++;
g_pDevice->Present(NULL,NULL,NULL,NULL);
}
//========================================
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM w,LPARAM l)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_CREATE:
return 0;
}
return (DefWindowProc(hwnd,msg,w,l));
}
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hprev,LPSTR lpcm,int mshow)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_CLASSDC;
wc.lpfnWndProc=WinProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=NULL;
wc.lpszMenuName=NULL;
wc.lpszClassName="MY MIRROR";
wc.hIconSm=NULL;
RegisterClassEx(&wc);
HWND hwnd=CreateWindowEx(WS_EX_TOPMOST,"MY MIRROR","MY PROGRAM",WS_OVERLAPPEDWINDOW,
0,0,500,500,NULL,NULL,wc.hInstance,NULL);
if(hwnd==0)
return 0;
if(SUCCEEDED(InitD3D(hwnd) ) )
{
ShowWindow(hwnd,mshow);
UpdateWindow(hwnd);
MSG msg;
ZeroMemory(&msg,sizeof(msg) );
g_StartTime=timeGetTime();// obtain starting time
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
UnregisterClass("MY MIRROR",wc.hInstance);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -