All pastes #1879018 Raw Edit

sprite

public text v1 · immutable
#1879018 ·published 2010-06-08 12:42 UTC
rendered paste body
#include <windows.h>
#include <windowsx.h>
#include <d3d10.h>
#include <d3dx10.h>
#include <DXGI.h>

#pragma comment (lib, "d3d10.lib")
#pragma comment (lib, "d3dx10.lib")
#pragma comment (lib, "DXGI.lib")


ID3D10Device* d3ddev = NULL;
IDXGISwapChain* swChain;
ID3D10RenderTargetView* renderTargetView;

 HWND hWnd;
D3D10_VIEWPORT viewPort;
ID3D10Texture2D *texture;
D3DX10_SPRITE testSprite;
D3D10_TEXTURE2D_DESC desc;
D3D10_SHADER_RESOURCE_VIEW_DESC SRVdesc;
ID3D10ShaderResourceView *spriteRV;
ID3DX10Sprite *ObjSprite;
D3DXMATRIX matProjection, matTranslation, matScalation;


void loadresource(void);	
void initD3D(HWND hWnd);    
void render_frame(void);    
void cleanD3D(void);     


LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);



int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";

    RegisterClassEx(&wc);

	RECT r={0,0,800,600};
	AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, FALSE);
    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
				          "Direct3D 10",
                          WS_OVERLAPPEDWINDOW,
                          150, 150,
                          800, 600,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);


    initD3D(hWnd);



    MSG msg;

    while(TRUE)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if(msg.message == WM_QUIT)
            break;

        render_frame();
    }

   
    cleanD3D();

    return msg.wParam;
}


LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}


void initD3D(HWND hWnd)
{
	DXGI_SWAP_CHAIN_DESC swChainDesc;
	
	
	ZeroMemory(&swChainDesc, sizeof(swChainDesc));
	swChainDesc.BufferDesc.Height = 600;
	swChainDesc.BufferDesc.Width = 800;
	swChainDesc.BufferDesc.RefreshRate.Numerator = 60;
	swChainDesc.BufferDesc.RefreshRate.Denominator = 1;
	swChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	swChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
	swChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
	swChainDesc.SampleDesc.Count = 1;
	swChainDesc.SampleDesc.Quality = 0;
	swChainDesc.OutputWindow = hWnd;
	swChainDesc.BufferCount = 1;
	swChainDesc.Windowed = TRUE;
	swChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
	swChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
	swChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_NONPREROTATED;
	swChainDesc.Flags = 0;

	D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &swChainDesc, &swChain, &d3ddev);

	ID3D10Texture2D *backBuffer;
	swChain->GetBuffer( 0, __uuidof( ID3D10Texture2D ), (LPVOID*)&backBuffer ); 
    HRESULT hr = d3ddev->CreateRenderTargetView( backBuffer, NULL, &renderTargetView );
	backBuffer->Release();

	d3ddev->OMSetRenderTargets(1, &renderTargetView,NULL);

	ZeroMemory(&viewPort,sizeof(viewPort));
	viewPort.Width = 800;
	viewPort.Height = 600;
	viewPort.MaxDepth = 1;
	viewPort.MinDepth = 0;
	viewPort.TopLeftX = 0;
	viewPort.TopLeftY = 0;
	d3ddev->RSSetViewports(1, &viewPort);


	loadresource();
}


void render_frame(void)
{
	D3DXMatrixOrthoOffCenterLH(&matProjection, (float)viewPort.TopLeftX,(float)viewPort.Width, (float)viewPort.TopLeftY, (float)viewPort.Height, 0.1f, 10);
	ObjSprite->SetProjectionTransform(&matProjection);
	D3DXMatrixTranslation(&matTranslation, 200.f,viewPort.Height - 200.f, 0.1f);
	D3DXMatrixScaling(&matScalation, 60,60,1.0f);
	testSprite.matWorld = (matTranslation*matScalation);

	d3ddev->ClearRenderTargetView(renderTargetView, D3DXCOLOR(0.0f,0.125f,0.6f,0.0f));
	
	ObjSprite->Begin(D3DX10_SPRITE_SORT_TEXTURE);
	//ObjSprite->DrawSpritesImmediate(&testSprite,1,0,0);
	ObjSprite->DrawSpritesBuffered(&testSprite,1);
	ObjSprite->Flush();
	ObjSprite->End();
	swChain->Present(0,0);
}


void cleanD3D(void)
{
	renderTargetView->Release();
	swChain->Release();
	ObjSprite->Release();
	d3ddev->Release();
}//*

void loadresource()
{
	ID3D10Resource* pRes;		
	HRESULT hr = D3DX10CreateTextureFromFile(d3ddev,"sprite.bmp", NULL, NULL, &pRes, NULL); 

	if(FAILED(hr))
	{
		MessageBox(hWnd, "Texture Load Failed","Message",MB_OK);
	}
	pRes->QueryInterface(__uuidof(ID3D10Texture2D), (LPVOID*)&texture);
	pRes->Release();

	texture->GetDesc(&desc); 
	ZeroMemory(&SRVdesc, sizeof(SRVdesc));
	
	SRVdesc.Format = desc.Format;
	SRVdesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
	SRVdesc.Texture2D.MipLevels = desc.MipLevels;

	d3ddev->CreateShaderResourceView(texture, &SRVdesc, &spriteRV);

	testSprite.pTexture = spriteRV;
	testSprite.TexCoord.x = 0;
	testSprite.TexCoord.y = 0;
	testSprite.TexSize.x = 1.0f;
	testSprite.TexSize.y = 1.0f;
	testSprite.TextureIndex=0;
	testSprite.ColorModulate=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);

	hr = D3DX10CreateSprite(d3ddev,0,&ObjSprite);
	if(FAILED(hr))
	{
		MessageBox(hWnd, "Create Sprite Failed","Message",MB_OK);
	}
}