2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
5 package eu.svjatoslav.sixth.e3d.gui;
7 import eu.svjatoslav.sixth.e3d.geometry.Point2D;
8 import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseEvent;
9 import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
12 import java.awt.image.BufferedImage;
13 import java.awt.image.DataBufferByte;
14 import java.awt.image.WritableRaster;
16 public class RenderingContext {
18 public static final int bufferedImageType = BufferedImage.TYPE_4BYTE_ABGR;
19 public final Graphics2D graphics;
20 public final byte[] pixels;
21 public final int width;
22 public final int height;
24 * Center of the screen in screen space (pixels).
25 * This is the point where (0,0) coordinate of the world space is rendered.
27 public final Point2D centerCoordinate;
30 * Zoom factor. The bigger the value, the more zoomed in the view is.
32 public final double zoom;
33 final BufferedImage bufferedImage;
35 * Number of frame that is currently being rendered.
36 * Every frame has its own number.
38 public int frameNumber = 0;
41 * UI component that mouse is currently hovering over.
43 private MouseInteractionController objectPreviouslyUnderMouseCursor;
45 * Mouse click event that needs to be processed.
46 * This event is processed only once per frame.
47 * If there are multiple objects under mouse cursor, the top-most object will receive the event.
48 * If there are no objects under mouse cursor, the event will be ignored.
49 * If there is no event, this field will be null.
50 * This field is set to null after the event is processed.
52 private MouseEvent mouseEvent;
54 * UI component that mouse is currently hovering over.
56 private MouseInteractionController currentObjectUnderMouseCursor;
58 public RenderingContext(final int width, final int height) {
61 this.centerCoordinate = new Point2D(width / 2d, height / 2d);
62 this.zoom = width / 3d;
64 bufferedImage = new BufferedImage(width, height, bufferedImageType);
66 final WritableRaster raster = bufferedImage.getRaster();
67 final DataBufferByte dbi = (DataBufferByte) raster.getDataBuffer();
68 pixels = dbi.getData();
70 graphics = (Graphics2D) bufferedImage.getGraphics();
71 graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
72 graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
75 public void prepareForNewFrameRendering() {
77 currentObjectUnderMouseCursor = null;
80 public MouseEvent getMouseEvent() {
84 public void setMouseEvent(MouseEvent mouseEvent) {
85 this.mouseEvent = mouseEvent;
89 * Called when given object was detected under mouse cursor, while processing {@link #mouseEvent}.
90 * Because objects are rendered back to front. The last method caller will set the top-most object, if
91 * there are multiple objects under mouse cursor.
93 public void setCurrentObjectUnderMouseCursor(MouseInteractionController currentObjectUnderMouseCursor) {
94 this.currentObjectUnderMouseCursor = currentObjectUnderMouseCursor;
98 * @return <code>true</code> if view update is needed as a consequence of this mouse event.
100 public boolean handlePossibleComponentMouseEvent() {
101 if (mouseEvent == null) return false;
103 boolean viewRepaintNeeded = false;
105 if (objectPreviouslyUnderMouseCursor != currentObjectUnderMouseCursor) {
106 // Mouse cursor has just entered or left component.
107 viewRepaintNeeded = objectPreviouslyUnderMouseCursor != null && objectPreviouslyUnderMouseCursor.mouseExited();
108 viewRepaintNeeded |= currentObjectUnderMouseCursor != null && currentObjectUnderMouseCursor.mouseEntered();
109 objectPreviouslyUnderMouseCursor = currentObjectUnderMouseCursor;
112 if (mouseEvent.button != 0 && currentObjectUnderMouseCursor != null) {
113 // Mouse button was clicked on some component.
114 viewRepaintNeeded |= currentObjectUnderMouseCursor.mouseClicked(mouseEvent.button);
117 return viewRepaintNeeded;