package org.terasology.componentSystem.rendering;
import org.lwjgl.opengl.GL11;
import org.terasology.componentSystem.RenderSystem;
import org.terasology.components.HealthComponent;
import org.terasology.components.world.BlockComponent;
import org.terasology.entitySystem.EntityManager;
import org.terasology.entitySystem.EntityRef;
import org.terasology.entitySystem.RegisterComponentSystem;
import org.terasology.game.CoreRegistry;
import org.terasology.logic.manager.AssetManager;
import org.terasology.logic.manager.ShaderManager;
import org.terasology.logic.world.WorldProvider;
import org.terasology.rendering.assets.Texture;
import org.terasology.rendering.primitives.Mesh;
import org.terasology.rendering.primitives.Tessellator;
import org.terasology.rendering.primitives.TessellatorHelper;
import org.terasology.rendering.world.WorldRenderer;
import javax.vecmath.Vector2f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector4f;
import static org.lwjgl.opengl.GL11.*;
/**
* @author Immortius <immortius@gmail.com>
*/
@RegisterComponentSystem(headedOnly = true)
public class BlockDamageRenderer implements RenderSystem {
private EntityManager entityManager;
private WorldProvider worldProvider;
private Mesh overlayMesh;
private Texture effectsTexture;
@Override
public void initialise() {
this.entityManager = CoreRegistry.get(EntityManager.class);
this.worldProvider = CoreRegistry.get(WorldProvider.class);
this.effectsTexture = AssetManager.loadTexture("engine:effects");
Vector2f texPos = new Vector2f(0.0f, 0.0f);
Vector2f texWidth = new Vector2f(0.0624f, 0.0624f);
Tessellator tessellator = new Tessellator();
TessellatorHelper.addBlockMesh(tessellator, new Vector4f(1, 1, 1, 1), texPos, texWidth, 1.001f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f);
overlayMesh = tessellator.generateMesh();
}
@Override
public void shutdown() {
}
@Override
public void renderOverlay() {
if (effectsTexture == null) return;
ShaderManager.getInstance().enableDefaultTextured();
glBindTexture(GL11.GL_TEXTURE_2D, effectsTexture.getId());
glEnable(GL11.GL_BLEND);
glBlendFunc(GL_DST_COLOR, GL_ZERO);
Vector3d cameraPosition = CoreRegistry.get(WorldRenderer.class).getActiveCamera().getPosition();
for (EntityRef entity : entityManager.iteratorEntities(HealthComponent.class, BlockComponent.class)) {
HealthComponent health = entity.getComponent(HealthComponent.class);
if (health.currentHealth == health.maxHealth) continue;
BlockComponent blockComp = entity.getComponent(BlockComponent.class);
if (!worldProvider.isBlockActive(blockComp.getPosition())) continue;
glPushMatrix();
glTranslated(blockComp.getPosition().x - cameraPosition.x, blockComp.getPosition().y - cameraPosition.y, blockComp.getPosition().z - cameraPosition.z);
float offset = java.lang.Math.round((1.0f - (float) health.currentHealth / health.maxHealth) * 10.0f) * 0.0625f;
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glTranslatef(offset, 0f, 0f);
glMatrixMode(GL_MODELVIEW);
overlayMesh.render();
glPopMatrix();
glMatrixMode(GL_TEXTURE);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
glDisable(GL11.GL_BLEND);
}
@Override
public void renderFirstPerson() {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void renderOpaque() {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void renderTransparent() {
//To change body of implemented methods use File | Settings | File Templates.
}
}