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.


  • Administrateurs

    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


  • Modérateurs

    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