diff --git a/5 Textures/Test_RandomTexture_1.java b/5 Textures/Test_RandomTexture_1.java new file mode 100644 index 0000000..eac5c20 --- /dev/null +++ b/5 Textures/Test_RandomTexture_1.java @@ -0,0 +1,44 @@ +import graphics.core.*; +import graphics.math.*; +import graphics.geometry.*; +import graphics.material.*; +import graphics.extras.*; +import graphics.light.*; +import graphics.font.*; + +public class Test_RandomTexture_1 extends Base { + public Renderer renderer; + public Scene scene; + public Camera camera; + public Mesh mesh; + public MovementRig rig; + public Material waterMat; + + public void initialize() { + renderer = new Renderer(); + scene = new Scene(); + camera = new Camera(); + camera.setPosition( new Vector(0, 0, 4) ); + + Geometry rect = new RectangleGeometry(1.5, 1.5); + waterMat = new RandomTexture(); + + waterMat.addUniform("bool", "useSmooth", 1); + waterMat.locateUniforms(); + + mesh = new Mesh(rect, waterMat); + scene.add(mesh); + } + + public void update() { + waterMat.uniforms.get("time").data = time; + renderer.render(scene, camera); + } + + // driver method + public static void main(String[] args) { + new Test_RandomTexture_1().run(); + } + +} + diff --git a/5 Textures/Test_RandomTexture_2.java b/5 Textures/Test_RandomTexture_2.java new file mode 100644 index 0000000..3068ef5 --- /dev/null +++ b/5 Textures/Test_RandomTexture_2.java @@ -0,0 +1,82 @@ +import graphics.core.*; +import graphics.math.*; +import graphics.geometry.*; +import graphics.material.*; +import graphics.extras.*; +import graphics.light.*; +import graphics.font.*; + +import java.awt.*; + +public class Test_RandomTexture_2 extends Base +{ + public Renderer renderer; + public Scene scene; + public Camera camera; + public Mesh skyBox; + public MovementRig rig; + public Material liquidMat, skyMat; + + public void initialize() + { + renderer = new Renderer(); + scene = new Scene(); + camera = new Camera(); + + rig = new MovementRig(); + rig.attach( camera ); + rig.setPosition( new Vector(0.5, 2, 4) ); + scene.add( rig ); + + // SkyBox + Geometry skySphere = new SphereGeometry(50); + skyMat = new RandomTexture(); + + skyMat.addUniform("bool", "cloud", 1); + skyMat.locateUniforms(); + + skyBox = new Mesh(skySphere, skyMat); + scene.add(skyBox); + + // Water + Geometry liquidSurface = new EllipsoidGeometry(110, 0.1, 110, 128, 128); + liquidMat = new RandomTexture(); + + // Make liquid water + liquidMat.addUniform("bool", "water", 1); + liquidMat.addUniform("bool", "waves", 1); + liquidMat.locateUniforms(); + + Mesh liquid = new Mesh(liquidSurface, liquidMat); + liquid.setPosition(new Vector(0, 0.4 , 0)); + scene.add(liquid); + + // Island + Geometry islandSphere = new EllipsoidGeometry(20, 2, 17, 32, 32); + Material islandMat = new TextureMaterial(new Texture("images/grass.jpg")); + Mesh island = new Mesh(islandSphere, islandMat); + island.setPosition(new Vector(0, 0.25, 0)); + scene.add(island); + } + + public void update() + { + // Rotate skyBox + //skyBox.rotateY(0.000337, true); + + // Animate liquid and sky + skyMat.uniforms.get("time").data = 0.1f * time; + liquidMat.uniforms.get("time").data = 1.4f * time; + + rig.update(input, deltaTime); + renderer.render(scene, camera); + } + + // driver method + public static void main(String[] args) + { + new Test_RandomTexture_2().run(); + } + +} + diff --git a/5 Textures/graphics/material/RandomTexture.frag b/5 Textures/graphics/material/RandomTexture.frag new file mode 100644 index 0000000..ffe7019 --- /dev/null +++ b/5 Textures/graphics/material/RandomTexture.frag @@ -0,0 +1,111 @@ +// Return a random value in [0, 1] +float random(vec2 UV, float time) { + return fract(235711.0 * sin(14.337*UV.x + 42.418*UV.y) + 0.2*time ); +}//end random + +float boxRandom(vec2 UV, float scale, float time) { + vec2 iScaleUV = floor(scale * UV); + + if(iScaleUV.x == (scale - 1)) + iScaleUV.x = 0; + + return random(iScaleUV, time); +}//end boxRandom + +float smoothRandom(vec2 UV, float scale, float time) { + vec2 iScaleUV = floor(scale * UV); + vec2 fScaleUV = fract(scale * UV); + + float a = random(round(iScaleUV + vec2(0,0)), time); + float b = random(round(iScaleUV + vec2(1,0)), time); + float c = random(round(iScaleUV + vec2(0,1)), time); + float d = random(round(iScaleUV + vec2(1,1)), time); + + if(iScaleUV.x == (scale - 1)) { + b = random(round(iScaleUV - vec2(scale - 1, 0) ), time); + d = random(round(iScaleUV - vec2(iScaleUV.x - scale, 1 ) ), time); + } + + return mix(mix(a, b, fScaleUV.x), + mix(c, d, fScaleUV.x), + fScaleUV.y); +}//end smoothRandom + +/* + * Add smooth random values at different scales + * Weighted (amplitudes) so the sum is approx. 1.0 + */ +float fractalRandom(vec2 UV, float scale, float time) { + float value = 0.0; + float amplitude = 0.5; + + for(int i = 0; i < 6; i++) { + value += amplitude * smoothRandom(UV, scale, time); + scale *= 2.0; + amplitude *= 0.5; + } + + return value; +}//end fractalRandom + + +uniform bool useBox; +uniform bool useSmooth; +uniform bool useFractal; +uniform bool lava; +uniform bool cloud; +uniform bool water; + +in vec2 UV; +uniform float time; +out vec4 fragColor; + +void main() { + + // Default settings + float r = random(UV, time); + + if (useBox) + r = boxRandom(UV, 6, time); + + else if (useSmooth) + r = smoothRandom(UV, 4, time); + + else if (useFractal) + r = fractalRandom(UV, 4, time); + + // Send out basic function + fragColor = vec4(r, r, r, 1); + + // Pre-designed randomized textures are below + if (lava) { + r = fractalRandom(UV, 40, time); + vec4 color1 = vec4(1, 0.8, 0, 1); + vec4 color2 = vec4(0.8, 0, 0, 1); + + fragColor = mix(color1, color2, r); + } + + else if (water) { + r = fractalRandom(UV, 40, time); + vec4 color1 = vec4(0.0, 0.0, 0.8, 1); // Dark Blue + vec4 color2 = vec4(0.3, 0.4, 0.9, 1); // Lighter blue + + fragColor = mix(color1, color2, r); + } + + else if (cloud) { + r = fractalRandom(UV, 25, time); + vec4 color1 = vec4(0.1, 0.2, 1, 1); // Blue + vec4 color2 = vec4(1, 1, 1, 1); // White + + vec4 sky = mix(color1, color2, r); + + vec4 horizon = vec4(0.4, 0.6, 1, 1);// Light blue + float amount = -2 * UV.y + 2; + amount = pow(amount, 7); + + fragColor = mix(sky, horizon, amount); + } + +}//end main diff --git a/5 Textures/graphics/material/RandomTexture.java b/5 Textures/graphics/material/RandomTexture.java new file mode 100644 index 0000000..5e5dcb0 --- /dev/null +++ b/5 Textures/graphics/material/RandomTexture.java @@ -0,0 +1,21 @@ +import graphics.core.Texture; +import graphics.math.Vector; + +import static org.lwjgl.opengl.GL40.*; + +public class RandomTexture extends Material { + public RandomTexture() { + super( + "graphics/material/RandomTexture.vert", + "graphics/material/RandomTexture.frag"); + + addRenderSetting( "doubleSide", true ); + addRenderSetting( "wireframe", false ); + addRenderSetting( "lineWidth", 1 ); + + // Defaults + addUniform("float", "time", (float)0); + + locateUniforms(); + } +} diff --git a/5 Textures/graphics/material/RandomTexture.vert b/5 Textures/graphics/material/RandomTexture.vert new file mode 100644 index 0000000..8c653aa --- /dev/null +++ b/5 Textures/graphics/material/RandomTexture.vert @@ -0,0 +1,24 @@ +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; +uniform mat4 modelMatrix; + +uniform bool waves; + +uniform float time; +in vec3 vertexPosition; +in vec2 vertexUV; +out vec2 UV; + +void main() { + + vec4 pos = vec4(vertexPosition, 1.0); + gl_Position = projectionMatrix * viewMatrix * modelMatrix * pos; + UV = vertexUV; + + if (waves) { + float offset = 0.1 * sin(0.5 * vertexPosition.x + time); + vec3 pos = vertexPosition + vec3(0.0, offset, 0.0); + gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(pos, 1); + } + +}//end main diff --git a/5 Textures/testingMiniMap.java b/5 Textures/testingMiniMap.java new file mode 100644 index 0000000..a7648a3 --- /dev/null +++ b/5 Textures/testingMiniMap.java @@ -0,0 +1,136 @@ +import graphics.core.*; +import graphics.extras.AxesHelper; +import graphics.extras.MovementRig; +import graphics.geometry.*; +import graphics.material.Material; +import graphics.material.SurfaceMaterial; +import graphics.material.TextureMaterial; +import graphics.math.Vector; + +import javax.management.relation.RoleUnresolved; + +public class testingMiniMap extends Base { + // General initialization + public Renderer renderer; + public Scene scene, hudScene; + public Camera camera, hudCamera; + public MovementRig rig; + + // Shapes + public Mesh sphere, box, grass, sky; + + // Minimap initialization + public RenderTarget renderTarget; + public Camera skyCamera; + + public void initialize() { + // Main scene + renderer = new Renderer(); + scene = new Scene(); + camera = new Camera(); + rig = new MovementRig(); + + rig.attach(camera); + rig.setPosition(new Vector(0, 1.5, 5)); + + scene.add(rig); + + // World + Geometry skySphere = new SphereGeometry(50); + Material skyMat = new TextureMaterial(new Texture("src/images/sky-earth.jpg")); + sky = new Mesh(skySphere, skyMat); + scene.add(sky); + + Geometry grassPlane = new RectangleGeometry(100, 100); + Material grassMat = new TextureMaterial(new Texture("src/images/grass.jpg")); + grassMat.uniforms.get("repeatUV").data = new Vector(50,50); + grass = new Mesh(grassPlane, grassMat); + grass.rotateX(-3.14/2, true); + scene.add( grass ); + + Geometry sphereGeometry = new SphereGeometry(); + Material sphereMaterial = new TextureMaterial( new Texture("src/images/grid.png") ); + sphere = new Mesh( sphereGeometry, sphereMaterial ); + sphere.setPosition( new Vector(-1.2, 1, 0) ); + scene.add( sphere ); + + Geometry boxGeometry = new BoxGeometry(); + Material boxMat = new TextureMaterial(new Texture("src/images/crate.png")); + box = new Mesh(boxGeometry, boxMat); + box.setPosition(new Vector(1.2, 1, 0)); + scene.add( box ); + + + // HUD Scene + hudScene = new Scene(); + hudCamera = new Camera(); + hudCamera.setOrthographic(0, 512, 0, 512, 1, -1); + + // Minimap + Geometry rectangleGeometry = new RectangleGeometry(130, 130); + Material rectangleMat = new SurfaceMaterial(); + rectangleMat.uniforms.get("baseColor").data = new Vector(0.2, 0.2, 0.2); + Mesh mapHousing = new Mesh(rectangleGeometry, rectangleMat); + mapHousing.setPosition(new Vector(447, 65, 0)); + hudScene.add(mapHousing); + + renderTarget = new RenderTarget(new Vector(512, 512)); + + Geometry screenGeometry = new RectangleGeometry(120, 120); + Material screenMat = new TextureMaterial(renderTarget.texture); + Mesh miniMapDisplay = new Mesh(screenGeometry, screenMat); + miniMapDisplay.setPosition(new Vector(447, 65, 0)); + hudScene.add(miniMapDisplay); + + // Create a cross hair in the minimap + Mesh positionMarker1 = new AxesHelper(5, 5); + positionMarker1.rotateX(Math.PI / 2, true); + positionMarker1.setPosition(new Vector(447, 65, 0)); + hudScene.add(positionMarker1); + + Mesh positionMarker2 = new AxesHelper(5, 5); + positionMarker2.rotateX(Math.PI / 2, true); + positionMarker2.rotateY(Math.PI, true); + positionMarker2.setPosition(new Vector(447, 65, 0)); + hudScene.add(positionMarker2); + + // Minimap camera + skyCamera = new Camera(50, 1, 1, -1); + skyCamera.setPosition( new Vector(0, 10, 0.1) ); + scene.add( skyCamera ); + skyCamera.lookAt( new Vector(0, 0, 0) ); + + rig.add( skyCamera ); + + }//end initialize + + public void update() { + rig.update(input, deltaTime); + + // Spin sphere + sphere.rotateY( 0.01337, true ); + + // Render minimap + grass.visible = false; + sky.visible = false; + renderer.renderTarget = renderTarget; + renderer.clearColorBuffer = true; + renderer.render(scene, skyCamera); + + // Render main scene + grass.visible = true; + sky.visible = true; + renderer.renderTarget = null; + renderer.clearColorBuffer = true; + renderer.render(scene, camera); + + // Render hud scene + renderer.clearColorBuffer = false; + renderer.render(hudScene, hudCamera); + + }//end update + + public static void main(String[] args) { + new testingMiniMap().run(); + } +}