📄 main.cpp
字号:
// the (parameter * size factor which is .6684) + point a (start of line)
// so line length is determined by the size of the parameter.
// example:
/* glBegin(GL_LINES);
glVertex3f(-2.3752f, 0.56f,0.0f);
glVertex3f(-2.375f+(pPS->m_fBoing*0.6684f), 0.56f,0.0f);
glEnd();
*/
//the start of the line is at point -2.375, the end of the line
// is whatever boing is at * .6684 + the starting point(-2.375)
// Clear The Screen And The Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
if(bIsCamFollowing)
//set view matrix for moving camera
//either its looking at the origin, or at the moving particle system
gluLookAt(//camera at
//vCamPos.x, vCamPos.y, vCamPos.z,
pPS->m_vLocation.x+vCamPos.x, pPS->m_vLocation.y*2.0f+vCamPos.y, pPS->m_vLocation.z+vCamPos.z,
//looking at
//0.0f,0.0f,0.0f,
pPS->m_vLocation.x, pPS->m_vLocation.y, pPS->m_vLocation.z,
//up direction
0.0f,1.0f,0.0f);
else
// stationary camera
gluLookAt(//camera at
vCamPos.x, vCamPos.y, vCamPos.z,
//looking at
0.0f,0.0f,0.0f,
//up direction
0.0f,1.0f,0.0f);
// Get current time in seconds! Sytem time is in milliseconds since win98 started
fTime = static_cast<float>(timeGetTime())*0.001f;
fEndFrameTime = fTime;
//Calculate frames/sec
if ((fEndFrameTime - fStartFrameTime) >= 1.0f)
{
iFramesPerSec = iFrames;
iFrames = 0;
fStartFrameTime = fTime;
}
else iFrames++;
//Move the Particles
pPS->Update(fTime);
//set texture for particle
glBindTexture(GL_TEXTURE_2D, tList[iParticleTexture]);
//Draw the Particle System bitmaps
//you could have multiple ones drawn //todo
pPS->Draw(fCamRotX,fCamRotY);
//for every push there is a
glPopMatrix();
//if keypad displayed make the bars on the menu and the menu
if(bIsKeyPadActive)
{
//save attribs
glPushAttrib(GL_ENABLE_BIT);
//keep identity
glLoadIdentity();
//set the color to white
glColor4f(1.0f,1.0f,1.0f,1.0f);
//save the current view
glPushMatrix();
//following bitmaps are 'billboarded to quads' and translated
//into position
//bitmap of Texture within the control panel
//since its already bound, no glbind req'd
glTranslatef(-3.08f,-2.2f,-6.0f);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.15f,-0.15f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.15f,-0.15f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.15f, 0.15f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.15f, 0.15f, 0.0f);
glEnd();
glPopMatrix();
glPushMatrix();
//bitmap of Control Panel key.bmp
glTranslatef(-2.18f,1.0f,-4.85f);
glBindTexture(GL_TEXTURE_2D, tList[KEY]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.5f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.5f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 1.0f, 0.0f);
glEnd();
//second bitmap lowkey.bmp
glTranslatef(0.0f,-2.0f,0.0f);
glBindTexture(GL_TEXTURE_2D, tList[LOWKEY]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.5f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.5f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 1.0f, 0.0f);
glEnd();
glPopMatrix();
//must disable the texture to draw solid colors (non-textured)
glDisable(GL_TEXTURE_2D);
//Bargraphs
//No textures just colour
glTranslatef(0.0f,0.0f,-4.85f);
/// Points for the toggles
glPointSize(4.0f);
//Width of lines in the menu
glLineWidth(4.0f);
//If floor is on make the check box
if(pPS->IsColliding())
{
glColor4f(1.0f, 0.0f, 0.2f, 0.99f);
glBegin(GL_POINTS);
glVertex3f(-1.718f,0.24f,0.0f);
glEnd();
//Display Boing bar if floor is enabled
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 0.56f,0.0f);
glVertex3f(-2.375f+(pPS->m_fBoing*0.6684f), 0.56f,0.0f);
glEnd();
}
//Toggle ckeck point for Moving
if(pPS->m_bIsMoving)
{
glColor4f(1.0f, 0.0f, 0.2f, 0.99f);
glBegin(GL_POINTS);
glVertex3f(-1.718f,0.335f,0.0f);
glEnd();
}
//Toggle ckeck point for Cam following
if(bIsCamFollowing)
{
glColor4f(1.0f, 0.0f, 0.2f, 0.99f);
glBegin(GL_POINTS);
glVertex3f(-1.718f,0.425f,0.0f);
glEnd();
}
//Toggle ckeck point for Burst
if(bIsBurstEnable)
{
glColor4f(1.0f, 0.0f, 0.2f, 0.99f);
glBegin(GL_POINTS);
glVertex3f(-2.2f,0.423f,0.0f);
glEnd();
}
//Alpha Start
glColor4f(1.0f, 1.0f, 0.5f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.375f,1.899f,0.0f);
glVertex3f(-2.375f+(pPS->m_fAlphaStart*0.6684f),1.899f,0.0f);
glEnd();
//Alpha End
glColor4f(1.0f, 1.0f, 0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.375f,1.86f,-0.0f);
glVertex3f(-2.375f+(pPS->m_fAlphaEnd*0.6684f),1.86f,0.0f);
glEnd();
//glPopMatrix();
//Red start
glColor4f(pPS->m_vColorStart.r+0.2f, 0.0f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.375f,1.78f,-0.0f);
glVertex3f(-2.375f+(pPS->m_vColorStart.r*0.7f),1.78f,-0.0f);
glEnd();
//Red End
glColor4f(pPS->m_vColorEnd.r+0.2f, 0.0f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.736f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorEnd.r*0.7f), 1.736f,0.0f);
glEnd();
//Grn start
glColor4f( 0.0f,pPS->m_vColorStart.g+0.2f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.655f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorStart.g*0.7f), 1.655f,0.0f);
glEnd();
//Grn End
glColor4f( 0.0f,pPS->m_vColorEnd.g+0.2f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.608f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorEnd.g*0.7f), 1.608f,0.0f);
glEnd();
//Blu start
glColor4f(0.0f, 0.0f, pPS->m_vColorStart.b+0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.53f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorStart.b*0.7f), 1.53f,0.0f);
glEnd();
//Blu End
glColor4f(0.0f, 0.0f, pPS->m_vColorEnd.b+0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.49f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorEnd.b*0.7f), 1.49f,0.0f);
glEnd();
//Size Start
glColor4f(1.0f, 1.0f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.405f,0.0f);
glVertex3f(-2.375f+(pPS->m_fSizeStart/MAX_SIZE*0.6684f), 1.405f,0.0f);
glEnd();
//Size End
glColor4f(1.0f, 0.5f, 0.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.358f,0.0f);
glVertex3f(-2.375f+(pPS->m_fSizeEnd/MAX_SIZE*0.6684f), 1.358f,0.0f);
glEnd();
//LifeTime
glColor4f(0.0f, 0.5f, 1.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.265f,0.0f);
glVertex3f(-2.375f+((pPS->m_fLifeTime/MAX_LIFETIME)*0.6684f), 1.265f,0.0f);
glEnd();
//Emision
glColor4f(0.5f, 0.7f, 1.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.16f,0.0f);
glVertex3f(-2.375f+((static_cast<float>(pPS->m_uParticlesPerSec)/MAX_EMISSION)*0.6684f), 1.16f,0.0f);
glEnd();
//Speed
glColor4f(1.0f, 0.0f, 1.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 1.06f,0.0f);
glVertex3f(-2.375f+((pPS->m_fSpeed/MAX_SPEED)*0.6684f), 1.06f,0.0f);
glEnd();
//Theta
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, 0.66f,0.0f);
glVertex3f(-2.375f+(pPS->m_fTheta*0.6684f), 0.66f,0.0f);
glEnd();
//Gravity start.x
glColor4f(1.0f, 0.0f, 0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.978f, 0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityStart.x/MAX_GRAVITY*0.334f),0.978f, 0.0f);
glEnd();
//Gravity End.x
glColor4f(1.0f, 0.0f, 0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.932f,0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityEnd.x/MAX_GRAVITY*0.334f), 0.932f,0.0f);
glEnd();
//Gravity start.y
glColor4f(1.0f, 1.0f, 0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.884f, 0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityStart.y/MAX_GRAVITY*0.334f),0.884f, 0.0f);
glEnd();
//Gravity End.y
glColor4f(1.0f, 1.0f, 0.2f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.837f,0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityEnd.y/MAX_GRAVITY*0.334f), 0.837f,0.0f);
glEnd();
//Gravity start.z
glColor4f(0.50f, 0.0f, 0.92f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.787f, 0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityStart.z/MAX_GRAVITY*0.334f),0.787f, 0.0f);
glEnd();
//Gravity End.z
glColor4f(0.50f, 0.0f, 0.92f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.0508f, 0.742f,0.0f);
glVertex3f(-2.0508f+(pPS->m_vGravityEnd.z/MAX_GRAVITY*0.334f), 0.742f,0.0f);
glEnd();
//VAR Alpha
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, -0.425f,0.0f);
glVertex3f(-2.375f+(pPS->m_fAlphaVar*0.6684f), -0.425f,0.0f);
glEnd();
//VAR Color
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, -0.525f,0.0f);
glVertex3f(-2.375f+(pPS->m_vColorVar.r*0.6684f), -0.525f,0.0f);
glEnd();
//VAR Size
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, -0.628f,0.0f);
glVertex3f(-2.375f+(pPS->m_fSizeVar*0.6684f/MAX_SIZE), -0.628f,0.0f);
glEnd();
//VAR Life
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, -0.73f,0.0f);
glVertex3f(-2.375f+(pPS->m_fLifeVar*0.6684f/MAX_LIFETIME), -0.73f,0.0f);
glEnd();
//VAR Speed
glColor4f(0.5f, 1.0f, 0.3f, 0.8f);
glBegin(GL_LINES);
glVertex3f(-2.3752f, -0.832f,0.0f);
glVertex3f(-2.375f+(pPS->m_fSpeedVar*0.6684f/MAX_SPEED), -0.832f,0.0f);
glEnd();
//Color Stick
glLineWidth(7.0f);
glBegin(GL_LINES);
glColor4f(pPS->m_vColorStart.r,pPS->m_vColorStart.g,pPS->m_vColorStart.b, pPS->m_fAlphaStart);
glVertex3f(-1.62f,1.92f,0.0f);
glColor4f(pPS->m_vColorEnd.r,pPS->m_vColorEnd.g,pPS->m_vColorEnd.b, pPS->m_fAlphaEnd);
glVertex3f(-1.62f, 1.45f,0.0f);
glEnd();
glPopAttrib();
}
}//end DrawScene
//Key Scanning and computations if mouse button is pressed
//remember this is only done every 100ms.
void DoParameterCalculations(void)
{
//adjust parameters according to keys pressed
if ( keys[VK_LEFT] ) fCameraYaw += 0.05f;
if ( keys[VK_RIGHT] ) fCameraYaw -= 0.05f;
if ( keys[VK_DOWN] ) fCameraPitch -= 0.05f;
if ( keys[VK_UP] ) fCameraPitch += 0.05f;
if ( keys['A'] ) fCameraRadius -= 2.0f;
if ( keys['Z'] ) fCameraRadius += 2.0f;
//little spin for effect when following moving particles
//if(bIsCamFollowing) fCameraYaw+=0.005f;
// wrap Yaw rotation at edges for continous movement
if ( fCameraYaw < 0.0f )fCameraYaw = 6.28f;
else if ( fCameraYaw > 6.28f ) fCameraYaw = 0.0f;
//limit the 'world' the camera can move to
Clamp( fCameraPitch, -1.57f, 1.57f );
Clamp( fCameraRadius, 1.0f, 200.0f );
// spherical coordinate rotation
vCamPos.x = (float)(cos(fCameraYaw) * cos(fCameraPitch) * fCameraRadius);
vCamPos.z = (float)(sin(fCameraYaw) * cos(fCameraPitch) * fCameraRadius);
vCamPos.y = (float)(sin(fCameraPitch) * fCameraRadius);
//these nasties are so the bitmap points towards the camera
//comment them out and see the effect
fCamRotY = fCameraYaw*360.0f/-6.28f+90.0f;
fCamRotX = fCameraPitch*360.0f/-6.28f;
//pops a random num into iBurston and decrements till it hits zero
//turns off the suppresion for a burst and then back on
//todo, make them adjustable in the menu
if(bIsBurstEnable)
{
if (iBurstOn)
{
pPS->m_bIsSuppressed = TRUE;
iBurstOn --;
}
else
{
pPS->m_bIsSuppressed = FALSE;
iBurstOn = rand()%20+7;
}
}
//make sure when burst is turned off suppression stays off
else pPS->m_bIsSuppressed = FALSE;
//is the keypad visible?
if(bIsKeyPadActive)
{
int iWhatSpot;
//Particle system hotspots
//determine, if any, which spot the user is on
iWhatSpot = HS.OnHotSpot(pt);
//if mouse is on a particle system param update it
if(iWhatSpot!=HS_NOT_ON_SPOT)
pPS->HotSpotParamsUpdate(iWhatSpot,pt);
//interface specific spots, these could be in a class also
//if Hide is hit Hide Keypad
if ( PtInRect ( &(HS.m_RectHotSpot[HS_HIDE_KEYPAD]), pt ) )
bIsKeyPadActive = FALSE;
//If Exit is Selected
if ( PtInRect ( &(HS.m_RectHotSpot[HS_EXIT]), pt ) )
PostQuitMessage(0);
//If Burst is selected toggle it
if ( PtInRect ( &(HS.m_RectHotSpot[HS_BURST]), pt ) )
if (bIsBurstEnable) bIsBurstEnable = FALSE;
else bIsBurstEnable = TRUE;
//If Cam follow is on turn on off toggle
if ( PtInRect ( &(HS.m_RectHotSpot[HS_CAMERA]), pt ) )
if (bIsCamFollowing) bIsCamFollowing = FALSE;
else bIsCamFollowing = TRUE;
//Texture Cycling is hit
if ( PtInRect ( &(HS.m_RectHotSpot[HS_TEXTURE]), pt ) )
if(iParticleTexture++ > 4) iParticleTexture = 1;
//Preset Cycling is hit
if ( PtInRect ( &(HS.m_RectHotSpot[HS_PRESETS]), pt ) )
{
if(iPresetKey++ > 7) iPresetKey = 1;
DoPresetFunction();
}
}
}//end func do parameter calcs
//Checks to see if mouse clicked and turn menu
//on if it is off
void OnMouseButtonDown(int iMouseButton)
{
if ( PtInRect ( &(HS.m_RectHotSpot[HS_ON_PAD]), pt ) )
{
if (iMouseButton == RIGHTMOUSEBUTTON || iMouseButton == LEFTMOUSEBUTTON)
bIsKeyPadActive = TRUE;
}
}
//Stop changing values when mouse released
//since the point is at 0 the hotspot value will not be changed
//even though the mouse continues to move, hey it works
void OnMouseButtonUp(int iMouseButton)
{
pt.x = 0L;
pt.y = 0L;
}
//export parameters to params.txt
void ExportParameters(void)
{
FILE* fp = fopen( "params.txt", "wt" );
if ( fp )
{
fprintf( fp, "\t\t\t//---- Camera Settings ---- \n");
fprintf( fp, "\t\t\tfCameraPitch = %1.2ff; \n", fCameraPitch );
fprintf( fp, "\t\t\tfCameraYaw = %1.2ff; \n", fCameraYaw );
fprintf( fp, "\t\t\tfCameraRadius = %1.2ff; \n", fCameraRadius );
fprintf( fp, "\n");
fprintf( fp, "\t\t\t//---- Particle System Settings ---- \n");
fprintf( fp, "\t\t\tpPS->m_vColorStart.r = %1.2ff; \n", pPS->m_vColorStart.r );
fprintf( fp, "\t\t\tpPS->m_vColorStart.g = %1.2ff; \n", pPS->m_vColorStart.g );
fprintf( fp, "\t\t\tpPS->m_vColorStart.b = %1.2ff; \n", pPS->m_vColorStart.b );
fprintf( fp, "\n");
fprintf( fp, "\t\t\tpPS->m_vColorVar.r = %1.2ff; \n", pPS->m_vColorVar.r );
fprintf( fp, "\t\t\tpPS->m_vColorVar.g = %1.2ff; \n", pPS->m_vColorVar.g );
fprintf( fp, "\t\t\tpPS->m_vColorVar.b = %1.2ff; \n", pPS->m_vColorVar.b );
fprintf( fp, "\n");
fprintf( fp, "\t\t\tpPS->m_vColorEnd.r = %1.2ff; \n", pPS->m_vColorEnd.r );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -