public void FindCells() { newParameters.CopyTo(parameters); // Choose a sampler function Sample sampler = null; switch (samplingType) { case SamplerType.CENTER: sampler = SampleCenter; break; case SamplerType.CORNERS_AVG: sampler = SampleCornersAvg; break; case SamplerType.CORNERS_MIN: sampler = SampleCornersMin; break; case SamplerType.CORNERS_MAX: sampler = SampleCornersMax; break; case SamplerType.MONTE_CARLO: sampler = SampleMonteCarlo; break; } cells = new GridCell[parameters.xDimension * parameters.yDimension]; Vector3 down = -transform.up; for (int y = 0; y < parameters.yDimension; y++) { for (int x = 0; x < parameters.xDimension; x++) { Vector3 rayPos = transform.TransformPoint(GetLocalCellBase(x, y) + Vector3.up * parameters.scanHeight); Vector3 pos; float height = noHitNoCell ? -1f : 0f; if (sampler(rayPos, down * parameters.scanHeight, out pos)) { Vector3 localPos = transform.InverseTransformPoint(pos); height = localPos.y + parameters.scanHeight * 0.5f; } cells[GetIdx(x, y)] = new GridCell(GetIdx(x, y), parameters.gridType, GetLocalCellBase(x, y) + Vector3.up * height); } } for (int y = 0; y < parameters.yDimension; y++) { for (int x = 0; x < parameters.xDimension; x++) { RegenerateEdges(x, y); } } }