Skip to content

Commit c35f846

Browse files
authored
GL example fixes (#2718)
* Fix spritelist_interaction_hijack_positions * Fix spritelist_interaction_bouncing_coins * Fix spritelist_interaction_visualize_dist_los_trans * Fix spritelist_interaction_visualize_dist_los * Fix spritelist_interaction_visualize_dist
1 parent c5d70f5 commit c35f846

6 files changed

Lines changed: 50 additions & 46 deletions

arcade/examples/gl/spritelist_interaction_bouncing_coins.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515

1616
from array import array
1717
from random import randint, uniform
18+
from typing import cast
1819

1920
import arcade
20-
from arcade.gl.types import BufferDescription
21+
from arcade.gl import BufferDescription, Buffer
2122
from arcade import hitbox
2223

2324
WINDOW_WIDTH = 1280
@@ -32,7 +33,7 @@ def __init__(self):
3233
super().__init__(WINDOW_WIDTH, WINDOW_HEIGHT, resizable=True)
3334

3435
# Generate lots of coins in random positions
35-
self.coins = arcade.SpriteList(use_spatial_hash=None)
36+
self.coins = arcade.SpriteList(use_spatial_hash=False)
3637
texture = arcade.load_texture(
3738
":resources:images/items/coinGold.png",
3839
hit_box_algorithm=hitbox.algo_bounding_box,
@@ -59,14 +60,14 @@ def __init__(self):
5960
uniform float delta_time;
6061
uniform vec2 size;
6162
62-
in vec3 in_pos;
63+
in vec4 in_pos_angle;
6364
in vec2 in_vel;
6465
65-
out vec3 out_pos;
66+
out vec4 out_pos_angle;
6667
out vec2 out_vel;
6768
6869
void main() {
69-
vec2 pos = in_pos.xy + in_vel * 100.0 * delta_time;
70+
vec2 pos = in_pos_angle.xy + in_vel * 100.0 * delta_time;
7071
vec2 vel = in_vel;
7172
if (pos.x > size.x) {
7273
pos.x = size.x;
@@ -84,7 +85,7 @@ def __init__(self):
8485
pos.y = 0.0;
8586
vel.y *= -1.0;
8687
}
87-
out_pos = vec3(pos, in_pos.z);
88+
out_pos_angle = vec4(pos, in_pos_angle.zw);
8889
out_vel = vel;
8990
}
9091
""",
@@ -103,19 +104,20 @@ def __init__(self):
103104
self.buffer_velocity_2 = self.ctx.buffer(reserve=self.buffer_velocity_1.size)
104105
# Create a buffer with the same size as the position buffer in the spritelist.
105106
# It's important that these match because we're copying that buffer into this one.
106-
self.buffer_pos_copy = self.ctx.buffer(reserve=self.coins.buffer_positions.size)
107+
self.buffer_pos_angle = cast(Buffer, self.coins.data.storage_positions_angle)
108+
self.buffer_pos_angle_copy = self.ctx.buffer(reserve=self.buffer_pos_angle.size)
107109

108110
# Geometry input: Copied positions and first velocity buffer
109111
self.geometry_1 = self.ctx.geometry(
110112
[
111-
BufferDescription(self.buffer_pos_copy, "3f", ["in_pos"]),
113+
BufferDescription(self.buffer_pos_angle_copy, "4f", ["in_pos_angle"]),
112114
BufferDescription(self.buffer_velocity_1, "2f", ["in_vel"]),
113115
]
114116
)
115117
# Geometry input: Copied positions and second velocity buffer
116118
self.geometry_2 = self.ctx.geometry(
117119
[
118-
BufferDescription(self.buffer_pos_copy, "3f", ["in_pos"]),
120+
BufferDescription(self.buffer_pos_angle_copy, "4f", ["in_pos_angle"]),
119121
BufferDescription(self.buffer_velocity_2, "2f", ["in_vel"]),
120122
]
121123
)
@@ -124,13 +126,13 @@ def on_draw(self):
124126
self.clear()
125127

126128
# Copy the position buffer. This happens on the gpu side.
127-
self.buffer_pos_copy.copy_from_buffer(self.coins.buffer_positions)
129+
self.buffer_pos_angle_copy.copy_from_buffer(self.buffer_pos_angle)
128130

129131
# Run the transform writing new positions and velocities
130132
self.geometry_1.transform(
131133
self.program,
132134
[
133-
self.coins.buffer_positions,
135+
self.buffer_pos_angle,
134136
self.buffer_velocity_2,
135137
],
136138
)

arcade/examples/gl/spritelist_interaction_hijack_positions.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99
"""
1010

1111
import math
12+
from typing import cast
13+
1214
import arcade
1315
from arcade import hitbox
16+
from arcade.sprite_list.sprite_list import SpriteListBufferData
17+
from arcade.gl import Buffer
1418

1519
NUM_COINS = 500
1620

@@ -38,23 +42,24 @@ def __init__(self):
3842
3943
// The current time to add some movement
4044
uniform float time;
41-
// The "bendyness" value accelerating rotations
45+
// The "bendiness" value accelerating rotations
4246
uniform float bend;
4347
4448
// The current size of the screen
4549
uniform vec2 size;
4650
4751
// The new positions we are writing into a new buffer
48-
out vec3 out_pos;
52+
out vec4 out_pos;
4953
5054
void main() {
5155
// gl_VertexID is the sprite position in the spritelist.
5256
// We can use that to value to create unique positions with
5357
// some simple math.
5458
float vertId = float(gl_VertexID);
55-
out_pos = vec3(size, 0.0) / 2.0 + vec3(
59+
out_pos = vec4(size, 0.0, 0.0) / 2.0 + vec4(
5660
sin(vertId + time + vertId * bend),
5761
cos(vertId + time + vertId * bend),
62+
0.0,
5863
0.0
5964
) * vertId;
6065
}
@@ -65,19 +70,25 @@ def __init__(self):
6570
def on_draw(self):
6671
self.clear()
6772

73+
if not isinstance(self.coins.data, SpriteListBufferData):
74+
raise RuntimeError(
75+
"The spritelist data must be of type SpriteListBufferData."
76+
)
77+
pos_angle_buffer = cast(Buffer, self.coins.data.storage_positions_angle)
78+
6879
# Write the new positions directly into the position
6980
# buffer of the spritelist. A little bit rude, but it works.
70-
self.coins.geometry.transform(
81+
self.coins.data.geometry.transform(
7182
self.position_program,
72-
self.coins.buffer_positions,
83+
pos_angle_buffer,
7384
vertices=len(self.coins),
7485
)
7586
self.coins.draw()
7687

7788
def on_update(self, delta_time: float):
7889
# Keep updating the current time to animation the movement
7990
self.position_program["time"] = self.time / 4
80-
# Update the "bendyness" value
91+
# Update the "bendiness" value
8192
self.position_program["bend"] = math.cos(self.time) / 400
8293

8394
def on_resize(self, width: int, height: int):

arcade/examples/gl/spritelist_interaction_visualize_dist.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ def __init__(self):
4949
#version 330
5050
5151
// Sprite positions from SpriteList
52-
in vec3 in_pos;
52+
in vec4 in_pos;
5353
5454
// Output to geometry shader
5555
out vec3 v_position;
5656
5757
void main() {
5858
// This shader just forwards info to geo shader
59-
v_position = in_pos;
59+
v_position = in_pos.xyz;
6060
}
6161
""",
6262
geometry_shader="""
@@ -120,7 +120,7 @@ def on_draw(self):
120120
# use to run our shader/gpu program. It only requires that we
121121
# use correctly named input name(s). in_pos in this example
122122
# what will automatically map in the position buffer to the vertex shader.
123-
self.coins.geometry.render(self.program_visualize_dist, vertices=len(self.coins))
123+
self.coins.data.geometry.render(self.program_visualize_dist, vertices=len(self.coins))
124124
arcade.draw_sprite(self.player)
125125

126126
# Visualize the interaction radius

arcade/examples/gl/spritelist_interaction_visualize_dist_los.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ def __init__(self):
7272
#version 330
7373
7474
// Sprite positions from SpriteList
75-
in vec3 in_pos;
75+
in vec4 in_pos;
7676
7777
// Output to geometry shader
7878
out vec3 v_position;
7979
8080
void main() {
8181
// This shader just forwards info to geo shader
82-
v_position = in_pos;
82+
v_position = in_pos.xyz;
8383
}
8484
""",
8585
geometry_shader="""
@@ -178,7 +178,7 @@ def on_draw(self):
178178
# use to run our shader/gpu program. It only requires that we
179179
# use correctly named input name(s). in_pos in this example
180180
# what will automatically map in the position buffer to the vertex shader.
181-
self.coins.geometry.render(self.program_visualize_dist, vertices=len(self.coins))
181+
self.coins.data.geometry.render(self.program_visualize_dist, vertices=len(self.coins))
182182
arcade.draw_sprite(self.player)
183183

184184
# Visualize the interaction radius

arcade/examples/gl/spritelist_interaction_visualize_dist_los_trans.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ def __init__(self):
8080
#version 330
8181
8282
// Sprite positions from SpriteList
83-
in vec3 in_pos;
83+
in vec4 in_pos;
8484
8585
// Output to geometry shader
8686
out vec3 v_position;
8787
8888
void main() {
8989
// This shader just forwards info to geo shader
90-
v_position = in_pos;
90+
v_position = in_pos.xyz;
9191
}
9292
""",
9393
geometry_shader="""
@@ -183,7 +183,7 @@ def on_draw(self):
183183
# use to run our shader/gpu program. It only requires that we
184184
# use correctly named input name(s). in_pos in this example
185185
# what will automatically map in the position buffer to the vertex shader.
186-
self.coins.geometry.transform(
186+
self.coins.data.geometry.transform(
187187
self.program_select_sprites,
188188
self.result_buffer,
189189
vertices=len(self.coins),

arcade/sprite_list/sprite_list.py

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,11 @@ def _init_deferred(self) -> None:
323323

324324
# NOTE: Instantiate the appropriate spritelist data class here
325325
# Desktop GL (with geo shader)
326-
# self._data = SpriteListBufferData(
326+
self._data = SpriteListBufferData(self.ctx, capacity=self._buf_capacity, atlas=self._atlas)
327+
# WebGL (without geo shader)
328+
# self._data = SpriteListTextureData(
327329
# self.ctx, capacity=self._buf_capacity, atlas=self._atlas
328330
# )
329-
# WebGL (without geo shader)
330-
self._data = SpriteListTextureData(self.ctx, capacity=self._buf_capacity, atlas=self._atlas)
331331
self._initialized = True
332332

333333
# Load all the textures and write texture coordinates into buffers.
@@ -1260,6 +1260,7 @@ def __init__(self, ctx: ArcadeContext, capacity: int) -> None:
12601260
self.ctx = ctx
12611261
self._buf_capacity = capacity
12621262
self._idx_capacity = capacity
1263+
self._geometry: Geometry
12631264

12641265
# Generic GPU storage for sprite data
12651266
self._storage_pos_angle: Buffer | Texture2D
@@ -1268,6 +1269,13 @@ def __init__(self, ctx: ArcadeContext, capacity: int) -> None:
12681269
self._storage_texture_id: Buffer | Texture2D
12691270
self._storage_index: Buffer | Texture2D
12701271

1272+
@property
1273+
def geometry(self) -> Geometry:
1274+
"""
1275+
Returns the internal OpenGL geometry for this spritelist.
1276+
"""
1277+
return self._geometry
1278+
12711279
@property
12721280
def storage_positions_angle(self) -> Buffer | Texture2D:
12731281
"""
@@ -1441,23 +1449,6 @@ def __init__(self, ctx: ArcadeContext, capacity: int, atlas: TextureAtlasBase) -
14411449
index_element_size=4, # 32 bit integers
14421450
)
14431451

1444-
@property
1445-
def geometry(self) -> Geometry:
1446-
"""
1447-
Returns the internal OpenGL geometry for this spritelist.
1448-
This can be used to execute custom shaders with the
1449-
spritelist data.
1450-
1451-
One or multiple of the following inputs must be defined in your vertex shader::
1452-
1453-
in vec2 in_pos;
1454-
in float in_angle;
1455-
in vec2 in_size;
1456-
in float in_texture;
1457-
in vec4 in_color;
1458-
"""
1459-
return self._geometry
1460-
14611452
@property
14621453
def buffer_positions_angle(self) -> Buffer:
14631454
"""

0 commit comments

Comments
 (0)