Rendering.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package holeg.ui.view.canvas;
  2. import holeg.model.*;
  3. import holeg.preferences.ColorPreference;
  4. import holeg.preferences.ImagePreference;
  5. import holeg.ui.model.GuiSettings;
  6. import holeg.ui.view.image.Import;
  7. import holeg.ui.view.main.Appearance;
  8. import holeg.utility.math.vector.Vec2i;
  9. import java.awt.*;
  10. class Rendering {
  11. private static final RenderingHints RenderingHint = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
  12. RenderingHints.VALUE_ANTIALIAS_ON);
  13. private static final Font CanvasFont = new Font("TimesNewRoman", Font.PLAIN,
  14. Math.max((int) (GuiSettings.getPictureScale() / 3.5f), 10));
  15. private static final BasicStroke OnePixelStroke = new BasicStroke(1);
  16. private static final BasicStroke TwoPixelStroke = new BasicStroke(2);
  17. private static final Dimension SupplyBarDimensions = new Dimension(GuiSettings.getPictureScale(), GuiSettings.getPictureScale() / 5);
  18. private static final Font SupplyBarFont = new Font("TimesNewRoman", Font.PLAIN, (int) (GuiSettings.getPictureScale() * 0.3) - 2);
  19. private static final Image ReplaceSymbol = Import.loadImage(
  20. ImagePreference.Canvas.ReplaceSymbol, 20, 20);
  21. static Graphics2D initGraphics2D(Graphics g) {
  22. Graphics2D g2d = (Graphics2D) g;
  23. g2d.setRenderingHints(RenderingHint);
  24. g2d.setFont(CanvasFont);
  25. return g2d;
  26. }
  27. static void drawSwitchObject(Graphics2D g, HolonSwitch hS) {
  28. drawCanvasObject(g, hS);
  29. }
  30. static void drawHolonObject(Graphics2D g, HolonObject hO) {
  31. Vec2i pos = hO.getPosition();
  32. Color stateColor = ColorPreference.HolonObject.getStateColor(hO.getState());
  33. g.setColor(stateColor);
  34. g.fillRect(pos.getX() - GuiSettings.getPictureScaleDiv2(), pos.getY() - GuiSettings.getPictureScaleDiv2(),
  35. GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
  36. drawCanvasObject(g, hO.getImagePath(), pos);
  37. if (Appearance.supplyBarVisible && (hO.isConsumer() && !hO.getState().equals(HolonObject.HolonObjectState.NO_ENERGY) )) {
  38. drawSupplyBar(g, hO.getSupplyBarPercentage(), stateColor, pos);
  39. }
  40. }
  41. static void drawCanvasObject(Graphics2D g, AbstractCanvasObject obj) {
  42. drawCanvasObject(g, obj.getImagePath(), obj.getPosition());
  43. }
  44. static void drawCanvasObject(Graphics2D g, String imageName, Vec2i pos) {
  45. int pictureScale = GuiSettings.getPictureScale();
  46. int pictureScaleDiv2 = GuiSettings.getPictureScaleDiv2();
  47. Image image = Import.loadImage(imageName, pictureScale, pictureScale);
  48. g.drawImage(image, pos.getX() - pictureScaleDiv2, pos.getY() - pictureScaleDiv2, pictureScale, pictureScale,
  49. null);
  50. }
  51. static void drawNode(Graphics2D g, Node node) {
  52. Vec2i pos = node.getPosition();
  53. drawCanvasObject(g, ImagePreference.Canvas.Node.Unselected, pos);
  54. }
  55. static void drawEdge(Graphics2D g, Edge edge, AbstractCanvasObject a, AbstractCanvasObject b) {
  56. Vec2i start = a.getPosition();
  57. Vec2i end = b.getPosition();
  58. float currentEnergy = edge.getActualFlow();
  59. float capacity = edge.maxCapacity;
  60. boolean unlimited = edge.mode == Edge.EdgeMode.Unlimited;
  61. switch (edge.getState()) {
  62. case Burned -> {
  63. g.setColor(ColorPreference.Edge.Burned);
  64. g.setStroke(TwoPixelStroke);
  65. }
  66. case Working -> {
  67. g.setColor(ColorPreference.Edge.Working);
  68. g.setStroke(new BasicStroke(unlimited ? 2f : (currentEnergy / capacity * 2f) + 1));
  69. }
  70. }
  71. g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
  72. Vec2i middle = new Vec2i((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
  73. if(Appearance.edgeCapacityVisible){
  74. g.drawString(currentEnergy + "/" + (unlimited ? "\u221E" : capacity), middle.getX(), middle.getY());
  75. }
  76. }
  77. static void drawExternConnection(Graphics2D g, AbstractCanvasObject object) {
  78. Vec2i pos = object.getPosition();
  79. Dimension size = new Dimension(16, 16);
  80. Image image = Import.loadImage(ImagePreference.Canvas.ExternSymbol, size.width, size.height);
  81. g.drawImage(image, pos.getX() + GuiSettings.getPictureScaleDiv2(), pos.getY() - GuiSettings.getPictureScaleDiv2() - size.height,
  82. size.width, size.height, null);
  83. }
  84. static void drawNewEdgeLine(Graphics2D g, Vec2i start, Vec2i end) {
  85. g.setStroke(TwoPixelStroke);
  86. g.setColor(ColorPreference.Edge.Working);
  87. g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
  88. }
  89. static void drawGroupNode(Graphics2D g, GroupNode groupNode) {
  90. Vec2i pos = groupNode.getPosition();
  91. g.setColor(Color.gray);
  92. g.fillRect(pos.getX() - GuiSettings.getPictureScaleDiv2(), pos.getY() - GuiSettings.getPictureScaleDiv2(),
  93. GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
  94. drawCanvasObject(g, groupNode.getImagePath(), pos);
  95. }
  96. static void drawSelection(Graphics2D g) {
  97. g.setStroke(OnePixelStroke);
  98. for (AbstractCanvasObject aCps : GuiSettings.getSelectedObjects()) {
  99. Vec2i pos = aCps.getPosition();
  100. if (aCps instanceof Node) {
  101. g.setColor(ColorPreference.Canvas.ObjectSelectionFill);
  102. g.fillOval(pos.getX() - (GuiSettings.getPictureScaleDiv2()),
  103. pos.getY() - (GuiSettings.getPictureScaleDiv2()), GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
  104. g.setColor(ColorPreference.Canvas.ObjectSelectionBorder);
  105. g.drawOval(pos.getX() - (GuiSettings.getPictureScaleDiv2()),
  106. pos.getY() - (GuiSettings.getPictureScaleDiv2()), GuiSettings.getPictureScale(), GuiSettings.getPictureScale());
  107. } else {
  108. g.setColor(ColorPreference.Canvas.ObjectSelectionFill);
  109. g.fillRect(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f),
  110. pos.getY() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f), (int) (GuiSettings.getPictureScale() * 1.5f),
  111. (int) (GuiSettings.getPictureScale() * 1.5f));
  112. g.setColor(ColorPreference.Canvas.ObjectSelectionBorder);
  113. g.drawRect(pos.getX() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f),
  114. pos.getY() - (int) (GuiSettings.getPictureScaleDiv2() * 1.5f), (int) (GuiSettings.getPictureScale() * 1.5f),
  115. (int) (GuiSettings.getPictureScale() * 1.5f));
  116. }
  117. }
  118. }
  119. static void drawSelectionBox(Graphics2D g, Rectangle selectionBox) {
  120. g.setStroke(OnePixelStroke);
  121. g.setColor(ColorPreference.Canvas.MouseSelectionBorder);
  122. g.draw(selectionBox);
  123. g.setColor(ColorPreference.Canvas.MouseSelectionFill);
  124. g.fill(selectionBox);
  125. }
  126. private static void drawSupplyBar(Graphics2D g, float percentage, Color color, Vec2i pos) {
  127. // +1, -2, -1 little Adjustment for pixel perfect alignment
  128. g.setColor(Color.WHITE);
  129. g.fillRect(pos.getX() - GuiSettings.getPictureScaleDiv2(), pos.getY() + GuiSettings.getPictureScaleDiv2() - 1, SupplyBarDimensions.width,
  130. SupplyBarDimensions.height);
  131. g.setColor(color);
  132. g.fillRect(pos.getX() - GuiSettings.getPictureScaleDiv2(), pos.getY() + GuiSettings.getPictureScaleDiv2() - 1,
  133. (int) (SupplyBarDimensions.width * (percentage < 1 ? percentage : 1.0f) - 1), SupplyBarDimensions.height);
  134. g.setColor(Color.BLACK);
  135. g.setStroke(new BasicStroke(1));
  136. g.drawRect(pos.getX() - GuiSettings.getPictureScaleDiv2(), pos.getY() + GuiSettings.getPictureScaleDiv2() - 1, SupplyBarDimensions.width - 1,
  137. SupplyBarDimensions.height);
  138. g.setFont(SupplyBarFont);
  139. String percentageString = (Math.round((percentage * 100))) + "%";
  140. int stringWidth = (int) g.getFontMetrics().getStringBounds(percentageString, g).getWidth();
  141. if (percentage > 1.0f) {
  142. g.setColor(Color.WHITE); // Just to see better on purple
  143. }
  144. g.drawString(percentageString, pos.getX() + 1 - stringWidth / 2,
  145. pos.getY() + GuiSettings.getPictureScaleDiv2() - 1 + SupplyBarDimensions.height);
  146. }
  147. public static void drawReplacementSymbol(Graphics2D g, AbstractCanvasObject hoveredObject) {
  148. Vec2i pos = hoveredObject.getPosition();
  149. Dimension size = new Dimension(16, 16);
  150. Image image = Import.loadImage(ImagePreference.Canvas.ReplaceSymbol, size.width, size.height);
  151. g.drawImage(image, pos.getX() - GuiSettings.getPictureScaleDiv2() -size.width, pos.getY() - GuiSettings.getPictureScaleDiv2() - size.height,
  152. size.width, size.height, null);
  153. }
  154. }