vec3 Scene::calculPixel(const Rayon& ray, float dist, const vec3& oeil, float &oclu) const { #if 0 return vec3(dist*0.17, dist*0.19, dist*0.23); #else const vec3 dRay = ray.getDirection(); vec3 p(ray.getOrigine() + dRay*dist); node->repositionne(p); const vec3 n(node->getNormal(p)); Material texture = node->getMaterial(p); //return texture.getColor(); std::vector<Lumiere> lumieres2; //lumieres2.reserve(NB_RAYONS_CIEL+this->lumieres.size()); float ombre = calculPoisson(p, n, lumieres2); oclu = ombre; if(ombre > 0) { //for(const Lumiere& l: this->lumieres) //lumieres2.push_back(l); vec3 color = phong(texture, p, lumieres2, n, oeil); //color *= ombre; color = glm::clamp(color, vec3(0,0,0), vec3(1,1,1)); return color; } else return NOIR; #endif }
bool Terrain::intersect(const Rayon& rayon, float &coeffDistance, int &i) const { float dmin; float dmax; if(!box.intersect(rayon, dmin, dmax )) return false; //à modifier à cause de la précision des floats, mais c'est bizarre que ça marche comme un gant. faire attention que le point de départ ne soit pas en dehors de la box. //dmin = 0.0; //dmax = 3000.0; coeffDistance = dmin; for(i = 0; i<128; i++) { vec3 pos = rayon.getOrigine() + coeffDistance*rayon.getDirection(); float h = getHauteur( pos ); if(h == HAUTEUR_HORS_MAP) { if(i == 0) { coeffDistance += 0.01f; continue; } else break; } h = fabsf(pos.z - h); if( h <(0.002 * coeffDistance) ) { return true; }else if(coeffDistance > dmax ) break; coeffDistance += 0.3*h; } return false; }
bool Scene::intersect(const Rayon& r, float& dist, int& i) const { return intersect(r.getOrigine(), r.getDirection(), dist, i); }
inline float Box::intersectIn(const Rayon& r) const { float tmax, tymax, tzmax; if(r.getDirection()(0) == 0) tmax = FLT_MAX; else if(r.getDirection()(0) > 0) tmax = (max(0) - r.getOrigine()(0)) / r.getDirection()(0); else tmax = (min(0) - r.getOrigine()(0)) / r.getDirection()(0); if(r.getDirection()(1) == 0) tymax = FLT_MAX; else if(r.getDirection()(1) >= 0) tymax = (max(1) - r.getOrigine()(1)) / r.getDirection()(1); else tymax = (min(1) - r.getOrigine()(1)) / r.getDirection()(1); if(tymax < tmax) tmax = tymax; if(r.getDirection()(2) == 0) return tmax; else if(r.getDirection()(2) > 0) tzmax = (max(2) - r.getOrigine()(2)) / r.getDirection()(2); else tzmax = (min(2) - r.getOrigine()(2)) / r.getDirection()(2); if(tzmax < tmax) return tzmax; return tmax; }
bool Box::intersect(const Rayon &r, float &distanceMin, float &distanceMax) const { if(this->isIn(r.getOrigine())) { distanceMin = 0; distanceMax = intersectIn(r); return true; } float tmin, tmax, tymin, tymax, tzmin, tzmax; float div; if(r.getDirection()(0) == 0) { tmin = FLT_MIN; tmax = FLT_MAX; } else if(r.getDirection()(0) > 0) { div = 1 / r.getDirection()(0); tmin = (min(0) - r.getOrigine()(0)) * div; tmax = (max(0) - r.getOrigine()(0)) * div; } else { div = 1 / r.getDirection()(0); tmin = (max(0) - r.getOrigine()(0)) * div; tmax = (min(0) - r.getOrigine()(0)) * div; } if(r.getDirection()(1) == 0) { tymin = FLT_MIN; tymax = FLT_MAX; } else if(r.getDirection()(1) >= 0) { div = 1 / r.getDirection()(1); tymin = (min(1) - r.getOrigine()(1)) * div; tymax = (max(1) - r.getOrigine()(1)) * div; } else { div = 1 / r.getDirection()(1); tymin = (max(1) - r.getOrigine()(1)) * div; tymax = (min(1) - r.getOrigine()(1)) * div; } if( (tmin > tymax) || (tymin > tmax) ) return false; if(tymin > tmin) tmin = tymin; if(tymax < tmax) tmax = tymax; if(r.getDirection()(2) == 0) { tzmin = FLT_MIN; tzmax = FLT_MAX; } else if(r.getDirection()(2) > 0) { div = 1 / r.getDirection()(2); tzmin = (min(2) - r.getOrigine()(2)) * div; tzmax = (max(2) - r.getOrigine()(2)) * div; } else { div = 1 / r.getDirection()(2); tzmin = (max(2) - r.getOrigine()(2)) * div; tzmax = (min(2) - r.getOrigine()(2)) * div; } if( (tmin > tzmax) || (tzmin > tmax) ) return false; if(tzmin > tmin) tmin = tzmin; if(tzmax < tmax) tmax = tzmax; if(tmin>=0) distanceMin = tmin; //else // return false; //inutile apparament //distanceMin += 0.002; if(tmax>0) distanceMax = tmax; return true; }