#pragma once #include "Intersectable.hpp" #include "Occluder.hpp" class Sphere : public Intersectable { // const Material* material; Vector centre; float radius; public: Sphere(Vector& centre, float radius, const Material* material) :centre(centre),radius(radius) { this->material = material; Vector diagonal(radius, radius, radius); bbox.minPoint = centre - diagonal; bbox.maxPoint = centre + diagonal; nOccluders = 1; occluders = new Occluder(centre, radius); } Sphere(std::istream& isc, Material** materialTable, int nMaterials) { centre.clear(); radius = 1.0f; material = &Material::DIFFUSEWHITE; char key[200]; do { isc >> key; if(strcmp(key,"radius") == 0) isc >> radius; else if(strcmp(key,"centre") == 0) isc >> centre; else if(strcmp(key,"material") == 0) { isc >> key; for(int i=0; i < nMaterials; i++) { material = materialTable[i]; if(strcmp(key, material->getName()) == 0) break; } } }while(strcmp(key,"end") != 0); Vector diagonal(radius, radius, radius); bbox.minPoint = centre - diagonal; bbox.maxPoint = centre + diagonal; nOccluders = 1; occluders = new Occluder(centre, radius); } bool intersectBackSide(const Ray& ray, float& depth, float rayMin, float rayMax ); bool intersect(const Ray& ray, float& depth, float rayMin, float rayMax); Vector getShadingNormal(const Vector& point) { Vector normal = point - centre; normal *= 1.0f / radius; return normal; } };