package net.vulkanmod.vulkan.shader;

import com.mojang.blaze3d.systems.RenderSystem;
import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;
import java.util.function.Supplier;
import net.vulkanmod.vulkan.VRenderSystem;
import net.vulkanmod.vulkan.util.MappedBuffer;

public class Uniforms {
   public static Object2ReferenceOpenHashMap<String, Supplier<Integer>> vec1i_uniformMap = new Object2ReferenceOpenHashMap();
   public static Object2ReferenceOpenHashMap<String, Supplier<Float>> vec1f_uniformMap = new Object2ReferenceOpenHashMap();
   public static Object2ReferenceOpenHashMap<String, Supplier<MappedBuffer>> vec2f_uniformMap = new Object2ReferenceOpenHashMap();
   public static Object2ReferenceOpenHashMap<String, Supplier<MappedBuffer>> vec3f_uniformMap = new Object2ReferenceOpenHashMap();
   public static Object2ReferenceOpenHashMap<String, Supplier<MappedBuffer>> vec4f_uniformMap = new Object2ReferenceOpenHashMap();
   public static Object2ReferenceOpenHashMap<String, Supplier<MappedBuffer>> mat4f_uniformMap = new Object2ReferenceOpenHashMap();

   public static void setupDefaultUniforms() {
      mat4f_uniformMap.put("ModelViewMat", VRenderSystem::getModelViewMatrix);
      mat4f_uniformMap.put("ProjMat", VRenderSystem::getProjectionMatrix);
      mat4f_uniformMap.put("MVP", VRenderSystem::getMVP);
      mat4f_uniformMap.put("TextureMat", VRenderSystem::getTextureMatrix);
      mat4f_uniformMap.put("LightSpaceMat", VRenderSystem::getLightSpaceMatrix);
      mat4f_uniformMap.put("LightSpaceViewMat", VRenderSystem::getLightSpaceViewMatrix);
      mat4f_uniformMap.put("InvProjMat", VRenderSystem::getInverseProjectionMatrix);
      vec1i_uniformMap.put("EndPortalLayers", (Supplier)() -> 15);
      vec1f_uniformMap.put("FogStart", (Supplier)() -> VRenderSystem.getFogData().field_60583);
      vec1f_uniformMap.put("FogEnd", (Supplier)() -> VRenderSystem.getFogData().field_60585);
      vec1f_uniformMap.put("FogEnvironmentalStart", (Supplier)() -> VRenderSystem.getFogData().field_60582);
      vec1f_uniformMap.put("FogEnvironmentalEnd", (Supplier)() -> VRenderSystem.getFogData().field_60584);
      vec1f_uniformMap.put("FogRenderDistanceStart", (Supplier)() -> VRenderSystem.getFogData().field_60583);
      vec1f_uniformMap.put("FogRenderDistanceEnd", (Supplier)() -> VRenderSystem.getFogData().field_60585);
      vec1f_uniformMap.put("FogSkyEnd", (Supplier)() -> VRenderSystem.getFogData().field_60099);
      vec1f_uniformMap.put("FogCloudsEnd", (Supplier)() -> VRenderSystem.getFogData().field_60100);
      vec1f_uniformMap.put("LineWidth", RenderSystem::getShaderLineWidth);
      vec1f_uniformMap.put("AlphaCutout", (Supplier)() -> VRenderSystem.alphaCutout);
      vec1f_uniformMap.put("Time", VRenderSystem::getTime);
      vec2f_uniformMap.put("ScreenSize", VRenderSystem::getScreenSize);
      vec3f_uniformMap.put("ModelOffset", (Supplier)() -> VRenderSystem.modelOffset);
      vec3f_uniformMap.put("ChunkOffset", (Supplier)() -> VRenderSystem.modelOffset);
      vec3f_uniformMap.put("CamPos", VRenderSystem::getCameraWorldPos);
      vec4f_uniformMap.put("ColorModulator", VRenderSystem::getShaderColor);
      vec4f_uniformMap.put("FogColor", VRenderSystem::getShaderFogColor);
      vec4f_uniformMap.put("Light0_Direction", (Supplier)() -> VRenderSystem.lightDirection0);
      vec4f_uniformMap.put("Light1_Direction", (Supplier)() -> VRenderSystem.lightDirection1);
   }

   public static Supplier<MappedBuffer> getUniformSupplier(String type, String name) {
      Supplier var10000;
      switch (type) {
         case "mat4" -> var10000 = (Supplier)mat4f_uniformMap.get(name);
         case "vec4" -> var10000 = (Supplier)vec4f_uniformMap.get(name);
         case "vec3" -> var10000 = (Supplier)vec3f_uniformMap.get(name);
         case "vec2" -> var10000 = (Supplier)vec2f_uniformMap.get(name);
         default -> var10000 = null;
      }

      return var10000;
   }
}
