#include "precompiled/PCH.h"
//-----------------------------------------------------------------------------
// Copyright (C) 2001 Radical Entertainment Ltd. All rights reserved.
//
// GLExt.cpp
//
// Description: Functions that do drawing using the OpenGL API.
//
// Modification History:
// + Created Aug 21, 2001 -- bkusy
//-----------------------------------------------------------------------------
//----------------------------------------
// System Includes
//----------------------------------------
#include <windows.h>
#include <assert.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
//----------------------------------------
// Project Includes
//----------------------------------------
#include "GLExt.h"
//----------------------------------------
// Forward References
//----------------------------------------
//----------------------------------------
// Constants, Typedefs and Statics
//----------------------------------------
//=============================================================================
// GLExt::drawCamera3D
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx = 0.0f, double ty = 0.0f, double tz = 0.0f, float width = 1.0f )
//
// Return: void
//
//=============================================================================
void GLExt::drawCamera3D( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
//Set line width
glLineWidth( width );
glBegin( GL_LINES );
//X-Z
glVertex3d(-0.5, 0.0, 0.5 );
glVertex3d( 0.5, 0.0, 0.5 );
glVertex3d( 0.5, 0.0, 0.5 );
glVertex3d( 0.5, 0.0, -0.5 );
glVertex3d( 0.5, 0.0, -0.5 );
glVertex3d( -0.5, 0.0, -0.5 );
glVertex3d( -0.5, 0.0, -0.5 );
glVertex3d( -0.5, 0.0, 0.5 );
glVertex3d( 0.125, 0.0, -0.5 );
glVertex3d( 0.325, 0.0, -0.75 );
glVertex3d( 0.325, 0.0, -0.75 );
glVertex3d( -0.325, 0.0, -0.75 );
glVertex3d( -0.325, 0.0, -0.75 );
glVertex3d( -0.125, 0.0, -0.5 );
//Y-Z
glVertex3d( 0.0, -0.5, 0.5 );
glVertex3d( 0.0, 0.5, 0.5 );
glVertex3d( 0.0, 0.5, 0.5 );
glVertex3d( 0.0, 0.5, -0.5 );
glVertex3d( 0.0, 0.5, -0.5 );
glVertex3d( 0.0, -0.5, -0.5 );
glVertex3d( 0.0, -0.5, -0.5 );
glVertex3d( 0.0, -0.5, 0.5 );
glVertex3d( 0.0, 0.125, -0.5 );
glVertex3d( 0.0, 0.325, -0.75 );
glVertex3d( 0.0, 0.325, -0.75 );
glVertex3d( 0.0, -0.325, -0.75 );
glVertex3d( 0.0, -0.325, -0.75 );
glVertex3d( 0.0, -0.125, -0.5 );
glEnd();
glPopMatrix();
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w C r o s s H a i r 3 D
//
// Synopsis: Draws a camera symbol
//
// Parameters: scale - the scale to draw at.
// x - the x coordinate of the symbol.
// y - the y coordinate of the symbol.
// z - the z coordinate of the symbol.
// width - line width
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawCrossHair3D( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
//Set line width
glLineWidth( width );
glBegin( GL_LINES );
glVertex3d(-1.0, 0.0, 0.0 );
glVertex3d( 1.0, 0.0, 0.0 );
glVertex3d( 0.0, -1.0, 0.0 );
glVertex3d( 0.0, 1.0, 0.0 );
glVertex3d( 0.0, 0.0, -1.0 );
glVertex3d( 0.0, 0.0, 1.0 );
glEnd();
glPopMatrix();
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w C r o s s H a i r 3 D
//
// Synopsis: Draws a camera symbol
//
// Parameters: scale - the scale to draw the symbol at.
// p - where to draw the symbol.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawCrossHair3D( double scale, const MPoint& p, float width )
{
drawCrossHair3D( scale, p.x, p.y, p.z, width );
}
//-----------------------------------------------------------------------------
// d r a w P y r a m i d
//
// Synopsis: Draws a pyramid using OpenGL.
//
// Parameters: scale - factor of scaling for the pyramid.
// tx - x position translation.
// ty - y position translation.
// tz - z position translation.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawPyramid( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_QUAD_STRIP );
glVertex3d(0.5, 0 ,0.5);
glVertex3d(0, 1, 0);
glVertex3d(0.5, 0, -0.5);
glVertex3d(0, 1, 0);
glVertex3d(-0.5, 0, -0.5);
glVertex3d(0, 1, 0);
glVertex3d(-0.5, 0 ,0.5);
glVertex3d(0, 1, 0);
glVertex3d(0.5, 0 ,0.5);
glVertex3d(0, 1, 0);
glEnd();
glPopMatrix();
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w P y r a m i d
//
// Synopsis: Draws a pyramid using OpenGL.
//
// Parameters: scale - factor of scaling for the pyramid.
// p0 - the point at which to draw the pyramid.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawPyramid( double scale, const MPoint& p0, float width )
{
drawPyramid( scale, p0.x, p0.y, p0.z, width );
}
//-----------------------------------------------------------------------------
// d r a w S p h e r e
//
// Synopsis:
//
// Parameters: NONE
//
// Returns: NOTHING
//
// Constraints: NONE
//
//------------------------------------------------------radius-----------------------
void GLExt::drawSphere( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
GLUquadricObj* quadric = gluNewQuadric();
gluQuadricDrawStyle( quadric, GLU_LINE );
gluSphere( quadric, 1.0, 12, 6 );
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w S p h e r e
//
// Synopsis:
//
// Parameters: NONE
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawSphere( double scale, const MPoint& p, float width )
{
drawSphere( scale, p.x, p.y, p.z, width );
}
//-----------------------------------------------------------------------------
// d r a w L i n e
//
// Synopsis: Draws a line between the two points.
//
// Parameters: The coordinates of the two points.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawLine( double x0, double y0, double z0,
double x1, double y1, double z1,
float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glBegin( GL_LINES );
glVertex3f( (float)x0, (float)y0, (float)z0 );
glVertex3f( (float)x1, (float)y1, (float)z1 );
glEnd();
//Reset line width
glLineWidth( oldWidth );
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w L i n e
//
// Synopsis: Draws a line between the two points.
//
// Parameters: The points to draw the line between.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawLine( const MPoint& p0, const MPoint& p1, float width )
{
drawLine( p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, width );
}
//=============================================================================
// GLExt::drawArrow
//=============================================================================
// Description: Comment
//
// Parameters: ( const MPoint& p0, const MPoint& p1, float width, float scale )
//
// Return: void
//
//=============================================================================
void GLExt::drawArrow( const MPoint& p0, const MPoint& p1, float width, float scale )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
MVector scaledVector;
scaledVector = p1 - p0;
scaledVector /= scale;
//Figure out a cross product...
MVector normal;
normal = scaledVector^( MVector(0, 1.0, 0 ) );
normal.normalize();
normal *= scaledVector.length();
MPoint head0, head1;
head0 = (p1 - scaledVector + normal );
head1 = (p1 - scaledVector - normal );
//Set line width
glLineWidth( width );
glBegin( GL_LINES );
glVertex3f( (float)p0.x, (float)p0.y, (float)p0.z );
glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
glVertex3f( (float)head0.x, (float)head0.y, (float)head0.z );
glVertex3f( (float)p1.x, (float)p1.y, (float)p1.z );
glVertex3f( (float)head1.x, (float)head1.y, (float)head1.z );
glEnd();
//Reset line width
glLineWidth( oldWidth );
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w B o x
//
// Synopsis: Draws a box using OpenGL.
//
// Parameters: The coordinates of the minimal and maximal corners of the box.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawBox( double x0, double y0, double z0,
double x1, double y1, double z1,
float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin( GL_QUADS );
glVertex3f( (float)x0, (float)y0, (float)z0 );
glVertex3f( (float)x0, (float)y0, (float)z1 );
glVertex3f( (float)x1, (float)y0, (float)z1 );
glVertex3f( (float)x1, (float)y0, (float)z0 );
glVertex3f( (float)x0, (float)y1, (float)z0 );
glVertex3f( (float)x0, (float)y1, (float)z1 );
glVertex3f( (float)x1, (float)y1, (float)z1 );
glVertex3f( (float)x1, (float)y1, (float)z0 );
glEnd();
glBegin( GL_LINES );
glVertex3f( (float)x0, (float)y0, (float)z0 );
glVertex3f( (float)x0, (float)y1, (float)z0 );
glVertex3f( (float)x0, (float)y0, (float)z1 );
glVertex3f( (float)x0, (float)y1, (float)z1 );
glVertex3f( (float)x1, (float)y0, (float)z1 );
glVertex3f( (float)x1, (float)y1, (float)z1 );
glVertex3f( (float)x1, (float)y0, (float)z0 );
glVertex3f( (float)x1, (float)y1, (float)z0 );
glEnd();
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w B o x
//
// Synopsis: Draws a box using OpenGL.
//
// Parameters: p0 - the minimal corner of the box.
// p1 - the maximal corner of the box.
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawBox( const MPoint& p0, const MPoint& p1, float width )
{
drawBox( p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, width );
}
//-----------------------------------------------------------------------------
// d r a w X Z P l a n e
//
// Synopsis: Draws a finite plane in the XZ plane using OpenGL.
//
// Parameters: x0, z0 - the minimal vertex of the finite plane.
// x1, z1 - the maximal vertex of the finite plane.
// y - the height of the plane.
//
//
// Returns: NOTHING
//
// Constraints: NONE
//
//-----------------------------------------------------------------------------
void GLExt::drawXZPlane( double xscale,
double yscale,
double zscale,
double x0,
double z0,
double x1,
double z1,
double y,
float width
)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(xscale, yscale, zscale);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE );
glBegin( GL_QUADS );
glVertex3f( (float)x0, (float)y, (float)z0 );
glVertex3f( (float)x0, (float)y, (float)z1 );
glVertex3f( (float)x1, (float)y, (float)z1 );
glVertex3f( (float)x1, (float)y, (float)z0 );
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//-----------------------------------------------------------------------------
// d r a w X Z P l a n e
//
// Synopsis: Draws a finite plane in the XZ plane using OpenGL.
//
// Parameters: p0 - the minimal vertex of the finite plane.
// p1 - the maximal vertex of the finite plane.
//
// Returns: NOTHING
//
// Constraints: The y component of p1 is ignored and the plane is drawn at
// the height of the first point.
//
//-----------------------------------------------------------------------------
void GLExt::drawXZPlane( double xscale,
double yscale,
double zscale,
const MPoint& v0,
const MPoint& v1,
float width
)
{
drawXZPlane( xscale, yscale, zscale, v0.x, v0.z, v1.x, v1.z, v0.y, width );
}
//=============================================================================
// GLExt::drawP
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawP(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_LOOP );
//Draw a "P" for pickup.
glVertex3d( 0,0,0);
glVertex3d( 0, 2.0, 0);
glVertex3d( 0.7, 2.0, 0);
glVertex3d( 1.2, 1.7, 0);
glVertex3d( 1.2, 1.3, 0);
glVertex3d( 0.7, 1, 0);
glVertex3d( 0, 1, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawStickMan
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawStickMan(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINES );
glVertex3d( 0,0.6,0);
glVertex3d( 0, 1.5, 0);
glVertex3d( -0.5, 1.2, 0.0);
glVertex3d( 0.5, 1.2, 0);
glEnd();
glBegin( GL_LINE_STRIP );
glVertex3d( -0.5, 0, 0 );
glVertex3d( 0, 0.6, 0 );
glVertex3d( 0.5, 0, 0 );
glEnd();
glBegin( GL_QUADS );
glVertex3d( -0.125, 1.5, 0 );
glVertex3d( -0.125, 1.75, 0 );
glVertex3d( 0.125, 1.75, 0 );
glVertex3d( 0.125, 1.5, 0 );
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawCar
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawCar(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_LOOP );
glVertex3d( 0, 0, 0);
glVertex3d( 0, 0, -0.25);
glVertex3d( 0, -0.2, -0.5 );
glVertex3d( 0, 0, -0.75 );
glVertex3d( 0, 0, -1.0 );
glVertex3d( 0, 0.4, -1.0 );
glVertex3d( 0, 0.4, -0.5 );
glVertex3d( 0, 0.7, -0.45 );
glVertex3d( 0, 0.7, 0.25 );
glVertex3d( 0, 0.4, 0.4 );
glVertex3d( 0, 0.3, 1.0 );
glVertex3d( 0, 0, 1.0 );
glVertex3d( 0, 0, 0.75 );
glVertex3d( 0, -0.2, 0.5 );
glVertex3d( 0, 0, 0.25 );
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawA
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawA(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
//Draw an "A" on top of the pyramid
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINES );
glVertex3d( 0, 2.0, 0);
glVertex3d( -0.7, 0, 0);
glVertex3d( 0, 2.0, 0);
glVertex3d( 0.7, 0, 0);
glVertex3d( -0.7, 1.2, 0);
glVertex3d( 0.7, 1.2, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawD
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawD(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
//Draw a "D" on top of the pyramid
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glTranslated( -0.6, 0, 0);
glBegin( GL_LINE_LOOP );
//Draw a "D" for dropoff.
glVertex3d( 0, 0, 0);
glVertex3d( 0, 2.0, 0);
glVertex3d( 0.6, 2.0, 0);
glVertex3d( 1.1, 1.7, 0);
glVertex3d( 1.2, 1, 0);
glVertex3d( 1.1, 0.3, 0);
glVertex3d( 0.6, 0, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawE
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawE(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
//Draw the Letter "E" on top of the pyramid
glPushMatrix();
glScaled(scale, scale, scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINES );
glVertex3d( -0.4, 2, 0);
glVertex3d( -0.4, 0, 0);
glVertex3d( -0.4, 1, 0);
glVertex3d( 0.3, 1, 0);
glVertex3d( -0.4, 0, 0);
glVertex3d( 0.4, 0, 0);
glVertex3d( -0.4, 2, 0);
glVertex3d( 0.4, 2, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawS
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawS(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glTranslated( -0.75, 0, 0);
glBegin( GL_LINE_STRIP );
//Draw an "S" for sound
glVertex3d( 0, 0.3, 0);
glVertex3d( 0.4, 0, 0);
glVertex3d( 1.2, 0, 0);
glVertex3d( 1.5, 0.4, 0);
glVertex3d( 1.2, 0.8, 0);
glVertex3d( 0.3, 1.25, 0);
glVertex3d( 0.05, 1.5, 0);
glVertex3d( 0.25, 1.9, 0);
glVertex3d( 0.9, 2.0, 0);
glVertex3d( 1.4, 1.75, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawCross
//=============================================================================
// Description: Comment
//
// Parameters: (double scale, double tx, double ty, double tz, float width)
//
// Return: void
//
//=============================================================================
void GLExt::drawCross(double scale, double tx, double ty, double tz, float width)
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled( scale, scale, scale );
glTranslated( tx, ty, tz );
glBegin( GL_LINES );
glVertex3d( -1, 0, 0 );
glVertex3d( 1, 0, 0 );
glVertex3d( 0, 1, 0 );
glVertex3d( 0, -1, 0 );
glVertex3d( 0, 0, 1 );
glVertex3d( 0, 0, -1 );
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawLBolt
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawLBolt( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_STRIP );
glVertex3d( 0, 0, 0);
glVertex3d( 0.5, 0.8, 0);
glVertex3d( -0.2, 1.4, 0);
glVertex3d( 0, 2.2, 0);
glVertex3d( -0.5, 1.4, 0);
glVertex3d( 0.2, 0.8, 0);
glVertex3d( 0, 0, 0 );
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawI
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawI( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_STRIP );
glVertex3d( -0.6, 2, 0);
glVertex3d( 0.6, 2, 0);
glVertex3d( 0, 2, 0);
glVertex3d( 0, 0, 0);
glVertex3d( -0.6, 0, 0);
glVertex3d( 0.6, 0, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawW
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawW( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_STRIP );
glVertex3d( -1.0, 2.0, 0);
glVertex3d( -0.5, 0, 0);
glVertex3d( 0, 1.5, 0);
glVertex3d( 0.5, 0, 0);
glVertex3d( 1.0, 2.0, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawM
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawM( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_STRIP );
glVertex3d( -1.0, 0, 0);
glVertex3d( -0.5, 2.0, 0);
glVertex3d( 0, 0.5, 0);
glVertex3d( 0.5, 2.0, 0);
glVertex3d( 1.0, 0, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawC
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawC( double scale, double tx, double ty, double tz, float width )
{
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glScaled(scale,scale,scale);
glTranslated(tx, ty, tz);
glBegin( GL_LINE_STRIP );
//Draw an "C" for carStart
glVertex3d( 0.7, 0.5, 0);
glVertex3d( 0.35, 0, 0);
glVertex3d( -0.35, 0, 0);
glVertex3d( -0.7, 0.5, 0);
glVertex3d( -0.7, 1.5, 0);
glVertex3d( -0.35, 2.0, 0);
glVertex3d( 0.35, 2.0, 0);
glVertex3d( 0.7, 1.5, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}
//=============================================================================
// GLExt::drawO
//=============================================================================
// Description: Comment
//
// Parameters: ( double scale, double tx, double ty, double tz, float width )
//
// Return: void
//
//=============================================================================
void GLExt::drawO( double scale, double tx, double ty, double tz, float width )
{
scale = 100.0f;
glPushAttrib( GL_CURRENT_BIT | GL_LINE_BIT | GL_POLYGON_BIT );
//Store old line width
GLfloat oldWidth;
glGetFloatv( GL_LINE_WIDTH, &oldWidth );
//Set line width
glLineWidth( width );
glPushMatrix();
glTranslated(tx, ty, tz);
glScaled(scale,scale,scale);
glBegin( GL_LINE_STRIP );
//Draw an "O"
glVertex3d( 0.7, 0.5, 0);
glVertex3d( 0, 0, 0);
glVertex3d( -0.7, 0.5, 0);
glVertex3d( -0.7, 1.5, 0);
glVertex3d( 0, 2.0, 0);
glVertex3d( 0.7, 1.5, 0);
glVertex3d( 0.7, 0.5, 0);
glEnd();
glPopMatrix();
glLineWidth( oldWidth );
glPopAttrib();
}