/*
 * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight)
 * by the Epic Fight Team, licensed under GPLv3.
 * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
 */

package com.tiedup.remake.rig.render.compute;

import com.mojang.blaze3d.vertex.PoseStack;

import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import com.tiedup.remake.rig.mesh.Mesh;
import com.tiedup.remake.rig.armature.Armature;
import com.tiedup.remake.rig.math.OpenMatrix4f;
import com.tiedup.remake.rig.TiedUpRigConstants;

/**
 * RIG stub. Upstream EF : ComputeShaderSetup = binding OpenGL 4.3+ compute
 * shader pour le GPU skinning. Non utilisé en TiedUp Phase 0 (CPU skinning
 * via VertexConsumer suffit). Classe vide, référencée par SkinnedMesh pour
 * le chemin GPU optionnel.
 *
 * <p>Réactivation future (hors scope V1) : réintroduire l'implémentation
 * complète EF + gérer IrisComputeShaderSetup pour compat shader packs.</p>
 */
public abstract class ComputeShaderSetup {

	/** Pool de matrices réutilisées par SkinnedMesh pour le CPU skinning. */
	public static final OpenMatrix4f[] TOTAL_POSES = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS];
	public static final OpenMatrix4f[] TOTAL_NORMALS = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS];

	static {
		for (int i = 0; i < TiedUpRigConstants.MAX_JOINTS; i++) {
			TOTAL_POSES[i] = new OpenMatrix4f();
			TOTAL_NORMALS[i] = new OpenMatrix4f();
		}
	}

	/**
	 * Stub inner class — utilisé par {@code SkinnedMesh.SkinnedMeshPart.partVBO}.
	 * Le CPU path ne crée jamais d'instance, ne pointe que le type.
	 */
	public static class MeshPartBuffer {
		public void destroyBuffers() {}
	}

	/** Libération des buffers VBO (GPU path). No-op sur le stub. */
	public void destroyBuffers() {}

	/** No-op stub : le chemin GPU compute n'est jamais emprunté. */
	public void drawWithShader(
			Object mesh,
			PoseStack poseStack,
			MultiBufferSource bufferSources,
			RenderType renderType,
			int packedLight,
			float r, float g, float b, float a,
			int overlay,
			Armature armature,
			OpenMatrix4f[] poses) {
		// no-op — le renderer bascule sur le CPU path si ComputeShaderSetup
		// est null sur le mesh. Cette implémentation ne devrait jamais être
		// appelée (SkinnedMesh.computerShaderSetup = null par défaut).
	}
}
