View difference between Paste ID: 0YixvSer and 0AcY6YV2
SHOW: | | - or go back to the newest paste.
1
package net.minecraft.client.model.geom;
2
3
import java.awt.*;
4
import java.awt.image.BufferedImage;
5
import java.io.*;
6
import java.util.*;
7
import java.util.List;
8
9
import javax.imageio.ImageIO;
10
import net.minecraft.src.MathHelper;
11-
import net.minecraft.client.model.dragon.DragonModel;
11+
import net.minecraft.src.ModelBox;
12-
import util.Mth;
12+
import net.minecraft.src.ModelDragon;
13
import net.minecraft.src.ModelRenderer;
14
15
public class ImageGenerator {
16
    private static final int WIDTH = 256;
17
    private static final int HEIGHT = 256;
18
19
    private class Region {
20
        public int x1, y1, x2, y2;
21
22
        public Region(int x1, int y1, int x2, int y2) {
23
            this.x1 = x1;
24
            this.y1 = y1;
25
            this.x2 = x2;
26
            this.y2 = y2;
27
        }
28
29
        public void move(int xo, int yo) {
30
            x1 += xo;
31
            y1 += yo;
32
            x2 += xo;
33
            y2 += yo;
34
        }
35
36
        public boolean overlaps(Region r2, int xo, int yo) {
37
            if (r2.x2 + xo <= x1) return false;
38
            if (r2.y2 + yo <= y1) return false;
39
            if (r2.x1 + xo >= x2) return false;
40
            if (r2.y1 + yo >= y2) return false;
41
            return true;
42
        }
43
44
        public void render(Graphics g) {
45
            g.fillRect(x1, y1, x2 - x1, y2 - y1);
46
        }
47
    }
48
49
    private class UnfoldedCube {
50
        public int x, y;
51
        public Region[] cubeRegions = new Region[6];
52
        public String id;
53
        public int width, height;
54-
        public UnfoldedCube(Cube cube) {
54+
55-
            int xs = Mth.ceil(cube.x1 - cube.x0);
55+
        public UnfoldedCube(ModelBox cube) {
56-
            int ys = Mth.ceil(cube.y1 - cube.y0);
56+
//            int xs = Mth.ceil(cube.x1 - cube.x0);
57-
            int zs = Mth.ceil(cube.z1 - cube.z0);
57+
//            int ys = Mth.ceil(cube.y1 - cube.y0);
58
//            int zs = Mth.ceil(cube.z1 - cube.z0);
59
            int xs = MathHelper.func_40346_b(cube.field_40674_d - cube.field_40678_a);
60
            int ys = MathHelper.func_40346_b(cube.field_40675_e - cube.field_40676_b);
61
            int zs = MathHelper.func_40346_b(cube.field_40672_f - cube.field_40677_c);
62-
            id = cube.id;
62+
63
            width = xs * 2 + zs * 2;
64
            height = zs + ys;
65
66
            id = cube.field_40673_g;
67
68
            cubeRegions[0] = new Region(0, zs, zs, zs + ys);
69
            cubeRegions[1] = new Region(zs, zs, zs + xs, zs + ys);
70
            cubeRegions[2] = new Region(zs + xs, zs, zs + xs + zs, zs + ys);
71
            cubeRegions[3] = new Region(zs + xs + zs, zs, zs + xs + zs + xs, zs + ys);
72
            cubeRegions[4] = new Region(zs, 0, zs + xs, zs);
73
            cubeRegions[5] = new Region(zs + xs, 0, zs + xs * 2, zs);
74
        }
75
76
        public boolean fits(int x, int y) {
77
            for (int i = 0; i < 6; i++) {
78
                if (!isFree(cubeRegions[i], x, y)) return false;
79
            }
80
            return true;
81
        }
82
83
        public void place(int x, int y) {
84
            this.x = x;
85
            this.y = y;
86
            for (int i = 0; i < 6; i++) {
87
                cubeRegions[i].move(x, y);
88
                occupiedRegions.add(cubeRegions[i]);
89
            }
90
        }
91
92
        public void render(Graphics g) {
93
            float hue = (float) Math.random();
94
            g.setColor(new Color(Color.HSBtoRGB(hue, 1, 0.7f)));
95
            cubeRegions[5].render(g);
96
            g.setColor(new Color(Color.HSBtoRGB(hue, 1, 1.0f)));
97
            cubeRegions[4].render(g);
98
            g.setColor(new Color(Color.HSBtoRGB(hue, 1, 0.9f)));
99
            cubeRegions[1].render(g);
100
            cubeRegions[3].render(g);
101
            g.setColor(new Color(Color.HSBtoRGB(hue, 1, 0.8f)));
102
            cubeRegions[0].render(g);
103
            cubeRegions[2].render(g);
104
        }
105
    }
106
107
    private List<Region> occupiedRegions = new ArrayList<Region>();
108
109
    private boolean isFree(Region region, int xo, int yo) {
110
        if (region.x1 + xo < 0) return false;
111
        if (region.y1 + yo < 0) return false;
112
        if (region.x2 + xo > WIDTH) return false;
113
        if (region.y2 + yo > HEIGHT) return false;
114
115
        for (int i = 0; i < occupiedRegions.size(); i++) {
116
            if (occupiedRegions.get(i).overlaps(region, xo, yo)) return false;
117
        }
118-
    public void generateImage(List<ModelPart> parts) {
118+
119
        return true;
120-
        List<Cube> cubes = new ArrayList<Cube>();
120+
121-
        for (ModelPart mp : parts) {
121+
122
    public void generateImage(List<ModelRenderer> parts) {
123
124
        List<ModelBox> cubes = new ArrayList<ModelBox>();
125-
        Collections.sort(cubes, new Comparator<Cube>() {
125+
        for (ModelRenderer mp : parts) {
126
            getCubes(mp, cubes);
127-
            public int compare(Cube c0, Cube c1) {
127+
128-
                int xs = Mth.ceil(c0.x1 - c0.x0);
128+
129-
                int ys = Mth.ceil(c0.y1 - c0.y0);
129+
        Collections.sort(cubes, new Comparator<ModelBox>() {
130-
                int zs = Mth.ceil(c0.z1 - c0.z0);
130+
131
            public int compare(ModelBox c0, ModelBox c1) {
132
//                int xs = Mth.ceil(c0.x1 - c0.x0);
133
//                int ys = Mth.ceil(c0.y1 - c0.y0);
134
//                int zs = Mth.ceil(c0.z1 - c0.z0);
135-
                xs = Mth.ceil(c1.x1 - c1.x0);
135+
                int xs = MathHelper.func_40346_b(c0.field_40674_d - c0.field_40678_a);
136-
                ys = Mth.ceil(c1.y1 - c1.y0);
136+
                int ys = MathHelper.func_40346_b(c0.field_40675_e - c0.field_40676_b);
137-
                zs = Mth.ceil(c1.z1 - c1.z0);
137+
                int zs = MathHelper.func_40346_b(c0.field_40672_f - c0.field_40677_c);
138
139
                int ww0 = xs * 2 + zs * 2;
140
                int hh0 = zs + ys;
141
142
//                xs = Mth.ceil(c1.x1 - c1.x0);
143
//                ys = Mth.ceil(c1.y1 - c1.y0);
144
//                zs = Mth.ceil(c1.z1 - c1.z0);
145
                xs = MathHelper.func_40346_b(c1.field_40674_d - c1.field_40678_a);
146
                ys = MathHelper.func_40346_b(c1.field_40675_e - c1.field_40676_b);
147
                zs = MathHelper.func_40346_b(c1.field_40672_f - c1.field_40677_c);
148
149
                int ww1 = xs * 2 + zs * 2;
150
                int hh1 = zs + ys;
151
152
                if (ww0 * hh0 < ww1 * hh1) {
153-
        for (Cube cube : cubes) {
153+
154
                } else if (ww0 * hh0 > ww1 * hh1) {
155
                    return -1;
156
                }
157
158
                return 0;
159
            }
160
        });
161
162
        List<UnfoldedCube> unfolded = new ArrayList<UnfoldedCube>();
163
        for (ModelBox cube : cubes) {
164
            UnfoldedCube uc = new UnfoldedCube(cube);
165
166
            boolean placed = false;
167
            positionLoop: for (int y = 0; y < HEIGHT - uc.height; y++) {
168
                for (int x = 0; x < WIDTH - uc.width; x++) {
169
                    if (uc.fits(x, y)) {
170
                        uc.place(x, y);
171
                        placed = true;
172
                        break positionLoop;
173
                    }
174
                }
175
            }
176
            if (!placed) {
177-
            System.out.println("setMapTex(\"" + uc.id + "\", " + uc.x + ", " + uc.y + ");");
177+
178
            } else {
179
                unfolded.add(uc);
180
            }
181
        }
182
183
        BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
184
        Graphics g = img.getGraphics();
185
        System.out.println("----------------");
186
        for (UnfoldedCube uc : unfolded) {
187-
    public void getCubes(ModelPart mp, List<Cube> cubeList) {
187+
            System.out.println("setTextureOffset(\"" + uc.id + "\", " + uc.x + ", " + uc.y + ");");
188-
        addLoop: for (Cube cube : mp.cubes) {
188+
189-
            if (cube.id != null) {
189+
190-
                for (Cube otherCube : cubeList) {
190+
191-
                    if (otherCube.id != null) {
191+
192-
                        if (otherCube.id.equals(cube.id)) {
192+
193-
                            System.out.println("Duplicate " + cube.id);
193+
194
        }
195
    }
196
197
    public void getCubes(ModelRenderer mp, List<ModelBox> cubeList) {
198
        addLoop: for (Object cubeObj : mp.cubeList) {
199
            ModelBox cube = (ModelBox) cubeObj;
200
            if (cube.field_40673_g != null) {
201
                for (ModelBox otherCube : cubeList) {
202
                    if (otherCube.field_40673_g != null) {
203
                        if (otherCube.field_40673_g.equals(cube.field_40673_g)) {
204-
        new ImageGenerator().generateImage(new DragonModel(0).cubes);
204+
                            System.out.println("Duplicate " + cube.field_40673_g);
205
                            continue addLoop;
206
                        }
207
                    }
208
                }
209
            }
210
            cubeList.add(cube);
211
        }
212
    }
213
214
    public static void main(String[] args) {
215
        new ImageGenerator().generateImage(new ModelDragon(0).boxList);
216
    }
217
}
218
219
220