Showing posts with label work. Show all posts
Showing posts with label work. Show all posts

Friday, March 6, 2009

The Big Move!

The response to the interviewing article went really well! I got a lot of great comments about it and am really glad I was able to give back a little by contributing a piece like that. Hopefully I'll find some time to write more articles like it in the future.

So the past few months have been pretty interesting for me. A few months ago I made the decision to leave Destineer to work for id Software. They're a great company and everyone there is absolutely awesome but I just could not pass up the chance of a life time to work at the company that got me excited about computers and games in the first place! They were all incredibly understanding and I truly wish them the very best. Trust me when I say they're working on something really amazing and I'm very excited to see the final result!

So outside of that I've been keeping pretty busy. While looking for some code to generate cubic noise maps (as part of a series of new experiments I've been working on to generate spherical terrains) I ran into my old starfield generator which generates random points and "blurs" them as they whiz by you. A very cool effect, especially when you consider how the points were generated.

When you generate random noise around a unit sphere you have to be incredibly careful to ensure that they are uniform, otherwise you'll see them gathering towards one of the poles as demonstrated here:


The problem lies in how spherical coordinates tend to congregate points towards the poles. To fix this problem you can use sphere picking to ensure any given area around the sphere contains the same number of points:
This may seem relatively trivial and unimportant for something like a starfield (which it is), but where it starts to really matter is when you need to generate random vectors for something like raytracing. I recently created an ambient occlusion generator for heightfields and ran into an issue where the sampled values where resulting in way to many false positives than they should have been. As I'm sure you can imagine, the issue is pretty obvious; most of the generated rays were going straight up, and heightfields by definition do not have overhangs for those rays to hit!!! The simplest solution is to scale the generated rays up value so they go more towards the sides (which helps quite a bit), but really the best way to do it is to properly generate the sampling rays around the unit hemisphere uniformly. By doing this I was able to get away with using a lot less rays for fantastic looking results!

I won't bother to provide the full algorithm here but if you're interested, check out this page: Sphere Point Picking.


So as I mentioned I've been doing quite a bit with terrains. Unfortunately I don't have much to show as far as screenshots as it's been mostly experimental type stuff to learn and get acquainted with new algorithms. After I finished the ambient occlusion generator I went ahead and wrote a lightmapper for fun (it wasn't that much of a departure) and started a survery of terrain shadowing techniques.

Shadow Mapping is a tried and true classic which can give some great results if you're willing to put a little blood and sweat into your implementation (ala CSM's, VSM's, TSM's, etc...). Lightmapping is nice but only works for static terrains and doesn't work so well for dynamic objects (though I know of some neat tricks to fix this). Ambient Occlusion works nice but only works for global indirect light (so is more complementary than comprehensive). Spherical Harmonics is an option but from my research doesn't always result in the best looking shadows.

One experimental shadowing technique I tried which resulted in some really nice soft-shadows is Ambient Aperture Mapping. The idea behind it is pretty novel and is similar to relief mapping but simpler. First, you generate your aperture values which consist of a bent normal; a vector pointing towards an un-occluded light source (i.e. the sky/sun/moon), and the aperture; essentially a circle at the end of the bent normal which defines how much light reaches that point (this value is similar to an ambient occlusion result and make the bent normal into a sort of cone). After you have these you can test any given terrain surface point's aperture against your global light source which has it's own aperture values. The intersection of these two apertures defines how much light reaches that surface point.

The results are surprisingly good! I may utilize this in full force the next time I need an efficient low to medium frequency shadowing solution with modest storage costs for terrain rendering. Here's a paper on it for your reading pleasure: Ambient Aperture Lighting, and a screenshot of their results:


That's enough for now. Until next time!

Friday, December 5, 2008

Game Industry Interviewing 101

So now without further ado, game industry interviewing.

As I mentioned before, a few months back I was doing a heavy amount of interviewing for basically two months non-stop. I spoke to over ten game companies and flew out to on-site interviews a total of 7 times (there and back). It was a grueling and nerve wracking experience but I ended up learning a lot and finding a great job. Here are some things I learned that I hope can teach both interviewer's and interviewee's about the right and wrong way to interview.
DISCLAIMER: I don't pretend to be an expert on the subject. I don't even pretend to follow my own advice. These are merely my opinions on the experience's I've had on both sides of the table. Please take all this with a grain of salt.

First, let's start with what both parties are looking for. From the interviewers perspective, what they want is:
  • To determine skill of the applicant, who is at least capable if not exceptional
  • To make sure interviewee fits well with the team
  • To pay as little as possible

The interviewee's interests are a bit different. They want (ideally):
  • Good pay
  • Enjoyable and challenging work
  • Job security
  • Opportunity for growth and advancement

Although both parties obviously want different things, they both have many places where they meet. For starter's, both parties want a long-term relationship. It's beneficial for a company to keep it's employee's for a significant amount of time. The first year that an employee is on the job amounts to a decent amount of training. This is both costly in time and money for the employer. It takes an incredible amount of effort to find, interview, and sign an employee and then pay for relocation and benefits on top of salary. Every engineer or artist you take off the job to interview a prospective employee is time lost. Because of these factors it's critical to hire employee's that will stay with you for the long haul.

Both parties also want to put out top quality titles. If you as an employee of that company can't get an interviewee excited about what you're working on, it's unlikely he'll be excited working on it there as well. It's even less likely he'll accept an offer if he has better prospects elsewhere.

As an interviewee, the entire process is extremely stressful but the most important thing to do is not alienate your interviewer. An easy way to do this would be to:
  • Bad mouth previous employers or co-workers
  • Point out mistakes you've made without addressing ways in which you've resolved or learned from them.
  • Show lack of knowledge of their company, games.
  • Not be prepared, technically or personally

In the end it's about finding a candidate that impresses the interviewer in some way or another. So how can a candidate impress their interviewer. Well there are a few easy ways:
  • Show knowledge about the company
  • Sell yourself, your ability to work with others well and your skills
  • Be early to the interview
  • Show manors, be polite
  • Maintain a positive attitude no matter what
  • Embrace game industry culture (NO SUITS!) but take the interview seriously
  • Thoroughly thank the interviewer for their time - they're taking a chance on you!

The same goes for the interviewer. Interviewers need to realize that they are being interviewed as well. The candidate has a choice to work somewhere else so it's important to show respect for the candidate and treat them as an important individual. A great way to put a bad taste in their mouth is to:
  • Show lack of knowledge of their skills by not giving their resume full attention
  • Not giving them time to answer questions, answering questions for them (in large groups) or asking questions not relevant to their day to day job (brain teasers are SATAN).

Having said that, an interviewer is still expected to do all they can to find qualified candidates. Some candidates are knowingly not qualified for the job but apply anyways. This does a disservice to all and these interviewees should never have gotten to the on-site interview if the interviewer was doing their job right. Interviewing for a job is not shooting in the dark and most employer's know better (and if they don't watch out)!

Despite this, realize that some candidates can have a bad day. There are no such things as re-do's for an interview but it doesn't hurt to be understanding. The worst thing a company can do in my opinion is end an on-site interview early. It's not like you just hung up on the employee on the phone, no harm no foul. This person just made an effort to get out to your company, taking time away from their job, family and life. This is humiliating to the candidate and shows a complete lack of professionalism on the part of the company. I've personally seen this happen before and couldn't have been more disgusted.

So what are the different types of interviews?
  • The Gauntlet: In this type of interview, the company throws Interviewer after interviewer at the prospective employee, sometimes in pairs for 30 minutes to an hour at a time. The idea is to expose the candidate to as many people on the team as possible and later discuss as a group the merits of that individual. This is probably my personal favorite (as the interviewer and interviewee) as it gives you the most insight into the candidate, although it can be quite fatiguing.
  • The Interrogation: Throw everyone and the kitchen sink at the guy all at once. See how you do under immense pressure. "Oh no, he's going to burst!". In my opinion this kind of interview is a circus. From my experience it always leads to interviewers talking over each other and the candidate, leaving him in the cross-fire. Very uncomfortable. Also, most game developers tend to be more introverted personality types so exposing them to a full room of people is just cruel.
  • The Pow-wow: This is the laid back, conversational style interview. I like this style a lot but you have room to miss a lot about the candidate. I would only use this if I knew they were perfectly qualified and just wanted to get a feel for their personality. An experienced interviewer is great at sneaking in very in-depth questions in the guise of just shooting the breeze. Great way to get to know a candidate while having them lower their guard a bit.

The main purpose of these different types of interviews is the same, but how they get there is obviously very different. No matter what kind of interviewing style is used, there should be a few questions that are always asked both for the interviewer and interviewee. For the interviewer:
  • "Why should we hire you?" - This may seem condescending but in actuality it's a valid question that any competent candidate should be able to answer easily.
  • "What in addition to your qualifications do you bring to the table?" - For instance, It's important that a Programmer show some form of creativity and an Artist a thirst for technical knowledge (or at least not an aversion).
  • Never EVER ask yes or no questions. This leaves conversations open ended and keeps the interviewee talking.

And the interviewee:
  • "Why should I want to work here?" - This is the most important question you could ask yourself.
  • "What EXACTLY would my responsibilities be?" - Make sure you know what you'll be doing (and watch out for the switcheroo).
  • "How do you encourage employee personal and career growth" - Not only does this question impress employer's, it's vital to the success of your career.

Both interviewer and candidate need to watch out for what I call "impostors" which can be both the company and the person interviewing. You'll know a company that's an impostor when they paint such a rosey picture that there's no way they could live up to that expectation. These companies are often desperate for employee's (due to high turn over or other factors) and are often not honest about work conditions, which are often very poor (see "Death March" ). Candidates who aren't capable but pretend to be (or are still aspiring to be) fit in the same category.

    Remember what I said about the interviewer being interviewed by the candidate? If you treat an interviewee poorly in an interview, it's easy for them to believe that's how they'll be treated there. Here are some ways to impress the interviewee:
    • Give them a studio tour
    • Show them your GAME!!!! Can't emphasize this enough. Too many companies seem afraid to show their game. Better to have a poor impression than NO impression. Your fancy idea won't be stolen, and if it is, why should you worry. You are the only one that knows how to pull it off, right?
    • Take them out to a nice lunch with people who have shown an obvious enthusiasm for the company (beware the "lurker"). STOP THE INTERVIEW FOR LUNCH!!! This is a chance to see the interviewee's personality, not his knowledge of calculus.

    The last thing to mention is actually one of the first things to happen, the phone interview. As the interviewer there are a few guidelines that should be followed:
    • NEVER have more than two people in the same room.
    • Don't use interviewer with strong accents (brits and scots especially - no offense guys!).
    • Read resume BEFORE the interview.
    • Keep it under 30 minutes unless it's going extremely well. Still, be aware how much time you're taking and offer to extend the interview for a later time.

    As an interviewee, it's likely you'll be very nervous during your first conversation with the company so keep these things in mind:
    • Find a nice, quiet place.
    • Don't pace.
    • Use a land line if at all possible! This avoids drop outs, phone delay and bad reception.
    • Have a notepad in front of you where you jot down notes and questions to ask.
    • Never EVER interrupt the interviewer (can be hard to avoid with phone delay). This kind of goes with the previous suggestion (write down your questions as they come to you). This should be used in all aspects of life really...

    The process shouldn't be grueling, it should be fun and rewarding for both parties. I hope you take these tips to heart and keep them in mind during your next interview. Though these tips are geared towards the game industry, proper interviewing etiquette works well in any field.

    Thursday, October 2, 2008

    D.R.M. S.U.C.K.'s

    For the second time in just a few shorts months, I am NOT able to play a game I legally purchased... thanks to DRM. DRM (Digital Rights Management) is a system used to enforce that a game is not illegally obtained (i.e. stolen). Instead, again and again I'm finding that all it's doing is stopping people who have a right to the product they purchased to be able to use and enjoy it. If anything is killing PC Gaming, it's not Piracy, it's DRM!

    I bought Spore the other day and for three days I was unable to play it, even though I could go right now and find a cracked executable to be able to run it. Heck, I can just go start downloading the torrent and within two days have the game as a whole. Come on EA (and other publishers like you), who are you really hurting here??? Myself and other paying PC Gamers, or the people who can get the game for free anyway, and more easily!? In addition to not even being able to run it now, once I DO get it working, I'll only be able to install it three times? No, not on just three machines, three installs, then I no longer own the game. WOW. And in addition to all that (yes, there's more), even though the manual says you are allowed multiple accounts per-install (so my Fiancee could have an account on my machine for instance), you're in fact only allowed ONE. What hubris! I still have my copy of The Sims that I bought, what, 8 years ago? And guess what, I've re-installed my copy at least 5 times since I purchased it, and both of us have been able to play it at different times. Can they really argue the top selling game of all time suffered from piracy so bad that it's spiritual sequel has to be so guarded!? I'm not the only one: 1 Star. Food for thought. On the bright side it looks like they're listening to reason and might change a few things for the better (i.e. adding deactivation so you could reclaim your installs), but it's still pretty sad it got this far.

    Anyhow, life's been hectic in North Carolina. Starting work has been great and I really enjoy it so far. Destineer is a great company with a lot of great people. There's definitely a lot of great things to come from it in the future. Saturday is my birthday then next Friday I'll be up in New Hampshire to get married and man has it been crazy getting the last remaining details worked out.

    I was finally able to get the Hexen Touch (Hexen for iPhone) source code up; here. If you're interested in iPhone development check it out. Disclaimer: The code is purely for learning purposes, is not at all supported, and doesn't represent the best quality possible. But it basically works so beggars can't be choosy. :-)

    Time is short. Until next time!

    Wednesday, August 13, 2008

    Good things come in threes...

    You know, it's amazing how life can move so fast sometimes. A lot of big things have happened to me in the past few weeks. To begin with, I've decided to pursue opportunities outside Firaxis. I really enjoyed working with everyone there (Sid Meier especially) on such an amazing franchise as the Civilization series but after careful consideration I decided it was time to move on. I learned a lot and am incredibly proud of my contributions and wish only the best for everyone there.

    As for myself, I'll be headed to a young but ambitious company named Destineer Studios based in Raleigh, North Carolina to work on their console technology for a currently unannounced title. I'm fond of the area (my parents have lived there for years) and was incredibly impressed by everyone I met there during my interview. After a month of interviewing and multiple offers around the country, I decided to take a chance and go with a company I feel will really make a difference. The people at Destineer (and when I talk about I company, I really do refer to the people - I mean seriously, what else gives a company it's strength), are incredibly talented, enthusiastic, and friendly and I'm very glad to be joining the team. I'm sure to have many more great things to say about the new job and the move in the coming months.

    So in addition to changing jobs and selling my house (in an amazing 1 week!), I just got engaged! We're trying to fit the wedding in within the next few months but we're not sure yet if that's going to be possible. We figure we can leverage the fact that we're doing all the most stressful things at once to reduce the possible stress later on, haha. Hopefully it'll all work out.

    As I hinted at last time, I've been working on the iPhone on some pretty neat stuff. One of the things I finished was a port of Hexen for the iPhone. I plan on putting the source code online as soon as I find some time. It's a pretty straight forward port and runs really well. Thanks to my friend Rich Whitehouse for his help (the port is based on the work he had done for his Nintendo DS port of Hexen). In the end it was really fun and I learned a lot. It's quite surprising what the iPhone can do and I'm looking forward to doing some more work on it.

    In addition to my iPhone projects I'm thinking of writing an article on effective interviewing techniques from the perspective of an interviewee. As I mentioned before, I've been through quite a number of interviews in the past month (something like 8-10), both over-phone and on-site. From this experience I've learned a lot about what an interviewer should and shouldn't do to both represent the company well and impress the applicant. While I've seen a lot of articles on how to interview as an applicant, it's just amazing how many mistakes are made by the companies interviewing and I think there's some good things to be said about improving the process. I have some idea's on what mistakes a company should avoid and some questions that should and shouldn't be asked. Hopefully I'll have more on this soon...

    Lastly, here's some amazing stuff coming from ATI: WOW. The only thing is, 100+ MB a frame!? Hmm, maybe not so practical yet. Still, amazing that we're almost at the age of photorealistic gaming!

    Take care everyone!

    Friday, June 29, 2007

    The REVOLUTION begins!

    Yes, after all this time the game I've been working on at Firaxis has finally been announced!! Civilization Revolution is a continuation of the civilization series which takes it into a radical new direction (hence the interesting title). It's fast paced, visceral, and incredibly strategically engaging and has been an absolute pleasure to work on. It's been an incredible opportunity to be working with Sid Meier; definitely a a dream come true. I'm constantly learning something new and his level of genius never ceases to amaze me.

    The game is set to be released next spring so everyone will have to wait a bit longer before they can play it but there's an announcement trailer floating around along with some concept shots (like here). In-game screenshots will probably be released within the next few weeks, which is very exciting since that will actually show off some of the work I've done related to rendering and general graphics work. The game is looking phenomenal and I think will definitely surprise some people who thought a studio like Firaxis couldn't pull off the next-gen look.

    All in all it's very exciting to finally be able to talk about what I'm working on. It seems like so often everything I do is cloaked in secrecy. From one project to the next, I get maybe 6 or 7 months where my friends and family can know what I work on, then on to the next 2 year (on avg) secret development cycle. I suppose in modern times it's a necessity in order to avoid over-exposure (ehem, Duke Nukem Forever anyone?), especially on a game like Civilization that's constantly being tweaked and relies so much on iterative design to ensure the most balanced and enjoyable gameplay.

    So even though the past few weeks have kept me very busy at work, I've still had a lot of time to get a lot done at home. I've taken up collecting Star Wars: CCG cards again, which is unfortunately quite an expensive habit (seeing as they haven't been made in years). It was probably my favorite card game growing up (more so than Magic: TG) and even after all these years impresses me with it's strategic complexity and depth.

    I'm also really enjoying playing with the adorable little puppy we got about 2 weeks ago. It loves to keep me up at night which is just great... yeah. She's a miniature schnauzer, and incredibly cute, but, ugh, getting a new pup takes a lot of initial effort.

    As far as Star Trader work, most of what I've been working on in the past few weeks as been conceptual design work. The combat system is almost completely planned out and just needs to be implemented. I have a document that's something like 20 pages long and goes incredibly in-depth into all the space combat specifics. The last remaining detail actually involves interface design and how a bigger ship's weapons will be fired by the player (for instance, the turret hardpoints on a capital ship as well as any energy beam emitters and torpedo launchers). I'm trying to keep things as simple as possible while still keeping the player involved (via tactile interaction). This means I'm shying away from automated firing but I think this may come back to haunt me.

    I've actually gotten quite a bit of code work done as well. In the past few weeks I completely integrated the new very efficient font and gui element (quad) rendering I had prototyped a few months ago back into the main engine codebase. I can now basically render the entire GUI in a single draw pass if I setup my textures intelligently (by texture atlasing for instance).

    I also completely revamped my entire GUI system to use xml. It supports a brand new animation system and uses a much better skinning solution which relies upon a few layers of abstraction to reduce complexity. A GUI file defines a layout and a skin. A layout once finished should never change and contains all the windows with the different gui controls that represent any given user interface. The skin file however contains control templates and properties, which define the look and feel of the GUI and can be changed at will. I have a feeling I'll probably be working on all of the layouts and templates and eventually when I get an artist to help out (hopefully sooner than later), he'll be swapping out new art and assets in the property files.

    The other thing I finished was adding support for the 360 controller to the game. I recently purchased a wireless Xbox 360 controller and PC wireless adapter for this purpose. It's actually a great controller and works great for playing some Tie-Fighter or Freespace 2. So far I've only implemented controls for the new GUI stuff I had been working on but the plan is eventually allow for complete control of the game through the Xbox controller. Now I'm not of the mind that all game genres perfectly translate to a gamepad controller (first person shooters for instance will NEVER play as good as a mouse/keyboard combo), but I think that Star Trader really is perfectly suited to allow for all levels of control strictly from the gamepad. I actually think it may work even better than the mouse/kb and have a lot of great idea's about how to make the player interactions with the controller completely seamless requiring almost no thought. I'll have more details about this at some point but don't worry, I'm definitely planning on keeping things as simple and straight forward as possible. This situation is certainly something I plan to avoid.

    Another thing I had been playing around with is screen-oriented billboard line drawing, which I plan to use these for lasers and exhaust trails (think Homeworld). Although the basic implementation is complete, there are a few issues I still need to work out. Basic laser projectile code is up and running though but I really need to get the ship combat system back up and running. It's been down for a few weeks as I've been revamping my entity management and zone systems. I basically NEED to finish my zone system by next week or progress with the game is going to be completely stalled. I have some idea's about how it should work but right now I'm trying to figure out the best way to implement it with the least room for programmer error (i.e. where's entities aren't accidentally placed in the wrong zone, or objects render incorrectly because of wrong zone ownership).

    Alright, that's all I've got for now. Have a good one! Later!