⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 粒子系统编辑器 包括了很多特效
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	// 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 + -