10000 Draw lines with no geometry shader by einarf · Pull Request #2714 · pythonarcade/arcade · GitHub
[go: up one dir, main page]

Skip to content

Draw lines with no geometry shader #2714

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Draw lines with no geometry shader
  • Loading branch information
einarf committed Jun 7, 2025
commit fc9880598ac9fad4be18a0888bd88fbf234a1561
33 changes: 25 additions & 8 deletions arcade/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ def __init__(
self.shape_line_program: Program = self.load_program(
vertex_shader=":system:shaders/shapes/line/unbuffered_vs.glsl",
fragment_shader=":system:shaders/shapes/line/unbuffered_fs.glsl",
geometry_shader=":system:shaders/shapes/line/unbuffered_geo.glsl",
)
self.shape_ellipse_filled_unbuffered_program: Program = self.load_program(
vertex_shader=":system:shaders/shapes/ellipse/filled_unbuffered_vs.glsl",
Expand Down Expand Up @@ -230,16 +229,34 @@ def __init__(
]
)
# Shape line(s)
# Reserve space for 1000 lines (2f pos, 4f color)
# TODO: Different version for buffered and unbuffered
# TODO: Make round-robin buffers
self.shape_line_buffer_pos = self.buffer(reserve=8 * 10)
# self.shape_line_buffer_color = self.buffer(reserve=4 * 10)
self.shape_line_geometry = self.geometry(
[
BufferDescription(self.shape_line_buffer_pos, "2f", ["in_vert"]),
# BufferDescription(self.shape_line_buffer_color, '4f1', ['in_color'])
]
# Instanced quad (triangle strip)
BufferDescription(
self.buffer(
data=array(
"f",
[
0.0, # 4 dummy vertices
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
],
)
),
"2f",
["in_vert"],
),
BufferDescription(
self.shape_line_buffer_pos, "4f", ["in_instance_pos"], instanced=True
),
],
mode=self.TRIANGLE_STRIP,
)
# ellipse/circle filled
self.shape_ellipse_unbuffered_buffer = self.buffer(reserve=8)
Expand Down
4 changes: 2 additions & 2 deletions arcade/draw/line.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def draw_line(
line_pos_buffer.write(data=array.array("f", (start_x, start_y, end_x, end_y)))

ctx.enable(ctx.BLEND)
geometry.render(program, mode=gl.LINES, vertices=2)
geometry.render(program, instances=1)
ctx.disable(ctx.BLEND)


Expand Down Expand Up @@ -127,6 +127,6 @@ def draw_lines(point_list: Point2List, color: RGBOrA255, line_width: float = 1)
program["color"] = color_normalized
line_buffer_pos.write(data=line_pos_array)

geometry.render(program, mode=gl.LINES, vertices=num_points)
geometry.render(program, instances=num_points // 2)

ctx.disable(ctx.BLEND)
37 changes: 0 additions & 37 deletions arcade/resources/system/shaders/shapes/line/unbuffered_geo.glsl

This file was deleted.

26 changes: 25 additions & 1 deletion arcade/resources/system/shaders/shapes/line/unbuffered_vs.glsl
Original file line number Diff line number Diff line change
@@ -1,7 +1,31 @@
#version 330

uniform WindowBlock {
mat4 projection;
mat4 view;
} window;

uniform float line_width;

in vec2 in_vert;
in vec4 in_instance_pos;

vec2 lineNormal2D(vec2 start, vec2 end) {
vec2 n = end - start;
return normalize(vec2(-n.y, n.x));
}

void main() {
gl_Position = vec4(in_vert, 0.0, 1.0);
vec2 line_start = in_instance_pos.xy;
vec2 line_end = in_instance_pos.zw;

vec2 normal = lineNormal2D(line_start, line_end) * line_width / 2.0;
mat4 mvp = window.projection * window.view;
vec2 positions[4] = vec2[4](
line_start + normal,
line_start - normal,
line_end + normal,
line_end - normal
);
gl_Position = mvp * vec4(positions[gl_VertexID % 4], 0.0, 1.0);
}
Loading
0