void CSeperator_EfficiencyCurve::EvalProducts(MStream &Feed , MStream &Product1, MStream &Product2, MStream &Product3, bool bTwoDecks, bool bInit) { // Get info on Size Distribution MIPSD & l_PSD=*Feed.FindIF<MIPSD>(); if (IsNothing(l_PSD)) { int xx=0; return; //Why do we get here!!! } long l_SizeCount = l_PSD.getSizeCount(); long l_PSDVectorCount = l_PSD.getPSDVectorCount(); // // Calculate Probability Passing for Each Deck // We could calculate this in Build Data definition // CalculateEfficiencyCurve( l_PSD , m_dTopD50 , m_dTopAlpha, m_dTopBeta, m_dTopC, m_dTopBetaStar, m_TopEu ); CalculateEfficiencyCurve( l_PSD , m_dBottomD50 , m_dBottomAlpha, m_dBottomBeta, m_dBottomC, m_dBottomBetaStar, m_BottomEu ); if ( bTwoDecks ) { // Execute the first seperator //MStream l_IntermediateProduct = Product1; // Cannot do this as = operator does not make copy Seperate(m_TopEu,m_dTopWaterSplitToUS, Feed, Product1 , /*l_IntermediateProduct*/Product2); // Execute the second seperator Seperate(m_BottomEu,m_dBottomWaterSplitToUS, /*l_IntermediateProduct*/Product2, Product2 , Product3); } else { // Execute the first seperator Seperate(m_TopEu,m_dTopWaterSplitToUS, Feed, Product1 , Product3); } }
void DIYPhysicScene::Response(RigidBody * obj1, RigidBody * obj2, float overlap, vec3 normal) { Seperate(obj1, obj2, overlap, normal); const float coefficientOfRestitution = 0.5f; vec3 relativeVel = obj2->m_linearVelocity - obj1->m_linearVelocity; float velocityAlongNormal = glm::dot(relativeVel, normal); float impulseAmount = -(1 - coefficientOfRestitution) * velocityAlongNormal; impulseAmount /= 1 / obj1->m_mass + 1 / obj2->m_mass; float combinedElasticity = (obj1->m_elasticity + obj2->m_elasticity) / 2.0f; vec3 impulse = impulseAmount * normal; // Apply change in momentum obj1->AddVelocity(1 / obj1->m_mass * -impulse); obj2->AddVelocity(1 / obj2->m_mass * impulse); }