void Surface::enterIntoGrid(LookupGrid *grid, rvulong myidx) { int xlo, zlo, xhi, zhi; int x,z; int i; xlo=grid->xgridcoord(ph.bbox.xlo - MAXIMUM_CAR_LENGTH); zlo=grid->zgridcoord(ph.bbox.zlo - MAXIMUM_CAR_LENGTH); xhi=grid->xgridcoord(ph.bbox.xhi + MAXIMUM_CAR_LENGTH); zhi=grid->zgridcoord(ph.bbox.zhi + MAXIMUM_CAR_LENGTH); if(xlo<0) xlo=0; if(zlo<0) zlo=0; #ifdef CHEAP_NCP_GRID for(x=xlo;x<=xhi;x++) for(z=zlo;z<=zhi;z++) grid->lichain(x,z)->push_back(myidx); #else /* calculate orientations: */ if(ph.plane[0].normal.y() < 0) { // face up for(i=0;i<nvecs;i++) orient_vecs[i] = vecs[(i+1)%nvecs] - vecs[i]; } else { // face down for(i=0;i<nvecs;i++) orient_vecs[i] = vecs[(nvecs+i-1)%nvecs] - vecs[i]; }; for(i=0;i<nvecs;i++) { orient_vecs[i].rotate_right_xz(); orient_is_waste[i]= (orient_vecs[i].lengthXZ() < 1.0); orient_vecs[i].normalizeXZ(); orient_distance[i]= vecs[i].scalarprod_xz(orient_vecs[i]) - MAXIMUM_CAR_LENGTH; }; // and enter: for(x=xlo;x<=xhi;x++) for(z=zlo;z<=zhi;z++) if(isInGrid(grid,x,z)) grid->lichain(x,z)->push_back(myidx); #endif }
void FattalCPU::ComputePropagation( int idPropagation, bool fristSweep, int writeUId ) { //FIXME: Warning: Handle only cube volume // Pour chaque elements de la LPM #pragma omp parallel for for (short x = 0; x < m_media->Size.x; x++) { for (short y = 0; y < m_media->Size.x; y++) { for (unsigned short idRay = 0; idRay < NbSamples*NbSamples; idRay++) { // Generate Ray Ray r; GenerateRay(r,x,y,idRay,Factor,NbSamples, idPropagation); // Initialize Ray value r.Position += r.Direction*0.001f; SPECTRUM rayValue = SPECTRUM_INIT(0.f); if(fristSweep) { // FIXME: Add ligthing method /*if(idPropagation == 1) rayValue = 40.f/81;*/ rayValue = m_light->getRadiance(idPropagation,x,y,idRay,NbSamples); } // Prepare other data float maxDirectionCoord = std::max(abs(r.Direction.x),std::max(abs(r.Direction.y),abs(r.Direction.z))); int nbElements = m_media->Size.x*m_media->Size.y*m_media->Size.y; //////////////////////////////// // Loop (Ray martching ) //////////////////////////////// TraversingVolumeAlgorithm rayTraversing(r); glm::ivec3 oldCurrendVoxID; do { while(isInGrid(rayTraversing.voxID, m_media->Size.x)) { //std::cout << rayTraversing.voxID.x << "x" << rayTraversing.voxID.y << "x" << rayTraversing.voxID.z << std::endl; oldCurrendVoxID = rayTraversing.voxID; rayTraversing.Traverse(r); // Je sais que c'est dans la grille // Car tout les points initialisee sont dedant int indiceVox = (oldCurrendVoxID.z*m_media->Size.x + oldCurrendVoxID.y)*m_media->Size.x + oldCurrendVoxID.x; float density = m_media->Density[indiceVox]; if(density > 0.000001) { // Calcul de la valeur SPECTRUM scatteringTerm = rayValue*(1 - exp(-1*m_media->ScatteringCoeff*density*rayTraversing.DeltaLength/maxDirectionCoord)); // float extinctionCoeff = (m_media->ScatteringCoeff+m_media->AbsorptionCoeff)*density; float extinctionFactor = exp(-1*extinctionCoeff*rayTraversing.DeltaLength/maxDirectionCoord); SPECTRUM UValue = m_Us[(writeUId+1)%2][idPropagation*nbElements + indiceVox]; rayValue = rayValue*extinctionFactor+(UValue*(1 - extinctionFactor)/extinctionCoeff); SPECTRUM value = scatteringTerm; // TODO: nbRays // TODO: Cell dim value *= 1.f / (NbSamples*NbSamples); #pragma omp critical { // Update I m_I[indiceVox] += value; for (int k = 0; k < 6; k++ ) { m_Us[writeUId][k*nbElements + indiceVox] += value / (SPECTRUM)6.f; } } } } rayTraversing.wrapCurrentVoxID(m_media->Size.x); rayValue = SPECTRUM_INIT(0.f); } while(isInGrid(rayTraversing.voxID, m_media->Size.x)); } // End For rayID } // End for Y } // End for X }