Esempio n. 1
0
/* display() draws a triangle at an angle.
 */
void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);

   glColor3f (1.0f, 0.75f, 0.0f);
   glBegin (GL_TRIANGLES);
   glFogCoordfEXT (f1); 
   glVertex3f (2.0f, -2.0f, 0.0f);
   glFogCoordfEXT (f2); 
   glVertex3f (-2.0f, 0.0f, -5.0f);
   glFogCoordfEXT (f3); 
   glVertex3f (0.0f, 2.0f, -10.0f);
   glEnd();

   glutSwapBuffers();
}
Esempio n. 2
0
void GLWidget::VolumeFog()
{
    glLoadIdentity();
    setRotate();
    glEnable(GL_FOG);
    glBegin(GL_QUADS);							//后墙
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f);
        glEnd();

        glBegin(GL_QUADS);							// 地面
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f);
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f);
        glEnd();

        glBegin(GL_QUADS);							// 天花板
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f);
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f);
        glEnd();

        glBegin(GL_QUADS);							// 右墙
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f);
        glEnd();

        glBegin(GL_QUADS);							// 左墙
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f);
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f);
            glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f);
        glEnd();

        glBegin(GL_QUADS);							//前墙
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f);
            glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f);
        glEnd();
        glDisable(GL_FOG);

}
Esempio n. 3
0
static void
glFogCoordf_ext (GLfloat f)
{
   if (fogCoord)
      glFogCoordfEXT(f);
}
Esempio n. 4
0
int GLDriver::drawFog(GeometryList* l)
{
	int count = 0;

	for(int j = 0; j < l->faceCount; ++j)
	{
		int i = l->faces[j];
		//qmap->pMapShader[qmap->pFace[i].texture].pShader;
		//if(qmap->pFace[i].effect != NULL)
		//if(shader->getSurfaceParam() & Fog)
		{
			if(qmap->pFace[i].effect != NULL)
			{
				Q3Shader* shader = qmap->pFace[i].effect->shader;
				if(!(shader->getSurfaceParam() & Fog))
					continue;

				float x1, x2, y1, y2, z1, z2;

				Q3Brush* brush = qmap->pFace[i].effect->brush;
				if(brush == NULL)
					continue;

				for(int m = brush->brushSideIndex; m < brush->brushSideIndex + brush->numBrushSides; ++m)
				{
					Q3BrushSide* brushSide = &qmap->pBrushSide[m];
					Q3Plane* plane = &qmap->pPlane[brushSide->planeIndex];

					for(int n = brush->brushSideIndex; n < brush->brushSideIndex + brush->numBrushSides; ++n)
					{
						Q3BrushSide* otherBrushSide = &qmap->pBrushSide[n];
						if(otherBrushSide != brushSide)
						{
							Q3Plane* otherPlane = &qmap->pPlane[otherBrushSide->planeIndex];
							if(otherPlane->normal.isOpposite(plane->normal))
							{
								if(plane->normal.x > 0)
								{
									x1 = plane->distance;
									x2 = otherPlane->distance;
								}
								else if(plane->normal.x < 0)
								{
									x2 = plane->distance;
									x1 = otherPlane->distance;
								}
								else if(plane->normal.y > 0)
								{
									y1 = plane->distance;
									y2 = otherPlane->distance;
								}
								else if(plane->normal.y < 0)
								{
									y2 = plane->distance;
									y1 = otherPlane->distance;
								}
								else if(plane->normal.z > 0)
								{
									z1 = plane->distance;
									z2 = otherPlane->distance;
								}
								else if(plane->normal.z < 0)
								{
									z2 = plane->distance;
									z1 = otherPlane->distance;
								}
							}
						}
					}
				}

				glDisable(GL_BLEND);
glEnable(GL_ALPHA_TEST);

glDepthFunc (GL_LEQUAL);						// The Type Of Depth Testing
	glEnable (GL_DEPTH_TEST);						// Enable Depth Testing
	glShadeModel (GL_SMOOTH);						// Select Smooth Shading
	glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	


	float fogColor[4] = {shader->fogParms.r, shader->fogParms.g, shader->fogParms.b, 0.5};
				glEnable(GL_FOG);							// Enable Fog
	glFogi(GL_FOG_MODE, GL_LINEAR);						// Fog Fade Is Linear
	glFogfv(GL_FOG_COLOR, fogColor);					// Set The Fog Color
	glFogf(GL_FOG_START,  0.2f);						// Set The Fog Start (Least Dense)
	glFogf(GL_FOG_END,    1.0f);						// Set The Fog End (Most Dense)
	glHint(GL_FOG_HINT, GL_NICEST);						// Per-Pixel Fog Calculation
	glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);		// Set Fog Based On Vertice Coordinates




				// Now build a list of points
				std::vector<Vec3> points;
				points.push_back(Vec3(x1, y1, z1));
				points.push_back(Vec3(x2, y1, z1));
				points.push_back(Vec3(x2, y2, z1));
				points.push_back(Vec3(x1, y2, z1));
				points.push_back(Vec3(x1, y2, z2));
				points.push_back(Vec3(x2, y2, z2));
				points.push_back(Vec3(x2, y1, z2));
				points.push_back(Vec3(x1, y1, z2));
				
				glDisable(GL_TEXTURE_2D);

				/*glPointSize(20);
				glBegin(GL_POINTS);
				for(int q = 0; q < points.size(); ++q)
				glVertex3f(points[q].x, points[q].y,  points[q].z);
				glEnd();
				continue;*/
				glBegin(GL_QUADS);													// Back Wall
	 	glFogCoordfEXT( 1.0f);	glVertex3f(x1,y1,z1);
		glFogCoordfEXT( 1.3f);		glVertex3f(x2,y1,z1);
		glFogCoordfEXT( 0.2f);	glVertex3f( x2, y2,z1);
		glFogCoordfEXT( 0.3f);	glVertex3f(x1, y2,z1);
	glEnd();

	glBegin(GL_QUADS);													// Floor
	 	glFogCoordfEXT( 1.0f);	glVertex3f(x1,y1,z1);
		glFogCoordfEXT( 1.0f);	glVertex3f( x2,y1,z1);
		glFogCoordfEXT( 1.2f);	glVertex3f( x2,y1, z2);
		glFogCoordfEXT( 1.2f);	glVertex3f(x1,y1, z2);
	glEnd();

	glBegin(GL_QUADS);													// Roof
		glFogCoordfEXT( 1.0f);		glVertex3f(x1, y2,z1);
		glFogCoordfEXT( 1.4f);		glVertex3f( x2, y2,z1);
		glFogCoordfEXT( 1.0f);		glVertex3f( x2, y2, z2);
		glFogCoordfEXT( 1.2f);	glVertex3f(x1, y2, z2);
	glEnd();

	glBegin(GL_QUADS);													// Right Wall
		glFogCoordfEXT( 0.2f);	glVertex3f( x2,y1, z2);
		glFogCoordfEXT( 1.0f);	glVertex3f( x2, y2, z2);
		glFogCoordfEXT( 1.8f);		glVertex3f( x2, y2,z1);
		glFogCoordfEXT( 1.6f);		glVertex3f( x2,y1,z1);
	glEnd();

	glBegin(GL_QUADS);													// Left Wall
	 	glFogCoordfEXT( 1.0f);		glVertex3f(x1,y1, z2);
		glFogCoordfEXT( 1.0f);	glVertex3f(x1, y2, z2);
		glFogCoordfEXT( 1.4f);	glVertex3f(x1, y2,z1);
		glFogCoordfEXT( .3f);	glVertex3f(x1,y1,z1);
	glEnd();
 
			}
		}
	}

	glDisable(GL_FOG);
	return 0;
}