<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>gtkglextmm: shapes.h</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.4 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="examples.html">Examples</a></div> <h1>shapes.h</h1>Geometric object rendering example.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span> <span class="comment">/*</span> <span class="comment"> * shapes.h:</span> <span class="comment"> * shapes demo.</span> <span class="comment"> *</span> <span class="comment"> * written by Naofumi Yasufuku <naofumi@users.sourceforge.net></span> <span class="comment"> */</span> <span class="preprocessor">#ifndef _SHAPES_H</span> <span class="preprocessor"></span><span class="preprocessor">#define _SHAPES_H</span> <span class="preprocessor"></span> <span class="preprocessor">#include <gtkmm.h></span> <span class="preprocessor">#include <<a class="code" href="gtkglmm_8h.html">gtkglmm.h</a>></span> <span class="comment">//</span> <span class="comment">// Shapes classes.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">namespace </span>Shapes { <span class="keyword">class </span>Scene; <span class="comment">//</span> <span class="comment">// View class.</span> <span class="comment">//</span> <span class="keyword">class </span>View : <span class="keyword">public</span> sigc::trackable { <span class="keyword">friend</span> <span class="keyword">class </span>Scene; <span class="keyword">public</span>: <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> NEAR_CLIP; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> FAR_CLIP; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_POS_X; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_POS_Y; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_POS_Z; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_AXIS_X; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_AXIS_Y; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_AXIS_Z; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_ANGLE; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> INIT_SCALE; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> SCALE_MAX; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> SCALE_MIN; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> ANIMATE_THRESHOLD; <span class="keyword">public</span>: View(); <span class="keyword">virtual</span> ~View(); <span class="keyword">public</span>: <span class="keywordtype">void</span> frustum(<span class="keywordtype">int</span> w, <span class="keywordtype">int</span> h); <span class="keywordtype">void</span> xform(); <span class="keywordtype">void</span> reset(); <span class="keywordtype">void</span> set_pos(<span class="keywordtype">float</span> x, <span class="keywordtype">float</span> y, <span class="keywordtype">float</span> z) { m_Pos[0] = x; m_Pos[1] = y; m_Pos[2] = z; } <span class="keywordtype">void</span> set_quat(<span class="keywordtype">float</span> q0, <span class="keywordtype">float</span> q1, <span class="keywordtype">float</span> q2, <span class="keywordtype">float</span> q3) { m_Quat[0] = q0; m_Quat[1] = q1; m_Quat[2] = q2; m_Quat[3] = q3; } <span class="keywordtype">void</span> set_scale(<span class="keywordtype">float</span> scale) { m_Scale = scale; } <span class="keywordtype">void</span> enable_animation(); <span class="keywordtype">void</span> disable_animation(); <span class="keywordtype">bool</span> is_animate()<span class="keyword"> const</span> <span class="keyword"> </span>{ <span class="keywordflow">return</span> m_Animate; } <span class="keyword">protected</span>: <span class="comment">// Signal handlers:</span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_button_press_event(GdkEventButton* event, Scene* scene); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_button_release_event(GdkEventButton* event, Scene* scene); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_motion_notify_event(GdkEventMotion* event, Scene* scene); <span class="keyword">private</span>: <span class="keywordtype">float</span> m_Pos[3]; <span class="keywordtype">float</span> m_Quat[4]; <span class="keywordtype">float</span> m_Scale; <span class="keywordtype">float</span> m_QuatDiff[4]; <span class="keywordtype">float</span> m_BeginX; <span class="keywordtype">float</span> m_BeginY; <span class="keywordtype">float</span> m_DX; <span class="keywordtype">float</span> m_DY; <span class="keywordtype">bool</span> m_Animate; }; <span class="comment">//</span> <span class="comment">// Model class.</span> <span class="comment">//</span> <span class="keyword">class </span>Model { <span class="keyword">friend</span> <span class="keyword">class </span>Scene; <span class="keyword">public</span>: <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> NUM_SHAPES; <span class="keyword">enum</span> ShapeType { CUBE, SPHERE, CONE, TORUS, TETRAHEDRON, OCTAHEDRON, DODECAHEDRON, ICOSAHEDRON, TEAPOT, }; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_CUBE; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_SPHERE; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_CONE; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_TORUS; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_TETRAHEDRON; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_OCTAHEDRON; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_DODECAHEDRON; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_ICOSAHEDRON; <span class="keyword">static</span> <span class="keyword">const</span> ShapeType SHAPE_TEAPOT; <span class="keyword">public</span>: <span class="keyword">struct </span>MaterialProp { GLfloat ambient[4]; GLfloat diffuse[4]; GLfloat specular[4]; GLfloat shininess; }; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_EMERALD; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_JADE; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_OBSIDIAN; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_PEARL; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_RUBY; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_TURQUOISE; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_BRASS; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_BRONZE; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_CHROME; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_COPPER; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_GOLD; <span class="keyword">static</span> <span class="keyword">const</span> MaterialProp MAT_SILVER; <span class="keyword">public</span>: Model(); <span class="keyword">virtual</span> ~Model(); <span class="keyword">private</span>: <span class="keywordtype">void</span> init_gl(Glib::RefPtr<Gdk::GL::Drawable>& gldrawable); <span class="keyword">public</span>: <span class="keywordtype">void</span> draw(Glib::RefPtr<Gdk::GL::Drawable>& gldrawable); <span class="keywordtype">void</span> set_shape(ShapeType shape) { m_CurrentShape = shape; } <span class="keywordtype">void</span> set_material(<span class="keyword">const</span> MaterialProp* material) { m_CurrentMat = material; } <span class="keyword">private</span>: <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_ListBase; ShapeType m_CurrentShape; <span class="keyword">const</span> MaterialProp* m_CurrentMat; }; <span class="comment">//</span> <span class="comment">// Scene class.</span> <span class="comment">//</span> <span class="keyword">class </span>Scene : <span class="keyword">public</span> Gtk::GL::DrawingArea { <span class="keyword">friend</span> <span class="keyword">class </span>View; <span class="keyword">friend</span> <span class="keyword">class </span>Model; <span class="keyword">public</span>: <span class="comment">// OpenGL scene related constants:</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> CLEAR_COLOR[4]; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> CLEAR_DEPTH; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> LIGHT0_POSITION[4]; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> LIGHT0_AMBIENT[4]; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> LIGHT0_DIFFUSE[4]; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> LIGHT_MODEL_AMBIENT[4]; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> LIGHT_MODEL_LOCAL_VIEWER[1]; <span class="keyword">public</span>: <span class="keyword">explicit</span> Scene(); <span class="keyword">virtual</span> ~Scene(); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_realize(); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_configure_event(GdkEventConfigure* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_expose_event(GdkEventExpose* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_button_press_event(GdkEventButton* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_unmap_event(GdkEventAny* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_visibility_notify_event(GdkEventVisibility* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_idle(); <span class="keyword">public</span>: <span class="comment">// Invalidate whole window.</span> <span class="keywordtype">void</span> invalidate() { get_window()->invalidate_rect(get_allocation(), <span class="keyword">false</span>); } <span class="comment">// Update window synchronously (fast).</span> <span class="keywordtype">void</span> update() { get_window()->process_updates(<span class="keyword">false</span>); } <span class="keyword">protected</span>: <span class="comment">// idle signal connection:</span> sigc::connection m_ConnectionIdle; <span class="keywordtype">void</span> idle_add(); <span class="keywordtype">void</span> idle_remove(); <span class="keyword">protected</span>: <span class="keywordtype">void</span> change_shape(Model::ShapeType shape); <span class="keywordtype">void</span> change_material(<span class="keyword">const</span> Model::MaterialProp* material); <span class="keyword">protected</span>: Gtk::Menu* create_popup_menu(); <span class="keyword">protected</span>: <span class="comment">// Popup menu:</span> Gtk::Menu* m_Menu; <span class="keyword">protected</span>: <span class="comment">// OpenGL scene related objects:</span> View m_View; Model m_Model; }; <span class="comment">//</span> <span class="comment">// Application class.</span> <span class="comment">//</span> <span class="keyword">class </span>Application : <span class="keyword">public</span> Gtk::Window { <span class="keyword">public</span>: <span class="keyword">static</span> <span class="keyword">const</span> Glib::ustring APP_NAME; <span class="keyword">public</span>: Application(); <span class="keyword">virtual</span> ~Application(); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_button_quit_clicked(); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_key_press_event(GdkEventKey* event); <span class="keyword">protected</span>: <span class="comment">// member widgets:</span> Gtk::VBox m_VBox; Scene m_Scene; Gtk::Button m_ButtonQuit; }; } <span class="comment">// namespace Shapes</span> <span class="preprocessor">#endif // _SHAPES_H</span> </pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Feb 27 18:46:52 2006 for gtkglextmm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address> </body> </html>