![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
So here's my breakdown on what I know about the RS files. If something is incorrect, don't be afraid to point it out. I am just going based on my own experience with these commands during my modding adventures.
![Razz :P](./images/smilies/icon_razz.gif)
The RS files define the "material" for the faces on a mesh ingame. RS files are only used with SM files and the terrain (WaterShader.rs found in each level RFA). TM files (TreeMeshes) don't use RS files from what I can tell as they store the texture path in the TM file itself and don't allow any custom material settings. The only other geometry class able to use RS files is the SimpleGeom geometry class, but explaining that geometry class is best saved for a different topic.
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
Example of a valid material as defined in a RS file. This could be the only material in the RS file or it could be one of many. If a LOD mesh is exported with multiple materials then you'll find more then one in the RS file.
Code: Select all
subshader "decal_scorch01_m1_Material0" "StandardMesh/Default"
{
lighting true;
lightingSpecular false;
materialDiffuse 0.588 0.588 0.588;
texture "texture/Decal_scorch01_c";
blendSrc sourceAlpha;
blendDest invsourceAlpha;
transparent true;
depthWrite false;
}
So now I will explain each line of code in the RS file.
Code: Select all
subshader "ExampleMesh_m1_Material0" "StandardMesh/Default"
The first setting defines the name of the material defined in the SM file. It must match the material name in the SM file for it to work. That's how the game knows which material and thus which faces on the mesh that material should be applied to. BF2/BF2142 merged the material code into the mesh file so it's not as easy to minipulate. But in BF1942 (thankfully) this is all stored in the RS files.
If a SM file has a material not defined in the RS file, the game will use the default shader color on the material instead.
Example, in the init.con file the command that defines what color a broken shader will have. (in maps that don't have this command specified, the color will be black)
Code: Select all
shaderManager.setDefaultShaderSolidColor 0.2/0.2/0.2
Also, odd things happen if there's a missing/broken shader on a material that is lightmapped. The second half of the shader command defines the shader type. "StandardMesh/Default" is used by most/if not all SM files. "PatchTerrain/Water" is used exclusively with the water used on the terrain. (found in the WaterShader.rs file).
I would not recommend you attempt to use the PatchTerrain material type on a SM file as it can cause massive graphics bugs with nearby objects. The one exception is the SimpleGeom geometry class which does not induce this bug with SM files because unlike other geometry classes, this creates a geometry entirely with code and only uses a RS file to define the texture. So no SM file is loaded. Though this geometry class doesn't support alpha which results in water textures not looking correct on it. So it serves little use with this geometry type.
Code: Select all
lighting true;
Enables lighting. Example: Sun light direction will light object but faces that are facing away from sun will not. Turning this off will result in all faces being lit the same. Though this will not impact it's behavior with the lightmapshadowbits.lsb file for the level. If the object goes into a shadowed region, it will still get darker. Also, if the object has a lightmap channel, then this command seems to have no effect on the mesh anymore.
Code: Select all
lightingSpecular true;
This enables "shine" on a mesh. Typically used on vehicles. I think having a lightmap channel on the mesh will also cause this command to no longer function.
Code: Select all
materialDiffuse 1 1 1;
Honestly for static objects anyway, I have seen this command have little impact on anything. Perhaps it only functions if lighting is disabled or when the mesh has no uvmap channel for the lightmap channel. It's a float value with 0 being lowest and 1 being highest. First number is for Red, second is Green, and third is for Blue. I'm thinking perhaps instead, this command defines to what degree the map's global DiffuseColor setting impacts the material in question. Same may hold true with the materialSpecular command.
Code: Select all
materialAmbient 1 1 1;
Similar to mateialDiffuse. This is a little used command in Battlefield 1942. (in fact I don't think it's used anywhere in the vanilla files) It's used most often in a older game that uses the same game engine. Rallisport Challenge uses this on many of it's meshes. It uses the same number system as MaterialDiffuse and MaterialSpecular. I would have to assume this impacts the ambient color of the material. Basically sorta like a global brightness of the material.
Code: Select all
materialSpecular 1 1 1;
Defines the color for the specular effect. Works in the same way as the MaterialDiffuse and MaterialAmbient commands.
Code: Select all
materialSpecularPower 10;
Defines the "power" or intensity of the specular effect used on the material. It's a single float value. Not limited to 0-1. You can use 40 as a value for example.
Code: Select all
texture "texture/YourTexture";
Obviously this defines what texture to use. If you don't want a texture on a material, you can leave this command unspecified. The game would then use the default texture (usually 50% gray in vanilla BF1942).
Do not use the ../ method to attempt to path outside the RFAs. This will result in a CTD. Instead to path to an external texture (most commonly BIK files) use something like this: "Mods/YourMod/Movies/YourBIKFile.bik"
Code: Select all
envmap true;
Enables the environment cube map. These are the 6 DDS files the level's RCM file assigns as a fake reflection of sorts. The alpha level in the texture defines the intensity of the reflection effect. The object does not need to have transparency enabled for this command to work. So it can add a reflection effect to both a transparent object (like a window) or a non transparent object like a vehicle's bumper chrome for example. Though the main requirement is that there be some degree of alpha in the texture file. Simply enabling this command won't instantly mean having a reflection on anything you want. You will also have to add alpha to the texture so the game knows how much of the material will be the reflection.
However note that it appears to no longer function on statics with a lightmap channel if transparency is disabled. Windows can still have the reflection effect because they have the "transparency true" command. But if this command is not specified or you don't want the material to have transparency, then you can't have environment map reflection for the lightmapped object in question.
Code: Select all
transparent true;
Enables transparency. Is not the same as the alphaTestRef command. This allows full use of the alpha channel in a texture for gradual degrees of transparency. Do NOT enable this command on materials used on a AnimatedMesh geometry. It appears AnimatedMesh objects don't support this method of transparency and will become completely invisible if you attempt to use this. AlphaTestRef however still works for AnimatedMeshes, so your stuck using that if you want any alpha in your AnimatedMesh.
Code: Select all
AlphaTestRef 1;
A single pixal in the alpha channel of a texture usually has a grayscale value of 0 through 255 with 255 being white and 0 being black. In BF1942, this means a pixel is 100% alpha at 0 and 0% alpha at 255. This command sets the "cut off point". A alphaTestRef value of 0.5 for example will have any transparency value above 50% become 100% transparent. If you want a completely invisible material, you can leave out all other commands and simply use alphaTestRef at a value of 1. It will make the material 100% alpha regardless what texture or lack of texture used on the material.
This command can be used in combination with the transparent command. But is most often used on it's own. Best used if you don't want any partial transparency on a material and want hard edges or need to enable simple transparency for AnimatedMeshes (since full transparency doesn't function correctly for AnimatedMeshes).
But if you want softer edges or partial transparency, you'll need to use the transparent command to enable that.
Code: Select all
depthwrite true;
The default value for this command is true unless otherwise specified in the RS file. From what I can tell this alters how multiple transparent objects/materials blend with each other. Turning on depthwrite will result in any other partially transparent material/object becoming 100% transparent when viewed through a material with this command enabled Thus resulting in them becoming invisible.
However if you disable this command by specifying it with the false setting. This results in any material with partial alpha being visible through the material. HOWEVER! I've noticed with treeMeshes that they will not be obscured at all by the transparent material as a result so they appear to be "infront" of the mesh instead of behind it because the material isn't dimming or otherwise causing any obstruction to the rendering of the sprites/branches on a treeMesh.
Code: Select all
twosided true;
This enables backfaces of a material to become visible. Useful for single sided faces you want to make double sided without having to create duplicate polygons via Gmax/3DS Max. Does not impact collision meshes, so if you want a double sided collision mesh face, you'll still need to export the mesh with the collision mesh having duplicate polygons with the normals flipped if you want the collision to be double sided.
![Wink ;)](./images/smilies/icon_e_wink.gif)
Same holds true for shadow meshes. You also have to manually create extra faces if you want them to be double sided. The exception being the AnimatedMeshes as they do not use a shadow mesh. They use the lowest detail LOD of a SM file for shadow generation. (Example, if you exported a animated Mesh with LOD01, LOD02, and LOD03, LOD03 will become the shadow mesh for the mesh. This is why removing the low detail lods from a soldier mesh for example will improve the shadow mesh accuracy in BF1942. Though I've noticed in Battlefield Vietnam they changed it so the game engine uses the first lod instead of the last. So shadows would look better in BFV.
Code: Select all
blendSrc sourceAlpha;
blendDest invsourceAlpha;
DestAlpha
DestColor
InvDestAlpha
InvDestColor
InvSourceAlpha
InvSourceColor
One
SourceAlpha
SourceAlphaSaturate
SourceColor
Code: Select all
texturefade true;
This enables texture fade function. The geometry template must also define the distance for this fade to start at. (example: geometryTemplate.textureFadeMaxDist 70 )
So for example, with materials with the fade function enabled, if you are within the 70 meters defined by the textureFadeMaxDist command for the geometry template of the object, then the material is invisible. If however you move away from the object and begin to approach the 70 meters that command defines, the material "fades in" until it's 100% opaque (or as opaque as it's alpha channel allows if it has transparency enabled, though I've never seen the fade command used in combination with the transparent command, so I don't know if they even work correctly together).
Also if you are needed to make a material invisible and wish to save on file space you can do something like this and it will still work.
![Very Happy :D](./images/smilies/icon_e_biggrin.gif)
Code: Select all
subshader "ExampleMesh_m1_Material0" "StandardMesh/Default" { alphaTestRef 1; }
If you look inside them, they use commands that no longer exist in BF1942. They also use "shader" instead of "subshader" to define the materials as well. Something else BF1942 doesn't support anymore. Perhaps they are left overs from early development.
Those are pretty much all the RS file commands I can recall off the top of my head.
![Razz :P](./images/smilies/icon_razz.gif)