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;
17 * Rendering context that contains all the information that is needed to render the scene.
20 public class RenderingContext {
22 public static final int bufferedImageType = BufferedImage.TYPE_4BYTE_ABGR;
24 public final Graphics2D graphics;
27 * Pixels of the rendering area.
28 * Each pixel is represented by 4 bytes: alpha, blue, green, red.
30 public final byte[] pixels;
33 * Width of the rendering area in pixels.
35 public final int width;
38 * Height of the rendering area in pixels.
40 public final int height;
43 * Center of the screen in screen space (pixels).
44 * This is the point where (0,0) coordinate of the world space is rendered.
46 public final Point2D centerCoordinate;
49 * Zoom factor. The bigger the value, the more zoomed in the view is.
51 public final double zoom;
52 final BufferedImage bufferedImage;
54 * Number of frame that is currently being rendered.
55 * Every frame has its own number.
57 public int frameNumber = 0;
60 * UI component that mouse is currently hovering over.
62 private MouseInteractionController objectPreviouslyUnderMouseCursor;
64 * Mouse click event that needs to be processed.
65 * This event is processed only once per frame.
66 * If there are multiple objects under mouse cursor, the top-most object will receive the event.
67 * If there are no objects under mouse cursor, the event will be ignored.
68 * If there is no event, this field will be null.
69 * This field is set to null after the event is processed.
71 private MouseEvent mouseEvent;
73 * UI component that mouse is currently hovering over.
75 private MouseInteractionController currentObjectUnderMouseCursor;
77 public RenderingContext(final int width, final int height) {
80 this.centerCoordinate = new Point2D(width / 2d, height / 2d);
81 this.zoom = width / 3d;
83 bufferedImage = new BufferedImage(width, height, bufferedImageType);
85 final WritableRaster raster = bufferedImage.getRaster();
86 final DataBufferByte dbi = (DataBufferByte) raster.getDataBuffer();
87 pixels = dbi.getData();
89 graphics = (Graphics2D) bufferedImage.getGraphics();
90 graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
91 graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
94 public void prepareForNewFrameRendering() {
96 currentObjectUnderMouseCursor = null;
99 public MouseEvent getMouseEvent() {
103 public void setMouseEvent(MouseEvent mouseEvent) {
104 this.mouseEvent = mouseEvent;
108 * Called when given object was detected under mouse cursor, while processing {@link #mouseEvent}.
109 * Because objects are rendered back to front. The last method caller will set the top-most object, if
110 * there are multiple objects under mouse cursor.
112 public void setCurrentObjectUnderMouseCursor(MouseInteractionController currentObjectUnderMouseCursor) {
113 this.currentObjectUnderMouseCursor = currentObjectUnderMouseCursor;
117 * @return <code>true</code> if view update is needed as a consequence of this mouse event.
119 public boolean handlePossibleComponentMouseEvent() {
120 if (mouseEvent == null) return false;
122 boolean viewRepaintNeeded = false;
124 if (objectPreviouslyUnderMouseCursor != currentObjectUnderMouseCursor) {
125 // Mouse cursor has just entered or left component.
126 viewRepaintNeeded = objectPreviouslyUnderMouseCursor != null && objectPreviouslyUnderMouseCursor.mouseExited();
127 viewRepaintNeeded |= currentObjectUnderMouseCursor != null && currentObjectUnderMouseCursor.mouseEntered();
128 objectPreviouslyUnderMouseCursor = currentObjectUnderMouseCursor;
131 if (mouseEvent.button != 0 && currentObjectUnderMouseCursor != null) {
132 // Mouse button was clicked on some component.
133 viewRepaintNeeded |= currentObjectUnderMouseCursor.mouseClicked(mouseEvent.button);
136 return viewRepaintNeeded;