Exemple #1
0
void CPSSpawnEffect::Render(void)
{
	if (PointIsVisible(m_vecOrigin))
	{
		if (gHUD.m_iPaused <= 0)
		{
			gEngfuncs.GetViewAngles(m_vecAngles);
			VectorAdd(m_vecAngles, ev_punchangle, m_vecAngles);
		}
		Vector v_up, v_right;
		AngleVectors(m_vecAngles, NULL, v_right, v_up);
		CParticle *p = NULL;
		for (int i = 0; i < m_iNumParticles; ++i)
		{
			p = &m_pParticleList[i];
			if (p->m_fEnergy <= 0.0f)
				continue;

			p->Render(v_right, v_up, m_iRenderMode);
		}
		gEngfuncs.pTriAPI->RenderMode(kRenderNormal);// ?
	}
}
Exemple #2
0
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CPSDrips::Render(void)
{
	if (m_iFlags & RENDERSYSTEM_FLAG_NODRAW)
		return;
	if (gHUD.m_iPaused <= 0)
	{
		gEngfuncs.GetViewAngles(m_vecAngles);
		VectorAdd(m_vecAngles, ev_punchangle, m_vecAngles);
	}
	if (m_iFlags & RENDERSYSTEM_FLAG_ZROTATION)// UNDONE: TODO: rotate around direction vector, not just Z axis
	{
		m_vecAngles[0] = 0.0f;
		m_vecAngles[2] = 0.0f;
	}
	Vector v_up, v_right;
	Vector v1, v2;// v_up, v_right for circle
// horizontal
	v1[0] = 1.0f;
	v1[1] = 0.0f;
	v1[2] = 0.0f;
	v2[0] = 0.0f;
	v2[1] = 1.0f;
	v2[2] = 0.0f;
	AngleVectors(m_vecAngles, NULL, v_right, v_up);// TODO: this is common angles for all particles which is fast but not as nice as individual sprite-like rotation
	Vector rx;// tmp for faster code
	Vector uy;

	CParticle *p = NULL;
	// We should draw rain as a single mesh which is faster but we can't do that because of different texture frames
	for (int i = 0; i < m_iNumParticles; ++i)
	{
		p = &m_pParticleList[i];
		if (p->m_fEnergy <= 0.0f)
			continue;

		if (!PointIsVisible(p->m_vPos))// faster? Can't perform check on system origin because it's a large brush entity
			continue;

		if (p->m_iFlags & PARTICLE_FLAG1)// water circle
		{
#ifdef DRIPSPARALLELTEST// testing: circles parallel to surface
			AngleVectors(p->m_vVel, NULL, v1, v2);
#endif
			p->Render(v1, v2, m_iRenderMode, true);
		}
		else// otherwise use custom render function
		{
			if (gEngfuncs.pTriAPI->SpriteTexture(p->m_pTexture, p->m_iFrame))
			{
//				float adiff = AngleBetweenVectors(g_vecViewForward, p->m_vPos - g_vecViewOrigin);
//				AngleVectors(m_vecAngles + Vector(0.0f,0.0f,adiff), NULL, v_right, v_up);
				rx = v_right * p->m_fSizeX;
				uy = v_up * p->m_fSizeY;
				// UNDONE: swap m_vPos and m_vPosPrev for reversed rain?
				gEngfuncs.pTriAPI->RenderMode(m_iRenderMode);
				gEngfuncs.pTriAPI->CullFace(TRI_NONE);
				gEngfuncs.pTriAPI->Begin(TRI_QUADS);
				gEngfuncs.pTriAPI->Color4f(p->m_fColor[0], p->m_fColor[1], p->m_fColor[2], p->m_fColor[3]);
				gEngfuncs.pTriAPI->Brightness(p->m_fColor[3]);
				gEngfuncs.pTriAPI->TexCoord2f(1.0f, 0.0f);
				gEngfuncs.pTriAPI->Vertex3fv(p->m_vPosPrev + rx + uy);
				gEngfuncs.pTriAPI->TexCoord2f(1.0f, 1.0f);
				gEngfuncs.pTriAPI->Vertex3fv(p->m_vPos + rx - uy);
				gEngfuncs.pTriAPI->TexCoord2f(0.0f, 1.0f);
				gEngfuncs.pTriAPI->Vertex3fv(p->m_vPos - rx - uy);
				gEngfuncs.pTriAPI->TexCoord2f(0.0f, 0.0f);
				gEngfuncs.pTriAPI->Vertex3fv(p->m_vPosPrev - rx + uy);
				gEngfuncs.pTriAPI->End();
//				gEngfuncs.pTriAPI->RenderMode(kRenderNormal);
			}

//			p->Render(v_right, v_up, rendermode, true);
		}
	}
	gEngfuncs.pTriAPI->RenderMode(kRenderNormal);
}