Yeah... all with quads....
Good man, I'm not fond of people who use sprites as they are just bastardised quads anyway!
It supports real ttfs, "fake" ones (raster fonts with variable width) and monospaced.
Of course you can't use real ttf's in Direct3D they have to be rasterised first. And those built in DrawText commands are SLOW as hell, better to draw your own font renderer.
I found a lot of programs that converted ttfs to bitmaps but I didn't really care for them, mostly because I needed something tiny that I could call on the fly (when doing screen rotation I rasterize ttfs on the fly to make things simplier). My "format" uses a very K.I.S.S. approach. When making a font from a ttf, I simply print each character onto a magenta background and save it to file. With autosize turned on a label with the correct fontsize and type applied, I can get the spacing info from that and I simply print the character to a picture box and save it. Because of this kerning and what-not becomes a non-issue because the spacing of the ttf is applied to the bitmap image. I also have a simple ini file that goes with each font that allows you to set overlaps and various spacing overrides for special effects. When converting you can also add extra whitespace to each character incase you want to add a drop-shadow in photoshop or something.
Yes one thing I haven't done is the "call on the fly" approach. Right now I'm limited to an external program ie.
Angel Codes Bitmap Converter and while it works great, I want to eventually internalize all the conversion and I mean avoiding them all together.
I would use a similar approach but it would all be internal using GDI+. No need for a magenta background as GDI+ works with full alpha channel. So when you create a blank texture, say at 512x512 it will have an alpha channel by default. Then you just have to draw the glyphs over the surface. The main problem is the measuring of characters. This is very complex. The best advice I can give you is to check out
this article and source code on the various API's for measuring text and chose one that is most relevant to your needs (obviously the one which renders the best text is the one to go for).
I decided to save each character as a seperate image for a couple of reasons. For one, this makes it so I don't need to write a file with coordinates for each character. Also this means you can get away with really really high-res fonts without having to setup a special function to chop-up the bitmap. It also makes things a ton of a lot easier for the user to edit. Making a sdl-like bitmap is a rayoal pain in the butt due to alignment and spacing and what not and it isn't always clear by looking which section represents a space, ect.... My images are named after the characater contained in them, so there shouldn't be any confusion. The only issue I had with writing my app is that I had to write a complicated api function that turns off font smothing on the app during the conversion process or else I get a ton of flash. It makes the fonts a tad blocky to do so, but it's definately better than the alternative.
I do like your idea of creating space between characters for shadows and effects in Photoshop, but I don't really like how you do each character separately in it's own file. No need for it as it would be crazy to have a character so large it needs it's own texture. Since were dealing with textures, best to pick a size, say 256x256 or 512x512 and stick to it to, draw every glyph on it, and save memory. Your a fan of optimization too, so that should make sense to you.
How can having each character in it's own file be easier to edit? Sounds like a pain in the ass if you want to add effects to a font set in Photoshop that way.
I've never experienced blockyness as working in a strictly alpha channel friendly graphics API you have natural anti-aliasing around the edges when your render a character. So I don't think your method is sound if you have blockyness.
As for actual ttfs, dx8 has some pretty good functions built in so I don't have to do anything to render them. My only complaint with the particular one I use is that it's slighly slower than using a similar raster font and it doesn't rotate easily. Actually I can make it rotate, but there's so much math and guesswork inolved in getting it aligned right that it's just easier for me to convert the font to raster when I rotate the screen. I use this function anyway though because it does very good font smoothing and makes ttfs look better than any other method I know.
Yes those built in text drawing routines are slow and nowhere near as "customizable" so I would stay clear of them.
As for rotation, I have all that sorted, including a split screen for cocktail mode. Some matrix transforms needs to happen to support mouse in that mode but it's all fun. I know you know a bit about my engine already from our talk on IRC. And I'm really not that phased if you do similar things in your own engine. I just like to talk about technical stuff so keep up your posts, they are often the most interesting ones I read

Yeah the viewports are setup similar to how you described and there's actually a good reason for it. My 2d stuff is pre-transformed polys.... that's so everything stays nice and flat. Your FOV can start messing with stuff if you only use true 3d geometry. If I use the same viewport for a 3d model and put it in the upper-left corner, for example, it'll always look like it's at a slight angle instead of straight on, which might not be the effect the skinner is going for. Because of that it's on a seperate viewport that has it's own offsets, so that you can make it look "flat" or "3d" like a fps would depending upon your settings. 3d lists have yet another viewport so that a cabinet model and the list can have different scaling methods and yet you can still easily put one in front of the other via zorder instead.
Like I said on IRC all my stuff is using normalized Vertex's. This is for an important reason and what will set my engine apart from other 2d/3d engines. Being able to apply Z depth to quads in my animation system means you can make any object perform a complex 3d animation. It really is key to what sets my engine apart. No offence but I haven't heard any new ideas yet.
I haven't experienced the FOV problem your describing there and my engine does support 3d models. It all depends on how you transform the matrix before you render. It shouldn't be a problem about angles, and there is not need for multiple viewports (I only use one).
Think about it; if every 2d element is on a 3d plain you can do far more cool animation effects than what your limited to with sprites or transformed verticies.
The video textures are pretty nasty. How I can do it in vb6 with dx8 is pretty much limited to sampling the directshow video playing and applying it to a texture. It's pretty slow, but luckily processors are pretty fast now days. It can chug if you are on an ancient (sub gigahertz) pc though. Speed aside, because it's put onto a texture I can do what I want with it. Works on the 3d models as well as my pre-transformed stuff and even 3d lists.
Yeah I was pretty sure you would hit this hurtle using VB6. The best way to render video onto a texture is using a custom VMR9 allocator so video rendering is 3d accellerated using your video card. I'm lucky in that the DirectShowNet library provides access to the DirectShow using a .NET wrapper.
I've done many experiments with DirectShow and it really does suffer if you capture frames manually and then lock textures to write to them. Using VMR9 I can have 4+ video's at the same time on quads without a huge FPS hit. It really is worth looking into, although I have no idea how you could do that in VB6. Perhaps there is a way?
I'm (as always) happy to chat and help out in any way I can. So keep the updates going!
