コード例 #1
1
ファイル: scene.cpp プロジェクト: aureargo/Gamagora_TP4_3D
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
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: scene.cpp プロジェクト: aureargo/Gamagora_TP4_3D
bool Scene::intersect(const Rayon& r, float& dist, int& i) const
{
    return intersect(r.getOrigine(), r.getDirection(), dist, i);
}
コード例 #4
0
ファイル: box.cpp プロジェクト: flamingfox/Gamagora_TP_3D
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;
}
コード例 #5
0
ファイル: box.cpp プロジェクト: flamingfox/Gamagora_TP_3D
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;
}