#include # include #include #include #include #include #include #pragma comment(lib, "glsk.lib") float Sample[ 8 ]; template < int l, int r > int clamp( int v ) { if ( v < l ) return l; else if ( v > r ) return r; else return v; } float ComputeValue_SquareBSpline( float t ) { int i = t; t -= i; const float t2 = t * t; register float factor; register float result; factor = ( ( t - 2.f ) * t + 1.f ) / 2.f; result = factor * Sample[ clamp< 0, 7 >( i-1 ) ]; factor = ( ( -t + 1.f ) * t + 1.f ); result += factor * Sample[ clamp< 0, 7 >( i ) ]; factor = 0.5f*t2; result += factor * Sample[ clamp< 0, 7 >( i+1 ) ]; return result; } float ComputeValue_CubicBSpline( float t ) { int i = t; t -= i; const float t2 = t * t; const float t3 = t2 * t; register float factor; register float result; factor = ( -t3 + 3.f*t2 - 3.f*t + 1.f ) / 6.f; result = factor * Sample[ clamp< 0, 7 >( i-1 ) ]; factor = ( 3.f*t3 - 6.f*t2 + 4.f ) / 6.f; result += factor * Sample[ clamp< 0, 7 >( i ) ]; factor = ( -3.f*t3 + 3.f*t2 + 3.f*t + 1.f ) / 6.f; result += factor * Sample[ clamp< 0, 7 >( i+1 ) ]; factor = t3 / 6.f; result += factor * Sample[ clamp< 0, 7 >( i+2 ) ]; return result; } // inherit our application from glsk::window // note that this is not needed, since events are bound via signals, and not via virtual functions // if desired, virtual function event handlers can easiely be implement on top of those signals class application : public glsk::window { public: float last_update; float angle; application( glsk::config& rc ) : window( rc ), angle( 0.f ) { // set this window's title set_title( "GLSK Test Application" ); // enable window decorations set_decorated( true ); // make this window visible show(); // put mouse in captured mode - that means relative device coordinates and no visible cursor //glsk::set_mouse_captured( true ); // connect the update and redraw methods to the idle signal, so they are called whenever we // don't need to handle any messages //glsk::main::signal_idle().connect( boost::bind( &application::update, this ) ); //glsk::main::signal_idle().connect( boost::bind( &application::redraw, this ) ); //glsk::main::set_idle_callback( &application::idle_handler, this ); // connect all the necesarry handlers /*this->signal_create().connect( boost::bind( &application::on_create, this, _1, _2 ) ); this->signal_configure().connect( boost::bind( &application::on_configure, this, _1, _2 ) ); this->signal_redraw().connect( boost::bind( &application::redraw, this ) ); this->signal_input().connect( boost::bind( &application::on_input, this, _1 ) ); this->signal_close().connect( &glsk::main::quit ); */ boost::mt19937 Rng; boost::uniform_real<> UniformDistribution(-2.f, 2.f ); boost::variate_generator< boost::mt19937&, boost::uniform_real<> > Gen( Rng, UniformDistribution ); for ( int i = 0; i < 8; ++i ) Sample[ i ] = Gen(); open(); } // initialization handler void on_create( int x, int y ) { last_update = static_cast< float >( glsk::get_time() ); select_rc(); glClearColor( 1.f, 1.f, 1.f, 1.f ); glPointSize( 4.f ); on_configure( x, y ); } // resize handler void on_configure( int w, int h ) { select_rc(); glViewport( 0, 0, w, h ); const float fov = 75.f; const float near = 0.1f; const float far = 10000.f; float f = 1.f / std::tan( fov / 180.f * 1.570796327f ); float a = near + far; float b = near * far * 2.f; float d = near - far; float p = static_cast< float >( w ) / h; // setup a perspective matrix const float matrix[ 16 ] = { f/p, 0.f, 0.f, 0.f, 0.f, f, 0.f, 0.f, 0.f, 0.f, a/d,-1.f, 0.f, 0.f, b/d, 0.f }; glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glLoadMatrixf( matrix ); glMatrixMode( GL_MODELVIEW ); } // update our scene void update() { float time = static_cast< float >( glsk::get_time() ); // 1/3 rotation per second angle += std::fmod( 120.f * ( time - last_update ), 360.f ); last_update = time; } // redraw our scene void on_redraw() { float radius = 5.f; float depth = -10.f; float sy = 0.5f * radius; float sx = sqrt( 3.f ) / 2.f * radius; glClear( GL_COLOR_BUFFER_BIT ); glLoadIdentity(); glRotatef( angle, 0.f, 0.f, 1.f ); // draw a simple triangle using 3 colors glBegin( GL_TRIANGLES ); glColor3ub( 255, 0, 0 ); glVertex3f( 0.f, radius, depth ); glColor3ub( 0, 255, 0 ); glVertex3f( -sx, -sy, depth ); glColor3ub( 0, 0, 255 ); glVertex3f( sx, -sy, depth ); glEnd(); glLoadIdentity(); glPointSize( 4.f ); glBegin( GL_POINTS ); glColor3ub( 0, 0, 0 ); for ( int i = 0; i < 8; ++i ) glVertex3f( i-4.5f, Sample[ i ], depth ); glEnd(); glPointSize( 1.f ); glBegin( GL_LINE_STRIP ); glColor3ub( 0, 0, 64 ); for ( float t = 0.f; t <= 7.f; t += 0.1f ) glVertex3f( t-4.5f, ComputeValue_CubicBSpline( t ), depth ); glEnd(); // swap buffers swap_buffers(); } // input event handler void on_input( const glsk::input_event& input ) { // glsk uses strings to identify keycodes, which makes it portable and extensible if ( input.get_type() == glsk::input_event::key && input.get_value() && input.get_identifier() == glsk::get_keycode( "Escape" ) ) glsk::main::quit(); } void on_close() { glsk::main::quit(); } }; #ifdef _WIN32 // undefine tags previously defined for header compatibilty #undef APIENTRY #undef WINGDIAPI // include a lean and mean version of the windows header #define WIN32_LEAN_AND_MEAN #include int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hlastinstance, PSTR cmdline, int iCmdShow ) #else int main( int argc, char **argv ) #endif { try { // select our window's config glsk::config cfg( glsk::config::draw_to_window | glsk::config::doublebuffer | glsk::config::color_bits_set | glsk::config::depth_bits_set, 32, 24, 0, 0 ); // open the window handlers // create our window object using that config application wnd( cfg ); while ( glsk::main::pump_messages() ) { wnd.update(); wnd.on_redraw(); } // run the application return 0; } catch( glsk::unsuccessful ) { std::cout << "unable to run app." << std::endl; } catch( glsk::failure& x ) { std::cout << "glsk critical exception caught: " << x.what() << std::endl; } return 1; } 1>Compiling... 1>main.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>.\main.cpp(19) : warning C4244: 'initializing' : conversion from 'float' to 'int', possible loss of data 1>.\main.cpp(41) : warning C4244: 'initializing' : conversion from 'float' to 'int', possible loss of data 1>.\main.cpp(110) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data 1>.\main.cpp(138) : error C2513: 'const float' : no variable declared before '=' 1>.\main.cpp(139) : error C2513: 'const float' : no variable declared before '=' 1>.\main.cpp(141) : error C2059: syntax error : ';' 1>.\main.cpp(142) : error C2100: illegal indirection 1>.\main.cpp(142) : error C2100: illegal indirection 1>.\main.cpp(143) : error C2059: syntax error : ';'