package eu.svjatoslav.sixth.e3d.gui;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.KeyboardFocusTracker;
import eu.svjatoslav.sixth.e3d.gui.humaninput.MouseInteractionController;
+import eu.svjatoslav.sixth.e3d.gui.humaninput.UserInputTracker;
+import eu.svjatoslav.sixth.e3d.renderer.raster.ShapeCollection;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Timer;
+/**
+ * Java Swing GUI panel that contains canvas for 3D rendering.
+ */
public class ViewPanel extends JPanel implements ComponentListener {
-
private static final long serialVersionUID = 1683277888885045387L;
+ private final UserInputTracker userInputTracker = new UserInputTracker(this);
+ private final KeyboardFocusTracker keyboardFocusTracker = new KeyboardFocusTracker(
+ this);
+ private final Avatar avatar = new Avatar();
+ private final ShapeCollection rootShapeCollection = new ShapeCollection();
private final List<ViewRenderListener> viewRenderListeners = new ArrayList<>();
- private final ViewContext context = new ViewContext(this);
/**
* Last time this view was updated.
*/
private Timer canvasUpdateTimer;
private ViewUpdateTimerTask canvasUpdateTimerTask;
private RenderingContext renderingContext = null;
-
/**
* UI component that mouse is currently hovering over.
*/
private MouseInteractionController currentMouseOverComponent;
-
/**
* Currently target FPS for this view. It can be changed at runtime. Also when nothing
* changes in the view, then frames are not really repainted.
*/
private int targetFPS = 30;
-
/**
* Set to true if it is known than next frame reeds to be painted. Flag is cleared
* immediately after frame got updated.
*/
private boolean viewRepaintNeeded = true;
-
public ViewPanel() {
- viewRenderListeners.add(context.getAvatar());
-
- // initialize input tracker
- context.getUserInputTracker().bind(this);
- viewRenderListeners.add(context.getUserInputTracker());
+ viewRenderListeners.add(avatar);
+ viewRenderListeners.add(userInputTracker);
initializePanelLayout();
addComponentListener(this);
}
+ public Avatar getAvatar() {
+ return avatar;
+ }
+
+ public KeyboardFocusTracker getKeyboardFocusTracker() {
+ return keyboardFocusTracker;
+ }
+
+ public ShapeCollection getRootShapeCollection() {
+ return rootShapeCollection;
+ }
+
+ public UserInputTracker getUserInputTracker() {
+ return userInputTracker;
+ }
+
public void addViewUpdateListener(final ViewRenderListener listener) {
viewRenderListeners.add(listener);
}
viewRepaintNeeded = true;
}
- public ViewContext getContext() {
- return context;
- }
-
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
// paint root geometry collection to the offscreen render buffer
- context.getRootShapeCollection().paint(context, renderingContext);
+ rootShapeCollection.paint(this, renderingContext);
// draw rendered offscreen image to visible screen
final Graphics graphics = getGraphics();
* graphics is needed.
*/
public void updateView() {
- if (renderingContext != null){
+ if (renderingContext != null) {
renderingContext.mouseClick = null;
renderingContext.clickedItem = null;
}
boolean reRenderFrame = false;
for (final ViewRenderListener listener : viewRenderListeners)
- if (listener.beforeRender(context,
- millisecondsPassedSinceLastUpdate))
+ if (listener.beforeRender(this, millisecondsPassedSinceLastUpdate))
reRenderFrame = true;
// abort rendering if window size is invalid