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); } }
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; }
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); } }
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; }