Driver Madness is the world's largest fan-site for the game series Driver, Created by Reflections. Come and join us if you would like to talk about the game series, Or any game, Or even if you just want to chat!
This is really amazing man
Sweet Zombie Jesus.
That is AWESOME.
Great job.Thank you!
Too bad the 2 links are in german language. Not easy to understand it even with a translator lol, and even if i have studied this language over two years, when i was young.Same here with french I'm just restating some facts we already know from Driver Texture Editor:
Disturbing: what required a high-end PC 14 years ago, I can now render without culling as non-indexed triangle list. At 200 fps. (My system is four years old, so it's rather ten years.)
Driver has also been a PlayStation game, and you can tell this from its data structure. I took time for it because I'm stuck decoding Driver 2 data (which is PlayStation-exclusive).
Most of this has been found by someone972 for his Driver Texture Editor, which I pretty much built upon:
The cities are saved as collections of blocks (because memory is spare and seeking on the CD drive is slow). The New York level seen on the snapshots, for example, is 4×4 km in size, consisting of 8×8 blocks.
Each block references a global model list. The list is 1030 models large for New York, and each model is instantated at any position with an optional rotation about Y, but without scaling.
Models covering more than one block are stored to an additional global block. So in fact it's 65 blocks for New York.
The models have faces, but not necessarily vertices. This is because many buildings differ in color and texture only, but not in geometry. In such cases, models point to vertices of other models. Furthermore, they have bounding boxes and clipping planes. Finally, there is motion capture data for animating people and paths for simulating traffic.
The faces are stored in an awful format: as triangles or quads; with or without texture; with or without vertex color; with or without normals. Of those there is, depending on shading mode, one or two or four. Each combination of these attributes is a unique format and requires dedicated code. I don't know why this has been done on such weak platforms like PlayStation, and whether it was obfuscation. But it was certainly continued for Driver 2.
Because Driver takes place at night often, many faces have normals. In the actual game, a point light is attached to the player.
The vertices are stored as floats in the PC version. But the coordinates are perfectly even and scaled by 256. I therefore assume, the PlayStation version uses 16 or 24 bit fixed-point numbers. Angles and normals are stored in 13 signed bits.
Textures are 8 or 16 bits per pixel. 8-bit textures are palettized, and have a set of up to eight palettes for different times of day and tasks — a tree texture, for example, is recycled as a tree shadow texture with a pitch black palette; cars are identical but their palettes differ for different paintings; and so on. 16-bit textures are RGB or RGBA or none of those; I'm not sure yet.
All textures are 256² (which is typical for PlayStation), and must be considered collections of regions (so-called texture windows). The hardware clamps filtering to these regions at drawing so their neighbours don't bleed in. Emulating this is quite a challenge and will keep me busy; that's why the textures are so ugly on my snap shots.
New York is built from 70,000 model instances with about 300,000 triangles in total. Currently, I'm combining all faces to a 40 megabyte vertex list, where I also store each face's texture index. The 170 textures are converted to 24-bit RGBA and stored in a 256×256×170 texture array (about 30 MiB total). The city is drawn in a single draw call; the texture index from the face is passed from the vertex data through the vertex shader to the pixel shader to be looked up in the texture array.
The three other cities (Miami, Los Angeles, San Francisco) have similar dimensions and data sizes. The apartment from the cut scenes is much smaller. I could not load the training level yet; the format does not play out exactly.
I'm sure Driver Texture Editor helped you a lot (I had a look at it (at its source)).Indeed; especially the face decoding has saved days of work for me. It's a pity I didn't find this tool earlier.It's nice of you always sharing your knowledge in this forum. Thanks again.You're welcome; you see, for obvious copyright problems I can't just put it up for download.
In the meantime:
I mostly solved the transparency issues: paletted textures are always opaque; in 15-bit RGB textures, the color key (1, 1, 1) [0x4321 hex] denotes full transparency. I have yet to understand what the 16th color bit is for. It may be an additional bit of accuracy for one of the color channels.
Furthermore, I perform some trivial lighting calculation on the surfaces. The effect is massive though, because linear color space shading makes the haze very appearent in front of shady places.
16 square kilometer's per city is pretty big man, at least for a PS1 game :OYes, but you need to consider not all 16 km² are covered. In NY, only 10 are actually used, and the others are empty. I guess Driver 2's cities are even larger, and I am very keen on extracting them
Pretty mindblowing to know how such a big sized city can be handled by 4 to 6 rams of memory, nevermind Director Mode to boot!
Yes, but you need to consider not all 16 km² are covered. In NY, only 10 are actually used, and the others are empty. I guess Driver 2's cities are even larger, and I am very keen on extracting themWell I figured out sofar LA isn't using all of the availble size (most likely only half of it). Anyway still an impressive feat even when not all of the availble size is used, since there are enough other PS1 games that can't make such a great use of the limited RAM memory.
Also, much of this has been known for long from DTE2's source code.
I have some more screenshots in the pipeline, stay tuned.
Finally, a sign of life! :-D I was already afraid […]
you're welcome, my congratulations on the mod is a[…]
Yeah I mean, it could go into any direction. Refl[…]