Making a custom breakable surface: Difference between revisions
| GamerDude27 (talk | contribs)  m (Better code readability) | |||
| Line 24: | Line 24: | ||
| After you have created the material/textures in the appropriate paths, copy, paste and fill the "(...)" enclosed strings with the paths to the respective VTF files into your intact material VMT: | After you have created the material/textures in the appropriate paths, copy, paste and fill the "(...)" enclosed strings with the paths to the respective VTF files into your intact material VMT: | ||
| <pre> | |||
| "LightmappedGeneric" | |||
| " | |||
| { | { | ||
| 	"$basetexture" "(VTF NAME HERE)" | |||
| 	"$envmap" "env_cubemap" | |||
| 	"$surfaceprop" "(Surface properties goes here, it's glass by default)" | |||
| 	"$envmapmask" "(VTF MASK NAME GOES HERE)" | |||
| 	"$translucent" 1 | |||
| 	"$multipass" 1 | |||
| 	"$nocull" 1 | |||
| 	"$crackmaterial" "(DAMAGED MATERIAL PATH GOES HERE)" | |||
| 	" | 	"LightmappedGeneric_hdr_dx9" | ||
| 	{ | 	{ | ||
| 		"$envmaptint" "[.08 .08 .08]"   | |||
| 		" | |||
| 	} | 	} | ||
| } | } | ||
| </pre> | |||
| Line 83: | Line 55: | ||
| Copy and paste the following code into your damaged material VMT | Copy and paste the following code into your damaged material VMT | ||
| <pre> | |||
| "ShatteredGlass" | |||
| " | |||
| { | { | ||
| 	"$basetexture" "(VTF NAME GOES HERE)" | |||
| 	"$detail" "(VTF NAME GOES HERE)" | |||
| 	"$envmap" "env_cubemap" | |||
| 	"$surfaceprop" "(Surface properties goes here, it's glass by default)" | |||
| 	"$envmapmask" "(TEXTURE MASK GOES HERE)" | |||
| 	"$translucent" 1 | |||
| 	"$basetexturetransform" "scale .7 .7" | |||
| 	"$detailscale" 0.7 | |||
| 	"$unlitfactor" 0.0 | |||
| 	" | 	"ShatteredGlass_DX8" | ||
| 	{ | 	{ | ||
| 		"$unlitfactor" 0.3 | |||
| 		" | |||
| 		// This is roughly equal to the average value of envmapmask of the unbroken texture | 		// This is roughly equal to the average value of envmapmask of the unbroken texture | ||
| 		"$envmaptint" "{201 201 201}" | |||
| 		" | |||
| 	} | 	} | ||
| 	// On the low end, envmaptint + lightmap tint both use the average alpha value   | 	// On the low end, envmaptint + lightmap tint both use the average alpha value   | ||
| 	"ShatteredGlass_DX7" | |||
| 	" | |||
| 	{ | 	{ | ||
| 		// This is roughly equal to the average value of alpha channel of the unbroken basetexture | 		// This is roughly equal to the average value of alpha channel of the unbroken basetexture | ||
| 		"$lightmaptint" "{128 128 128}" | |||
| 		" | |||
| 		// This is roughly equal to the average value of envmapmask of the unbroken texture | 		// This is roughly equal to the average value of envmapmask of the unbroken texture | ||
| 		// times the average value of the alpha value of the unbroken base texture | 		// times the average value of the alpha value of the unbroken base texture | ||
| 		"$envmaptint" "{100 100 100}" | |||
| 		" | |||
| 	} | 	} | ||
| 	" | 	"$nocull" 1 | ||
| 	"Proxies" | |||
| 	{ | 	{ | ||
| 		"BreakableSurface" | |||
| 		" | |||
| 		{ | 		{ | ||
| 		} | 		} | ||
| 	} | 	} | ||
| } | } | ||
| </pre> | |||
Revision as of 17:06, 4 March 2020
 Note:This so far has only been tested in Half-Life 2
Note:This so far has only been tested in Half-Life 2  in the 2009 branch of the Source Engine, but in other Source games that support DirectX 8/9, and where this entity is fully programmatically functional, this should still work.
 in the 2009 branch of the Source Engine, but in other Source games that support DirectX 8/9, and where this entity is fully programmatically functional, this should still work.What you need
You will need:
- A VTF editor/maker (VTFEdit was used in the making of this tutorial, but VTEX can be used also.) to make the textures VTF files
- A VTF texture to represent the intact material
- A VTF texture with an alpha channel (8-bit for semi-transparent surfaces) to represent the damaged material
A mask for both textures is optional.
Handling the material/texture files
- After you've got your 2 masks and/or textures, place them in the appropriate game/mod materials directory (and whatever subfolders you wish to put them in) (e.g Half-Life 2/hl2/materials).
- Create 2 text documents in the same folder your VTFs are in, with each one having the same file name as a respective VTF. Make sure you have extensions visible and change the file extension to .vmt, or save the text documents as .vmt in whatever text editor you're using.
 Note:It's good practice to name your materials (whatever)001a for the first frame then (whatever)001b for the second frame and so on when you are switching between said materials on a brush face(s) in game Note:It's good practice to name your materials (whatever)001a for the first frame then (whatever)001b for the second frame and so on when you are switching between said materials on a brush face(s) in game
The intact texture
After you have created the material/textures in the appropriate paths, copy, paste and fill the "(...)" enclosed strings with the paths to the respective VTF files into your intact material VMT:
"LightmappedGeneric"
{
	"$basetexture" "(VTF NAME HERE)"
	"$envmap" "env_cubemap"
	"$surfaceprop" "(Surface properties goes here, it's glass by default)"
	"$envmapmask" "(VTF MASK NAME GOES HERE)"
	"$translucent" 1
	"$multipass" 1
	"$nocull" 1
	"$crackmaterial" "(DAMAGED MATERIAL PATH GOES HERE)"
	"LightmappedGeneric_hdr_dx9"
	{
		"$envmaptint" "[.08 .08 .08]" 
	}
}
 Note:If you are not using a texture mask, comment out (type // behind) the line $envmapmask is on.
Note:If you are not using a texture mask, comment out (type // behind) the line $envmapmask is on.Insert the appropriate paths where $basetexture, $envmapmask and $crackmaterial are specified
Save the VMT in the same folder as your first (intact) VTF file
The damaged texture
The damaged texture needs to have an alpha channel otherwise skybox/black texture will appear when the surface breaks.
Copy and paste the following code into your damaged material VMT
"ShatteredGlass"
{
	"$basetexture" "(VTF NAME GOES HERE)"
	"$detail" "(VTF NAME GOES HERE)"
	"$envmap" "env_cubemap"
	"$surfaceprop" "(Surface properties goes here, it's glass by default)"
	"$envmapmask" "(TEXTURE MASK GOES HERE)"
	"$translucent" 1
	"$basetexturetransform" "scale .7 .7"
	"$detailscale" 0.7
	"$unlitfactor" 0.0
	"ShatteredGlass_DX8"
	{
		"$unlitfactor" 0.3
		// This is roughly equal to the average value of envmapmask of the unbroken texture
		"$envmaptint" "{201 201 201}"
	}
	// On the low end, envmaptint + lightmap tint both use the average alpha value 
	"ShatteredGlass_DX7"
	{
		// This is roughly equal to the average value of alpha channel of the unbroken basetexture
		"$lightmaptint" "{128 128 128}"
		// This is roughly equal to the average value of envmapmask of the unbroken texture
		// times the average value of the alpha value of the unbroken base texture
		"$envmaptint" "{100 100 100}"
	}
	"$nocull" 1
	"Proxies"
	{
		"BreakableSurface"
		{
		}
	}
}
 Note:If you are not using a texture mask, comment out (type // behind) the line $envmapmask is on.
Note:If you are not using a texture mask, comment out (type // behind) the line $envmapmask is on.
End
Provided you have done everything right, you should now have a texture that works fully with the func_breakable_surf brush entity provided all except 1 side is Nodraw.
Modifications to the independent parameters (e.g $lightmaptint) can be made without any loss of functionality, however since func_breakable_surf is mostly used for glass, it has been optimised as such (hopefully).