blob: 32c0d23533b332ae70fd8004415576bb85c43ebb [file] [log] [blame] [edit]
/*
* Copyright 2025 Rive
*/
#ifdef @VERTEX
ATTR_BLOCK_BEGIN(Attrs)
// [localVertexID, outset, fillCoverage, vertexType]
ATTR(0, float4, @a_patchVertexData);
ATTR(1, float4, @a_mirroredVertexData);
ATTR_BLOCK_END
#endif
VARYING_BLOCK_BEGIN
NO_PERSPECTIVE VARYING(0, float4, v_coverages);
VARYING_BLOCK_END
#ifdef @VERTEX
VERTEX_MAIN(@atlasVertexMain, Attrs, attrs, _vertexID, _instanceID)
{
ATTR_UNPACK(_vertexID, attrs, @a_patchVertexData, float4);
ATTR_UNPACK(_vertexID, attrs, @a_mirroredVertexData, float4);
VARYING_INIT(v_coverages, float4);
float4 pos;
uint pathID;
float2 vertexPosition;
if (unpack_tessellated_path_vertex(@a_patchVertexData,
@a_mirroredVertexData,
_instanceID,
pathID,
vertexPosition,
v_coverages VERTEX_CONTEXT_UNPACK))
{
// Offset from on-screen coordinates to atlas coordinates.
uint4 pathData2 = STORAGE_BUFFER_LOAD4(@pathBuffer, pathID * 4u + 2u);
float3 atlasTransform = uintBitsToFloat(pathData2.yzw);
vertexPosition = vertexPosition * atlasTransform.x + atlasTransform.yz;
pos = pixel_coord_to_clip_coord(vertexPosition,
uniforms.atlasContentInverseViewport.x,
uniforms.atlasContentInverseViewport.y);
}
else
{
pos = float4(uniforms.vertexDiscardValue,
uniforms.vertexDiscardValue,
uniforms.vertexDiscardValue,
uniforms.vertexDiscardValue);
}
VARYING_PACK(v_coverages);
EMIT_VERTEX(pos);
}
#endif // @VERTEX
#ifdef @FRAGMENT
#ifdef @ATLAS_FEATHERED_FILL
FRAG_DATA_MAIN(float, @atlasFillFragmentMain)
{
VARYING_UNPACK(v_coverages, float4);
EMIT_FRAG_DATA(eval_feathered_fill(v_coverages TEXTURE_CONTEXT_FORWARD));
}
#endif // @ATLAS_FEATHERED_FILL
#ifdef @ATLAS_FEATHERED_STROKE
FRAG_DATA_MAIN(float, @atlasStrokeFragmentMain)
{
VARYING_UNPACK(v_coverages, float4);
EMIT_FRAG_DATA(eval_feathered_stroke(v_coverages TEXTURE_CONTEXT_FORWARD));
}
#endif // @ATLAS_FEATHERED_STROKE
#endif // FRAGMENT