DirectX9完全面向对象框架
#pragma once
#define UNICODE
//Direct3D lib
#include<d3d9.h>
#include<d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib") //Default lib
#include<wchar.h>
#include<tchar.h>
#include<assert.h>
#pragma comment(lib, "winmm.lib") namespace Clear
{
template<typename T>
void SafeRelease(T t)
{
if (t)
{
t->Release();
t = nullptr;
}
}
template<typename T>
void SafeDelete(T t)
{
if (t)
{
delete t;
t = nullptr;
}
}
}
class DXApp
{
public: DXApp(HINSTANCE hInstance = nullptr);
virtual ~DXApp(); bool InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen); bool InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen);
bool InitDirect3D_9(); virtual LRESULT MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
virtual int Run();
void RenderShell();
virtual void Render() = ;
virtual void Update() = ;
virtual void OnLostDevice() = ;
virtual void OnResetDevice() = ; protected: HINSTANCE m_AppInstance;
HWND m_hWindowedHWND;
WCHAR m_strAppTitle[];
UINT m_windowWidth;
UINT m_windowHeight; bool m_bFullScreen;
bool m_bLostDevice; //Direct3D_9 properties
IDirect3D9* m_pD3D;
D3DPRESENT_PARAMETERS m_PresentParamenters;
IDirect3DDevice9* m_pD3Ddevice; };
DXApp.cpp
#include "DXApp.h" //Store DXApp global pointer
namespace Global
{
DXApp* g_pDxapp = nullptr;
}
LRESULT CALLBACK MainProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
if (Global::g_pDxapp)
{
return Global::g_pDxapp->MsgProc(hWnd, Message, wParam, lParam);
}
else
{
return DefWindowProc(hWnd, Message, wParam, lParam);
}
} DXApp::DXApp(HINSTANCE hInstance)
{
m_AppInstance = hInstance;
m_hWindowedHWND = nullptr;
Global::g_pDxapp = this; } DXApp::~DXApp()
{
Clear::SafeRelease(m_pD3D);
Clear::SafeRelease(m_pD3Ddevice);
} bool DXApp::InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
if(!InitWindow(title, width, height, fullscreen))
return false;
if (!InitDirect3D_9())
return false; return true;
} bool DXApp::InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
// Initialize window's properties
wsprintfW(m_strAppTitle, title);
m_windowWidth = width;
m_windowHeight = height;
m_bFullScreen = fullscreen;
m_bLostDevice = false; const WCHAR* CLASSNAME = L"DEMOCLASS";
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(wcex));
wcex.style = CS_VREDRAW | CS_HREDRAW;
wcex.cbClsExtra = ;
wcex.cbSize = sizeof(wcex);
wcex.cbWndExtra = ;
wcex.hbrBackground = nullptr;
wcex.hCursor = LoadCursor(m_AppInstance, IDC_ARROW);
wcex.hIcon = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hIconSm = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hInstance = m_AppInstance;
wcex.lpfnWndProc = MainProc;
wcex.lpszClassName = CLASSNAME;
wcex.lpszMenuName = nullptr;
if (!RegisterClassEx(&wcex))
{
OutputDebugString(L"DXApp::InitWindow: RegisterClassEx()failed!");
return false;
} // adjust window size
RECT adjR;
SetRect(&adjR, , , m_windowWidth, m_windowHeight);
AdjustWindowRect(&adjR, WS_OVERLAPPEDWINDOW, false);
UINT w = adjR.right - adjR.left;
UINT h = adjR.bottom - adjR.top;
UINT x = GetSystemMetrics(SM_CXSCREEN) / - w / ;
UINT y = GetSystemMetrics(SM_CYSCREEN) / - h / ;
m_hWindowedHWND = CreateWindow(CLASSNAME, m_strAppTitle, WS_OVERLAPPEDWINDOW, x, y, w, h, nullptr, nullptr, m_AppInstance, nullptr);
if (!m_hWindowedHWND)
{
OutputDebugString(L"DXApp::InitWindow: CreateWindow()failed!");
return false;
} ShowWindow(m_hWindowedHWND, SW_SHOWDEFAULT); return true;
} bool DXApp::InitDirect3D_9()
{
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); D3DCAPS9 d3dcaps;
int vertex_proc = ;
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps);
if (d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vertex_proc = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vertex_proc = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} ZeroMemory(&m_PresentParamenters, sizeof(m_PresentParamenters));
m_PresentParamenters.BackBufferCount = ;
m_PresentParamenters.BackBufferWidth = m_windowWidth;
m_PresentParamenters.BackBufferHeight = m_windowHeight;
m_PresentParamenters.BackBufferFormat = D3DFMT_A8R8G8B8;
m_PresentParamenters.EnableAutoDepthStencil = true;
m_PresentParamenters.AutoDepthStencilFormat = D3DFMT_D24S8;
m_PresentParamenters.hDeviceWindow = m_hWindowedHWND;
m_PresentParamenters.Flags = ;
m_PresentParamenters.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_PresentParamenters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_PresentParamenters.MultiSampleQuality = ;
m_PresentParamenters.MultiSampleType = D3DMULTISAMPLE_NONE;
m_PresentParamenters.Windowed = true;
m_PresentParamenters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // create device
if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWindowedHWND, vertex_proc, &m_PresentParamenters, &m_pD3Ddevice)))
{
OutputDebugString(L"DXApp::InitDirect3D_9: CreateDevice()failed!");
return false;
} return true;
} LRESULT DXApp::MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
DestroyWindow(hWnd);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hWnd, Message, wParam, lParam);
} int DXApp::Run()
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, nullptr, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RenderShell();
}
} return (int)msg.wParam;
} void DXApp::RenderShell()
{
if (m_bLostDevice)
{
HRESULT hr = m_pD3Ddevice->TestCooperativeLevel();
if (hr == D3DERR_DEVICELOST)
{
OnLostDevice();
return;
}
if (hr == D3DERR_DEVICENOTRESET)
{
m_pD3Ddevice->Reset(&m_PresentParamenters);
OnResetDevice();
return;
} m_bLostDevice = false;
}
m_pD3Ddevice->Clear(, nullptr, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(, , ), .f, 0L);
m_pD3Ddevice->BeginScene();
Update();
Render();
m_pD3Ddevice->EndScene();
HRESULT hr = m_pD3Ddevice->Present(, , , );
if (hr == D3DERR_DEVICELOST)
m_bLostDevice = true;
}
DirectX9完全面向对象框架的更多相关文章
- Web3D编程入门总结——面向对象的基础Web3D框架
本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...
- Web三维编程入门总结之二:面向对象的基础Web3D框架
本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...
- IOC框架
一. IOC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
- 转:IOC框架
CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...
- 热门的PHP框架
每个PHP框架都拥有各自独特的地方.同时PHP语言已经获得了巨大的认同并且成为了世界上最通用的服务器脚本语言.PHP也俨然成为了最容易学习的web动态开发语言.在PHP发展的同时,PHP框架也迅速崛起 ...
- [Spring框架]Spring IOC的原理及详解。
这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后 受益匪浅,这里再重温一遍Spring IOC ...
- Ioc原理及常用框架
1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们 ...
- IoC框架(转载)
1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果 ...
随机推荐
- unique() 函数详解
简介 顾名思义,unique,独一无二的.这个函数可以对容器中的元素进行"去重". 但是需要注意,这里的"去重",并没有把重复的元素删除,只是不重复的元素放到了 ...
- 你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧
前言 开发中,我们常常需要在最后进行一些资源的关闭.比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭.但是这种写法是很不简洁的.其实,早在JDK1.7就已经引入了try-with ...
- ehcache配置文件
ehcache.xml: <?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi=& ...
- 学习笔记(14)- SQuAD的数据格式
BERT模型完成问答任务的时候,需要数据格式为SQuAD形式. 有2个版本,1.1和2.0
- CSS文本居中显示
因为一直为元素居中问题而困扰,所以决定把自己遇到和看到的方法记录下来,以便以后查看 如果要让inline或inline-block元素居中显示,则父元素css中包含text-align:center; ...
- jdbc学习over
这次的代码和之前学习到一般的代码主要就是将一些很常见的操作(建立连接.清除连接)不管做什么操作都需要用到它们,所以将它们单独放到另一个工具类里面去. 用到的术语: 1.事务:https://www.c ...
- Python 基础之匿名函数 迭代器和高阶函数
一.匿名函数 lambda表达式 用一句话来表达只有返回值的函数,叫匿名函数特点:简洁方便语法:lambda 参数: 返回值 1.不带有参数的lambda表达式 def func(): retu ...
- UniGUI之ServerModule常用设置(07)
主要有两个设置,它是一个单独的, 这意味着它只在每个应用程序中创建一次. 它主要用于配置各种服务器设置.不能将组件放在ServerModule上. 如前所述, ServerModule 是一个单一的, ...
- Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置
Nginx多站点虚拟主机实现单独启动停止php-fpm.单独控制权限设置 来源:osyunwei.com 作者:qihang01 发表于:2012-08-19 21:26 点击: 说明: 站点1:bb ...
- idea配置使用
1.下载时注意连带下载git 2.实时清除内存 打开 show memory indicator 3.插件安装 前端常用插件(vue,element,css,html,node,ts等)找到适合自己 ...