void drawObjects(GLuint shaderId){

    glUniformMatrix4fv(glGetUniformLocation(shaderId, "projMatrix"), 1, GL_TRUE, projectionMatrix.m);
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "viewMatrix"), 1, GL_TRUE, viewMatrix.m);
    glUniform3f(glGetUniformLocation(shaderId,"lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z);

    //bunny
    setTextureMatrix(modelMatrix);
    glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.9); // Brighter objects
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, modelMatrix.m);
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    glUniform3f(glGetUniformLocation(shaderId,"objectColor"), bunnyColor.x, bunnyColor.y, bunnyColor.z);
    DrawModel(bunny, shaderId, "in_Position", NULL, NULL);

    //Box
    setTextureMatrix(boxMatrix);
    glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.9); // Brighter objects
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, boxMatrix.m);
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    glUniform3f(glGetUniformLocation(shaderId,"objectColor"),1.0,1.0,1.0);
    DrawModel(box, shaderId, "in_Position", NULL, NULL);

    //Statue
    setTextureMatrix(statueMatrix);
    glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.9); // Brighter objects
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, statueMatrix.m);
    glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    glUniform3f(glGetUniformLocation(shaderId,"objectColor"),1.0,1.0,1.0);
    DrawModel(statue, shaderId, "in_Position", NULL, NULL);


    // //scene
    // setTextureMatrix(bottomModelMatrix);
    // glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.5); // Brighter objects
    // glUniform3f(glGetUniformLocation(shaderId,"objectColor"), sceneColor.x, sceneColor.y, sceneColor.z);
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, bottomModelMatrix.m);
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    // DrawModel(bottom, shaderId, "in_Position", NULL,NULL);

    // setTextureMatrix(side1ModelMatrix);
    // glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.5); // Brighter objects
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, side1ModelMatrix.m);
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    // DrawModel(side1, shaderId, "in_Position", NULL, NULL);


    // setTextureMatrix(side2ModelMatrix);
    // glUniform1f(glGetUniformLocation(shaderId, "shade"), 0.5); // Brighter objects
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "modelMatrix"), 1, GL_TRUE, side2ModelMatrix.m);
    // glUniformMatrix4fv(glGetUniformLocation(shaderId, "textureMatrix"), 1, GL_TRUE, textureMatrix.m);
    // DrawModel(side2, shaderId, "in_Position", NULL, NULL);

}
Exemple #2
0
void draw1(void)
{
  setTextureMatrix();
  glTranslatef(pos[1][0], pos[1][1], pos[1][2]);
  glRotatef(angle[1][2], 0.0, 0.0, 1.0);//z軸回転
  glRotatef(angle[1][1], 0.0, 1.0, 0.0);//y軸回転
  glRotatef(angle[1][0] + ang, 1.0, 0.0, 0.0);//x軸回転
  glScalef(scale[1][0], scale[1][1], scale[1][2]);

  float ambient[] = { 0.3, 0.3, 0.3, 1.0};
  float diffuse[] = { 0.7, 0.7, 0.7, 1.0};
  float specular[]= { 0.5, 0.5, 0.5, 1.0};
  glMaterialfv(GL_FRONT,GL_AMBIENT,ambient);
  glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);
  glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
  glMaterialf(GL_FRONT,GL_SHININESS,100);

	//モデルビュー変換行列に戻す
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
	glTranslatef(pos[1][0], pos[1][1], pos[1][2]);
  glRotatef(angle[1][2], 0.0, 0.0, 1.0);//z軸回転
  glRotatef(angle[1][1], 0.0, 1.0, 0.0);//y軸回転
  glRotatef(angle[1][0] + ang, 1.0, 0.0, 0.0);//x軸回転
  glScalef(scale[1][0], scale[1][1], scale[1][2]);
	drawBumpCube(1.0, 1, 1);
  glPopMatrix();
}
void renderScene(void) 
{
	update();

	
	//First step: Render from the light POV to a FBO, story depth values only
	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fboId);	//Rendering offscreen
	
	//Using the fixed pipeline to render to the depthbuffer
	glUseProgramObjectARB(0);
	
	// In the case we render the shadowmap to a higher resolution, the viewport must be modified accordingly.
	glViewport(0,0,RENDER_WIDTH * SHADOW_MAP_RATIO,RENDER_HEIGHT* SHADOW_MAP_RATIO);
	
	// Clear previous frame values
	glClear( GL_DEPTH_BUFFER_BIT);
	
	//Disable color rendering, we only want to write to the Z-Buffer
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
	
	setupMatrices(p_light[0],p_light[1],p_light[2],l_light[0],l_light[1],l_light[2]);
	
	// Culling switching, rendering only backface, this is done to avoid self-shadowing
	glCullFace(GL_FRONT);
	drawObjects();
	
	//Save modelview/projection matrice into texture7, also add a biais
	setTextureMatrix();
	
	
	// Now rendering from the camera POV, using the FBO to generate shadows
	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
	
	glViewport(0,0,RENDER_WIDTH,RENDER_HEIGHT);
	
	//Enabling color write (previously disabled for light POV z-buffer rendering)
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
	
	// Clear previous frame values
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//Using the shadow shader
	glUseProgramObjectARB(shadowShaderId);
	glUniform1iARB(shadowMapUniform,7);
	glActiveTextureARB(GL_TEXTURE7);
	glBindTexture(GL_TEXTURE_2D,depthTextureId);
	
	setupMatrices(p_camera[0],p_camera[1],p_camera[2],l_camera[0],l_camera[1],l_camera[2]);
	
	glCullFace(GL_BACK);
	
	drawObjects();
	
	
	glutSwapBuffers();
}
Exemple #4
0
void Painter::restoreSavedState()
{
    m_oldStateIndex--;
    setResolution(m_olderStates[m_oldStateIndex].resolution);
    setProjectionMatrix(m_olderStates[m_oldStateIndex].projectionMatrix);
    setTextureMatrix(m_olderStates[m_oldStateIndex].textureMatrix);
    setColor(m_olderStates[m_oldStateIndex].color);
    setOpacity(m_olderStates[m_oldStateIndex].opacity);
    setCompositionMode(m_olderStates[m_oldStateIndex].compositionMode);
    setClipRect(m_olderStates[m_oldStateIndex].clipRect);
    setShaderProgram(m_olderStates[m_oldStateIndex].shaderProgram);
    setTexture(m_olderStates[m_oldStateIndex].texture);
    setAlphaWriting(m_olderStates[m_oldStateIndex].alphaWriting);
}
Exemple #5
0
void Painter::setTexture(Texture* texture)
{
    if(m_texture == texture)
        return;

    m_texture = texture;

    uint glTextureId;
    if(texture) {
        setTextureMatrix(texture->getTransformMatrix());
        glTextureId = texture->getId();
    } else
        glTextureId = 0;

    if(m_glTextureId != glTextureId) {
        m_glTextureId = glTextureId;
        updateGlTexture();
    }
}
Exemple #6
0
void PerPixelRenderer::render(Renderable& rend)
{
    if(_released) {
        DefaultRenderer::render(rend);
        return;
    }

    glEnable(GL_TEXTURE_2D);
    //render shadow map
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    for(int i=0; i<MAX_LIGHTS; i++)
        if(glIsEnabled(GL_LIGHT0+i)) {
            glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,_fboId[i]);
            glViewport(0,0,_w*_shadowRatio,_h*_shadowRatio);
            setupMatrices(i);
            setTextureMatrix(i);
            glCullFace(GL_FRONT);
            beforeShadowDraw(i);
            rend.drawObject();
            glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
            afterShadowDraw(i);
        }
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    //render scene
    glViewport(0,0,_w,_h);
    glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    if(_showLight)drawLights();
    if(_shaderDraw)_shaderDraw->begin();
    beforeShadowRender(_shaderDraw);
    glCullFace(GL_BACK);
    rend.drawObject();
    if(_shaderDraw)_shaderDraw->end();
}
Exemple #7
0
void drawGround()
{
  setTextureMatrix();
	glRotatef(-90.0, 1.0, 0.0, 0.0);

	float ambient[] = { 0.2f, 0.2f, 0.2f};
  float diffuse[] = { 0.8f, 0.8f, 0.8f};
  float specular[]= { 0.3f, 0.3f, 0.3f};
	glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);
	glMaterialfv(GL_FRONT,GL_AMBIENT,ambient);
	glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
	glMaterialf(GL_FRONT,GL_SHININESS,100);
  
	//モデルビュー変換行列に戻す
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
	glRotatef(-90.0, 1.0, 0.0, 0.0);
	drawBumpPlate(10.0, 5, 5);
  glPopMatrix();
}
Exemple #8
0
void drawFloor0(float widthX, float widthZ, int nx, int nz)
{
  int i, j;
  //Floor1枚当たりの幅
  float wX = widthX / (float)nx;
  float wZ = widthZ / (float)nz;

  float diffuse[][4] = {
	{ 0.7, 0.7, 0.6, 1.0}, { 0.3f, 0.4, 0.4, 1.0} };
  float ambient[] = { 0.2, 0.2, 0.2, 1.0};
  float specular[]= { 0.5, 0.5, 0.5, 1.0};
  glMaterialfv(GL_FRONT,GL_AMBIENT,ambient);
  glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
  glMaterialf(GL_FRONT,GL_SHININESS,100);

	setTextureMatrix();
  //通常の描画設定に戻す 
	glMatrixMode(GL_MODELVIEW);
  glNormal3f(0.0, 1.0, 0.0);
  glPushMatrix();
  for (j = 0; j < nz; j++) 
  {
    float z1 = -widthZ / 2.0 + wZ * j; float z2 = z1 + wZ;
    for (i = 0; i < nx; i++) {
      float x1 = -widthX / 2.0 + wX * i; float x2 = x1 + wX;

      glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse[(i + j) & 1]);
			glBegin(GL_QUADS);
      glVertex3f(x1, 0.0, z1);
      glVertex3f(x1, 0.0, z2);
      glVertex3f(x2, 0.0, z2);
      glVertex3f(x2, 0.0, z1);
			glEnd();
    }
  }
  glPopMatrix();
}
Exemple #9
0
void draw1(void)
{
  float ambient[] = { 0.2, 0.1, 0.1, 1.0};
  float diffuse[] = { 0.8, 0.2, 0.2, 1.0};
  float specular[]= { 0.5, 0.5, 0.5, 1.0};

	if(flagShadow) 
  {
	  glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,shadowDiffuse);
	  glMaterialfv(GL_FRONT,GL_SPECULAR,shadowSpecular);
  }
  else
  {	
	  glMaterialfv(GL_FRONT,GL_AMBIENT,ambient);
	  glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);
	  glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
	  glMaterialf(GL_FRONT,GL_SHININESS,100);
  }

	setTextureMatrix();
  //テクスチャ座標のためのモデリング変換
	glTranslatef(pos[1][0], pos[1][1], pos[1][2]);
  glRotatef(angle[1][2], 0.0, 0.0, 1.0);//z軸回転
  glRotatef(angle[1][1], 0.0, 1.0, 0.0);//y軸回転
  glRotatef(angle[1][0] + ang, 1.0, 0.0, 0.0);//x軸回転
  glScalef(scale[1][0], scale[1][1], scale[1][2]);
  //通常のモデルビュー変換に戻す 
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
	glTranslatef(pos[1][0], pos[1][1], pos[1][2]);
  glRotatef(angle[1][2], 0.0, 0.0, 1.0);//z軸回転
  glRotatef(angle[1][1], 0.0, 1.0, 0.0);//y軸回転
  glRotatef(angle[1][0] + ang, 1.0, 0.0, 0.0);//x軸回転
  glScalef(scale[1][0], scale[1][1], scale[1][2]);
	glutSolidCube(1.0);
  glPopMatrix();
}
Exemple #10
0
void Mesh::drawVBOs() {
  // scale it so it fits in the window
  Vec3f center; bbox.getCenter(center);
  float s = 1/bbox.maxDim();
  glScalef(s,s,s);
  glTranslatef(-center.x(),-center.y(),-center.z());

  // setup the light
  Vec3f light_position = LightPosition();
  GLfloat position[4] = { float(light_position.x()),float(light_position.y()),float(light_position.z()),1 };
  glLightfv(GL_LIGHT1, GL_POSITION, position);
  
  if (args->glsl_enabled) {
  
  
    glEnable(GL_DEPTH_TEST);
    glClearColor(0,0,0,1.0f);
    glEnable(GL_CULL_FACE);
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    
    //BEGIN SHADOW FUN/////////////===================================
    
    //First step: Render from the light POV to a FBO, story depth values only
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fboId);  //Rendering offscreen
    
    //Using the fixed pipeline to render to the depthbuffer
    glUseProgramObjectARB(0);
      
    
    // In the case we render the shadowmap to a higher resolution, the viewport must be modified accordingly.
    glViewport(0,0,args->width * SHADOW_MAP_RATIO,args->height* SHADOW_MAP_RATIO);
    
    // Clear previous frame values
    glClear(GL_DEPTH_BUFFER_BIT);
    
    //Disable color rendering, we only want to write to the Z-Buffer
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
    
    
    
    //LIGHT POSITION==========================================================================================
    setupMatrices(float(light_position.x()),float(light_position.y()),float(light_position.z()),
            10,10,1);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,args->width/args->height,1.0f,1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt((float)light_position.x(),(float)light_position.y(),(float)light_position.z(),0,0,0,0,1,0);
            
    
    // Culling switching, rendering only backface, this is done to avoid self-shadowing
    glCullFace(GL_FRONT);
     
    
    //===========Draw the Things===================================================================================
    InsertColor(floor_color);
    DrawFloor();
    //startTranslate(0,0,0);
    //glutSolidCube(1);
    
    InsertColor(mesh_color);
    glUseProgramObjectARB(GLCanvas::program);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));
    DrawMesh(table, board_tri_verts_VBO);
    DrawPieces(editBoard());

    //endTranslate();
    
    glUseProgramObjectARB(0);
    
    //=============================================================================================================
    
    //Save modelview/projection matrice into texture7, also add a biais
    setTextureMatrix();
    
    
    // Now rendering from the camera POV, using the FBO to generate shadows
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
    
    glViewport(0,0,args->width,args->height);
    
    //Enabling color write (previously disabled for light POV z-buffer rendering)
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
    
    // Clear previous frame values
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      
    //Using the shadow shader
    glUseProgramObjectARB(GLCanvas::program);

    glUniform1iARB(shadowMapUniform,7);
    glActiveTextureARB(GL_TEXTURE7);
    glBindTexture(GL_TEXTURE_2D,depthTextureId);
    
    Vec3f cam_position = camera->camera_position;
    Vec3f interest = camera->point_of_interest;
    
    //CAMERA MATRIX=======================================================================================================
    //setupMatrices(cam_pos[0],cam_pos[1],cam_pos[2],interest[0],interest[1],interest[2]);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45,args->width/args->height,1.0f,1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt((float)cam_position.x(),(float)cam_position.y(),(float)cam_position.z(),(float)interest.x(),(float)interest.y(),(float)interest.z(),0,1,0);
    
    glCullFace(GL_BACK);
    //============================Draw the things
    InsertColor(floor_color);
    DrawFloor();
    //startTranslate(0,0,0);
    //glutSolidCube(1);
    
    InsertColor(mesh_color);
    glUseProgramObjectARB(GLCanvas::program);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));
    DrawMesh(table, board_tri_verts_VBO);
    DrawPieces(editBoard());

    //endTranslate();
    
    glUseProgramObjectARB(0);
    
    //============================All the things
    
    // DEBUG only. this piece of code draw the depth buffer onscreen
    //*
    glUseProgramObjectARB(0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-args->width/2,args->width/2,-args->height/2,args->height/2,1,20);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor4f(1,1,1,1);
    glActiveTextureARB(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,depthTextureId);
    glEnable(GL_TEXTURE_2D);
    glTranslated(0,0,-1);
    glBegin(GL_QUADS);
    glTexCoord2d(0,0);glVertex3f(0,0,0);
    glTexCoord2d(1,0);glVertex3f(args->width/2,0,0);
    glTexCoord2d(1,1);glVertex3f(args->width/2,args->width/2,0);
    glTexCoord2d(0,1);glVertex3f(0,args->height/2,0);
     
    glEnd();
    glDisable(GL_TEXTURE_2D);
    //*/
    
    //glutSwapBuffers();

    glDisable(GL_STENCIL_TEST);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(1);
    
	  //END SHADOW FUN//////////////////////////////////////////////////
  }
  else
  {
    InsertColor(floor_color);
    DrawFloor();
    
    InsertColor(mesh_color);
    glColor3b(GLbyte(240-127), GLbyte(184-127), GLbyte(0-127));

    DrawMesh(table, board_tri_verts_VBO);
    if(args->board_control)
    {
      DrawControlMap();
    }
    DrawPieces(editBoard());
  }
  

  // -------------------------
  // ADDITIONAL VISUALIZATIONS (for debugging)
  glColor3f(1,1,0);
  //DrawLight();
  if (args->bounding_box) {
    glColor3f(0,0,0);
    bbox.drawVBOs();
  }
    
  HandleGLError(); 
}
Exemple #11
0
void GLAnalyzer2::paintGL() {
  // Compute the dT since the last call to paintGL and update timings
  timeval tv;
  gettimeofday(&tv, nullptr);
  double currentTime = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
  show.dT = currentTime - show.timeStamp;
  show.timeStamp = currentTime;

  // Clear frame
  glClear(GL_COLOR_BUFFER_BIT);

  // Shitch to MODEL matrix and reset it to default
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  // Fade the previous drawings.
  /*    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
      glBegin( GL_TRIANGLE_STRIP );
        glColor4f( 0.0f, 0.0f, 0.0f, 0.2f );
        glVertex2f( 10.0f, 10.0f );
        glVertex2f( -10.0f, 10.0f );
        glVertex2f( 10.0f, -10.0f );
        glVertex2f( -10.0f, -10.0f );
      glEnd();*/

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_TEXTURE_2D);
  float alphaN = show.paused ? 0.2 : (frame.energy / 10.0),
        alphaP = show.paused ? 1.0 : (1 - frame.energy / 20.0);
  if (alphaN > 1.0) alphaN = 1.0;
  if (alphaP < 0.1) alphaP = 0.1;
  glBindTexture(GL_TEXTURE_2D, w2Texture);
  setTextureMatrix(show.rotDegrees, 0.707 * alphaP);
  glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  glBegin(GL_TRIANGLE_STRIP);
  glTexCoord2f(1.0, 1.0);
  glVertex2f(10.0f, 10.0f);
  glTexCoord2f(0.0, 1.0);
  glVertex2f(-10.0f, 10.0f);
  glTexCoord2f(1.0, 0.0);
  glVertex2f(10.0f, -10.0f);
  glTexCoord2f(0.0, 0.0);
  glVertex2f(-10.0f, -10.0f);
  glEnd();
  glBindTexture(GL_TEXTURE_2D, w1Texture);
  setTextureMatrix(-show.rotDegrees * 2, 0.707);
  glColor4f(1.0f, 1.0f, 1.0f, alphaN);
  glBegin(GL_TRIANGLE_STRIP);
  glTexCoord2f(1.0, 1.0);
  glVertex2f(10.0f, 10.0f);
  glTexCoord2f(0.0, 1.0);
  glVertex2f(-10.0f, 10.0f);
  glTexCoord2f(1.0, 0.0);
  glVertex2f(10.0f, -10.0f);
  glTexCoord2f(0.0, 0.0);
  glVertex2f(-10.0f, -10.0f);
  glEnd();
  setTextureMatrix(0.0, 0.0);
  glDisable(GL_TEXTURE_2D);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE);

  // Here begins the real draw loop
  // some updates to the show
  show.rotDegrees += 40.0 * show.dT;
  frame.rotDegrees += 80.0 * show.dT;

  // handle the 'pause' status
  if (show.paused) {
    if (show.pauseTimer > 0.5) {
      if (show.pauseTimer > 0.6) show.pauseTimer -= 0.6;
      drawFullDot(0.0f, 0.4f, 0.8f, 1.0f);
      drawFullDot(0.0f, 0.4f, 0.8f, 1.0f);
    }
    show.pauseTimer += show.dT;
    return;
  }

  if (dotTexture) {
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, dotTexture);
  } else
    glDisable(GL_TEXTURE_2D);

  glLoadIdentity();
  //    glRotatef( -frame.rotDegrees, 0,0,1 );
  glBegin(GL_QUADS);
  //     Particle * particle = particleList.first();
  //     for (; particle; particle = particleList.next())
  {
    glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
    drawDot(0, 0, kMax(10.0, (10.0 * frame.energy)));
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    drawDot(6, 0, kMax(10.0, (5.0 * frame.energy)));
    glColor4f(0.0f, 0.4f, 1.0f, 1.0f);
    drawDot(-6, 0, kMax(10.0, (5.0 * frame.energy)));
  }
  glEnd();
}
Exemple #12
0
/*
 * The main display function. (Where all the magic happens).
 * Five renders done here.
 * 1) Depth render. Stores depth and depth squared for VSM
 * 2) Gaussian Blur render. Blurs depth render's output
 * 3) Light Path Tracing render. Path traces light rays for light scattering effect
 * 4) Main render. Rendered with shadows and without light scattering. Has phong illumination and shading, bump map.
 * 5) Light Scattering Overlay render. Overlays the output of the Light Path Tracing render as an additive overlay over the current scene.
 *
 */
void RenderEngine::renderScene() {
		//==FIRST RENDER: DEPTH BUFFER
		//Render from the light POV to a FBO, store depth and square depth in a 32F frameBuffer
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,shadowFboId);

		//Using the depth shader to do so
		glUseProgramObjectARB(depthShade->getProgram());
		// In the case we render the shadowmap to a higher resolution, the viewport must be modified accordingly.
		glViewport(0,0,kRenderWidth * kShadowMapCoef,kRenderHeight* kShadowMapCoef);
		//try to make shadow view "bigger" than normal view

		// Clear previous frame values
		glClearColor(0,0,0,1.0f);
		glClear( GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT);
		setupMatrices(p_light[0],p_light[1],p_light[2],l_light[0],l_light[1],l_light[2],0,1,0,10,100,120);

		// Culling switching, rendering only backface, this is done to avoid self-shadowing and improve efficiency
		glCullFace(GL_FRONT);
		//draw objects using the depth shader
		//drawObjects(depthShade);
		drawObjectTarget(depthShade);

		//cout << "0 " << glGetError() << endl;
		glGenerateMipmapEXT(GL_TEXTURE_2D);
		//Save modelview/projection matrice into texture7, also add a biais
		setTextureMatrix();

		//==SECOND (and a half) RENDER: DOUBLE PASS GAUSSIAN BLUR
		blurShadowMap(); 

		//==THIRD RENDER: PATH TRACED LIGHT SCATTERING EFFECT (CREPUSCULAR RAYS)
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,scatterFboId);

		glViewport(0,0,kLightScatterWidth,kLightScatterHeight);

		// Clear previous frame values
		if(deathScatter) {  
				//glClearColor(1,1,1,1.0f);
				glClearColor(1,0,0,1.0f);

		} else {
				glClearColor(0,0,0,1.0f);
		}
		//glClearColor(1,1,1,1.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		//Using the shadow shader
		glUseProgramObjectARB(darkShade->getProgram());
		glBindTexture(GL_TEXTURE_2D,colorTextureId);

		setupMatrices(p_camera[0],p_camera[1],p_camera[2],l_camera[0],l_camera[1],l_camera[2],u_camera[0],u_camera[1],u_camera[2],0.5,120,70);

		glCullFace(GL_BACK);

		//Draw light
		glPushMatrix();
		glTranslatef(p_light_scatter[0],p_light_scatter[1],p_light_scatter[2]);
		glColor4f(1.0,1.0,1.0,1.0);
		glutSolidSphere(30,20,20);
		glPopMatrix();

		//Draw objects in black
		glColor4f(0.0f,0.0f,0.0f,1);
		//drawObjects(darkShade);
		drawObjectTarget(darkShade);


		//==FOURTH RENDER: MAIN RENDER (without light scattering)
		// Now rendering from the camera POV, using the FBO to generate shadows
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);

		glViewport(0,0,kRenderWidth,kRenderHeight);

		// Clear previous frame values
		//glClearColor(.764705882,.890196078,1,1.0f);
		glClearColor(skyColor[0], skyColor[1], skyColor[2], skyColor[3]);

		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		//Using the shadow shader
		glUseProgramObjectARB(shade->getProgram());
		//glUniform1iARB(shade->getShadowMapAttrib(),7);
		glActiveTextureARB(GL_TEXTURE7);
		glBindTexture(GL_TEXTURE_2D,colorTextureId);

		//declared in third pass
		//setupMatrices(p_camera[0],p_camera[1],p_camera[2],l_camera[0],l_camera[1],l_camera[2],u_camera[0],u_camera[1],u_camera[2],1,120);

		//okay seriously, why do we have vec and float[] is required by openGL -_-
		float tempLight[4] = {p_light[0], p_light[1], p_light[2], 1};
		glLightfv(GL_LIGHT0, GL_POSITION, tempLight);

		glCullFace(GL_BACK);
		//draw objects using our shadow shader
		//drawObjects(shade);
		drawObjectTarget(shade);

		//==FIFTH PASS: LIGHT SCATTERING OVERLAY
		//uses main screen
		//glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
		//glViewport(0,0,kRenderWidth,kRenderHeight);
		glClear (GL_DEPTH_BUFFER_BIT );

		//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glUseProgramObjectARB(scatterShade->getProgram());
		//default values

		vec2 cameraSpaceLightPos = getLightScreenCoor();
		glUniform1fARB(scatterShade->getExposureAttrib(),0.0034);
		glUniform1fARB(scatterShade->getDecayAttrib(),1.0);
		glUniform1fARB(scatterShade->getDensityAttrib(),0.84);
		glUniform1fARB(scatterShade->getWeightAttrib(),5.65);
		glUniform1iARB(scatterShade->getTextureAttrib(),0);
		glUniform2fARB(scatterShade->getLightPositionOnScreenAttrib(),cameraSpaceLightPos[0],cameraSpaceLightPos[1]);

		glActiveTextureARB(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D,scatterTextureId);
		glEnable(GL_BLEND); //blend the resulting render
		glBlendFunc(GL_SRC_ALPHA, GL_ONE);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(-kRenderWidth/2,kRenderWidth/2,-kRenderHeight/2,kRenderHeight/2,1,20);
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();

		glColor4f(1.0f,1.0f,1.0f,1); //rectangle to display texture
		glPushMatrix();
		glTranslated(0,0,-5);
		glBegin(GL_QUADS);
		glTexCoord2d(0,0);glVertex3f(-kRenderWidth/2,-kRenderHeight/2,0);
		glTexCoord2d(1,0);glVertex3f(kRenderWidth/2,-kRenderHeight/2,0);
		glTexCoord2d(1,1);glVertex3f(kRenderWidth/2,kRenderHeight/2,0);
		glTexCoord2d(0,1);glVertex3f(-kRenderWidth/2,kRenderHeight/2,0);
		glEnd();
		glPopMatrix();
		glDisable(GL_BLEND);

		drawOverlayTarget();

		/*

			 if(renderOpt.isDepthBuffer())
			 drawDebugBuffer(renderOpt.getDepthBufferOption());
			 */

		glutSwapBuffers();    
}
/** Creates the slip stream object using a moving texture.
 *  \param kart Pointer to the kart to which the slip stream
 *              belongs to.
 */
SlipStream::SlipStream(AbstractKart* kart) : MovingTexture(0, 0), m_kart(kart)
{
    video::SMaterial m;
    m.BackfaceCulling = false;
    m.MaterialType    = video::EMT_SOLID;

    Material *material = material_manager->getMaterial("slipstream.png");
    m.setTexture(0, material->getTexture());
    m.setFlag(video::EMF_BACK_FACE_CULLING, false);
    m.setFlag(video::EMF_COLOR_MATERIAL, true);

    m.ColorMaterial = video::ECM_DIFFUSE_AND_AMBIENT;
    
    m.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;

    createMesh(m);
    m_node = irr_driver->addMesh(m_mesh);
    m_mesh->drop();
    
#ifdef DEBUG
    std::string debug_name = m_kart->getIdent()+" (slip-stream)";
    m_node->setName(debug_name.c_str());
#endif
    m_node->setPosition(core::vector3df(0, 
                                        0*0.25f+2.5,
                                        m_kart->getKartLength()) );
    m_node->setVisible(false);
    setTextureMatrix(&(m_node->getMaterial(0).getTextureMatrix(0)));
    m_slipstream_time      = 0.0f;

    float length = m_kart->getKartProperties()->getSlipstreamLength();
    float kw     = m_kart->getKartWidth();
    float ew     = m_kart->getKartProperties()->getSlipstreamWidth();
    float kl     = m_kart->getKartLength();

    Vec3 p[4];
    p[0]=Vec3(-kw*0.5f, 0, -kl*0.5f       );
    p[1]=Vec3(-ew*0.5f, 0, -kl*0.5f-length);
    p[2]=Vec3( ew*0.5f, 0, -kl*0.5f-length);
    p[3]=Vec3( kw*0.5f, 0, -kl*0.5f       );
    m_slipstream_original_quad = new Quad(p[0], p[1], p[2], p[3]);
    m_slipstream_quad          = new Quad(p[0], p[1], p[2], p[3]);
    if(UserConfigParams::m_slipstream_debug)
    {
        video::SMaterial material;
        material.MaterialType    = video::EMT_TRANSPARENT_ADD_COLOR;
        material.setFlag(video::EMF_BACK_FACE_CULLING, false);
        material.setFlag(video::EMF_LIGHTING, false);

        m_debug_mesh = irr_driver->createQuadMesh(&material, true);
        scene::IMeshBuffer *buffer = m_debug_mesh->getMeshBuffer(0);
        assert(buffer->getVertexType()==video::EVT_STANDARD);
        irr::video::S3DVertex* vertices 
            = (video::S3DVertex*)buffer->getVertices();
        video::SColor red(128, 255, 0, 0);
        for(unsigned int i=0; i<4; i++)
        {
            vertices[i].Pos   = p[i].toIrrVector();
            vertices[i].Color = red;
        }
        buffer->recalculateBoundingBox();
        m_mesh->setBoundingBox(buffer->getBoundingBox());
        m_debug_node = irr_driver->addMesh(m_debug_mesh, m_kart->getNode());
        m_debug_node->grab();
    }
    else
    {
        m_debug_mesh = NULL;
        m_debug_node = NULL;
    }

}   // SlipStream
Exemple #14
0
/** Creates the slip stream object using a moving texture.
 *  \param kart Pointer to the kart to which the slip stream
 *              belongs to.
 */
SlipStream::SlipStream(AbstractKart* kart) : MovingTexture(0, 0), m_kart(kart)
{
    Material *material = material_manager->getMaterial("slipstream.png");

    createMesh(material);
    m_node = irr_driver->addMesh(m_mesh, "splistream");

    scene::IMeshBuffer* buffer = m_mesh->getMeshBuffer(0);
    material->setMaterialProperties(&buffer->getMaterial(), buffer);

    STKMeshSceneNode* stk_node = dynamic_cast<STKMeshSceneNode*>(m_node);
    if (stk_node != NULL)
        stk_node->setReloadEachFrame(true);
    m_mesh->drop();

#ifdef DEBUG
    std::string debug_name = m_kart->getIdent()+" (slip-stream)";
    m_node->setName(debug_name.c_str());
#endif
    m_node->setPosition(core::vector3df(0,
                                        0*0.25f+2.5,
                                        m_kart->getKartLength()) );
    m_node->setVisible(false);
    setTextureMatrix(&(m_node->getMaterial(0).getTextureMatrix(0)));
    m_slipstream_time      = 0.0f;

    float length = m_kart->getKartProperties()->getSlipstreamLength() *
                   m_kart->getPlayerDifficulty()->getSlipstreamLength();
    float kw     = m_kart->getKartWidth();
    float ew     = m_kart->getKartProperties()->getSlipstreamWidth() *
                   m_kart->getPlayerDifficulty()->getSlipstreamWidth();
    float kl     = m_kart->getKartLength();

    Vec3 p[4];
    p[0]=Vec3(-kw*0.5f, 0, -kl*0.5f       );
    p[1]=Vec3(-ew*0.5f, 0, -kl*0.5f-length);
    p[2]=Vec3( ew*0.5f, 0, -kl*0.5f-length);
    p[3]=Vec3( kw*0.5f, 0, -kl*0.5f       );
    m_slipstream_original_quad = new Quad(p[0], p[1], p[2], p[3]);
    m_slipstream_quad          = new Quad(p[0], p[1], p[2], p[3]);
    if(UserConfigParams::m_slipstream_debug)
    {
        video::SMaterial material;
        material.MaterialType    = video::EMT_TRANSPARENT_ADD_COLOR;
        material.setFlag(video::EMF_BACK_FACE_CULLING, false);
        material.setFlag(video::EMF_LIGHTING, false);

        m_debug_mesh = irr_driver->createQuadMesh(&material, true);
        scene::IMeshBuffer *buffer = m_debug_mesh->getMeshBuffer(0);
        assert(buffer->getVertexType()==video::EVT_STANDARD);
        irr::video::S3DVertex* vertices
            = (video::S3DVertex*)buffer->getVertices();
        video::SColor red(128, 255, 0, 0);
        for(unsigned int i=0; i<4; i++)
        {
            vertices[i].Pos   = p[i].toIrrVector();
            vertices[i].Color = red;
            vertices[i].TCoords = core::vector2df(0, 0);
        }
        video::SMaterial &mat = buffer->getMaterial();
        // Meshes need a texture, otherwise stk crashes.
        video::ITexture *red_texture = getUnicolorTexture(red);
        mat.setTexture(0, red_texture);

        buffer->recalculateBoundingBox();
        m_mesh->setBoundingBox(buffer->getBoundingBox());
        m_debug_node = irr_driver->addMesh(m_debug_mesh, "splistream_debug", m_kart->getNode());
        m_debug_node->grab();
    }
    else
    {
        m_debug_mesh = NULL;
        m_debug_node = NULL;
    }

}   // SlipStream