📄 particlesystem.cpp
字号:
// Build Quad From A Triangle Strip
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(1.0f, 1.0f); glVertex3f( m_rParticles[loop].m_fSize, m_rParticles[loop].m_fSize, 0.0f); // Top Right
glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_rParticles[loop].m_fSize, m_rParticles[loop].m_fSize, 0.0f); // Top Left
glTexCoord2f(1.0f, 0.0f); glVertex3f( m_rParticles[loop].m_fSize,-m_rParticles[loop].m_fSize, 0.0f); // Bottom Right
glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_rParticles[loop].m_fSize,-m_rParticles[loop].m_fSize, 0.0f);// Bottom Left
glEnd();
glPopMatrix();
}
}
//Draw the floor if its enabled
if( m_bIsColliding)
{
glPushAttrib(GL_TEXTURE_BIT);
//disable the texture so a solid color can be drawn
glDisable(GL_TEXTURE_2D);
glLineWidth(1.0f);
glColor4f(0.4f,0.6f,0.6f,0.9f);
//this is the little stick which shows the particles emitted
glBegin(GL_LINES);
glVertex3f( m_vLocation.x,m_vLocation.y-m_fSizeStart*0.5f,m_vLocation.z);
glVertex3f( m_vLocation.x,m_vLocation.y-m_fSizeStart*3.0f,m_vLocation.z);
glEnd();
//now draw the floor
glTranslatef(0.0f,FLOOR,0.0f);
glColor4f(0.0f,0.3f,0.3f,0.7f);
glBegin(GL_LINE_STRIP);
glVertex3f(-20.0f,-0.0f,-20.0f);
glVertex3f(-20.0f,-0.0f, 20.0f);
glVertex3f( 20.0f,-0.0f, 20.0f);
glVertex3f( 20.0f,-0.0f,-20.0f);
glVertex3f(-20.0f,-0.0f,-20.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3f(-10.0f,-0.0f,-10.0f);
glVertex3f(-10.0f,-0.0f, 10.0f);
glVertex3f( 10.0f,-0.0f, 10.0f);
glVertex3f( 10.0f,-0.0f,-10.0f);
glVertex3f(-10.0f,-0.0f,-10.0f);
glEnd();
glPopAttrib();
}
}
//when the user move a bar on the pad the particle system params
//must be updated. Called from doparametercalcs
CParticleSystem::HotSpotParamsUpdate(int iTheSpot, POINT m_pspt)
{
//Determined by HS.OnHotSpot, which spot was changed
//the new mouse position sets how much to change the parameter
//Max and Mins are set in the header ParticleSystem.h
if (iTheSpot == HS_BOING)
{
if( IsColliding())
{
m_fBoing = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_fBoing < 0.1f) m_fBoing = 0.1f;
if( m_fBoing > 1.0f) m_fBoing = 1.0f;
}
}
if (iTheSpot == HS_THETA)
{
m_fTheta = ((float)m_pspt.x - 45.0f)/100.0f;
if(m_fTheta < 0.02f) m_fTheta = 0.02f;
if(m_fTheta > 1.0f) m_fTheta = 1.0f;
}
//Gravity Start.x
if (iTheSpot == HS_GRAV_START_X)
{
m_vGravityStart.x = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityStart.x > MAX_GRAVITY)||( m_vGravityStart.x < MIN_GRAVITY))
m_vGravityStart.x = 0.0f;
}
//Gravity End.x
if (iTheSpot == HS_GRAV_END_X)
{
m_vGravityEnd.x = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityEnd.x > MAX_GRAVITY)||( m_vGravityEnd.x < MIN_GRAVITY))
m_vGravityEnd.x = 0.0f;
}
//Gravity Start.y
if (iTheSpot == HS_GRAV_START_Y)
{
m_vGravityStart.y = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityStart.y > MAX_GRAVITY)||( m_vGravityStart.y < MIN_GRAVITY))
m_vGravityStart.y = 0.0f;
}
//Gravity End.y
if (iTheSpot == HS_GRAV_END_Y)
{
m_vGravityEnd.y = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityEnd.y > MAX_GRAVITY)||( m_vGravityEnd.y < MIN_GRAVITY))
m_vGravityEnd.y = 0.0f;
}
//Gravity Start.z
if (iTheSpot == HS_GRAV_START_Z)
{
m_vGravityStart.z = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityStart.z > MAX_GRAVITY)||( m_vGravityStart.z < MIN_GRAVITY))
m_vGravityStart.z = 0.0f;
}
//Gravity End.z
if (iTheSpot == HS_GRAV_END_Z)
{
m_vGravityEnd.z = (((float)m_pspt.x - 95.0f)/50.0f)*MAX_GRAVITY;
if (( m_vGravityEnd.z > MAX_GRAVITY)||( m_vGravityEnd.z < MIN_GRAVITY))
m_vGravityEnd.z = 0.0f;
}
//Alpha Start
if (iTheSpot == HS_ALPHA_START)
{
m_fAlphaStart = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_fAlphaStart > 1.0f) m_fAlphaStart =1.0f;
if( m_fAlphaStart < 0.02f) m_fAlphaStart = 0.02f;
}
//Alpha End
if (iTheSpot == HS_ALPHA_END)
{
m_fAlphaEnd = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_fAlphaEnd > 1.0f) m_fAlphaEnd =1.0f;
if( m_fAlphaEnd < 0.02f) m_fAlphaEnd = 0.02f;
}
//Red Start
if (iTheSpot == HS_RED_START)
{
m_vColorStart.r = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorStart.r > 0.96f) m_vColorStart.r = 0.96f;
if( m_vColorStart.r < 0.04f) m_vColorStart.r = 0.04f;
}
//Red End
if (iTheSpot == HS_RED_END)
{
m_vColorEnd.r = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorEnd.r > 0.96f) m_vColorEnd.r = 0.96f;
if( m_vColorEnd.r < 0.04f) m_vColorEnd.r = 0.04f;
}
//Grn Start
if (iTheSpot == HS_GREEN_START)
{
m_vColorStart.g = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorStart.g > 0.96f) m_vColorStart.g = 0.96f;
if( m_vColorStart.g < 0.04f) m_vColorStart.g = 0.04f;
}
//Grn End
if (iTheSpot == HS_GREEN_END)
{
m_vColorEnd.g = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorEnd.g > 0.96f) m_vColorEnd.g = 0.96f;
if( m_vColorEnd.g < 0.04f) m_vColorEnd.g = 0.04f;
}
//Blu Start
if (iTheSpot == HS_BLUE_START)
{
m_vColorStart.b = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorStart.b > 0.96f) m_vColorStart.b = 0.96f;
if( m_vColorStart.b < 0.04f) m_vColorStart.b = 0.04f;
}
//Blu End
if (iTheSpot == HS_BLUE_END)
{
m_vColorEnd.b = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorEnd.b > 0.96f) m_vColorEnd.b = 0.96f;
if( m_vColorEnd.b < 0.04f) m_vColorEnd.b = 0.04f;
}
//Size Start
if (iTheSpot == HS_SIZE_START)
{
m_fSizeStart = (((float)m_pspt.x - 45.0f)/100.0f)*MAX_SIZE;
if( m_fSizeStart > MAX_SIZE) m_fSizeStart = MAX_SIZE;
if( m_fSizeStart < MIN_SIZE) m_fSizeStart = MIN_SIZE;
}
//Size End
if (iTheSpot == HS_SIZE_END)
{
m_fSizeEnd = (((float)m_pspt.x - 45.0f)/100.0f)*MAX_SIZE;
if( m_fSizeEnd > MAX_SIZE) m_fSizeEnd = MAX_SIZE;
if( m_fSizeEnd < MIN_SIZE) m_fSizeEnd = MIN_SIZE;
}
//Particles Per Second
//EMISSION
if (iTheSpot == HS_EMMISION)
{
if ((float)m_pspt.x < 45.0f) m_pspt.x = 45L;
m_uParticlesPerSec = (unsigned int)((((float)m_pspt.x - 45.0f)/100.0f)*MAX_EMISSION);
if( m_uParticlesPerSec >= (unsigned int)MAX_EMISSION) m_uParticlesPerSec = (unsigned int)MAX_EMISSION;
if( m_uParticlesPerSec <= (unsigned int)MIN_EMISSION) m_uParticlesPerSec = (unsigned int)MIN_EMISSION;
}
//Speed
if (iTheSpot == HS_SPEED)
{
m_fSpeed = (((float)m_pspt.x - 45.0f)/100.0f)*MAX_SPEED;
if( m_fSpeed > MAX_SPEED) m_fSpeed = MAX_SPEED;
if( m_fSpeed < MIN_SPEED) m_fSpeed = MIN_SPEED;
}
//LifeTime
if (iTheSpot == HS_LIFE)
{
m_fLifeTime = (((float)m_pspt.x - 45.0f)/100.0f)*MAX_LIFETIME;
if( m_fLifeTime > MAX_LIFETIME) m_fLifeTime = MAX_LIFETIME;
if( m_fLifeTime < MIN_LIFETIME) m_fLifeTime = MIN_LIFETIME;
}
//VAR Alpha
if (iTheSpot == HS_VAR_ALPHA)
{
m_fAlphaVar = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_fAlphaVar > 0.96f) m_fAlphaVar = 0.96f;
if( m_fAlphaVar < 0.01f) m_fAlphaVar = 0.01f;
}
//VAR color
if (iTheSpot == HS_VAR_COLOR)
{
m_vColorVar.r = ((float)m_pspt.x - 45.0f)/100.0f;
if( m_vColorVar.r > 0.96f) m_vColorVar.r = 0.96f;
if( m_vColorVar.r < 0.01f) m_vColorVar.r = 0.01f;
m_vColorVar.g = m_vColorVar.r;
m_vColorVar.b = m_vColorVar.r;
}
//VAR Size
if (iTheSpot == HS_VAR_SIZE)
{
m_fSizeVar = ((float)m_pspt.x - 45.0f)/100.0f*MAX_SIZE;
if( m_fSizeVar > MAX_SIZE) m_fSizeVar = MAX_SIZE;
if( m_fSizeVar < MIN_SIZE) m_fSizeVar = MIN_SIZE;
}
//VAR Life
if (iTheSpot == HS_VAR_LIFE)
{
m_fLifeVar = ((float)m_pspt.x - 45.0f)/100.0f*MAX_LIFETIME;
if( m_fLifeVar > MAX_LIFETIME) m_fLifeVar = MAX_LIFETIME;
if( m_fLifeVar < MIN_LIFETIME) m_fLifeVar = MIN_LIFETIME;
}
//VAR Speed
if (iTheSpot == HS_VAR_SPEED)
{
m_fSpeedVar = ((float)m_pspt.x - 45.0f)/100.0f*MAX_SPEED;
if( m_fSpeedVar > MAX_SPEED) m_fSpeedVar = MAX_SPEED;
if( m_fSpeedVar < MIN_SPEED) m_fSpeedVar = MIN_SPEED;
}
//If Floor is selected for toggle for collision on off
if (iTheSpot == HS_FLOOR)
if (IsColliding()) m_bIsColliding = FALSE;
else m_bIsColliding = TRUE;
//If Moving is selected for toggle on off
if (iTheSpot == HS_MOVING)
if (m_bIsMoving) m_bIsMoving = FALSE;
else m_bIsMoving = TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -