Package com.prupe.mcpatcher

Source Code of com.prupe.mcpatcher.TessellatorUtils

package com.prupe.mcpatcher;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;
import net.minecraft.src.Icon;
import net.minecraft.src.Tessellator;
import net.minecraft.src.TextureMap;

public class TessellatorUtils {
  private static final MCLogger logger = MCLogger.getLogger("Tilesheet");
  private static final Integer MAGIC_VALUE = Integer.valueOf(305419896);
  private static final Map<TextureMap, String> textureMapNames = new WeakHashMap();
  private static final Map<Icon, TextureMap> iconMap = new HashMap();
  private static Field[] fieldsToCopy;
  public static boolean haveBufferSize;

  public static void clearDefaultTextureMap(Tessellator tessellator) {
    tessellator.textureMap = null;
  }

  public static Tessellator getTessellator(Tessellator tessellator, Icon icon) {
    TextureMap textureMap = (TextureMap)iconMap.get(icon);

    if (textureMap == null) {
      return tessellator;
    } else {
      Tessellator newTessellator = (Tessellator)tessellator.children.get(textureMap);

      if (newTessellator == null) {
        String mapName = (String)textureMapNames.get(textureMap);

        if (mapName == null) {
          mapName = textureMap.toString();
        }

        logger.fine("new Tessellator for texture map %s gl texture %d", new Object[] {mapName, Integer.valueOf(textureMap.glTextureId)});
        newTessellator = new Tessellator(2097152);
        copyFields(tessellator, newTessellator, true);
        newTessellator.textureMap = textureMap;
        tessellator.children.put(textureMap, newTessellator);
      } else {
        copyFields(tessellator, newTessellator, false);
      }

      return newTessellator;
    }
  }

  static void registerTextureMap(TextureMap textureMap, String name) {
    textureMapNames.put(textureMap, name);
  }

  static void registerIcon(TextureMap textureMap, Icon icon) {
    iconMap.put(icon, textureMap);
  }

  private static Field[] getFieldsToCopy(Tessellator tessellator) {
    int saveBufferSize;

    if (haveBufferSize) {
      saveBufferSize = tessellator.bufferSize;
      tessellator.bufferSize = MAGIC_VALUE.intValue();
    } else {
      saveBufferSize = 0;
    }

    int saveVertexCount = tessellator.vertexCount;
    int saveAddedVertices = tessellator.addedVertices;
    int saveRawBufferIndex = tessellator.rawBufferIndex;
    tessellator.vertexCount = MAGIC_VALUE.intValue();
    tessellator.addedVertices = MAGIC_VALUE.intValue();
    tessellator.rawBufferIndex = MAGIC_VALUE.intValue();
    ArrayList fields = new ArrayList();
    Field[] arr$ = Tessellator.class.getDeclaredFields();
    int len$ = arr$.length;

    for (int i$ = 0; i$ < len$; ++i$) {
      Field f = arr$[i$];

      try {
        Class e = f.getType();
        int modifiers = f.getModifiers();

        if (!Modifier.isStatic(modifiers) && e.isPrimitive() && !f.getName().equals("rawBufferSize")) {
          f.setAccessible(true);

          if (e != Integer.TYPE || !MAGIC_VALUE.equals(f.get(tessellator))) {
            logger.finest("copy %s %s %s", new Object[] {Modifier.toString(f.getModifiers()), f.getType().toString(), f.getName()});
            fields.add(f);
          }
        }
      } catch (Throwable var12) {
        var12.printStackTrace();
      }
    }

    if (!haveBufferSize) {
      tessellator.bufferSize = saveBufferSize;
    }

    tessellator.vertexCount = saveVertexCount;
    tessellator.addedVertices = saveAddedVertices;
    tessellator.rawBufferIndex = saveRawBufferIndex;
    return (Field[])fields.toArray(new Field[fields.size()]);
  }

  private static void copyFields(Tessellator a, Tessellator b, boolean isNew) {
    if (fieldsToCopy == null) {
      fieldsToCopy = getFieldsToCopy(a);
    }

    Field[] arr$ = fieldsToCopy;
    int len$ = arr$.length;

    for (int i$ = 0; i$ < len$; ++i$) {
      Field field = arr$[i$];

      try {
        Object e = field.get(a);

        if (isNew) {
          logger.finest("copy %s %s %s = %s", new Object[] {Modifier.toString(field.getModifiers()), field.getType(), field.getName(), e});
        }

        field.set(b, e);
      } catch (IllegalAccessException var8) {
        var8.printStackTrace();
      }
    }

    if (a.isDrawing && !b.isDrawing) {
      b.startDrawing(a.drawMode);
    } else if (!a.isDrawing && b.isDrawing) {
      b.reset();
    }
  }

  static void clear(Tessellator tessellator) {
    Iterator i$ = tessellator.children.values().iterator();

    while (i$.hasNext()) {
      Tessellator child = (Tessellator)i$.next();
      clear(child);
    }

    tessellator.children.clear();
    textureMapNames.clear();
    iconMap.clear();
  }

  public static void resetChildren(Tessellator tessellator) {
    Iterator i$ = tessellator.children.values().iterator();

    while (i$.hasNext()) {
      Tessellator child = (Tessellator)i$.next();
      child.reset();
    }
  }

  public static int drawChildren(int sum, Tessellator tessellator) {
    Tessellator child;

    for (Iterator i$ = tessellator.children.values().iterator(); i$.hasNext(); sum += child.draw()) {
      child = (Tessellator)i$.next();
    }

    return sum;
  }

  public static void startDrawingChildren(Tessellator tessellator, int drawMode) {
    Iterator i$ = tessellator.children.values().iterator();

    while (i$.hasNext()) {
      Tessellator child = (Tessellator)i$.next();
      child.startDrawing(drawMode);
    }
  }

  private static String toString(Tessellator tessellator) {
    if (tessellator == null) {
      return "Tessellator{null}";
    } else {
      String desc = tessellator.toString();
      TextureMap textureMap = tessellator.textureMap;

      if (textureMap != null) {
        String mapName = (String)textureMapNames.get(textureMap);

        if (mapName == null) {
          desc = textureMap.toString();
        } else {
          desc = mapName;
        }
      }

      return String.format("Tessellator{%s, isDrawing=%s, %d children}", new Object[] {desc, Boolean.valueOf(tessellator.isDrawing), Integer.valueOf(tessellator.children.size())});
    }
  }
}
TOP

Related Classes of com.prupe.mcpatcher.TessellatorUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.