From 3bb4d36a7e7445f43155142079d8599e41a028e1 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 3 Mar 2021 20:03:16 +0200 Subject: [PATCH] Added a runes particle --- runes.svg | 2330 +++++++++++++++++ .../unicopia/client/URenderers.java | 2 + .../particle/AbstractBillboardParticle.java | 7 +- .../client/particle/DiskParticle.java | 4 +- .../particle/OrientedBillboardParticle.java | 4 +- .../client/particle/RunesParticle.java | 154 ++ .../client/particle/SphereParticle.java | 31 +- .../unicopia/particle/ParticleSource.java | 5 +- .../unicopia/particle/UParticles.java | 2 + .../unicopia/particles/magic_runes.json | 2 + .../unicopia/textures/particles/runes_0.png | Bin 0 -> 23777 bytes .../unicopia/textures/particles/runes_1.png | Bin 0 -> 4541 bytes .../unicopia/textures/particles/runes_2.png | Bin 0 -> 1525 bytes .../unicopia/textures/particles/runes_3.png | Bin 0 -> 785 bytes .../unicopia/textures/particles/runes_4.png | Bin 0 -> 6018 bytes .../unicopia/textures/particles/runes_5.png | Bin 0 -> 5667 bytes 16 files changed, 2516 insertions(+), 25 deletions(-) create mode 100644 runes.svg create mode 100644 src/main/java/com/minelittlepony/unicopia/client/particle/RunesParticle.java create mode 100644 src/main/resources/assets/unicopia/particles/magic_runes.json create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_0.png create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_1.png create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_2.png create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_3.png create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_4.png create mode 100644 src/main/resources/assets/unicopia/textures/particles/runes_5.png diff --git a/runes.svg b/runes.svg new file mode 100644 index 00000000..46af8d00 --- /dev/null +++ b/runes.svg @@ -0,0 +1,2330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 89f8cab9..ceea0235 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.client.particle.MagicParticle; import com.minelittlepony.unicopia.client.particle.RainboomParticle; import com.minelittlepony.unicopia.client.particle.RainbowTrailParticle; import com.minelittlepony.unicopia.client.particle.RaindropsParticle; +import com.minelittlepony.unicopia.client.particle.RunesParticle; import com.minelittlepony.unicopia.client.particle.SphereParticle; import com.minelittlepony.unicopia.client.render.AccessoryFeatureRenderer; import com.minelittlepony.unicopia.client.render.AmuletFeatureRenderer; @@ -48,6 +49,7 @@ public interface URenderers { ParticleFactoryRegistry.getInstance().register(UParticles.HEALTH_DRAIN, createFactory(HealthDrainParticle::new)); ParticleFactoryRegistry.getInstance().register(UParticles.RAINBOOM_RING, RainboomParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.RAINBOOM_TRAIL, RainbowTrailParticle::new); + ParticleFactoryRegistry.getInstance().register(UParticles.MAGIC_RUNES, RunesParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.SPHERE, SphereParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.DISK, DiskParticle::new); ParticleFactoryRegistry.getInstance().register(UParticles.GROUND_POUND, GroundPoundParticle::new); diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/AbstractBillboardParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/AbstractBillboardParticle.java index 070ff59c..ffee02b8 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/AbstractBillboardParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/AbstractBillboardParticle.java @@ -23,7 +23,6 @@ public abstract class AbstractBillboardParticle extends Particle { public AbstractBillboardParticle(ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { super(world, x, y, z, velocityX, velocityY, velocityZ); - } @Override @@ -36,7 +35,7 @@ public abstract class AbstractBillboardParticle extends Particle { Tessellator te = Tessellator.getInstance(); BufferBuilder buffer = te.getBuffer(); - MinecraftClient.getInstance().getTextureManager().bindTexture(getTexture()); + bindTexture(getTexture()); RenderSystem.disableCull(); RenderSystem.enableBlend(); @@ -62,6 +61,10 @@ public abstract class AbstractBillboardParticle extends Particle { protected abstract void renderQuads(Tessellator te, BufferBuilder buffer, float x, float y, float z, float tickDelta); + protected void bindTexture(Identifier texture) { + MinecraftClient.getInstance().getTextureManager().bindTexture(texture); + } + protected void renderQuad(Tessellator te, BufferBuilder buffer, Vector3f[] corners, float alpha, float tickDelta) { int light = getColorMultiplier(tickDelta); diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/DiskParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/DiskParticle.java index 516ea1b5..53711068 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/DiskParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/DiskParticle.java @@ -28,7 +28,7 @@ public class DiskParticle extends SphereParticle { @Override public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { - if (alpha <= 0) { + if (colorAlpha <= 0) { return; } @@ -36,7 +36,7 @@ public class DiskParticle extends SphereParticle { VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); model.setPosition(x, y, z); model.setRotation(rotX, rotY, rotZ); - model.render(matrices, radius, immediate.getBuffer(RenderLayer.getTranslucent()), 1, 1, red, green, blue, alpha); + model.render(matrices, radius, immediate.getBuffer(RenderLayer.getTranslucent()), 1, 1, colorRed, colorGreen, colorBlue, colorAlpha); immediate.draw(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/OrientedBillboardParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/OrientedBillboardParticle.java index 47df9584..1759b974 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/OrientedBillboardParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/OrientedBillboardParticle.java @@ -19,7 +19,7 @@ public abstract class OrientedBillboardParticle extends AbstractBillboardParticl super(world, x, y, z, velocityX, velocityY, velocityZ); fixed = effect.isAngleFixed(); - if (!fixed) { + if (fixed) { rotation.hamiltonProduct(Vector3f.POSITIVE_X.getDegreesQuaternion(180 - effect.getYaw())); rotation.hamiltonProduct(Vector3f.POSITIVE_Y.getDegreesQuaternion(effect.getPitch())); } @@ -27,7 +27,7 @@ public abstract class OrientedBillboardParticle extends AbstractBillboardParticl @Override public void buildGeometry(VertexConsumer drawer, Camera camera, float tickDelta) { - if (fixed) { + if (!fixed) { rotation = camera.getRotation(); } super.buildGeometry(drawer, camera, tickDelta); diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/RunesParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/RunesParticle.java new file mode 100644 index 00000000..d3e3b8a1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/RunesParticle.java @@ -0,0 +1,154 @@ +package com.minelittlepony.unicopia.client.particle; + +import com.minelittlepony.common.util.Color; +import com.minelittlepony.unicopia.ability.magic.Caster; +import com.minelittlepony.unicopia.particle.OrientedBillboardParticleEffect; +import com.minelittlepony.unicopia.particle.ParticleHandle.Attachment; +import com.minelittlepony.unicopia.particle.ParticleHandle.Link; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Quaternion; + +public class RunesParticle extends OrientedBillboardParticle implements Attachment { + + private static final Identifier[] TEXTURES = new Identifier[] { + new Identifier("unicopia", "textures/particles/runes_0.png"), + new Identifier("unicopia", "textures/particles/runes_1.png"), + new Identifier("unicopia", "textures/particles/runes_2.png"), + new Identifier("unicopia", "textures/particles/runes_3.png"), + new Identifier("unicopia", "textures/particles/runes_4.png"), + new Identifier("unicopia", "textures/particles/runes_5.png") + }; + + protected float prevBaseSize = 0; + protected float baseSize = 0; + + private float prevRotationAngle; + private float rotationAngle; + + private final Link link = new Link(); + + private int stasisAge = -1; + + public RunesParticle(OrientedBillboardParticleEffect effect, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { + super(effect, world, x, y, z, velocityX, velocityY, velocityZ); + setMaxAge(70); + + colorRed = world.random.nextFloat(); + colorGreen = world.random.nextFloat(); + colorBlue = world.random.nextFloat(); + } + + @Override + public boolean isStillAlive() { + return age < (maxAge - 1); + } + + @Override + public void attach(Caster caster) { + link.attach(caster); + velocityX = 0; + velocityY = 0; + velocityZ = 0; + } + + @Override + public void detach() { + link.detach(); + } + + @Override + public void setAttribute(int key, Object value) { + if (key == 1) { + int tint = (int)value; + colorRed = Color.r(tint); + colorGreen = Color.g(tint); + colorBlue = Color.b(tint); + } + } + @Override + public float getScale(float tickDelta) { + return MathHelper.lerp(tickDelta, prevBaseSize, baseSize) * super.getScale(tickDelta); + } + + @Override + protected Identifier getTexture() { + return TEXTURES[0]; + } + + private float getAlphaScale() { + float transitionScale = age < maxAge / 2 ? 5 : 3; + return (float)Math.min(1, Math.sin(Math.PI * age / maxAge) * transitionScale); + } + + @Override + protected int getColorMultiplier(float tint) { + return 0xF000F0; + } + + @Override + protected void renderQuads(Tessellator te, BufferBuilder buffer, float x, float y, float z, float tickDelta) { + + float alpha = colorAlpha * getAlphaScale(); + + float angle = MathHelper.lerp(tickDelta, prevRotationAngle, rotationAngle); + + for (int i = 0; i < TEXTURES.length; i++) { + bindTexture(TEXTURES[i]); + + RenderSystem.color3f(colorRed, colorGreen, colorBlue); + + Vector3f[] corners = new Vector3f[]{ + new Vector3f(-1, -1, 0), + new Vector3f(-1, 1, 0), + new Vector3f( 1, 1, 0), + new Vector3f( 1, -1, 0) + }; + float scale = getScale(tickDelta); + + float ringSpeed = (i % 2 == 0 ? i : -1) * i; + + Quaternion ringAngle = Vector3f.POSITIVE_Z.getDegreesQuaternion(angle * ringSpeed); + + for(int k = 0; k < 4; ++k) { + Vector3f corner = corners[k]; + corner.rotate(ringAngle); + corner.rotate(rotation); + corner.scale(scale); + corner.add(x, y + 0.001F, z); + } + + renderQuad(te, buffer, corners, alpha, tickDelta); + } + } + + @Override + public void tick() { + super.tick(); + + if (link.linked()) { + link.ifAbsent(this::detach).map(Caster::getEntity).ifPresent(e -> { + if (getAlphaScale() >= 0.9F) { + if (stasisAge < 0) { + stasisAge = age; + } + age = stasisAge; + } + }); + } + + prevBaseSize = baseSize; + if (baseSize < 3) { + baseSize++; + } + + prevRotationAngle = rotationAngle; + rotationAngle = MathHelper.wrapDegrees(rotationAngle + 0.3F); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java index 4101c1cf..5e28746c 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java +++ b/src/main/java/com/minelittlepony/unicopia/client/particle/SphereParticle.java @@ -19,11 +19,6 @@ import com.minelittlepony.common.util.Color; public class SphereParticle extends Particle implements Attachment { - protected float red; - protected float green; - protected float blue; - protected float alpha; - protected float prevRadius; protected float radius; @@ -47,10 +42,10 @@ public class SphereParticle extends Particle implements Attachment { super(w, x, y, z); this.radius = effect.getRadius(); - this.red = effect.getRed()/255F; - this.green = effect.getGreen()/255F; - this.blue = effect.getBlue()/255F; - this.alpha = effect.getAlpha(); + this.colorRed = effect.getRed()/255F; + this.colorGreen = effect.getGreen()/255F; + this.colorBlue = effect.getBlue()/255F; + this.colorAlpha = effect.getAlpha(); setMaxAge(10); } @@ -63,7 +58,7 @@ public class SphereParticle extends Particle implements Attachment { @Override public void attach(Caster caster) { setMaxAge(50000); - this.link.attach(caster); + link.attach(caster); } @Override @@ -80,9 +75,9 @@ public class SphereParticle extends Particle implements Attachment { } if (key == 1) { int tint = (int)value; - red = Color.r(tint); - green = Color.g(tint); - blue = Color.b(tint); + colorRed = Color.r(tint); + colorGreen = Color.g(tint); + colorBlue = Color.b(tint); } } @@ -115,7 +110,7 @@ public class SphereParticle extends Particle implements Attachment { @Override public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { - if (alpha <= 0 || radius <= 0) { + if (colorAlpha <= 0 || radius <= 0) { return; } @@ -132,10 +127,10 @@ public class SphereParticle extends Particle implements Attachment { float lerpedRad = MathHelper.lerp(tickDelta, prevRadius, radius); VertexConsumer buffer; - buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(red, green, blue, alpha)); - model.render(matrices, lerpedRad + 0.1F, buffer, 1, 1, red, green, blue, alpha); - buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(red * 0.9F, green * 0.9F, blue * 0.9F, Math.min(1, alpha + 0.2F))); - model.render(matrices, lerpedRad - 0.1F, buffer, 1, 1, red * 0.9F, green * 0.9F, blue * 0.9F, Math.min(1, alpha + 0.2F)); + buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(colorRed, colorGreen, colorBlue, colorAlpha)); + model.render(matrices, lerpedRad + 0.1F, buffer, 1, 1, colorRed, colorGreen, colorBlue, colorAlpha); + buffer = immediate.getBuffer(RenderLayers.getTintedTexturedLayer(colorRed * 0.9F, colorGreen * 0.9F, colorBlue * 0.9F, Math.min(1, colorAlpha + 0.2F))); + model.render(matrices, lerpedRad - 0.1F, buffer, 1, 1, colorRed * 0.9F, colorGreen * 0.9F, colorBlue * 0.9F, Math.min(1, colorAlpha + 0.2F)); immediate.draw(); diff --git a/src/main/java/com/minelittlepony/unicopia/particle/ParticleSource.java b/src/main/java/com/minelittlepony/unicopia/particle/ParticleSource.java index cb8e66f2..c0777fa8 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/ParticleSource.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/ParticleSource.java @@ -30,13 +30,16 @@ public interface ParticleSource extends ParticleSpawner { } default void spawnParticles(Shape area, int count, Consumer particleSpawner) { - Vec3d pos = getOriginVector(); + spawnParticles(getOriginVector(), area, count, particleSpawner); + } + default void spawnParticles(Vec3d pos, Shape area, int count, Consumer particleSpawner) { area.randomPoints(count, getWorld().random) .map(point -> point.add(pos)) .forEach(particleSpawner); } + @Override default void addParticle(ParticleEffect effect, Vec3d position, Vec3d velocity) { getWorld().addParticle(effect, position.x, position.y, position.z, velocity.x, velocity.y, velocity.z); diff --git a/src/main/java/com/minelittlepony/unicopia/particle/UParticles.java b/src/main/java/com/minelittlepony/unicopia/particle/UParticles.java index 36ceb97d..2af541f3 100644 --- a/src/main/java/com/minelittlepony/unicopia/particle/UParticles.java +++ b/src/main/java/com/minelittlepony/unicopia/particle/UParticles.java @@ -14,6 +14,8 @@ public interface UParticles { ParticleType RAINBOOM_RING = register("rainboom_ring", FabricParticleTypes.complex(OrientedBillboardParticleEffect.FACTORY)); DefaultParticleType RAINBOOM_TRAIL = register("rainboom_trail", FabricParticleTypes.simple()); + ParticleType MAGIC_RUNES = register("magic_runes", FabricParticleTypes.complex(OrientedBillboardParticleEffect.FACTORY)); + DefaultParticleType RAIN_DROPS = register("rain_drops", FabricParticleTypes.simple()); ParticleType SPHERE = register("sphere", FabricParticleTypes.complex(true, SphereParticleEffect.FACTORY)); diff --git a/src/main/resources/assets/unicopia/particles/magic_runes.json b/src/main/resources/assets/unicopia/particles/magic_runes.json new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/src/main/resources/assets/unicopia/particles/magic_runes.json @@ -0,0 +1,2 @@ +{ +} diff --git a/src/main/resources/assets/unicopia/textures/particles/runes_0.png b/src/main/resources/assets/unicopia/textures/particles/runes_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0c86bdc3ad9f10d0615c03f46159f77488de9b GIT binary patch literal 23777 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/particles/runes_1.png b/src/main/resources/assets/unicopia/textures/particles/runes_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4884cb154e61ae25c9031788f9f7a2583ddb3d3 GIT binary patch literal 4541 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/particles/runes_3.png b/src/main/resources/assets/unicopia/textures/particles/runes_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7eba7f67264996d8385aa5509389bcb2cb1763ad GIT binary patch literal 785 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 XdGm41A-Wj!pbJ=-*cewDVsHNsh!3G> literal 0 HcmV?d00001