Rendu avec la classe Tesselator et ISBRH
-
Bonjour, depuis quelques jours j’essaies de faire le rendu d’un de mes blocks (un panneau solaire), et j’aimerai pouvoir afficher dans le rendu dans le monde les panneaux photovoltaïques ajoutés depuis le GUI donc : j’aimerai pouvoir afficher des textures d’item en fonction du contenu de la tile entity. C’est donc pour cela que j’ai choisis d’utiliser le Tesselator plutôt que de faire le model sur Techne (aussi parce que Techne est bugué), malheureusement j’ai quelques problèmes :
- le rendu dans la mains est mal placé : http://puu.sh/l0RVg.jpg
- le block apparaît plus sombre dans ma barre d’inventaire lorsque j’ai un item en main (mais il est rendu correctement quand j’ouvre mon inventaire)
- le rendu ne change pas beaucoup selon la luminosité
- parfois le block disparaît ou est à moitié transparent sur le sol
Voici l’ISBRH :
package fr.scarex.csp.client.render.block; import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import fr.scarex.csp.CSP; import fr.scarex.csp.block.AbstractBlock; import fr.scarex.csp.block.CSPBlocks; import fr.scarex.csp.block.SolarPanelFrame; import fr.scarex.csp.client.ClientProxy; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; public class ISBRHSolarPanelFrame implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { Tessellator.instance.startDrawingQuads(); if (block.getClass() == SolarPanelFrame.class) renderSolarPanel(renderer, 0, 0, 0, (SolarPanelFrame) block); Tessellator.instance.draw(); } @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { if (block.getClass() == SolarPanelFrame.class) return renderSolarPanel(renderer, x, y, z, (SolarPanelFrame) block); return false; } @Override public boolean shouldRender3DInInventory(int modelId) { return true; } @Override public int getRenderId() { return ClientProxy.renderId; } public static boolean renderSolarPanel(RenderBlocks renderer, float x, float y, float z, SolarPanelFrame block) { Tessellator t = Tessellator.instance; t.addTranslation(x, y, z); t.setColorRGBA(0, 30, 180, 255); // la couleur bleu renderCube(t, 0, 0, 0, 1, 0.2, 1); // la base double middleWidth = 0.2; // la taille de la barre au milieu renderCube(t, 0.5 - (middleWidth / 2), 0.2, 0.5 - (middleWidth / 2), 0.5 + (middleWidth / 2), 0.8, 0.5 + (middleWidth / 2)); // le rendu de la barre renderCube(t, 0, 0.8, 0, 1, 0.95, 1); // le dessus t.setColorRGBA(0, 0, 0, 255); // en noir double frameWidth = 0.07; // la taille du cadre renderCube(t, 0, 0.95, 0, frameWidth, 1, 1); // rendus du cadre renderCube(t, 0, 0.95, 0, 1, 1, frameWidth); renderCube(t, 0, 0.95, 1 - frameWidth, 1, 1, 1); renderCube(t, 1 - frameWidth, 0.95, 0, 1, 1, 1); double middleFrameWidth = 0.2 - 2 * frameWidth; // taille de la barre du milieu renderCube(t, 0.5 - (middleFrameWidth / 2), 0.95, 0, 0.5 + (middleFrameWidth / 2), 1, 1); // rendus des barres du milieu renderCube(t, 0, 0.95, 0.5 - (middleFrameWidth / 2), 1, 1, 0.5 + (middleFrameWidth / 2)); t.addTranslation(-x, -y, -z); return true; } public static void renderCube(Tessellator t, double x, double y, double z, double x1, double y1, double z1) { t.addVertex(x1, y, z); t.addVertex(x1, y, z1); t.addVertex(x, y, z1); t.addVertex(x, y, z); t.addVertex(x, y, z1); t.addVertex(x, y1, z1); t.addVertex(x, y1, z); t.addVertex(x, y, z); t.addVertex(x, y1, z1); t.addVertex(x, y, z1); t.addVertex(x1, y, z1); t.addVertex(x1, y1, z1); t.addVertex(x1, y1, z1); t.addVertex(x1, y, z1); t.addVertex(x1, y, z); t.addVertex(x1, y1, z); t.addVertex(x1, y1, z); t.addVertex(x1, y, z); t.addVertex(x, y, z); t.addVertex(x, y1, z); t.addVertex(x, y1, z); t.addVertex(x, y1, z1); t.addVertex(x1, y1, z1); t.addVertex(x1, y1, z); } }
Merci d’avance.
-
if (block.getClass() == SolarPanelFrame.class) renderSolarPanel(renderer, 0, 0, 0, (SolarPanelFrame) block);
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
if (block.getClass() == SolarPanelFrame.class) renderSolarPanel(renderer, 0.5F, 0.5F, 0.5F, (SolarPanelFrame) block);
ça devrait mettre le rendu dans l’inventaire au bon endroit. Par contre pour le reste je ne sais pas -
J’ai réussi à améliorer quelques trucs mais j’ai des bugs de couleur : le bleu clignote
-
Avant ton rendu, désactives les textures:
GL11.glDisable(GL11.GL_TEXTURE_2D)
Et après l’appel de draw() du Tessellator, réactives les:
GL11.glEnable(GL11.GL_TEXTURE_2D)
-
Toujours pareil dans le rendu dans le monde
-
J’ai pu régler quelques problèmes : je fais le rendu du block via ISBRH et le rendu des items via TESR car le block clignote en TESR uniquement et on ne peut pas faire le rendu d’Items avec l’ISBRH.
En revanche, j’ai remarqué que le block n’étais pas du tout rendu selon l’emplacement et que le rendu dans le monde était plus sombre lorsqu’il y avait un block avec un rendu spécial (type ISBRH) posé à côté.
PS : toujours le même problème dans le rendu de l’inventaire, le block est plus sombre si je tient un item en main et le rendu disparaît si certains blocks sont affichés