| @@ -0,0 +1,38 @@ | |||
| #version 450 core | |||
| #pragma include ./shared.glsl | |||
| in VertexData vertexData[]; | |||
| layout (points) in; | |||
| layout (triangle_strip, max_vertices = 4) out; | |||
| layout (location = 2) uniform vec2 uOffset; | |||
| out FragmentData fragmentData; | |||
| void main() { | |||
| VertexData d = vertexData[0]; | |||
| gl_Position = vec4(vec2(d.posMin.x, d.posMax.y), 0.0, 1.0); | |||
| fragmentData.texCoords = vec2(d.texMin.x, d.texMax.y); | |||
| fragmentData.color = d.color; | |||
| EmitVertex(); | |||
| gl_Position = vec4(vec2(d.posMin.x, d.posMin.y), 0.0, 1.0); | |||
| fragmentData.texCoords = vec2(d.texMin.x, d.texMin.y); | |||
| fragmentData.color = d.color; | |||
| EmitVertex(); | |||
| gl_Position = vec4(vec2(d.posMax.x, d.posMax.y), 0.0, 1.0); | |||
| fragmentData.texCoords = vec2(d.texMax.x, d.texMax.y); | |||
| fragmentData.color = d.color; | |||
| EmitVertex(); | |||
| gl_Position = vec4(vec2(d.posMax.x, d.posMin.y), 0.0, 1.0); | |||
| fragmentData.texCoords = vec2(d.texMax.x, d.texMin.y); | |||
| fragmentData.color = d.color; | |||
| EmitVertex(); | |||
| EndPrimitive(); | |||
| } | |||
| @@ -2,3 +2,11 @@ struct FragmentData { | |||
| vec2 texCoords; | |||
| vec4 color; | |||
| }; | |||
| struct VertexData { | |||
| vec2 posMin; | |||
| vec2 posMax; | |||
| vec2 texMin; | |||
| vec2 texMax; | |||
| vec4 color; | |||
| }; | |||
| @@ -11,34 +11,9 @@ layout (location = 4) in vec4 inColor; | |||
| layout (location = 2) uniform vec2 uOffset; | |||
| out FragmentData fragmentData; | |||
| out VertexData vertexData; | |||
| void main() { | |||
| vec2 position = vec2(0.0); | |||
| vec2 texCoords = vec2(0.0); | |||
| switch (gl_VertexID) { | |||
| case 0: | |||
| position = vec2(inPosMin.x, inPosMax.y); | |||
| texCoords = vec2(inTexMin.x, inTexMax.y); | |||
| break; | |||
| case 1: | |||
| position = vec2(inPosMin.x, inPosMin.y); | |||
| texCoords = vec2(inTexMin.x, inTexMin.y); | |||
| break; | |||
| case 2: | |||
| position = vec2(inPosMax.x, inPosMax.y); | |||
| texCoords = vec2(inTexMax.x, inTexMax.y); | |||
| break; | |||
| case 3: | |||
| position = vec2(inPosMax.x, inPosMin.y); | |||
| texCoords = vec2(inTexMax.x, inTexMin.y); | |||
| break; | |||
| } | |||
| mat4 ortho = mat4( | |||
| vec4(2.0 / uCamera.size.x, 0.0, 0.0, 0.0), | |||
| vec4(0.0, -2.0 / uCamera.size.y, 0.0, 0.0), | |||
| @@ -46,8 +21,9 @@ void main() { | |||
| vec4(-1.0, 1.0, 1.0, 1.0) | |||
| ); | |||
| gl_Position = ortho * vec4(position + uOffset, 0.0, 1.0); | |||
| fragmentData.texCoords = texCoords; | |||
| fragmentData.color = inColor; | |||
| vertexData.posMin = (ortho * vec4(inPosMin + uOffset, 0.0, 1.0)).xy; | |||
| vertexData.posMax = (ortho * vec4(inPosMax + uOffset, 0.0, 1.0)).xy; | |||
| vertexData.texMin = inTexMin; | |||
| vertexData.texMax = inTexMax; | |||
| vertexData.color = inColor; | |||
| } | |||
| @@ -48,6 +48,7 @@ impl TextManager { | |||
| let vfs = world.resource::<Vfs>()?.deref().clone(); | |||
| let program = world.load_program(vec![ | |||
| (Type::Vertex, "resources/shader/text/vert.glsl"), | |||
| (Type::Geometry, "resources/shader/text/geom.glsl"), | |||
| (Type::Fragment, "resources/shader/text/frag.glsl"), | |||
| ])?; | |||
| let program = Rc::new(program); | |||
| @@ -595,15 +596,10 @@ impl Text { | |||
| let array = VertexArray::builder() | |||
| .bind_buffer(buffer) | |||
| .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE, OFFSET_POS_MIN)? | |||
| .vertex_attrib_divisor(1)? | |||
| .vertex_attrib_pointer(1, 2, DataType::Float, false, STRIDE, OFFSET_POS_MAX)? | |||
| .vertex_attrib_divisor(1)? | |||
| .vertex_attrib_pointer(2, 2, DataType::Float, false, STRIDE, OFFSET_TEX_MIN)? | |||
| .vertex_attrib_divisor(1)? | |||
| .vertex_attrib_pointer(3, 2, DataType::Float, false, STRIDE, OFFSET_TEX_MAX)? | |||
| .vertex_attrib_divisor(1)? | |||
| .vertex_attrib_pointer(4, 4, DataType::Float, false, STRIDE, OFFSET_COLOR)? | |||
| .vertex_attrib_divisor(1)? | |||
| .build()?; | |||
| let cache = cache.clone(); | |||
| @@ -647,7 +643,9 @@ impl Text { | |||
| .uniform(2, Uniform::Vector2f(pos)) | |||
| .warn("Unable to update text offset"); | |||
| gl::draw_arrays_instanced(gl::TRIANGLE_STRIP, 0, 4, inner.vertex_count as _); | |||
| // gl::draw_arrays(gl::POINTS, 0, inner.vertex_count as _); | |||
| gl::draw_arrays(gl::POINTS, 0, inner.vertex_count as _); | |||
| // gl::draw_arrays_instanced(gl::POINTS, 0, 1, inner.vertex_count as _); | |||
| } | |||
| pub fn update<S>(&mut self, mut index: usize, text: S) -> Result<&Self, Error> | |||