Raytracer::Raytracer(): texture(0) { prepareTargetBuffer(128,128); std::shared_ptr<Clump3d> clump(new Clump3d); // // Cube // std::shared_ptr<MeshGeometry3d> geom1(new MeshGeometry3d()); cube(geom1->getMesh()); geom1->meshChanged(); geom1->setColor(GAL::P4d(1.0, 0.0, 0.0, 1.0)); std::shared_ptr<MeshGeometry3d> geom5(new MeshGeometry3d()); cube(geom5->getMesh()); geom5->meshChanged(); geom5->setColor(GAL::P4d(0.0, 0.7, 1.0, 1.0)); // // Manifold // std::shared_ptr<MeshGeometry<Vertex3d> > geom3(new MeshGeometry<Vertex3d>()); manifold(geom3->getMesh()); geom3->meshChanged(); geom3->setColor(GAL::P4d(1.0, 1.0, 0.0, 1.0)); // // Sphere // std::shared_ptr<SphereGeometry3d> geom2(new SphereGeometry3d(0.5)); geom2->setColor(GAL::P4d(0.0, 1.0, 1.0, 1.0)); std::shared_ptr<SphereGeometry3d> geom4(new SphereGeometry3d(0.25)); geom4->setColor(GAL::P4d(1.0, 0.8, 0.0, 1.0)); clump->addGeometry(geom1); clump->addGeometry(geom2); clump->addGeometry(geom3); clump->addGeometry(geom4); clump->addGeometry(geom5); geom1->setTranslation(GAL::P3d(-1,-1,0)); geom2->setTranslation(GAL::P3d(0,1,0)); geom3->setTranslation(GAL::P3d(1,0.5,0)); geom3->setLocalTransform(GAL::EulerRotationX(90.0), 0); geom4->setTranslation(GAL::P3d(1.2,1,0.8)); geom5->setTranslation(GAL::P3d(0,1,-3)); geom5->setLocalTransform(GAL::EulerRotationY(10.0), 0); scene.addClump(clump); std::shared_ptr<Light3d> light1(new Light3d()); light1->setPosition(GAL::P3d(1,4,-1)); light1->setDiffuseColor(GAL::P3d(0.7, 0.7, 0.7)); light1->setSpecularColor(GAL::P3d(1.0, 1.0, 1.0)); light1->setShadow(true); light1->setSoftShadowWidth(0.05); scene.addLight(light1); std::shared_ptr<Light3d> light2(new Light3d()); light2->setPosition(GAL::P3d(-1,4,3)); light2->setDiffuseColor(GAL::P3d(0.7, 0.7, 0.7)); light2->setSpecularColor(GAL::P3d(1.0, 1.0, 1.0)); light2->setShadow(true); light2->setSoftShadowWidth(0.05); scene.addLight(light2); camera.setFrustum(-1, 1, -1, 1, -1, -100); camera.setTranslation(GAL::P3d(1,2,3)); camera.setLocalTransform(GAL::EulerRotationX(30.0) * GAL::EulerRotationY(15.0), 0); camera.setFSAA(true); camera.setRecursionDepth(3); }
/** * Return true with probability 1/π. * * @tparam Random the type of the random generator. * @param[in,out] r a random generator. * @return true with probability 1/π. **********************************************************************/ template<class Random> bool operator()(Random& r) { // Return true with prob 1/pi. int n = geom4(r) + geom4(r) + (prob59(r) ? 1 : 0); for (int j = 3; j--; ) if (!binom(r, n)) return false; return true; }