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}