1 . .Introduction Advanced 3D Game Programming with DirectX 9.0 by Peter Walsh Wordware Publishing © 2003 Companion Web Site Advanced 3D Game Programming Using DirectX 9.0 Peter Walsh Wordware Publishing, Inc. Library of Congress Cataloging-in-Publication Data Walsh, Peter (Peter Andrew), 1980- Advanced 3D game programming with DirectX 9.0 / by Peter Walsh. p. cm. ISBN 1-55622-968-2 (pbk.) 1. Computer games–Programming. 2. DirectX. I. Title. QA76.76.C672W382 2003 794.8'167768–dc21 2003007140 CIP Copyright © 2003 Wordware Publishing, Inc. All Rights Reserved 2320 Los Rios Boulevard Plano, Texas 75074 No part of this book may be reproduced in any form or by any means without permission in writing from Wordware Publishing, Inc. 1-55622-968-2 10 9 8 7 6 5 4 3 2 1 0403 DirectX is a registered trademark of Microsoft Corporation in the United States and/or other countries. All brand names and product names mentioned in this book are trademarks or service marks of their respective companies. Any omission or misuse (of any kind) of service marks or trademarks should not be regarded as intent to infringe on the property of others. The publisher recognizes and respects all marks used by companies, manufacturers, and developers as a means to distinguish their products. All inquiries for volume purchases of this book should be addressed to Wordware Publishing, Inc., at the above address. Telephone inquiries may be made by calling: (972) 423-0090 Dedications To my beautiful fiancée Lisa Sullivan I love you with all my heart. Peter To my parents, Manny and Maria 2 Adrian Original edition for DirectX version 7.0 written by Adrian Perez with Dan Royer. Revised and updated by Peter Walsh. Acknowledgments Like Adrian says below, this book, like any other, was not just the work of one (or two or three) people; there have been so many people over the years who have helped me in one way or another, and the result of all these efforts contributed to the knowledge contained in this book. I will try to thank everyone I can. My update of this book would not have occurred without the help of Tracy Williams, who has helped me many times with my books. Not only did she get me going on my first book, but she got me hooked up with Wordware for this book, my third. Of course, I must thank Jim Hill, Wes Beckwith, and Tim McEvoy of Wordware for being such great people to work with. Thanks to Phil Taylor on the DirectX team at Microsoft for agreeing to do the tech check and also to Wolfgang Engel and Bruno Sousa for their technical support. Of course, thank you to my wonderful fiancee Lisa for helping to keep me motivated while working on the book, when I just wanted to give up and party! Where would I be without thanking all my friends and family, who keep me sane during the many months that I spent researching and writing these massive books. So thank you Jon-Paul Keatley, Stewart Wright, Andrew McCall, Todd Fay, Mike Andrews, Laz Allen, and all my other friends around the world that I don't have room to list! Also, who would I be writing a book and not mentioning my soon-to-be family-in-law? So thank you Liam and Ann Sullivan for giving me permission to marry your beautiful daughter (also to Joanne, Pauline, Liam Jr., and the rest of the family). Of course, thanks to my parents Simon and Joy Walsh for being so supportive during my younger years and to this day. The worst thing about writing acknowledgments is that you always forget someone who helped you until the day the book goes to print. So thank you to everyone else I forgot—please accept my apologies; my poor brain is worn out after all this work! Peter Walsh This book couldn't have been completed without the help and guidance of a whole lot of people. I'll try to remember them all here. First, thanks to Wes Beckwith and Jim Hill at Wordware Publishing. They were extremely forgiving of my hectic schedule, and they helped guide me to finishing this book. I also must thank Alex Dunne for letting me write an article in 1998 for Game Developer magazine. If I hadn't written that article, I never would have written this book. Everything I know about the topics in this book I learned from other people. Some of these people were mentors, others were bosses, and still others were professors and teachers. Some were just cool people who took the time to sit and talk with me. I can't thank them enough. Paul Heckbert, Tom Funkhouser, Eric Petajan, Charles Boyd, Mike Toelle, Kent Griffin, David Baraff, Randy Pausch, Howie Choset, Michael Abrash, Hugues Hoppe, and Mark Stehlik: You guys rock. Thank you. Thanks to Microsoft, ATI, nVidia, id Software, and Lydia Choy for helping me with some of the images used in the text. Many people helped assure the technical correctness and general sanity of this text. Ian Parberry and his class at University of North Texas were immensely helpful: Thanks, guys. Michael Krause was an indispensable help in assuring the correctness of the DirectX chapters. Bob Gaines, Mikey Wetzel, and Jason Sandlin from the DirectX team at Microsoft helped make sure Chapters 2, 3, 4, 8, and 10 were shipshape: Mad props to them. David Black was kind enough to look over Chapter 11 and help remove some errors and clarify a few points. Finally, I need to thank all of the people who helped me get this thing done. I know I won't be able to remember all of them, but here's a short list: Manual and Maria Perez, Katherin Peperzak, Lydia Choy (again), Mike Schuresko, Mike Breen (and the rest of the Originals), Vick Mukherjee, Patrick Nelson, Brian Sharp, and Marcin Krieger. Adrian Perez About the author Peter Walsh is a professional game programmer at Visual Science Ltd., where he has worked on a number of titles including the Formula 1 series of games, Harry Potter and the Chamber of Secrets, and others for Electronic Arts, the world's leading publisher of computer games. He has studied for a degree in computer games development at Abertay University in Dundee, Scotland, and has worked with IC-CAVE, a think tank for the next generation of gaming 3 technology. The complete source code in C++, including a game demonstrating techniques covered in this book, can be downloaded from http://www.wordware.com/files/dx9. 4 . .Advanced 3D Game Programming with DirectX 9.0 by Peter Walsh ISBN:1556229682 Wordware Publishing © 2003 (525 pages) Designed for programmers who are new to graphics and game programming, this book covers Direct 3D, DirectInput, and DirectSound, as well as artificial intelligence, networking, multithreading, and scene management. Companion Web Site Table of ContentsBack Cover Table of Contents Advanced 3D Game Programming Using DirectX 9.0 Introduction Chapter 1-Windows Chapter 2-Getting Started with DirectX Chapter 3-Communicating with DirectInput Chapter 4-DirectSound Chapter 5-3D Math Foundations Chapter 6-Artificial Intelligence Chapter 7-UDP Networking Chapter 8-Beginning Direct3D Chapter 9-Advanced 3D Programming Chapter 10-Advanced Direct3D Chapter 11-Scene Management Appendix-An STL Primer 5 Introduction A wise man somewhere, somehow, at some point in history, may have said the best way to start a book is with an anecdote. I would never question the words of a wise man who may or may not have existed, so here we go. When I was a freshman in high school back in 1993, I took the required biology class that most kids my age end up having to take. It involved experiments, lab reports, dissecting of various animals, and the like. One of my lab partners was a fellow named Chris V. We were both interested in computers and quickly became friends, to the point where talking about biology in class was second to techno-babble. One night, in the middle of December, Chris called me up. The lab report that was due the next day required results from the experiment we had done together in class, and he had lost his copy of our experiment results. He wanted to know if I could copy mine and bring them over to his place so he could finish writing up the lab. Of course, this was in those heinous pre-car days, so driving to his house required talking my parents into it, finding his address, and various other hardships. While I was willing to do him the favor, I wasn't willing to do it for free. So I asked him what he could do to reciprocate my kind gesture. "Well," he said, "I guess I can give you a copy of this game I just got." "Really? What's it called?" I said. "Doom. By the Wolf 3D guys." "It's called Doom? What kind of name is that??" After getting the results to his house and the game to mine, I fired the program up on my creaky old 386 DX-20 clone, burning rubber with a whopping 4 MB of RAM. As my space marine took his first tenuous steps down the corridors infested with hellspawn, my life changed. I had done some programming before in school (Logo and Basic), but after I finished playing the first time, I had a clear picture in my head of what I wanted to do with my life: I wanted to write games, something like Doom. I popped onto a few local bulletinboards and asked two questions: What language was the game written in, and what compiler was used? Within a day or so, I purchased Watcom C 10.0 and got my first book on C programming. My first C program was "Hello, World." My second was a slow, crash-happy, non-robust, wireframe spinning cube. I tip my hat to John Carmack, John Romero, and the rest of the team behind Doom; my love for creating games was fully realized via their masterpiece. It's because of them that I learned everything that I have about this exceptionally interesting and dynamic area of computer acquired programming. The knowledge that I have is what I hope to fill these pages with, so other people can get into graphics and game programming. I've found that the best way to get a lot of useful information down in a short amount of space is to use the tried-and-true FAQ (frequently asked questions) format. I figured if people needed answers to some questions about this book as they stood in their local bookstore trying to decide whether or not to buy it, these would be them. Who are you? What are you doing here? Well I, being Peter rather than Adrian, am a professional games programmer and have been for a quite a few years. I started out like most people these days, getting extremely interested in how games worked after Doom came out. After teaching myself programming, I moved on to study for a degree in computer games development at Abertay University in Dundee, Scotland. After that I went on to work for a short while with IC-CAVE, which is a think tank for the next generation of gaming technology. Over the years I've worked on games like F1 Career Challenge, Harry Potter and the Chamber of Secrets, SHOX, and the upcoming Medal of Honor: Rising Sun. I've developed games for the PC, Game Boy, Dreamcast, PS2, Game Cube, and Xbox. I've also written two other books over the last two years on DirectX programming. I've also read so many programming books that I reckon I have personally wiped out half of the Amazon rainforest. So hopefully all that material will help me write this book in a way that avoids all the pitfalls that other authors have fallen into. I really hope you learn a lot from this book. If you have any questions along the way that you just can't get to the bottom of, please email me at mrzen@msn.com. Unfortunately, after printing that email in a previous book it was bombarded by junk mail from spammers and became almost unusable. However, Hotmail has gotten better lately, so 6 hopefully your questions will get through to me! 7 Why was this book written? I've learned from many amazingly brilliant people, covered a lot of difficult ground, and asked a lot of dumb questions. One thing that I've found is that the game development industry is all about sharing. If everyone shares, everyone knows more stuff, and the net knowledge of the industry increases. This is a good thing because then we all get to play better games. No one person could discover all the principles behind computer graphics and game programming themselves, and no one can learn in a vacuum. People took the time to share what they learned with me, and now I'm taking the time to share what I've learned with you. 8 Who should read this book? This book was intended specifically for people who know how to program already but have taken only rudimentary stabs at graphics/game programming or never taken any stab at all, such as programmers in another field or college students looking to embark on some side projects. 9 Who should not read this book? This book was not designed for beginners. I'm not trying to sound arrogant or anything; I'm sure a beginner will be able to trudge through this book if he or she feels up to it. However, since I'm so constrained for space, often- times I need to breeze past certain concepts (such as inheritance in C++). If you've never programmed before, you'll have an exceedingly difficult time with this book. 10 What are the requirements for using the code? The code was written in C++, using Microsoft Visual C++ 6.0. The .DSPs and .DSWs are provided on the downloadable files (http://www.wordware.com/files/dx9); the .DSPs will work with versions previous to 6.0, and the .DSWs will work with 6.0 and up. If you choose to use a different compiler, getting the source code to work should be a fairly trivial task. I specifically wrote this code to use as little non-standard C++ as possible (as far as I know, the only non-standard C++ I use is nameless structures within unions). [...]... book along with the game Mobots Attack! Each chapter (and the game) has its own workspace so you can use them independently of each other 19 Chapter 1: Windows Overview Welcome, one and all, to the first stage of the journey into the depths of advanced 3D game development with DirectX 9. 0 Before you can start exploring the world of 3D game programming, you need a canvas to work on Basic operations like... "Hello, World" code that Visual C++ 6 .0 will automatically generate for you, but some of the things were removed, leaving this one of the most stripped-down Windows programs you can write Listing 1.1: One of the simplest possible Windows programs /******************************************************************* * Advanced 3D Game Programming using DirectX 9. 0 ********************************** *... you to input DMA and IRQ settings for sound cards) When a game crashed, you didn't need to worry too much about leaving things in a state for the machine to piece itself together; the user could just reboot Some old 320x 200 x256 games would crash without even changing the video mode back to normal, leaving the user screen full of oversized text with the crash information In Windows, things are totally... preceded with a "g_" (an example would be int g_hInstance); static variables are preceded with an "s_" (static float s_fTimer); and member variables of classes are preceded with an "m_" (int m_iNumElements) 18 Companion Files The companion files can be downloaded from the following web site: http://www.wordware.com/files/dx9 These files include the source code discussed in the book along with the game. .. object model And much more! 20 A Word about Windows Windows programs are fundamentally different in almost every way from DOS programs In traditional DOS programs, you have 100 percent of the processor time, 100 percent control over all the devices and files in the machine You also need an intimate knowledge of all of the devices on a user's machine (you probably remember old DOS games, which almost always... is still going through a lot of change 13 Do I need a 3D accelerator? That depends Technically, no, you can get by without any accelerator at all, using Direct3D's software rasterizer However, it's extremely slow, far from real time for anything but trivially simple scenes It's almost impossible to buy a computer these days without some sort of 3D acceleration, and an accelerator capable of handling... that, with no underscores (an example would be int numObjects) If the last letter of a word is a capital letter, an underscore is placed to separate it from the next word (example: class cD3D_App) A popular nomenclature for variables is Hungarian notation, which we touch on in Chapter 1 I'm not hardcore about it, but generally my floats are prefixed with "f," my ints with "i," and my pointers with "p"... topics If you're familiar with the Windows API, you should breeze through this chapter; otherwise, hold on to your seat! In this chapter you are going to learn about: The theory behind Windows and developing with the Win32 API How Win32 game development differs from standard Windows programming Messages and how to handle them The infamous message pump Other methods of Windows programming such as MFC... in MyRegisterClass szTitle, // Title of the application WS_OVERLAPPEDWINDOW, // Style that Windows should make our window with // (this is the 'default' window style for windowed apps) 20, // Starting X of the window 20, // Starting Y of the window 6 40, // Width of the window 4 80, // Height of the window NULL, // Handle of our parent window (Null, since we have none) NULL, // Handle to our menu (Null,... are some pieces of code that would get much faster with a little obfuscation If you've never used C++ before or are new to programming, this book is going to be extremely hard to digest A good discussion on programming essentials and the C++ language is C++ Primer (Lippman et al.; Addison-Wesley Publishing) 16 Class/Structure Names MFC names its classes with a prefixed C As an example, a class that represents . 1 . .Introduction Advanced 3D Game Programming with DirectX 9. 0 by Peter Walsh Wordware Publishing © 200 3 Companion Web Site Advanced 3D Game Programming Using DirectX 9. 0 Peter Walsh Wordware. Andrew), 198 0- Advanced 3D game programming with DirectX 9. 0 / by Peter Walsh. p. cm. ISBN 1-55622 -96 8-2 (pbk.) 1. Computer games Programming. 2. DirectX. I. Title. QA76.76.C672W382 200 3 794 .8'167768–dc21. a game demonstrating techniques covered in this book, can be downloaded from http://www.wordware.com/files/dx9. 4 . .Advanced 3D Game Programming with DirectX 9. 0 by Peter Walsh ISBN:15562 296 82 Wordware