diff --git a/libs/video/renderer/glsl/Makefile.am b/libs/video/renderer/glsl/Makefile.am index 7c1b1869c..2afb4ccd2 100644 --- a/libs/video/renderer/glsl/Makefile.am +++ b/libs/video/renderer/glsl/Makefile.am @@ -6,13 +6,11 @@ AM_CPPFLAGS= -I$(top_srcdir)/include $(GLX_CFLAGS) shader_src= quakeforge.glsl \ iqm.frag iqm.vert \ quake2d.frag quakeico.vert \ - quakepar.frag quakepar.vert \ quakespr.frag quakespr.vert \ quaketxt.vert shader_gen= quakeforge.slc \ iqm.fc iqm.vc \ quake2d.fc quakeico.vc \ - quakepar.fc quakepar.vc \ quakespr.fc quakespr.vc quaketxt.vc glsl_src = \ diff --git a/libs/video/renderer/glsl/glsl_particles.c b/libs/video/renderer/glsl/glsl_particles.c index 902fef2c0..09ae06d6f 100644 --- a/libs/video/renderer/glsl/glsl_particles.c +++ b/libs/video/renderer/glsl/glsl_particles.c @@ -90,13 +90,17 @@ static const char *particle_point_frag_effects[] = 0 }; -static const char quakepart_vert[] = -#include "quakepar.vc" -; +static const char *particle_textured_vert_effects[] = +{ + "QuakeForge.Vertex.particle.textured", + 0 +}; -static const char quakepart_frag[] = -#include "quakepar.fc" -; +static const char *particle_textured_frag_effects[] = +{ + "QuakeForge.Fragment.particle.textured", + 0 +}; static struct { int program; @@ -243,9 +247,11 @@ glsl_R_InitParticles (void) GLSL_FreeShader (vert_shader); GLSL_FreeShader (frag_shader); - vert = GLSL_CompileShaderS ("quakepar.vert", quakepart_vert, + vert_shader = GLSL_BuildShader (particle_textured_vert_effects); + frag_shader = GLSL_BuildShader (particle_textured_frag_effects); + vert = GLSL_CompileShader ("quakepar.vert", vert_shader, GL_VERTEX_SHADER); - frag = GLSL_CompileShaderS ("quakepar.frag", quakepart_frag, + frag = GLSL_CompileShader ("quakepar.frag", frag_shader, GL_FRAGMENT_SHADER); quake_part.program = GLSL_LinkProgram ("quakepart", vert, frag); GLSL_ResolveShaderParam (quake_part.program, &quake_part.mvp_matrix); @@ -254,6 +260,8 @@ glsl_R_InitParticles (void) GLSL_ResolveShaderParam (quake_part.program, &quake_part.color); GLSL_ResolveShaderParam (quake_part.program, &quake_part.texture); GLSL_ResolveShaderParam (quake_part.program, &quake_part.fog); + GLSL_FreeShader (vert_shader); + GLSL_FreeShader (frag_shader); memset (data, 0, sizeof (data)); qfeglGenTextures (1, &part_tex); diff --git a/libs/video/renderer/glsl/quakeforge.glsl b/libs/video/renderer/glsl/quakeforge.glsl index cbde9ac81..097ef89ed 100644 --- a/libs/video/renderer/glsl/quakeforge.glsl +++ b/libs/video/renderer/glsl/quakeforge.glsl @@ -279,6 +279,30 @@ main (void) color = vcolor; } +-- Vertex.particle.textured + +uniform mat4 mvp_mat; +attribute vec4 vcolor; +attribute vec2 vst; +/** Vertex position. + + x, y, z, c + + c is the color of the point. +*/ +attribute vec3 vertex; + +varying vec4 color; +varying vec2 st; + +void +main (void) +{ + gl_Position = mvp_mat * vec4 (vertex, 1.0); + color = vcolor; + st = vst; +} + -- Fragment.particle.point //precision mediump float; @@ -310,3 +334,34 @@ main (void) discard; gl_FragColor = fogBlend (texture2D (palette, vec2 (color, 0.0))); } + +-- Fragment.particle.textured + +//precision mediump float; +uniform sampler2D texture; +uniform vec4 fog; + +varying vec4 color; +varying vec2 st; + +float +sqr (float x) +{ + return x * x; +} + +vec4 +fogBlend (vec4 color) +{ + float f; + vec4 fog_color = vec4 (fog.rgb, 1.0); + + f = exp (-sqr (fog.a * gl_FragCoord.z / gl_FragCoord.w)); + return vec4 (mix (fog_color.rgb, color.rgb, f), color.a); +} + +void +main (void) +{ + gl_FragColor = fogBlend (texture2D (texture, st) * color); +} diff --git a/libs/video/renderer/glsl/quakepar.frag b/libs/video/renderer/glsl/quakepar.frag deleted file mode 100644 index da829b0f3..000000000 --- a/libs/video/renderer/glsl/quakepar.frag +++ /dev/null @@ -1,28 +0,0 @@ -//precision mediump float; -uniform sampler2D texture; -uniform vec4 fog; - -varying vec4 color; -varying vec2 st; - -float -sqr (float x) -{ - return x * x; -} - -vec4 -fogBlend (vec4 color) -{ - float f; - vec4 fog_color = vec4 (fog.rgb, 1.0); - - f = exp (-sqr (fog.a * gl_FragCoord.z / gl_FragCoord.w)); - return vec4 (mix (fog_color.rgb, color.rgb, f), color.a); -} - -void -main (void) -{ - gl_FragColor = fogBlend (texture2D (texture, st) * color); -} diff --git a/libs/video/renderer/glsl/quakepar.vert b/libs/video/renderer/glsl/quakepar.vert deleted file mode 100644 index 3c80e6520..000000000 --- a/libs/video/renderer/glsl/quakepar.vert +++ /dev/null @@ -1,21 +0,0 @@ -uniform mat4 mvp_mat; -attribute vec4 vcolor; -attribute vec2 vst; -/** Vertex position. - - x, y, z, c - - c is the color of the point. -*/ -attribute vec3 vertex; - -varying vec4 color; -varying vec2 st; - -void -main (void) -{ - gl_Position = mvp_mat * vec4 (vertex, 1.0); - color = vcolor; - st = vst; -}