/*
-----------------------------------------------------------------------
Copyright: 2010-2021, imec Vision Lab, University of Antwerp
2014-2021, CWI, Amsterdam
Contact: astra@astra-toolbox.com
Website: http://www.astra-toolbox.com/
This file is part of the ASTRA Toolbox.
The ASTRA Toolbox is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The ASTRA Toolbox is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with the ASTRA Toolbox. If not, see .
-----------------------------------------------------------------------
*/
#ifndef _CUDA_UTIL3D_H
#define _CUDA_UTIL3D_H
#include
#include "dims3d.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include "../2d/util.h"
namespace astraCUDA3d {
using astraCUDA::checkCuda;
cudaPitchedPtr allocateVolumeData(const SDimensions3D& dims);
cudaPitchedPtr allocateProjectionData(const SDimensions3D& dims);
bool zeroVolumeData(cudaPitchedPtr& D_data, const SDimensions3D& dims);
bool zeroProjectionData(cudaPitchedPtr& D_data, const SDimensions3D& dims);
bool copyVolumeToDevice(const float* data, cudaPitchedPtr& D_data, const SDimensions3D& dims, unsigned int pitch = 0);
bool copyProjectionsToDevice(const float* data, cudaPitchedPtr& D_data, const SDimensions3D& dims, unsigned int pitch = 0);
bool copyVolumeFromDevice(float* data, const cudaPitchedPtr& D_data, const SDimensions3D& dims, unsigned int pitch = 0);
bool copyProjectionsFromDevice(float* data, const cudaPitchedPtr& D_data, const SDimensions3D& dims, unsigned int pitch = 0);
bool duplicateVolumeData(cudaPitchedPtr& D_dest, const cudaPitchedPtr& D_src, const SDimensions3D& dims);
bool duplicateProjectionData(cudaPitchedPtr& D_dest, const cudaPitchedPtr& D_src, const SDimensions3D& dims);
bool transferProjectionsToArray(cudaPitchedPtr D_projData, cudaArray* array, const SDimensions3D& dims);
bool transferHostProjectionsToArray(const float *projData, cudaArray* array, const SDimensions3D& dims);
bool transferVolumeToArray(cudaPitchedPtr D_volumeData, cudaArray* array, const SDimensions3D& dims);
bool zeroProjectionArray(cudaArray* array, const SDimensions3D& dims);
bool zeroVolumeArray(cudaArray* array, const SDimensions3D& dims);
cudaArray* allocateProjectionArray(const SDimensions3D& dims);
cudaArray* allocateVolumeArray(const SDimensions3D& dims);
bool createTextureObject3D(cudaArray* array, cudaTextureObject_t& texObj);
float dotProduct3D(cudaPitchedPtr data, unsigned int x, unsigned int y, unsigned int z);
int calcNextPowerOfTwo(int _iValue);
struct Vec3 {
double x;
double y;
double z;
Vec3(double x_, double y_, double z_) : x(x_), y(y_), z(z_) { }
Vec3 operator+(const Vec3 &b) const {
return Vec3(x + b.x, y + b.y, z + b.z);
}
Vec3 operator-(const Vec3 &b) const {
return Vec3(x - b.x, y - b.y, z - b.z);
}
Vec3 operator-() const {
return Vec3(-x, -y, -z);
}
Vec3 operator*(double s) {
return Vec3(s*x, s*y, s*z);
}
double norm() const {
return sqrt(x*x + y*y + z*z);
}
};
static double det3x(const Vec3 &b, const Vec3 &c) {
return (b.y * c.z - b.z * c.y);
}
static double det3y(const Vec3 &b, const Vec3 &c) {
return -(b.x * c.z - b.z * c.x);
}
static double det3z(const Vec3 &b, const Vec3 &c) {
return (b.x * c.y - b.y * c.x);
}
static double det3(const Vec3 &a, const Vec3 &b, const Vec3 &c) {
return a.x * det3x(b,c) + a.y * det3y(b,c) + a.z * det3z(b,c);
}
static Vec3 cross3(const Vec3 &a, const Vec3 &b) {
return Vec3(det3x(a,b), det3y(a,b), det3z(a,b));
}
static Vec3 scaled_cross3(const Vec3 &a, const Vec3 &b, const Vec3 &sc) {
Vec3 ret = cross3(a, b);
ret.x *= sc.y * sc.z;
ret.y *= sc.x * sc.z;
ret.z *= sc.x * sc.y;
return ret;
}
}
#endif