Skip to content

Commit b28537f

Browse files
committed
First working version
1 parent 2f363f5 commit b28537f

5 files changed

Lines changed: 45 additions & 47 deletions

File tree

arcade/resources/system/shaders/lib/sprite.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ vec4 getInstanceColor(sampler2D colorData, int index) {
3030
return texelFetch(colorData, ivec2(index, 0), 0);
3131
}
3232

33-
int getInstanceTextureId(isampler2D textureIdData, int index) {
34-
return texelFetch(textureIdData, ivec2(index, 0), 0).x;
33+
int getInstanceTextureId(sampler2D textureIdData, int index) {
34+
return int(texelFetch(textureIdData, ivec2(index, 0), 0).x);
3535
}
3636

3737
int getInstanceIndex(isampler2D indexData, int index) {

arcade/resources/system/shaders/sprites/sprite_list_geometry_cull_geo.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void main() {
4242
mat4 mvp = window.projection * window.view;
4343
// Do viewport culling for sprites.
4444
// We do this in normalized device coordinates to make it simple
45-
// apply projection to the center point. This is important so we get zooming/scrollig right
45+
// apply projection to the center point. This is important so we get zooming/scrolling right
4646
vec2 ct = (mvp * vec4(center.xy, 0.0, 1.0)).xy;
4747
// We can get away with cheaper calculation of size
4848
// The length of the diagonal is the cheapest estimation in case rotation is applied

arcade/resources/system/shaders/sprites/sprite_list_simple_fs.glsl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@ uniform sampler2D sprite_texture;
66
// Global color set on the sprite list
77
uniform vec4 spritelist_color;
88

9-
in vec2 uv;
10-
in vec4 color;
9+
in vec2 v_uv;
10+
in vec4 v_color;
1111

1212
out vec4 f_color;
1313

1414
void main() {
15-
vec4 base_color = texture(sprite_texture, uv);
16-
base_color *= color * spritelist_color;
15+
// vec4 base_color = v_color;
16+
vec4 base_color = texture(sprite_texture, v_uv);
17+
base_color *= v_color * spritelist_color;
1718
// Alpha test
1819
if (base_color.a == 0.0) {
1920
discard;
2021
}
21-
f_color = base_color + vec4(0.5, 0.5, 0.5, 1.0);
22+
f_color = base_color;
2223
}

arcade/resources/system/shaders/sprites/sprite_list_simple_vs.glsl

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ uniform sampler2D uv_texture;
1515
uniform sampler2D pos_data;
1616
uniform sampler2D size_data;
1717
uniform sampler2D color_data;
18-
uniform isampler2D texture_id_data;
18+
uniform sampler2D texture_id_data;
1919
uniform isampler2D index_data;
2020

2121
// How much half-pixel offset to apply to the UVs.
@@ -26,8 +26,8 @@ uniform float uv_offset_bias;
2626
in vec2 in_pos;
2727

2828
// Output to frag shader
29-
out vec2 uv;
30-
out vec4 color;
29+
out vec2 v_uv;
30+
out vec4 v_color;
3131

3232
#include :system:shaders/lib/sprite.glsl
3333

@@ -55,27 +55,8 @@ void main() {
5555
// TODO: Half pixel offset
5656

5757
int vertex_id = gl_VertexID % 4;
58-
color = color;
59-
switch (vertex_id) {
60-
case 0:
61-
// Upper left
62-
gl_Position = mvp * vec4(rot * size + center.xy, center.z, 1.0);
63-
uv = uv0;
64-
break;
65-
case 1:
66-
// lower left
67-
gl_Position = mvp * vec4(rot * size + center.xy, center.z, 1.0);
68-
uv = uv2;
69-
break;
70-
case 2:
71-
// upper right
72-
gl_Position = mvp * vec4(rot * size + center.xy, center.z, 1.0);
73-
uv = uv1;
74-
break;
75-
case 3:
76-
// lower right
77-
gl_Position = mvp * vec4(rot * size + center.xy, center.z, 1.0);
78-
uv = uv3;
79-
break;
80-
}
58+
vec2 uvs[4] = {uv0, uv2, uv1, uv3};
59+
v_color = color;
60+
gl_Position = mvp * vec4(rot * (in_pos * size) + center.xy, 0.0, 1.0);
61+
v_uv = uvs[vertex_id];
8162
}

arcade/sprite_list/sprite_list.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,11 @@ def _write_sprite_buffers_to_gpu(self) -> None:
908908
self._sprite_texture_changed,
909909
self._sprite_index_changed,
910910
)
911+
self._sprite_pos_angle_changed = False
912+
self._sprite_size_changed = False
913+
self._sprite_color_changed = False
914+
self._sprite_texture_changed = False
915+
self._sprite_index_changed = False
911916

912917
def initialize(self) -> None:
913918
"""
@@ -974,6 +979,7 @@ def _grow_sprite_buffers(self) -> None:
974979
if self._sprite_buffer_slots <= self._buf_capacity:
975980
return
976981

982+
print("Growing sprite buffers...")
977983
# Double the capacity
978984
extend_by = self._buf_capacity
979985
self._buf_capacity = self._buf_capacity * 2
@@ -1591,16 +1597,20 @@ def __init__(self, ctx: ArcadeContext, capacity: int, atlas: TextureAtlasBase) -
15911597
)
15921598
# fmt: on
15931599
self._geometry = self.ctx.geometry(
1594-
[BufferDescription(self._instance_buffer, "2f", ["in_pos"], instanced=True)],
1600+
[BufferDescription(self._instance_buffer, "2f", ["in_pos"])],
1601+
mode=self.ctx.TRIANGLE_STRIP,
15951602
)
15961603

15971604
# Texture buffers for per-sprite data. These are looked up using gl_InstanceID
15981605
self._pos_angle_texture = self.ctx.texture(size=(capacity, 1), components=4, dtype="f4")
15991606
self._size_texture = self.ctx.texture(size=(capacity, 1), components=2, dtype="f4")
16001607
self._color_texture = self.ctx.texture(size=(capacity, 1), components=4, dtype="f1")
1601-
self._texture_id_texture = self.ctx.texture(size=(capacity, 1), components=1, dtype="i4")
1608+
self._texture_id_texture = self.ctx.texture(size=(capacity, 1), components=1, dtype="f4")
16021609
self._index_texture = self.ctx.texture(size=(capacity, 1), components=1, dtype="i4")
16031610

1611+
# Debugging
1612+
self._query = self.ctx.query(primitives=True)
1613+
16041614
def write_sprite_buffers_to_gpu(
16051615
self,
16061616
# The data itself
@@ -1633,26 +1643,22 @@ def write_sprite_buffers_to_gpu(
16331643
"""
16341644
if sprite_pos_angle_changed:
16351645
self._pos_angle_texture.write(sprite_pos_angle_data)
1636-
self._sprite_pos_angle_changed = False
16371646

16381647
if sprite_size_changed:
16391648
self._size_texture.write(sprite_size_data)
1640-
self._sprite_size_changed = False
16411649

16421650
if sprite_color_changed:
16431651
self._color_texture.write(sprite_color_data)
1644-
self._sprite_color_changed = False
16451652

16461653
if sprite_texture_changed:
16471654
self._texture_id_texture.write(sprite_texture_data)
1648-
self._sprite_texture_changed = False
16491655

16501656
if sprite_index_changed:
16511657
self._index_texture.write(sprite_index_data)
1652-
self._sprite_index_changed = False
16531658

16541659
def grow_sprite_buffers(self) -> None:
16551660
"""Double the internal storage"""
1661+
print(f"Growing sprite buffers from {self._buf_capacity} to", self._buf_capacity * 2)
16561662
# Double the capacity
16571663
self._buf_capacity = self._buf_capacity * 2
16581664

@@ -1714,7 +1720,10 @@ def render(
17141720
else:
17151721
atlas_texture.filter = default_texture_filter
17161722

1717-
self.program["spritelist_color"] = color
1723+
try:
1724+
self.program["spritelist_color"] = color
1725+
except KeyError:
1726+
pass
17181727

17191728
# Control center pixel interpolation:
17201729
# 0.0 = raw interpolation using texture corners
@@ -1735,11 +1744,18 @@ def render(
17351744

17361745
if not self._geometry:
17371746
raise ValueError("Attempting to render without '_geometry' field being set.")
1738-
self._geometry.render(
1739-
self.program,
1740-
mode=self.ctx.POINTS,
1741-
instances=count,
1742-
)
1747+
1748+
# a = array("i")
1749+
# a.frombytes(self._index_texture.read())
1750+
# print("Buffer", a)
1751+
1752+
with self._query:
1753+
self._geometry.render(
1754+
self.program,
1755+
# mode=self.ctx.TRIANGLE_STRIP,
1756+
instances=count,
1757+
)
1758+
# print(f"Primitives rendered: {self._query.primitives_generated} (count: {count})")
17431759

17441760
# Leave global states to default
17451761
if blend:

0 commit comments

Comments
 (0)