blob: 7d274ade499489400e0ba0c7537601f146272e3c [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <impeller/texture.glsl>
#include <impeller/types.glsl>
// Unused, see See PointFieldGeometry::GetPositionBuffer
layout(local_size_x = 16) in;
layout(std430) readonly buffer PointData {
// Size of this input data is frame_info.count;
vec2 points[];
}
point_data;
layout(std430) writeonly buffer GeometryData {
// Size of this output data is frame_info.count * points_per_circle;
vec2 geometry[];
}
geometry_data;
uniform FrameInfo {
uint count;
float16_t radius;
float16_t radian_start;
float16_t radian_step;
uint points_per_circle;
int divisions_per_circle;
}
frame_info;
void main() {
uint ident = gl_GlobalInvocationID.x;
if (ident >= frame_info.count) {
return;
}
vec2 center = point_data.points[ident];
uint bufer_offset = ident * frame_info.points_per_circle;
float16_t elapsed_angle = frame_info.radian_start;
vec2 origin =
center + vec2(cos(elapsed_angle), sin(elapsed_angle)) * frame_info.radius;
geometry_data.geometry[bufer_offset++] = origin;
elapsed_angle += frame_info.radian_step;
vec2 pt1 =
center + vec2(cos(elapsed_angle), sin(elapsed_angle)) * frame_info.radius;
geometry_data.geometry[bufer_offset++] = pt1;
elapsed_angle += frame_info.radian_step;
vec2 pt2 =
center + vec2(cos(elapsed_angle), sin(elapsed_angle)) * frame_info.radius;
geometry_data.geometry[bufer_offset++] = pt2;
for (int i = 0; i < frame_info.divisions_per_circle - 3; i++) {
geometry_data.geometry[bufer_offset++] = origin;
geometry_data.geometry[bufer_offset++] = pt2;
elapsed_angle += frame_info.radian_step;
pt2 = center +
vec2(cos(elapsed_angle), sin(elapsed_angle)) * frame_info.radius;
geometry_data.geometry[bufer_offset++] = pt2;
}
}