5 #include <RobotAPI/interface/ArViz/Elements.h>
8 #include <Inventor/nodes/SoCoordinate3.h>
9 #include <Inventor/nodes/SoDrawStyle.h>
10 #include <Inventor/nodes/SoMaterial.h>
11 #include <Inventor/nodes/SoMaterialBinding.h>
12 #include <Inventor/nodes/SoPointSet.h>
13 #include <x86intrin.h>
25 SoMaterialBinding* pclMatBind =
new SoMaterialBinding;
26 pclMatBind->value = SoMaterialBinding::PER_PART;
32 node->addChild(pclMatBind);
35 node->addChild(
new SoPointSet);
41 data::ColoredPoint
const* pclData = (data::ColoredPoint
const*)element.points.data();
42 int pclSize = element.points.size() /
sizeof(data::ColoredPoint);
44 int singleBufferSize = pclSize * 3;
45 buffer.resize(singleBufferSize * 2);
47 const float conv = 1.0f / 255.0f;
48 float* coordsData =
buffer.data();
49 float* colorsData =
buffer.data() + singleBufferSize;
51 for (
int i = 0; i < pclSize; ++i)
53 data::ColoredPoint point = pclData[i];
54 colorsData[i * 3 + 0] = point.color.r * conv;
55 colorsData[i * 3 + 1] = point.color.g * conv;
56 colorsData[i * 3 + 2] = point.color.b * conv;
58 coordsData[i * 3 + 0] = point.x;
59 coordsData[i * 3 + 1] = point.y;
60 coordsData[i * 3 + 2] = point.z;
63 pclMat->diffuseColor.setValuesPointer(pclSize, colorsData);
64 pclMat->ambientColor.setValuesPointer(pclSize, colorsData);
65 pclMat->transparency = element.transparency;
67 pclCoords->point.setValuesPointer(pclSize, coordsData);
69 pclStyle->pointSize = element.pointSizeInPixels;
77 float* pclIn = (
float*)element.points.data();
78 int pclSize = element.points.size() /
sizeof(data::ColoredPoint);
81 int singleBufferSize = (pclSize + 3) * 3;
82 if (singleBufferSize % 16 != 0)
84 singleBufferSize += 16 - singleBufferSize % 16;
86 buffer.resize(singleBufferSize * 2);
88 float* positionsData =
buffer.data();
89 float* colorsData =
buffer.data() + singleBufferSize;
91 float* colorsOut = colorsData;
92 float* positionsOut = positionsData;
94 __m128 convColor = _mm_set1_ps(1.0f / 255.0f);
95 __m128i offsetBase = _mm_set_epi32(12, 8, 4, 0);
96 __m128i offsetIncrement = _mm_set1_epi32(16);
97 __m128i maxOffset = _mm_set1_epi32(4 * (pclSize - 1));
98 __m128 floatMax = _mm_set1_ps(FLT_MAX);
103 for (
int i = 0; i < pclSize; i += 4)
106 __m128i offsets = _mm_min_epi32(offsetBase, maxOffset);
110 __m128 cp0 = _mm_loadu_ps(pclIn + _mm_extract_epi32(offsets, 0));
111 __m128 cp1 = _mm_loadu_ps(pclIn + _mm_extract_epi32(offsets, 1));
112 __m128 cp2 = _mm_loadu_ps(pclIn + _mm_extract_epi32(offsets, 2));
113 __m128 cp3 = _mm_loadu_ps(pclIn + _mm_extract_epi32(offsets, 3));
119 __m128i shiftedP0 = (__m128i)cp0;
121 __m128i shiftedP1 = _mm_shuffle_epi32((__m128i)cp1, _MM_SHUFFLE(0, 3, 2, 1));
123 __m128i shiftedP2 = _mm_shuffle_epi32((__m128i)cp2, _MM_SHUFFLE(1, 0, 3, 2));
125 __m128i shiftedP3 = _mm_shuffle_epi32((__m128i)cp3, _MM_SHUFFLE(2, 1, 0, 3));
129 __m128 p0 = _mm_blend_ps((__m128)shiftedP0, (__m128)shiftedP1, 8);
131 __m128 p1 = _mm_blend_ps((__m128)shiftedP1, (__m128)shiftedP2, 12);
133 __m128 p2 = _mm_blend_ps((__m128)shiftedP2, (__m128)shiftedP3, 14);
136 p0 = _mm_and_ps(p0, _mm_cmplt_ps(p0, floatMax));
137 p1 = _mm_and_ps(p1, _mm_cmplt_ps(p1, floatMax));
138 p2 = _mm_and_ps(p2, _mm_cmplt_ps(p2, floatMax));
141 _mm_storeu_ps(positionsOut + 0, p0);
142 _mm_storeu_ps(positionsOut + 4, p1);
143 _mm_storeu_ps(positionsOut + 8, p2);
147 __m128 c01 = _mm_blend_ps((__m128)shiftedP0, (__m128)shiftedP1, 7);
149 __m128 c23 = _mm_blend_ps((__m128)shiftedP2, (__m128)shiftedP3, 1);
151 __m128i c0123 = _mm_castps_si128(_mm_blend_ps(c01, c23, 3));
156 __m128i redI = _mm_and_si128(_mm_bsrli_si128(c0123, 1), _mm_set1_epi32(0xFF));
157 __m128i greenI = _mm_and_si128(_mm_bsrli_si128(c0123, 2), _mm_set1_epi32(0xFF));
158 __m128i blueI = _mm_and_si128(_mm_bsrli_si128(c0123, 3), _mm_set1_epi32(0xFF));
162 __m128
red = _mm_mul_ps(_mm_cvtepi32_ps(redI), convColor);
163 __m128
green = _mm_mul_ps(_mm_cvtepi32_ps(greenI), convColor);
164 __m128 blue = _mm_mul_ps(_mm_cvtepi32_ps(blueI), convColor);
170 __m128 c0 = _mm_setr_ps(
red[3],
green[3], blue[3],
red[2]);
171 __m128 c1 = _mm_setr_ps(
green[2], blue[2],
red[1],
green[1]);
172 __m128 c2 = _mm_setr_ps(blue[1],
red[0],
green[0], blue[0]);
175 _mm_storeu_ps(colorsOut + 0, c0);
176 _mm_storeu_ps(colorsOut + 4, c1);
177 _mm_storeu_ps(colorsOut + 8, c2);
184 offsetBase = _mm_add_epi32(offsetBase, offsetIncrement);
191 pclMat->diffuseColor.setValuesPointer(pclSize, colorsData);
192 pclMat->ambientColor.setValuesPointer(pclSize, colorsData);
193 pclMat->transparency = element.transparency;
195 pclCoords->point.setValuesPointer(pclSize, positionsData);
197 pclStyle->pointSize = element.pointSizeInPixels;