The following example demonstrates the implementation of a new triangle Actor type.
File: triangle_actor.h
#ifndef CLUTTER_TUTORIAL_TRIANGLE_ACTOR_H #define CLUTTER_TUTORIAL_TRIANGLE_ACTOR_H #include <cluttermm.h> namespace Tutorial { class Triangle : public Clutter::Actor { public: static Glib::RefPtr<Triangle> create(); static Glib::RefPtr<Triangle> create(const Clutter::Color& color); virtual ~Triangle(); void set_color(const Clutter::Color& color); Clutter::Color get_color() const; protected: Triangle(); explicit Triangle(const Clutter::Color& color); virtual void on_paint(); virtual void pick_vfunc(const Clutter::Color& color); private: Clutter::Color color_; void do_triangle_paint(const CoglColor* color); }; } // namespace Tutorial #endif /* !CLUTTER_TUTORIAL_TRIANGLE_ACTOR */
File: main.cc
#include "triangle_actor.h" #include <cluttermm.h> int main(int argc, char** argv) { Clutter::init(&argc, &argv); // Get the stage and set its size and color: Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default(); stage->set_size(200, 200); stage->set_color(Clutter::Color(0x00, 0x00, 0x00, 0xFF)); // black // Add our custom actor to the stage: Glib::RefPtr<Tutorial::Triangle> actor = Tutorial::Triangle::create(Clutter::Color(0xFF, 0xFF, 0xFF, 0x99)); actor->set_size(100, 100); actor->set_position(20, 20); stage->add_actor(actor); actor->show(); // Show the stage: stage->show(); // Start the main loop, so we can respond to events: Clutter::main(); return 0; }
File: triangle_actor.cc
#include "triangle_actor.h" #include <cogl/cogl.h> namespace Tutorial { Glib::RefPtr<Triangle> Triangle::create() { return Glib::RefPtr<Triangle>(new Triangle()); } Glib::RefPtr<Triangle> Triangle::create(const Clutter::Color& color) { return Glib::RefPtr<Triangle>(new Triangle(color)); } Triangle::Triangle() : color_ (0xFF, 0xFF, 0xFF, 0xFF) {} Triangle::Triangle(const Clutter::Color& color) : color_ (color) {} Triangle::~Triangle() {} void Triangle::do_triangle_paint(const CoglColor* color) { const Clutter::Geometry geom = get_geometry(); cogl_push_matrix(); cogl_set_source_color(color); Cogl::Fixed coords[6]; // Paint a triangle. The parent paint call will have translated us into // position so paint from 0, 0. coords[0] = COGL_FIXED_FROM_INT(0); coords[1] = COGL_FIXED_FROM_INT(0); coords[2] = COGL_FIXED_FROM_INT(0); coords[3] = COGL_FIXED_FROM_INT(geom.get_height()); coords[4] = COGL_FIXED_FROM_INT(geom.get_width()); coords[5] = coords[3]; cogl_path_polygon((float*)coords, G_N_ELEMENTS(coords) / 2); cogl_path_fill(); cogl_pop_matrix(); } void Triangle::on_paint() { CoglColor coglcolor; // Paint the triangle with the actor's color: cogl_color_set_from_4ub(&coglcolor, color_.get_red(), color_.get_green(), color_.get_blue(), get_opacity()); do_triangle_paint(&coglcolor); } void Triangle::pick_vfunc(const Clutter::Color& color) { // Paint the triangle with the pick color, offscreen. // This is used by Clutter to detect the actor under the cursor // by identifying the unique color under the cursor. CoglColor coglcolor; cogl_color_set_from_4ub(&coglcolor, color.get_red(), color.get_green(), color.get_blue(), color.get_alpha()); do_triangle_paint(&coglcolor); } /** * Tutorial::Triangle::get_color: * * @returns the color of the triangle. */ Clutter::Color Triangle::get_color() const { return color_; } /** * Tutorial::Triangle::set_color: * @color: a Clutter::Color * * Sets the color of the triangle. */ void Triangle::set_color(const Clutter::Color& color) { color_ = color; set_opacity(color_.get_alpha()); if(is_visible()) queue_redraw(); } } // namespace Tutorial