| @@ -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; | vec2 texCoords; | ||||
| vec4 color; | 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; | layout (location = 2) uniform vec2 uOffset; | ||||
| out FragmentData fragmentData; | |||||
| out VertexData vertexData; | |||||
| void main() { | 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( | mat4 ortho = mat4( | ||||
| vec4(2.0 / uCamera.size.x, 0.0, 0.0, 0.0), | vec4(2.0 / uCamera.size.x, 0.0, 0.0, 0.0), | ||||
| vec4(0.0, -2.0 / uCamera.size.y, 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) | 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 vfs = world.resource::<Vfs>()?.deref().clone(); | ||||
| let program = world.load_program(vec![ | let program = world.load_program(vec![ | ||||
| (Type::Vertex, "resources/shader/text/vert.glsl"), | (Type::Vertex, "resources/shader/text/vert.glsl"), | ||||
| (Type::Geometry, "resources/shader/text/geom.glsl"), | |||||
| (Type::Fragment, "resources/shader/text/frag.glsl"), | (Type::Fragment, "resources/shader/text/frag.glsl"), | ||||
| ])?; | ])?; | ||||
| let program = Rc::new(program); | let program = Rc::new(program); | ||||
| @@ -595,15 +596,10 @@ impl Text { | |||||
| let array = VertexArray::builder() | let array = VertexArray::builder() | ||||
| .bind_buffer(buffer) | .bind_buffer(buffer) | ||||
| .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE, OFFSET_POS_MIN)? | .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_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_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_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_pointer(4, 4, DataType::Float, false, STRIDE, OFFSET_COLOR)? | ||||
| .vertex_attrib_divisor(1)? | |||||
| .build()?; | .build()?; | ||||
| let cache = cache.clone(); | let cache = cache.clone(); | ||||
| @@ -647,7 +643,9 @@ impl Text { | |||||
| .uniform(2, Uniform::Vector2f(pos)) | .uniform(2, Uniform::Vector2f(pos)) | ||||
| .warn("Unable to update text offset"); | .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> | pub fn update<S>(&mut self, mut index: usize, text: S) -> Result<&Self, Error> | ||||