Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package noki.almagest.asm;
- import java.util.ArrayList;
- import java.util.List;
- import org.lwjgl.opengl.GL11;
- import org.objectweb.asm.ClassReader;
- import org.objectweb.asm.ClassVisitor;
- import org.objectweb.asm.ClassWriter;
- import org.objectweb.asm.MethodVisitor;
- import org.objectweb.asm.Opcodes;
- import org.objectweb.asm.commons.AnalyzerAdapter;
- import net.minecraft.client.Minecraft;
- import net.minecraft.client.renderer.GLAllocation;
- import net.minecraft.client.renderer.GlStateManager;
- import net.minecraft.client.renderer.RenderGlobal;
- import net.minecraft.client.renderer.Tessellator;
- import net.minecraft.client.renderer.VertexBuffer;
- import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
- import net.minecraft.client.renderer.vertex.VertexFormat;
- import net.minecraft.launchwrapper.IClassTransformer;
- import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
- import net.minecraftforge.fml.relauncher.ReflectionHelper;
- import noki.almagest.AlmagestCore;
- import noki.almagest.helper.HelperConstellation;
- import noki.almagest.helper.HelperConstellation.LineData;
- import noki.almagest.helper.HelperConstellation.StarData;
- /**********
- * @class ASMClassTransformer
- *
- * @description 実際にASMによるバイトコード改変を行うクラスです。
- */
- public class ASMClassTransformer implements IClassTransformer, Opcodes {
- //******************************//
- // define member variables.
- //******************************//
- private static final String TARGET_CLASS_NAME = "net.minecraft.client.renderer.RenderGlobal";
- private static net.minecraft.client.renderer.vertex.VertexBuffer lineVBO;
- private static int lineGLCallList;
- //******************************//
- // define member methods.
- //******************************//
- @Override
- public byte[] transform(String name, String transformedName, byte[] basicClass) {
- ASMLoadingPlugin.LOGGER.fine("enter ASMClassTransformer.");
- if (!transformedName.equals(TARGET_CLASS_NAME)) {
- return basicClass;
- }
- try {
- ASMLoadingPlugin.LOGGER.fine("enter transforming.");
- //**この辺りから、ASMの書き方ができます。**//
- //ClassReader, ClassWriter, ClassVisitorで3すくみになるように引数を与えることで処理を早める。
- ClassReader classReader = new ClassReader(basicClass);
- ClassWriter classWriter = new ClassWriter(classReader, 0);
- CustomClassVisitor customVisitor = new CustomClassVisitor(name, classWriter);
- classReader.accept(customVisitor, ClassReader.EXPAND_FRAMES);
- return classWriter.toByteArray();
- //**ここまで**//
- } catch (Exception e) {
- throw new RuntimeException("asm, class transforming failed.", e);
- }
- }
- //--------------------
- // Inner Class.
- //--------------------
- class CustomClassVisitor extends ClassVisitor {
- //*****define member variables.*//
- private String owner;
- private static final String TARGET_METHOD_NAME_OBF = "func_174968_a";
- private static final String TARGET_METHOD_DESC = "(Lnet/minecraft/client/renderer/VertexBuffer;FZ)V";
- @SuppressWarnings("unused")
- private static final String TARGET_METHOD_NAME = "renderSky";
- private static final String TARGET_METHOD_NAME_OBF2 = "func_174963_q";
- private static final String TARGET_METHOD_DESC2 = "()V";
- @SuppressWarnings("unused")
- private static final String TARGET_METHOD_NAME2 = "generateStars";
- private static final String TARGET_METHOD_NAME_OBF3 = "func_180444_a";
- private static final String TARGET_METHOD_DESC3 = "(Lnet/minecraft/client/renderer/VertexBuffer;)V";
- @SuppressWarnings("unused")
- private static final String TARGET_METHOD_NAME3 = "generateStars";
- //*****define member methods.***//
- public CustomClassVisitor(String owner, ClassVisitor cv) {
- super(Opcodes.ASM4, cv);
- this.owner = owner;
- }
- @Override
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- boolean flag1 = TARGET_METHOD_NAME_OBF.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(this.owner, name, desc));
- boolean flag2 = TARGET_METHOD_DESC.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodDesc(desc));
- if(flag1 && flag2) {
- ASMLoadingPlugin.LOGGER.fine("enter method.");
- MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new CustomMethodVisitor(this.api, this.owner, access, name, desc, mv);
- }
- boolean flag3 = TARGET_METHOD_NAME_OBF2.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(this.owner, name, desc));
- boolean flag4 = TARGET_METHOD_DESC2.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodDesc(desc));
- if(flag3 && flag4) {
- ASMLoadingPlugin.LOGGER.fine("enter method 2.");
- MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new CustomMethodVisitor2(this.api, this.owner, access, name, desc, mv);
- }
- boolean flag5 = TARGET_METHOD_NAME_OBF3.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(this.owner, name, desc));
- boolean flag6 = TARGET_METHOD_DESC3.equals(FMLDeobfuscatingRemapper.INSTANCE.mapMethodDesc(desc));
- if(flag5 && flag6) {
- ASMLoadingPlugin.LOGGER.fine("enter method 3.");
- MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new CustomMethodVisitor3(this.api, this.owner, access, name, desc, mv);
- }
- return super.visitMethod(access, name, desc, signature, exceptions);
- }
- }
- //MethodVisitorの代わりにAnalyzerAdapterを使うことで、
- //visitMax()やvisitFrame()の処理をしなくてよくなる。
- //その代わり、各種superメソッドを呼び出す必要がある。
- //COMPUTE_MAXでもそんなに速度落ちないという噂も。
- class CustomMethodVisitor extends AnalyzerAdapter {
- private static final String TARGET_FIELD_NAME_OBF = "field_175013_s";
- @SuppressWarnings("unused")
- private static final String TARGET_FIELD_NAME = "starVBO";
- private boolean starVBOFlag = false;
- private static final String TARGET_FIELD_NAME_OBF2 = "field_72772_v";
- @SuppressWarnings("unused")
- private static final String TARGET_FIELD_NAME2 = "starGLCallList";
- private boolean callListFlag = false;
- protected CustomMethodVisitor(int api, String owner, int access, String name, String desc, MethodVisitor mv) {
- super(api, owner, access, name, desc, mv);
- starVBOFlag = false;
- callListFlag = false;
- }
- @Override
- public void visitCode() {
- starVBOFlag = false;
- callListFlag = false;
- super.visitCode();
- }
- @Override
- public void visitFieldInsn(int opcode, String owner, String name, String desc) {
- if(opcode == GETFIELD
- && TARGET_FIELD_NAME_OBF.equals(FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(owner, name, desc))
- && starVBOFlag == false) {
- starVBOFlag = true;
- super.visitMethodInsn(INVOKESTATIC, "noki/almagest/asm/ASMClassTransformer", "renderLinesForVBO", "()V", false);
- }
- else if(opcode == GETFIELD
- && TARGET_FIELD_NAME_OBF2.equals(FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(owner, name, desc))
- && callListFlag == false) {
- callListFlag = true;
- super.visitMethodInsn(INVOKESTATIC, "noki/almagest/asm/ASMClassTransformer", "renderLinesForCallList", "()V", false);
- }
- super.visitFieldInsn(opcode, owner, name, desc);
- }
- }
- class CustomMethodVisitor2 extends AnalyzerAdapter {
- //*****define member variables.*//
- private String owner2;
- protected CustomMethodVisitor2(int api, String owner, int access, String name, String desc, MethodVisitor mv) {
- super(api, owner, access, name, desc, mv);
- this.owner2 = owner;
- }
- //*****define member methods.***//
- @Override
- public void visitCode() {
- ASMLoadingPlugin.LOGGER.fine("enter visitCode().");
- super.visitCode();
- // super.visitFieldInsn(GETFIELD, this.owner2, "field_175005_X", "Z");
- super.visitMethodInsn(INVOKESTATIC, "noki/almagest/asm/ASMClassTransformer", "generateStarsAlt", "()V", false);
- // super.visitInsn(RETURN);
- // super.visitEnd();
- }
- }
- class CustomMethodVisitor3 extends AnalyzerAdapter {
- //*****define member variables.*//
- //*****define member methods.***//
- protected CustomMethodVisitor3(int api, String owner, int access, String name, String desc, MethodVisitor mv) {
- super(api, owner, access, name, desc, mv);
- }
- @Override
- public void visitCode() {
- ASMLoadingPlugin.LOGGER.fine("enter visitCode().");
- super.visitCode();
- super.visitMethodInsn(INVOKESTATIC, "noki/almagest/asm/ASMClassTransformer", "renderStarsAlt", "()V", false);
- super.visitInsn(RETURN);
- super.visitEnd();
- }
- }
- public static void renderLinesForVBO() {
- AlmagestCore.log("enter renderLinesForVBO().");
- lineVBO.bindBuffer();
- GlStateManager.glEnableClientState(32884);
- GlStateManager.glVertexPointer(3, 5126, 12, 0);
- lineVBO.drawArrays(GL11.GL_LINES);
- lineVBO.unbindBuffer();
- GlStateManager.glDisableClientState(32884);
- }
- public static void renderLinesForCallList() {
- AlmagestCore.log("enter renderLinesForCallList().");
- GlStateManager.callList(lineGLCallList);
- }
- public static void renderStarsAlt() {
- Tessellator tessellator = Tessellator.getInstance();
- VertexBuffer renderer = tessellator.getBuffer();
- renderer.begin(7, DefaultVertexFormats.POSITION);
- for(int i=1; i<=88; i++) {
- ArrayList<StarData> targetStars = HelperConstellation.getStars(i);
- for(StarData each: targetStars) {
- double radius = 200;
- double lat = Math.toRadians(each.getCalculatedLat());
- double lon = Math.toRadians(each.getCalculatedLong());
- double starY = radius * Math.sin(lat);
- double starX = radius * Math.cos(lat) * Math.sin(lon);
- double starZ = radius * Math.cos(lat) * Math.cos(lon);
- renderer.pos(starX, starY, starZ).endVertex();
- renderer.pos(starX, starY, starZ+1).endVertex();
- renderer.pos(starX+1, starY, starZ+1).endVertex();
- renderer.pos(starX+1, starY, starZ).endVertex();
- }
- }
- }
- public static void renderLines(VertexBuffer renderer) {
- /* GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); // alpha blend.
- GL11.glEnable(GL11.GL_BLEND);
- GlStateManager.color(1F, 1F, 1F, 200F/255F);*/
- renderer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION);
- GL11.glLineWidth(1);
- for(int i=1; i<=88; i++) {
- List<LineData> targetLines = HelperConstellation.getLines(i);
- for(LineData each: targetLines) {
- double radius = 200;
- double star1Y = radius * Math.sin(Math.toRadians(each.star1.getCalculatedLat()));
- double star1X = radius * Math.cos(Math.toRadians(each.star1.getCalculatedLat())) * Math.sin(Math.toRadians(each.star1.getCalculatedLong()));
- double star1Z = radius * Math.cos(Math.toRadians(each.star1.getCalculatedLat())) * Math.cos(Math.toRadians(each.star1.getCalculatedLong()));
- double star2Y = radius * Math.sin(Math.toRadians(each.star2.getCalculatedLat()));
- double star2X = radius * Math.cos(Math.toRadians(each.star2.getCalculatedLat())) * Math.sin(Math.toRadians(each.star2.getCalculatedLong()));
- double star2Z = radius * Math.cos(Math.toRadians(each.star2.getCalculatedLat())) * Math.cos(Math.toRadians(each.star2.getCalculatedLong()));
- renderer.pos(star1X, star1Y, star1Z).endVertex();
- renderer.pos(star2X, star2Y, star2Z).endVertex();
- }
- }
- /* GL11.glDisable(GL11.GL_BLEND);
- GlStateManager.resetColor();*/
- }
- public static void generateStarsAlt() {
- AlmagestCore.log("enter generateStarsAlt().");
- //keep renderer.
- Tessellator tessellator = Tessellator.getInstance();
- VertexBuffer vertexBuffer = tessellator.getBuffer();
- //stars.
- RenderGlobal renderGlobal = Minecraft.getMinecraft().renderGlobal;
- if(renderGlobal == null) {
- return;
- }
- /*net.minecraft.client.renderer.vertex.VertexBuffer starVBO =
- ReflectionHelper.getPrivateValue(RenderGlobal.class, renderGlobal, "field_175013_s", "starVBO");
- if(starVBO != null) {
- starVBO.deleteGlBuffers();
- }
- int starGLCallList =
- ReflectionHelper.getPrivateValue(RenderGlobal.class, renderGlobal, "field_72772_v", "starGLCallList");
- if(starGLCallList >= 0) {
- GLAllocation.deleteDisplayLists(starGLCallList);
- ReflectionHelper.setPrivateValue(RenderGlobal.class, renderGlobal, -1, "field_72772_v", "starGLCallList");
- }*/
- boolean vboEnabled =
- ReflectionHelper.getPrivateValue(RenderGlobal.class, renderGlobal, "field_175005_X", "vboEnabled");
- /* if(vboEnabled) {
- VertexFormat vertexBufferFormat =
- ReflectionHelper.getPrivateValue(RenderGlobal.class, renderGlobal, "field_175014_r", "vertexBufferFormat");
- starVBO = new net.minecraft.client.renderer.vertex.VertexBuffer(vertexBufferFormat);
- renderStarsAlt(vertexBuffer);
- vertexBuffer.finishDrawing();
- vertexBuffer.reset();
- starVBO.bufferData(vertexBuffer.getByteBuffer());
- ReflectionHelper.setPrivateValue(RenderGlobal.class, renderGlobal, starVBO, "field_175013_s", "starVBO");
- }
- else {
- starGLCallList = GLAllocation.generateDisplayLists(1);
- ReflectionHelper.setPrivateValue(RenderGlobal.class, renderGlobal, starGLCallList, "field_72772_v", "starGLCallList");
- GlStateManager.pushMatrix();
- GlStateManager.glNewList(starGLCallList, 4864);
- renderStarsAlt(vertexBuffer);
- tessellator.draw();
- GlStateManager.glEndList();
- GlStateManager.popMatrix();
- }*/
- //lines.
- if(lineVBO != null) {
- lineVBO.deleteGlBuffers();
- }
- if(lineGLCallList >= 0) {
- GLAllocation.deleteDisplayLists(lineGLCallList);
- lineGLCallList = -1;
- }
- if(vboEnabled) {
- VertexFormat vertexBufferFormat =
- ReflectionHelper.getPrivateValue(RenderGlobal.class, Minecraft.getMinecraft().renderGlobal, "field_175014_r");
- lineVBO = new net.minecraft.client.renderer.vertex.VertexBuffer(vertexBufferFormat);
- renderLines(vertexBuffer);
- vertexBuffer.finishDrawing();
- vertexBuffer.reset();
- lineVBO.bufferData(vertexBuffer.getByteBuffer());
- }
- else {
- lineGLCallList = GLAllocation.generateDisplayLists(1);
- GlStateManager.pushMatrix();
- GlStateManager.glNewList(lineGLCallList, 4864);
- renderLines(vertexBuffer);
- tessellator.draw();
- GlStateManager.glEndList();
- GlStateManager.popMatrix();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement