fabric-renderer-api-v1-7.2.3+9be2a36e6f.jar

Download file
    package net.fabricmc.fabric.api.renderer.v1.model;

import java.util.EnumMap;
import java.util.Map;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform;
import net.minecraft.class_1058;
import net.minecraft.class_1086;
import net.minecraft.class_2350;
import net.minecraft.class_3665;
import net.minecraft.class_4590;
import net.minecraft.class_4609;
import net.minecraft.class_7837;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
import org.joml.Vector3f;
import org.joml.Vector4f;

@Environment(EnvType.CLIENT)
public final class ModelBakeSettingsHelper {
   private static final class_2350[] DIRECTIONS = class_2350.values();

   private ModelBakeSettingsHelper() {
   }

   public static class_3665 of(final class_4590 transformation, boolean uvLock) {
      Matrix4fc matrix = transformation.method_22936();
      if (class_7837.method_65174(matrix)) {
         return class_1086.field_5350;
      } else if (!uvLock) {
         return new class_3665() {
            public class_4590 method_3509() {
               return transformation;
            }
         };
      } else {
         final Map<class_2350, Matrix4fc> faceTransformations = new EnumMap(class_2350.class);
         final Map<class_2350, Matrix4fc> inverseFaceTransformations = new EnumMap(class_2350.class);

         for(class_2350 face : DIRECTIONS) {
            Matrix4fc faceTransformation = class_4609.method_68069(transformation, face).method_22936();
            faceTransformations.put(face, faceTransformation);
            inverseFaceTransformations.put(face, faceTransformation.invert(new Matrix4f()));
         }

         return new class_3665() {
            public class_4590 method_3509() {
               return transformation;
            }

            public Matrix4fc method_68011(class_2350 face) {
               return (Matrix4fc)faceTransformations.get(face);
            }

            public Matrix4fc method_68012(class_2350 face) {
               return (Matrix4fc)inverseFaceTransformations.get(face);
            }
         };
      }
   }

   public static class_3665 multiply(class_3665 left, class_3665 right) {
      if (class_7837.method_65174(left.method_3509().method_22936())) {
         return right;
      } else if (class_7837.method_65174(right.method_3509().method_22936())) {
         return left;
      } else {
         final class_4590 transformation = left.method_3509().method_22933(right.method_3509());
         boolean leftHasFaceTransformations = false;
         boolean rightHasFaceTransformations = false;

         for(class_2350 face : DIRECTIONS) {
            if (!leftHasFaceTransformations && !class_7837.method_65174(left.method_68011(face))) {
               leftHasFaceTransformations = true;
            }

            if (!rightHasFaceTransformations && !class_7837.method_65174(right.method_68011(face))) {
               rightHasFaceTransformations = true;
            }
         }

         if (!(leftHasFaceTransformations & rightHasFaceTransformations)) {
            final class_3665 faceTransformDelegate = leftHasFaceTransformations ? left : right;
            return new class_3665() {
               public class_4590 method_3509() {
                  return transformation;
               }

               public Matrix4fc method_68011(class_2350 face) {
                  return faceTransformDelegate.method_68011(face);
               }

               public Matrix4fc method_68012(class_2350 face) {
                  return faceTransformDelegate.method_68012(face);
               }
            };
         } else {
            final Map<class_2350, Matrix4fc> faceTransformations = new EnumMap(class_2350.class);
            final Map<class_2350, Matrix4fc> inverseFaceTransformations = new EnumMap(class_2350.class);

            for(class_2350 face : DIRECTIONS) {
               faceTransformations.put(face, left.method_68011(face).mul(right.method_68011(face), new Matrix4f()));
               inverseFaceTransformations.put(face, right.method_68012(face).mul(left.method_68012(face), new Matrix4f()));
            }

            return new class_3665() {
               public class_4590 method_3509() {
                  return transformation;
               }

               public Matrix4fc method_68011(class_2350 face) {
                  return (Matrix4fc)faceTransformations.get(face);
               }

               public Matrix4fc method_68012(class_2350 face) {
                  return (Matrix4fc)inverseFaceTransformations.get(face);
               }
            };
         }
      }
   }

   public static QuadTransform asQuadTransform(class_3665 settings, SpriteFinder spriteFinder) {
      Matrix4fc matrix = settings.method_3509().method_22936();
      if (class_7837.method_65174(matrix)) {
         return (q) -> true;
      } else {
         Matrix3f normalMatrix = matrix.normal(new Matrix3f());
         Vector4f vec4 = new Vector4f();
         Vector3f vec3 = new Vector3f();
         return (quad) -> {
            class_2350 lightFace = quad.lightFace();
            Matrix4fc reverseMatrix = settings.method_68012(lightFace);
            if (!class_7837.method_65174(reverseMatrix)) {
               class_1058 sprite = spriteFinder.find(quad);

               for(int vertexIndex = 0; vertexIndex < 4; ++vertexIndex) {
                  float frameU = sprite.method_35804(quad.u(vertexIndex));
                  float frameV = sprite.method_35805(quad.v(vertexIndex));
                  vec3.set(frameU - 0.5F, frameV - 0.5F, 0.0F);
                  reverseMatrix.transformPosition(vec3);
                  frameU = vec3.x + 0.5F;
                  frameV = vec3.y + 0.5F;
                  quad.uv(vertexIndex, sprite.method_4580(frameU), sprite.method_4570(frameV));
               }
            }

            for(int vertexIndex = 0; vertexIndex < 4; ++vertexIndex) {
               vec4.set(quad.x(vertexIndex) - 0.5F, quad.y(vertexIndex) - 0.5F, quad.z(vertexIndex) - 0.5F, 1.0F);
               vec4.mul(matrix);
               quad.pos(vertexIndex, vec4.x + 0.5F, vec4.y + 0.5F, vec4.z + 0.5F);
               if (quad.hasNormal(vertexIndex)) {
                  quad.copyNormal(vertexIndex, vec3);
                  vec3.mul(normalMatrix);
                  vec3.normalize();
                  quad.normal(vertexIndex, vec3);
               }
            }

            class_2350 cullFace = quad.cullFace();
            if (cullFace != null) {
               quad.cullFace(class_2350.method_23225(matrix, cullFace));
            }

            return true;
         };
      }
   }
}
    
Download file