Skip to content

Commit

Permalink
FullScreenContainer for scaling all children up to full screen
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Feb 10, 2024
1 parent 75bc0e5 commit 3dc12ef
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 53 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import nz.net.ultraq.redhorizon.engine.audio.AudioConfiguration
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsConfiguration
import nz.net.ultraq.redhorizon.engine.input.KeyEvent
import nz.net.ultraq.redhorizon.engine.scenegraph.Node
import nz.net.ultraq.redhorizon.engine.scenegraph.nodes.FullScreenContainer
import nz.net.ultraq.redhorizon.engine.scenegraph.nodes.FullScreenContainer.FillMode
import nz.net.ultraq.redhorizon.engine.scenegraph.nodes.Sound
import nz.net.ultraq.redhorizon.engine.scenegraph.nodes.Sprite
import nz.net.ultraq.redhorizon.filetypes.ImageFile
Expand Down Expand Up @@ -69,13 +71,13 @@ class MediaPlayer extends Application {

logger.info('File details: {}', mediaFile)

var media = switch (mediaFile) {
case ImageFile -> new Sprite(mediaFile).attachScript(new ImageScript())
var mediaNode = switch (mediaFile) {
case ImageFile -> new FullScreenContainer(fillMode: FillMode.ASPECT_RATIO).addChild(new Sprite(mediaFile))
case SoundFile -> new Sound(mediaFile).attachScript(new SoundPlaybackScript())
default -> throw new UnsupportedOperationException("No media script for the associated file class of ${mediaFile}")
}

scene << media
scene << mediaNode

// mediaLoader = switch (mediaFile) {
// case VideoFile -> new VideoLoader(mediaFile, scene, graphicsSystem, gameClock, inputEventStream)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,32 @@ class JomlExtensions {
throw new IllegalArgumentException("Cannot convert Rectanglef to type ${clazz}")
}

/**
* Calculate the scale factor for a rectangle to fit into the current one
* while maintaining its aspect ratio.
*
* @param rectangle
* @return
*/
static float calculateScaleToFit(Rectanglef self, Rectanglef other) {

return Math.min(self.lengthX() / other.lengthX(), self.lengthY() / other.lengthY())
}

/**
* Update a rectangle's values so each point is equidistant from an 0,0 point
* as if on a plot.
*
* @param self
* @return
*/
static Rectanglef center(Rectanglef self) {

var halfLengthX = self.lengthX() / 2 as float
var halfLengthY = self.lengthY() / 2 as float
return self.set(-halfLengthX, -halfLengthY, halfLengthX, halfLengthY)
}

/**
* Overload the {@code -} operator to perform vector subtraction. Note that
* this creates a new object to store the result and is returned.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests {
if (deletionRequests) {
deletionRequests.drain().each { deletionRequest ->
switch (deletionRequest) {
case Material -> renderer.deleteMaterial(deletionRequest)
case Mesh -> renderer.deleteMesh(deletionRequest)
case Texture -> renderer.deleteTexture(deletionRequest)
default -> throw new IllegalArgumentException("Cannot delete resource of type ${deletionRequest}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ abstract class Shader implements GraphicsResource {

def string = "${name} shader program"
if (uniforms) {
string += " (${uniforms.length}, uniforms)"
string += " (${uniforms.length}, uniform(s))"
}
return string
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,10 @@ class Node<T extends Node> implements SceneEvents, Scriptable<T>, Visitable {
* @return
*/
// TODO: Surely this is inefficient having to calculate this each time? 🤔
private Matrix4f getGlobalTransform() {
protected Matrix4f getGlobalTransform() {

return parent != null ?
globalTransform.mul(parent.globalTransform) :
transform.mul(parent.globalTransform, globalTransform) :
globalTransform.set(transform)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/*
* Copyright 2024, Emanuel Rabina (http://www.ultraq.net.nz/)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package nz.net.ultraq.redhorizon.engine.scenegraph.nodes

import nz.net.ultraq.redhorizon.engine.graphics.Colour
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsElement
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRenderer
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRequests.MeshRequest
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRequests.ShaderRequest
import nz.net.ultraq.redhorizon.engine.graphics.Mesh
import nz.net.ultraq.redhorizon.engine.graphics.MeshType
import nz.net.ultraq.redhorizon.engine.graphics.Shader
import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayout
import nz.net.ultraq.redhorizon.engine.graphics.VertexBufferLayoutPart
import nz.net.ultraq.redhorizon.engine.graphics.opengl.PrimitivesShader
import nz.net.ultraq.redhorizon.engine.scenegraph.Node
import nz.net.ultraq.redhorizon.engine.scenegraph.Scene

import org.joml.Vector2f
import org.joml.primitives.Rectanglef

/**
* A node used for making its children take up the whole screen.
*
* @author Emanuel Rabina
*/
class FullScreenContainer extends Node<FullScreenContainer> implements GraphicsElement {

static enum FillMode {
STRETCH,
ASPECT_RATIO
}

FillMode fillMode = FillMode.ASPECT_RATIO

@Override
void delete(GraphicsRenderer renderer) {
}

@Override
void init(GraphicsRenderer renderer) {
}

@Override
void onSceneAdded(Scene scene) {

bounds
.set(scene.window.renderResolution as Rectanglef)
.center()
// transform.translate(-bounds.lengthX() / 2 as float, -bounds.lengthY() / 2 as float)

// Update children to take up the full screen
children.each { child ->
switch (fillMode) {
case FillMode.ASPECT_RATIO -> {
child.transform.scaleXY(bounds.calculateScaleToFit(child.bounds))
}
case FillMode.STRETCH -> {
child.transform.scaleXY(
bounds.lengthX() / child.bounds.lengthX() as float,
bounds.lengthY() / child.bounds.lengthY() as float
)
}
}
}

addChild(new Outline())
super.onSceneAdded(scene)
}

@Override
void render(GraphicsRenderer renderer) {
}

// TODO: Make this a primitives node
static class Outline extends Node<Outline> implements GraphicsElement {

private Mesh mesh
private Shader shader

@Override
void delete(GraphicsRenderer renderer) {
}

@Override
void init(GraphicsRenderer renderer) {
}

@Override
void onSceneAdded(Scene scene) {

// bounds.set(
// parent.bounds.minX + 5 as float,
// parent.bounds.minY + 5 as float,
// parent.bounds.maxX - 5 as float,
// parent.bounds.maxY - 5 as float
// )
bounds.set(0, 0, 10, 10)
mesh = scene
.requestCreateOrGet(new MeshRequest(
MeshType.LINE_LOOP,
new VertexBufferLayout(VertexBufferLayoutPart.COLOUR, VertexBufferLayoutPart.POSITION),
Colour.GREEN,
bounds as Vector2f[]
))
.get()
shader = scene
.requestCreateOrGet(new ShaderRequest(PrimitivesShader.NAME))
.get()

super.onSceneAdded(scene)
}

@Override
void onSceneRemoved(Scene scene) {

scene.requestDelete(mesh)
}

@Override
void render(GraphicsRenderer renderer) {

if (!mesh || !shader) {
return
}

renderer.draw(mesh, transform, shader)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ class Sprite extends Node<Sprite> implements GraphicsElement {

Sprite(ImageFile imageFile) {

bounds.set(0, 0, imageFile.width, imageFile.height)
bounds
.set(0, 0, imageFile.width, imageFile.height)
.center()
this.imageFile = imageFile
}

Expand All @@ -69,7 +71,7 @@ class Sprite extends Node<Sprite> implements GraphicsElement {
var format = imageFile.format

mesh = scene
.requestCreateOrGet(new SpriteMeshRequest(new Rectanglef(0, 0, width, height)))
.requestCreateOrGet(new SpriteMeshRequest(bounds))
.get()
shader = scene
.requestCreateOrGet(new ShaderRequest(SpriteShader.NAME))
Expand Down Expand Up @@ -97,6 +99,7 @@ class Sprite extends Node<Sprite> implements GraphicsElement {
return
}

renderer.draw(mesh, transform, shader, material)
var globalTransform = getGlobalTransform()
renderer.draw(mesh, globalTransform, shader, material)
}
}

0 comments on commit 3dc12ef

Please sign in to comment.