Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open...

69
Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Transcript of Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open...

Page 1: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Open Source Tools for Game Development

Ryan C. Gordon, icculus.org

Page 2: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

A few notes...

• Please tweet with #flourish

• Feel free to interrupt!

• Slides are at http://icculus.org/flourish/

Page 3: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Who am I?

• Game developer, porter, hacker

• Ports video games, builds tools

• @icculus on Twitter

[email protected]

• http://icculus.org/resume

Page 4: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 5: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 6: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 7: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 8: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 9: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 10: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

But enough about me.

Page 11: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

DISCLAIMER: This is by no means a

complete list.

Page 12: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

SDL

Page 13: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Simple Directmedia Layer

• Video, Audio, Input, Plumbing

• Low level

• Lots of platforms

• Easy to use!

• http://libsdl.org/

Page 14: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

A simple Direct3D example.

Page 15: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

WNDCLASSEX winClass; MSG uMsg; memset(&uMsg,0,sizeof(uMsg)); winClass.lpszClassName = "MY_WINDOWS_CLASS"; winClass.cbSize = sizeof(WNDCLASSEX); winClass.style = CS_HREDRAW | CS_VREDRAW; winClass.lpfnWndProc = WindowProc; winClass.hInstance = hInstance; winClass.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DIRECTX_ICON); winClass.hIconSm = LoadIcon(hInstance, (LPCTSTR)IDI_DIRECTX_ICON); winClass.hCursor = LoadCursor(NULL, IDC_ARROW); winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winClass.lpszMenuName = NULL; winClass.cbClsExtra = 0; winClass.cbWndExtra = 0; if( RegisterClassEx(&winClass) == 0 ) return E_FAIL; g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS", "Direct3D (DX9) - Full Screen", WS_POPUP | WS_SYSMENU | WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, hInstance, NULL ); if( g_hWnd == NULL ) return E_FAIL; ShowWindow( g_hWnd, nCmdShow ); UpdateWindow( g_hWnd );

Page 16: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); if( g_pD3D == NULL ) { // TO DO: Respond to failure of Direct3DCreate8 return; } // // For the default adapter, examine all of its display modes to see if any // of them can give us the hardware support we desire. // int nMode = 0; D3DDISPLAYMODE d3ddm; bool bDesiredAdapterModeFound = false; int nMaxAdapterModes = g_pD3D->GetAdapterModeCount( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8 ); for( nMode = 0; nMode < nMaxAdapterModes; ++nMode ) { if( FAILED( g_pD3D->EnumAdapterModes( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, nMode, &d3ddm ) ) ) { // TO DO: Respond to failure of EnumAdapterModes return; } // Does this adapter mode support a mode of 640 x 480? if( d3ddm.Width != 640 || d3ddm.Height != 480 ) continue; // Does this adapter mode support a 32-bit RGB pixel format? if( d3ddm.Format != D3DFMT_X8R8G8B8 ) continue; // Does this adapter mode support a refresh rate of 75 MHz? if( d3ddm.RefreshRate != 75 ) continue; // We found a match! bDesiredAdapterModeFound = true; break; } if( bDesiredAdapterModeFound == false ) { // TO DO: Handle lack of support for desired adapter mode... return; }

Page 17: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

// Can we get a 32-bit back buffer? if( FAILED( g_pD3D->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, FALSE ) ) ) { // TO DO: Handle lack of support for a 32-bit back buffer... return; } // Can we get a z-buffer that's at least 16 bits? if( FAILED( g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16 ) ) ) { // TO DO: Handle lack of support for a 16-bit z-buffer... return; } // // Do we support hardware vertex processing? if so, use it. // If not, downgrade to software. // D3DCAPS9 d3dCaps; if( FAILED( g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps ) ) ) { // TO DO: Respond to failure of GetDeviceCaps return; } DWORD flags = 0; if( d3dCaps.VertexProcessingCaps != 0 ) flags = D3DCREATE_HARDWARE_VERTEXPROCESSING; else flags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

Page 18: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

// // Everything checks out - create a simple, full-screen device. // D3DPRESENT_PARAMETERS d3dpp; memset(&d3dpp, 0, sizeof(d3dpp)); d3dpp.Windowed = FALSE; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, flags, &d3dpp, &g_pd3dDevice ) ) ) { // TO DO: Respond to failure of CreateDevice return; }

Page 19: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

// TO DO: Respond to failure of Direct3DCreate8

Page 20: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

ಠ_ಠ

Page 21: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

The complex SDL version.

Page 22: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

SDL_Init(SDL_INIT_VIDEO);

SDL_SetVideoMode(640, 480, 0, SDL_FULLSCREEN | SDL_OPENGL);

Page 23: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

ಠ_ಠ

Page 24: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

• Video (2D and OpenGL)

• Audio (DSP and CD)

• Events

• Timers

• Joysticks

• OS stuff: Threads, DLLs, C runtime

SDL 1.2

Page 25: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

SDL 2.0

• Remove limitations, modernizes features.

• Multi-window, multi-audio, multi-input.

• Android, iOS, etc.

• Work in progress, but try it now!

Page 26: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

OpenAL

Page 27: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

OpenAL

• 3D positional audio

• Cross-platform

• Easy to use

• Good for 2D games, too!

• http://openal.org/

Page 28: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

bool initOpenAL(void) { ALCdevice *dev = alcOpenDevice(NULL); if (!dev) return false; ALCcontext *ctx = alcCreateContext(dev, NULL); if (!ctx) { alcCloseDevice(dev); return false; } alcMakeContextCurrent(ctx); return true; }

Page 29: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 30: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

OpenAL

• Stateful objects, like OpenGL

• One Listener

• A handful of Sources

• Many Buffers

• Buffer queues

Page 31: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

SQLite

Page 32: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

SQLite

• Powerful embedded SQL engine.

• One file per database, in-process.

• One .c file, dropped into your project.

• You’re already using it.

• http://sqlite.org/

Page 33: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Know your tools.

“SQLite doesn’t compete with Oracle. It competes with fopen().”

-- D. Richard Hipp, primary developer

Page 34: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

PhysicsFS

Page 35: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Blatant self-promotion!

• I wrote PhysicsFS.

• It’s awesome.

• You should use it, so you can be awesome.

• http://icculus.org/physfs/

Page 36: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

PhysicsFS

• Virtual File System.

• Transparent archives and files.

• Makes game updates and mods easier.

• Security, functionality, flexibility.

Page 37: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Look, I already know it doesn’t have anything to do with physics.

Page 38: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

So what about physics?

• Open Dynamics Engine (ODE)

• Box2D

Page 39: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Ogg Vorbis and Speex

Page 40: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 41: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Ogg Vorbis and Speex

• Vorbis: compressed audio data

• Speex: compressed voice data

• Patent unencumbered, BSD licensed.

• http://xiph.org/

Page 42: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

ProTip

• Don’t use libvorbis directly.

• Use libvorbisfile.

Page 43: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Ogg Theora

Page 44: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 45: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Ogg Theora

• Video equivalent of Ogg Vorbis.

• Based on On2’s VP3 codec.

• HD video at reasonable bitrates.

• Patent unencumbered, BSD licensed.

• http://theora.org/

Page 46: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

ProTip

There is no libvorbisfile for Theora!

Page 47: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Blatant self-promotion!

• TheoraPlay makes Ogg Theora way easier.

• http://icculus.org/theoraplay/

Page 48: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Lua

Page 49: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Lua

• Dirt-simple scripting language.

• Crazy powerful, yet efficient.

• Easy to embed and bridge with C.

• Very popular in current AAA titles.

• http://lua.org/

Page 50: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

zlib, libpng, libjpeg

Page 51: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

ProTip...don’t use these libraries.

Page 52: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

stb_*

Page 53: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

stb_*

• Sean Barrett is a ninja.

• Decoders, decompressors, etc.

• Everything is in the public domain.

• http://nothings.org/

Page 54: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

miniz

• zlib in 300 lines of C.

• Faster than zlib.

• Other features.

• http://code.google.com/p/miniz/

Page 55: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

enet

Page 56: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

enet

• Networking is hard.

• Unreliable, fragmented, sequenced packets.

• Reliable streams over UDP.

• Channels.

• http://enet.bespin.org/

Page 57: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

MojoShader

Page 58: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Blatant self-Promotion!

• MojoShader makes your compiled Direct3D shaders work on OpenGL!

• GLSL shaders, ARB programs.

• Shader assembler and preprocessor.

• HLSL compiler coming soon!

• http://icculus.org/mojoshader/

Page 59: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

I thought you said “tools!”

Hey!

Page 60: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Google Breakpad

Page 61: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Valgrind

Page 62: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

gdb7

Page 63: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

clang

Page 64: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Blender

Page 65: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Git and Mercurial

Page 66: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

The whole package?

Page 67: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

Game engines

• ioquake3, iodoom3

• Ogre

• Crystal Space

• Cube/Sauerbraten

• HGE

Page 68: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org
Page 69: Open Source Tools for Game Developmenticculus.org/flourish/open-tools-for-game-dev.pdf · Open Source Tools for Game Development Ryan C. Gordon, icculus.org

That’s all folks.

• Questions? Answers!

• Hire me.

• http://icculus.org/flourish/

• Ryan C. Gordon: [email protected]

• http://twitter.com/icculus

• http://gplus.to/icculus