Point Cloud Library (PCL)  1.14.1-dev
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/gpu/containers/device_array.h>
41 #include <pcl/pcl_macros.h>
42 #include <pcl/point_types.h>
43 
44 namespace pcl {
45 namespace gpu {
46 ///////////////////////////////////////
47 /// This is an experimental code ///
48 ///////////////////////////////////////
49 
50 const int NoCP = 0xFFFFFFFF;
51 
52 /** \brief Returns field copy operation code. */
53 inline int
54 cp(int from, int to)
55 {
56  return ((to & 0xF) << 4) + (from & 0xF);
57 }
58 
59 /* Combines several field copy operations to one int (called rule) */
60 inline int
61 rule(int cp1, int cp2 = NoCP, int cp3 = NoCP, int cp4 = NoCP)
62 {
63  return (cp1 & 0xFF) + ((cp2 & 0xFF) << 8) + ((cp3 & 0xFF) << 16) +
64  ((cp4 & 0xFF) << 24);
65 }
66 
67 /* Combines performs all field copy operations in given rule array (can be 0, 1, or 16
68  * copies) */
69 void
71  int in_size, int out_size, int rules[4], int size, const void* input, void* output);
72 
73 template <typename PointIn, typename PointOut>
74 void
77  int rule1,
78  int rule2 = NoCP,
79  int rule3 = NoCP,
80  int rule4 = NoCP)
81 {
82  int rules[4] = {rule1, rule2, rule3, rule4};
83  dst.create(src.size());
84  copyFieldsImpl(sizeof(PointIn) / sizeof(int),
85  sizeof(PointOut) / sizeof(int),
86  rules,
87  (int)src.size(),
88  src.ptr(),
89  dst.ptr());
90 }
91 
92 void
94 {
95  // PointXYZ.x (0) -> PointNormal.x (0)
96  // PointXYZ.y (1) -> PointNormal.y (1)
97  // PointXYZ.z (2) -> PointNormal.z (2)
98  copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
99 };
100 
101 void
103 {
104  // PointXYZ.normal_x (0) -> PointNormal.normal_x (4)
105  // PointXYZ.normal_y (1) -> PointNormal.normal_y (5)
106  // PointXYZ.normal_z (2) -> PointNormal.normal_z (6)
107  // PointXYZ.curvature (4) -> PointNormal.curvature (8)
108  copyFieldsEx(src, dst, rule(cp(0, 4), cp(1, 5), cp(2, 6), cp(4, 8)));
109 };
110 
111 void
113 {
114  // PointXYZRGBL.x (0) -> PointXYZ.x (0)
115  // PointXYZRGBL.y (1) -> PointXYZ.y (1)
116  // PointXYZRGBL.z (2) -> PointXYZ.z (2)
117  copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
118 };
119 
120 void
122 {
123  // PointXYZRGB.x (0) -> PointXYZ.x (0)
124  // PointXYZRGB.y (1) -> PointXYZ.y (1)
125  // PointXYZRGB.z (2) -> PointXYZ.z (2)
126  copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
127 };
128 
129 void
131 {
132  // PointXYZRGBA.x (0) -> PointXYZ.x (0)
133  // PointXYZRGBA.y (1) -> PointXYZ.y (1)
134  // PointXYZRGBA.z (2) -> PointXYZ.z (2)
135  copyFieldsEx(src, dst, rule(cp(0, 0), cp(1, 1), cp(2, 2)));
136 };
137 
138 void
140 {
141  // PointXYZRGBL.z (2) -> float (1)
142  copyFieldsEx(src, dst, rule(cp(2, 0)));
143 };
144 
145 void
147 {
148  // PointXYZRGBL.z (2) -> float (1)
149  copyFieldsEx(src, dst, rule(cp(2, 0)));
150 };
151 } // namespace gpu
152 } // namespace pcl
153 
154 #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:75
int cp(int from, int to)
Returns field copy operation code.
Definition: repacks.hpp:54
int rule(int cp1, int cp2=NoCP, int cp3=NoCP, int cp4=NoCP)
Definition: repacks.hpp:61
void copyFieldsZ(const DeviceArray< PointXYZ > &src, DeviceArray< float > &dst)
Definition: repacks.hpp:139
const int NoCP
This is an experimental code ///.
Definition: repacks.hpp:50
void copyFields(const DeviceArray< PointXYZ > &src, DeviceArray< PointNormal > &dst)
Definition: repacks.hpp:93
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.