mirror of
https://github.com/GTNewHorizons/CodeChickenCore.git
synced 2026-11-11 15:57:42 +00:00
78 lines
2.4 KiB
Java
78 lines
2.4 KiB
Java
package codechicken.lib.gui;
|
|||
|
|
|
||
|
|
import codechicken.lib.render.CCRenderState;
|
||
|
|
import codechicken.lib.render.TextureDataHolder;
|
||
|
|
import codechicken.lib.render.TextureUtils;
|
||
|
|
import net.minecraft.client.renderer.Tessellator;
|
||
|
|
import net.minecraft.util.ResourceLocation;
|
||
|
|
|
||
|
|
public class Canvas9Seg
|
||
|
|
{
|
||
|
|
public final ResourceLocation tex;
|
||
|
|
public float[] seg_u = new float[4];
|
||
|
|
public float[] seg_v = new float[4];
|
||
|
|
public int[] seg_w = new int[3];
|
||
|
|
public int[] seg_h = new int[3];
|
||
|
|
|
||
|
|
public Canvas9Seg(ResourceLocation tex) {
|
||
|
|
this.tex = tex;
|
||
|
|
load();
|
||
|
|
}
|
||
|
|
|
||
|
|
private int[] readMarkers(TextureDataHolder data, int stride, int size) {
|
||
|
|
int[] markers = new int[4];
|
||
|
|
|
||
|
|
int marker = 1;
|
||
|
|
int prev_col = data.data[0];
|
||
|
|
for(int i = 1; i < size; i++) {
|
||
|
|
if(data.data[i*stride] != prev_col) {
|
||
|
|
markers[marker] = i;
|
||
|
|
prev_col = data.data[i*stride];
|
||
|
|
if(++marker == 4)
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
markers[0] += 1;
|
||
|
|
markers[3] -= 1;
|
||
|
|
return markers;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void parseMarkers(TextureDataHolder data, int stride, int size, int[] sizes, float[] texcoords) {
|
||
|
|
int[] markers = readMarkers(data, stride, size);
|
||
|
|
for(int i = 0; i < 4; i++) {
|
||
|
|
texcoords[i] = markers[i]/(float)size;
|
||
|
|
if(i > 0)
|
||
|
|
sizes[i-1] = markers[i]-markers[i-1];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void load() {
|
||
|
|
TextureDataHolder data = TextureUtils.loadTexture(tex);
|
||
|
|
parseMarkers(data, 1, data.width, seg_w, seg_u);
|
||
|
|
parseMarkers(data, data.width, data.height, seg_h, seg_v);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void drawSeg(int[] sw, int[] sh, int seg) {
|
||
|
|
Tessellator t = Tessellator.instance;
|
||
|
|
int u = seg%3; int v = seg/3;
|
||
|
|
t.addVertexWithUV(sw[u], sh[v], 0, seg_u[u], seg_v[v]);
|
||
|
|
t.addVertexWithUV(sw[u], sh[v+1], 0, seg_u[u], seg_v[v+1]);
|
||
|
|
t.addVertexWithUV(sw[u+1], sh[v+1], 0, seg_u[u+1], seg_v[v+1]);
|
||
|
|
t.addVertexWithUV(sw[u+1], sh[v], 0, seg_u[u+1], seg_v[v]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void draw(int x, int y, int w, int h) {
|
||
|
|
CCRenderState.changeTexture(tex);
|
||
|
|
CCRenderState.reset();
|
||
|
|
CCRenderState.startDrawing(7);
|
||
|
|
|
||
|
|
int[] sw = new int[]{x, x+seg_w[0], x+w-seg_w[2], x+w};
|
||
|
|
int[] sh = new int[]{y, y+seg_h[0], y+h-seg_h[2], y+h};
|
||
|
|
|
||
|
|
for(int seg = 0; seg < 9; seg++)
|
||
|
|
drawSeg(sw, sh, seg);
|
||
|
|
|
||
|
|
CCRenderState.draw();
|
||
|
|
}
|
||
|
|
}
|