Problem:
There are some major inconsistancies concerning how .ase model files are loaded and parsed in Radiant and Q3Map2. The issues are:
- GtkRadiant 1.4.0 and 1.5.0 don't work the same way.
- Editor images may differ than the shader name, but we are currently forced to assume that they are the same.
In 3ds MAX, I loaded up the bitmap (textures/obsidian_steampunk/brass_dirty.tga) in the material editor and assigned it to the model. Then I exported to .ase. Here is a select portion of the .ase file showing the material list:
*MATERIAL_LIST { *MATERIAL_COUNT 1 *MATERIAL 0 { *MATERIAL_NAME "models/obsidian_steampunk/brass_dirty" *MATERIAL_CLASS "Standard" *MATERIAL_AMBIENT 0.5882 0.5882 0.5882 *MATERIAL_DIFFUSE 0.5882 0.5882 0.5882 *MATERIAL_SPECULAR 0.9000 0.9000 0.9000 *MATERIAL_SHINE 0.1000 *MATERIAL_SHINESTRENGTH 0.0000 *MATERIAL_TRANSPARENCY 0.0000 *MATERIAL_WIRESIZE 1.0000 *MATERIAL_SHADING Blinn *MATERIAL_XP_FALLOFF 0.0000 *MATERIAL_SELFILLUM 0.0000 *MATERIAL_FALLOFF In *MATERIAL_XP_TYPE Filter *MAP_DIFFUSE { *MAP_NAME "map #1" *MAP_CLASS "Bitmap" *MAP_SUBNO 1 *MAP_AMOUNT 1.0000 *BITMAP "D:\GameDev\Quake3\blastburn\textures\obsidian_steampunk\brass_dirty.tga" *MAP_TYPE Screen *UVW_U_OFFSET 0.0000 *UVW_V_OFFSET 0.0000 *UVW_U_TILING 1.0000 *UVW_V_TILING 1.0000 *UVW_ANGLE 0.0000 *UVW_BLUR 1.0000 *UVW_BLUR_OFFSET 0.0000 *UVW_NOUSE_AMT 1.0000 *UVW_NOISE_SIZE 1.0000 *UVW_NOISE_LEVEL 1 *UVW_NOISE_PHASE 0.0000 *BITMAP_FILTER Pyramidal } } }
I have two versions of the shader, one for use on brushes and one for models. Both shaders point to the same bitmap files, but the shader names are different.
// FOR USE ON LIGHTMAPPED BRUSHES textures/obsidian_steampunk/brass_dirty { q3map_bounceScale 2 { map textures/obsidian_steampunk/envmap/brass.tga tcGen environment } { map textures/obsidian_steampunk/brass_dirty.tga blendFunc blend } { map $lightmap blendFunc filter rgbGen identity } } // FOR USE ON VERTEX LIT MODELS models/obsidian_steampunk/brass_dirty { { map textures/obsidian_steampunk/envmap/brass.tga tcGen environment rgbGen vertex } { map textures/obsidian_steampunk/brass_dirty.tga blendFunc blend rgbGen vertex } }
Problem #1 starts with the inconsistancy between how GtkRadiant 1.4.0 and GtkRadiant 1.5.0 loads textures in .ase models. GtkRadiant 1.4.0 looks at the "*MATERIAL_NAME" entry and uses that to interpret the location of the bitmap, in this case, "models/obsidian_steampunk/brass_dirty". GtkRadiant 1.5.0 looks at the "*BITMAP" entry, in our example, "D:\GameDev\Quake3\blastburn\textures\obsidian_steampunk\brass_dirty.tga". In that regard, to get the model to display properly in both versions of Radiant, "*MATERIAL_NAME" must resemble "*BITMAP".
To confuse things even more, we have problem #2 in such situations as this where the bitmap name and desired shader are not the same. Currently, Q3Map2 parses the "*BITMAP" line of the .ase and interprets it as the shader "textures/obsidian_steampunk/brass_dirty", which is the right texture, but not the intended shader.
This makes things incredibly difficult for the modeler/shader-writer/level-designer who is trying to maintain both consistancy of the file format and trying to get the right textures to load in each editor and in-game.
Recommendations
Ideally, a solution shouldn't be too difficult. We can let GtkRadiant 1.4.0 parse the "*MATERIAL_NAME" value while GtkRadiant 1.5.0 parses the "*BITMAP" value, both of which can be changed to point to the same image file. But note the unused "*MAP_NAME" entry? We can use this to as the default value for Q3Map2. So when Q3Map2 parses an .ase, it will first look at "*MAP_NAME" for the shader, if nothing is found it will check "*MATERIAL_NAME", and if either values are missing or incorrect, it will look at the "*BITMAP" entry and use the raw bitmap instead of a shader.