Skip to main content

cat_engine/graphics/
base.rs

1use crate::{
2    Colour,
3    text::{
4        OutlinedGlyph,
5        TexturedGlyph,
6    },
7    texture::Texture,
8};
9
10#[cfg(feature="colour_filter")]
11use crate::graphics::ColourFilter;
12
13use super::two_dimensions::{
14    Vertex2D,
15    TexturedVertex2D,
16    Graphics2D
17};
18
19#[cfg(feature="3D")]
20use super::three_dimensions::Graphics3D;
21
22use super::{DependentObject,ObjectType,DrawType};
23
24use glium::{
25    Frame,
26    DrawParameters,
27    DrawError,
28    Surface,
29};
30
31
32
33
34
35/// Простой интерфейс для связи кадра и графических функций.
36/// Simple interface to connect graphics fuctions to the frame.
37pub struct Graphics<'g,'p,'f,S:Surface>{
38    pub graphics2d:&'g Graphics2D,
39
40    pub draw_parameters:DrawParameters<'p>,
41
42    pub frame:&'f mut S,
43}
44
45
46
47
48
49impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
50    #[inline(always)]
51    pub (crate) fn new(
52        graphics2d:&'g Graphics2D,
53        draw_parameters:DrawParameters<'p>,
54        frame:&'f mut S
55    )->Graphics<'g,'p,'f,S>{
56        Self{
57            graphics2d,
58            draw_parameters,
59            frame
60        }
61    }
62
63    /// Заполняет окно данным цветом.
64    /// 
65    /// Fills a window with the given colour.
66    #[inline(always)]
67    pub fn clear_colour(&mut self,[r,g,b,a]:[f32;4]){
68        self.frame.clear_color(r,g,b,a)
69    }
70
71    /// Рисует сохранённый объект.
72    /// 
73    /// Draws an object.
74    #[cfg(any(feature="simple_graphics",feature="texture_graphics",feature="text_graphics"))]
75    pub fn draw_object(
76        &mut self,
77        index:usize,
78        object_type:ObjectType,
79        draw_type:DrawType,
80        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
81    )->Result<(),DrawError>{
82        match object_type{
83            #[cfg(feature="simple_graphics")]
84            ObjectType::Simple=>{
85                match draw_type{
86                    DrawType::Common=>self.draw_simple_object(
87                        index,
88                        #[cfg(feature="colour_filter")]colour_filter,
89                    ),
90
91                    DrawType::Shifting(shift)=>self.draw_shift_simple_object(
92                        index,
93                        shift,
94                        #[cfg(feature="colour_filter")]colour_filter,
95                    ),
96
97                    DrawType::Rotating((angle,position))=>self.draw_rotate_simple_object(
98                        index,
99                        position,
100                        angle,
101                        #[cfg(feature="colour_filter")]colour_filter,
102                    ),
103                }
104            }
105
106            #[cfg(feature="texture_graphics")]
107            ObjectType::Textured=>{
108                match draw_type{
109                    DrawType::Common=>self.draw_textured_object(
110                        index,
111                        #[cfg(feature="colour_filter")]colour_filter,
112                    ),
113
114                    DrawType::Shifting(shift)=>self.draw_shift_textured_object(
115                        index,
116                        shift,
117                        #[cfg(feature="colour_filter")]colour_filter,
118                    ),
119
120                    DrawType::Rotating((angle,position))=>self.draw_rotate_textured_object(
121                        index,
122                        position,
123                        angle,
124                        #[cfg(feature="colour_filter")]colour_filter,
125                    )
126                }
127            }
128
129            #[cfg(feature="text_graphics")]
130            ObjectType::Text=>{
131                match draw_type{
132                    DrawType::Common=>self.draw_text_object(
133                        index,
134                        #[cfg(feature="colour_filter")]colour_filter
135                    ),
136
137                    DrawType::Shifting(shift)=>self.draw_shift_text_object(
138                        index,
139                        shift,
140                        #[cfg(feature="colour_filter")]colour_filter
141                    ),
142
143                    DrawType::Rotating((angle,position))=>self.draw_rotate_text_object(
144                        index,
145                        position,
146                        angle,
147                        #[cfg(feature="colour_filter")]colour_filter
148                    ),
149                }
150            }
151
152            #[cfg(not(all(feature="simple_graphics",feature="texture_graphics",feature="text_graphics")))]
153            _=>Ok(())
154        }
155    }
156}
157
158
159
160
161
162/// # Функции для работы с простыми объектами. Functions to work with simple objects.
163#[cfg(feature="simple_graphics")]
164impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
165    /// Рисует простой объект.
166    /// 
167    /// Draws a simple object.
168    #[inline(always)]
169    pub fn draw_simple<O,V,I>(
170        &mut self,
171        object:&O,
172        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
173        
174    )->Result<(),DrawError>
175        where
176            O:DependentObject<
177                Vertex2D,
178                u8,
179                Vertices=V,
180                Indices=I
181            >,
182            V:AsRef<[Vertex2D]>,
183            I:AsRef<[u8]>
184    {
185        self.graphics2d.simple.draw(
186            object,
187            #[cfg(feature="colour_filter")]colour_filter,
188            &self.draw_parameters,
189            self.frame
190        )
191    }
192
193    /// Рисует сдвинутый простой объект.
194    /// 
195    /// Draws a shifted simple object.
196    #[inline(always)]
197    pub fn draw_shift_simple<O,V,I>(
198        &mut self,
199        object:&O,
200        shift:[f32;2],
201        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
202    )->Result<(),DrawError>
203        where
204            O:DependentObject<
205                Vertex2D,
206                u8,
207                Vertices=V,
208                Indices=I
209            >,
210            V:AsRef<[Vertex2D]>,
211            I:AsRef<[u8]>
212    {
213        self.graphics2d.simple.draw_shift(
214            object,
215            shift,
216            #[cfg(feature="colour_filter")]colour_filter,
217            &self.draw_parameters,
218            self.frame
219        )
220    }
221
222    /// Рисует повёрнутый простой объект.
223    /// 
224    /// Draws a rotated simple object.
225    #[inline(always)]
226    pub fn draw_rotate_simple<O,V,I>(
227        &mut self,
228        object:&O,
229        rotation_center:[f32;2],
230        angle:f32,
231        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
232        
233    )->Result<(),DrawError>
234        where
235            O:DependentObject<
236                Vertex2D,
237                u8,
238                Vertices=V,
239                Indices=I
240            >,
241            V:AsRef<[Vertex2D]>,
242            I:AsRef<[u8]>
243    {
244        self.graphics2d.simple.draw_rotate(
245            object,
246            rotation_center,
247            angle,
248            #[cfg(feature="colour_filter")]colour_filter,
249            &self.draw_parameters,
250            self.frame
251        )
252    }
253
254    /// Рисует простой объект.
255    /// 
256    /// Draws a simple object.
257    #[inline(always)]
258    pub fn draw_simple_general<O,V,I>(
259        &mut self,
260        object:&O,
261        draw_type:DrawType,
262        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
263    )->Result<(),DrawError>
264        where
265            O:DependentObject<
266                Vertex2D,
267                u8,
268                Vertices=V,
269                Indices=I
270            >,
271            V:AsRef<[Vertex2D]>,
272            I:AsRef<[u8]>
273    {
274        match draw_type{
275            DrawType::Common=>self.graphics2d.simple.draw(
276                object,
277                #[cfg(feature="colour_filter")]colour_filter,
278                &self.draw_parameters,
279                self.frame
280            ),
281
282            DrawType::Shifting(shift)=>self.graphics2d.simple.draw_shift(
283                object,
284                shift,
285                #[cfg(feature="colour_filter")]colour_filter,
286                &self.draw_parameters,
287                self.frame
288            ),
289
290            DrawType::Rotating((angle,position))=>self.graphics2d.simple.draw_rotate(
291                object,
292                position,
293                angle,
294                #[cfg(feature="colour_filter")]colour_filter,
295                &self.draw_parameters,
296                self.frame
297            ),
298        }
299    }
300}
301
302
303
304/// # Функции для отрисовки текстур. Texture rendering functions.
305#[cfg(feature="texture_graphics")]
306impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
307    /// Рисует изображение.
308    /// 
309    /// Draws a texture.
310    #[inline(always)]
311    pub fn draw_texture<O,V,I>(
312        &mut self,
313        base:&O,
314        texture:&Texture,
315        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
316    )->Result<(),DrawError>
317        where
318            O:DependentObject<
319                TexturedVertex2D,
320                u8,
321                Vertices=V,
322                Indices=I
323            >,
324            V:AsRef<[TexturedVertex2D]>,
325            I:AsRef<[u8]>
326    {
327        self.graphics2d.texture.draw(
328            base,
329            texture,
330            #[cfg(feature="colour_filter")]colour_filter,
331            &self.draw_parameters,
332            self.frame
333        )
334    }
335
336    /// Рисует сдвинутую текстуру.
337    /// 
338    /// Draws a shifted texture.
339    #[inline(always)]
340    pub fn draw_shift_texture<O,V,I>(
341        &mut self,
342        base:&O,
343        texture:&Texture,
344        shift:[f32;2],
345        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
346    )->Result<(),DrawError>
347        where
348            O:DependentObject<
349                TexturedVertex2D,
350                u8,
351                Vertices=V,
352                Indices=I
353            >,
354            V:AsRef<[TexturedVertex2D]>,
355            I:AsRef<[u8]>
356    {
357        self.graphics2d.texture.draw_shift(
358            base,
359            texture,
360            shift,
361            #[cfg(feature="colour_filter")]colour_filter,
362            &self.draw_parameters,
363            self.frame
364        )
365    }
366
367    /// Рисует повёрнутую текстуру.
368    /// 
369    /// Draws a rotated texture.
370    /// 
371    /// angle - radians
372    #[inline(always)]
373    pub fn draw_rotate_texture<O,V,I>(
374        &mut self,
375        base:&O,
376        texture:&Texture,
377        rotation_center:[f32;2],
378        angle:f32,
379        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
380    )->Result<(),DrawError>
381        where
382            O:DependentObject<
383                TexturedVertex2D,
384                u8,
385                Vertices=V,
386                Indices=I
387            >,
388            V:AsRef<[TexturedVertex2D]>,
389            I:AsRef<[u8]>
390    {
391        self.graphics2d.texture.draw_rotate(
392            base,
393            texture,
394            rotation_center,
395            angle,
396            #[cfg(feature="colour_filter")]colour_filter,
397            &self.draw_parameters,
398            self.frame,
399        )
400    }
401
402    /// Рисует текстуру.
403    /// 
404    /// Draws a texture.
405    #[inline(always)]
406    pub fn draw_texture_general<O,V,I>(
407        &mut self,
408        base:&O,
409        texture:&Texture,
410        draw_type:DrawType,
411        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
412    )->Result<(),DrawError>
413        where
414            O:DependentObject<
415                TexturedVertex2D,
416                u8,
417                Vertices=V,
418                Indices=I
419            >,
420            V:AsRef<[TexturedVertex2D]>,
421            I:AsRef<[u8]>
422    {
423        match draw_type{
424            DrawType::Common=>self.graphics2d.texture.draw(
425                base,
426                texture,
427                #[cfg(feature="colour_filter")]colour_filter,
428                &self.draw_parameters,
429                self.frame
430            ),
431
432            DrawType::Shifting(shift)=>self.graphics2d.texture.draw_shift(
433                base,
434                texture,
435                shift,
436                #[cfg(feature="colour_filter")]colour_filter,
437                &self.draw_parameters,
438                self.frame
439            ),
440
441            DrawType::Rotating((angle,position))=>self.graphics2d.texture.draw_rotate(
442                base,
443                texture,
444                position,
445                angle,
446                #[cfg(feature="colour_filter")]colour_filter,
447                &self.draw_parameters,
448                self.frame
449            )
450        }
451    }
452}
453
454
455
456/// # Фукнции для отрисовки глифов. Glyph rendering functions.
457#[cfg(feature="text_graphics")]
458impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
459    /// Строит и выводит глиф.
460    /// 
461    /// Builds and draws a glyph.
462    #[inline(always)]
463    pub fn draw_glyph(
464        &mut self,
465        glyph:&OutlinedGlyph,
466        colour:Colour,
467        [x,y]:[f32;2],
468        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
469    )->Result<(),DrawError>{
470        // Отрисовывает глиф на текстуру
471        self.graphics2d.text.write_glyph(glyph);
472
473        // Получение размера глифа
474        let [w,h]=glyph.size();
475        let [w,h]=[w as f32,h as f32];
476
477
478        // Получение размера текстуры
479        let [tw,th]=self.graphics2d.text.texture_size();
480
481        // Получение относительного размера глифа
482        let uv=[
483            w/tw,
484            h/th
485        ];
486
487        // Строит вершины и загружает их в буфер
488        self.graphics2d.text.write_vertices(
489            [x,y,w,h],
490            uv
491        );
492
493        let texture=self.graphics2d.text.texture();
494
495        self.graphics2d.text.draw_glyph(
496            texture,
497            colour,
498            #[cfg(feature="colour_filter")]colour_filter,
499            &self.draw_parameters,
500            self.frame
501        )
502    }
503
504    /// Строит и выводит сдвинутый глиф.
505    /// 
506    /// Builds and draws a shifted glyph.
507    #[inline(always)]
508    pub fn draw_shift_glyph(
509        &mut self,
510        glyph:&OutlinedGlyph,
511        colour:Colour,
512        [x,y]:[f32;2],
513        shift:[f32;2],
514        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
515    )->Result<(),DrawError>{
516        // Отрисовывает глиф на текстуру
517        self.graphics2d.text.write_glyph(glyph);
518
519        // Получение размера глифа
520        let [w,h]=glyph.size();
521        let [w,h]=[w as f32,h as f32];
522
523        // Получение размера текстуры
524        let [tw,th]=self.graphics2d.text.texture_size();
525
526        // Получение относительного размера глифа
527        let uv=[
528            w/tw,
529            h/th
530        ];
531
532        // Строит вершины и загружает их в буфер
533        self.graphics2d.text.write_vertices(
534            [x,y,w,h],
535            uv
536        );
537
538        let texture=self.graphics2d.text.texture();
539
540        self.graphics2d.text.draw_shift_glyph(
541            texture,
542            colour,
543            shift,
544            #[cfg(feature="colour_filter")]colour_filter,
545            &self.draw_parameters,
546            self.frame
547        )
548    }
549
550    /// Строит и выводит повёрнутый глиф.
551    /// 
552    /// Builds and draws a rotated glyph.
553    #[inline(always)]
554    pub fn draw_rotate_glyph(
555        &mut self,
556        glyph:&OutlinedGlyph,
557        colour:Colour,
558        [x,y]:[f32;2],
559        rotation_center:[f32;2],
560        angle:f32,
561        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
562    )->Result<(),DrawError>{
563        // Отрисовывает глиф на текстуру
564        self.graphics2d.text.write_glyph(glyph);
565
566        // Получение размера глифа
567        let [w,h]=glyph.size();
568        let [w,h]=[w as f32,h as f32];
569
570        // Получение размера текстуры
571        let [tw,th]=self.graphics2d.text.texture_size();
572
573        // Получение относительного размера глифа
574        let uv=[
575            w/tw,
576            h/th
577        ];
578
579        // Строит вершины и загружает их в буфер
580        self.graphics2d.text.write_vertices(
581            [x,y,w,h],
582            uv
583        );
584
585        let texture=self.graphics2d.text.texture();
586
587        self.graphics2d.text.draw_rotate_glyph(
588            texture,
589            colour,
590            rotation_center,
591            angle,
592            #[cfg(feature="colour_filter")]colour_filter,
593            &self.draw_parameters,
594            self.frame
595        )
596    }
597
598    /// Выводит уже построенный глиф.
599    /// 
600    /// Draws an already built glyph.
601    #[inline(always)]
602    pub fn draw_glyph_cache(
603        &mut self,
604        glyph:&TexturedGlyph,
605        colour:Colour,
606        [x,y]:[f32;2],
607        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
608    )->Result<(),DrawError>{
609        let size=glyph.size();
610        // Строит вершины и загружает их в буфер
611        self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
612
613        self.graphics2d.text.draw_glyph(
614            glyph.texture(),
615            colour,
616            #[cfg(feature="colour_filter")]colour_filter,
617            &self.draw_parameters,
618            self.frame
619        )
620    }
621
622    /// Выводит сдвинутый уже построенный глиф.
623    /// 
624    /// Draws a shifted already built glyph.
625    #[inline(always)]
626    pub fn draw_shift_glyph_cache(
627        &mut self,
628        glyph:&TexturedGlyph,
629        colour:Colour,
630        [x,y]:[f32;2],
631        shift:[f32;2],
632        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
633    )->Result<(),DrawError>{
634        let size=glyph.size();
635        // Строит вершины и загружает их в буфер
636        self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
637
638        self.graphics2d.text.draw_shift_glyph(
639            glyph.texture(),
640            colour,
641            shift,
642            #[cfg(feature="colour_filter")]colour_filter,
643            &self.draw_parameters,
644            self.frame
645        )
646    }
647
648    /// Выводит повёрнутый уже построенный глиф.
649    /// 
650    /// Draws a rotated already built glyph.
651    #[inline(always)]
652    pub fn draw_rotate_glyph_cache(
653        &mut self,
654        glyph:&TexturedGlyph,
655        colour:Colour,
656        [x,y]:[f32;2],
657        rotation_center:[f32;2],
658        angle:f32,
659        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
660    )->Result<(),DrawError>{
661        let size=glyph.size();
662        // Строит вершины и загружает их в буфер
663        self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
664
665        self.graphics2d.text.draw_rotate_glyph(
666            glyph.texture(),
667            colour,
668            rotation_center,
669            angle,
670            #[cfg(feature="colour_filter")]colour_filter,
671            &self.draw_parameters,
672            self.frame
673        )
674    }
675
676    /// Выводит уже построенный глиф.
677    /// 
678    /// Draws a already built glyph.
679    pub fn draw_glyph_cache_general(
680        &mut self,
681        glyph:&TexturedGlyph,
682        colour:Colour,
683        [x,y]:[f32;2],
684        draw_type:DrawType,
685        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
686    )->Result<(),DrawError>{
687        let size=glyph.size();
688        // Строит вершины и загружает их в буфер
689        self.graphics2d.text.write_vertices([x,y,size[0],size[1]],[1f32,1f32]);
690
691        match draw_type{
692            DrawType::Common=>self.graphics2d.text.draw_glyph(
693                glyph.texture(),
694                colour,
695                #[cfg(feature="colour_filter")]colour_filter,
696                &self.draw_parameters,
697                self.frame
698            ),
699
700            DrawType::Shifting(shift)=>self.graphics2d.text.draw_shift_glyph(
701                glyph.texture(),
702                colour,
703                shift,
704                #[cfg(feature="colour_filter")]colour_filter,
705                &self.draw_parameters,
706                self.frame
707            ),
708
709            DrawType::Rotating((angle,position))=>self.graphics2d.text.draw_rotate_glyph(
710                glyph.texture(),
711                colour,
712                position,
713                angle,
714                #[cfg(feature="colour_filter")]colour_filter,
715                &self.draw_parameters,
716                self.frame
717            ),
718        }
719    }
720}
721
722
723
724
725
726/// # Функции для работы с сохранёнными простыми объектами. Functions to work with saved simple objects.
727#[cfg(feature="simple_graphics")]
728impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
729    /// Рисует простой объект.
730    /// 
731    /// Draws the saved simple object.
732    #[inline(always)]
733    pub fn draw_simple_object(
734        &mut self,
735        index:usize,
736        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
737        
738    )->Result<(),DrawError>{
739        self.graphics2d.simple.draw_object(
740            index,
741            #[cfg(feature="colour_filter")]colour_filter,
742            &self.draw_parameters,
743            self.frame
744        )
745    }
746
747    /// Рисует сдвинутый простой объект.
748    /// 
749    /// Draws the shifted saved simple object.
750    #[inline(always)]
751    pub fn draw_shift_simple_object(
752        &mut self,
753        index:usize,
754        shift:[f32;2],
755        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
756        
757    )->Result<(),DrawError>{
758        self.graphics2d.simple.draw_shift_object(
759            index,
760            shift,
761            #[cfg(feature="colour_filter")]colour_filter,
762            &self.draw_parameters,
763            self.frame
764        )
765    }
766
767    /// Рисует повёрнутый простой объект.
768    /// 
769    /// Draws the rotated saved simple object.
770    #[inline(always)]
771    pub fn draw_rotate_simple_object(
772        &mut self,
773        index:usize,
774        rotation_center:[f32;2],
775        angle:f32,
776        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
777        
778    )->Result<(),DrawError>{
779        self.graphics2d.simple.draw_rotate_object(
780            index,
781            rotation_center,
782            angle,
783            #[cfg(feature="colour_filter")]colour_filter,
784            &self.draw_parameters,
785            self.frame
786        )
787    }
788
789    /// Рисует простой объект.
790    /// 
791    /// Draws the saved simple object.
792    #[inline(always)]
793    pub fn draw_simple_object_general(
794        &mut self,
795        index:usize,
796        draw_type:DrawType,
797        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
798    )->Result<(),DrawError>{
799        match draw_type{
800            DrawType::Common=>self.draw_simple_object(
801                index,
802                #[cfg(feature="colour_filter")]colour_filter,
803            ),
804
805            DrawType::Shifting(shift)=>self.draw_shift_simple_object(
806                index,
807                shift,
808                #[cfg(feature="colour_filter")]colour_filter,
809            ),
810
811            DrawType::Rotating((angle,position))=>self.draw_rotate_simple_object(
812                index,
813                position,
814                angle,
815                #[cfg(feature="colour_filter")]colour_filter,
816            ),
817        }
818    }
819}
820
821
822
823/// # Функции для работы с сохранёнными текстурными объектами. Functions to work with saved textured objects.
824#[cfg(feature="texture_graphics")]
825impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
826    /// Рисует сохранённый текстурный объект.
827    /// 
828    /// Draws a saved textured object.
829    #[inline(always)]
830    pub fn draw_textured_object(
831        &mut self,
832        index:usize,
833        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
834    )->Result<(),DrawError>{
835        self.graphics2d.texture.draw_object(
836            index,
837            #[cfg(feature="colour_filter")]colour_filter,
838            &self.draw_parameters,
839            self.frame,
840        )
841    }
842
843    /// Рисует сдвинутый сохранённый текстурный объект.
844    /// 
845    /// Draws a shifted saved textured object.
846    #[inline(always)]
847    pub fn draw_shift_textured_object(
848        &mut self,
849        index:usize,
850        shift:[f32;2],
851        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
852    )->Result<(),DrawError>{
853        self.graphics2d.texture.draw_shift_object(
854            index,
855            shift,
856            #[cfg(feature="colour_filter")]colour_filter,
857            &self.draw_parameters,
858            self.frame
859        )
860    }
861
862    /// Рисует повёрнутый сохранённый текстурный объект.
863    /// 
864    /// Draws a rotated saved textured object.
865    /// 
866    /// rotation_center - [x, y]
867    /// angle - radians
868    #[inline(always)]
869    pub fn draw_rotate_textured_object(
870        &mut self,
871        index:usize,
872        rotation_center:[f32;2],
873        angle:f32,
874        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
875    )->Result<(),DrawError>{
876        self.graphics2d.texture.draw_rotate_object(
877            index,
878            rotation_center,
879            angle,
880            #[cfg(feature="colour_filter")]colour_filter,
881            &self.draw_parameters,
882            self.frame
883        )
884    }
885
886    /// Рисует текстурный объект.
887    /// 
888    /// Draws a textured object.
889    #[inline(always)]
890    pub fn draw_textured_object_general(
891        &mut self,
892        index:usize,
893        draw_type:DrawType,
894        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
895    )->Result<(),DrawError>{
896        match draw_type{
897            DrawType::Common=>self.draw_textured_object(
898                index,
899                #[cfg(feature="colour_filter")]colour_filter,
900            ),
901
902            DrawType::Shifting(shift)=>self.draw_shift_textured_object(
903                index,
904                shift,
905                #[cfg(feature="colour_filter")]colour_filter,
906            ),
907
908            DrawType::Rotating((angle,position))=>self.draw_rotate_textured_object(
909                index,
910                position,
911                angle,
912                #[cfg(feature="colour_filter")]colour_filter,
913            )
914        }
915    }
916}
917
918
919
920/// # Функции для работы с сохранёнными текстовыми объектами. Functions to work with saved text objects.
921#[cfg(feature="text_graphics")]
922impl<'g,'p,'f,S:Surface> Graphics<'g,'p,'f,S>{
923    /// Рисует сохранённый текстовой объект.
924    /// 
925    /// Draws a saved text object.
926    #[inline(always)]
927    pub fn draw_text_object(
928        &mut self,
929        index:usize,
930        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
931        
932    )->Result<(),DrawError>{
933        self.graphics2d.text.draw_object(
934            index,
935            #[cfg(feature="colour_filter")]colour_filter,
936            &self.draw_parameters,
937            self.frame,
938        )
939    }
940
941    /// Рисует сохранённый текстовой объект.
942    /// 
943    /// Draws a saved text object.
944    #[inline(always)]
945    pub fn draw_shift_text_object(
946        &mut self,
947        index:usize,
948        shift:[f32;2],
949        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
950    )->Result<(),DrawError>{
951        self.graphics2d.text.draw_shift_object(
952            index,
953            shift,
954            #[cfg(feature="colour_filter")]colour_filter,
955            &self.draw_parameters,
956            self.frame,
957        )
958    }
959
960    /// Рисует сохранённый текстовой объект.
961    /// 
962    /// Draws a saved text object.
963    #[inline(always)]
964    pub fn draw_rotate_text_object(
965        &mut self,
966        index:usize,
967        rotation_center:[f32;2],
968        angle:f32,
969        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
970    )->Result<(),DrawError>{
971        self.graphics2d.text.draw_rotate_object(
972            index,
973            rotation_center,
974            angle,
975            #[cfg(feature="colour_filter")]colour_filter,
976            &self.draw_parameters,
977            self.frame,
978        )
979    }
980
981    /// Рисует сохранённый текстовой объект.
982    /// 
983    /// Draws a saved text object.
984    pub fn draw_text_object_general(
985        &mut self,
986        index:usize,
987        draw_type:DrawType,
988        #[cfg(feature="colour_filter")]colour_filter:ColourFilter,
989    )->Result<(),DrawError>{
990        match draw_type{
991            DrawType::Common=>self.draw_text_object(
992                index,
993                #[cfg(feature="colour_filter")]colour_filter,
994            ),
995
996            DrawType::Shifting(shift)=>self.draw_shift_text_object(
997                index,
998                shift,
999                #[cfg(feature="colour_filter")]colour_filter,
1000            ),
1001
1002            DrawType::Rotating((angle,position))=>self.draw_rotate_text_object(
1003                index,
1004                position,
1005                angle,
1006                #[cfg(feature="colour_filter")]colour_filter,
1007            ),
1008        }
1009    }
1010}