Esempio n. 1
0
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

}
Esempio n. 2
0
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
}