forked from StarOpenSource/Engine
Update Window class heavily
This commit is contained in:
parent
051f3eaacc
commit
b1a56ea6a4
6 changed files with 938 additions and 92 deletions
|
@ -19,98 +19,128 @@
|
||||||
|
|
||||||
package de.staropensource.sosengine.graphics.opengl.classes;
|
package de.staropensource.sosengine.graphics.opengl.classes;
|
||||||
|
|
||||||
import de.staropensource.sosengine.base.logging.LoggerInstance;
|
import de.staropensource.sosengine.base.exceptions.UnexpectedThrowableException;
|
||||||
import de.staropensource.sosengine.base.types.CodePart;
|
|
||||||
import de.staropensource.sosengine.base.types.logging.LogIssuer;
|
|
||||||
import de.staropensource.sosengine.base.types.vectors.Vec2i;
|
import de.staropensource.sosengine.base.types.vectors.Vec2i;
|
||||||
|
import de.staropensource.sosengine.base.utility.Miscellaneous;
|
||||||
import de.staropensource.sosengine.graphics.events.GraphicsApiErrorEvent;
|
import de.staropensource.sosengine.graphics.events.GraphicsApiErrorEvent;
|
||||||
import lombok.Getter;
|
import de.staropensource.sosengine.graphics.opengl.exceptions.NotOnMainThreadException;
|
||||||
|
import de.staropensource.sosengine.graphics.opengl.exceptions.WindowCreationFailureException;
|
||||||
|
import de.staropensource.sosengine.graphics.types.VsyncMode;
|
||||||
|
import de.staropensource.sosengine.graphics.types.WindowMode;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.lwjgl.opengl.GL;
|
import org.lwjgl.opengl.GL;
|
||||||
|
import org.lwjgl.system.MemoryUtil;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static org.lwjgl.glfw.GLFW.*;
|
import static org.lwjgl.glfw.GLFW.*;
|
||||||
import static org.lwjgl.system.MemoryUtil.NULL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A window on your screen.
|
* A window on your screen.
|
||||||
*
|
*
|
||||||
* @since v1-alpha0
|
* @since v1-alpha0
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" })
|
@SuppressWarnings({ "unused" })
|
||||||
public class Window implements de.staropensource.sosengine.graphics.classes.Window {
|
public class Window extends de.staropensource.sosengine.graphics.classes.Window {
|
||||||
/**
|
|
||||||
* A set of all active windows.
|
|
||||||
*
|
|
||||||
* @since v1-alpha0
|
|
||||||
*
|
|
||||||
* -- GETTER --
|
|
||||||
* Returns a set of all active windows.
|
|
||||||
*
|
|
||||||
* @return set of all windows
|
|
||||||
* @since v1-alpha0
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
public static Set<@NotNull Window> windows = new HashSet<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logger instance.
|
|
||||||
*
|
|
||||||
* @see LoggerInstance
|
|
||||||
* @since v1-alpha0
|
|
||||||
*/
|
|
||||||
private final LoggerInstance logger = new LoggerInstance(new LogIssuer(getClass(), CodePart.ENGINE));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The window name.
|
|
||||||
*
|
|
||||||
* @since v1-alpha0
|
|
||||||
*
|
|
||||||
* -- GETTER --
|
|
||||||
* Returns the window name.
|
|
||||||
*
|
|
||||||
* @return window name
|
|
||||||
* @since v1-alpha0
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
private String windowName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The window size.
|
|
||||||
*
|
|
||||||
* @since v1-alpha0
|
|
||||||
* -- GETTER --
|
|
||||||
* Returns the window size.
|
|
||||||
*
|
|
||||||
* @return window size
|
|
||||||
* @since v1-alpha0
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
private Vec2i windowSize;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new window.
|
* Creates a new window.
|
||||||
*
|
*
|
||||||
* @param title window title
|
* @param title title
|
||||||
* @param size window size
|
* @param size size
|
||||||
|
* @param position position
|
||||||
|
* @param windowMode window mode
|
||||||
|
* @param vsyncMode V-Sync mode
|
||||||
|
* @param resizable resizable flag
|
||||||
|
* @param borderless borderless flag
|
||||||
|
* @param focusable focusable flag
|
||||||
|
* @param onTop on top flag
|
||||||
|
* @param transparent transparency flag
|
||||||
|
* @param rendering rendering flag
|
||||||
|
* @throws UnexpectedThrowableException stuff thrown by the {@link #initializeWindow()} of the Graphics API
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
public Window(String title, Vec2i size) {
|
public Window(@NotNull String title, @NotNull Vec2i size, @NotNull Vec2i position, @NotNull WindowMode windowMode, @NotNull VsyncMode vsyncMode, boolean resizable, boolean borderless, boolean focusable, boolean onTop, boolean transparent, boolean rendering) throws UnexpectedThrowableException {
|
||||||
logger.diag("Creating new Window with title \"" + title + "\"");
|
super(title, size, position, windowMode, vsyncMode, resizable, borderless, focusable, onTop, transparent, rendering);
|
||||||
|
}
|
||||||
|
|
||||||
windows.add(this);
|
/** {@inheritDoc} */
|
||||||
windowName = title;
|
@Override
|
||||||
windowSize = size;
|
public void initializeWindow() throws WindowCreationFailureException, NotOnMainThreadException {
|
||||||
|
// Ensure running on the main thread
|
||||||
|
if (!Miscellaneous.onMainThread())
|
||||||
|
throw new NotOnMainThreadException();
|
||||||
|
|
||||||
long windowId = glfwCreateWindow(windowSize.getX(), windowSize.getY(), windowName, NULL, NULL);
|
long identifier = glfwCreateWindow(getSize().getX(), getSize().getY(), getTitle(), MemoryUtil.NULL, MemoryUtil.NULL);
|
||||||
if (windowId == NULL)
|
if (identifier == MemoryUtil.NULL) {
|
||||||
new GraphicsApiErrorEvent().callEvent("Unable to create window: ID is null");
|
new GraphicsApiErrorEvent().callEvent("Unable to create window: Identifier is null");
|
||||||
|
throw new de.staropensource.sosengine.graphics.opengl.exceptions.WindowCreationFailureException();
|
||||||
|
}
|
||||||
|
|
||||||
glfwMakeContextCurrent(windowId);
|
setIdentifier(String.valueOf(identifier));
|
||||||
glfwShowWindow(windowId);
|
|
||||||
GL.createCapabilities();
|
ownContext(identifier); // Own context
|
||||||
glfwSwapBuffers(windowId);
|
GL.createCapabilities(); // Create OpenGL capabilities
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@Override
|
||||||
|
public void updateState() throws NotOnMainThreadException {
|
||||||
|
// Ensure running on the main thread
|
||||||
|
if (!Miscellaneous.onMainThread())
|
||||||
|
throw new NotOnMainThreadException();
|
||||||
|
|
||||||
|
long identifier = getIdentifierAsLong();
|
||||||
|
ownContext(identifier);
|
||||||
|
|
||||||
|
// Update window visibility
|
||||||
|
if (getWindowMode() == WindowMode.HIDDEN)
|
||||||
|
glfwHideWindow(identifier);
|
||||||
|
else
|
||||||
|
glfwShowWindow(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@Override
|
||||||
|
public void render() throws NotOnMainThreadException {
|
||||||
|
// Ensure running on the main thread
|
||||||
|
if (!Miscellaneous.onMainThread())
|
||||||
|
throw new NotOnMainThreadException();
|
||||||
|
|
||||||
|
long identifier = getIdentifierAsLong();
|
||||||
|
|
||||||
|
glfwSwapBuffers(identifier);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Vec2i getSizeWithDecorations() {
|
||||||
|
return getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritDoc} */
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Vec2i getPositionWithDecorations() {
|
||||||
|
return getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the window identifier as a long.
|
||||||
|
*
|
||||||
|
* @return window identifier as a long
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public long getIdentifierAsLong() {
|
||||||
|
return Long.getLong(getIdentifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the OpenGL context.
|
||||||
|
*
|
||||||
|
* @param identifier window to own the context of
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public void ownContext(long identifier) {
|
||||||
|
glfwMakeContextCurrent(identifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* STAROPENSOURCE ENGINE SOURCE FILE
|
||||||
|
* Copyright (c) 2024 The StarOpenSource Engine Contributors
|
||||||
|
* Licensed under the GNU Affero General Public License v3
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.staropensource.sosengine.graphics.opengl.exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown when trying to communicate with the Graphics API over a non-main thread.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public class NotOnMainThreadException extends Throwable {}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* STAROPENSOURCE ENGINE SOURCE FILE
|
||||||
|
* Copyright (c) 2024 The StarOpenSource Engine Contributors
|
||||||
|
* Licensed under the GNU Affero General Public License v3
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.staropensource.sosengine.graphics.opengl.exceptions;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown when a Window cannot be created.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "unused" })
|
||||||
|
public class WindowCreationFailureException extends RuntimeException {
|
||||||
|
/**
|
||||||
|
* Constructs this exception.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public WindowCreationFailureException() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs this exception.
|
||||||
|
*
|
||||||
|
* @param message error message
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public WindowCreationFailureException(@NotNull String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,10 +18,12 @@ module sosengine.graphics.opengl {
|
||||||
// API access
|
// API access
|
||||||
exports de.staropensource.sosengine.graphics.opengl;
|
exports de.staropensource.sosengine.graphics.opengl;
|
||||||
exports de.staropensource.sosengine.graphics.opengl.classes;
|
exports de.staropensource.sosengine.graphics.opengl.classes;
|
||||||
|
exports de.staropensource.sosengine.graphics.opengl.exceptions;
|
||||||
exports de.staropensource.sosengine.graphics.opengl.events;
|
exports de.staropensource.sosengine.graphics.opengl.events;
|
||||||
|
|
||||||
// Reflection access
|
// Reflection access
|
||||||
opens de.staropensource.sosengine.graphics.opengl;
|
opens de.staropensource.sosengine.graphics.opengl;
|
||||||
opens de.staropensource.sosengine.graphics.opengl.classes;
|
opens de.staropensource.sosengine.graphics.opengl.classes;
|
||||||
|
opens de.staropensource.sosengine.graphics.opengl.exceptions;
|
||||||
opens de.staropensource.sosengine.graphics.opengl.events;
|
opens de.staropensource.sosengine.graphics.opengl.events;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,77 +19,806 @@
|
||||||
|
|
||||||
package de.staropensource.sosengine.graphics.classes;
|
package de.staropensource.sosengine.graphics.classes;
|
||||||
|
|
||||||
|
import de.staropensource.sosengine.base.exceptions.UnexpectedThrowableException;
|
||||||
|
import de.staropensource.sosengine.base.logging.LoggerInstance;
|
||||||
|
import de.staropensource.sosengine.base.types.CodePart;
|
||||||
|
import de.staropensource.sosengine.base.types.Tristate;
|
||||||
|
import de.staropensource.sosengine.base.types.immutable.ImmutableHashSet;
|
||||||
|
import de.staropensource.sosengine.base.types.logging.LogIssuer;
|
||||||
import de.staropensource.sosengine.base.types.vectors.Vec2i;
|
import de.staropensource.sosengine.base.types.vectors.Vec2i;
|
||||||
|
import de.staropensource.sosengine.graphics.GraphicsSubsystem;
|
||||||
|
import de.staropensource.sosengine.graphics.types.VsyncMode;
|
||||||
import de.staropensource.sosengine.graphics.types.WindowMode;
|
import de.staropensource.sosengine.graphics.types.WindowMode;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for implementing windows.
|
* Abstract class for implementing windows in a Graphics API.
|
||||||
|
* <p>
|
||||||
|
* Note that many window properties may be overridden by any
|
||||||
|
* window manager or compositor. In almost all cases, that won't happen
|
||||||
|
* though (except for window size & position in tiling wms/compositors)
|
||||||
|
* except the user asks for that change directly.
|
||||||
*
|
*
|
||||||
* @since v1-alpha0
|
* @since v1-alpha0
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({ "unused" })
|
@Getter
|
||||||
public interface Window {
|
@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" })
|
||||||
|
public abstract class Window {
|
||||||
/**
|
/**
|
||||||
* A set of all active windows.
|
* A set of all active windows.
|
||||||
*
|
*
|
||||||
* @since v1-alpha0
|
* @since v1-alpha0
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
Set<? extends @NotNull Window> windows = new HashSet<>();
|
private static final Set<@NotNull Window> windows = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The logger instance for this class.
|
||||||
|
*
|
||||||
|
* @see LoggerInstance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the logger instance for this class.
|
||||||
|
*
|
||||||
|
* @return logger instance
|
||||||
|
* @see LoggerInstance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Getter(value = AccessLevel.PROTECTED)
|
||||||
|
private final LoggerInstance logger = new LoggerInstance(new LogIssuer(getClass(), CodePart.ENGINE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the window identifier.
|
* Contains the window identifier.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window identifier.
|
||||||
|
*
|
||||||
|
* @return window identifier
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the window identifier.
|
||||||
|
* <p>
|
||||||
|
* Recommended to be called only once.
|
||||||
|
*
|
||||||
|
* @param identifier new window identifier
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@Setter(AccessLevel.PROTECTED)
|
||||||
String identifier = "";
|
private String identifier = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the title of this window.
|
* Determines the title of this window.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window title.
|
||||||
|
*
|
||||||
|
* @return window title
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the window title.
|
||||||
|
*
|
||||||
|
* @param title new window title
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
String title = "sos!engine window (update this title)";
|
@Setter
|
||||||
|
private String title;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the size of this window.
|
* Determines the size of this window.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window size.
|
||||||
|
*
|
||||||
|
* @return window size
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the window size.
|
||||||
|
*
|
||||||
|
* @param size new window size
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
Vec2i size = new Vec2i(200, 200);
|
@Setter
|
||||||
|
private Vec2i size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the position of this window.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window position.
|
||||||
|
*
|
||||||
|
* @return window position
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the window position.
|
||||||
|
*
|
||||||
|
* @param position new window position
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Setter
|
||||||
|
private Vec2i position;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines in which {@link WindowMode} this window is in.
|
* Determines in which {@link WindowMode} this window is in.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window mode.
|
||||||
|
*
|
||||||
|
* @return window mode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the window mode.
|
||||||
|
*
|
||||||
|
* @param windowMode new window mode
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
WindowMode mode = WindowMode.WINDOWED;
|
@NotNull
|
||||||
|
@Setter
|
||||||
|
private WindowMode windowMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if this window should have a border and decorations.
|
* Determines the V-Sync mode this window targets.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha2
|
||||||
*/
|
|
||||||
boolean borderless = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if this window should be displayed on top of all other windows.
|
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* -- GETTER --
|
||||||
|
* Returns the V-Sync mode.
|
||||||
|
*
|
||||||
|
* @return V-Sync mode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets the V-Sync mode.
|
||||||
|
*
|
||||||
|
* @param vsyncMode new vsync mode
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
boolean onTop = false;
|
@NotNull
|
||||||
|
@Setter
|
||||||
|
private VsyncMode vsyncMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if this window can be resized by the user.
|
* Determines if this window can be resized by the user.
|
||||||
*
|
*
|
||||||
* @since v1-alpha1
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window is resizable.
|
||||||
|
*
|
||||||
|
* @return resizable flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window is resizable.
|
||||||
|
*
|
||||||
|
* @param resizable new resizable flag state
|
||||||
|
* @since v1-alpha2
|
||||||
*/
|
*/
|
||||||
boolean resizable = false;
|
@Setter
|
||||||
|
private boolean resizable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this window should have a border and decorations.
|
||||||
|
*
|
||||||
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window should be rendered without any decorations.
|
||||||
|
*
|
||||||
|
* @return borderless flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window should be rendered without any decorations.
|
||||||
|
*
|
||||||
|
* @param borderless new borderless flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
private boolean borderless;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the window can be focused.
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window can be focused.
|
||||||
|
*
|
||||||
|
* @return focusable flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window can be focused.
|
||||||
|
*
|
||||||
|
* @param focusable new focusable flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
private boolean focusable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this window should be displayed on top of all other windows.
|
||||||
|
*
|
||||||
|
* @since v1-alpha1
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window is displayed over regular windows.
|
||||||
|
*
|
||||||
|
* @return on top flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window is displayed over regular windows.
|
||||||
|
*
|
||||||
|
* @param onTop new on top flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
private boolean onTop;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables or disables transparency support for this window.
|
||||||
|
* <p>
|
||||||
|
* Availability depends on the Graphics API, compositor or
|
||||||
|
* window manager and potentially system settings.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window can be transparent.
|
||||||
|
* <p>
|
||||||
|
* Availability depends on the Graphics API, compositor or
|
||||||
|
* window manager and potentially system settings.
|
||||||
|
*
|
||||||
|
* @return transparency flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window can be transparent.
|
||||||
|
* <p>
|
||||||
|
* Availability depends on the Graphics API, compositor or
|
||||||
|
* window manager and potentially system settings.
|
||||||
|
*
|
||||||
|
* @param transparent new transparency flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
private boolean transparent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this window should be rendered.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns if the window should be rendered.
|
||||||
|
*
|
||||||
|
* @return rendering flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- SETTER --
|
||||||
|
* Sets if the window should be rendered.
|
||||||
|
*
|
||||||
|
* @param rendering new rendering flag state
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
private boolean rendering;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new window.
|
||||||
|
*
|
||||||
|
* @param title title
|
||||||
|
* @param size size
|
||||||
|
* @param position position
|
||||||
|
* @param windowMode window mode
|
||||||
|
* @param vsyncMode V-Sync mode
|
||||||
|
* @param resizable resizable flag
|
||||||
|
* @param borderless borderless flag
|
||||||
|
* @param focusable focusable flag
|
||||||
|
* @param onTop on top flag
|
||||||
|
* @param transparent transparency flag
|
||||||
|
* @param rendering rendering flag
|
||||||
|
* @throws UnexpectedThrowableException stuff thrown by the {@link #initializeWindow()}, {@link #updateState()} and {@link #render()} methods of the implementing Graphics API
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public Window(@NotNull String title, @NotNull Vec2i size, @NotNull Vec2i position, @NotNull WindowMode windowMode, @NotNull VsyncMode vsyncMode, boolean resizable, boolean borderless, boolean focusable, boolean onTop, boolean transparent, boolean rendering) throws UnexpectedThrowableException {
|
||||||
|
logger.diag("Creating new window with properties: title=" + title + " size=" + size + " position=" + position + " windowMode=" + windowMode + " vsyncMode=" + vsyncMode + " resizable=" + resizable + " borderless=" + borderless + " focusable=" + focusable + " onTop=" + onTop + " transparent=" + transparent + " rendering=" + rendering);
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
this.title = title;
|
||||||
|
this.size = size;
|
||||||
|
this.position = position;
|
||||||
|
this.windowMode = windowMode;
|
||||||
|
this.vsyncMode = vsyncMode;
|
||||||
|
this.resizable = resizable;
|
||||||
|
this.borderless = borderless;
|
||||||
|
this.focusable = focusable;
|
||||||
|
this.onTop = onTop;
|
||||||
|
this.transparent = transparent;
|
||||||
|
this.rendering = rendering;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Allow Graphics API to initialize window
|
||||||
|
initializeWindow();
|
||||||
|
|
||||||
|
// Update state and render first image
|
||||||
|
updateState();
|
||||||
|
render();
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throw new UnexpectedThrowableException(throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to window set
|
||||||
|
windows.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a set of active windows.
|
||||||
|
*
|
||||||
|
* @return active windows
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static ImmutableHashSet<@NotNull Window> getWindows() {
|
||||||
|
return new ImmutableHashSet<>(windows);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows the Graphics API to initialize the window.
|
||||||
|
* <p>
|
||||||
|
* NEVER place any code in the constructor. Instead, write
|
||||||
|
* API-specific window initialization code in here
|
||||||
|
* or stuff may break unexpectedly.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
protected abstract void initializeWindow() throws Throwable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the state of this window.
|
||||||
|
* <p>
|
||||||
|
* Do not call this method manually or you
|
||||||
|
* may cause unintended side effects.
|
||||||
|
*/
|
||||||
|
public abstract void updateState() throws Throwable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders this window.
|
||||||
|
* <p>
|
||||||
|
* Do not call this method manually or you
|
||||||
|
* may cause unintended side effects.
|
||||||
|
*/
|
||||||
|
public abstract void render() throws Throwable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the window size including decorations (e.g. title bar).
|
||||||
|
*
|
||||||
|
* @return window size including decorations
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public abstract Vec2i getSizeWithDecorations();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the window position including decorations (e.g. title bar).
|
||||||
|
*
|
||||||
|
* @return window position including decorations
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public abstract Vec2i getPositionWithDecorations();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides an API for building {@link Window} classes more easily.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" })
|
||||||
|
@Getter
|
||||||
|
public static class Builder {
|
||||||
|
/**
|
||||||
|
* Contains the window title.
|
||||||
|
*
|
||||||
|
* @see Window#title
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window title.
|
||||||
|
*
|
||||||
|
* @return window title
|
||||||
|
* @see Window#title
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private String title = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the window size.
|
||||||
|
*
|
||||||
|
* @see Window#size
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window size.
|
||||||
|
*
|
||||||
|
* @return window size
|
||||||
|
* @see Window#size
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private Vec2i size = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the window position.
|
||||||
|
*
|
||||||
|
* @see Window#position
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window position.
|
||||||
|
*
|
||||||
|
* @return window position
|
||||||
|
* @see Window#position
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private Vec2i position = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the window mode.
|
||||||
|
*
|
||||||
|
* @see Window#windowMode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the window mode.
|
||||||
|
*
|
||||||
|
* @return window mode
|
||||||
|
* @see Window#windowMode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private WindowMode windowMode = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the V-Sync mode.
|
||||||
|
*
|
||||||
|
* @see Window#vsyncMode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the V-Sync mode.
|
||||||
|
*
|
||||||
|
* @return V-Sync mode
|
||||||
|
* @see Window#vsyncMode
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private VsyncMode vsyncMode = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the resizable flag.
|
||||||
|
*
|
||||||
|
* @see Window#resizable
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the resizable flag state.
|
||||||
|
*
|
||||||
|
* @return resizable flag state
|
||||||
|
* @see Window#resizable
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate resizable = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the borderless flag.
|
||||||
|
*
|
||||||
|
* @see Window#borderless
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the borderless flag state.
|
||||||
|
*
|
||||||
|
* @return borderless flag state
|
||||||
|
* @see Window#borderless
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate borderless = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the focusable flag.
|
||||||
|
*
|
||||||
|
* @see Window#focusable
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the focusable flag state.
|
||||||
|
*
|
||||||
|
* @return focusable flag state
|
||||||
|
* @see Window#focusable
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate focusable = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the on top flag.
|
||||||
|
*
|
||||||
|
* @see Window#onTop
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the on top flag state.
|
||||||
|
*
|
||||||
|
* @return on top flag state
|
||||||
|
* @see Window#onTop
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate onTop = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the transparency flag.
|
||||||
|
*
|
||||||
|
* @see Window#transparent
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the transparency flag state.
|
||||||
|
*
|
||||||
|
* @return transparency flag state
|
||||||
|
* @see Window#transparent
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate transparent = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the rendering flag.
|
||||||
|
*
|
||||||
|
* @see Window#rendering
|
||||||
|
* @since v1-alpha2
|
||||||
|
*
|
||||||
|
* -- GETTER --
|
||||||
|
* Returns the rendering flag state.
|
||||||
|
*
|
||||||
|
* @return rendering flag state
|
||||||
|
* @see Window#rendering
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Tristate rendering = Tristate.UNSET;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs this class.
|
||||||
|
*
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public Builder() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new {@link Window} class.
|
||||||
|
*
|
||||||
|
* @throws IllegalStateException if the window title, size or position is unset
|
||||||
|
* @throws UnexpectedThrowableException thrown when creating a new {@link Window} instance fails
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
public Window build() throws IllegalStateException, UnexpectedThrowableException {
|
||||||
|
// Booleanized tristates with default values
|
||||||
|
boolean resizableBoolean = true;
|
||||||
|
boolean borderlessBoolean = false;
|
||||||
|
boolean focusableBoolean = true;
|
||||||
|
boolean onTopBoolean = false;
|
||||||
|
boolean transparentBoolean = false;
|
||||||
|
boolean renderingBoolean = true;
|
||||||
|
|
||||||
|
// Check for required fields
|
||||||
|
if (title == null)
|
||||||
|
throw new IllegalStateException("The window name is unset");
|
||||||
|
if (size == null)
|
||||||
|
throw new IllegalStateException("The window size is unset");
|
||||||
|
if (position == null)
|
||||||
|
throw new IllegalStateException("The window position is unset");
|
||||||
|
|
||||||
|
// Set default
|
||||||
|
if (windowMode == null)
|
||||||
|
windowMode = WindowMode.WINDOWED;
|
||||||
|
if (vsyncMode == null)
|
||||||
|
vsyncMode = VsyncMode.ON;
|
||||||
|
|
||||||
|
// Override booleanized tristate defaults
|
||||||
|
if (resizable == Tristate.FALSE)
|
||||||
|
resizableBoolean = false;
|
||||||
|
if (borderless == Tristate.TRUE)
|
||||||
|
borderlessBoolean = true;
|
||||||
|
if (focusable == Tristate.FALSE)
|
||||||
|
focusableBoolean = false;
|
||||||
|
if (onTop == Tristate.TRUE)
|
||||||
|
onTopBoolean = true;
|
||||||
|
if (transparent == Tristate.TRUE)
|
||||||
|
transparentBoolean = true;
|
||||||
|
if (rendering == Tristate.FALSE)
|
||||||
|
renderingBoolean = false;
|
||||||
|
|
||||||
|
// Create new Window instance
|
||||||
|
try {
|
||||||
|
return GraphicsSubsystem.getInstance().getApi().getInternalApi().getWindowClass()
|
||||||
|
.getDeclaredConstructor(String.class, Vec2i.class, Vec2i.class, WindowMode.class, VsyncMode.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE)
|
||||||
|
.newInstance(title, size, position, windowMode, vsyncMode, resizableBoolean, borderlessBoolean, focusableBoolean, onTopBoolean, transparentBoolean, renderingBoolean);
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throw new UnexpectedThrowableException(throwable, "Window.Builder was unable to create new Window instance");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the window title.
|
||||||
|
*
|
||||||
|
* @param title new window title
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setTitle(@Nullable String title) {
|
||||||
|
this.title = title;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the window size.
|
||||||
|
*
|
||||||
|
* @param size new window size
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setSize(@Nullable Vec2i size) {
|
||||||
|
this.size = size;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the window position.
|
||||||
|
*
|
||||||
|
* @param position new window position
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setPosition(@Nullable Vec2i position) {
|
||||||
|
this.position = position;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the window mode.
|
||||||
|
*
|
||||||
|
* @param windowMode new window mode
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setWindowMode(@Nullable WindowMode windowMode) {
|
||||||
|
this.windowMode = windowMode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the V-Sync mode.
|
||||||
|
*
|
||||||
|
* @param vsyncMode new V-Sync mode
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setVsyncMode(@Nullable VsyncMode vsyncMode) {
|
||||||
|
this.vsyncMode = vsyncMode;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the resizable flag.
|
||||||
|
*
|
||||||
|
* @param resizable new resizable flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setResizable(@NotNull Tristate resizable) {
|
||||||
|
this.resizable = resizable;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the borderless flag.
|
||||||
|
*
|
||||||
|
* @param borderless new borderless flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setBorderless(@NotNull Tristate borderless) {
|
||||||
|
this.borderless = borderless;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the focusable flag.
|
||||||
|
*
|
||||||
|
* @param focusable new focusable flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setFocusable(@NotNull Tristate focusable) {
|
||||||
|
this.focusable = focusable;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the on top flag.
|
||||||
|
*
|
||||||
|
* @param onTop new on top flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setOnTop(@NotNull Tristate onTop) {
|
||||||
|
this.onTop = onTop;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the transparency flag.
|
||||||
|
*
|
||||||
|
* @param transparent new transparency flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setTransparent(@NotNull Tristate transparent) {
|
||||||
|
this.transparent = transparent;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the rendering flag.
|
||||||
|
*
|
||||||
|
* @param rendering new rendering flag state
|
||||||
|
* @return builder instance
|
||||||
|
* @since v1-alpha2
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public synchronized Builder setRendering(@NotNull Tristate rendering) {
|
||||||
|
this.rendering = rendering;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package de.staropensource.sosengine.testapp;
|
package de.staropensource.sosengine.testapp;
|
||||||
|
|
||||||
import de.staropensource.sosengine.base.Engine;
|
import de.staropensource.sosengine.base.Engine;
|
||||||
|
import de.staropensource.sosengine.base.exceptions.UnexpectedThrowableException;
|
||||||
import de.staropensource.sosengine.base.logging.LoggerInstance;
|
import de.staropensource.sosengine.base.logging.LoggerInstance;
|
||||||
import de.staropensource.sosengine.base.types.CodePart;
|
import de.staropensource.sosengine.base.types.CodePart;
|
||||||
import de.staropensource.sosengine.base.types.logging.LogIssuer;
|
import de.staropensource.sosengine.base.types.logging.LogIssuer;
|
||||||
|
@ -27,6 +28,7 @@ import de.staropensource.sosengine.base.types.vectors.Vec2i;
|
||||||
import de.staropensource.sosengine.graphics.GraphicsSubsystem;
|
import de.staropensource.sosengine.graphics.GraphicsSubsystem;
|
||||||
import de.staropensource.sosengine.graphics.classes.ApiMainClass;
|
import de.staropensource.sosengine.graphics.classes.ApiMainClass;
|
||||||
import de.staropensource.sosengine.graphics.classes.ApiManagementClass;
|
import de.staropensource.sosengine.graphics.classes.ApiManagementClass;
|
||||||
|
import de.staropensource.sosengine.graphics.classes.Window;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
@ -111,6 +113,15 @@ public class Main {
|
||||||
ApiManagementClass management = api.getManagement();
|
ApiManagementClass management = api.getManagement();
|
||||||
|
|
||||||
// Create window
|
// Create window
|
||||||
|
try {
|
||||||
|
Window window = new Window.Builder()
|
||||||
|
.setTitle("test application window")
|
||||||
|
.setSize(new Vec2i(960, 540))
|
||||||
|
.setPosition(new Vec2i(10, 10))
|
||||||
|
.build();
|
||||||
|
} catch (UnexpectedThrowableException exception) {
|
||||||
|
logger.crash("build() throw an UnexpectedThrowableException", exception.getThrowable());
|
||||||
|
}
|
||||||
|
|
||||||
// Sleep for five seconds
|
// Sleep for five seconds
|
||||||
Thread.sleep(5000);
|
Thread.sleep(5000);
|
||||||
|
|
Loading…
Reference in a new issue