mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	Tile material: Add 'TILE_MATERIAL_OPAQUE', use for drawtype 'NDT_NORMAL'
Prevents normal drawtype nodes having transparency. Avoids clients cheating by using 'x-ray' texture packs with transparent textures.
This commit is contained in:
		@@ -156,7 +156,8 @@ enum MaterialType{
 | 
			
		||||
	TILE_MATERIAL_LIQUID_TRANSPARENT,
 | 
			
		||||
	TILE_MATERIAL_LIQUID_OPAQUE,
 | 
			
		||||
	TILE_MATERIAL_WAVING_LEAVES,
 | 
			
		||||
	TILE_MATERIAL_WAVING_PLANTS
 | 
			
		||||
	TILE_MATERIAL_WAVING_PLANTS,
 | 
			
		||||
	TILE_MATERIAL_OPAQUE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Material flags
 | 
			
		||||
@@ -216,6 +217,10 @@ struct TileLayer
 | 
			
		||||
	void applyMaterialOptions(video::SMaterial &material) const
 | 
			
		||||
	{
 | 
			
		||||
		switch (material_type) {
 | 
			
		||||
		case TILE_MATERIAL_OPAQUE:
 | 
			
		||||
		case TILE_MATERIAL_LIQUID_OPAQUE:
 | 
			
		||||
			material.MaterialType = video::EMT_SOLID;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_BASIC:
 | 
			
		||||
		case TILE_MATERIAL_WAVING_LEAVES:
 | 
			
		||||
		case TILE_MATERIAL_WAVING_PLANTS:
 | 
			
		||||
@@ -225,9 +230,6 @@ struct TileLayer
 | 
			
		||||
		case TILE_MATERIAL_LIQUID_TRANSPARENT:
 | 
			
		||||
			material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_LIQUID_OPAQUE:
 | 
			
		||||
			material.MaterialType = video::EMT_SOLID;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING)
 | 
			
		||||
			? true : false;
 | 
			
		||||
 
 | 
			
		||||
@@ -690,6 +690,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
 | 
			
		||||
	switch (drawtype) {
 | 
			
		||||
	default:
 | 
			
		||||
	case NDT_NORMAL:
 | 
			
		||||
		material_type = (alpha == 255) ?
 | 
			
		||||
			TILE_MATERIAL_OPAQUE : TILE_MATERIAL_ALPHA;
 | 
			
		||||
		solidness = 2;
 | 
			
		||||
		break;
 | 
			
		||||
	case NDT_AIRLIKE:
 | 
			
		||||
@@ -786,6 +788,16 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
 | 
			
		||||
		tile_shader[j] = shdsrc->getShader("nodes_shader",
 | 
			
		||||
			material_type, drawtype);
 | 
			
		||||
	}
 | 
			
		||||
	u8 overlay_material = material_type;
 | 
			
		||||
	if (overlay_material == TILE_MATERIAL_OPAQUE)
 | 
			
		||||
		overlay_material = TILE_MATERIAL_BASIC;
 | 
			
		||||
	else if (overlay_material == TILE_MATERIAL_LIQUID_OPAQUE)
 | 
			
		||||
		overlay_material = TILE_MATERIAL_LIQUID_TRANSPARENT;
 | 
			
		||||
	u32 overlay_shader[6];
 | 
			
		||||
	for (u16 j = 0; j < 6; j++) {
 | 
			
		||||
		overlay_shader[j] = shdsrc->getShader("nodes_shader",
 | 
			
		||||
			overlay_material, drawtype);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Tiles (fill in f->tiles[])
 | 
			
		||||
	for (u16 j = 0; j < 6; j++) {
 | 
			
		||||
@@ -794,8 +806,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
 | 
			
		||||
			tdef[j].backface_culling, material_type);
 | 
			
		||||
		if (tdef_overlay[j].name != "")
 | 
			
		||||
			fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j],
 | 
			
		||||
				tile_shader[j], tsettings.use_normal_texture,
 | 
			
		||||
				tdef[j].backface_culling, material_type);
 | 
			
		||||
				overlay_shader[j], tsettings.use_normal_texture,
 | 
			
		||||
				tdef[j].backface_culling, overlay_material);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Special tiles (fill in f->special_tiles[])
 | 
			
		||||
 
 | 
			
		||||
@@ -531,26 +531,19 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
 | 
			
		||||
	shaderinfo.drawtype = drawtype;
 | 
			
		||||
	shaderinfo.material = video::EMT_SOLID;
 | 
			
		||||
	switch (material_type) {
 | 
			
		||||
		case TILE_MATERIAL_BASIC:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_ALPHA:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_LIQUID_TRANSPARENT:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_LIQUID_OPAQUE:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_SOLID;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_WAVING_LEAVES:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
 | 
			
		||||
			break;
 | 
			
		||||
		case TILE_MATERIAL_WAVING_PLANTS:
 | 
			
		||||
			shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
	case TILE_MATERIAL_OPAQUE:
 | 
			
		||||
	case TILE_MATERIAL_LIQUID_OPAQUE:
 | 
			
		||||
		shaderinfo.base_material = video::EMT_SOLID;
 | 
			
		||||
		break;
 | 
			
		||||
	case TILE_MATERIAL_ALPHA:
 | 
			
		||||
	case TILE_MATERIAL_LIQUID_TRANSPARENT:
 | 
			
		||||
		shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
 | 
			
		||||
		break;
 | 
			
		||||
	case TILE_MATERIAL_BASIC:
 | 
			
		||||
	case TILE_MATERIAL_WAVING_LEAVES:
 | 
			
		||||
	case TILE_MATERIAL_WAVING_PLANTS:
 | 
			
		||||
		shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool enable_shaders = g_settings->getBool("enable_shaders");
 | 
			
		||||
@@ -642,7 +635,8 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp
 | 
			
		||||
		"TILE_MATERIAL_LIQUID_TRANSPARENT",
 | 
			
		||||
		"TILE_MATERIAL_LIQUID_OPAQUE",
 | 
			
		||||
		"TILE_MATERIAL_WAVING_LEAVES",
 | 
			
		||||
		"TILE_MATERIAL_WAVING_PLANTS"
 | 
			
		||||
		"TILE_MATERIAL_WAVING_PLANTS",
 | 
			
		||||
		"TILE_MATERIAL_OPAQUE"
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	for (int i = 0; i < 6; i++){
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user