Fixed spheres

This commit is contained in:
Sollace 2020-05-06 15:56:21 +02:00
parent ee7c67afe4
commit 3789c31062
2 changed files with 52 additions and 24 deletions

View file

@ -4,13 +4,14 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.particle.ParticleTextureSheet;
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
import com.minelittlepony.client.render.MagicGlow;
import com.minelittlepony.unicopia.client.render.model.SphereModel; import com.minelittlepony.unicopia.client.render.model.SphereModel;
import com.minelittlepony.unicopia.magic.Caster; import com.minelittlepony.unicopia.magic.Caster;
import com.minelittlepony.unicopia.particles.ParticleHandle.Attachment; import com.minelittlepony.unicopia.particles.ParticleHandle.Attachment;
@ -24,8 +25,13 @@ public class SphereParticle extends Particle implements Attachment {
protected float blue; protected float blue;
protected float alpha; protected float alpha;
protected float prevRadius;
protected float radius; protected float radius;
protected int steps;
protected float lerpIncrement;
protected float toRadius;
private Caster<?> caster; private Caster<?> caster;
private static final SphereModel model = new SphereModel(); private static final SphereModel model = new SphereModel();
@ -64,7 +70,9 @@ public class SphereParticle extends Particle implements Attachment {
@Override @Override
public void setAttribute(int key, Object value) { public void setAttribute(int key, Object value) {
if (key == 0) { if (key == 0) {
radius = (float)value; toRadius = (float)value;
steps = 20;
lerpIncrement = (toRadius - radius) / steps;
} }
if (key == 1) { if (key == 1) {
int tint = (int)value; int tint = (int)value;
@ -94,6 +102,14 @@ public class SphereParticle extends Particle implements Attachment {
} }
setPos(e.getX(), e.getY(), e.getZ()); setPos(e.getX(), e.getY(), e.getZ());
prevPosX = e.lastRenderX;
prevPosY = e.lastRenderY;
prevPosZ = e.lastRenderZ;
}
if (steps-- > 0) {
radius += lerpIncrement;
} }
} else { } else {
radius *= 0.9998281; radius *= 0.9998281;
@ -102,16 +118,29 @@ public class SphereParticle extends Particle implements Attachment {
@Override @Override
public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) {
if (alpha <= 0 || radius <= 0) { if (alpha <= 0 || radius <= 0) {
return; return;
} }
MatrixStack matrices = new MatrixStack(); MatrixStack matrices = new MatrixStack();
VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
model.setPosition(x, y, z); model.setPosition(
MathHelper.lerp(tickDelta, prevPosX, x) - camera.getPos().x,
MathHelper.lerp(tickDelta, prevPosY, y) - camera.getPos().y,
MathHelper.lerp(tickDelta, prevPosZ, z) - camera.getPos().z
);
model.setRotation(0, 0, 0); model.setRotation(0, 0, 0);
model.render(matrices, radius, immediate.getBuffer(RenderLayer.getTranslucent()), 1, 1, red, green, blue, alpha);
float lerpedRad = MathHelper.lerp(tickDelta, prevRadius, radius);
model.render(matrices, lerpedRad + 0.1F, immediate.getBuffer(MagicGlow.getRenderLayer()), 1, 1, red, green, blue, alpha);
model.render(matrices, lerpedRad - 0.1F, immediate.getBuffer(MagicGlow.getRenderLayer()), 1, 1, red * 0.9F, green * 0.9F, blue * 0.9F, Math.min(1, alpha + 0.2F));
immediate.draw(); immediate.draw();
prevRadius = radius;
} }
} }

View file

@ -1,7 +1,6 @@
package com.minelittlepony.unicopia.client.render.model; package com.minelittlepony.unicopia.client.render.model;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.util.math.Matrix4f; import net.minecraft.client.util.math.Matrix4f;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3f; import net.minecraft.client.util.math.Vector3f;
@ -18,7 +17,7 @@ public class SphereModel {
protected Quaternion rotZ = Quaternion.IDENTITY; protected Quaternion rotZ = Quaternion.IDENTITY;
public void setPosition(double x, double y, double z) { public void setPosition(double x, double y, double z) {
pos = new Vec3d(x, y, z).subtract(BlockEntityRenderDispatcher.INSTANCE.camera.getPos()); pos = new Vec3d(x, y, z);
} }
public void setRotation(float x, float y, float z) { public void setRotation(float x, float y, float z) {
@ -50,20 +49,18 @@ public class SphereModel {
Matrix4f model = matrices.getModel(); Matrix4f model = matrices.getModel();
final double num_rings = 30; final double num_rings = 40;
final double num_sectors = 30; final double num_sectors = 40;
final double two_pi = Math.PI * 2; final double pi = Math.PI;
final double two_pi = Math.PI * 2F;
final double zenithIncrement = Math.PI / num_rings; final double zenithIncrement = Math.PI / num_rings;
final double azimuthIncrement = two_pi / num_sectors; final double azimuthIncrement = two_pi / num_sectors;
double radius = 1; double radius = 1;
for(double zenith = 0; zenith < Math.PI; zenith += zenithIncrement) { for(double zenith = -pi; zenith < pi; zenith += zenithIncrement) {
for(double azimuth = 0; azimuth < two_pi; azimuth += azimuthIncrement) { for(double azimuth = -two_pi; azimuth < two_pi; azimuth += azimuthIncrement) {
drawVertex(model, vertexWriter, radius, zenith, azimuth, light, overlay, r, g, b, a); // top left drawQuad(model, vertexWriter, radius, zenith, azimuth, zenithIncrement, azimuthIncrement, light, overlay, r, g, b, a);
drawVertex(model, vertexWriter, radius, zenith + zenithIncrement, azimuth, light, overlay, r, g, b, a); // top right
drawVertex(model, vertexWriter, radius, zenith + zenithIncrement, azimuth + azimuthIncrement, light, overlay, r, g, b, a); // bottom right
drawVertex(model, vertexWriter, radius, zenith, azimuth + azimuthIncrement, light, overlay, r, g, b, a); // bottom left
} }
} }
} }
@ -73,7 +70,13 @@ public class SphereModel {
double zenithIncrement, double azimuthIncrement, double zenithIncrement, double azimuthIncrement,
int light, int overlay, float r, float g, float b, float a) { int light, int overlay, float r, float g, float b, float a) {
drawVertex(model, vertexWriter, radius, zenith, azimuth, light, overlay, r, g, b, a);
drawVertex(model, vertexWriter, radius, zenith + zenithIncrement, azimuth, light, overlay, r, g, b, a);
drawVertex(model, vertexWriter, radius, zenith + zenithIncrement, azimuth + azimuthIncrement, light, overlay, r, g, b, a);
drawVertex(model, vertexWriter, radius, zenith, azimuth + azimuthIncrement, light, overlay, r, g, b, a);
} }
protected void drawVertex(Matrix4f model, VertexConsumer vertexWriter, protected void drawVertex(Matrix4f model, VertexConsumer vertexWriter,
@ -81,18 +84,14 @@ public class SphereModel {
int light, int overlay, float r, float g, float b, float a) { int light, int overlay, float r, float g, float b, float a) {
Vector4f position = convertToCartesianCoord(radius, zenith, azimuth); Vector4f position = convertToCartesianCoord(radius, zenith, azimuth);
position.transform(model); position.transform(model);
vertexWriter.vertex(position.getX(), position.getY(), position.getZ(), vertexWriter.vertex(position.getX(), position.getY(), position.getZ(), r, g, b, a, 0, 0, overlay, light, 0, 0, 0);
r, g, b, a,
0, 0, overlay, light, 0, 0, 0);
} }
protected Vector4f convertToCartesianCoord(double radius, double zenith, double azimuth) { protected Vector4f convertToCartesianCoord(double r, double theta, double phi) {
double tanq = Math.tan(zenith); double x = r * Math.sin(theta) * Math.cos(phi);
double y = r * Math.sin(theta) * Math.sin(phi);
double x = Math.pow(radius, 2) / (2 * tanq) - (tanq / 2); double z = r * Math.cos(theta);
double y = x * tanq;
double z = radius / Math.tan(azimuth);
return new Vector4f((float)x, (float)y, (float)z, 1); return new Vector4f((float)x, (float)y, (float)z, 1);
} }