animate/legacy/
shader_effect.rs

1use crate::{ActorMeta, Effect, OffscreenEffect, ShaderType};
2use glib::{
3    object as gobject,
4    object::{Cast, IsA},
5    translate::*,
6};
7use std::fmt;
8
9glib_wrapper! {
10    pub struct ShaderEffect(Object<ffi::ClutterShaderEffect, ffi::ClutterShaderEffectClass, ShaderEffectClass>) @extends OffscreenEffect, Effect, ActorMeta, gobject::InitiallyUnowned;
11
12    match fn {
13        get_type => || ffi::clutter_shader_effect_get_type(),
14    }
15}
16
17impl ShaderEffect {
18    /// Creates a new `ShaderEffect`, to be applied to an actor using
19    /// `ActorExt::add_effect`.
20    ///
21    /// The effect will be empty until `ShaderEffectExt::set_shader_source`
22    /// is called.
23    /// ## `shader_type`
24    /// the type of the shader, either `ShaderType::FragmentShader`,
25    ///  or `ShaderType::VertexShader`
26    ///
27    /// # Returns
28    ///
29    /// the newly created `ShaderEffect`.
30    ///  Use `gobject::ObjectExt::unref` when done.
31    pub fn new(shader_type: ShaderType) -> ShaderEffect {
32        unsafe {
33            Effect::from_glib_none(ffi::clutter_shader_effect_new(shader_type.to_glib()))
34                .unsafe_cast()
35        }
36    }
37}
38
39/// Trait containing all `ShaderEffect` methods.
40///
41/// # Implementors
42///
43/// [`ShaderEffect`](struct.ShaderEffect.html)
44pub trait ShaderEffectExt: 'static {
45    //fn get_program(&self) -> /*Unimplemented*/Option<dx::Handle>;
46
47    //fn get_shader(&self) -> /*Unimplemented*/Option<dx::Handle>;
48
49    /// Sets the source of the GLSL shader used by `self`
50    ///
51    /// This function should only be called by implementations of
52    /// the `ShaderEffect` class, and not by application code.
53    ///
54    /// This function can only be called once; subsequent calls will
55    /// yield no result.
56    /// ## `source`
57    /// the source of a GLSL shader
58    ///
59    /// # Returns
60    ///
61    /// `true` if the source was set
62    fn set_shader_source(&self, source: &str) -> bool;
63
64    //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
65
66    /// Sets `value` as the payload for the uniform `name` inside the shader
67    /// effect
68    ///
69    /// The `glib::Type` of the `value` must be one of: `G_TYPE_INT`, for a single
70    /// integer value; `G_TYPE_FLOAT`, for a single floating point value;
71    /// `TYPE_SHADER_INT`, for an array of integer values;
72    /// `TYPE_SHADER_FLOAT`, for an array of floating point values;
73    /// and `TYPE_SHADER_MATRIX`, for a matrix of floating point
74    /// values. It also accepts `G_TYPE_DOUBLE` for compatibility with other
75    /// languages than C.
76    /// ## `name`
77    /// the name of the uniform to set
78    /// ## `value`
79    /// a `gobject::Value` with the value of the uniform to set
80    fn set_uniform_value(&self, name: &str, value: &glib::Value);
81}
82
83impl<O: IsA<ShaderEffect>> ShaderEffectExt for O {
84    //fn get_program(&self) -> /*Unimplemented*/Option<dx::Handle> {
85    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_program() }
86    //}
87
88    //fn get_shader(&self) -> /*Unimplemented*/Option<dx::Handle> {
89    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_get_shader() }
90    //}
91
92    fn set_shader_source(&self, source: &str) -> bool {
93        unsafe {
94            from_glib(ffi::clutter_shader_effect_set_shader_source(
95                self.as_ref().to_glib_none().0,
96                source.to_glib_none().0,
97            ))
98        }
99    }
100
101    //fn set_uniform(&self, name: &str, gtype: glib::types::Type, n_values: usize, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
102    //    unsafe { TODO: call clutter_sys:clutter_shader_effect_set_uniform() }
103    //}
104
105    fn set_uniform_value(&self, name: &str, value: &glib::Value) {
106        unsafe {
107            ffi::clutter_shader_effect_set_uniform_value(
108                self.as_ref().to_glib_none().0,
109                name.to_glib_none().0,
110                value.to_glib_none().0,
111            );
112        }
113    }
114}
115
116impl fmt::Display for ShaderEffect {
117    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
118        write!(f, "ShaderEffect")
119    }
120}