MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Incompréhension du système de rendu

    Planifier Épinglé Verrouillé Déplacé Résolu 1.15.x
    1.15.2
    3 Messages 2 Publieurs 363 Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Z Hors-ligne
      Zeide
      dernière édition par

      Bonjour,
      J’ai tenté de passer mon TileEntityRenderer de Forge 1.12.2 a Forge 1.15.2. J’ai donc tout adapté (et presque tout transformé) Mais je suis dans l’incompréhension du nouveau système.
      Objectivement, je tente de faire le rendu du liquide contenu dans une TileEntity.
      J’ai crée mon propre RenderType :

      public static RenderType getPedestalRenderType(ResourceLocation resourceLocation) {
              RenderType.State state = RenderType.State.getBuilder()
                      .texture(new TextureState(resourceLocation, true, false))
                      .cull(CULL_DISABLED)
                      .lightmap(LIGHTMAP_DISABLED)
                      .transparency(TRANSLUCENT_TRANSPARENCY)
                      .build(true);
      
              return RenderType.makeType(SkillsStones.MOD_ID + ":pedestal_fluid", DefaultVertexFormats.POSITION_COLOR_TEX, GL11.GL_QUADS, 256, true, false, state);
      }
      

      Et voila comment je fais le rendu :

      private static final float MIN_HEIGHT = 0.5625f;
          private static final float MAX_HEIGHT = 0.78125f;
      
          @Override
          public void render(TileEntityNaturalTotemPedestal tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) {
              Minecraft.getInstance().getProfiler().startSection("pedestalFluidRenderer");
      
              float level = ((float) tileEntityIn.getFluidTank().getFluidAmount()) / (float) tileEntityIn.getFluidTank().getCapacity();
              if(!(level > 0)) return;
      
              Fluid fluid = tileEntityIn.getFluidTank().getFluid().getFluid();
      
              ResourceLocation resourceLocation;
              int color;
              if(fluid.getAttributes().getStillTexture() != null) {
                  resourceLocation = fluid.getAttributes().getStillTexture();
                  color = getFluidColor(tileEntityIn.getWorld(), tileEntityIn.getPos(), fluid);
              } else if(fluid.getAttributes().getFlowingTexture() != null) {  // In case that Still Texture don't exist
                  resourceLocation = fluid.getAttributes().getFlowingTexture();
                  color = getFluidColor(tileEntityIn.getWorld(), tileEntityIn.getPos(), fluid);
              } else { // In case that no texture exist
                  resourceLocation = Fluids.WATER.getAttributes().getStillTexture();
                  color = getFluidColor(tileEntityIn.getWorld(), tileEntityIn.getPos(), Fluids.WATER);
              }
      
              TextureAtlasSprite textureAtlasSprite = Minecraft.getInstance().getAtlasSpriteGetter(PlayerContainer.LOCATION_BLOCKS_TEXTURE).apply(resourceLocation);
      
              float uMin = textureAtlasSprite.getMinU();
              float uMax = textureAtlasSprite.getMaxU();
              float vMin = textureAtlasSprite.getMinV();
              float vMax = textureAtlasSprite.getMaxV();
      
              float a = 1.0F;
              float r = (color >> 16 & 0xFF) / 255.0F;
              float g = (color >> 8 & 0xFF) / 255.0F;
              float b = (color & 0xFF) / 255.0F;
      
              Matrix4f matrix4f = matrixStackIn.getLast().getMatrix();
      
              float y = MIN_HEIGHT + (level) * (MAX_HEIGHT - MIN_HEIGHT);
      
              matrixStackIn.translate(0, y, 0);
      
              IVertexBuilder buffer = bufferIn.getBuffer(SSRenderType.getPedestalRenderType(resourceLocation));
      
              buffer.pos(matrix4f, 0, 0, 0).color(r, g, b, a).tex(uMin, vMin).endVertex();
              buffer.pos(matrix4f, 0, 0, 1).color(r, g, b, a).tex(uMin, vMax).endVertex();
              buffer.pos(matrix4f, 1, 0, 1).color(r, g, b, a).tex(uMax, vMax).endVertex();
              buffer.pos(matrix4f, 1, 0, 0).color(r, g, b, a).tex(uMax, vMin).endVertex();
      
              Minecraft.getInstance().getProfiler().endSection();
          }
      
          private static int getFluidColor(World world, BlockPos pos, Fluid fluid) {
              if(fluid.isEquivalentTo(Fluids.WATER)) {
                  return BiomeColors.getWaterColor(world, pos);
              }
      
              return fluid.getAttributes().getColor();
      }
      

      Avec ce code, la texture ne s’affiche pas et j’ai une erreur comme quoi la texture n’existe pas .

      Failed to load texture: minecraft:block/water_still
      java.io.FileNotFoundException: minecraft:block/water_still
      

      Par contre, la couleur marche.
      Néanmoins en hardcodant la texture avec la ResourceLocation suivante :

      new ResourceLocation("minecraft:textures/block/water_still.png");
      

      C’est fonctionnel mais la texture buggé (voir photo 1) (j’ai désactivé la transparence pour mieux voir)


      (De plus j’ai l’impression d’avoir un effet bizarre de smooth)

      C’est très étrange, je sais pas si je suis sur une fausse piste ou j’ai fais une erreur.
      Merci.

      Bonne journée.

      1 réponse Dernière réponse Répondre Citer 0
      • TwiguinouT Hors-ligne
        Twiguinou
        dernière édition par

        Bonjour, j’admets que depuis la refonte du système de rendu les choses sont devenues légèrement plus compliqués.
        Premièrement il n’est pas nécessaire de créer un nouveau RenderType pour faire ce type de rendu, tu peux simplement utiliser: RenderType.getSolid. Pour ce qui est des vertex ceux-ci s’adaptent en fonction du format utilisé par le RenderType, pour celui que je viens de t’énoncer il aura besoin d’une position, d’une couleur, d’un uv de texture, d’une lightmap et enfin de normals.
        Si la texture n’est pas correctement rendue c’est soit que le problème vient du sprite, soit qu’il vient de l’UV utilisé, par souci de compréhension je vais t’indiquer la marche à suivre, déjà si tu veux récupérer les sprites d’un Fluid la méthode ForgeHooksClient.getFluidSprites est très efficace et bien plus simple, tu pourras ensuite choisir lequel utiliser, ensuite ta façon de décoder la couleur et de récupérer les UV sont étranges à mon goût, voici une solution à ces deux problèmes:

        //Pour les UV
        float minU = sprite.getMinU();
        float maxU = Math.min(minU+(sprite.getMaxU()-minU)*longueur, sprite.getMaxU());
        float minV = sprite.getMinV();
        float maxV = Math.min(minV+(sprite.getMaxV()-minV)*largeur, sprite.getMaxV());
        
        //Pour les couleurs
        float r = (color >> 16 & 255) / 255.0F;
        float g = (color >> 8 & 255) / 255.0F;
        float b = (color & 255) / 255.0F;
        

        Dis moi si tu as besoin de quelques précisions en plus.

        1 réponse Dernière réponse Répondre Citer 1
        • Z Hors-ligne
          Zeide
          dernière édition par Zeide

          Bonjour,
          Je te remercie pour ces précisions, je vais essayer ça !

          EDIT :

          Ca fonctionne !

          1 réponse Dernière réponse Répondre Citer 0
          • 1 / 1
          • Premier message
            Dernier message
          Design by Woryk
          ContactMentions Légales

          MINECRAFT FORGE FRANCE © 2024

          Powered by NodeBB