void CShapeModule::InitParticleForCircle(CVec3& localPos, CVec3& direction, float fParticleScale) const { direction = CVec3(1, 0, 0); CQuaternion quat; quat.FromPitchYawRoll(0, 0, PARTICLE_RAND_RANGE(0, DegreesToRadians(m_fArcForCircle))); direction *= quat; float fRadius = m_fRadius * fParticleScale; localPos = direction * (m_bEmitFromShell ? fRadius : PARTICLE_RAND_RANGE(0, fRadius)); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CShapeModule::Render(CParticleEmitter* pEmitter) { BEATS_ASSERT(pEmitter != nullptr); const CMat4& emitterMat = pEmitter->GetWorldTM(); switch (m_emitShapeType) { case EEmitShapeType::eEST_Sphere: case EEmitShapeType::eEST_HemiSphere: { CMat4 emitterSphereMat; emitterSphereMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterSphereMat = emitterMat * emitterSphereMat; bool bHemiSphere = m_emitShapeType == EEmitShapeType::eEST_HemiSphere; float fRate = bHemiSphere ? 0.5f : 1.0f; CShapeRenderer::GetInstance()->DrawCircle(emitterSphereMat, m_fRadius, 0x00FF00FF, false, 1.0f); CMat4 mat; mat.FromPitchYawRoll(0, MATH_PI_HALF, MATH_PI_HALF); mat = emitterSphereMat * mat; CShapeRenderer::GetInstance()->DrawCircle(mat, m_fRadius, 0xFF0000FF, false, fRate); mat.FromPitchYawRoll(MATH_PI, 0, -MATH_PI_HALF); mat = emitterSphereMat * mat; CShapeRenderer::GetInstance()->DrawCircle(mat, m_fRadius, 0x0000FFFF, false, fRate); } break; case EEmitShapeType::eEST_Cone: { CMat4 emitterConeMat; emitterConeMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterConeMat = emitterMat * emitterConeMat; float fTopRadius = m_fRadius + m_fConeLength * tanf(DegreesToRadians(m_fAngle)); CShapeRenderer::GetInstance()->DrawCone(emitterConeMat, m_fRadius, fTopRadius, m_fConeLength, 0x0000FFFF, 0x00FF00FF, 0xFF0000FF, false); } break; case EEmitShapeType::eEST_Box: CShapeRenderer::GetInstance()->DrawBox(emitterMat, m_boxSize.X(), m_boxSize.Y(), m_boxSize.Z(), 0xFF0000FF, false); break; case EEmitShapeType::eEST_Mesh: break; case EEmitShapeType::eEST_Circle: { CVertexPC startPos, endPos; startPos.color = 0xFFFF00FF; endPos.color = 0xFFFF00FF; startPos.position = pEmitter->GetWorldTM().GetTranslate(); endPos.position = CVec3(0, 0, m_fRadius) * pEmitter->GetWorldTM(); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f); CQuaternion quat; quat.FromPitchYawRoll(0, DegreesToRadians(m_fArcForCircle), 0); endPos.position = (CVec3(0, 0, m_fRadius) * quat) * pEmitter->GetWorldTM(); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f); CMat4 emitterConeMat; emitterConeMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterConeMat = emitterMat * emitterConeMat; CShapeRenderer::GetInstance()->DrawCircle(emitterConeMat, m_fRadius, 0xFFFF00FF, false, m_fArcForCircle / 360.f); } break; case EEmitShapeType::eEST_Edge: { CVertexPC startPos, endPos; CVec3 rightDir = emitterMat.GetRightVec3(); startPos.position = rightDir * m_fRadius; startPos.color = 0xFFFF00FF; endPos.position = rightDir * -m_fRadius; endPos.color = 0xFFFF00FF; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 3.0f); } break; default: BEATS_ASSERT(false, "Never reach here!"); break; } }