Realign all particles towards the camera when rendering 360° frames

This commit is contained in:
johni0702
2015-06-28 17:53:46 +02:00
parent f862b46274
commit 18ec3cccc5
3 changed files with 124 additions and 7 deletions

View File

@@ -2,7 +2,9 @@ package eu.crushedpixel.replaymod.video.entity;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.settings.RenderOptions;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
@@ -123,4 +125,23 @@ public class CubicEntityRenderer extends CustomEntityRenderer {
protected void renderSpectatorHand(float partialTicks, int renderPass) {
// No spectator hands during 360° view
}
@Override
protected void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
// Align all particles towards the camera
double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX;
double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY;
double dz = fx.prevPosZ + (fx.posZ - fx.prevPosZ) * partialTicks - view.posZ;
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
double yaw = -Math.atan2(dx, dz);
rotX = (float) Math.cos(yaw);
rotZ = (float) Math.sin(yaw);
rotXZ = (float) Math.cos(pitch);
rotYZ = (float) (-rotZ * Math.sin(pitch));
rotXY = (float) (rotX * Math.sin(pitch));
super.renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
}
}

View File

@@ -7,9 +7,11 @@ import eu.crushedpixel.replaymod.utils.OpenGLUtils;
import eu.crushedpixel.replaymod.video.entity.strategy.*;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.culling.ClippingHelperImpl;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
@@ -21,6 +23,7 @@ import org.lwjgl.util.glu.Project;
import java.awt.image.BufferedImage;
import java.lang.reflect.Field;
import java.util.List;
import static net.minecraft.client.renderer.GlStateManager.*;
import static org.lwjgl.opengl.GL11.*;
@@ -135,7 +138,6 @@ public abstract class CustomEntityRenderer {
protected void renderWorldPass(float partialTicks, long finishTimeNano, int renderPass) {
RenderGlobal renderglobal = mc.renderGlobal;
EffectRenderer effectrenderer = mc.effectRenderer;
Entity entity = mc.getRenderViewEntity();
enableCull();
viewport(0, 0, mc.displayWidth, mc.displayHeight);
@@ -209,12 +211,7 @@ public abstract class CustomEntityRenderer {
renderglobal.drawBlockDamageTexture(Tessellator.getInstance(), Tessellator.getInstance().getWorldRenderer(), entity, partialTicks);
disableBlend();
proxied.enableLightmap();
effectrenderer.renderLitParticles(entity, partialTicks);
RenderHelper.disableStandardItemLighting();
setupFog(0, partialTicks);
effectrenderer.renderParticles(entity, partialTicks);
proxied.disableLightmap();
renderParticles(entity, partialTicks);
depthMask(false);
enableCull();
@@ -261,6 +258,101 @@ public abstract class CustomEntityRenderer {
renderSpectatorHand(partialTicks, renderPass);
}
protected void renderParticles(Entity entity, float partialTicks) {
proxied.enableLightmap();
renderLitParticles(entity, partialTicks);
RenderHelper.disableStandardItemLighting();
setupFog(0, partialTicks);
renderNormalParticles(entity, partialTicks);
proxied.disableLightmap();
}
protected void renderLitParticles(Entity entity, float partialTicks) {
EffectRenderer effectRenderer = mc.effectRenderer;
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
double yaw = Math.toRadians(entity.rotationYaw);
double pitch = Math.toRadians(entity.rotationPitch);
float rotX = (float) Math.cos(yaw);
float rotZ = (float) Math.sin(yaw);
float rotXZ = (float) Math.cos(pitch);
float rotYZ = (float) (-rotZ * Math.sin(pitch));
float rotXY = (float) (rotX * Math.sin(pitch));
for (int i = 0; i < 2; i++) {
@SuppressWarnings("unchecked")
List<EntityFX> list = (List<EntityFX>) effectRenderer.fxLayers[3][i];
for (EntityFX fx : list) {
worldrenderer.setBrightness(fx.getBrightnessForRender(partialTicks));
renderParticle(fx, worldrenderer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
}
}
}
protected void renderNormalParticles(Entity entity, float partialTicks) {
EffectRenderer effectRenderer = mc.effectRenderer;
TextureManager textureManager = mc.getTextureManager();
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldRenderer = tessellator.getWorldRenderer();
float rotX = ActiveRenderInfo.getRotationX();
float rotZ = ActiveRenderInfo.getRotationZ();
float rotYZ = ActiveRenderInfo.getRotationYZ();
float rotXY = ActiveRenderInfo.getRotationXY();
float rotXZ = ActiveRenderInfo.getRotationXZ();
EntityFX.interpPosX = entity.posX;
EntityFX.interpPosY = entity.posY;
EntityFX.interpPosZ = entity.posZ;
enableBlend();
blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
alphaFunc(GL_GREATER, 0.003921569F);
for (int texture = 0; texture < 3; texture++) {
for (int depthMask = 0; depthMask < 2; depthMask++) {
if (effectRenderer.fxLayers[texture][depthMask].isEmpty()) {
continue;
}
if (depthMask == 0) {
GlStateManager.depthMask(false);
} else {
GlStateManager.depthMask(true);
}
if (texture == 1) {
textureManager.bindTexture(TextureMap.locationBlocksTexture);
} else {
textureManager.bindTexture(EffectRenderer.particleTextures);
}
color(1, 1, 1, 1);
worldRenderer.startDrawingQuads();
@SuppressWarnings("unchecked")
List<EntityFX> list = (List<EntityFX>) effectRenderer.fxLayers[texture][depthMask];
for (final EntityFX fx : list) {
worldRenderer.setBrightness(fx.getBrightnessForRender(partialTicks));
renderParticle(fx, worldRenderer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
}
tessellator.draw();
}
}
depthMask(true);
disableBlend();
alphaFunc(516, 0.1F);
}
protected void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks,
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
}
protected void renderSpectatorHand(float partialTicks, int renderPass) {
Entity currentEntity = ReplayHandler.getCurrentEntity();
if(!ReplayHandler.isCamera() && currentEntity instanceof EntityPlayer) {

View File

@@ -87,5 +87,9 @@ public net.minecraft.client.renderer.ItemRenderer *()
# EntityOtherPlayerMP
public net.minecraft.client.entity.EntityOtherPlayerMP *
# EffectRenderer
public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures
public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers
# Example
# public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName