Rendu de boîtes de collision



  • Bonjour,
    J'avais pour objectif d'effectuer le rendu d'une boîte de couleur différente pour chaque type d'entités. Je me suis donc servis de l'event RenderLivingEvent et des boîtes de collision des entités.
    Seul problème : ça ne fonctionne que sur les mob spawners et d'une manière très étrange… J'ai aussi des boîtes qui se balladent un peu partout dans les airs et qui disparaissent quand on s'en approche (~60 blocs de distance).
    Pouvez-vous m'aider ?

    EDIT :
    Ce que je trouve anormal, c'est que les valeurs sont tout à fait cohérentes... J'ai même testé avec les coordonnées des entités au lieu des AABB, utilisé GL11.glTrasnlated(posX, posY, posZ), mais ça donne la même chose...

    Sources :

    
    @SubscribeEvent
    public void onRenderLivingEvent(RenderLivingEvent.Pre event)
    {
         EntityLivingBase entity = event.entity;
         AxisAlignedBB bb = entity.boundingBox;
    
         GL11.glPushMatrix();
    
         if(entity instanceof EntityMob || entity instanceof EntityFlying || entity instanceof EntitySlime)
              GL11.glColor3f(1.0F, 0.0F, 0.0F);
         else if(entity instanceof EntityAgeable || entity instanceof EntityAmbientCreature || entity instanceof EntityWaterMob)
              GL11.glColor3f(0.0F, 1.0F, 0.0F);
         else if(entity instanceof EntityDragon)
              GL11.glColor3f(1.0F, 0.0F, 1.0F);
         else if(entity instanceof EntityGolem)
              GL11.glColor3f(0.0F, 0.0F, 1.0F);
         else
              GL11.glColor3f(1.0F, 1.0F, 1.0F);
    
         GL11.glEnable(GL11.GL_BLEND);
         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    
         Tessellator t = Tessellator.instance;
    
         GL11.glDisable(GL11.GL_LIGHTING);
         GL11.glDisable(GL11.GL_TEXTURE_2D);
         GL11.glDisable(GL11.GL_DEPTH_TEST);
    
         GL11.glLineWidth(6);
         GL11.glEnable(GL11.GL_LINE_SMOOTH);
         GL11.glHint( GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST );
    
         t.startDrawing(GL11.GL_LINE_STRIP);
         {
              // Floor
              t.addVertex(bb.minX, bb.minY, bb.minZ);
              t.addVertex(bb.maxX, bb.minY, bb.minZ);
              t.addVertex(bb.maxX, bb.minY, bb.minZ);
              t.addVertex(bb.maxX, bb.minY, bb.maxZ);
              t.addVertex(bb.maxX, bb.minY, bb.maxZ);
              t.addVertex(bb.minX, bb.minY, bb.maxZ);
              t.addVertex(bb.minX, bb.minY, bb.maxZ);
              t.addVertex(bb.minX, bb.minY, bb.minZ);
    
              // Top
              t.addVertex(bb.minX, bb.maxY, bb.minZ);
              t.addVertex(bb.maxX, bb.maxY, bb.minZ);
              t.addVertex(bb.maxX, bb.maxY, bb.minZ);
              t.addVertex(bb.maxX, bb.maxY, bb.maxZ);
              t.addVertex(bb.maxX, bb.maxY, bb.maxZ);
              t.addVertex(bb.minX, bb.maxY, bb.maxZ);
              t.addVertex(bb.minX, bb.maxY, bb.maxZ);
              t.addVertex(bb.minX, bb.maxY, bb.minZ);
    
              // Heights
              t.addVertex(bb.minX, bb.minY, bb.minZ);
              t.addVertex(bb.minX, bb.maxY, bb.minZ);
              t.addVertex(bb.maxX, bb.minY, bb.minZ);
              t.addVertex(bb.maxX, bb.maxY, bb.minZ);
              t.addVertex(bb.maxX, bb.minY, bb.maxZ);
              t.addVertex(bb.maxX, bb.maxY, bb.maxZ);
              t.addVertex(bb.minX, bb.minY, bb.maxZ);
              t.addVertex(bb.minX, bb.maxY, bb.maxZ);
         }
         t.draw();
    
         GL11.glEnable(GL11.GL_LIGHTING);
         GL11.glEnable(GL11.GL_TEXTURE_2D);
         GL11.glEnable(GL11.GL_DEPTH_TEST);
    
         GL11.glDisable(GL11.GL_BLEND);
         GL11.glColor3f(1.0F, 1.0F, 1.0F);
         GL11.glPopMatrix();
    }
    
    


  • Je crois que la couleur de la tesselation ne se fait pas de cette manière, regarde s'il n'y a pas une méthode dans la classe Tesselator pour ça


  • Administrateurs

    t.setColorRGBA(rouge, vert, bleu, alpha) il me semble.



  • C'est inutile, (en premier lieu), ça ne change rien à mon problème (je viens de tester).



  • Au pire tu peux utiliser de l'openGL simple


  • Modérateurs

    Il me semble qu'il faut prendre en compte le fait que les coordonnées ne sont pas à partir du point (0,0,0) mais à partir de la position de la caméra.



  • @SCAREX :
    Déjà testé.

    @jglrxavpok :
    Ah oui, j'étais pas au courant de ça x) maintenant je vais tester ^^
    Donc, en gros, la position des rendus OpenGL se fait en fonction de celle du joueur ? Ou ais-je mal compris ?
    Non parce que là, quand je bouge, le carré que j'utilise pour tester ne bouge pas, il est juste proche du rendu d'un mob spawner et sa position n'a aucun rapport avec autre chose…
    Et pourquoi dans ce cas ça fonctionne avec les mob spawners ?



  • Le rendu tesselator utilise les coordonnées de l'écran alors que l'openGL utilise son propre système de coordonnées, donc à mon avis utiliser l'openGL de base est plus simple


  • Modérateurs

    Scarex, ça dépend quand tu l'utilises, il n'utilise que le repère courrant



  • Non OpenGL, ça ne change rien, sinon c'est quoi cette histoire de repère courant ? Je pourrais essayer de me débrouiller avec ça… (Parce qu'en plus si le joueur est le centre du repère, il suffit juste de mesurer la distance et d'appliquer une translation).

    Nouveau code (OpenGL) :

    
    GL11.glBegin(GL11.GL_LINE_STRIP);
    {
        // Floor
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ);
    
        // Top
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ);
    
        // Heights
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ);
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX + delta_x, entity.posY + delta_y, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY, entity.posZ + delta_z);
        GL11.glVertex3d(entity.posX, entity.posY + delta_y, entity.posZ + delta_z);
    }
    GL11.glEnd();
    
    

    Et un petit screen au passage : 
     


  • Modérateurs

    Je suis en train de me demander si la translation pour avoir la position de l'entité ne se ferrait pas avant l'event… Il faudrait vérifier ça dans la classe qui envoie cet évent (cherche les appels au constructeur de l'event pour ça, c'est sera plus simple).

    De plus, pourrais-tu envoyer une image avec plusieurs boîtes affichées ?

    Sent from my GT-I9195I using Tapatalk



  • Des screens :
    Boîtes flottantes (quand on s'en approche, elles disparaissent) :

    Boîte fonctionnelle (c'est-à-dire que les mob spawners) :

    Pour le rendu, l'event que j'utilise actuellement est le Pre, et j'ai testé une translation sans succès. L'utile serait de connaître l'origine du repère dont tu m'as parlé avant…
    (Je vais quand même continuer à chercher en arrière-plan)