code to draw engine block
This commit is contained in:
@@ -47,6 +47,7 @@ typedef struct
|
|||||||
GLuint CrankList;
|
GLuint CrankList;
|
||||||
GLuint ConnRodList;
|
GLuint ConnRodList;
|
||||||
GLuint PistonList;
|
GLuint PistonList;
|
||||||
|
GLuint BlockList;
|
||||||
} Engine;
|
} Engine;
|
||||||
|
|
||||||
|
|
||||||
@@ -80,6 +81,7 @@ typedef struct
|
|||||||
GLboolean UseLists;
|
GLboolean UseLists;
|
||||||
GLboolean DrawBox;
|
GLboolean DrawBox;
|
||||||
GLboolean ShowInfo;
|
GLboolean ShowInfo;
|
||||||
|
GLboolean ShowBlock;
|
||||||
} RenderInfo;
|
} RenderInfo;
|
||||||
|
|
||||||
|
|
||||||
@@ -87,9 +89,10 @@ static GLUquadric *Q;
|
|||||||
|
|
||||||
static GLfloat Theta = 0.0;
|
static GLfloat Theta = 0.0;
|
||||||
|
|
||||||
static GLfloat PistonColor[4] = { 1.0, 0.5, 0.5, 1.0 };
|
static const GLfloat PistonColor[4] = { 1.0, 0.5, 0.5, 1.0 };
|
||||||
static GLfloat ConnRodColor[4] = { 0.7, 1.0, 0.7, 1.0 };
|
static const GLfloat ConnRodColor[4] = { 0.7, 1.0, 0.7, 1.0 };
|
||||||
static GLfloat CrankshaftColor[4] = { 0.7, 0.7, 1.0, 1.0 };
|
static const GLfloat CrankshaftColor[4] = { 0.7, 0.7, 1.0, 1.0 };
|
||||||
|
static const GLfloat BlockColor[4] = {0.8, 0.8, 0.8, 0.75 };
|
||||||
|
|
||||||
static GLuint TextureObj;
|
static GLuint TextureObj;
|
||||||
static GLint WinWidth = 800, WinHeight = 500;
|
static GLint WinWidth = 800, WinHeight = 500;
|
||||||
@@ -113,7 +116,7 @@ static Engine Engines[NUM_ENGINES] =
|
|||||||
0.25, /* CrankPinRadius */
|
0.25, /* CrankPinRadius */
|
||||||
0.3, /* CrankJournalRadius */
|
0.3, /* CrankJournalRadius */
|
||||||
0.4, /* CrankJournalLength */
|
0.4, /* CrankJournalLength */
|
||||||
1.3, /* ConnectingRodLength */
|
1.5, /* ConnectingRodLength */
|
||||||
0.1 /* ConnectingRodThickness */
|
0.1 /* ConnectingRodThickness */
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -129,7 +132,7 @@ static Engine Engines[NUM_ENGINES] =
|
|||||||
0.25, /* CrankPinRadius */
|
0.25, /* CrankPinRadius */
|
||||||
0.3, /* CrankJournalRadius */
|
0.3, /* CrankJournalRadius */
|
||||||
0.4, /* CrankJournalLength */
|
0.4, /* CrankJournalLength */
|
||||||
1.3, /* ConnectingRodLength */
|
1.5, /* ConnectingRodLength */
|
||||||
0.1 /* ConnectingRodThickness */
|
0.1 /* ConnectingRodThickness */
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -145,7 +148,7 @@ static Engine Engines[NUM_ENGINES] =
|
|||||||
0.25, /* CrankPinRadius */
|
0.25, /* CrankPinRadius */
|
||||||
0.3, /* CrankJournalRadius */
|
0.3, /* CrankJournalRadius */
|
||||||
0.4, /* CrankJournalLength */
|
0.4, /* CrankJournalLength */
|
||||||
1.3, /* ConnectingRodLength */
|
1.5, /* ConnectingRodLength */
|
||||||
0.1 /* ConnectingRodThickness */
|
0.1 /* ConnectingRodThickness */
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -180,6 +183,7 @@ InitRenderInfo(RenderInfo *render)
|
|||||||
render->Texture = GL_FALSE;
|
render->Texture = GL_FALSE;
|
||||||
render->DrawBox = GL_FALSE;
|
render->DrawBox = GL_FALSE;
|
||||||
render->ShowInfo = GL_TRUE;
|
render->ShowInfo = GL_TRUE;
|
||||||
|
render->ShowBlock = GL_FALSE;
|
||||||
render->UseLists = GL_FALSE;
|
render->UseLists = GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,6 +194,9 @@ InitRenderInfo(RenderInfo *render)
|
|||||||
static void
|
static void
|
||||||
SetRenderState(RenderMode mode)
|
SetRenderState(RenderMode mode)
|
||||||
{
|
{
|
||||||
|
static const GLfloat gray2[4] = { 0.2, 0.2, 0.2, 1.0 };
|
||||||
|
static const GLfloat gray4[4] = { 0.4, 0.4, 0.4, 1.0 };
|
||||||
|
|
||||||
/* defaults */
|
/* defaults */
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
@@ -198,6 +205,7 @@ SetRenderState(RenderMode mode)
|
|||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
glDisable(GL_TEXTURE_GEN_S);
|
glDisable(GL_TEXTURE_GEN_S);
|
||||||
glDisable(GL_TEXTURE_GEN_T);
|
glDisable(GL_TEXTURE_GEN_T);
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gray2);
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case LIT:
|
case LIT:
|
||||||
@@ -214,6 +222,7 @@ SetRenderState(RenderMode mode)
|
|||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glEnable(GL_TEXTURE_GEN_S);
|
glEnable(GL_TEXTURE_GEN_S);
|
||||||
glEnable(GL_TEXTURE_GEN_T);
|
glEnable(GL_TEXTURE_GEN_T);
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gray4);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
@@ -269,6 +278,19 @@ PistonShaftPosition(const Engine *eng, int piston)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute distance between two adjacent pistons
|
||||||
|
*/
|
||||||
|
static float
|
||||||
|
PistonSpacing(const Engine *eng)
|
||||||
|
{
|
||||||
|
const int pistonsPerCrank = eng->Pistons / eng->Cranks;
|
||||||
|
const float z0 = PistonShaftPosition(eng, 0);
|
||||||
|
const float z1 = PistonShaftPosition(eng, pistonsPerCrank);
|
||||||
|
return z1 - z0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (x0, y0) = position of big end on crankshaft
|
* (x0, y0) = position of big end on crankshaft
|
||||||
* (x1, y1) = position of small end on piston
|
* (x1, y1) = position of small end on piston
|
||||||
@@ -517,6 +539,144 @@ DrawPositionedConnectingRod(const Engine *eng, float crankAngle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw a square with a hole in middle.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
SquareWithHole(float squareSize, float holeRadius)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
glBegin(GL_QUAD_STRIP);
|
||||||
|
glNormal3f(0, 0, 1);
|
||||||
|
for (i = 0; i <= 360; i += 5) {
|
||||||
|
const float x1 = holeRadius * cos(DEG_TO_RAD(i));
|
||||||
|
const float y1 = holeRadius * sin(DEG_TO_RAD(i));
|
||||||
|
float x2, y2;
|
||||||
|
if (i > 315 || i <= 45) {
|
||||||
|
x2 = squareSize;
|
||||||
|
y2 = squareSize * tan(DEG_TO_RAD(i));
|
||||||
|
}
|
||||||
|
else if (i > 45 && i <= 135) {
|
||||||
|
x2 = -squareSize * tan(DEG_TO_RAD(i - 90));
|
||||||
|
y2 = squareSize;
|
||||||
|
}
|
||||||
|
else if (i > 135 && i <= 225) {
|
||||||
|
x2 = -squareSize;
|
||||||
|
y2 = -squareSize * tan(DEG_TO_RAD(i-180));
|
||||||
|
}
|
||||||
|
else if (i > 225 && i <= 315) {
|
||||||
|
x2 = squareSize * tan(DEG_TO_RAD(i - 270));
|
||||||
|
y2 = -squareSize;
|
||||||
|
}
|
||||||
|
glVertex2f(x1, y1); /* inner circle */
|
||||||
|
glVertex2f(x2, y2); /* outer square */
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw block with hole through middle.
|
||||||
|
* Hole is centered on Z axis.
|
||||||
|
* Bottom of block is at z=0, top of block is at z = blockHeight.
|
||||||
|
* index is in [0, count - 1] to determine which block faces are drawn.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
DrawBlockWithHole(float blockSize, float blockHeight, float holeRadius,
|
||||||
|
int index, int count)
|
||||||
|
{
|
||||||
|
const int slices = 30, stacks = 4;
|
||||||
|
const float x = blockSize;
|
||||||
|
const float y = blockSize;
|
||||||
|
const float z0 = 0;
|
||||||
|
const float z1 = blockHeight;
|
||||||
|
|
||||||
|
assert(index < count);
|
||||||
|
assert(Q);
|
||||||
|
gluQuadricOrientation(Q, GLU_INSIDE);
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
/* +X face */
|
||||||
|
glNormal3f(1, 0, 0);
|
||||||
|
glVertex3f( x, -y, z0);
|
||||||
|
glVertex3f( x, y, z0);
|
||||||
|
glVertex3f( x, y, z1);
|
||||||
|
glVertex3f( x, -y, z1);
|
||||||
|
/* -X face */
|
||||||
|
glNormal3f(-1, 0, 0);
|
||||||
|
glVertex3f(-x, -y, z1);
|
||||||
|
glVertex3f(-x, y, z1);
|
||||||
|
glVertex3f(-x, y, z0);
|
||||||
|
glVertex3f(-x, -y, z0);
|
||||||
|
if (index == 0) {
|
||||||
|
/* +Y face */
|
||||||
|
glNormal3f(0, 1, 0);
|
||||||
|
glVertex3f(-x, y, z1);
|
||||||
|
glVertex3f( x, y, z1);
|
||||||
|
glVertex3f( x, y, z0);
|
||||||
|
glVertex3f(-x, y, z0);
|
||||||
|
}
|
||||||
|
if (index == count - 1) {
|
||||||
|
/* -Y face */
|
||||||
|
glNormal3f(0, -1, 0);
|
||||||
|
glVertex3f(-x, -y, z0);
|
||||||
|
glVertex3f( x, -y, z0);
|
||||||
|
glVertex3f( x, -y, z1);
|
||||||
|
glVertex3f(-x, -y, z1);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
/* cylinder / hole */
|
||||||
|
gluCylinder(Q, holeRadius, holeRadius, blockHeight, slices, stacks);
|
||||||
|
|
||||||
|
/* face at z0 */
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(180, 1, 0, 0);
|
||||||
|
SquareWithHole(blockSize, holeRadius);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
/* face at z1 */
|
||||||
|
glTranslatef(0, 0, z1);
|
||||||
|
SquareWithHole(blockSize, holeRadius);
|
||||||
|
|
||||||
|
gluQuadricOrientation(Q, GLU_OUTSIDE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the engine block.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
DrawEngineBlock(const Engine *eng)
|
||||||
|
{
|
||||||
|
const float blockHeight = eng->Throw + 1.5 * eng->PistonHeight;
|
||||||
|
const float cylRadius = 1.01 * eng->PistonRadius;
|
||||||
|
const float blockSize = 0.5 * PistonSpacing(eng);
|
||||||
|
const int pistonsPerCrank = eng->Pistons / eng->Cranks;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < eng->Pistons; i++) {
|
||||||
|
const float z = PistonShaftPosition(eng, i);
|
||||||
|
const int crank = i / pistonsPerCrank;
|
||||||
|
int k;
|
||||||
|
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(0, 0, z);
|
||||||
|
|
||||||
|
/* additional rotation for kth piston per crank */
|
||||||
|
k = i % pistonsPerCrank;
|
||||||
|
glRotatef(k * -eng->V_Angle, 0, 0, 1);
|
||||||
|
|
||||||
|
/* the block */
|
||||||
|
glRotatef(-90, 1, 0, 0);
|
||||||
|
glTranslatef(0, 0, eng->Throw * 2);
|
||||||
|
DrawBlockWithHole(blockSize, blockHeight, cylRadius,
|
||||||
|
crank, eng->Cranks);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate display lists for engine parts.
|
* Generate display lists for engine parts.
|
||||||
*/
|
*/
|
||||||
@@ -538,6 +698,11 @@ GenerateDisplayLists(Engine *eng)
|
|||||||
glNewList(eng->PistonList, GL_COMPILE);
|
glNewList(eng->PistonList, GL_COMPILE);
|
||||||
DrawPiston(eng);
|
DrawPiston(eng);
|
||||||
glEndList();
|
glEndList();
|
||||||
|
|
||||||
|
eng->BlockList = glGenLists(1);
|
||||||
|
glNewList(eng->BlockList, GL_COMPILE);
|
||||||
|
DrawEngineBlock(eng);
|
||||||
|
glEndList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -553,10 +718,11 @@ FreeDisplayLists(Engine *eng)
|
|||||||
eng->ConnRodList = 0;
|
eng->ConnRodList = 0;
|
||||||
glDeleteLists(eng->PistonList, 1);
|
glDeleteLists(eng->PistonList, 1);
|
||||||
eng->PistonList = 0;
|
eng->PistonList = 0;
|
||||||
|
glDeleteLists(eng->BlockList, 1);
|
||||||
|
eng->BlockList = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw complete engine.
|
* Draw complete engine.
|
||||||
* \param eng description of engine to draw
|
* \param eng description of engine to draw
|
||||||
@@ -602,10 +768,32 @@ DrawEngine(const Engine *eng, float crankAngle)
|
|||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ConnRodColor);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ConnRodColor);
|
||||||
glColor4fv(ConnRodColor);
|
glColor4fv(ConnRodColor);
|
||||||
DrawPositionedConnectingRod(eng, rot);
|
DrawPositionedConnectingRod(eng, rot);
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Render.ShowBlock) {
|
||||||
|
const GLboolean blend = glIsEnabled(GL_BLEND);
|
||||||
|
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
if (!blend) {
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
}
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
|
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, BlockColor);
|
||||||
|
glColor4fv(BlockColor);
|
||||||
|
if (eng->CrankList)
|
||||||
|
glCallList(eng->BlockList);
|
||||||
|
else
|
||||||
|
DrawEngineBlock(eng);
|
||||||
|
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
if (!blend) {
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,9 +933,9 @@ Draw(void)
|
|||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(0, -0.75, 0);
|
glTranslatef(0, -0.75, 0);
|
||||||
DrawEngine(Engines + CurEngine, Theta);
|
|
||||||
if (Render.DrawBox)
|
if (Render.DrawBox)
|
||||||
DrawBox();
|
DrawBox();
|
||||||
|
DrawEngine(Engines + CurEngine, Theta);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -899,6 +1087,12 @@ OptDisplayLists(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
OptShowBlock(void)
|
||||||
|
{
|
||||||
|
Render.ShowBlock = !Render.ShowBlock;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
OptShowInfo(void)
|
OptShowInfo(void)
|
||||||
{
|
{
|
||||||
@@ -940,8 +1134,9 @@ static const MenuInfo MenuItems[] = {
|
|||||||
{ "Change Engine", 'e', OptChangeEngine },
|
{ "Change Engine", 'e', OptChangeEngine },
|
||||||
{ "Rendering Style", 'm', OptRenderMode },
|
{ "Rendering Style", 'm', OptRenderMode },
|
||||||
{ "Display Lists", 'd', OptDisplayLists },
|
{ "Display Lists", 'd', OptDisplayLists },
|
||||||
|
{ "Show Block", 'b', OptShowBlock },
|
||||||
{ "Show Info", 'i', OptShowInfo },
|
{ "Show Info", 'i', OptShowInfo },
|
||||||
{ "Show Box", 'b', OptShowBox },
|
{ "Show Box", 'x', OptShowBox },
|
||||||
{ "Exit", 27, OptExit },
|
{ "Exit", 27, OptExit },
|
||||||
{ NULL, 'r', OptRotate },
|
{ NULL, 'r', OptRotate },
|
||||||
{ NULL, 0, NULL }
|
{ NULL, 0, NULL }
|
||||||
@@ -1070,7 +1265,6 @@ Init(void)
|
|||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
|
||||||
glEnable(GL_NORMALIZE);
|
glEnable(GL_NORMALIZE);
|
||||||
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
InitViewInfo(&View);
|
InitViewInfo(&View);
|
||||||
|
Reference in New Issue
Block a user