Esempio n. 1
0
const int ReflectedObject::Draw( Camera* camera, GLShaderManager* shaderManager, TextureManager* textureManager, Light* light )
{
    // Set the correct texture
    glBindTexture( GL_TEXTURE_2D, textureFile );

    // Matrices needed
    M3DMatrix44f mCamera;
    M3DMatrix44f mCameraRotOnly;
    M3DMatrix44f mInverseCamera;

    // Get the matrices from the camera
    camera->cameraFrame.GetCameraMatrix(mCamera, false);
    camera->cameraFrame.GetCameraMatrix(mCameraRotOnly, true);
    m3dInvertMatrix44(mInverseCamera, mCameraRotOnly);

    camera->modelViewMatrix.PushMatrix();
    //Draw the sphere
    camera->modelViewMatrix.MultMatrix( mCamera );
    camera->modelViewMatrix.MultMatrix( frame );
    glUseProgram( shaderFile );
    glUniformMatrix4fv(locMVPReflect, 1, GL_FALSE, camera->transformPipeline.GetModelViewProjectionMatrix());
    glUniformMatrix4fv(locMVReflect, 1, GL_FALSE, camera->transformPipeline.GetModelViewMatrix());
    glUniformMatrix3fv(locNormalReflect, 1, GL_FALSE, camera->transformPipeline.GetNormalMatrix());
    glUniformMatrix4fv(locInvertedCamera, 1, GL_FALSE, mInverseCamera);
    glUniform1i(locCubeMap, 1);
    glUniform1i(locTarnishMap, 0);

    triBatch.Draw();

    camera->modelViewMatrix.PopMatrix();

    return SHR_SUCCESS;
}
Esempio n. 2
0
// Called to draw scene
void RenderScene(void)
    {
    // Clear the window
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
    glPushMatrix(); 
        frameCamera.ApplyCameraTransform(); // Move the camera about

        // Sky Box is manually textured
        glActiveTexture(GL_TEXTURE0);
        glDisable(GL_TEXTURE_2D);
        glActiveTexture(GL_TEXTURE1);

        glEnable(GL_TEXTURE_CUBE_MAP);
        glDisable(GL_TEXTURE_GEN_S);
        glDisable(GL_TEXTURE_GEN_T);
        glDisable(GL_TEXTURE_GEN_R);     
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
        DrawSkyBox();
 

        // Use texgen to apply cube map
        glEnable(GL_TEXTURE_GEN_S);
        glEnable(GL_TEXTURE_GEN_T);
        glEnable(GL_TEXTURE_GEN_R);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
       
        glActiveTexture(GL_TEXTURE0);
        glEnable(GL_TEXTURE_2D);

        glPushMatrix();
            glTranslatef(0.0f, 0.0f, -3.0f);    
 
            glActiveTexture(GL_TEXTURE1);
            glMatrixMode(GL_TEXTURE);
            glPushMatrix();
            
            // Invert camera matrix (rotation only) and apply to 
            // texture coordinates
            M3DMatrix44f m, invert;
            frameCamera.GetCameraOrientation(m);
            m3dInvertMatrix44(invert, m);
            glMultMatrixf(invert);
    
            glColor3f(1.0f, 1.0f, 1.0f);
            gltDrawSphere(0.75f, 41, 41);
 
            glPopMatrix();
            glMatrixMode(GL_MODELVIEW);
        glPopMatrix();

    glPopMatrix();
        
    // Do the buffer Swap
    glutSwapBuffers();
    }
Esempio n. 3
0
void DrawGLScene()									// Main Drawing Routine
{
  GLmatrix16f Minv, Inv;
  GLvector4f  lp;

  // Clear Color Buffer, Depth Buffer, Stencil Buffer
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  glColor4f(0.7f, 0.4f, 0.0f, 1.0f);
  glLoadIdentity();

  glPushMatrix(); {
      glTranslatef(0.0f, 0.0f, -20.0f);					// Zoom Into Screen 20 Units
      glLightfv(GL_LIGHT1, GL_POSITION, LightPos);		// Position Light1
      glTranslatef(SpherePos[0], SpherePos[1], SpherePos[2]);	// Position The Sphere
      gluSphere(q, 1.5f, 32, 16);							// Draw A Sphere
  } glPopMatrix();

  glPushMatrix(); {
      glTranslatef(0.0f, 0.0f, -20.0f);					// Zoom Into The Screen 20 Units
      DrawGLRoom();										// Draw The Room
      glTranslatef(ObjPos[0], ObjPos[1], ObjPos[2]);		// Position The Object
      glRotatef(xrot, 1.0f, 0.0f, 0.0f);					// Spin It On The X Axis By xrot
      glRotatef(yrot, 0.0f, 1.0f, 0.0f);					// Spin It On The Y Axis By yrot
      DrawGLObject(obj);									// Procedure For Drawing The Loaded Object

      // 获得光源的位置(返回值是在视觉坐标系下的)
      glGetLightfv(GL_LIGHT1, GL_POSITION, lp);
      glGetFloatv(GL_MODELVIEW_MATRIX, Minv);
      m3dInvertMatrix44(Inv, Minv);
      // 把光源位置从视觉坐标系下变换到当前的场景坐标系(obj)下.
      VMatMult(Inv, lp);
      // 开始渲染阴影
      CastShadow(&obj, lp);

      // 用一个小黄球标记出光源的位置
      glPushMatrix(); {
          glColor4f(0.7f, 0.4f, 0.0f, 1.0f);					// Set Color To Purplish Blue
          glDisable(GL_LIGHTING);								// Disable Lighting
          glDepthMask(GL_FALSE);								// Disable Depth Mask
          glTranslatef(lp[0], lp[1], lp[2]);
          gluSphere(q, 0.2f, 16, 8);
          glEnable(GL_LIGHTING);								// Enable Lighting
          glDepthMask(GL_TRUE);								// Enable Depth Mask
      } glPopMatrix();
  } glPopMatrix();

  xrot += xspeed;	
  yrot += yspeed;	

  glFlush();
  glutSwapBuffers();
}
Esempio n. 4
0
// Called to draw scene
void RenderScene(void)
    {
    // Clear the window
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
    M3DMatrix44f mCamera;
    M3DMatrix44f mCameraRotOnly;
	M3DMatrix44f mInverseCamera;
    
    viewFrame.GetCameraMatrix(mCamera, false);
    viewFrame.GetCameraMatrix(mCameraRotOnly, true);
	m3dInvertMatrix44(mInverseCamera, mCameraRotOnly);

    modelViewMatrix.PushMatrix();    
        // Draw the sphere
        modelViewMatrix.MultMatrix(mCamera);
        glUseProgram(reflectionShader);
        glUniformMatrix4fv(locMVPReflect, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
        glUniformMatrix4fv(locMVReflect, 1, GL_FALSE, transformPipeline.GetModelViewMatrix());
        glUniformMatrix3fv(locNormalReflect, 1, GL_FALSE, transformPipeline.GetNormalMatrix());
		glUniformMatrix4fv(locInvertedCamera, 1, GL_FALSE, mInverseCamera);
		glUniform1i(locCubeMap, 0);
		glUniform1i(locTarnishMap, 1);

		glEnable(GL_CULL_FACE);
        sphereBatch.Draw();
		glDisable(GL_CULL_FACE);
	modelViewMatrix.PopMatrix();

	modelViewMatrix.PushMatrix();
	    modelViewMatrix.MultMatrix(mCameraRotOnly);
		glUseProgram(skyBoxShader);
		glUniformMatrix4fv(locMVPSkyBox, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix());
		cubeBatch.Draw();       
    modelViewMatrix.PopMatrix();
        
    // Do the buffer Swap
    glutSwapBuffers();
    }
Esempio n. 5
0
// Called to draw scene objects
void DrawModels(void)
{
    M3DVector3f lightPosEye;
    M3DMatrix44f mv, mv2;
    M3DMatrix44f mv2IT_4x4;
    GLfloat mv2IT_3x3[9];
    GLint i;

    // Transform light position to eye space
    glGetFloatv(GL_MODELVIEW_MATRIX, mv);
    m3dTransformVector3(lightPosEye, lightPos, mv);

    glUniform3fv(lightPosLoc, 1, lightPosEye);

    // Setup modelview matrices for upper arm
    glPushMatrix();
    glRotatef(elbowBend, 0.0f, 0.0f, 1.0f);
    glTranslatef(-50.0f, 0.0f, 0.0f);
    glGetFloatv(GL_MODELVIEW_MATRIX, mv2);
    glPopMatrix();
    glTranslatef(-50.0f, 0.0f, 0.0f);

    glUniformMatrix4fv(mv2Loc, 1, GL_FALSE, mv2);

    m3dInvertMatrix44(mv2IT_4x4, mv2);

    // Take upper left 3x3 for 2nd normal matrix
    for (i = 0; i < 9; i++)
    {
        mv2IT_3x3[i] = mv2IT_4x4[((i/3)*4)+(i%3)];
    }
    glUniformMatrix3fv(mv2ITLoc, 1, GL_TRUE, mv2IT_3x3);

    // Draw upper arm cylinder
    glColor3f(0.0f, 0.0f, 0.90f);      // Blue
    // 50 long, 10 shoulder, 9 elbow, with weights applied to second half
    DrawCylinder(50.0f, 15.0f, 9.0f, 1.0f, 0.5f);

    // Setup modelview matrices for forearm
    glTranslatef(50.0f, 0.0f, 0.0f);
    glPushMatrix();
    glGetFloatv(GL_MODELVIEW_MATRIX, mv2);
    glPopMatrix();
    glRotatef(elbowBend, 0.0f, 0.0f, 1.0f);

    glUniformMatrix4fv(mv2Loc, 1, GL_FALSE, mv2);

    m3dInvertMatrix44(mv2IT_4x4, mv2);

    // Take upper left 3x3 for 2nd normal matrix
    for (i = 0; i < 9; i++)
    {
        mv2IT_3x3[i] = mv2IT_4x4[((i/3)*4)+(i%3)];
    }
    glUniformMatrix3fv(mv2ITLoc, 1, GL_TRUE, mv2IT_3x3);

    // Draw forearm cylinder
    glColor3f(0.9f, 0.0f, 0.0f);       // Red
    // 40 long, 9 elbow, 5 wrist, with weights applied to first half
    DrawCylinder(40.0f, 9.0f, 5.0f, 0.5f, 1.0f);
}