コード例 #1
0
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();
    }
}
コード例 #2
0
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;
    }
}