TextMaterial

Struct TextMaterial 

Source
pub struct TextMaterial { /* private fields */ }
Expand description

This struct represents a piece of text. You only need to create one peice of text per string you would like to draw as you can draw multpiple instances easily.

Implementations§

Source§

impl TextMaterial

Source

pub fn new(text: &str, colour: Colour, font_size: f32, line_height: f32) -> Self

Examples found in repository?
examples/input.rs (line 12)
9fn main() {
10    let engine = EngineBuilder::new().build().unwrap();
11
12    let text_mat = TextMaterial::new("this is a test", Colour::RED, 20.0, 20.0 * 1.3);
13
14    let text_example = TextExample {
15        text_mat,
16        text: String::new(),
17    };
18
19    engine.run(text_example);
20}
More examples
Hide additional examples
examples/text.rs (line 15)
11fn main() {
12    let mut engine = EngineBuilder::new().build().unwrap();
13
14    let comic = Font::new("examples/Comic.ttf", &mut engine, LoadingOp::Blocking);
15    let text_mat = TextMaterial::new("this is a test", Colour::RED, 0.5, 0.5 * 1.3);
16
17    let text_example = TextExample {
18        text_mat,
19        comic,
20        font_size: 0.5,
21    };
22
23    engine.run(text_example);
24}
examples/camera.rs (lines 24-29)
13fn main() {
14    let mut engine = EngineBuilder::new().build().unwrap();
15
16    let texture = Texture::new(&mut engine, "examples/bplogo.png", LoadingOp::Blocking);
17
18    let material = MaterialBuilder::new()
19        .add_texture(texture)
20        .build(&mut engine);
21
22    let camera = Camera::default();
23
24    let text = TextMaterial::new(
25        "Mouse pos: 0,0 \n Mouse pos: 0, 0",
26        Colour::WHITE,
27        15.0,
28        20.0,
29    );
30
31    let game = CameraExample {
32        material,
33        text,
34        camera,
35    };
36
37    engine.run(game);
38}
Source

pub fn set_text(&mut self, text: &str, colour: Colour, engine: &mut Engine)

Sets the text for the widget, using the defualt font. This only needs to be done once, not every frame like Materials.

Examples found in repository?
examples/input.rs (line 42)
36    fn update(&mut self, engine_handle: &mut Engine) {
37        let text = engine_handle.get_current_text();
38        if let Some(s) = text {
39            self.text.push_str(s);
40
41            self.text_mat
42                .set_text(&self.text, Colour::RED, engine_handle)
43        }
44
45        self.text_mat.prepare(engine_handle);
46    }
More examples
Hide additional examples
examples/camera.rs (lines 111-118)
66    fn update(&mut self, engine_handle: &mut Engine) {
67        let dt = engine_handle.get_frame_delta_time();
68        let mouse_pos = engine_handle.get_mouse_position();
69        let size = engine_handle.get_window_size();
70
71        let move_factor = 15.0;
72
73        if engine_handle.is_key_down(Key::A) {
74            self.camera.center.x -= move_factor * dt;
75        }
76
77        if engine_handle.is_key_down(Key::D) {
78            self.camera.center.x += move_factor * dt;
79        }
80
81        if engine_handle.is_key_down(Key::W) {
82            self.camera.center.y += move_factor * dt;
83        }
84
85        if engine_handle.is_key_down(Key::S) {
86            self.camera.center.y -= move_factor * dt;
87        }
88
89        if engine_handle.is_key_down(Key::Left) {
90            self.camera.rotation += move_factor * dt;
91        }
92
93        if engine_handle.is_key_down(Key::Right) {
94            self.camera.rotation -= move_factor * dt;
95        }
96
97        if engine_handle.is_key_down(Key::L) {
98            self.camera.scale += vec2!(2.0 * dt, 2.0 * dt);
99        }
100
101        if engine_handle.is_key_down(Key::K) {
102            self.camera.scale -= vec2!(2.0 * dt, 2.0 * dt);
103        }
104
105        if engine_handle.is_key_pressed(Key::Enter) {
106            self.camera.rotation += 45.0;
107        }
108
109        let trans_mouse = self.camera.transform_point(mouse_pos, size);
110
111        self.text.set_text(
112            &format!(
113                "Screen mouse pos: {:.3}, {:.3}\nWorld mouse pos: {:.3}, {:.3}",
114                mouse_pos.x, mouse_pos.y, trans_mouse.x, trans_mouse.y
115            ),
116            Colour::WHITE,
117            engine_handle,
118        );
119
120        self.text.prepare(engine_handle);
121    }
Source

pub fn set_text_with_font( &mut self, text: &str, colour: Colour, font: &ResourceId<Font>, engine: &mut Engine, )

Sets the text for the widget, but with a font of your choosing. This only needs to be done once, not every frame like Materials

Examples found in repository?
examples/text.rs (lines 56-61)
48    fn update(&mut self, engine_handle: &mut Engine) {
49        self.font_size += 2.0 * engine_handle.get_frame_delta_time();
50
51        self.text_mat.set_font_size(self.font_size, engine_handle);
52        self.text_mat
53            .set_line_height(self.font_size * 1.3, engine_handle);
54
55        if engine_handle.is_mouse_key_pressed(MouseKey::Left) {
56            self.text_mat.set_text_with_font(
57                "hello I am talking to you here???",
58                Colour::GREEN,
59                &self.comic,
60                engine_handle,
61            );
62        }
63
64        self.text_mat.prepare(engine_handle);
65    }
Source

pub fn set_bounds(&mut self, position: Vec2<i32>, size: Vec2<i32>)

Sets bounds for the text. Any text drawn outside of the bounds will be cropped

Source

pub fn set_font_size(&mut self, new_size: f32, engine: &mut Engine)

Sets the font size of the text

Examples found in repository?
examples/text.rs (line 51)
48    fn update(&mut self, engine_handle: &mut Engine) {
49        self.font_size += 2.0 * engine_handle.get_frame_delta_time();
50
51        self.text_mat.set_font_size(self.font_size, engine_handle);
52        self.text_mat
53            .set_line_height(self.font_size * 1.3, engine_handle);
54
55        if engine_handle.is_mouse_key_pressed(MouseKey::Left) {
56            self.text_mat.set_text_with_font(
57                "hello I am talking to you here???",
58                Colour::GREEN,
59                &self.comic,
60                engine_handle,
61            );
62        }
63
64        self.text_mat.prepare(engine_handle);
65    }
Source

pub fn set_line_height(&mut self, new_height: f32, engine: &mut Engine)

Sets the line hieght of the text

Examples found in repository?
examples/text.rs (line 53)
48    fn update(&mut self, engine_handle: &mut Engine) {
49        self.font_size += 2.0 * engine_handle.get_frame_delta_time();
50
51        self.text_mat.set_font_size(self.font_size, engine_handle);
52        self.text_mat
53            .set_line_height(self.font_size * 1.3, engine_handle);
54
55        if engine_handle.is_mouse_key_pressed(MouseKey::Left) {
56            self.text_mat.set_text_with_font(
57                "hello I am talking to you here???",
58                Colour::GREEN,
59                &self.comic,
60                engine_handle,
61            );
62        }
63
64        self.text_mat.prepare(engine_handle);
65    }
Source

pub fn get_measurements(&self) -> Vec2<u32>

Measuers the text contained within the widget

Source

pub fn get_text(&self) -> &str

Source

pub fn add_instance( &mut self, position: Vec2<f32>, tint: Colour, render: &Renderer<'_, '_>, )

Queues a peice of text at the specified position. Its size will be the size of the entire text.

Examples found in repository?
examples/input.rs (line 31)
28    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
29        let mut render_handle = render.begin_pass(Colour::BLACK);
30        self.text_mat
31            .add_instance(vec2! { 0.0 }, Colour::WHITE, &render_handle);
32
33        self.text_mat.draw(&mut render_handle);
34    }
More examples
Hide additional examples
examples/text.rs (line 37)
33    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
34        let mut render_handle = render.begin_pass(Colour::BLACK);
35
36        self.text_mat
37            .add_instance(vec2! { 0.0 }, Colour::WHITE, &render_handle);
38        self.text_mat.add_instance_with_rotation(
39            Vec2 { x: 100.0, y: 0.0 },
40            Colour::WHITE,
41            45.0,
42            &render_handle,
43        );
44
45        self.text_mat.draw(&mut render_handle);
46    }
examples/camera.rs (line 62)
47    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
48        let mut render_handle = render.begin_pass(Colour::BLACK);
49
50        self.material.add_rectangle(
51            Vec2 { x: 0.0, y: 0.0 },
52            Vec2 { x: 300.0, y: 300.0 },
53            Colour::WHITE,
54            &render_handle,
55        );
56
57        self.camera.set_active(&mut render_handle);
58        self.material.draw(&mut render_handle);
59
60        render_handle.reset_camera();
61        self.text
62            .add_instance(vec2!(0.0), Colour::WHITE, &render_handle);
63        self.text.draw(&mut render_handle);
64    }
Source

pub fn add_instance_with_rotation( &mut self, position: Vec2<f32>, tint: Colour, degrees: f32, render: &Renderer<'_, '_>, )

Queues a piece of text at the specified postion, with rotation. Its size will be the size of the text.

Examples found in repository?
examples/text.rs (lines 38-43)
33    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
34        let mut render_handle = render.begin_pass(Colour::BLACK);
35
36        self.text_mat
37            .add_instance(vec2! { 0.0 }, Colour::WHITE, &render_handle);
38        self.text_mat.add_instance_with_rotation(
39            Vec2 { x: 100.0, y: 0.0 },
40            Colour::WHITE,
41            45.0,
42            &render_handle,
43        );
44
45        self.text_mat.draw(&mut render_handle);
46    }
Source

pub fn add_instance_with_uv( &mut self, position: Vec2<f32>, size: Vec2<f32>, uv_pos: Vec2<f32>, uv_size: Vec2<f32>, tint: Colour, render: &Renderer<'_, '_>, )

Queues a piece of text at the specified postion. This also allows you to control the uv coordinates to the texture that the text has been rendered to.

Source

pub fn add_instace_ex( &mut self, position: Vec2<f32>, size: Vec2<f32>, uv_pos: Vec2<f32>, uv_size: Vec2<f32>, degrees: f32, tint: Colour, render: &Renderer<'_, '_>, )

Queues a piece of text at the position with, uv control, and rotation.

Source

pub fn add_instance_custom( &mut self, points: [Vec2<f32>; 4], uv_points: [Vec2<f32>; 4], degrees: f32, tint: Colour, render: &Renderer<'_, '_>, )

Queues a peice with complete controll over the points, rotation, and uv coordinates. This can allow for non rectanglular shapes and the points must be in top left, top right, bottom right, bottom left order otherwise it will not draw properly.

Source

pub fn prepare(&mut self, engine: &mut Engine)

This function needs to be run any time you update the text. This updates the internal texture used to render the text. If this is not run after each change then it wont display the changes.

Examples found in repository?
examples/input.rs (line 45)
36    fn update(&mut self, engine_handle: &mut Engine) {
37        let text = engine_handle.get_current_text();
38        if let Some(s) = text {
39            self.text.push_str(s);
40
41            self.text_mat
42                .set_text(&self.text, Colour::RED, engine_handle)
43        }
44
45        self.text_mat.prepare(engine_handle);
46    }
More examples
Hide additional examples
examples/text.rs (line 64)
48    fn update(&mut self, engine_handle: &mut Engine) {
49        self.font_size += 2.0 * engine_handle.get_frame_delta_time();
50
51        self.text_mat.set_font_size(self.font_size, engine_handle);
52        self.text_mat
53            .set_line_height(self.font_size * 1.3, engine_handle);
54
55        if engine_handle.is_mouse_key_pressed(MouseKey::Left) {
56            self.text_mat.set_text_with_font(
57                "hello I am talking to you here???",
58                Colour::GREEN,
59                &self.comic,
60                engine_handle,
61            );
62        }
63
64        self.text_mat.prepare(engine_handle);
65    }
examples/camera.rs (line 120)
66    fn update(&mut self, engine_handle: &mut Engine) {
67        let dt = engine_handle.get_frame_delta_time();
68        let mouse_pos = engine_handle.get_mouse_position();
69        let size = engine_handle.get_window_size();
70
71        let move_factor = 15.0;
72
73        if engine_handle.is_key_down(Key::A) {
74            self.camera.center.x -= move_factor * dt;
75        }
76
77        if engine_handle.is_key_down(Key::D) {
78            self.camera.center.x += move_factor * dt;
79        }
80
81        if engine_handle.is_key_down(Key::W) {
82            self.camera.center.y += move_factor * dt;
83        }
84
85        if engine_handle.is_key_down(Key::S) {
86            self.camera.center.y -= move_factor * dt;
87        }
88
89        if engine_handle.is_key_down(Key::Left) {
90            self.camera.rotation += move_factor * dt;
91        }
92
93        if engine_handle.is_key_down(Key::Right) {
94            self.camera.rotation -= move_factor * dt;
95        }
96
97        if engine_handle.is_key_down(Key::L) {
98            self.camera.scale += vec2!(2.0 * dt, 2.0 * dt);
99        }
100
101        if engine_handle.is_key_down(Key::K) {
102            self.camera.scale -= vec2!(2.0 * dt, 2.0 * dt);
103        }
104
105        if engine_handle.is_key_pressed(Key::Enter) {
106            self.camera.rotation += 45.0;
107        }
108
109        let trans_mouse = self.camera.transform_point(mouse_pos, size);
110
111        self.text.set_text(
112            &format!(
113                "Screen mouse pos: {:.3}, {:.3}\nWorld mouse pos: {:.3}, {:.3}",
114                mouse_pos.x, mouse_pos.y, trans_mouse.x, trans_mouse.y
115            ),
116            Colour::WHITE,
117            engine_handle,
118        );
119
120        self.text.prepare(engine_handle);
121    }
Source

pub fn draw<'others>(&'others mut self, information: &mut Renderer<'_, 'others>)

Draws all queued text instances to the screen

Examples found in repository?
examples/input.rs (line 33)
28    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
29        let mut render_handle = render.begin_pass(Colour::BLACK);
30        self.text_mat
31            .add_instance(vec2! { 0.0 }, Colour::WHITE, &render_handle);
32
33        self.text_mat.draw(&mut render_handle);
34    }
More examples
Hide additional examples
examples/text.rs (line 45)
33    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
34        let mut render_handle = render.begin_pass(Colour::BLACK);
35
36        self.text_mat
37            .add_instance(vec2! { 0.0 }, Colour::WHITE, &render_handle);
38        self.text_mat.add_instance_with_rotation(
39            Vec2 { x: 100.0, y: 0.0 },
40            Colour::WHITE,
41            45.0,
42            &render_handle,
43        );
44
45        self.text_mat.draw(&mut render_handle);
46    }
examples/camera.rs (line 63)
47    fn render<'o>(&'o mut self, mut render: RenderHandle<'o>) {
48        let mut render_handle = render.begin_pass(Colour::BLACK);
49
50        self.material.add_rectangle(
51            Vec2 { x: 0.0, y: 0.0 },
52            Vec2 { x: 300.0, y: 300.0 },
53            Colour::WHITE,
54            &render_handle,
55        );
56
57        self.camera.set_active(&mut render_handle);
58        self.material.draw(&mut render_handle);
59
60        render_handle.reset_camera();
61        self.text
62            .add_instance(vec2!(0.0), Colour::WHITE, &render_handle);
63        self.text.draw(&mut render_handle);
64    }

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,