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