mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-01-03 19:06:27 +01:00
non experimental contraption rendering is back.
schematic rendering is fixed. both of these are kinda ugly hacks, and there is definitely some rewriting necessary for when it's time to be more opengl compatible. maybe fix belt lighting, again. remove old belt assets.
This commit is contained in:
parent
6736577e1b
commit
0cb9094913
20 changed files with 42 additions and 23 deletions
|
@ -41,7 +41,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTil
|
||||||
@Override
|
@Override
|
||||||
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(te.getWorld())) return;
|
||||||
|
|
||||||
for (RenderType type : RenderType.getBlockLayers())
|
for (RenderType type : RenderType.getBlockLayers())
|
||||||
if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type))
|
if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type))
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
|
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
|
||||||
|
import com.simibubi.create.foundation.render.FastRenderDispatcher;
|
||||||
import com.simibubi.create.foundation.render.contraption.RenderedContraption;
|
import com.simibubi.create.foundation.render.contraption.RenderedContraption;
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
|
|
||||||
|
@ -32,7 +33,8 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour {
|
||||||
@OnlyIn(value = Dist.CLIENT)
|
@OnlyIn(value = Dist.CLIENT)
|
||||||
public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal,
|
public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal,
|
||||||
IRenderTypeBuffer buffer) {
|
IRenderTypeBuffer buffer) {
|
||||||
//DrillRenderer.renderInContraption(context, ms, msLocal, buffer);
|
if (!FastRenderDispatcher.available())
|
||||||
|
DrillRenderer.renderInContraption(context, ms, msLocal, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.actors;
|
||||||
|
|
||||||
import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING;
|
import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.render.FastRenderDispatcher;
|
||||||
import com.simibubi.create.foundation.render.contraption.RenderedContraption;
|
import com.simibubi.create.foundation.render.contraption.RenderedContraption;
|
||||||
import org.apache.commons.lang3.mutable.MutableBoolean;
|
import org.apache.commons.lang3.mutable.MutableBoolean;
|
||||||
|
|
||||||
|
@ -49,7 +50,8 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
|
||||||
@Override
|
@Override
|
||||||
public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal,
|
public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal,
|
||||||
IRenderTypeBuffer buffers) {
|
IRenderTypeBuffer buffers) {
|
||||||
//HarvesterRenderer.renderInContraption(context, ms, msLocal, buffers);
|
if (!FastRenderDispatcher.available())
|
||||||
|
HarvesterRenderer.renderInContraption(context, ms, msLocal, buffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -153,7 +153,7 @@ public class MechanicalCrafterRenderer extends SafeTileEntityRenderer<Mechanical
|
||||||
BlockState blockState = te.getBlockState();
|
BlockState blockState = te.getBlockState();
|
||||||
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
||||||
|
|
||||||
if (!FastRenderDispatcher.available()) {
|
if (!FastRenderDispatcher.available(te.getWorld())) {
|
||||||
SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState);
|
SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState);
|
||||||
standardKineticRotationTransform(superBuffer, te, light);
|
standardKineticRotationTransform(superBuffer, te, light);
|
||||||
superBuffer.rotateCentered(Direction.UP, (float) (blockState.get(HORIZONTAL_FACING).getAxis() != Direction.Axis.X ? 0 : Math.PI / 2));
|
superBuffer.rotateCentered(Direction.UP, (float) (blockState.get(HORIZONTAL_FACING).getAxis() != Direction.Axis.X ? 0 : Math.PI / 2));
|
||||||
|
|
|
@ -104,7 +104,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
|
||||||
protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
||||||
if (!FastRenderDispatcher.available()) {
|
if (!FastRenderDispatcher.available(te.getWorld())) {
|
||||||
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light);
|
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), ms, vb, light);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
|
||||||
@Override
|
@Override
|
||||||
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(te.getWorld())) return;
|
||||||
|
|
||||||
Direction direction = te.getBlockState()
|
Direction direction = te.getBlockState()
|
||||||
.get(FACING);
|
.get(FACING);
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer {
|
||||||
|
|
||||||
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
||||||
|
|
||||||
if (!FastRenderDispatcher.available()) {
|
if (!FastRenderDispatcher.available(te.getWorld())) {
|
||||||
SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState);
|
SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState);
|
||||||
standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb);
|
standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> {
|
||||||
renderItems(te, partialTicks, ms, buffer, light, overlay);
|
renderItems(te, partialTicks, ms, buffer, light, overlay);
|
||||||
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
|
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
|
||||||
|
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(te.getWorld())) return;
|
||||||
|
|
||||||
renderShaft(te, ms, buffer, light, overlay);
|
renderShaft(te, ms, buffer, light, overlay);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.simibubi.create.content.contraptions.components.structureMovement;
|
package com.simibubi.create.content.contraptions.components.structureMovement;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.simibubi.create.foundation.render.FastRenderDispatcher;
|
||||||
|
import com.simibubi.create.foundation.render.gl.backend.Backend;
|
||||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||||
import net.minecraft.client.renderer.culling.ClippingHelperImpl;
|
import net.minecraft.client.renderer.culling.ClippingHelperImpl;
|
||||||
|
@ -55,8 +57,11 @@ public abstract class AbstractContraptionEntityRenderer<C extends AbstractContra
|
||||||
transform(entity, partialTicks, matrixStacks);
|
transform(entity, partialTicks, matrixStacks);
|
||||||
Contraption contraption = entity.getContraption();
|
Contraption contraption = entity.getContraption();
|
||||||
if (contraption != null) {
|
if (contraption != null) {
|
||||||
ContraptionRenderer.renderDynamic(entity.world, contraption, ms, msLocal, buffers);
|
if (!FastRenderDispatcher.available()) {
|
||||||
//ContraptionRenderDispatcher.markForRendering(entity.world, contraption, msLocal);
|
ContraptionRenderer.render(entity.world, contraption, ms, msLocal, buffers);
|
||||||
|
} else {
|
||||||
|
ContraptionRenderer.renderDynamic(entity.world, contraption, ms, msLocal, buffers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ms.pop();
|
ms.pop();
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.render.*;
|
||||||
import net.minecraft.world.lighting.WorldLightManager;
|
import net.minecraft.world.lighting.WorldLightManager;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
|
@ -11,10 +12,6 @@ import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllMovementBehaviours;
|
import com.simibubi.create.AllMovementBehaviours;
|
||||||
import com.simibubi.create.CreateClient;
|
import com.simibubi.create.CreateClient;
|
||||||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||||
import com.simibubi.create.foundation.render.SuperByteBuffer;
|
|
||||||
import com.simibubi.create.foundation.render.SuperByteBufferCache;
|
|
||||||
import com.simibubi.create.foundation.render.Compartment;
|
|
||||||
import com.simibubi.create.foundation.render.TileEntityRenderHelper;
|
|
||||||
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
|
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
|
||||||
|
|
||||||
import net.minecraft.block.BlockRenderType;
|
import net.minecraft.block.BlockRenderType;
|
||||||
|
@ -77,7 +74,11 @@ public class ContraptionRenderer {
|
||||||
|
|
||||||
protected static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal,
|
protected static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal,
|
||||||
IRenderTypeBuffer buffer) {
|
IRenderTypeBuffer buffer) {
|
||||||
TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer);
|
if (FastRenderDispatcher.available()) {
|
||||||
|
TileEntityRenderHelper.renderTileEntities(world, c.specialRenderedTileEntities, ms, msLocal, buffer);
|
||||||
|
} else {
|
||||||
|
TileEntityRenderHelper.renderTileEntities(world, c.maybeInstancedTileEntities, ms, msLocal, buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) {
|
private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
|
||||||
IRenderTypeBuffer buffer, int light, int overlay) {
|
IRenderTypeBuffer buffer, int light, int overlay) {
|
||||||
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay);
|
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay);
|
||||||
|
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(tileEntityIn.getWorld())) return;
|
||||||
|
|
||||||
KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms,
|
KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), ms,
|
||||||
buffer.getBuffer(RenderType.getSolid()), light);
|
buffer.getBuffer(RenderType.getSolid()), light);
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
|
||||||
protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
|
|
||||||
if (!FastRenderDispatcher.available()) {
|
if (!FastRenderDispatcher.available(te.getWorld())) {
|
||||||
|
|
||||||
BlockState blockState = te.getBlockState();
|
BlockState blockState = te.getBlockState();
|
||||||
if (!AllBlocks.BELT.has(blockState)) return;
|
if (!AllBlocks.BELT.has(blockState)) return;
|
||||||
|
|
|
@ -99,6 +99,9 @@ public class BeltTileEntity extends KineticTileEntity {
|
||||||
|
|
||||||
initializeItemHandler();
|
initializeItemHandler();
|
||||||
|
|
||||||
|
if (blockLight == -1)
|
||||||
|
updateLight();
|
||||||
|
|
||||||
// Move Items
|
// Move Items
|
||||||
if (!isController())
|
if (!isController())
|
||||||
return;
|
return;
|
||||||
|
@ -125,9 +128,6 @@ public class BeltTileEntity extends KineticTileEntity {
|
||||||
BeltMovementHandler.transportEntity(this, entity, info);
|
BeltMovementHandler.transportEntity(this, entity, info);
|
||||||
});
|
});
|
||||||
toRemove.forEach(passengers::remove);
|
toRemove.forEach(passengers::remove);
|
||||||
|
|
||||||
if (blockLight == -1)
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -28,7 +28,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
|
||||||
@Override
|
@Override
|
||||||
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(te.getWorld())) return;
|
||||||
|
|
||||||
Block block = te.getBlockState().getBlock();
|
Block block = te.getBlockState().getBlock();
|
||||||
final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState());
|
final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState());
|
||||||
|
|
|
@ -26,7 +26,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
|
||||||
@Override
|
@Override
|
||||||
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||||
int light, int overlay) {
|
int light, int overlay) {
|
||||||
if (FastRenderDispatcher.available()) return;
|
if (FastRenderDispatcher.available(te.getWorld())) return;
|
||||||
|
|
||||||
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
|
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
|
||||||
final BlockPos pos = te.getPos();
|
final BlockPos pos = te.getPos();
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class SchematicHandler {
|
||||||
public SchematicHandler() {
|
public SchematicHandler() {
|
||||||
renderers = new Vector<>(3);
|
renderers = new Vector<>(3);
|
||||||
for (int i = 0; i < renderers.capacity(); i++)
|
for (int i = 0; i < renderers.capacity(); i++)
|
||||||
renderers.add(new SchematicRendererWithInstancing());
|
renderers.add(new SchematicRenderer());
|
||||||
|
|
||||||
overlay = new SchematicHotbarSlotOverlay();
|
overlay = new SchematicHotbarSlotOverlay();
|
||||||
currentTool = Tools.Deploy;
|
currentTool = Tools.Deploy;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.simibubi.create.CreateClient;
|
import com.simibubi.create.CreateClient;
|
||||||
import com.simibubi.create.content.contraptions.KineticDebugger;
|
import com.simibubi.create.content.contraptions.KineticDebugger;
|
||||||
|
import com.simibubi.create.content.schematics.SchematicWorld;
|
||||||
import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher;
|
import com.simibubi.create.foundation.render.contraption.ContraptionRenderDispatcher;
|
||||||
import com.simibubi.create.foundation.render.gl.backend.Backend;
|
import com.simibubi.create.foundation.render.gl.backend.Backend;
|
||||||
import com.simibubi.create.foundation.render.gl.backend.OptifineHandler;
|
import com.simibubi.create.foundation.render.gl.backend.OptifineHandler;
|
||||||
|
@ -24,6 +25,7 @@ import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.SectionPos;
|
import net.minecraft.util.math.SectionPos;
|
||||||
import net.minecraft.world.ILightReader;
|
import net.minecraft.world.ILightReader;
|
||||||
import net.minecraft.world.LightType;
|
import net.minecraft.world.LightType;
|
||||||
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
import org.lwjgl.opengl.GL20;
|
import org.lwjgl.opengl.GL20;
|
||||||
|
@ -62,6 +64,10 @@ public class FastRenderDispatcher {
|
||||||
return Backend.enabled;
|
return Backend.enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean available(World world) {
|
||||||
|
return Backend.enabled && !(world instanceof SchematicWorld);
|
||||||
|
}
|
||||||
|
|
||||||
public static int getDebugMode() {
|
public static int getDebugMode() {
|
||||||
return KineticDebugger.isActive() ? 1 : 0;
|
return KineticDebugger.isActive() ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.foundation.render.instancing;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.FastRenderDispatcher;
|
import com.simibubi.create.foundation.render.FastRenderDispatcher;
|
||||||
import com.simibubi.create.foundation.render.gl.BasicProgram;
|
import com.simibubi.create.foundation.render.gl.BasicProgram;
|
||||||
|
import com.simibubi.create.foundation.render.gl.backend.Backend;
|
||||||
import com.simibubi.create.foundation.render.gl.shader.ShaderCallback;
|
import com.simibubi.create.foundation.render.gl.shader.ShaderCallback;
|
||||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
import net.minecraft.client.renderer.Matrix4f;
|
import net.minecraft.client.renderer.Matrix4f;
|
||||||
|
@ -37,6 +38,8 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Nullable
|
@Nullable
|
||||||
public <T extends TileEntity> TileEntityInstance<? super T> getInstance(T tile, boolean create) {
|
public <T extends TileEntity> TileEntityInstance<? super T> getInstance(T tile, boolean create) {
|
||||||
|
if (!Backend.enabled) return null;
|
||||||
|
|
||||||
TileEntityInstance<?> instance = instances.get(tile);
|
TileEntityInstance<?> instance = instances.get(tile);
|
||||||
|
|
||||||
if (instance != null) {
|
if (instance != null) {
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 9.3 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.5 KiB |
Loading…
Reference in a new issue