示例#1
0
bool Scene::CalculateColor(const Ray& ray, Point<float> cameraPosition, Color<float>& color, UINT depth) const
{
	color = Color<float>(0.0f, 0.0f, 0.0f, 1.0f);

	// Find the nearest object to the camera:
	Point<float> intersection;
	Vector3<float> normal;
	const Material* material;
	if (!FindNearestIntersection(ray, intersection, normal, material))
		return false;

	// Add ambient and emission colors:
	color = material->ambientColor + material->emissionColor;

	// Calculate color from lights:
	Color<float> lightColor;
	CalculateLight(cameraPosition, intersection, normal, *material, lightColor);

	color = color + lightColor;

	// Add reflection:
	if (depth > 0)
	{
		Ray reflectionRay;
		reflectionRay.direction = ray.direction - (2.0f * ray.direction.dot(normal) * normal);
		reflectionRay.direction.normalize();
		reflectionRay.origin = intersection + reflectionRay.direction * 0.0001f;

		Color<float> reflectionColor;
		CalculateColor(reflectionRay, intersection, reflectionColor, depth - 1);
		color = color + (material->specularColor * reflectionColor);
	}

	return  true;
}
示例#2
0
void CPacman::Draw(CDC *pdc, const CRect& rect)
{
	pdc->FillSolidRect(rect, m_bgcolor);
	
	CRect rc= rect;
	rc.DeflateRect(5, 1);

	if (rc.Height() % 2 == 0)
		rc.bottom--;

	int diameter= rc.Height();

	int left= rc.left + (int)(m_position * (rc.Width() - diameter));
	rc.left= left;
	rc.right= left + diameter;

	CPen pen(PS_SOLID, 1, RGB(0,0,0));
	CSelectObject sopen(pdc, &pen);

	CBrush brush(CalculateColor());
	CSelectObject sobrush(pdc, &brush);

	CPoint ptStart;
	CPoint ptEnd;
	int hmiddle= rc.top + diameter / 2;

	int mouthcy= (int)(m_aperture * m_aperture * diameter);
	int upperMouthcy= mouthcy;
	int lowerMouthcy= mouthcy;

	// It's the sad truth, that CDC::Pie() behaves different on
	// Windows 9x than on NT.
	if (!m_isWindows9x)
		lowerMouthcy++;

	if (m_toTheRight)
	{
		ptStart.x= ptEnd.x= rc.right;
		ptStart.y	= hmiddle - upperMouthcy;
		ptEnd.y		= hmiddle + lowerMouthcy;
	}
	else
	{
		ptStart.x= ptEnd.x= rc.left;
		ptStart.y	= hmiddle + lowerMouthcy;
		ptEnd.y		= hmiddle - upperMouthcy;
	}

	pdc->Pie(rc, ptStart, ptEnd);
}
void CParticleManager::SetProperties(int cont, int i)
{
    CParticleEmitter* l_pE = new CParticleEmitter();
    l_pE->SetMinLife(m_vInfo[cont].fLifeMin);
    l_pE->SetMaxLife(m_vInfo[cont].fLifeMax);
    l_pE->SetTexture(m_vInfo[cont].pTexture);
    l_pE->SetMaxEmitRate(m_vInfo[cont].fEmitRate2);
    l_pE->SetMinEmitRate(m_vInfo[cont].fEmitRate1);
    l_pE->SetGravity(m_vInfo[cont].bGravity);
    l_pE->SetName(m_vInfo[cont].sName);

    //calcular posiciones del emisor
    l_pE->SetPos1(CalculatePos1(cont, i));
    l_pE->SetPos2(CalculatePos2(cont, i));

    //calcular color, dirección, tamaño, velocidad y ángulo de rotación
    CalculateColor(cont);
    CalculateDir(cont);
    CalculateSize(cont);
    CalculateVelocity(cont);
    CalculateAngle(cont);

    //fijar color, dirección, tamaño, velocidad y ángulo de rotación
    l_pE->SetColorTime(m_vTimeColor);
    l_pE->SetColorV(m_vColor);
    l_pE->SetDirTime(m_vTimeDir);
    l_pE->SetDirV(m_vDir);
    l_pE->SetSizeTime(m_vTimeSize);
    l_pE->SetSizeV(m_vSize);
    l_pE->SetVelocityTime(m_vTimeVel);
    l_pE->SetVelocityV(m_vVelocity);
    l_pE->SetAngleTime(m_vTimeAngle);
    l_pE->SetAngleV(m_vAngle);

    //borrar memoria
    m_vInfo[cont].vColor.clear();
    m_vInfo[cont].vDir.clear();
    m_vInfo[cont].vSize.clear();
    m_vInfo[cont].vVelocity.clear();
    m_vInfo[cont].vAngle.clear();

    m_vParticleEmitter.push_back(l_pE);
}