Skip to content

Commit

Permalink
Preload sprite list shader/program
Browse files Browse the repository at this point in the history
  • Loading branch information
einarf committed Apr 9, 2020
1 parent 2aa7ae9 commit 6a9bb2c
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 65 deletions.
17 changes: 17 additions & 0 deletions arcade/resources/shaders/sprite_list_fs.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#version 330

uniform sampler2D Texture;

in vec2 v_texture;
in vec4 v_color;

out vec4 f_color;

void main() {
vec4 basecolor = texture(Texture, v_texture);
basecolor = basecolor * v_color;
if (basecolor.a == 0.0){
discard;
}
f_color = basecolor;
}
36 changes: 36 additions & 0 deletions arcade/resources/shaders/sprite_list_vs.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#version 330

uniform mat4 Projection;
uniform mat3 TextureTransform;

// per vertex
in vec2 in_vert;
in vec2 in_texture;

// per instance
in vec2 in_pos;
in float in_angle;
in vec2 in_size;
in vec4 in_sub_tex_coords;
in vec4 in_color;

out vec2 v_texture;
out vec4 v_color;

void main() {
mat2 rotate = mat2(
cos(in_angle), sin(in_angle),
-sin(in_angle), cos(in_angle)
);
vec2 pos;
pos = in_pos + vec2(rotate * (in_vert * (in_size / 2)));
gl_Position = Projection * vec4(pos, 0.0, 1.0);

vec2 tex_offset = in_sub_tex_coords.xy;
vec2 tex_size = in_sub_tex_coords.zw;

v_texture = (in_texture * tex_size + tex_offset) * vec2(1, -1);
vec3 temp = TextureTransform * vec3(v_texture, 1.0);
v_texture = temp.xy / temp.z;
v_color = in_color;
}
5 changes: 5 additions & 0 deletions arcade/shader.py
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,7 @@ def __init__(self, window):
self._gl_version = (3, 3)

# --- Pre-load system shaders here ---

self.line_vertex_shader = self.load_program(
self.resource_root / 'shaders/line_vertex_shader_vs.glsl',
self.resource_root / 'shaders/line_vertex_shader_fs.glsl',
Expand All @@ -925,6 +926,10 @@ def __init__(self, window):
self.resource_root / 'shaders/shape_element_list_vs.glsl',
self.resource_root / 'shaders/shape_element_list_fs.glsl',
)
self.sprite_list_program = self.load_program(
self.resource_root / 'shaders/sprite_list_vs.glsl',
self.resource_root / 'shaders/sprite_list_fs.glsl',
)

@property
def gl_version(self):
Expand Down
66 changes: 1 addition & 65 deletions arcade/sprite_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,63 +30,6 @@
from arcade import shader
from arcade import Point

_VERTEX_SHADER = """
#version 330
uniform mat4 Projection;
uniform mat3 TextureTransform;
// per vertex
in vec2 in_vert;
in vec2 in_texture;
// per instance
in vec2 in_pos;
in float in_angle;
in vec2 in_size;
in vec4 in_sub_tex_coords;
in vec4 in_color;
out vec2 v_texture;
out vec4 v_color;
void main() {
mat2 rotate = mat2(
cos(in_angle), sin(in_angle),
-sin(in_angle), cos(in_angle)
);
vec2 pos;
pos = in_pos + vec2(rotate * (in_vert * (in_size / 2)));
gl_Position = Projection * vec4(pos, 0.0, 1.0);
vec2 tex_offset = in_sub_tex_coords.xy;
vec2 tex_size = in_sub_tex_coords.zw;
v_texture = (in_texture * tex_size + tex_offset) * vec2(1, -1);
vec3 temp = TextureTransform * vec3(v_texture, 1.0);
v_texture = temp.xy / temp.z;
v_color = in_color;
}
"""

_FRAGMENT_SHADER = """
#version 330
uniform sampler2D Texture;
in vec2 v_texture;
in vec4 v_color;
out vec4 f_color;
void main() {
vec4 basecolor = texture(Texture, v_texture);
basecolor = basecolor * v_color;
if (basecolor.a == 0.0){
discard;
}
f_color = basecolor;
}
"""


def _create_rects(rect_list: Iterable[Sprite]) -> List[float]:
"""
Expand Down Expand Up @@ -307,7 +250,7 @@ def __init__(self, use_spatial_hash=False, spatial_hash_cell_size=128, is_static
self.sprite_idx = dict()

# Used in drawing optimization via OpenGL
self.program = None
self.program = self.ctx.sprite_list_program

self._sprite_pos_data = None
self._sprite_pos_buf = None
Expand Down Expand Up @@ -881,13 +824,6 @@ def draw(self, **kwargs):
:param filter: Optional parameter to set OpenGL filter, such as
`gl.GL_NEAREST` to avoid smoothing.
"""
if self.program is None:
# Used in drawing optimization via OpenGL
self.program = self.ctx.program(
vertex_shader=_VERTEX_SHADER,
fragment_shader=_FRAGMENT_SHADER
)

if len(self.sprite_list) == 0:
return

Expand Down

0 comments on commit 6a9bb2c

Please sign in to comment.