feat(theme): implement background pattern rendering for various pattern renderers
This commit is contained in:
@@ -17,6 +17,7 @@ import org.springframework.stereotype.Component;
|
||||
import de.extio.game_engine.renderer.RendererControl;
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
|
||||
import de.extio.game_engine.renderer.g2d.theme.G2DThemeManager;
|
||||
import de.extio.game_engine.renderer.model.RenderingBo;
|
||||
import de.extio.game_engine.renderer.model.RenderingBoLayer;
|
||||
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
|
||||
@@ -39,12 +40,6 @@ public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
||||
|
||||
private final static int[] BUILTIN_SCROLL_OFFSET_X = new int[2];
|
||||
|
||||
private final static List<Star> STARS = new ArrayList<>();
|
||||
|
||||
private final static List<Star> REFERENCE_STARS = new ArrayList<>();
|
||||
|
||||
private static CoordI2 STARS_LAST_VIEWPORT = ImmutableCoordI2.create();
|
||||
|
||||
private final CoordI2 bgrOffset = MutableCoordI2.create();
|
||||
|
||||
private final CoordI2 sourceOffset = MutableCoordI2.create();
|
||||
@@ -97,7 +92,7 @@ public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
||||
this.bgrOffset.setXY(this.rendererData.getUiOptions().getBackgroundOffset0()).add(BUILTIN_SCROLL_OFFSET_X[0], 0), windowDim);
|
||||
|
||||
this.scroll(1, this.rendererData.getUiOptions().isBackgroundScrolling1(), this.rendererData.getUiOptions().isBackgroundScrollingReverse1(), windowDim);
|
||||
this.drawStars(graphics, this.bgrOffset.setXY(this.rendererData.getUiOptions().getBackgroundOffset1()).add(BUILTIN_SCROLL_OFFSET_X[1], 0), windowDim);
|
||||
((G2DThemeManager) this.rendererData.getThemeManager()).getCurrentPatternRenderer().drawBackgroundPattern(graphics, this.bgrOffset.setXY(this.rendererData.getUiOptions().getBackgroundOffset1()).add(BUILTIN_SCROLL_OFFSET_X[1], 0), windowDim);
|
||||
}
|
||||
|
||||
private void tileBackground(final Graphics2D graphics, final int index, final StaticResource backgroundResource, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
@@ -146,19 +141,6 @@ public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
||||
} while (this.destPosition.getY() < viewPort.getY());
|
||||
}
|
||||
|
||||
private void drawStars(final Graphics2D graphics, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
this.generateStars(viewPort);
|
||||
|
||||
for (final Star element : STARS) {
|
||||
graphics.setColor(element.color.toAwtColor());
|
||||
graphics.fillOval(
|
||||
Math.floorMod(element.position.getX() - offset.getX(), viewPort.getX()),
|
||||
Math.floorMod(element.position.getY() - offset.getY(), viewPort.getY()),
|
||||
element.radius.getX(),
|
||||
element.radius.getY());
|
||||
}
|
||||
}
|
||||
|
||||
private void scroll(final int index, final boolean scrolling, final boolean reverse, final CoordI2 viewPort) {
|
||||
if (!scrolling) {
|
||||
BUILTIN_SCROLL_OFFSET_X[index] = 0;
|
||||
@@ -235,50 +217,4 @@ public class G2DDrawBackground extends G2DAbstractRenderingBo {
|
||||
}
|
||||
}
|
||||
|
||||
private void generateStars(final CoordI2 viewPort) {
|
||||
if (REFERENCE_STARS.isEmpty()) {
|
||||
final var rand = ThreadLocalXorShift128Random.current();
|
||||
|
||||
for (var i = 0; i < 350; i++) {
|
||||
final var position = ImmutableCoordI2.create(rand.nextInt(RendererControl.REFERENCE_RESOLUTION.getX()), rand.nextInt(RendererControl.REFERENCE_RESOLUTION.getY()));
|
||||
final var radius = ImmutableCoordI2.create(rand.nextInt(3) + 2, rand.nextInt(3) + 2);
|
||||
final var color = new ImmutableRgbaColor(rand.nextInt(30) + 100, rand.nextInt(30) + 100, rand.nextInt(30) + 130);
|
||||
|
||||
REFERENCE_STARS.add(new Star(position, radius, color));
|
||||
STARS.add(new Star(position, radius, color));
|
||||
}
|
||||
}
|
||||
|
||||
if (!viewPort.equals(STARS_LAST_VIEWPORT)) {
|
||||
final double scaleX = (double) viewPort.getX() / RendererControl.REFERENCE_RESOLUTION.getX();
|
||||
final double scaleY = (double) viewPort.getY() / RendererControl.REFERENCE_RESOLUTION.getY();
|
||||
|
||||
for (int i = 0; i < REFERENCE_STARS.size(); i++) {
|
||||
final var refStar = REFERENCE_STARS.get(i);
|
||||
final var star = STARS.get(i);
|
||||
|
||||
star.position = ImmutableCoordI2.create(
|
||||
(int) (refStar.position.getX() * scaleX),
|
||||
(int) (refStar.position.getY() * scaleY));
|
||||
}
|
||||
STARS_LAST_VIEWPORT = viewPort.toImmutableCoordI2();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Star {
|
||||
|
||||
CoordI2 position;
|
||||
|
||||
CoordI2 radius;
|
||||
|
||||
RgbaColor color;
|
||||
|
||||
Star(final CoordI2 position, final CoordI2 radius, final RgbaColor color) {
|
||||
super();
|
||||
this.position = position;
|
||||
this.radius = radius;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
/**
|
||||
* Implementation of PatternRenderer that draws borders and panels in a classic "Bevel" style.
|
||||
@@ -27,7 +28,8 @@ public class BevelPatternRenderer implements PatternRenderer {
|
||||
if (hsb[2] < 0.5f) {
|
||||
light = color.brighter();
|
||||
dark = color;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
light = color;
|
||||
dark = color.darker();
|
||||
}
|
||||
@@ -71,14 +73,16 @@ public class BevelPatternRenderer implements PatternRenderer {
|
||||
|
||||
// Button bevel
|
||||
int bevelStrength = (int) (2 * scaleFactor);
|
||||
if (bevelStrength < 1) bevelStrength = 1;
|
||||
if (bevelStrength < 1)
|
||||
bevelStrength = 1;
|
||||
|
||||
final Color highlight = theme.getBorderOuter().toColor();
|
||||
final Color shadow = theme.getBorderInner().toColor();
|
||||
|
||||
if (pressed) {
|
||||
drawBevel(g2d, 0, 0, width, height, bevelStrength, false, highlight, shadow);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
drawBevel(g2d, 0, 0, width, height, bevelStrength, true, highlight, shadow);
|
||||
}
|
||||
|
||||
@@ -118,4 +122,18 @@ public class BevelPatternRenderer implements PatternRenderer {
|
||||
g2d.drawLine(x + width - 1 - i, y + i, x + width - 1 - i, y + height - 1 - i); // Right
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
final int spacing = 20;
|
||||
final int offX = Math.floorMod(offset.getX(), spacing);
|
||||
final int offY = Math.floorMod(offset.getY(), spacing);
|
||||
|
||||
for (int x = -spacing; x < viewPort.getX() + spacing; x += spacing) {
|
||||
for (int y = -spacing; y < viewPort.getY() + spacing; y += spacing) {
|
||||
g2d.fillRect(x + offX, y + offY, 2, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,14 @@ import java.awt.BasicStroke;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Stroke;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
/**
|
||||
* Implementation of PatternRenderer that draws a technical "Blueprint" style with grids and measurement markers.
|
||||
@@ -126,4 +128,41 @@ public class BlueprintPatternRenderer implements PatternRenderer {
|
||||
g2.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int gridSize = 50;
|
||||
this.patternCache = new BufferedImage(gridSize, gridSize, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, gridSize, gridSize);
|
||||
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
g2d.setStroke(new BasicStroke(1f));
|
||||
|
||||
g2d.drawLine(0, 0, 0, gridSize);
|
||||
g2d.drawLine(0, 0, gridSize, 0);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int gridSize = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), gridSize);
|
||||
final int offY = Math.floorMod(offset.getY(), gridSize);
|
||||
|
||||
for (int x = -gridSize; x <= viewPort.getX() + gridSize; x += gridSize) {
|
||||
for (int y = -gridSize; y <= viewPort.getY() + gridSize; y += gridSize) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -96,4 +98,41 @@ public class DreamPatternRenderer implements PatternRenderer {
|
||||
final var textDim = G2DDrawFont.getTextDimensions("X", g2d, 15, scaleFactor);
|
||||
G2DDrawFont.renderText(g2d, textDim, 1.0, ((width - textDim.getX()) / 2), ((height - textDim.getY()) / 2), fontSize, "X");
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int cellSize = 100;
|
||||
this.patternCache = new BufferedImage(cellSize, cellSize, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
// Clear background (transparent)
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, cellSize, cellSize);
|
||||
|
||||
// Draw pattern
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
g2d.fillOval(20, 20, 40, 40);
|
||||
g2d.fillOval(70, 80, 15, 15);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int cellSize = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), cellSize);
|
||||
final int offY = Math.floorMod(offset.getY(), cellSize);
|
||||
|
||||
for (int x = -cellSize; x < viewPort.getX() + cellSize; x += cellSize) {
|
||||
for (int y = -cellSize; y < viewPort.getY() + cellSize; y += cellSize) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,13 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -105,4 +107,40 @@ public class FantasyPatternRenderer implements PatternRenderer {
|
||||
g2d.fillRect(centerX - crossSize / 2, centerY - t / 2, crossSize, t);
|
||||
g2d.fillRect(centerX - t / 2, centerY - crossSize / 2, t, crossSize);
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int cellSize = 80;
|
||||
this.patternCache = new BufferedImage(cellSize, cellSize, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, cellSize, cellSize);
|
||||
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
g2d.fillRect(10, 10, 2, 2);
|
||||
g2d.fillRect(50, 60, 3, 3);
|
||||
g2d.fillRect(30, 50, 1, 1);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int cellSize = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), cellSize);
|
||||
final int offY = Math.floorMod(offset.getY(), cellSize);
|
||||
|
||||
for (int x = -cellSize; x < viewPort.getX() + cellSize; x += cellSize) {
|
||||
for (int y = -cellSize; y < viewPort.getY() + cellSize; y += cellSize) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,6 +169,7 @@ public class G2DThemeManager implements ThemeManager {
|
||||
this.applyTheme(persistedTheme.get());
|
||||
this.registerTheme(this.currentTheme);
|
||||
LOGGER.info("Loaded last used theme: {}", this.currentTheme.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
this.applyTheme(this.defaultTheme);
|
||||
@@ -215,4 +216,8 @@ public class G2DThemeManager implements ThemeManager {
|
||||
public PatternRenderer getPatternRenderer(final String rendererName) {
|
||||
return this.patternRenderers.get(rendererName);
|
||||
}
|
||||
|
||||
public PatternRenderer getCurrentPatternRenderer() {
|
||||
return this.patternRenderers.get(this.currentTheme.getPatternRendererName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,13 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -109,4 +111,38 @@ public class MetroPatternRenderer implements PatternRenderer {
|
||||
g2d.fillRect(centerX - crossSize / 2, centerY - t / 2, crossSize, t);
|
||||
g2d.fillRect(centerX - t / 2, centerY - crossSize / 2, t, crossSize);
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int spacing = 40;
|
||||
this.patternCache = new BufferedImage(spacing, spacing, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, spacing, spacing);
|
||||
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
g2d.drawLine(0, 0, spacing, spacing);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int spacing = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), spacing);
|
||||
final int offY = Math.floorMod(offset.getY(), spacing);
|
||||
|
||||
for (int x = -spacing; x < viewPort.getX() + spacing; x += spacing) {
|
||||
for (int y = -spacing; y < viewPort.getY() + spacing; y += spacing) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -96,4 +98,42 @@ public class ModernPatternRenderer implements PatternRenderer {
|
||||
final var textDim = G2DDrawFont.getTextDimensions("X", g2d, 14, scaleFactor);
|
||||
G2DDrawFont.renderText(g2d, textDim, 1.0, ((width - textDim.getX()) / 2), ((height - textDim.getY()) / 2), fontSize, "X");
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int spacing = 60;
|
||||
this.patternCache = new BufferedImage(spacing, spacing, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, spacing, spacing);
|
||||
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
final int len = 10;
|
||||
final int cx = spacing / 2;
|
||||
final int cy = spacing / 2;
|
||||
g2d.drawLine(cx - len, cy, cx + len, cy);
|
||||
g2d.drawLine(cx, cy - len, cx, cy + len);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int spacing = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), spacing);
|
||||
final int offY = Math.floorMod(offset.getY(), spacing);
|
||||
|
||||
for (int x = -spacing; x < viewPort.getX() + spacing; x += spacing) {
|
||||
for (int y = -spacing; y < viewPort.getY() + spacing; y += spacing) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
/**
|
||||
* Interface for rendering common UI patterns like borders, backgrounds, shadows, etc.
|
||||
* Different implementations can provide different visual styles.
|
||||
@@ -64,4 +66,13 @@ public interface PatternRenderer {
|
||||
* @param theme Theme to use for colors
|
||||
*/
|
||||
void drawCloseButton(Graphics2D g2d, int width, int height, boolean enabled, int state, Color backgroundColor, double scaleFactor, Theme theme);
|
||||
|
||||
/**
|
||||
* Draws a background pattern for the UI on layer BACKGROUND1
|
||||
*
|
||||
* @param g2d The graphics context
|
||||
* @param offset Offset for pattern alignment
|
||||
* @param viewPort Viewport size
|
||||
*/
|
||||
void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort);
|
||||
}
|
||||
|
||||
@@ -2,13 +2,20 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.RendererControl;
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.renderer.g2d.bo.rendering.G2DDrawFont;
|
||||
import de.extio.game_engine.renderer.model.color.ImmutableRgbaColor;
|
||||
import de.extio.game_engine.renderer.model.color.RgbaColor;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
import de.extio.game_engine.spatial2.model.ImmutableCoordI2;
|
||||
import de.extio.game_engine.util.rng.ThreadLocalXorShift128Random;
|
||||
|
||||
/**
|
||||
* Default implementation of PatternRenderer that draws borders and panels in a decorative style.
|
||||
@@ -18,6 +25,12 @@ import de.extio.game_engine.renderer.model.color.RgbaColor;
|
||||
@Component
|
||||
public class SpacecraftPatternRenderer implements PatternRenderer {
|
||||
|
||||
private final static List<Star> STARS = new ArrayList<>();
|
||||
|
||||
private final static List<Star> REFERENCE_STARS = new ArrayList<>();
|
||||
|
||||
private static CoordI2 STARS_LAST_VIEWPORT = ImmutableCoordI2.create();
|
||||
|
||||
@Override
|
||||
public void drawDecorativeBorder(final Graphics2D g2d, final int x, final int y, final int width, final int height, final int strength, final Color color) {
|
||||
final var strength2 = strength * 2;
|
||||
@@ -99,4 +112,65 @@ public class SpacecraftPatternRenderer implements PatternRenderer {
|
||||
G2DDrawFont.renderText(g2d, textDim, 1.0, ((width - textDim.getX()) / 2), ((height - textDim.getY()) / 2), (int) (16 * scaleFactor), "X");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
this.generateStars(viewPort);
|
||||
|
||||
for (final Star element : STARS) {
|
||||
g2d.setColor(element.color.toAwtColor());
|
||||
g2d.fillOval(
|
||||
Math.floorMod(element.position.getX() - offset.getX(), viewPort.getX()),
|
||||
Math.floorMod(element.position.getY() - offset.getY(), viewPort.getY()),
|
||||
element.radius.getX(),
|
||||
element.radius.getY());
|
||||
}
|
||||
}
|
||||
|
||||
private void generateStars(final CoordI2 viewPort) {
|
||||
if (REFERENCE_STARS.isEmpty()) {
|
||||
final var rand = ThreadLocalXorShift128Random.current();
|
||||
|
||||
for (var i = 0; i < 350; i++) {
|
||||
final var position = ImmutableCoordI2.create(rand.nextInt(RendererControl.REFERENCE_RESOLUTION.getX()), rand.nextInt(RendererControl.REFERENCE_RESOLUTION.getY()));
|
||||
final var radius = ImmutableCoordI2.create(rand.nextInt(3) + 2, rand.nextInt(3) + 2);
|
||||
final var color = new ImmutableRgbaColor(rand.nextInt(30) + 100, rand.nextInt(30) + 100, rand.nextInt(30) + 130);
|
||||
|
||||
REFERENCE_STARS.add(new Star(position, radius, color));
|
||||
STARS.add(new Star(position, radius, color));
|
||||
}
|
||||
}
|
||||
|
||||
if (!viewPort.equals(STARS_LAST_VIEWPORT)) {
|
||||
final double scaleX = (double) viewPort.getX() / RendererControl.REFERENCE_RESOLUTION.getX();
|
||||
final double scaleY = (double) viewPort.getY() / RendererControl.REFERENCE_RESOLUTION.getY();
|
||||
|
||||
for (int i = 0; i < REFERENCE_STARS.size(); i++) {
|
||||
final var refStar = REFERENCE_STARS.get(i);
|
||||
final var star = STARS.get(i);
|
||||
|
||||
star.position = ImmutableCoordI2.create(
|
||||
(int) (refStar.position.getX() * scaleX),
|
||||
(int) (refStar.position.getY() * scaleY));
|
||||
}
|
||||
STARS_LAST_VIEWPORT = viewPort.toImmutableCoordI2();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Star {
|
||||
|
||||
CoordI2 position;
|
||||
|
||||
CoordI2 radius;
|
||||
|
||||
RgbaColor color;
|
||||
|
||||
Star(final CoordI2 position, final CoordI2 radius, final RgbaColor color) {
|
||||
super();
|
||||
this.position = position;
|
||||
this.radius = radius;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -110,4 +111,20 @@ public class UrbanPatternRenderer implements PatternRenderer {
|
||||
g2d.fillRect(centerX - crossSize / 2, centerY - t / 2, crossSize, t);
|
||||
g2d.fillRect(centerX - t / 2, centerY - crossSize / 2, t, crossSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
final int cellSize = 60;
|
||||
final int offX = Math.floorMod(offset.getX(), cellSize);
|
||||
final int offY = Math.floorMod(offset.getY(), cellSize);
|
||||
|
||||
for (int x = -cellSize; x < viewPort.getX() + cellSize; x += cellSize) {
|
||||
for (int y = -cellSize; y < viewPort.getY() + cellSize; y += cellSize) {
|
||||
// Vertical streaks
|
||||
g2d.fillRect(x + offX + 10, y + offY + 5, 2, 15);
|
||||
g2d.fillRect(x + offX + 40, y + offY + 35, 2, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,13 @@ package de.extio.game_engine.renderer.g2d.theme;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import de.extio.game_engine.renderer.g2d.G2DRendererCondition;
|
||||
import de.extio.game_engine.spatial2.model.CoordI2;
|
||||
|
||||
@Conditional(G2DRendererCondition.class)
|
||||
@Component
|
||||
@@ -146,4 +148,40 @@ public class VintagePatternRenderer implements PatternRenderer {
|
||||
g2d.fillRect(centerX - crossThickness / 2, centerY - crossSize / 2, crossThickness, crossSize);
|
||||
}
|
||||
}
|
||||
|
||||
private java.awt.image.BufferedImage patternCache;
|
||||
|
||||
private java.awt.image.BufferedImage getPatternCache() {
|
||||
if (this.patternCache == null) {
|
||||
final int cellSize = 150;
|
||||
this.patternCache = new BufferedImage(cellSize, cellSize, java.awt.image.BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g2d = this.patternCache.createGraphics();
|
||||
|
||||
g2d.setBackground(new Color(0, 0, 0, 0));
|
||||
g2d.clearRect(0, 0, cellSize, cellSize);
|
||||
|
||||
g2d.setColor(new Color(255, 255, 255, 35));
|
||||
g2d.drawLine(10, 10, 20, 30);
|
||||
g2d.drawLine(60, 50, 55, 70);
|
||||
g2d.fillOval(80, 20, 2, 2);
|
||||
|
||||
g2d.dispose();
|
||||
}
|
||||
return this.patternCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBackgroundPattern(final Graphics2D g2d, final CoordI2 offset, final CoordI2 viewPort) {
|
||||
final var cache = this.getPatternCache();
|
||||
final int cellSize = cache.getWidth();
|
||||
|
||||
final int offX = Math.floorMod(offset.getX(), cellSize);
|
||||
final int offY = Math.floorMod(offset.getY(), cellSize);
|
||||
|
||||
for (int x = -cellSize; x < viewPort.getX() + cellSize; x += cellSize) {
|
||||
for (int y = -cellSize; y < viewPort.getY() + cellSize; y += cellSize) {
|
||||
g2d.drawImage(cache, x + offX, y + offY, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ public final class UiOptions {
|
||||
|
||||
private boolean backgroundScrollingReverse0;
|
||||
|
||||
private boolean backgroundScrolling1 = true;
|
||||
private boolean backgroundScrolling1;
|
||||
|
||||
private boolean backgroundScrollingReverse1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user