#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <ctime>
#include <omp.h>
#include "device_functions.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"


#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkResampleImageFilter.h"
#include "itkCenteredEuler3DTransform.h"
#include "itkNearestNeighborInterpolateImageFunction.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkShiftScaleImageFilter.h"
#include "itkNormalizeImageFilter.h"
#include "itkImageSeriesReader.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"

#include "itkBMPImageIOFactory.h"


#include "CUDAdrr.cuh"

#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

class drr
{
public:
	using InputImageType = typename itk::Image<float, 3>;
	using PointType = typename InputImageType::PointType;

	drr(std::string path);
	~drr();

	float* cudaFloatDRR(float rx, float ry, float rz, int dx, int dy, float threshold);
	unsigned char* cudaUCharDRR(float rx, float ry, float rz, int dx, int dy, float threshold);

	itk::ImageSeriesReader< itk::Image< float, 3 > >::Pointer reader;
	itk::Image<float, 3>::Pointer image;
	float* cpp_object3D;
};

