Beispiel #1
0
void Light::shine(sf::RenderWindow* win)
{
    for(int i=0;i<lights.size();i++)
    {
        std::vector<PointID> pnt;
        for(int j=0;j<tab.size();j++)
        {
            pnt.push_back(PointID(lights[i].first,tab[j].first,j));
            pnt.push_back(PointID(lights[i].first,tab[j].second,j));
        }
        sort(pnt.begin(), pnt.begin() + pnt.size(), cmp);
        for(int i=0;i<pnt.size()-1;i++)
            if(pnt[i].p==pnt[i+1].p)
            {
                pnt.erase(pnt.begin()+i);
                i--;
            }
        std::vector<Point> res;
        for(int j=0;j<pnt.size();j++)
        {
            res.push_back(pnt[j].p-lights[i].first);
            for(int k=0;k<tab.size();k++)
            {
                if(cross(lights[i].first,pnt[j].p,tab[k].first,tab[k].second))
                {
                    res.pop_back();
                    break;
                }
            }
        }
        for(int j=0;j<res.size()-1;j++)
        {
            drawTriangle(win,lights[i].first,res[j],res[j+1],lights[i].second);
        }
        drawTriangle(win,lights[i].first,res[0],res[res.size()-1],lights[i].second);

        sf::CircleShape circle(5);
        circle.setFillColor(lights[i].second);
        circle.move(lights[i].first-Point(5,5));
        win->draw(circle);
    }
}
Beispiel #2
0
SICALLBACK aaOcean_BeginEvaluate( ICENodeContext& in_ctxt )
{
    // get ocean pointer from user-data
    aaOcean *pOcean = (aaOcean *)(CValue::siPtrType)in_ctxt.GetUserData();

    // get ICE node input port arrays
    CDataArrayLong PointID( in_ctxt, ID_IN_PointID);
    CDataArrayLong resolution( in_ctxt, ID_IN_RESOLUTION);      
    CDataArrayLong seed( in_ctxt, ID_IN_SEED);
    CDataArrayFloat waveHeight( in_ctxt, ID_IN_WAVE_HEIGHT);
    CDataArrayFloat waveSpeed( in_ctxt, ID_IN_WAVESPEED);
    CDataArrayFloat chop( in_ctxt, ID_IN_CHOP);
    CDataArrayFloat oceanScale( in_ctxt, ID_IN_OCEAN_SCALE );
    CDataArrayFloat oceanDepth( in_ctxt, ID_IN_OCEAN_DEPTH );
    CDataArrayFloat windDir( in_ctxt, ID_IN_WINDDIR );
    CDataArrayFloat cutoff( in_ctxt, ID_IN_CUTOFF);
    CDataArrayFloat velocity( in_ctxt, ID_IN_WINDVELOCITY);
    CDataArrayLong  windAlign( in_ctxt, ID_IN_WINDALIGN );
    CDataArrayFloat damp( in_ctxt, ID_IN_DAMP);
    CDataArrayBool enableFoam( in_ctxt, ID_IN_ENABLEFOAM);
    CDataArrayFloat time( in_ctxt, ID_IN_TIME);
    CDataArrayFloat loopTime( in_ctxt, ID_IN_REPEAT_TIME);
    CDataArrayFloat surfaceTension( in_ctxt, ID_IN_SURFACE_TENSION);
    CDataArrayFloat randWeight( in_ctxt, ID_IN_RAND_WEIGHT);

    pOcean->input(resolution[0], 
        seed[0],
        oceanScale[0], 
        oceanDepth[0],
        surfaceTension[0],
        velocity[0], 
        cutoff[0], 
        windDir[0], 
        windAlign[0], 
        damp[0], 
        waveSpeed[0], 
        waveHeight[0],
        chop[0], 
        time[0],
        loopTime[0],
        enableFoam[0],
        randWeight[0]);

    return CStatus::OK;
}
Beispiel #3
0
void Light::f_shine(sf::RenderWindow* win)
{
     for(int i=0;i<lights.size();i++)
    {
        //lights[i].first +=Point(1,1);
        std::vector<PointID> pnt;
        std::set<int> Xcross;
        for(int j=0;j<tab.size();j++)
        {
            pnt.push_back(PointID(lights[i].first,tab[j].first,j));
            pnt.push_back(PointID(lights[i].first,tab[j].second,j));
            if(pnt[2*j].arch == 0 && pnt[2*j+1].arch>2) Xcross.insert(j);
            if(pnt[2*j+1].arch == 0 && pnt[2*j].arch>2) Xcross.insert(j);
        }
        sort(pnt.begin(), pnt.begin() + pnt.size(), cmp);

        Point D = Point(lights[i].first.x+2000,lights[i].first.y);
        for(int j=0;j<tab.size();j++)
        {
            if(cross(lights[i].first,D,tab[j].first,tab[j].second))
                Xcross.insert(j);
        }

        std::set<int> line = Xcross;
        Point Last;
        for(int j=pnt.size()-1;j>0;j--)
        {
            bool c = false;
            for (std::set<int>::iterator it=line.begin(); it!=line.end(); ++it)
            {
                if(cross(lights[i].first,pnt[j].p,tab[*it].first,tab[*it].second))
                {
                    c = true;
                    break;
                }
            }
            if(!c)
            {
                Last = pnt[j].p-lights[i].first;
                break;
            }
            if(line.find(pnt[j].led)==line.end())   line.insert(pnt[j].led);
            else                                    line.erase(pnt[j].led);
        }

        line = Xcross;
        int w=0;
        for(int j=0;j<pnt.size();j++)
        {
            bool c = false;
            for (std::set<int>::iterator it=line.begin(); it!=line.end(); ++it)
            {
                if(cross(lights[i].first,pnt[j].p,tab[*it].first,tab[*it].second))
                {
                    c = true;
                    break;
                }
            }
            if(!c&&pnt[j].p-lights[i].first!=Last)
            {
                std::vector<Line > wyn;
                for (std::set<int>::iterator it=line.begin(); it!=line.end(); ++it)
                    wyn.push_back(tab[*it]);
                drawTriangle(win,lights[i].first,Last,pnt[j].p-lights[i].first,lights[i].second,wyn);
                Last = pnt[j].p-lights[i].first;
            }
            if(line.find(pnt[j].led)==line.end())   line.insert(pnt[j].led);
            else                                    line.erase(pnt[j].led);
        }

        sf::CircleShape circle(5);
        circle.setFillColor(lights[i].second);
        circle.move(lights[i].first-Point(5,5));
        win->draw(circle);
    }
}
Beispiel #4
0
SICALLBACK aaOcean_Evaluate( ICENodeContext& in_ctxt )
{
    aaOcean *pOcean = (aaOcean *)(CValue::siPtrType)in_ctxt.GetUserData();

    CIndexSet indexSet(in_ctxt, ID_IN_PointID );
    CDataArrayLong PointID(in_ctxt, ID_IN_PointID );
    CDataArrayBool bEnable(in_ctxt, ID_IN_ENABLE);
    CDataArrayFloat uCoord(in_ctxt, ID_IN_U);
    CDataArrayFloat vCoord(in_ctxt, ID_IN_V);
    CDataArrayBool enableFoam( in_ctxt, ID_IN_ENABLEFOAM);
    CDataArrayMatrix4f transform(in_ctxt, ID_IN_TRANSFORM);

    const int count = PointID.GetCount();

    float worldSpaceVec[3] = {0.0f, 0.0f, 0.0f};
    float localSpaceVec[3] = {0.0f, 0.0f, 0.0f};

    int transformArraySize = 0;
    bool transformSingleton = TRUE;

    if(transform.GetCount() > 1)
        transformSingleton = FALSE;

    ULONG out_portID = in_ctxt.GetEvaluatedOutputPortID( ); 
    switch( out_portID )
    {
        case ID_OUT_OCEAN:
        {
            CDataArrayVector3f outData( in_ctxt );
            if(bEnable[0])
            {
                #pragma omp parallel for private(worldSpaceVec, localSpaceVec)
                for(int i = 0; i<count; ++i)
                {
                    // get ocean displacement vector
                    worldSpaceVec[1] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eHEIGHTFIELD);
                    if(pOcean->isChoppy())
                    {
                        worldSpaceVec[0] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eCHOPX);
                        worldSpaceVec[2] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eCHOPZ);
                    }

                    // multiply displacement vector by input transform matrix
                    if(!transformSingleton)
                        transformArraySize = i;

                    multiplyMatrix(&worldSpaceVec[0], &localSpaceVec[0], transform, transformArraySize);

                    outData[i].PutX(localSpaceVec[0]);
                    outData[i].PutY(localSpaceVec[1]);
                    outData[i].PutZ(localSpaceVec[2]);

                    outData[i].PutX(worldSpaceVec[0]);
                    outData[i].PutY(worldSpaceVec[1]);
                    outData[i].PutZ(worldSpaceVec[2]);
                }
            }
            else
            {
                #pragma omp parallel for
                for(int i = 0; i<count; ++i)
                {
                    outData[i].PutX(0.f); 
                    outData[i].PutY(0.f); 
                    outData[i].PutZ(0.f);
                }
            }
        }
        break;

        case ID_OUT_FOAM:
        {
            if(pOcean->isChoppy() && bEnable[0] && enableFoam[0])
            {               
                CDataArrayFloat outData( in_ctxt );

                // output raw (unscaled) foam in ICE deformer
                #pragma omp parallel for
                for(int i = 0; i<count; ++i)
                    outData[i] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eFOAM);
            }
        }
        break;

        case ID_OUT_EIGEN_MINUS:
        {
            CDataArrayVector3f outData( in_ctxt );
            if(pOcean->isChoppy() && bEnable[0] && enableFoam[0])
            {
                #pragma omp parallel for private(worldSpaceVec, localSpaceVec)
                for(int i = 0; i<count; ++i)
                {
                    worldSpaceVec[0] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eEIGENMINUSX);
                    worldSpaceVec[2] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eEIGENMINUSZ);

                    multiplyMatrix(&worldSpaceVec[0], &localSpaceVec[0], transform, transformArraySize);

                    outData[i].PutX(localSpaceVec[0]);
                    outData[i].PutY(0.0f);
                    outData[i].PutZ(localSpaceVec[2]);
                }
            }
            else
            {
                #pragma omp parallel for
                for(int i = 0; i<count; ++i){
                    outData[i].PutX(0);outData[i].PutY(0);outData[i].PutZ(0);}
            }
        }
        break;

        case ID_OUT_EIGEN_PLUS:
        {
            CDataArrayVector3f outData( in_ctxt );
            if(pOcean->isChoppy() && bEnable[0] && enableFoam[0])
            {
                #pragma omp parallel for private(worldSpaceVec, localSpaceVec)
                for(int i = 0; i<count; ++i)
                {
                    worldSpaceVec[0] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eEIGENPLUSX);
                    worldSpaceVec[2] = pOcean->getOceanData(uCoord[i], vCoord[i], aaOcean::eEIGENPLUSZ);

                    multiplyMatrix(&worldSpaceVec[0], &localSpaceVec[0], transform, transformArraySize);

                    outData[i].PutX(localSpaceVec[0]);
                    outData[i].PutY(0.0f);
                    outData[i].PutZ(localSpaceVec[2]);
                }
            }
            else
            {
                #pragma omp parallel for
                for(int i = 0; i<count; ++i){
                    outData[i].PutX(0); outData[i].PutY(0); outData[i].PutZ(0);}
            }
        }
        break;
    }

    return CStatus::OK;
}