package mindustry.graphics; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; import arc.util.*; public class Shaders{ public static Shadow shadow; public static BlockBuild blockbuild; public static @Nullable Shield shield; public static UnitBuild build; public static FogShader fog; public static MenuShader menu; public static LightShader light; public static SurfaceShader water, tar, slag; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static SunShader sun; public static void init(){ shadow = new Shadow(); blockbuild = new BlockBuild(); try{ shield = new Shield(); }catch(Throwable t){ //don't load shield shader shield = null; t.printStackTrace(); } build = new UnitBuild(); fog = new FogShader(); menu = new MenuShader(); light = new LightShader(); water = new SurfaceShader("water"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); planet = new PlanetShader(); planetGrid = new PlanetGridShader(); sun = new SunShader(); } public static class PlanetShader extends LoadShader{ public Vec3 lightDir = new Vec3(1, 1, 1).nor(); public PlanetShader(){ super("planet", "planet"); } @Override public void apply(){ setUniformf("u_lightdir", lightDir); } } public static class SunShader extends LoadShader{ public int octaves = 5; public float falloff = 0.5f, scale = 1f, power = 1.3f, magnitude = 0.6f, speed = 99999999999f, spread = 1.3f, seed = Mathf.random(9999f); public Color[] colors; public float[] colorValues; public Vec3 center = new Vec3(); public SunShader(){ super("sun", "sun"); } @Override public void apply(){ setUniformi("u_octaves", octaves); setUniformf("u_falloff", falloff); setUniformf("u_scale", scale); setUniformf("u_power", power); setUniformf("u_magnitude", magnitude); setUniformf("u_time", Time.globalTime() / speed); setUniformf("u_seed", seed); setUniformf("u_spread", spread); setUniformf("u_center", center); setUniformi("u_colornum", colors.length); setUniform4fv("u_colors[0]", colorValues, 0, colorValues.length); } public void updateColors(){ colorValues = new float[colors.length*4]; for(int i = 0; i < colors.length; i ++){ colorValues[i*4] = colors[i].r; colorValues[i*4 + 1] = colors[i].g; colorValues[i*4 + 2] = colors[i].b; colorValues[i*4 + 3] = colors[i].a; } } } public static class PlanetGridShader extends LoadShader{ public Vec3 mouse = new Vec3(); public PlanetGridShader(){ super("planetgrid", "planetgrid"); } @Override public void apply(){ setUniformf("u_mouse", mouse); } } public static class LightShader extends LoadShader{ public Color ambient = new Color(0.01f, 0.01f, 0.04f, 0.99f); public LightShader(){ super("light", "default"); } @Override public void apply(){ setUniformf("u_ambient", ambient); } } public static class MenuShader extends LoadShader{ float time = 0f; public MenuShader(){ super("menu", "default"); } @Override public void apply(){ time = time % 158; setUniformf("u_resolution", Core.graphics.getWidth(), Core.graphics.getHeight()); setUniformi("u_time", (int)(time += Core.graphics.getDeltaTime() * 60f)); setUniformf("u_uv", Core.atlas.white().getU(), Core.atlas.white().getV()); setUniformf("u_scl", Scl.scl(1f)); setUniformf("u_uv2", Core.atlas.white().getU2(), Core.atlas.white().getV2()); } } public static class FogShader extends LoadShader{ public FogShader(){ super("fog", "default"); } } public static class UnitBuild extends LoadShader{ public float progress, time; public Color color = new Color(); public TextureRegion region; public UnitBuild(){ super("unitbuild", "default"); } @Override public void apply(){ setUniformf("u_time", time); setUniformf("u_color", color); setUniformf("u_progress", progress); setUniformf("u_uv", region.getU(), region.getV()); setUniformf("u_uv2", region.getU2(), region.getV2()); setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); } } public static class Shadow extends LoadShader{ public Color color = new Color(); public TextureRegion region = new TextureRegion(); public float scl; public Shadow(){ super("shadow", "default"); } @Override public void apply(){ setUniformf("u_color", color); setUniformf("u_scl", scl); setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); } } public static class BlockBuild extends LoadShader{ public Color color = new Color(); public float progress; public TextureRegion region = new TextureRegion(); public BlockBuild(){ super("blockbuild", "default"); } @Override public void apply(){ setUniformf("u_progress", progress); setUniformf("u_color", color); setUniformf("u_uv", region.getU(), region.getV()); setUniformf("u_uv2", region.getU2(), region.getV2()); setUniformf("u_time", Time.time()); setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); } } public static class Shield extends LoadShader{ public Shield(){ super("shield", "default"); } @Override public void apply(){ setUniformf("u_dp", Scl.scl(1f)); setUniformf("u_time", Time.time() / Scl.scl(1f)); setUniformf("u_offset", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); setUniformf("u_texsize", Core.camera.width, Core.camera.height); } } public static class SurfaceShader extends LoadShader{ public SurfaceShader(String frag){ super(frag, "default"); } @Override public void apply(){ setUniformf("camerapos", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); setUniformf("screensize", Core.camera.width, Core.camera.height); setUniformf("time", Time.time()); } } public static class LoadShader extends Shader{ public LoadShader(String frag, String vert){ super(Core.files.internal("shaders/" + vert + ".vertex.glsl"), Core.files.internal("shaders/" + frag + ".fragment.glsl")); } } }