2020)
2121
2222from arcade import Sprite , SpriteType , SpriteType_co , get_window , gl
23- from arcade .gl import Program , Texture2D
23+ from arcade .gl import Program , Texture2D , BufferDescription
2424from arcade .gl .buffer import Buffer
2525from arcade .gl .types import BlendFunction , OpenGlFilter , PyGLenum
2626from arcade .gl .vertex_array import Geometry
@@ -293,9 +293,17 @@ def _init_deferred(self) -> None:
293293 self .ctx = get_window ().ctx
294294 if not self ._atlas :
295295 self ._atlas = self .ctx .default_atlas
296- self ._spritelist_data = SpriteListBufferData (
296+
297+ # NOTE: Instantiate the appropriate spritelist data class here
298+ # Desktop GL (with geo shader)
299+ # self._spritelist_data = SpriteListBufferData(
300+ # self.ctx, capacity=self._buf_capacity, atlas=self._atlas
301+ # )
302+ # WebGL (without geo shader)
303+ self ._spritelist_data = SpriteListTextureData (
297304 self .ctx , capacity = self ._buf_capacity , atlas = self ._atlas
298305 )
306+
299307 self ._initialized = True
300308
301309 # Load all the textures and write texture coordinates into buffers.
@@ -1569,19 +1577,29 @@ def __init__(self, ctx: ArcadeContext, capacity: int, atlas: TextureAtlasBase) -
15691577 self ._atlas = atlas
15701578
15711579 # Program without geo shader
1572- self .program = self .ctx .load_program (
1573- vertex_shader = ":system:shaders/sprites/sprite_list_simple_vs.glsl" ,
1574- fragment_shader = ":system:shaders/sprites/sprite_list_simple_fs.glsl" ,
1575- )
1576- self ._geometry : Geometry | None = None
1580+ self .program = self .ctx .sprite_list_program_no_geo
15771581 self ._atlas = atlas or self .ctx .default_atlas
15781582
1583+ # fmt: off
1584+ self ._instance_buffer = self .ctx .buffer (
1585+ data = array ("f" , [
1586+ - 0.5 , + 0.5 , # Upper left
1587+ - 0.5 , - 0.5 , # lower left
1588+ + 0.5 , + 0.5 , # upper right
1589+ + 0.5 , - 0.5 , # lower right
1590+ ]),
1591+ )
1592+ # fmt: on
1593+ self ._geometry = self .ctx .geometry (
1594+ [BufferDescription (self ._instance_buffer , "2f" , ["in_pos" ], instanced = True )],
1595+ )
1596+
15791597 # Texture buffers for per-sprite data. These are looked up using gl_InstanceID
15801598 self ._pos_angle_texture = self .ctx .texture (size = (capacity , 4 ), dtype = "f4" )
15811599 self ._size_texture = self .ctx .texture (size = (capacity , 2 ), dtype = "f4" )
15821600 self ._color_texture = self .ctx .texture (size = (capacity , 4 ), dtype = "f4" )
1583- self ._texture_id_texture = self .ctx .texture (size = (capacity , 1 ), dtype = "I4 " )
1584- self ._index_texture = self .ctx .texture (size = (capacity , 1 ), dtype = "I4 " )
1601+ self ._texture_id_texture = self .ctx .texture (size = (capacity , 1 ), dtype = "i4 " )
1602+ self ._index_texture = self .ctx .texture (size = (capacity , 1 ), dtype = "i4 " )
15851603
15861604 def write_sprite_buffers_to_gpu (
15871605 self ,
@@ -1598,7 +1616,40 @@ def write_sprite_buffers_to_gpu(
15981616 sprite_texture_changed : bool = True ,
15991617 sprite_index_changed : bool = True ,
16001618 ) -> None :
1601- pass
1619+ """
1620+ Write the sprite buffers to the GPU.
1621+
1622+ Args:
1623+ sprite_pos_angle_data: Array of sprite positions.
1624+ sprite_size_data: Array of sprite sizes.
1625+ sprite_color_data: Array of sprite colors.
1626+ sprite_texture_data: Array of sprite texture IDs.
1627+ sprite_index_data: Array of sprite indices.
1628+ sprite_pos_angle_changed: Whether the position data has changed.
1629+ sprite_size_changed: Whether the size data has changed.
1630+ sprite_color_changed: Whether the color data has changed.
1631+ sprite_texture_changed: Whether the texture data has changed.
1632+ sprite_index_changed: Whether the index data has changed.
1633+ """
1634+ if sprite_pos_angle_changed :
1635+ self ._pos_angle_texture .write (sprite_pos_angle_data )
1636+ self ._sprite_pos_angle_changed = False
1637+
1638+ if sprite_size_changed :
1639+ self ._size_texture .write (sprite_size_data )
1640+ self ._sprite_size_changed = False
1641+
1642+ if sprite_color_changed :
1643+ self ._color_texture .write (sprite_color_data )
1644+ self ._sprite_color_changed = False
1645+
1646+ if sprite_texture_changed :
1647+ self ._texture_id_texture .write (sprite_texture_data )
1648+ self ._sprite_texture_changed = False
1649+
1650+ if sprite_index_changed :
1651+ self ._index_texture .write (sprite_index_data )
1652+ self ._sprite_index_changed = False
16021653
16031654 def grow_sprite_buffers (self ) -> None :
16041655 """Double the internal storage"""
@@ -1687,7 +1738,7 @@ def render(
16871738 self ._geometry .render (
16881739 self .program ,
16891740 mode = self .ctx .POINTS ,
1690- vertices = count ,
1741+ instances = count ,
16911742 )
16921743
16931744 # Leave global states to default
0 commit comments