Point Cloud Library (PCL) 1.13.0
repacks.hpp
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2011, Willow Garage, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
17 * * Neither the name of Willow Garage, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *
34 * Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)
35 */
36
37#ifndef __PCL_GPU_UTILS_REPACKS_HPP__
38#define __PCL_GPU_UTILS_REPACKS_HPP__
39
40#include <pcl/pcl_macros.h>
41#include <pcl/point_types.h>
42
43#include <pcl/gpu/containers/device_array.h>
44
45namespace pcl
46{
47 namespace gpu
48 {
49 ///////////////////////////////////////
50 /// This is an experimental code ///
51 ///////////////////////////////////////
52
53 const int NoCP = 0xFFFFFFFF;
54
55 /** \brief Returns field copy operation code. */
56 inline int cp(int from, int to)
57 {
58 return ((to & 0xF) << 4) + (from & 0xF);
59 }
60
61 /* Combines several field copy operations to one int (called rule) */
62 inline int rule(int cp1, int cp2 = NoCP, int cp3 = NoCP, int cp4 = NoCP)
63 {
64 return (cp1 & 0xFF) + ((cp2 & 0xFF) << 8) + ((cp3 & 0xFF) << 16) + ((cp4 & 0xFF) << 24);
65 }
66
67 /* Combines performs all field copy operations in given rule array (can be 0, 1, or 16 copies) */
68 void copyFieldsImpl(int in_size, int out_size, int rules[4], int size, const void* input, void* output);
69
70 template<typename PointIn, typename PointOut>
71 void copyFieldsEx(const DeviceArray<PointIn>& src, DeviceArray<PointOut>& dst, int rule1, int rule2 = NoCP, int rule3 = NoCP, int rule4 = NoCP)
72 {
73 int rules[4] = { rule1, rule2, rule3, rule4 };
74 dst.create(src.size());
75 copyFieldsImpl(sizeof(PointIn)/sizeof(int), sizeof(PointOut)/sizeof(int), rules, (int)src.size(), src.ptr(), dst.ptr());
76 }
77
79 {
80 //PointXYZ.x (0) -> PointNormal.x (0)
81 //PointXYZ.y (1) -> PointNormal.y (1)
82 //PointXYZ.z (2) -> PointNormal.z (2)
83 copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
84 };
85
87 {
88 //PointXYZ.normal_x (0) -> PointNormal.normal_x (4)
89 //PointXYZ.normal_y (1) -> PointNormal.normal_y (5)
90 //PointXYZ.normal_z (2) -> PointNormal.normal_z (6)
91 //PointXYZ.curvature (4) -> PointNormal.curvature (8)
92 copyFieldsEx(src, dst, rule(cp(0, 4), cp(1, 5), cp(2, 6), cp(4,8)));
93 };
94
96 {
97 //PointXYZRGBL.x (0) -> PointXYZ.x (0)
98 //PointXYZRGBL.y (1) -> PointXYZ.y (1)
99 //PointXYZRGBL.z (2) -> PointXYZ.z (2)
100 copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
101 };
102
104 {
105 //PointXYZRGB.x (0) -> PointXYZ.x (0)
106 //PointXYZRGB.y (1) -> PointXYZ.y (1)
107 //PointXYZRGB.z (2) -> PointXYZ.z (2)
108 copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
109 };
110
112 {
113 //PointXYZRGBA.x (0) -> PointXYZ.x (0)
114 //PointXYZRGBA.y (1) -> PointXYZ.y (1)
115 //PointXYZRGBA.z (2) -> PointXYZ.z (2)
116 copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
117 };
118
120 {
121 //PointXYZRGBL.z (2) -> float (1)
122 copyFieldsEx(src, dst, rule(cp(2, 0)));
123 };
124
126 {
127 //PointXYZRGBL.z (2) -> float (1)
128 copyFieldsEx(src, dst, rule(cp(2, 0)));
129 };
130 }
131}
132
133#endif /* __PCL_GPU_UTILS_REPACKS_HPP__ */
DeviceArray class
Definition: device_array.h:54
std::size_t size() const
Returns size in elements.
void create(std::size_t size)
Allocates internal buffer in GPU memory.
T * ptr()
Returns pointer for internal buffer in GPU memory.
Defines all the PCL implemented PointT point type structures.
void copyFieldsEx(const DeviceArray< PointIn > &src, DeviceArray< PointOut > &dst, int rule1, int rule2=NoCP, int rule3=NoCP, int rule4=NoCP)
Definition: repacks.hpp:71
int cp(int from, int to)
Returns field copy operation code.
Definition: repacks.hpp:56
int rule(int cp1, int cp2=NoCP, int cp3=NoCP, int cp4=NoCP)
Definition: repacks.hpp:62
void copyFieldsZ(const DeviceArray< PointXYZ > &src, DeviceArray< float > &dst)
Definition: repacks.hpp:119
const int NoCP
This is an experimental code ///.
Definition: repacks.hpp:53
void copyFields(const DeviceArray< PointXYZ > &src, DeviceArray< PointNormal > &dst)
Definition: repacks.hpp:78
void copyFieldsImpl(int in_size, int out_size, int rules[4], int size, const void *input, void *output)
Defines all the PCL and non-PCL macros used.