bool hitTriang(Photon *photon, Triang *triang, const float distance, const Material *materials) { Shader shader = DIFFUSE; // Better idea? if (fDot(triang->direct, photon->direct) > -EPSILON) triang->direct = vNeg(triang->direct); // Update ray's position to the point where the ray hits the sphere photon->origin = fFMA(photon->direct, distance - UM(10), photon->origin); photon->lambda = materials[triang->mID].lambda; if (shader == CRAZY) { photon->direct = vNorm(vSub(newVec(0.99, 0, 0), photon->origin)); return REFLECTED; } else if (shader == SPECULAR) { // Angle between new and old vector is twice the angle between old vector and normal Vec reflect = vDot(photon->direct, triang->direct); photon->direct = vSub(photon->direct, vMul(triang->direct, vAdd(reflect, reflect))); return REFLECTED; } else if (shader == DIFFUSE) { photon->direct = randDir(); if (fDot(photon->direct, triang->direct) < EPSILON) photon->direct = vNeg(photon->direct); return REFLECTED; } else return ABSORBED; }
void VerletStick::constrainLen() { for (int i=0; i<constrainLoopCount; i++) { Vector3df delta = Vector3df(b2->getPos().x-b1->getPos().x, b2->getPos().y-b1->getPos().y, b2->getPos().z-b1->getPos().z); float deltaLength = delta.mag(); float difference = ((deltaLength - len) / deltaLength); // nudge positiviely Vector3df vPos(delta.x * (constrainVal.elem0 * tension * difference), delta.y * (constrainVal.elem0 * tension * difference), delta.z * (constrainVal.elem0 * tension * difference) ); b1->addPos(vPos); // nudge negatively Vector3df vNeg(delta.x * (constrainVal.elem1 * tension * difference), delta.y * (constrainVal.elem1 * tension * difference), delta.z * (constrainVal.elem1 * tension * difference) ); b2->subPos(vNeg); /*std::cout << "b1.getPos() = " << b1.getPos() << std::endl; std::cout << "vNeg = " << vNeg << std::endl; std::cout << "deltaLength = " << deltaLength << std::endl; std::cout << "difference = " << difference << std::endl;*/ } }
Photon triangEmit(const Triang *triang, const Material *materials) { Photon p; float u = drand48(), v = drand48(); Vec point = vAdd(fMul(triang->vectab, u), fMul(triang->vectac, v)); // If point is outside triangle if (!triang->rectan && u + v < EPSILONONE) p.origin = vSub(vAdd(triang->origin, vAdd(triang->vectab, triang->vectac)), point); else p.origin = vAdd(triang->origin, point); p.direct = randDir(); if (fDot(p.direct, triang->direct) > EPSILON) p.direct = vNeg(p.direct); p.lambda = materials[triang->mID].lambda; return p; }