static void snowglobePreparePaintScreen (CompScreen *s, int ms) { SNOWGLOBE_SCREEN (s); int i; for (i = 0; i < as->numSnowflakes; i++) { SnowflakeDrift(s, i); } updateWater(s, (float)ms / 1000.0); updateGround(s, (float)ms / 1000.0); UNWRAP (as, s, preparePaintScreen); (*s->preparePaintScreen)(s, ms); WRAP (as, s, preparePaintScreen, snowglobePreparePaintScreen); }
void csWaterDemo::SetupFrame () { // First get elapsed time from the virtual clock. csTicks elapsed_time = vc->GetElapsedTicks (); updateWater (elapsed_time); // Now rotate the camera according to keyboard state static int frame; bool stop = false; if(++frame == 100) { frame=0; stop=true; } float speed = (elapsed_time / 1000.0) * (0.03 * 20); int w = r3d->GetDriver2D ()->GetWidth()/2; int h = r3d->GetDriver2D ()->GetHeight()/2; int x = mouse->GetLastX(); int y = mouse->GetLastY(); bool moved = false; if (hasfocus) { view->GetCamera ()->GetTransform ().RotateThis (CS_VEC_TILT_UP, (y-h) * 0.01); view->GetCamera ()->GetTransform ().RotateOther (CS_VEC_ROT_RIGHT, (x-w) * 0.01); r3d->GetDriver2D ()->SetMousePosition (w, h); moved |= (y-h)!=0; moved |= (x-w)!=0; } if (kbd->GetKeyState (CSKEY_UP)) { view->GetCamera ()->Move (CS_VEC_FORWARD * speed * 25.0); moved = true; } if (kbd->GetKeyState (CSKEY_DOWN)) { view->GetCamera ()->Move (CS_VEC_BACKWARD * speed * 25.0); moved = true; } if (kbd->GetKeyState (CSKEY_LEFT)) { view->GetCamera ()->Move (CS_VEC_LEFT * speed * 25.0); moved = true; } if (kbd->GetKeyState (CSKEY_RIGHT)) { view->GetCamera ()->Move (CS_VEC_RIGHT * speed * 25.0); moved = true; } if (kbd->GetKeyState (CSKEY_HOME)) { view->GetCamera ()->Move (CS_VEC_UP * speed * 25.0); moved = true; } if (kbd->GetKeyState (CSKEY_END)) { view->GetCamera ()->Move (CS_VEC_DOWN * speed * 25.0); moved = true; } /* // dump camera position. might be useful for debugging. if (moved) { csReversibleTransform ct = view->GetCamera()->GetTransform(); const csVector3 camPos = ct.GetOrigin(); const csVector3 camPlaneZ = ct.GetT2O().Col3 (); csPrintf ("(%g,%g,%g) (%g,%g,%g)\n", camPos.x, camPos.y, camPos.z, camPlaneZ.x, camPlaneZ.y, camPlaneZ.z); } */ r3d->SetPerspectiveAspect (r3d->GetDriver2D ()->GetHeight ()); r3d->SetPerspectiveCenter (r3d->GetDriver2D ()->GetWidth ()/2, r3d->GetDriver2D ()->GetHeight ()/2); // Tell 3D driver we're going to display 3D things. if (!r3d->BeginDraw (CSDRAW_3DGRAPHICS | CSDRAW_CLEARSCREEN | CSDRAW_CLEARZBUFFER)) return; view->Draw (); console->Draw3D (); if (!r3d->BeginDraw (CSDRAW_2DGRAPHICS)) return; console->Draw2D (); //Display a little very informative message. int glyphWidth, glyphHeight; font->GetMaxSize (glyphWidth, glyphHeight); int white = r3d->GetDriver2D ()->FindRGB (255, 255, 255); r3d->GetDriver2D ()->Write (font, 1, r3d->GetDriver2D ()->GetHeight () - (glyphHeight == -1? 20 : (glyphHeight+1)), white, -1, "Press Space Bar to see a cool effect!"); if(stop) stop=false; }