Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.79 KB | None | 0 0
  1. package team.chisel.client.render;
  2.  
  3. import java.awt.geom.Rectangle2D;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Set;
  7.  
  8. import javax.annotation.Nullable;
  9.  
  10. import lombok.Getter;
  11. import lombok.RequiredArgsConstructor;
  12. import lombok.Setter;
  13. import lombok.ToString;
  14. import lombok.Value;
  15. import lombok.experimental.NonFinal;
  16. import net.minecraft.client.Minecraft;
  17. import net.minecraft.client.renderer.block.model.BakedQuad;
  18. import net.minecraft.client.renderer.texture.TextureAtlasSprite;
  19. import net.minecraft.client.renderer.texture.TextureMap;
  20. import net.minecraft.client.renderer.vertex.VertexFormat;
  21. import net.minecraft.client.renderer.vertex.VertexFormatElement;
  22. import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage;
  23. import net.minecraft.util.EnumFacing;
  24. import net.minecraftforge.client.model.pipeline.IVertexConsumer;
  25.  
  26. import org.lwjgl.util.vector.Vector;
  27. import org.lwjgl.util.vector.Vector2f;
  28. import org.lwjgl.util.vector.Vector3f;
  29.  
  30. import com.google.common.collect.ListMultimap;
  31. import com.google.common.collect.Lists;
  32. import com.google.common.collect.MultimapBuilder;
  33. import com.google.common.collect.Sets;
  34.  
  35. @ToString(of = { "verts", "uvs" })
  36. public class Quad {
  37.  
  38. @Value
  39. public static class Vertex {
  40. Vector3f pos;
  41. Vector2f uvs;
  42. }
  43.  
  44. public static class UVs {
  45.  
  46. private static final TextureAtlasSprite BASE = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(TextureMap.LOCATION_MISSING_TEXTURE.toString());
  47. private static final float BASE_WIDTH = BASE.getMaxU() - BASE.getMinU(), BASE_HEIGHT = BASE.getMaxV() - BASE.getMinV();
  48.  
  49. @Getter
  50. private TextureAtlasSprite base = BASE;
  51. @Getter
  52. private float width = BASE_WIDTH, height = BASE_HEIGHT;
  53.  
  54. private final Vector2f[] data;
  55.  
  56. @NonFinal
  57. @Getter
  58. float minU, minV, maxU, maxV;
  59.  
  60. private UVs(Vector2f[] data) {
  61. this.data = data;
  62. minU = Float.MAX_VALUE;
  63. minV = Float.MAX_VALUE;
  64. for (Vector2f v : data) {
  65. minU = Math.min(minU, v.x);
  66. minV = Math.min(minV, v.y);
  67. maxU = Math.max(maxU, v.x);
  68. maxV = Math.max(maxV, v.y);
  69. }
  70. }
  71.  
  72. public void transform(TextureAtlasSprite other) {
  73. float scaleU = BASE_WIDTH / (other.getMaxU() - other.getMinU());
  74. float scaleV = BASE_HEIGHT / (other.getMaxV() - other.getMinV());
  75.  
  76. float startU = (minU - BASE.getMinU()) * scaleU;
  77. float startV = (minV - BASE.getMinV()) * scaleV;
  78. float endU = (BASE.getMaxU() - maxU) * scaleU;
  79. float endV = (BASE.getMaxV() - maxV) * scaleV;
  80.  
  81. minU = startU + other.getMinU();
  82. minV = startV + other.getMinV();
  83. maxU = other.getMaxU() - endU;
  84. maxV = other.getMaxV() - endV;
  85.  
  86. base = other;
  87. }
  88.  
  89. public Rectangle2D.Float rect() {
  90. return new Rectangle2D.Float(minU, minV, width, height);
  91. }
  92. }
  93.  
  94. private Vector3f[] verts;
  95. @Getter
  96. private UVs uvs;
  97.  
  98. private Quad(Vector3f[] verts, Vector2f[] uvs) {
  99. this.verts = verts;
  100. this.uvs = new UVs(uvs);
  101. }
  102.  
  103. public void compute() {
  104.  
  105. }
  106.  
  107. public Quad[] subdivide(int count) {
  108. List<Rectangle2D.Float> rects = Lists.newArrayList();
  109. Rectangle2D.Float uvRect = uvs.rect();
  110. normalizeUVs(uvRect);
  111. rects.add(uvRect);
  112.  
  113. Rectangle2D.Float rect2 = divide(uvRect, false);
  114. rects.add(rect2);
  115. if (rect2 != null) {
  116. rects.add(divide(rect2, true));
  117. }
  118. rects.add(divide(uvRect, true));
  119.  
  120. for (Rectangle2D.Float rect : rects) {
  121.  
  122. }
  123. return null;
  124. }
  125.  
  126. private void normalizeUVs(Rectangle2D.Float rect) {
  127. TextureAtlasSprite sprite = uvs.getBase();
  128. float width = sprite.getMaxU() - sprite.getMinU();
  129. float height = sprite.getMaxV() - sprite.getMinV();
  130. rect.x = normalize(sprite.getMinU(), sprite.getMaxU(), rect.x);
  131. rect.y = normalize(sprite.getMinV(), sprite.getMaxV(), rect.y);
  132. rect.width /= width;
  133. rect.height /= height;
  134. }
  135.  
  136. @Nullable
  137. private Rectangle2D.Float divide(Rectangle2D.Float rect, boolean vertical) {
  138. float min, max;
  139. if (vertical) {
  140. min = rect.y;
  141. max = rect.y + rect.height;
  142. } else {
  143. min = rect.x;
  144. max = rect.x + rect.width;
  145. }
  146. if (min < 0.5 && max > 0.5) {
  147. Rectangle2D.Float split = new Rectangle2D.Float(rect.x, rect.y, vertical ? rect.width : 0.5f - rect.x, vertical ? 0.5f - rect.y : rect.height);
  148. if (vertical) {
  149. rect.height -= 0.5f - rect.y;
  150. rect.y = 0.5f;
  151. } else {
  152. rect.width -= 0.5f - rect.x;
  153. rect.x = 0.5f;
  154. }
  155. return split;
  156. } else {
  157. return null;
  158. }
  159. }
  160.  
  161. private float normalize(float min, float max, float x) {
  162. return (x - min) / (max - min);
  163. }
  164.  
  165. public static Quad from(BakedQuad baked, VertexFormat fmt) {
  166. Builder b = new Builder(fmt);
  167. baked.pipe(b);
  168. return b.build();
  169. }
  170.  
  171. @RequiredArgsConstructor
  172. public static class Builder implements IVertexConsumer {
  173.  
  174. @Getter
  175. private final VertexFormat vertexFormat;
  176.  
  177. @Setter
  178. private int quadTint;
  179.  
  180. @Setter
  181. private EnumFacing quadOrientation;
  182.  
  183. @Override
  184. public void setQuadColored() {}
  185.  
  186. private ListMultimap<VertexFormatElement.EnumUsage, float[]> data = MultimapBuilder.enumKeys(EnumUsage.class).arrayListValues().build();
  187.  
  188. @Override
  189. public void put(int element, float... data) {
  190. if (element == 2) {
  191. System.out.println(Arrays.toString(data));
  192. }
  193. float[] copy = new float[data.length];
  194. System.arraycopy(data, 0, copy, 0, data.length);
  195. this.data.put(vertexFormat.getElement(element).getUsage(), copy);
  196. }
  197.  
  198. public Quad build() {
  199. Vector3f[] verts = fromData(data.get(EnumUsage.POSITION), 3);
  200. Vector2f[] uvs = fromData(data.get(EnumUsage.UV), 2);
  201. return new Quad(verts, uvs);
  202. }
  203.  
  204. @SuppressWarnings("unchecked")
  205. private <T extends Vector> T[] fromData(List<float[]> data, int size) {
  206. Vector[] ret = size == 2 ? new Vector2f[data.size()] : new Vector3f[data.size()];
  207. for (int i = 0; i < data.size(); i++) {
  208. ret[i] = size == 2 ? new Vector2f(data.get(i)[0], data.get(i)[1]) : new Vector3f(data.get(i)[0], data.get(i)[1], data.get(i)[2]);
  209. }
  210. return (T[]) ret;
  211. }
  212. }
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement