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);// ? } }
//----------------------------------------------------------------------------- // 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); }