Start e.g.:
../../../bin/vish DisplayListObject.vis
Further tutorial: - VertexBufferObject.cpp - SimpleCoords.cpp - VectorFieldLines.cpp
00001 00002 #include <stdio.h> 00003 00004 #include <ocean/GLvish/VRenderObject.hpp> 00005 #include <ocean/plankton/VCreator.hpp> 00006 #include <ocean/plankton/VTime.hpp> 00007 #include <ocean/GLvish/BoundingBox.hpp> 00008 00009 #include <stdio.h> 00010 00011 using namespace Wizt; 00012 00013 00033 /* 00034 Render object. 00035 */ 00036 class DisplayListObject : public VRenderObject 00037 { 00038 struct MyState : State 00039 { 00040 double complexity; 00041 00042 MyState() 00043 : complexity(0.5) 00044 {} 00045 }; 00046 00047 override RefPtr<State> newState() const 00048 { 00049 return new MyState(); 00050 } 00051 00052 virtual void render(VRenderContext&Context) const; 00053 00054 public: 00055 TypedSlot<double> Complexity; 00056 00057 DisplayListObject(const string&name, int p, const RefPtr<VCreationPreferences>&VP) 00058 : VRenderObject(name, p, VP) 00059 , Complexity(this, "complexity", 0.5) 00060 {} 00061 00062 ~DisplayListObject() 00063 {} 00064 }; 00065 00066 void DisplayListObject::render(VRenderContext&Context) const 00067 { 00068 static GLfloat Red[4] = {0.9, 0.1, 0.1, 1.0 }; 00069 00070 int N = 300; 00071 double r = 1.0; 00072 00073 double complexity = 0.5; 00074 Complexity << Context >> complexity; 00075 00076 double dphi = 3.1415/ 10, 00077 zs = 0.1 * complexity; 00078 00079 00080 glEnable( GL_COLOR_MATERIAL ); 00081 glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); 00082 00083 // mark the beginning of an object that can be picked by the mouse 00084 SubObjectBegin(Context); 00085 00086 // define the highlight color of an picked object 00087 vglColor4fv(Context, Red, 0.4); 00088 00089 glEnable(GL_DEPTH_TEST); 00090 00091 // create and save state of this object (created only when called the first time) 00092 RefPtr<MyState> state = myState(Context); 00093 00094 // create and save ParameterSpace (created only when called the first time) 00095 RefPtr<ValueSet> RenderParameterSpace = new ValueSet(); 00096 00097 // Test if a displaylist of given state of this object and parameterspace is already there. 00098 RefPtr<DisplayList> DL; 00099 try 00100 { 00101 DL = Context(*state)(this)( RenderParameterSpace ); 00102 } 00103 catch(...) 00104 {} 00105 00106 // If it is and if local parameter complexity has not changed from complexity saved in the state, just draw existing display list 00107 if (DL && state->complexity == complexity) 00108 { 00109 if (DL->call() ) 00110 return; 00111 } 00112 00113 // create displaylist for contex 00114 DL = Context[*state][this][ RenderParameterSpace ]; 00115 if (!DL) throw "No Display List!?"; 00116 00117 // save local parameter complexity to complexity in the state 00118 state->complexity = complexity; 00119 00120 // reset BoundingBox 00121 resetBBox(Context); 00122 00123 // start displaylist, draw obeject 00124 glCompile( *DL ) 00125 { 00126 glBegin( GL_QUAD_STRIP ); 00127 for (int i=0;i<N;i++) 00128 { 00129 double phi0 = i*dphi, 00130 phi1 = (i+1/complexity)*dphi; 00131 00132 point A, B; 00133 A = r*cos(phi0), r*sin(phi0), phi0*zs; 00134 B = r*cos(phi0), r*sin(phi0), phi1*zs; 00135 00136 bivector N; 00137 N = cos(phi0), sin(phi0), 0; 00138 00139 // Enlarge BouningBox on demand 00140 embrace( Context, A ); 00141 embrace( Context, B ); 00142 00143 glNormal( N ); 00144 glVertex( A ); 00145 glVertex( B ); 00146 } 00147 glEnd(); 00148 } 00149 00150 // BoundingBox has to be closed after calls of embrace(), new BoundingSphere is calculated 00151 closeBBox(Context); 00152 } 00153 00154 static Ref<VCreator<DisplayListObject> > MyCreator("Tutorial/DisplayListObject", 0); 00155 00156 /* 00157 This line needs to be contained in ONE source file of each 00158 VISH plugin module. It's not important which one. 00159 */ 00160 VISH_DEFAULT_INIT 00161 00162