Skip to content

Commit ceab654

Browse files
committed
Clean up ShaderProgram references + docs + tests
1 parent 03e07de commit ceab654

File tree

11 files changed

+155
-468
lines changed

11 files changed

+155
-468
lines changed

demosys/effects/effect.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import moderngl
77
from demosys import resources
88
from demosys.context.base import Window # noqa
9-
from demosys.opengl import ShaderProgram
109
from demosys.scene import camera # noqa
1110
from demosys.scene import Scene
1211

@@ -78,12 +77,12 @@ def draw(self, time, frametime, target):
7877

7978
# Methods for getting resources
8079

81-
def get_program(self, label) -> ShaderProgram:
80+
def get_program(self, label) -> moderngl.Program:
8281
"""
8382
Get a program by its label
8483
8584
:param label: The label for the program
86-
:return: ShaderProgram object
85+
:return: moderngl.Program instance
8786
"""
8887
return self._project.get_program(label)
8988

demosys/opengl/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
from demosys.opengl.draw import texture # noqa
2-
from .shader import (ShaderProgram, ShaderError) # noqa
32
from .vao import VAO # noqa
43
from .projection import Projection # noqa

demosys/opengl/draw.py

Lines changed: 60 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -68,83 +68,81 @@ def draw_depth(self, texture, near, far, pos=(0.0, 0.0), scale=(1.0, 1.0)):
6868
def _init_texture2d_draw(self):
6969
"""Initialize geometry and shader for drawing FBO layers"""
7070
from demosys import context, geometry # noqa
71-
from demosys.opengl import ShaderProgram # noqa
7271

7372
if not TextureHelper._quad:
7473
TextureHelper._quad = geometry.quad_fs()
7574
# Shader for drawing color layers
76-
src = [
77-
"#version 330",
78-
"#if defined VERTEX_SHADER",
79-
"in vec3 in_position;",
80-
"in vec2 in_uv;",
81-
"out vec2 uv;",
82-
"uniform vec2 offset;",
83-
"uniform vec2 scale;",
84-
"",
85-
"void main() {",
86-
" uv = in_uv;"
87-
" gl_Position = vec4((in_position.xy + vec2(1.0, 1.0)) * scale + offset, 0.0, 1.0);",
88-
"}",
89-
"",
90-
"#elif defined FRAGMENT_SHADER",
91-
"out vec4 out_color;",
92-
"in vec2 uv;",
93-
"uniform sampler2D texture0;",
94-
"void main() {",
95-
" out_color = texture(texture0, uv);",
96-
"}",
97-
"#endif",
98-
]
99-
program = ShaderProgram("fbo_shader")
100-
program.set_source("\n".join(src))
101-
program.prepare()
102-
103-
TextureHelper._texture2d_shader = program
75+
TextureHelper._texture2d_shader = context.ctx().program(
76+
vertex_shader="""
77+
#version 330
78+
79+
in vec3 in_position;
80+
in vec2 in_uv;
81+
out vec2 uv;
82+
uniform vec2 offset;
83+
uniform vec2 scale;
84+
85+
void main() {
86+
uv = in_uv;
87+
gl_Position = vec4((in_position.xy + vec2(1.0, 1.0)) * scale + offset, 0.0, 1.0);
88+
}
89+
""",
90+
fragment_shader="""
91+
#version 330
92+
93+
out vec4 out_color;
94+
in vec2 uv;
95+
uniform sampler2D texture0;
96+
97+
void main() {
98+
out_color = texture(texture0, uv);
99+
}
100+
"""
101+
)
102+
104103
TextureHelper._texture2d_sampler = self.ctx.sampler(
105104
filter=(moderngl.LINEAR, moderngl.LINEAR),
106105
)
107106

108107
def _init_depth_texture_draw(self):
109108
"""Initialize geometry and shader for drawing FBO layers"""
110109
from demosys import context, geometry # noqa
111-
from demosys.opengl import ShaderProgram # noqa
112110

113111
if not TextureHelper._quad:
114112
TextureHelper._quad = geometry.quad_fs()
115113
# Shader for drawing depth layers
116-
src = [
117-
"#version 330",
118-
"#if defined VERTEX_SHADER",
119-
"in vec3 in_position;",
120-
"in vec2 in_uv;",
121-
"out vec2 uv;",
122-
"uniform vec2 offset;",
123-
"uniform vec2 scale;",
124-
"",
125-
"void main() {",
126-
" uv = in_uv;"
127-
" gl_Position = vec4((in_position.xy + vec2(1.0, 1.0)) * scale + offset, 0.0, 1.0);",
128-
"}",
129-
"",
130-
"#elif defined FRAGMENT_SHADER",
131-
"out vec4 out_color;",
132-
"in vec2 uv;",
133-
"uniform sampler2D texture0;",
134-
"uniform float near;"
135-
"uniform float far;"
136-
"void main() {",
137-
" float z = texture(texture0, uv).r;"
138-
" float d = (2.0 * near) / (far + near - z * (far - near));"
139-
" out_color = vec4(d);",
140-
"}",
141-
"#endif",
142-
]
143-
program = ShaderProgram("depth_shader")
144-
program.set_source("\n".join(src))
145-
program.prepare()
146-
147-
TextureHelper._depth_shader = program
114+
TextureHelper._depth_shader = context.ctx().program(
115+
vertex_shader="""
116+
#version 330
117+
118+
in vec3 in_position;
119+
in vec2 in_uv;
120+
out vec2 uv;
121+
uniform vec2 offset;
122+
uniform vec2 scale;
123+
124+
void main() {
125+
uv = in_uv;
126+
gl_Position = vec4((in_position.xy + vec2(1.0, 1.0)) * scale + offset, 0.0, 1.0);
127+
}
128+
""",
129+
fragment_shader="""
130+
#version 330
131+
132+
out vec4 out_color;
133+
in vec2 uv;
134+
uniform sampler2D texture0;
135+
uniform float near;
136+
uniform float far;
137+
138+
void main() {
139+
float z = texture(texture0, uv).r;
140+
float d = (2.0 * near) / (far + near - z * (far - near));
141+
out_color = vec4(d);
142+
}
143+
"""
144+
)
145+
148146
TextureHelper._depth_sampler = self.ctx.sampler(
149147
filter=(moderngl.LINEAR, moderngl.LINEAR),
150148
compare_func='',

demosys/opengl/program.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Tuple, Union
2+
13
import moderngl
24
from demosys.resources.meta import ProgramDescription
35
from demosys import context
@@ -144,3 +146,80 @@ def print(self):
144146

145147
class ShaderError(Exception):
146148
pass
149+
150+
151+
class ReloadableProgram:
152+
"""
153+
Programs we want to be reloadabla must be created with this wrapper
154+
"""
155+
def __init__(self, meta: ProgramDescription, program: moderngl.Program):
156+
"""
157+
Create a shader using either a file path or a name
158+
:param meta: The ProgramMeta
159+
:param program: The program instance
160+
"""
161+
self.program = program
162+
self.meta = meta
163+
164+
@property
165+
def name(self):
166+
return self.meta.path or self.meta.vertex_shader
167+
168+
@property
169+
def ctx(self) -> moderngl.Context:
170+
return self.program.ctx
171+
172+
def __getitem__(self, key) -> Union[moderngl.Uniform, moderngl.UniformBlock, moderngl.Subroutine,
173+
moderngl.Attribute, moderngl.Varying]:
174+
return self.mglo[key]
175+
176+
def get(self, key, default):
177+
return self.program.get(key, default)
178+
179+
@property
180+
def mglo(self):
181+
"""The ModernGL Program object"""
182+
return self.program.mglo
183+
184+
@property
185+
def glo(self) -> int:
186+
"""
187+
int: The internal OpenGL object.
188+
This values is provided for debug purposes only.
189+
"""
190+
return self.program.glo
191+
192+
@property
193+
def subroutines(self) -> Tuple[str, ...]:
194+
'''
195+
tuple: The subroutine uniforms.
196+
'''
197+
return self.program.subroutines
198+
199+
@property
200+
def geometry_input(self) -> int:
201+
"""
202+
int: The geometry input primitive.
203+
The GeometryShader's input primitive if the GeometryShader exists.
204+
The geometry input primitive will be used for validation.
205+
"""
206+
return self.program.geometry_input
207+
208+
@property
209+
def geometry_output(self) -> int:
210+
"""
211+
int: The geometry output primitive.
212+
The GeometryShader's output primitive if the GeometryShader exists.
213+
"""
214+
return self.program.geometry_output
215+
216+
@property
217+
def geometry_vertices(self) -> int:
218+
"""
219+
int: The maximum number of vertices that
220+
the geometry shader will output.
221+
"""
222+
return self.program.geometry_vertices
223+
224+
def __repr__(self):
225+
return '<ReloadableProgram: {} id={}>'.format(self.name, self.mglo.glo)

0 commit comments

Comments
 (0)