/* #define TEST_GROUP 1 */ #include #include #include #include typedef struct { gchar *name; gchar *source; } ShaderSource; static ShaderSource shaders[]= { {"brightness-contrast", "uniform float brightness;" "uniform float contrast;" "uniform sampler2DRect pend_s3_tex;" "" "void main()" "{" " vec4 pend_s4_result;" " pend_s4_result = texture2DRect(pend_s3_tex, gl_TexCoord[0].xy);" " pend_s4_result.x = (pend_s4_result.x - 0.5)*contrast + brightness + 0.5;" " pend_s4_result.y = (pend_s4_result.y - 0.5)*contrast + brightness + 0.5;" " pend_s4_result.z = (pend_s4_result.z - 0.5)*contrast + brightness + 0.5;" " gl_FragColor = pend_s4_result;" "}", }, {"box-blur", "uniform float radius ;" "uniform sampler2DRect rectTexture;" "" "void main()" "{" " vec4 color = texture2DRect(rectTexture, gl_TexCoord[0].st);" " float u;" " float v;" " int count = 1;" " for (u=-radius;ubutton.button == 1) { new_no = shader_no-1; } else { new_no = shader_no+1; } if (new_no >= 0 && shaders[new_no].name) { ClutterShader *shader; shader_no = new_no; g_print ("setting shaders[%i] named '%s'\n", shader_no, shaders[shader_no].name); shader = clutter_shader_new_from_strings (NULL, shaders[shader_no].source); clutter_actor_apply_shader (actor, shader); clutter_actor_set_shader_param (actor, "radius", 3.0); clutter_redraw(); } return FALSE; } gint main (gint argc, gchar *argv[]) { ClutterTimeline *timeline; ClutterAlpha *alpha; ClutterActor *actor; ClutterActor *stage; ClutterColor stage_color = { 0x61, 0x64, 0x8c, 0xff }; GdkPixbuf *pixbuf; GError *error; ClutterShader *shader; error = NULL; clutter_init (&argc, &argv); g_print ("applying shaders[%i] named '%s'\n", shader_no, shaders[shader_no].name); shader = clutter_shader_new_from_strings (NULL, shaders[shader_no].source); stage = clutter_stage_get_default (); clutter_actor_set_size (stage, 512, 384); pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL); if (!pixbuf) g_error("pixbuf load failed"); clutter_stage_set_title (CLUTTER_STAGE (stage), "Shader Test"); clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); /* Create a timeline to manage animation */ timeline = clutter_timeline_new (360, 60); /* num frames, fps */ g_object_set (timeline, "loop", TRUE, NULL); /* have it loop */ #ifndef TEST_GROUP actor = clutter_texture_new_from_pixbuf (pixbuf); #else actor = clutter_group_new (); { ClutterActor *child1, *child2, *child3, *child4; ClutterColor color={0xff, 0x22, 0x66, 0x99}; child1 = clutter_texture_new_from_pixbuf (pixbuf); child2 = clutter_texture_new_from_pixbuf (pixbuf); child3 = clutter_rectangle_new (); child4 = clutter_label_new_with_text ("Sans 20px", "Shady stuff"); clutter_rectangle_set_color (child3, &color); clutter_actor_set_size (child3, 50, 50); clutter_actor_set_position (child1, 0, 0); clutter_actor_set_position (child2, 50, 100); clutter_actor_set_position (child3, 30, -30); clutter_actor_set_position (child4, -50, 20); clutter_group_add (CLUTTER_GROUP (actor), child1); clutter_group_add (CLUTTER_GROUP (actor), child2); clutter_group_add (CLUTTER_GROUP (actor), child3); clutter_group_add (CLUTTER_GROUP (actor), child4); clutter_actor_show_all (actor); } #endif clutter_actor_set_position (actor, 100, 100); clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor); clutter_actor_apply_shader (actor, shader); clutter_actor_set_shader_param (actor, "brightness", 0.4); clutter_actor_set_shader_param (actor, "contrast", -1.9); clutter_actor_set_reactive (actor, TRUE); g_signal_connect (actor, "button-release-event", G_CALLBACK (button_release_cb), NULL); /* Show everying ( and map window ) */ clutter_actor_show_all (stage); /* and start it */ clutter_timeline_start (timeline); clutter_main (); return 0; }