summaryrefslogtreecommitdiffstats
path: root/include/astra/cuda/3d/util3d.h
blob: 210d944a77010adeb671e772837ac6728754c2dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
-----------------------------------------------------------------------
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 <http://www.gnu.org/licenses/>.

-----------------------------------------------------------------------
*/

#ifndef _CUDA_UTIL3D_H
#define _CUDA_UTIL3D_H

#include <cuda.h>
#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