void keyboard2(unsigned char key, int x, int y) { float rotation[16]; float translation[16]; float camera_disp = -10.0; if ( key == 'w' || key == 'a' || key == 's' || key == 'd' || key == ' ') { SetTranslation(0.0, 0.0, camera_disp, translation); MultiplyMatrix(translation, ViewMatrix, ViewMatrix); } else { return; } switch(key) { case 'w' : SetRotationX(5, rotation); break; case 'a' : SetRotationY(5, rotation); break; case 's' : SetRotationX(-5, rotation); break; case 'd' : SetRotationY(-5, rotation); break; case ' ' : SetTranslation(0.0, 0.0, camera_disp, ViewMatrix); return; default : return; } MultiplyMatrix(ViewMatrix, rotation, ViewMatrix); SetTranslation(0.0, 0.0,camera_disp * -1, translation); MultiplyMatrix(translation, ViewMatrix, ViewMatrix); }
void Actor::ScaleTo( const RectI &rect, StretchType st ) { // width and height of rectangle float rect_width = (float) rect.GetWidth(); float rect_height = (float) rect.GetHeight(); if( rect_width < 0 ) SetRotationY( 180 ); if( rect_height < 0 ) SetRotationX( 180 ); // center of the rectangle float rect_cx = rect.left + rect_width/2; float rect_cy = rect.top + rect_height/2; // zoom fActor needed to scale the Actor to fill the rectangle float fNewZoomX = fabsf(rect_width / m_size.x); float fNewZoomY = fabsf(rect_height / m_size.y); float fNewZoom = 0.f; switch( st ) { case cover: fNewZoom = fNewZoomX>fNewZoomY ? fNewZoomX : fNewZoomY; // use larger zoom break; case fit_inside: fNewZoom = fNewZoomX>fNewZoomY ? fNewZoomY : fNewZoomX; // use smaller zoom break; } SetXY( rect_cx, rect_cy ); SetZoom( fNewZoom ); }
void Rotateable::SetRotation(float x,float y,float z) { SetRotationX(x); SetRotationY(y); SetRotationZ(z); }
void mouse(int button, int state, int x, int y){ float rotation[16]; float translation[16]; float camera_disp = -10.0; if(button != 0) {return;} /* mouse click*/ if (state == 0) { mouse_x = x; mouse_y = y; return; /* mouse release*/ } else if ( state == 1) { SetTranslation(0.0, 0.0, camera_disp, translation); MultiplyMatrix(translation, ViewMatrix, ViewMatrix); int diffX = mouse_x - x; int diffY = mouse_y - y; /* right to left or reverse*/ if (fabs(diffX) > fabs(diffY)) { if(diffX < 0) { SetRotationY(-5, rotation); } else { SetRotationY(5, rotation); } } else { if (diffY < 0) { SetRotationX(-5, rotation); } else { SetRotationX(5, rotation); } } } MultiplyMatrix(ViewMatrix, rotation, ViewMatrix); SetTranslation(0.0, 0.0,camera_disp * -1, translation); MultiplyMatrix(translation, ViewMatrix, ViewMatrix); }
void Initialize(void) { /* Set background (clear) color to dark blue */ glClearColor(0.0, 0.0, 0.4, 0.0); /* Enable depth testing */ glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); /* Transform matrix for the bar in the middle*/ /*copy objects into buffer*/ memcpy(vertex_buffer_data1, vertex_octagon, sizeof(vertex_octagon)); memcpy(vertex_buffer_data2, vertex_pyramid, sizeof(vertex_pyramid)); memcpy(vertex_buffer_data3, vertex_mainBar, sizeof(vertex_mainBar)); memcpy(vertex_buffer_data4, vertex_cube, sizeof(vertex_cube)); memcpy(vertex_buffer_data5, vertex_cube, sizeof(vertex_cube)); memcpy(vertex_buffer_data6, vertex_cube, sizeof(vertex_cube)); memcpy(vertex_buffer_data7, vertex_cube, sizeof(vertex_cube)); /* memcpy(color_buffer_data1, color_octagon, sizeof(color_octagon)); memcpy(color_buffer_data2, color_pyramid, sizeof(color_pyramid)); memcpy(color_buffer_data3, color_mainBar, sizeof(color_mainBar)); memcpy(color_buffer_data4, color_cube, sizeof(color_cube)); memcpy(color_buffer_data5, color_cube, sizeof(color_cube)); memcpy(color_buffer_data6, color_cube, sizeof(color_cube)); memcpy(color_buffer_data7, color_cube, sizeof(color_cube)); */ memcpy(index_buffer_data1, index_octagon, sizeof(index_octagon)); memcpy(index_buffer_data2, index_pyramid, sizeof(index_pyramid)); memcpy(index_buffer_data3, index_mainBar, sizeof(index_mainBar)); memcpy(index_buffer_data4, index_cube, sizeof(index_cube)); memcpy(index_buffer_data5, index_cube, sizeof(index_cube)); memcpy(index_buffer_data6, index_cube, sizeof(index_cube)); memcpy(index_buffer_data7, index_cube, sizeof(index_cube)); /* Setup vertex, color, and index buffer objects */ SetupDataBuffers(); /* Setup shaders and shader program */ CreateShaderProgram(); /* Initialize matrices */ SetIdentityMatrix(ProjectionMatrix); SetIdentityMatrix(ViewMatrix); int i = 0; for(;i<OBJECTS;i++) { SetIdentityMatrix(ModelMatrix[i]); } printf("DEBUG: adding light-source ...\n"); /* Add lighting source to the code */ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHT0); // adds first light-source to the scene GLfloat ambientLight[] = {0.2, 0.2, 0.2, 1.0}; GLfloat diffuseLight[] = {0.8, 0.8, 0.8, 1.0}; GLfloat specularLight[]= {1.0, 1.0, 1.0, 1.0}; GLfloat positionLight[]= {5.0, 0.0, 0.0, 0.0}; //glShadeModel(GL_SMOOTH); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); glLightfv(GL_LIGHT0, GL_POSITION, positionLight); GLfloat black[] = {0.0, 0.0, 0.0, 1.0}; GLfloat green[] = {0.0, 1.0, 0.0, 1.0}; GLfloat white[] = {1.0, 1.0, 1.0, 1.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, green); glMaterialfv(GL_FRONT, GL_DIFFUSE, green); glMaterialfv(GL_FRONT, GL_SPECULAR, white); glMaterialf(GL_FRONT, GL_SHININESS, 60.0); printf("DEBUG: finished adding light-source\n"); /* Set projection transform */ float fovy = 45.0; float aspect = 1.0; float nearPlane = 1.0; float farPlane = 50.0; SetPerspectiveMatrix(fovy, aspect, nearPlane, farPlane, ProjectionMatrix); /* Set viewing transform */ float camera_disp = -10.0; SetTranslation(0.0, 0.0, camera_disp, ViewMatrix); /* Translate and rotate cube */ SetTranslation(0, 0, 0, TranslateOrigin); SetRotationX(0.0, RotateX); SetRotationZ(0.0, RotateZ); /* Translate down */ SetTranslation(0, -sqrtf(sqrtf(2.0) * 1.0), 0, TranslateDown); /* Initial transformation matrix */ MultiplyMatrix(RotateX, TranslateOrigin, InitialTransform); MultiplyMatrix(RotateZ, InitialTransform, InitialTransform); }
void OnIdle(){ /* Determine delta time between two frames to ensure constant animation */ int newTime = glutGet(GLUT_ELAPSED_TIME); int delta = newTime - oldTime; oldTime = newTime; SetIdentityMatrix(IdentityMatrixAnim); SetIdentityMatrix(TranslationMatrixAnim); /* automatic camera mode: press 'm' to start, and 'n' to reset */ if(anim_cam){ if(camera_disp > -50){ // zoom out of world (until camera position on z == -50) and rotate on x axis camera_disp -= 0.1; } if(camMov2 < 500){ angle1 += 0.1; } else if(camMov2 < 800){ angle1 -= 0.1; } else{ camMov2 = 200; } ++camMov2; if(camMov1 < 10 && camMov1 > -1){ // move camera to left and right with some pause of movement // Pause movement } else if(camMov1 < 80){ angle -= 0.1; } else if(camMov1 < 100){ // Pause movement } else if(camMov1 < 240){ angle += 0.1; } else if(camMov1 < 250){ // Pause movement } else if(camMov1 < 320){ angle -= 0.1; } else{ // Pause for some time if(camMov1 > 1000){ camMov1 = 0; } } ++camMov1; SetIdentityMatrix(RotationMatrixCam); SetIdentityMatrix(RotationMatrixCam2); SetTranslation(0.0, 0.0, camera_disp, TranslationMatrixAnim); // translate cameras z position SetRotationY(angle, RotationMatrixCam); // set rotation of camera SetRotationX(angle1, RotationMatrixCam2); MultiplyMatrix(RotationMatrixCam, TranslationMatrixAnim, RotationMatrixCam3); MultiplyMatrix(RotationMatrixCam3, RotationMatrixCam2, ViewMatrix); } /* If animation is set to true, set new rotation angles */ if(anim){ /* Increment rotation angles and update matrix */ if(axis == YaxisStop){ // angleY = 0; SetRotationY(angleY, RotationMatrixAnimY); } else if(axis == Yaxis){ angleY = fmod(angleY + delta/20.0, 360.0); SetRotationY(angleY, RotationMatrixAnimY); } } else { /* else: do not apply rotation below */ return; } // Set Translation for Center-Imported Objects (ball_01, ball_02 and ring) // NEW SetIdentityMatrix(IdentityMatrixAnim); SetIdentityMatrix(TranslationMatrixAnim); SetIdentityMatrix(TranslationMatrixAnim2); SetIdentityMatrix(TranslationMatrixAnim3); SetIdentityMatrix(TranslationMatrixAnim4); SetIdentityMatrix(TranslationMatrixAnim5); SetTranslation(-1.8, 1, -1.8, TranslationMatrixAnim); // ball_01 -1,8/1,8/1 SetTranslation(1.8, 1, 1.8, TranslationMatrixAnim3); // ball_02 1,8/-1,8/1 SetTranslation(-0.96, -1.73403, -0.66, TranslationMatrixAnim5); // elliptic_ring -0,96/0,66/-1,73403 /* Rotation of models */ int k; for(k=1; k<13; ++k){ // do not rotate top ring (index 0) and fixed background structures (index 13 and 14) // Set main rotaiton /* Update of transformation matrices * Note order of transformations and rotation of reference axes */ SetIdentityMatrix(IdentityMatrixAnim); MultiplyMatrix(IdentityMatrixAnim, RotationMatrixAnimY, RotationMatrixAnim); // rotate top bar in different direction and double the rotation speed if(k==1 || k==6 || k == 7){ angleY2 = -fmod(angleY + delta/20.0, 360.0); SetRotationY(angleY2, RotationMatrixAnimY2); // in daddition: rotate models ball_01 and ball_02 around their own center if(k==6){ MultiplyMatrix(RotationMatrixAnimY2, RotationMatrixAnimY2, RotationMatrixAnimY3); MultiplyMatrix(RotationMatrixAnimY3, TranslationMatrixAnim, TranslationMatrixAnim2); MultiplyMatrix(TranslationMatrixAnim2, RotationMatrixAnimY2, ModelMatrix[k]); continue; } else if(k==7){ MultiplyMatrix(RotationMatrixAnimY2, RotationMatrixAnimY2, RotationMatrixAnimY3); MultiplyMatrix(RotationMatrixAnimY3, TranslationMatrixAnim3, TranslationMatrixAnim2); MultiplyMatrix(TranslationMatrixAnim2, RotationMatrixAnimY2, ModelMatrix[k]); continue; } MultiplyMatrix(RotationMatrixAnimY2, IdentityMatrixAnim, ModelMatrix[k]); MultiplyMatrix(RotationMatrixAnimY2,RotationMatrixAnimY2,ModelMatrix[k]); } else { // additional rotation of ring with double speed oround its center if(k==11){ MultiplyMatrix(RotationMatrixAnimY, TranslationMatrixAnim5, RotationMatrixAnimY3); MultiplyMatrix(RotationMatrixAnimY3, RotationMatrixAnimY, TranslationMatrixAnim4); MultiplyMatrix(TranslationMatrixAnim4, RotationMatrixAnimY, ModelMatrix[k]); continue; } MultiplyMatrix(RotationMatrixAnim, IdentityMatrixAnim, ModelMatrix[k]); } } /* Issue display refresh */ glutPostRedisplay(); }
void Keyboard(unsigned char key, int x, int y){ switch( key ) { // NEW: Manual camera mode: allways on -> use WASDRC to translate cam position and IJKL for cam rotation case 'w' : camera_disp += 0.1f; break; case 's' : camera_disp -= 0.1f; break; case 'd' : xx -= 0.1; break; case 'a' : xx += 0.1; break; case 'i' : angle2 -= 0.3; break; case 'k' : angle2 += 0.3; break; case 'l' : angle3 += 0.3; break; case 'j' : angle3 -= 0.3; break; case 'r' : yy -= 0.1f; break; case 'c' : yy += 0.1f; break; case 'm' : // set automatic camera mode and reset camera position an rotation (angle) anim_cam = GL_TRUE; camera_disp = -10.0; angle=0; angle1=0; angle2=0; angle3=0; xx=0; yy=0; SetTranslation(xx, yy, camera_disp, ViewMatrix); // camera_disp == z coordinate of camera return; break; case 'n' : // unset automatic camera mode and reset camera position an rotation (angle) anim_cam = GL_FALSE; camera_disp = -10.0; angle=0; angle1=0; angle2=0; angle3=0; xx=0; yy=0; SetTranslation(xx, yy, camera_disp, ViewMatrix); // camera_disp == z coordinate of camera return; break; } SetIdentityMatrix(RotationMatrixCam); SetIdentityMatrix(RotationMatrixCam2); SetIdentityMatrix(RotationMatrixCam3); SetIdentityMatrix(TranslationMatrixCam); // set camera movement SetTranslation(xx, yy, camera_disp, TranslationMatrixCam); SetRotationX(angle2, RotationMatrixCam); SetRotationY(angle3, RotationMatrixCam2); // apply movement to viewMatrix (camera matrix) MultiplyMatrix(RotationMatrixCam, RotationMatrixCam2, RotationMatrixCam3); MultiplyMatrix(RotationMatrixCam3, TranslationMatrixCam, ViewMatrix); glutPostRedisplay(); }
void Rotateable::Pitch(float val) { SetRotationX(rotation.x + val); }
void Actor::HandleCommand( const ParsedCommand &command ) { HandleParams; const CString& sName = sParam(0); // Commands that go in the tweening queue: if ( sName=="sleep" ) Sleep( fParam(1) ); else if( sName=="linear" ) BeginTweening( fParam(1), TWEEN_LINEAR ); else if( sName=="accelerate" ) BeginTweening( fParam(1), TWEEN_ACCELERATE ); else if( sName=="decelerate" ) BeginTweening( fParam(1), TWEEN_DECELERATE ); else if( sName=="bouncebegin" ) BeginTweening( fParam(1), TWEEN_BOUNCE_BEGIN ); else if( sName=="bounceend" ) BeginTweening( fParam(1), TWEEN_BOUNCE_END ); else if( sName=="spring" ) BeginTweening( fParam(1), TWEEN_SPRING ); else if( sName=="stoptweening" ) { StopTweening(); BeginTweening( 0.0001f, TWEEN_LINEAR ); } // Why BeginT again? -Chris else if( sName=="finishtweening" ) FinishTweening(); else if( sName=="hurrytweening" ) HurryTweening( fParam(1) ); else if( sName=="x" ) SetX( fParam(1) ); else if( sName=="y" ) SetY( fParam(1) ); else if( sName=="z" ) SetZ( fParam(1) ); else if( sName=="addx" ) SetX( GetDestX()+fParam(1) ); else if( sName=="addy" ) SetY( GetDestY()+fParam(1) ); else if( sName=="addz" ) SetZ( GetDestZ()+fParam(1) ); else if( sName=="zoom" ) SetZoom( fParam(1) ); else if( sName=="zoomx" ) SetZoomX( fParam(1) ); else if( sName=="zoomy" ) SetZoomY( fParam(1) ); else if( sName=="zoomz" ) SetZoomZ( fParam(1) ); else if( sName=="zoomtowidth" ) ZoomToWidth( fParam(1) ); else if( sName=="zoomtoheight" ) ZoomToHeight( fParam(1) ); else if( sName=="stretchto" ) StretchTo( RectF( fParam(1), fParam(2), fParam(3), fParam(4) ) ); else if( sName=="cropleft" ) SetCropLeft( fParam(1) ); else if( sName=="croptop" ) SetCropTop( fParam(1) ); else if( sName=="cropright" ) SetCropRight( fParam(1) ); else if( sName=="cropbottom" ) SetCropBottom( fParam(1) ); else if( sName=="fadeleft" ) SetFadeLeft( fParam(1) ); else if( sName=="fadetop" ) SetFadeTop( fParam(1) ); else if( sName=="faderight" ) SetFadeRight( fParam(1) ); else if( sName=="fadebottom" ) SetFadeBottom( fParam(1) ); else if( sName=="fadecolor" ) SetFadeDiffuseColor( cParam(1) ); else if( sName=="diffuse" ) SetDiffuse( cParam(1) ); else if( sName=="diffuseleftedge" ) SetDiffuseLeftEdge( cParam(1) ); else if( sName=="diffuserightedge" ) SetDiffuseRightEdge( cParam(1) ); else if( sName=="diffusetopedge" ) SetDiffuseTopEdge( cParam(1) ); else if( sName=="diffusebottomedge" ) SetDiffuseBottomEdge( cParam(1) ); /* Add left/right/top/bottom for alpha if needed. */ else if( sName=="diffusealpha" ) SetDiffuseAlpha( fParam(1) ); else if( sName=="diffusecolor" ) SetDiffuseColor( cParam(1) ); else if( sName=="glow" ) SetGlow( cParam(1) ); else if( sName=="glowmode" ) { if(!sParam(1).CompareNoCase("whiten")) SetGlowMode( GLOW_WHITEN ); else if(!sParam(1).CompareNoCase("brighten")) SetGlowMode( GLOW_BRIGHTEN ); else ASSERT(0); } else if( sName=="rotationx" ) SetRotationX( fParam(1) ); else if( sName=="rotationy" ) SetRotationY( fParam(1) ); else if( sName=="rotationz" ) SetRotationZ( fParam(1) ); else if( sName=="heading" ) AddRotationH( fParam(1) ); else if( sName=="pitch" ) AddRotationP( fParam(1) ); else if( sName=="roll" ) AddRotationR( fParam(1) ); else if( sName=="shadowlength" ) SetShadowLength( fParam(1) ); else if( sName=="horizalign" ) SetHorizAlign( sParam(1) ); else if( sName=="vertalign" ) SetVertAlign( sParam(1) ); else if( sName=="diffuseblink" ) SetEffectDiffuseBlink(); else if( sName=="diffuseshift" ) SetEffectDiffuseShift(); else if( sName=="glowblink" ) SetEffectGlowBlink(); else if( sName=="glowshift" ) SetEffectGlowShift(); else if( sName=="rainbow" ) SetEffectRainbow(); else if( sName=="wag" ) SetEffectWag(); else if( sName=="bounce" ) SetEffectBounce(); else if( sName=="bob" ) SetEffectBob(); else if( sName=="pulse" ) SetEffectPulse(); else if( sName=="spin" ) SetEffectSpin(); else if( sName=="vibrate" ) SetEffectVibrate(); else if( sName=="stopeffect" ) SetEffectNone(); else if( sName=="effectcolor1" ) SetEffectColor1( cParam(1) ); else if( sName=="effectcolor2" ) SetEffectColor2( cParam(1) ); else if( sName=="effectperiod" ) SetEffectPeriod( fParam(1) ); else if( sName=="effectoffset" ) SetEffectOffset( fParam(1) ); else if( sName=="effectdelay" ) SetEffectDelay( fParam(1) ); else if( sName=="effectclock" ) SetEffectClock( sParam(1) ); else if( sName=="effectmagnitude" ) SetEffectMagnitude( RageVector3(fParam(1),fParam(2),fParam(3)) ); else if( sName=="scaletocover" ) { RectI R(iParam(1), iParam(2), iParam(3), iParam(4)); ScaleToCover(R); } else if( sName=="scaletofit" ) { RectI R(iParam(1), iParam(2), iParam(3), iParam(4)); ScaleToFitInside(R); } // Commands that take effect immediately (ignoring the tweening queue): else if( sName=="animate" ) EnableAnimation( bParam(1) ); else if( sName=="setstate" ) SetState( iParam(1) ); else if( sName=="texturewrapping" ) SetTextureWrapping( bParam(1) ); else if( sName=="additiveblend" ) SetBlendMode( bParam(1) ? BLEND_ADD : BLEND_NORMAL ); else if( sName=="blend" ) SetBlendMode( sParam(1) ); else if( sName=="zbuffer" ) SetUseZBuffer( bParam(1) ); else if( sName=="ztest" ) SetZTestMode( bParam(1)?ZTEST_WRITE_ON_PASS:ZTEST_OFF ); else if( sName=="ztestmode" ) SetZTestMode( sParam(1) ); else if( sName=="zwrite" ) SetZWrite( bParam(1) ); else if( sName=="clearzbuffer" ) SetClearZBuffer( bParam(1) ); else if( sName=="backfacecull" ) SetCullMode( bParam(1) ? CULL_BACK : CULL_NONE ); else if( sName=="cullmode" ) SetCullMode( sParam(1) ); else if( sName=="hidden" ) SetHidden( bParam(1) ); else if( sName=="hibernate" ) SetHibernate( fParam(1) ); else if( sName=="draworder" ) SetDrawOrder( iParam(1) ); else if( sName=="playcommand" ) PlayCommand( sParam(1) ); else if( sName=="queuecommand" ) { ParsedCommand newcommand = command; newcommand.vTokens.erase( newcommand.vTokens.begin() ); QueueCommand( newcommand ); return; // don't do parameter number checking } /* These are commands intended for a Sprite commands, but they will get * sent to all sub-actors (which aren't necessarily Sprites) on * GainFocus and LoseFocus. So, don't run CheckHandledParams * on these commands. */ else if( sName=="customtexturerect" || sName=="texcoordvelocity" || sName=="scaletoclipped" || sName=="stretchtexcoords" || sName=="position" || sName=="loop" || sName=="play" || sName=="pause" || sName=="rate" ) return; else { CString sError = ssprintf( "Actor::HandleCommand: Unrecognized command name '%s'.", sName.c_str() ); LOG->Warn( sError ); Dialog::OK( sError ); } CheckHandledParams; }