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:软件系统中耦合的对象 如果 ...
随机推荐
- iOS开发应用上架必读最新苹果审核规则(史上最全版)
官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...
- nginx防盗链处理模块referer和secure_link模块
使用场景:某网站听过URI引用你的页面:当用户在网站点击url时:http头部会通过referer头部,将该网站当前页面的url带上,告诉服务本次请求是由这个页面发起的 思路:通过referer模块, ...
- python开发接口
享一段代码,开发了3个接口: 1.上传文件 2.查看所有文件 3.下载文件 使用python开发,需要安装flask模块,使用pip ...
- C++结构体struct与C语⾔结构体和C++引⽤&与传值的区别
写再最前面:摘录于柳神的笔记: (1)定义好结构体 stu 之后,使⽤这个结构体类型的时候,C语⾔需要写关键字 struct ,⽽C++⾥⾯可以省 略不写: (2)这个引⽤符号 & 要和C语⾔ ...
- 02-03Android学习进度报告三
今天主要学习了线性布局和相对布局的概念和区别,以及线性布局和相对布局的优缺点. 经过搜素发现,我们屏幕适配的使用用的比较多的就是LinearLayout的权重属性weight,我 学习了一些 Line ...
- Reversing-x64Elf-100----攻防世界
题目来源:攻防世界 环境:win10 软件:pycharm.64位的ida 常规的操作ida打开查看,看到了main函数,
- windows下代码规范检测工具sonarqube安装与使用,含与maven的结合
一.首先下载sonarqube 地址 : https://www.sonarqube.org/downloads/ (最新版本支持java11+,博主下载支持java8的版本7.7), 下载S ...
- 2020牛客寒假算法基础集训营4 J 二维跑步
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43035417 假设有i步选择不动,就有n-i步移动 假设其中又有a ...
- Vue和vue-template-compiler版本不一致
vue项目,package.json中Vue和vue-template-compiler版本不一致时,执行npm run dev有时会报错, 提示vue和vue-template-compiler版本 ...
- Github 第三方授权登录教程
Github 第三方授权登录教程 ####大致流程图 ####1.首先注册一个github帐号,Applications>Developer applications>Register a ...