Adding Damage To Your Addon
ArmA 1 Forum, ArmA 1 Home, ArmA 1 Config, ArmA 1 Tools, ArmA 1 File Formats, ArmA 1 Missions, ArmA 1 3D Modeling, ArmA 1 Terrain, ArmA 1 Texturing, ArmA 1 Scripting
ArmA 1 aka Armed Assault (ArmA)
Adding Damage To Your Addon tutorial by Gnat
Draft Revision 0 - 18th June 2008
I won't pretended to be a definitive expert on this, but it seems no one else has compiled known bits all together.
What I will address in this tut;
- Adding damage textures over a model once fully damaged
- Animating sections of the model upon damage
- Basic windscreen damage
What I won't address (until further knowledge);
- Level 2 or intermediate damage textures
- Window armor
Scope
- Most if not all ArmA vehicles
- You can edit the P3D file (and have O2 installed)
Damage Textures
Step 1 - Face selection
- In all your Resolution and XXXX View LODs ensure the WHOLE vehicle is highlighted (ALT-A) in O2 and the whole vehicle is named “zbytek”
- If at any time you add to the model, ensure you Redefine “zbytek” to be the whole model again.
Step 2 - Material definitions
- In every Resolution and XXXX View LOD ensure every texture you plan to make damaged has a MATERIAL definition
- This also typically means each texture will also have a “_NOHQ.paa” and a “_SMDI.paa” version of the textures.
- CTRL-Click on a Texture in the texture list
- From the menu select FACES → FACE PROPERTIES
- Material definition appears in the lower right box
- If the texture does not have this, you probably have no choice except to create a Material definition.
Step 3 - Destruct RVMATs
- Once all textures have been checked / fixed you don't need to re-enter O2
- For each texture with a Materials definition you need to know 2 things
- (a) the file name and location of the NOHQ file
- (b) the dimensions of the texture (eg 1024×512 or 256×256 etc)
- Now create a FILENAME_destruct.rvmat for each texture using a copy of below;
ambient[] = {1,1,1,1}; diffuse[] = {1,1,1,1}; forcedDiffuse[] = {0,0,0,0}; emmisive[] = {0,0,0,1}; specular[] = {1,1,1,0}; specularPower = 40; PixelShaderID = "NormalMapMacroASSpecularDIMap"; VertexShaderID = "NormalMapAS"; class Stage1 { texture = "SIG_general\effects\bottom_nohq.pac"; uvSource = "tex"; class uvTransform { aside[] = {1,0,0}; up[] = {0,1,0}; dir[] = {0,0,0}; pos[] = {0,0,0}; }; }; class Stage2 { texture = "ca\data\destruct\vehicle_destr256_256_mc.paa"; uvSource = "tex"; class uvTransform { aside[] = {1,0,0}; up[] = {0,1,0}; dir[] = {0.2,0,0}; pos[] = {0.2,0,0}; }; }; class Stage3 { texture = "#(argb,8,8,3)color(1,1,1,1)"; uvSource = "tex"; class uvTransform { aside[] = {1,0,0}; up[] = {0,1,0}; dir[] = {0,0,0}; pos[] = {0,0,0}; }; }; class Stage4 { texture = "ca\data\destruct\vehicle_destr256_256_smdi.paa"; uvSource = "tex"; class uvTransform { aside[] = {1,0,0}; up[] = {0,1,0}; dir[] = {0,0,0}; pos[] = {0,0,0}; }; };
- These new files will have to be in the same directory location as you other .rvmat files
- An example; If the main texture is bottom.pac and the rvmat is bottom.rvmat, the new file should be bottom_destruct.rvmat
There are 3 Red Highlighted section in the above code you need to customize;
- The FIRST section needs to point to your relevant _NOHQ texture
- The SECOND and THIRD section should (not need) point to the default BIS texture of the same size as you texture
- i.e. 1024_512 or 2048_1024
- Most dimensions are covered by BIS from 2048×2048 through 256×256
Once finished you should have 5 files for each texture;
- 1 main, 1 Normal Map (NOHQ), 1 Spectral Map (SMDI), 1 standard Material RVMAT and 1 Destroyed RVMAT
Step 4 - CONFIG.CPP
- Not proven but likely in each CfgSkeletons you will need to inherit a BIS class, in this example “Car”
class CfgSkeletons { class car; class MyAddonSkeleton: car { isDiscrete = 1; skeletonInherit = "";
- Again not proven but likely in each CfgModels you will need to inherit a BIS class, in this example “Car” again
class CfgModels { class default{}; class Vehicle: Default { sectionsInherit = ""; sections[] = {xxxx, xxxxx, xxxxxx, xxxxxx}; }; class Car: Vehicle { sectionsInherit = "Vehicle"; sections[] = { xxxxxx, xxxxx, xxxxx, xxxxx, xxxxxx }; }; class MyAddonP3D: Car { skeletonName = "MyAddonSkeleton"; sectionsInherit = "car";
- Under CfgVehicles you then need to make a class Damage definition.
Below is an example
class CfgVehicles { class Landrover; class MyAddon: Landrover { ............ ............ class Damage { tex[] = {}; mat[] = { "SIG_general\effects\bottom.rvmat", "SIG_general\effects\bottom.rvmat", "SIG_general\effects\bottom_destruct.rvmat", ............. ............ ............. "SIG_general\effects\LastDamageTexture.rvmat", "SIG_general\effects\LastDamageTexture.rvmat", "SIG_general\effects\LastDamageTexture_destruct.rvmat" }; }; ............ ............
- The definitions are done in groups of 3 definitions;
- First definition is NO damage
- Second definition is HALF damage
- Third definition is FULL damage
- In the example above there is no HALF damage definition, it simply copies the NO damage definition.
- For half damage you could experiment with another “half” RVMAT file and reference it in the second line.
With above complete for ever texture, this should now mean that you will see damage on your vehicle.
EXCLUSION - GLASS - PENDING being written
- Glass needs extra work, I will describe one way to get “broken glass” effect
NEXT - Animation - PENDING being written
- Covers HIDING sections of the vehicle once damaged (i.e. unnecessary model detail)
- Also covers animating things like LANDCONTACTs etc
….. if I didn't forget something;
Example Finished Product
Final Note:
No doubt some of above is simply a “Parrot copy” and can in reality be changed and IT WILL STILL WORK, but without spending hours upon hours finding out what bits can be changed or altered slightly I have simple written down what works for me. If you find working variations PLEASE let us all know.
Cheers
Gnat