- latest work
- screenshots
- downloads
- tutorials
- about me



intro: the grain engine is an experimental 3D engine that I'm developing independently to implement and work with several well known real-time 3D graphics techniques as well as to explore and develop various "new" ideas i have. grain is not a game. nor will it likely ever be "finished". its a testbed, a tool if you will, for my research. it may evolve into more than this eventually.


the grain engine - an experiment in 3D technology.
copyright (C) 1999 kurt miller.
  Site Current State 28 May 2002 (10:00pm) - Tueday Evening  
I still get the occasional e-mail about grain, so I thought it time to update this site. The grain project hasn't been touched in well over a year. I've started my own small game company (Gradient Studios), and have been focusing my coding efforts toward that and other projects. The grain "technology" (if you will) still exists, but the rendering pipeline and tools are rather outdated. Hardware has changed so much since the care free days of rendering polygon by polygon and doing special effects by brute force texture passes. I expect to modernize (more like rewrite) the engine for my lil' company when the time is right, but for now please don't expect that this site will be updated with any grain-related news or features. I may eventually start updating this site again with some of my R&D notes for my next project, but its not quite ready yet. Thanks again for your e-mails and comments.


  In-Engine GUI Demo 22 April 2001(11:13pm) - Sunday Night  
Eh, so many things have happened since my last update. Between moving to a new city, working on several projects simultaneously, and doing a lot of research, I've been rather busy. But I have added several things to the engine in my "free time", and plan to rewrite several others. One of the more interesting things recently added is a new GUI system. I'll talk about it for a few minutes, and post a small demo that I put together about a month ago.

The GUI system has three main components. The Skin Editor, the Resource Editor, and the window system code itself. The first two are tool applications. The Skin Editor looks like this:



Click for larger version.

As you can see if you click on the image for a larger version, the Skin Editor allows the user to specify portions of images to be used for window or control skin elements. The user simply moves/resizes the rectangle assigned to each element, to the portion of the image he wants. For example I can put all of the images for various buttons, check boxes, etc on a single TGA, then use the skin editor to specify what's what. Saves on texture changes and so on. The skin I made, shown in the image above, isn't exactly the greatest, but the editor allows the user to make quite a variety of funky window skins.

Next up is the resource editor. He looks like this:



Click for larger version.

Fooling around with the resource editor is sort of fun. Its much like MSVC's. The user drops in controls and moves them around. It saves them to a text file for manual tweaking if neccesary.

And finally, a small demo of the gui itself (not the tools). Nothing too special, just a few controls and a simple menu test. If you'd like to try out the demo for yourself, you can, but be warned that its not actually meant for release. I've not fully reviewed all my GUI code, so there may be some bugs and all of that. Bla, bla, bla. Anyway, grab the demo on the downloads page. I highly recommend that you don't run it in windowed mode (even though that's the default option), but it should still work. It just might be a little laggy.

As for me, I'm still working on other stuff, so grain usually doesn't get the attention I think it deserves, but I do have some major reworking of it (hardware has changed quite a bit since I started work on this thing) planned for the near future. More later. This page isn't dead yet.



  Nothing Important 06 October 2000 (4:55pm) - Friday Evening  
I'm working on a small project at the moment which uses parts of this engine, and parts of my larger "game engine" framework. I won't be updating this page for a while, as I'm quite busy with this work. I'll probably mention a few things about it eventually on this page, but please don't expect any updates in the near future. I'm not expanding much on the 3D tech right now.


  Constructive Solid Geometry 24 July 2000 (3:36pm) - Monday Afternoon  
Wow, its been a while indeed. Rest assured I haven't stopped work on the engine. Not by a long shot. I've just been busy doing other things as well, so I haven't had time to really stop and make an interesting update to this page. I've been interviewing around a bit with game/gfx companies, and I've also been putting a lot of time into flipCode. I've still been adding features here and there, but now I'm back on track with the engine and work should hopefully progress rapidly. Anyway, lots of things have changed with the engine, many of which I'll talk about soon in other updates. But for now, I'll just talk about what I'm working on currently. For the past day or two I've been playing with CSG, aka Constructive Solid Geometry, which is the process of constructing objects from other objects that are usually simpler. The results have been pretty cool so far. This is done through union, difference, intersection, or subtraction operations. For example if you put two lovely spheres in place, with each one slightly inside of the other, the union would be a strange peanut-looking shape. Don't believe me? Have a look:


Figure 1) Completely Unoptimized Engine CSG Test, Union Operation


What is that good for? All kinds of stuff! I'm using it as a tool in my world editor, though my engine is not based around CSG or brushes, etc. Suppose you want to make 4 connected hallways. One simple approach for the sake of example would be to make a box, then subtract another box from its center. Here's what it looks like:


Figure 2) Simple Example Of What CSG Can Be Used For


Then when you have that, you can continue subtracting blocks from the walls to get windows, doorways, etc. You get the idea. Here's another screenshot, this time with 2 more complicated non-convex objects. I know its hard to see what they are because of the wireframe rendering, but each object is a sphere thingy with 6 little cylinder-like appendages coming out of it. If that helps at all. The operation shown is the intersection, which means on the left you see both objects in their entirety; on the right is only what's "inside" of both objects.


Figure 3) Another CSG Example, Illustrating The Intersection Operation


The bad thing about CSG is that you usually end up creating a lot of extra polygons, some neccesary, others not. If you look at the two images above snapped from my engine, you'll notice that there are a lot of polygon fragments (splits) that don't need to be there. The reason for that is, what you're looking at are screenshots from my completely unoptimized CSG code. I just finished writing it about 10 minutes ago :]. Soon it will go back through and optimize the resulting poly set as best it can, but for now I was just trying to get things working properly.

CSG can be done a number of ways. There are quite a few resources and papers out there on doing CSG with bsp trees, which at first I was against. My engine doesn't really use bsp trees anywhere else, so I thought it would be a waste to use them strictly for CSG. However, after experimenting for a while, I came to the conclusion that most of the b-rep csg algorithms and ideas I was trying had preparation times that were worse than just building the darn bsp tree. I implemented a bsp version and quickly realized that the speed hit is "ok". For those objects above, which are reasonably complex triangle meshes, the (unoptimized) bsp tree construction came back really quickly. It felt kind of weird to write a new bsp tree compiler just to do CSG, but a bsp tree is fundamentally a very useful structure, so I'm sure I'll be using it for something else in the future anyway. Until I find a better way to do CSG without bsp trees, I'll stick to this approach since it works well. If you want to know more about my implementation, feel free to contact me.



  Sky System Demo 16 April 2000 (6:37am) - Sunday Morning  
I had this vicious urge today to take a break from the engine's object code for a day and write up a new sky system. Its not a big deal or anything, but I decided to post a demo of it anyway in case you wanted to check out more than just a screenshot. Speaking of which, here's a shot of the new sky system in action:



The mountain in the shot is part of a static backdrop (not part of the real polygon world), and the sky has an animated layer that scrolls by. I'm still doing a little bit of fine-tuning, and the cloud artwork could use some work, but other than that, it looks pretty decent animated. Check out the demo on the downloads page. I'm now back to work on the things I talked about last time.


  New Screenshots & Job Search 14 April 2000 (11:20pm) - Friday Evening  
Before I get on with the actual engine update, I must take a moment to rejoice because this school year is very quickly coming to a close. *deep sigh*. Anyway, I'm currently looking for a programming job (3D tech preferably, pretty much anywhere in the states), (hint hint :).

Ok, with that much out of my system, I'll continue. I took 2 new screenshots of some things I've been working on. First and foremost, the engine's world editor that I've been writing is pretty much complete. Its fully functional, but there are still some small details I'm wrapping up. I've been using it to create some interesting test worlds. I'm currently working on a new demo that shows off some of the engine's features, including a much more interesting level. I don't know how long that will take, but now that the editor's done, hopefully not too long. I might post some incremental versions here for people to test out. Anyway, I made a simple room populated with some curvey geometry using some of the new modeling features in the level editor, and took a screenshot to show you a bit of what it can do. I didn't throw in the lighting yet, so it doesn't look as good as it will soon, but you can see the shot from within the engine, and also from within the editor. Take a look:

 


As you can tell, in the first screenshot there's no lighting, and its only 1 room. But the cool thing about it is that pretty much everything you see in the shot is completely scalable. When the viewer is far away from the pillars and arches, they can easily be re-tesselated with only a few polygons. The same works in reverse: when the user is close to the objects, the polygon count increases to present much better looking scenery. The other interesting thing is that with the level editor, there's a "furniture builder" (not shown in the screenshot), which helps create objects such as these, with very little effort and many tuning options. I'm pretty happy with the system, and I might write a document about it when I have some time.

Anyway, I hope you like the screenshots. I'll try to keep this page a little more up to date, but things are a little difficult when running flipCode, finishing up the semester, coding my engine, and not sleeping. Anyway, I'm off. More later.

Also, if you're interested in octrees, I wrote a mini-tutorial in my tech file.


  Few More Things 08 April 2000 (3:03am) - Saturday Morning  
Just making a quick update. I've been updating my tech file with a bit about the engine from time to time, rather than this page. I'm working on a new demo, with a ton of new features, but most of the quiet time for the engine has been due to me working on the level editor on and off for the past few weeks. The editor now supports general polygon modeling/manipulating, curved surfaces, and something else I call "furniture". I'll be updating this page (or my tech file) with a bit more on this as well as a few rendering optimizations I've been thinking about. I've been up to much with very few restful nights. A lot of this time has also been spent working on some server changes and upcoming features on flipCode. Anyway, more later.



      Previous Pages Of Update Entries:
  • February 2000
  • January 2000
  • December 1999
  • November 1999
  •   Screenshots For This Month:
    These are the screenshots for this month.
  • 04/16/2000 - Sky System Screenshot
  • 04/14/2000 - Scalable Geometry Preview Shot
  • 04/14/2000 - New Level Editor Screenshot
  • Check out the full index of screenshots here.






    copyright (c) 1999 kurt miller. all rights reserved.