var glslGsplatCopyToWorkBufferPS = `
#define GSPLAT_CENTER_NOPROJ
#include "gsplatStructsVS"
#include "gsplatCenterVS"
#include "gsplatEvalSHVS"
#include "gsplatQuatToMat3VS"
#include "gsplatSourceFormatVS"
uniform mat4 uTransform;
uniform int uStartLine;
uniform int uViewportWidth;
#ifdef GSPLAT_LOD
	uniform usampler2D uIntervalsTexture;
#endif
#ifdef GSPLAT_COLORIZE
	uniform vec3 uLodColor;
#endif
uniform int uActiveSplats;
void main(void) {
	ivec2 localFragCoords = ivec2(int(gl_FragCoord.x), int(gl_FragCoord.y) - uStartLine);
	int targetIndex = localFragCoords.y * uViewportWidth + localFragCoords.x;
	if (targetIndex >= uActiveSplats) {
		pcFragColor0 = vec4(0.0);
		pcFragColor1 = vec4(0.0);
		pcFragColor2 = vec4(0.0);
		pcFragColor3 = vec4(0.0);
	} else {
		#ifdef GSPLAT_LOD
			int intervalsSize = int(textureSize(uIntervalsTexture, 0).x);
			ivec2 intervalUV = ivec2(targetIndex % intervalsSize, targetIndex / intervalsSize);
			uint originalIndex = texelFetch(uIntervalsTexture, intervalUV, 0).r;
		#else
			uint originalIndex = uint(targetIndex);
		#endif
		
		#if defined(GSPLAT_SOGS_DATA) || defined(GSPLAT_COMPRESSED_DATA)
			uint srcSize = uint(textureSize(packedTexture, 0).x);
		#else
			uint srcSize = uint(textureSize(splatColor, 0).x);
		#endif
		
		SplatSource source;
		source.id = uint(originalIndex);
		source.uv = ivec2(source.id % srcSize, source.id / srcSize);
		vec3 modelCenter = readCenter(source);
		modelCenter = (uTransform * vec4(modelCenter, 1.0)).xyz;
		SplatCenter center;
		initCenter(modelCenter, center);
		vec3 covA, covB;
		readCovariance(source, covA, covB);
		mat3 C = mat3(
			covA.x, covA.y, covA.z,
			covA.y, covB.x, covB.y,
			covA.z, covB.y, covB.z
		);
		mat3 linear = mat3(uTransform);
		mat3 Ct = linear * C * transpose(linear);
		covA = Ct[0];
		covB = vec3(Ct[1][1], Ct[1][2], Ct[2][2]);
		vec4 color = readColor(source);
		#if SH_BANDS > 0
			vec3 dir = normalize(center.view * mat3(center.modelView));
			vec3 sh[SH_COEFFS];
			float scale;
			readSHData(source, sh, scale);
			color.xyz += evalSH(sh, dir) * scale;
		#endif
		#ifdef GSPLAT_COLORIZE
			color.xyz *= uLodColor;
		#endif
		pcFragColor0 = color;
		pcFragColor1 = vec4(modelCenter, 1.0);
		pcFragColor2 = vec4(covA, 1.0);
		pcFragColor3 = vec4(covB, 1.0);
	}
}
`;

export { glslGsplatCopyToWorkBufferPS as default };
