PageRenderTime 72ms CodeModel.GetById 43ms RepoModel.GetById 1ms app.codeStats 0ms

/newcode/src/com/prupe/mcpatcher/cc/ColorizeBlock.java

https://bitbucket.org/michael_rodrigues/mcpatcher
Java | 310 lines | 271 code | 39 blank | 0 comment | 57 complexity | 47c91a2cee8a97b58909ff46340a9a8d MD5 | raw file
  1. package com.prupe.mcpatcher.cc;
  2. import com.prupe.mcpatcher.Config;
  3. import com.prupe.mcpatcher.MCLogger;
  4. import com.prupe.mcpatcher.MCPatcherUtils;
  5. import com.prupe.mcpatcher.TexturePackAPI;
  6. import net.minecraft.src.Block;
  7. import net.minecraft.src.IBlockAccess;
  8. import net.minecraft.src.ResourceLocation;
  9. import org.lwjgl.opengl.GL11;
  10. import java.util.Arrays;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import java.util.Properties;
  14. public class ColorizeBlock {
  15. private static final MCLogger logger = MCLogger.getLogger(MCPatcherUtils.CUSTOM_COLORS);
  16. private static final ResourceLocation REDSTONE_COLORS = TexturePackAPI.newMCPatcherResourceLocation("colormap/redstone.png");
  17. private static final ResourceLocation STEM_COLORS = TexturePackAPI.newMCPatcherResourceLocation("colormap/stem.png");
  18. private static final ResourceLocation PUMPKIN_STEM_COLORS = TexturePackAPI.newMCPatcherResourceLocation("colormap/pumpkinstem.png");
  19. private static final ResourceLocation MELON_STEM_COLORS = TexturePackAPI.newMCPatcherResourceLocation("colormap/melonstem.png");
  20. private static final ResourceLocation SWAMPGRASSCOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/swampgrass.png");
  21. private static final ResourceLocation SWAMPFOLIAGECOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/swampfoliage.png");
  22. private static final ResourceLocation PINECOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/pine.png");
  23. private static final ResourceLocation BIRCHCOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/birch.png");
  24. private static final ResourceLocation FOLIAGECOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/foliage.png");
  25. private static final ResourceLocation WATERCOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/water.png");
  26. private static final ResourceLocation UNDERWATERCOLOR = TexturePackAPI.newMCPatcherResourceLocation("colormap/underwater.png");
  27. private static final ResourceLocation FOGCOLOR0 = TexturePackAPI.newMCPatcherResourceLocation("colormap/fog0.png");
  28. private static final ResourceLocation SKYCOLOR0 = TexturePackAPI.newMCPatcherResourceLocation("colormap/sky0.png");
  29. private static final String PALETTE_BLOCK_KEY = "palette.block.";
  30. private static final int BLOCK_ID_PUMPKIN_STEM = 104;
  31. private static final int BLOCK_ID_MELON_STEM = 105;
  32. private static final ColorMap[] blockColorMaps = new ColorMap[Block.blocksList.length]; // bitmaps from palette.block.*
  33. private static final Map<Float, ColorMap> blockMetaColorMaps = new HashMap<Float, ColorMap>(); // bitmaps from palette.block.*
  34. private static int lilypadColor; // lilypad
  35. private static float[][] redstoneColor; // colormap/redstone.png
  36. private static int[] pumpkinStemColors; // colormap/pumpkinstem.png
  37. private static int[] melonStemColors; // colormap/melonstem.png
  38. private static final int blockBlendRadius = Config.getInt(MCPatcherUtils.CUSTOM_COLORS, "blockBlendRadius", 1);
  39. private static final float blockBlendScale = (float) Math.pow(2 * blockBlendRadius + 1, -2);
  40. public static float[] waterColor;
  41. static {
  42. try {
  43. reset();
  44. } catch (Throwable e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. static void reset() {
  49. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SWAMP_GRASS] = new ColorMap(0x4e4e4e);
  50. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SWAMP_FOLIAGE] = new ColorMap(0x4e4e4e);
  51. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_PINE] = new ColorMap(0x619961);
  52. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_BIRCH] = new ColorMap(0x80a755);
  53. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_FOLIAGE] = new ColorMap(0x48b518);
  54. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_WATER] = new ColorMap(0xffffff);
  55. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_UNDERWATER] = new ColorMap(0x050533);
  56. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_FOG0] = new ColorMap(0xc0d8ff);
  57. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SKY0] = new ColorMap(0xffffff);
  58. Arrays.fill(blockColorMaps, null);
  59. blockMetaColorMaps.clear();
  60. lilypadColor = 0x208030;
  61. waterColor = new float[]{0.2f, 0.3f, 1.0f};
  62. redstoneColor = null;
  63. pumpkinStemColors = null;
  64. melonStemColors = null;
  65. }
  66. static void reloadColorMaps(Properties properties) {
  67. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SWAMP_GRASS].loadColorMap(Colorizer.useSwampColors, SWAMPGRASSCOLOR);
  68. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SWAMP_FOLIAGE].loadColorMap(Colorizer.useSwampColors, SWAMPFOLIAGECOLOR);
  69. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_PINE].loadColorMap(Colorizer.useTreeColors, PINECOLOR);
  70. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_BIRCH].loadColorMap(Colorizer.useTreeColors, BIRCHCOLOR);
  71. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_FOLIAGE].loadColorMap(Colorizer.useTreeColors, FOLIAGECOLOR);
  72. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_FOLIAGE].clear();
  73. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_WATER].loadColorMap(Colorizer.useWaterColors, WATERCOLOR);
  74. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_UNDERWATER].loadColorMap(Colorizer.useWaterColors, UNDERWATERCOLOR);
  75. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_FOG0].loadColorMap(Colorizer.useFogColors, FOGCOLOR0);
  76. Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_SKY0].loadColorMap(Colorizer.useFogColors, SKYCOLOR0);
  77. }
  78. static void reloadSwampColors(Properties properties) {
  79. int[] temp = new int[]{lilypadColor};
  80. Colorizer.loadIntColor("lilypad", temp, 0);
  81. lilypadColor = temp[0];
  82. }
  83. static void reloadBlockColors(Properties properties) {
  84. for (Map.Entry<Object, Object> entry : properties.entrySet()) {
  85. if (!(entry.getKey() instanceof String) || !(entry.getValue() instanceof String)) {
  86. continue;
  87. }
  88. String key = (String) entry.getKey();
  89. String value = (String) entry.getValue();
  90. if (!key.startsWith(PALETTE_BLOCK_KEY)) {
  91. continue;
  92. }
  93. ResourceLocation address = TexturePackAPI.parseResourceLocation(Colorizer.COLOR_PROPERTIES, key.substring(PALETTE_BLOCK_KEY.length()).trim());
  94. if (address == null) {
  95. continue;
  96. }
  97. ColorMap colorMap = new ColorMap(0xffffff);
  98. colorMap.loadColorMap(true, address);
  99. if (!colorMap.isCustom()) {
  100. continue;
  101. }
  102. for (String idString : value.split("\\s+")) {
  103. String[] tokens = idString.split(":");
  104. int[] tokensInt = new int[tokens.length];
  105. try {
  106. for (int i = 0; i < tokens.length; i++) {
  107. tokensInt[i] = Integer.parseInt(tokens[i]);
  108. }
  109. } catch (NumberFormatException e) {
  110. continue;
  111. }
  112. switch (tokensInt.length) {
  113. case 1:
  114. if (tokensInt[0] < 0 || tokensInt[0] >= blockColorMaps.length) {
  115. continue;
  116. }
  117. blockColorMaps[tokensInt[0]] = colorMap;
  118. break;
  119. case 2:
  120. blockMetaColorMaps.put(ColorMap.getBlockMetaKey(tokensInt[0], tokensInt[1]), colorMap);
  121. break;
  122. default:
  123. continue;
  124. }
  125. logger.finer("using %s for block %s, default color %06x", key, idString, colorMap.colorize());
  126. }
  127. }
  128. }
  129. static void reloadRedstoneColors(Properties properties) {
  130. int[] rgb = MCPatcherUtils.getImageRGB(TexturePackAPI.getImage(REDSTONE_COLORS));
  131. if (rgb != null && rgb.length >= 16) {
  132. redstoneColor = new float[16][];
  133. for (int i = 0; i < 16; i++) {
  134. float[] f = new float[3];
  135. Colorizer.intToFloat3(rgb[i], f);
  136. redstoneColor[i] = f;
  137. }
  138. }
  139. }
  140. static void reloadStemColors(Properties properties) {
  141. int[] stemColors = getStemRGB(STEM_COLORS);
  142. pumpkinStemColors = getStemRGB(PUMPKIN_STEM_COLORS);
  143. if (pumpkinStemColors == null) {
  144. pumpkinStemColors = stemColors;
  145. }
  146. melonStemColors = getStemRGB(MELON_STEM_COLORS);
  147. if (melonStemColors == null) {
  148. melonStemColors = stemColors;
  149. }
  150. }
  151. private static int[] getStemRGB(ResourceLocation resource) {
  152. int[] rgb = MCPatcherUtils.getImageRGB(TexturePackAPI.getImage(resource));
  153. return rgb == null || rgb.length < 8 ? null : rgb;
  154. }
  155. public static int colorizeBiome(int defaultColor, int index, double temperature, double rainfall) {
  156. return Colorizer.fixedColorMaps[index].colorize(defaultColor, temperature, rainfall);
  157. }
  158. public static int colorizeBiome(int defaultColor, int index) {
  159. return Colorizer.fixedColorMaps[index].colorize(defaultColor);
  160. }
  161. public static int colorizeBiome(int defaultColor, int index, int i, int j, int k) {
  162. return Colorizer.fixedColorMaps[index].colorize(defaultColor, i, j, k);
  163. }
  164. public static int colorizeBiomeWithBlending(int defaultColor, int index, int i, int j, int k) {
  165. return colorizeWithBlending(Colorizer.fixedColorMaps[index], defaultColor, i, j, k);
  166. }
  167. public static int colorizeWater(Object dummy, int i, int k) {
  168. return Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_WATER].colorize(BiomeHelper.getWaterColorMultiplier(i, 64, k), i, 64, k);
  169. }
  170. public static int colorizeBlock(Block block, int i, int j, int k, int metadata) {
  171. ColorMap colorMap = null;
  172. if (!blockMetaColorMaps.isEmpty()) {
  173. colorMap = blockMetaColorMaps.get(ColorMap.getBlockMetaKey(block.blockID, metadata));
  174. }
  175. if (colorMap == null && block.blockID >= 0 && block.blockID < blockColorMaps.length) {
  176. colorMap = blockColorMaps[block.blockID];
  177. }
  178. return colorizeWithBlending(colorMap, 0xffffff, i, j, k);
  179. }
  180. private static int colorizeWithBlending(ColorMap colorMap, int defaultColor, int i, int j, int k) {
  181. if (colorMap == null || !colorMap.isCustom() || blockBlendRadius <= 0) {
  182. return defaultColor;
  183. }
  184. float[] sum = new float[3];
  185. float[] sample = new float[3];
  186. for (int di = -blockBlendRadius; di <= blockBlendRadius; di++) {
  187. for (int dk = -blockBlendRadius; dk <= blockBlendRadius; dk++) {
  188. int rgb = colorMap.colorize(defaultColor, i + di, j, k + dk);
  189. Colorizer.intToFloat3(rgb, sample);
  190. sum[0] += sample[0];
  191. sum[1] += sample[1];
  192. sum[2] += sample[2];
  193. }
  194. }
  195. sum[0] *= blockBlendScale;
  196. sum[1] *= blockBlendScale;
  197. sum[2] *= blockBlendScale;
  198. return Colorizer.float3ToInt(sum);
  199. }
  200. public static int colorizeBlock(Block block) {
  201. ColorMap colorMap = blockColorMaps[block.blockID];
  202. if (colorMap == null) {
  203. return 0xffffff;
  204. } else {
  205. return colorMap.colorize(0xffffff);
  206. }
  207. }
  208. public static int colorizeStem(int defaultColor, Block block, int blockMetadata) {
  209. int[] colors;
  210. switch (block.blockID) {
  211. case BLOCK_ID_PUMPKIN_STEM:
  212. colors = pumpkinStemColors;
  213. break;
  214. case BLOCK_ID_MELON_STEM:
  215. colors = melonStemColors;
  216. break;
  217. default:
  218. return defaultColor;
  219. }
  220. return colors == null ? defaultColor : colors[blockMetadata & 0x7];
  221. }
  222. public static int getLilyPadColor() {
  223. return lilypadColor;
  224. }
  225. public static int getItemColorFromDamage(int defaultColor, int blockID, int damage) {
  226. if (blockID == 8 || blockID == 9) {
  227. return colorizeBiome(defaultColor, Colorizer.COLOR_MAP_WATER);
  228. } else {
  229. return defaultColor;
  230. }
  231. }
  232. public static boolean computeRedstoneWireColor(int current) {
  233. if (redstoneColor == null) {
  234. return false;
  235. } else {
  236. System.arraycopy(redstoneColor[Math.max(Math.min(current, 15), 0)], 0, Colorizer.setColor, 0, 3);
  237. return true;
  238. }
  239. }
  240. public static int colorizeRedstoneWire(IBlockAccess blockAccess, int i, int j, int k, int defaultColor) {
  241. if (redstoneColor == null) {
  242. return defaultColor;
  243. } else {
  244. int metadata = Math.max(Math.min(blockAccess.getBlockMetadata(i, j, k), 15), 0);
  245. return Colorizer.float3ToInt(redstoneColor[metadata]);
  246. }
  247. }
  248. public static boolean computeWaterColor(double x, double y, double z) {
  249. if (Colorizer.useParticleColors && Colorizer.fixedColorMaps[Colorizer.COLOR_MAP_WATER].isCustom()) {
  250. int rgb = colorizeBiome(0xffffff, Colorizer.COLOR_MAP_WATER, (int) x, (int) y, (int) z);
  251. float[] multiplier = new float[3];
  252. Colorizer.intToFloat3(rgb, multiplier);
  253. for (int i = 0; i < 3; i++) {
  254. waterColor[i] = multiplier[i] * ColorizeEntity.waterBaseColor[i];
  255. }
  256. return true;
  257. } else {
  258. return false;
  259. }
  260. }
  261. public static void computeWaterColor() {
  262. int rgb = colorizeBiome(0xffffff, Colorizer.COLOR_MAP_WATER);
  263. Colorizer.intToFloat3(rgb, waterColor);
  264. }
  265. public static void colorizeWaterBlockGL(int blockID) {
  266. if (blockID == 8 || blockID == 9) {
  267. computeWaterColor();
  268. GL11.glColor4f(waterColor[0], waterColor[1], waterColor[2], 1.0f);
  269. }
  270. }
  271. }