from ursina import *; transition_shader = Shader(name='transition_shader', language=Shader.GLSL, fragment=''' #version 140 uniform sampler2D p3d_Texture0; uniform vec4 p3d_ColorScale; in vec2 uv; out vec4 COLOR; uniform sampler2D mask_texture; uniform float cutoff; uniform float smooth_size; void main() { vec3 color = texture2D(p3d_Texture0, uv).rgb * p3d_ColorScale.rgb; float value = texture(mask_texture, uv).r; float alpha = smoothstep(cutoff, cutoff + smooth_size, value * max(0.0, (1.0 - smooth_size) + smooth_size)); COLOR = vec4(color.rgb, alpha * p3d_ColorScale.a); } ''', default_input = { 'cutoff' : 0, 'smooth_size' : .25, } ) if __name__ == '__main__': from ursina import * app = Ursina() window.color = color._16 e = Entity(model='quad', shader=transition_shader, scale=5, cutoff=0) # mask = load_texture('explosion_particle') mask = load_texture('explosion_particle_2') mask = load_texture('impactstrikey_02_b') print(mask) e.set_shader_input('mask_texture', mask) EditorCamera() cutoff_slider = Slider(0, 1, dynamic=True, y=-.4) def on_value_changed(): e.set_shader_input('cutoff', cutoff_slider.value) cutoff_slider.on_value_changed = on_value_changed smooth_slider = Slider(0, 1, dynamic=True, y=-.45) def on_value_changed(): e.set_shader_input('smooth_size', smooth_slider.value) smooth_slider.on_value_changed = on_value_changed def input(key): if key == 'space': e.cutoff = 0 e.animate('cutoff', 1, duration=.1, curve=curve.linear, delay=.05) # e.scale=4 # e.animate('scale', Vec3(7,7,7), duration=.1, curve=curve.linear, delay=.05) # Sprite('radial_gradient') app.run()