mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-13 08:14:23 +01:00
Pony: Fetch skin texture directly from the GL matrix
This commit is contained in:
parent
c57a48065e
commit
50686dd1b4
3 changed files with 34 additions and 78 deletions
|
@ -1,7 +0,0 @@
|
||||||
package com.minelittlepony.client.ducks;
|
|
||||||
|
|
||||||
import net.minecraft.client.texture.NativeImage;
|
|
||||||
|
|
||||||
public interface IBufferedTexture {
|
|
||||||
NativeImage getBufferedImage();
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package com.minelittlepony.client.mixin;
|
|
||||||
|
|
||||||
import net.minecraft.client.texture.NativeImage;
|
|
||||||
import net.minecraft.client.texture.PlayerSkinTexture;
|
|
||||||
import net.minecraft.client.texture.ResourceTexture;
|
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
import com.minelittlepony.client.ducks.IBufferedTexture;
|
|
||||||
|
|
||||||
@Mixin(PlayerSkinTexture.class)
|
|
||||||
public abstract class MixinThreadDownloadImageData extends ResourceTexture implements IBufferedTexture {
|
|
||||||
|
|
||||||
MixinThreadDownloadImageData() {super(null);}
|
|
||||||
|
|
||||||
private NativeImage cachedImage;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NativeImage getBufferedImage() {
|
|
||||||
return cachedImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "method_4534("
|
|
||||||
+ "Lnet/minecraft/client/texture/NativeImage;)V",
|
|
||||||
at = @At("HEAD"))
|
|
||||||
private void onSetImage(NativeImage skin, CallbackInfo info) {
|
|
||||||
cachedImage = new NativeImage(skin.getFormat(), skin.getWidth(), skin.getHeight(), false);
|
|
||||||
cachedImage.copyFrom(skin);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,39 +3,41 @@ package com.minelittlepony.client.pony;
|
||||||
import com.google.common.base.MoreObjects;
|
import com.google.common.base.MoreObjects;
|
||||||
import com.minelittlepony.MineLittlePony;
|
import com.minelittlepony.MineLittlePony;
|
||||||
import com.minelittlepony.client.PonyRenderManager;
|
import com.minelittlepony.client.PonyRenderManager;
|
||||||
import com.minelittlepony.client.ducks.IBufferedTexture;
|
|
||||||
import com.minelittlepony.client.render.IPonyRender;
|
import com.minelittlepony.client.render.IPonyRender;
|
||||||
import com.minelittlepony.client.transform.PonyTransformation;
|
import com.minelittlepony.client.transform.PonyTransformation;
|
||||||
import com.minelittlepony.pony.IPony;
|
import com.minelittlepony.pony.IPony;
|
||||||
import com.minelittlepony.pony.IPonyData;
|
import com.minelittlepony.pony.IPonyData;
|
||||||
import com.minelittlepony.pony.meta.Race;
|
import com.minelittlepony.pony.meta.Race;
|
||||||
import com.minelittlepony.pony.meta.Size;
|
import com.minelittlepony.pony.meta.Size;
|
||||||
|
|
||||||
import net.minecraft.block.Material;
|
import net.minecraft.block.Material;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.texture.Texture;
|
|
||||||
import net.minecraft.client.texture.MissingSprite;
|
import net.minecraft.client.texture.MissingSprite;
|
||||||
import net.minecraft.client.texture.NativeImage;
|
import net.minecraft.client.texture.NativeImage;
|
||||||
import net.minecraft.client.texture.NativeImageBackedTexture;
|
import net.minecraft.client.texture.TextureManager;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.EquipmentSlot;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.entity.EquipmentSlot;
|
|
||||||
import net.minecraft.item.Item;
|
|
||||||
import net.minecraft.item.ArmorItem;
|
import net.minecraft.item.ArmorItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.resource.Resource;
|
import net.minecraft.resource.Resource;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.math.Box;
|
import net.minecraft.util.math.Box;
|
||||||
import net.minecraft.util.math.MathHelper;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import org.lwjgl.BufferUtils;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import static com.mojang.blaze3d.platform.GlStateManager.getTexLevelParameter;
|
||||||
|
import static org.lwjgl.opengl.GL11.*;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
public class Pony implements IPony {
|
public class Pony implements IPony {
|
||||||
|
@ -61,14 +63,6 @@ public class Pony implements IPony {
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeImage ponyTexture = getBufferedImage(resource);
|
NativeImage ponyTexture = getBufferedImage(resource);
|
||||||
|
|
||||||
if (ponyTexture == null) {
|
|
||||||
ponyTexture = new NativeImage(16, 16, true);
|
|
||||||
ponyTexture.copyFrom(MissingSprite.getMissingSpriteTexture().getImage());
|
|
||||||
|
|
||||||
MinecraftClient.getInstance().getTextureManager().registerTexture(resource, new NativeImageBackedTexture(ponyTexture));
|
|
||||||
}
|
|
||||||
|
|
||||||
return checkSkin(ponyTexture);
|
return checkSkin(ponyTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,33 +93,35 @@ public class Pony implements IPony {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static NativeImage getBufferedImage(@Nullable Identifier resource) {
|
public static NativeImage getBufferedImage(@Nullable Identifier resource) {
|
||||||
|
|
||||||
if (resource == null) {
|
if (resource == null) {
|
||||||
return null;
|
return MissingSprite.getMissingSpriteTexture().getImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MinecraftClient mc = MinecraftClient.getInstance();
|
||||||
|
TextureManager textures = mc.getTextureManager();
|
||||||
|
|
||||||
|
// recreate NativeImage from the GL matrix
|
||||||
|
textures.bindTexture(resource);
|
||||||
|
|
||||||
|
int format = getTexLevelParameter(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT);
|
||||||
|
int width = getTexLevelParameter(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH);
|
||||||
|
int height = getTexLevelParameter(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT);
|
||||||
|
|
||||||
|
int channels = 4;
|
||||||
|
if (format == GL_RGB) {
|
||||||
|
channels = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * channels);
|
||||||
|
glGetTexImage(GL_TEXTURE_2D, 0, format, GL_UNSIGNED_BYTE, buffer);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Resource skin = MinecraftClient.getInstance().getResourceManager().getResource(resource);
|
return NativeImage.fromByteBuffer(buffer);
|
||||||
NativeImage skinImage = NativeImage.fromInputStream(skin.getInputStream());
|
} catch (IOException e) {
|
||||||
MineLittlePony.logger.debug("Obtained skin from resource location {}", resource);
|
return MissingSprite.getMissingSpriteTexture().getImage();
|
||||||
|
|
||||||
return skinImage;
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture texture = MinecraftClient.getInstance().getTextureManager().getTexture(resource);
|
|
||||||
|
|
||||||
if (texture instanceof NativeImageBackedTexture) {
|
|
||||||
return ((NativeImageBackedTexture)texture).getImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture instanceof IBufferedTexture) {
|
|
||||||
return ((IBufferedTexture) texture).getBufferedImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IPonyData checkSkin(NativeImage bufferedimage) {
|
private IPonyData checkSkin(NativeImage bufferedimage) {
|
||||||
|
|
Loading…
Reference in a new issue