I'm a self-confessed computer geek (see, I just confessed to it), and as with most such geeks I love programming. I will program anything and everything that interests me, and there lies the problem: there's too much of it, and I don't finish anything. I usually get stuck architecting and implementing stuff I don't end up using (look up "axe sharpening" and "yak shaving"). And then I slow down with the overall project, and I'm eventually left with another piece of abandonware. I'm tired of ending up with nothing to show for myself when I undertake these projects, so I'm issuing myself a challenge: over the course of the next year (with this post marking the start date) I will work on one project and one project only. Mimimal yack shaving, minimal features, and good-enough code will be the motto. The project I'm choosing is one for which I already have some experience, and for which I know there's a lot of good resources to help me out: a GPU-accelerated 3D engine (yes, I know there are loads of those out there, but there will be a slight twist to mine; keep on reading). Here are the features I'm going for (and these features only):
- Support for one format for indoor scenes (one of the BSP formats most likely).
- Support for one format for outdoor scenes (octrees, CLOD, or some such).
- Support for one format for characters (will likely be MD5, though I may go for one of the older formats).
- Support for one format for static models (Milkshape obj perhaps).
- Support for basic skyboxes (just to make the scenes complete).
- Support for mixing any of these in any way I want (I already have a comprehensive design document on how to do this).
For hardware acceleration I will be using OpenGL. No DirectX; I'm on a Mac so that's not an option. And I won't be setting up my engine so that I can later easily choose one or the other (I don't care about that anyway). Windowing will most likely make use of SDL, mostly because there's a lot of documentation and help for it, and because it will help me stay multi-platform. Now for the twist. I have started a similar project once with a friend where we used Java as the implementation language. I really don't want to use Java anymore. It was once good-enough for me, and it's still the language I'm most fluent in. But I've had enough. So instead I'm going to do my 3D engine in Lisp. ***Pause to let readers catch their breath. With me again ? OK.*** Honestly, I don't think this is much of a shocker, but I know some of you may find it strange anyway. Seen as I can't find any 3D engine in Lisp I'm guessing it is somehow not an obvious pick for most of you. Still, I'm hoping this will count as something new and interesting to more people than just me. As for art/assets, I will stick to what I can find freely online, though I will allow myself to reuse some of the assets I made for my Java engine. I can tell you now that this restriction will likely be even more of a challenge for me than the technical stuff. Even not doing anything on the design for this blog is making me itch... Just to be clear about this: I will consider my project a success when I'm one year further on and I have kept my focus on this project and this alone. That is: no other projects were started (though, of course, I won't count anything I'm doing for work, nor anything which I'm working on to help out someone else), and this one has not been abandoned. Not implementing all features will not count as a failure (as I have no idea how much time each feature will take nor how much time I will have overall), but spending too much effort on unlisted features will. Now for the blog-part and you, the reader. In order to keep myself focussed on my goal I'm setting a task of minimum of one post per week listing what I did or did not do during that week. You will get the right to call "shenanigans" whenever you feel I'm straying too far from the challenge. I'm hoping you won't need to but, then again, if I knew for sure I wouldn't be needing this blog/challenge anyway. And with all that, here's hoping I won't fall flat on my face. :-|