Fixes #2432: New model for wireless access point which includes status indicators, correct model rotation, and lit/unlit torch variants.

This commit is contained in:
Sebastian Hartte 2016-10-09 19:43:01 +02:00
parent 6369cef465
commit 3f6607028d
14 changed files with 424 additions and 774 deletions

View File

@ -21,9 +21,10 @@ package appeng.block.networking;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
@ -31,8 +32,10 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import appeng.api.util.AEPartLocation;
@ -46,6 +49,22 @@ import appeng.util.Platform;
public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
{
enum State implements IStringSerializable
{
OFF,
ON,
HAS_CHANNEL;
@Override
public String getName()
{
return name().toLowerCase();
}
}
public static final PropertyEnum<State> STATE = PropertyEnum.create( "state", State.class );
public BlockWireless()
{
super( AEGlassMaterial.INSTANCE );
@ -53,6 +72,7 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
this.setLightOpacity( 0 );
this.setFullSize( false );
this.setOpaque( false );
this.setDefaultState( getDefaultState().withProperty( STATE, State.OFF ) );
}
@Override
@ -61,6 +81,34 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
return BlockRenderLayer.CUTOUT;
}
@Override
public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
State teState = State.OFF;
TileWireless te = getTileEntity( worldIn, pos );
if( te != null )
{
if( te.isActive() )
{
teState = State.HAS_CHANNEL;
}
else if( te.isPowered() )
{
teState = State.ON;
}
}
return super.getActualState( state, worldIn, pos )
.withProperty( STATE, teState );
}
@Override
protected IProperty[] getAEStates()
{
return new IProperty[] { STATE };
}
@Override
public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
@ -207,4 +255,11 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
}
}
@Override
public boolean isFullCube( IBlockState state )
{
return false;
}
}

View File

@ -0,0 +1,22 @@
package appeng.block.networking;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering;
import appeng.client.render.StaticBlockColor;
public class WirelessRendering extends BlockRenderingCustomizer
{
@Override
@SideOnly( Side.CLIENT )
public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.blockColor( new StaticBlockColor( AEColor.TRANSPARENT ) );
}
}

View File

@ -0,0 +1,51 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.client.render;
import javax.annotation.Nullable;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import appeng.api.util.AEColor;
/**
* Returns the shades of a single AE color for tint indices 0, 1, and 2.
*/
public class StaticBlockColor implements IBlockColor
{
private final AEColor color;
public StaticBlockColor( AEColor color )
{
this.color = color;
}
@Override
public int colorMultiplier( IBlockState state, @Nullable IBlockAccess worldIn, @Nullable BlockPos pos, int tintIndex )
{
return color.getVariantByTintIndex( tintIndex );
}
}

View File

@ -66,6 +66,7 @@ import appeng.block.networking.BlockEnergyCellRendering;
import appeng.block.networking.BlockWireless;
import appeng.block.networking.CableBusRendering;
import appeng.block.networking.ControllerRendering;
import appeng.block.networking.WirelessRendering;
import appeng.block.qnb.BlockQuantumLinkChamber;
import appeng.block.qnb.BlockQuantumRing;
import appeng.block.spatial.BlockMatrixFrame;
@ -258,7 +259,10 @@ public final class ApiBlocks implements IBlocks
.features( AEFeature.Inscriber )
.rendering( new InscriberRendering() )
.build();
this.wirelessAccessPoint = registry.block( "wireless_access_point", BlockWireless::new ).features( AEFeature.WirelessAccessTerminal ).build();
this.wirelessAccessPoint = registry.block( "wireless_access_point", BlockWireless::new )
.features( AEFeature.WirelessAccessTerminal )
.rendering( new WirelessRendering() )
.build();
this.charger = registry.block( "charger", BlockCharger::new )
.rendering( new BlockRenderingCustomizer()
{

View File

@ -1,8 +1,41 @@
{
"forge_marker": 1,
"defaults": {
"model": "appliedenergistics2:wireless_access_point_chassis",
"y": 180
},
"variants": {
"normal": {
"model": "appliedenergistics2:wireless_access_point",
"y": 180
"state": {
"off": {
"submodel": {
"state": {
"model": "appliedenergistics2:wireless_access_point_status_off"
},
"torch": {
"model": "appliedenergistics2:wireless_access_point_off"
}
}
},
"on": {
"submodel": {
"state": {
"model": "appliedenergistics2:wireless_access_point_status_on"
},
"torch": {
"model": "appliedenergistics2:wireless_access_point_off"
}
}
},
"has_channel": {
"submodel": {
"state": {
"model": "appliedenergistics2:wireless_access_point_status_has_channel"
},
"torch": {
"model": "appliedenergistics2:wireless_access_point_on"
}
}
}
}
}
}

View File

@ -1,769 +0,0 @@
{
"parent": "block/block",
"elements": [
{
"faces": {
"down": {
"texture": "#0",
"uv": [
4.0,
4.0,
12.0,
12.0
]
},
"east": {
"texture": "#0",
"uv": [
4.0,
0.0,
12.0,
2.0
]
},
"north": {
"texture": "#0",
"uv": [
4.0,
14.0,
12.0,
16.0
]
},
"south": {
"texture": "#0",
"uv": [
0.0,
0.0,
8.0,
2.0
]
},
"up": {
"texture": "#0",
"uv": [
4.0,
4.0,
12.0,
12.0
]
},
"west": {
"texture": "#0",
"uv": [
0.0,
0.0,
8.0,
2.0
]
}
},
"from": [
4.0,
0.0,
4.0
],
"name": "Base",
"to": [
12.0,
2.0,
12.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
5.0,
1.0,
11.0,
3.0
]
},
"east": {
"texture": "#0",
"uv": [
15.0,
7.0,
13.0,
5.0
]
},
"north": {
"texture": "#0",
"uv": [
0.0,
0.0,
6.0,
2.0
]
},
"south": {
"texture": "#0",
"uv": [
11.0,
3.0,
5.0,
5.0
]
},
"up": {
"texture": "#0",
"uv": [
5.0,
13.0,
11.0,
15.0
]
},
"west": {
"texture": "#0",
"uv": [
13.0,
3.0,
15.0,
5.0
]
}
},
"from": [
5.0,
2.0,
3.0
],
"name": "Front_B",
"to": [
11.0,
4.0,
5.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
5.0,
13.0,
11.0,
15.0
]
},
"east": {
"texture": "#0",
"uv": [
13.0,
4.0,
15.0,
6.0
]
},
"north": {
"texture": "#0",
"uv": [
10.0,
0.0,
16.0,
2.0
]
},
"south": {
"texture": "#0",
"uv": [
11.0,
11.0,
5.0,
13.0
]
},
"up": {
"texture": "#0",
"uv": [
5.0,
1.0,
11.0,
3.0
]
},
"west": {
"texture": "#0",
"uv": [
1.0,
4.0,
3.0,
6.0
]
}
},
"from": [
5.0,
2.0,
11.0
],
"name": "Back_B",
"to": [
11.0,
4.0,
13.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
1.0,
5.0,
3.0,
11.0
]
},
"east": {
"texture": "#0",
"uv": [
5.0,
11.0,
11.0,
13.0
]
},
"north": {
"texture": "#0",
"uv": [
13.0,
4.0,
15.0,
6.0
]
},
"south": {
"texture": "#0",
"uv": [
1.0,
6.0,
3.0,
8.0
]
},
"up": {
"texture": "#0",
"uv": [
1.0,
5.0,
3.0,
11.0
]
},
"west": {
"texture": "#0",
"uv": [
5.0,
3.0,
11.0,
5.0
]
}
},
"from": [
11.0,
2.0,
5.0
],
"name": "Left_B",
"to": [
13.0,
4.0,
11.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
13.0,
5.0,
15.0,
11.0
]
},
"east": {
"texture": "#0",
"uv": [
5.0,
11.0,
11.0,
13.0
]
},
"north": {
"texture": "#0",
"uv": [
1.0,
4.0,
3.0,
6.0
]
},
"south": {
"texture": "#0",
"uv": [
13.0,
6.0,
15.0,
8.0
]
},
"up": {
"texture": "#0",
"uv": [
13.0,
5.0,
15.0,
11.0
]
},
"west": {
"texture": "#0",
"uv": [
5.0,
3.0,
11.0,
5.0
]
}
},
"from": [
3.0,
2.0,
5.0
],
"name": "Right_B",
"to": [
5.0,
4.0,
11.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
0.0,
0.0,
2.0,
1.0
]
},
"east": {
"texture": "#0",
"uv": [
0.0,
5.0,
1.0,
10.0
]
},
"north": {
"texture": "#0",
"uv": [
0.0,
5.0,
2.0,
10.0
]
},
"south": {
"texture": "#0",
"uv": [
0.0,
5.0,
2.0,
10.0
]
},
"up": {
"texture": "#0",
"uv": [
0.0,
0.0,
2.0,
1.0
]
},
"west": {
"texture": "#0",
"uv": [
0.0,
5.0,
1.0,
10.0
]
}
},
"from": [
7.0,
3.0,
2.0
],
"name": "Front_S",
"to": [
9.0,
8.0,
3.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
14.0,
1.0,
16.0,
2.0
]
},
"east": {
"texture": "#0",
"uv": [
14.0,
2.0,
15.0,
7.0
]
},
"north": {
"texture": "#0",
"uv": [
14.0,
2.0,
16.0,
7.0
]
},
"south": {
"texture": "#0",
"uv": [
14.0,
2.0,
16.0,
7.0
]
},
"up": {
"texture": "#0",
"uv": [
14.0,
0.0,
16.0,
1.0
]
},
"west": {
"texture": "#0",
"uv": [
15.0,
2.0,
16.0,
7.0
]
}
},
"from": [
7.0,
3.0,
13.0
],
"name": "Back_S",
"to": [
9.0,
8.0,
14.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
11.0,
3.0,
12.0,
5.0
]
},
"east": {
"texture": "#0",
"uv": [
11.0,
3.0,
13.0,
8.0
]
},
"north": {
"texture": "#0",
"uv": [
12.0,
3.0,
13.0,
8.0
]
},
"south": {
"texture": "#0",
"uv": [
13.0,
3.0,
11.0,
8.0
]
},
"up": {
"texture": "#0",
"uv": [
12.0,
3.0,
13.0,
5.0
]
},
"west": {
"texture": "#0",
"uv": [
11.0,
3.0,
13.0,
8.0
]
}
},
"from": [
2.0,
3.0,
7.0
],
"name": "Left_S",
"to": [
3.0,
8.0,
9.0
]
},
{
"faces": {
"down": {
"texture": "#0",
"uv": [
0.0,
0.0,
1.0,
2.0
]
},
"east": {
"texture": "#0",
"uv": [
0.0,
0.0,
2.0,
5.0
]
},
"north": {
"texture": "#0",
"uv": [
0.0,
0.0,
1.0,
5.0
]
},
"south": {
"texture": "#0",
"uv": [
0.0,
0.0,
1.0,
5.0
]
},
"up": {
"texture": "#0",
"uv": [
0.0,
0.0,
1.0,
2.0
]
},
"west": {
"texture": "#0",
"uv": [
0.0,
0.0,
2.0,
5.0
]
}
},
"from": [
13.0,
3.0,
7.0
],
"name": "Right_S",
"to": [
14.0,
8.0,
9.0
]
},
{
"faces": {
"down": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
11.0
]
},
"east": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
15.0
]
},
"north": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
15.0
]
},
"south": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
15.0
]
},
"up": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
11.0
]
},
"west": {
"texture": "#1",
"uv": [
7.0,
9.0,
9.0,
15.0
]
}
},
"from": [
7.0,
2.0,
7.0
],
"name": "Torch_B",
"to": [
9.0,
8.0,
9.0
]
},
{
"faces": {
"down": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
},
"east": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
},
"north": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
},
"south": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
},
"up": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
},
"west": {
"texture": "#1",
"uv": [
7.0,
7.0,
9.0,
9.0
]
}
},
"from": [
7.0,
8.0,
7.0
],
"name": "Torch_Off",
"to": [
9.0,
10.0,
9.0
]
}
],
"textures": {
"particle": "appliedenergistics2:blocks/wireless_access_point_inside",
"0": "appliedenergistics2:blocks/wireless_access_point_inside",
"1": "appliedenergistics2:blocks/wireless_access_point"
}
}

View File

@ -0,0 +1,140 @@
{
"parent": "block/block",
"textures": {
"particle": "appliedenergistics2:blocks/wireless_access_point_inside",
"inside": "appliedenergistics2:blocks/wireless_access_point_inside",
"1": "appliedenergistics2:blocks/wireless_access_point",
"sides": "appliedenergistics2:parts/monitor_sides",
"sidesStatus": "appliedenergistics2:parts/monitor_sides_status"
},
"elements": [
{
"from": [5, 5, 0],
"to": [11, 11, 1],
"faces": {
"north": { "texture": "#sides"},
"south": { "texture": "#sides"},
"east": { "texture": "#sidesStatus"},
"west": { "texture": "#sidesStatus"},
"up": { "texture": "#sidesStatus"},
"down": { "texture": "#sidesStatus"}
}
},
{
"from": [5, 5, 1],
"to": [11, 11, 2],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna I Up",
"from": [6, 10, 2],
"to": [10, 12, 4],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna I Down",
"from": [6, 4, 2],
"to": [10, 6, 4],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna I West",
"from": [4, 6, 2],
"to": [6, 10, 4],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna I East",
"from": [10, 6, 2],
"to": [12, 10, 4],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna II Up",
"from": [7, 12, 3],
"to": [9, 13, 6],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna II Down",
"from": [7, 3, 3],
"to": [9, 4, 6],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna II West",
"from": [3, 7, 3],
"to": [4, 9, 6],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
},
{
"name": "Side Antenna II East",
"from": [12, 7, 3],
"to": [13, 9, 6],
"faces": {
"north": { "texture": "#inside"},
"south": { "texture": "#inside"},
"east": { "texture": "#sides"},
"west": { "texture": "#sides"},
"up": { "texture": "#sides"},
"down": { "texture": "#sides"}
}
}
]
}

View File

@ -0,0 +1,18 @@
{
"textures": {
"torch": "appliedenergistics2:blocks/wireless_access_point"
},
"elements": [
{
"from": [7, 7, 1],
"to": [9, 9, 9],
"faces": {
"up": { "texture": "#torch", "uv": [1, 7, 9, 9], "rotation": 90 },
"down": { "texture": "#torch", "uv": [1, 7, 9, 9], "rotation": 270 },
"east": { "texture": "#torch", "uv": [1, 7, 9, 9], "rotation": 180 },
"west": { "texture": "#torch", "uv": [1, 7, 9, 9] },
"south": { "texture": "#torch", "uv": [7, 7, 9, 9], "rotation": 270 }
}
}
]
}

View File

@ -0,0 +1,45 @@
{
"uvlMarker": true,
"ambientocclusion": false,
"textures": {
"torch": "appliedenergistics2:blocks/wireless_access_point_on"
},
"elements": [
{
"from": [7, 7, 1],
"to": [9, 9, 6],
"faces": {
"up": { "texture": "#torch", "uv": [1, 7, 6, 9], "rotation": 90 },
"down": { "texture": "#torch", "uv": [1, 7, 6, 9], "rotation": 270 },
"east": { "texture": "#torch", "uv": [1, 7, 6, 9], "rotation": 180 },
"west": { "texture": "#torch", "uv": [1, 7, 6, 9] }
}
},
{
"from": [7, 7, 7],
"to": [9, 9, 9],
"shade": false,
"faces": {
"south": { "texture": "#torch", "uv": [7, 7, 9, 9], "rotation": 270, "uvlightmap": { "sky": 0.007, "block": 0.007 } }
}
},
{
"from": [6, 7, 6],
"to": [10, 9, 10],
"shade": false,
"faces": {
"up": { "texture": "#torch", "uv": [6, 6, 10, 10], "rotation": 90, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"down": { "texture": "#torch", "uv": [6, 6, 10, 10], "rotation": 270, "uvlightmap": { "sky": 0.007, "block": 0.007 } }
}
},
{
"from": [7, 6, 6],
"to": [9, 10, 10],
"shade": false,
"faces": {
"west": { "texture": "#torch", "uv": [6, 6, 10, 10], "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"east": { "texture": "#torch", "uv": [6, 6, 10, 10], "rotation": 180, "uvlightmap": { "sky": 0.007, "block": 0.007 } }
}
}
]
}

View File

@ -0,0 +1,17 @@
{
"textures": {
"indicator": "appliedenergistics2:parts/monitor_sides_status_has_channel"
},
"elements": [
{
"from": [5, 5, 0],
"to": [11, 11, 1],
"faces": {
"down": { "texture": "#indicator", "tintindex": 1, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"up": { "texture": "#indicator", "tintindex": 1, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"east": { "texture": "#indicator", "tintindex": 1, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"west": { "texture": "#indicator", "tintindex": 1, "uvlightmap": { "sky": 0.007, "block": 0.007 } }
}
}
]
}

View File

@ -0,0 +1,17 @@
{
"textures": {
"indicator": "appliedenergistics2:parts/monitor_sides_status_off"
},
"elements": [
{
"from": [5, 5, 0],
"to": [11, 11, 1],
"faces": {
"down": { "texture": "#indicator" },
"up": { "texture": "#indicator" },
"east": { "texture": "#indicator" },
"west": { "texture": "#indicator" }
}
}
]
}

View File

@ -0,0 +1,17 @@
{
"textures": {
"indicator": "appliedenergistics2:parts/monitor_sides_status_on"
},
"elements": [
{
"from": [5, 5, 0],
"to": [11, 11, 1],
"faces": {
"down": { "texture": "#indicator", "tintindex": 3, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"up": { "texture": "#indicator", "tintindex": 3, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"east": { "texture": "#indicator", "tintindex": 3, "uvlightmap": { "sky": 0.007, "block": 0.007 } },
"west": { "texture": "#indicator", "tintindex": 3, "uvlightmap": { "sky": 0.007, "block": 0.007 } }
}
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 2.8 KiB