GCC Code Coverage Report


Directory: ./
File: openvdb/openvdb/unittest/TestQuantizedUnitVec.cc
Date: 2022-07-25 17:40:05
Exec Total Coverage
Lines: 47 47 100.0%
Functions: 1 1 100.0%
Branches: 29 338 8.6%

Line Branch Exec Source
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
4 #include <openvdb/Exceptions.h>
5 #include <openvdb/math/QuantizedUnitVec.h>
6 #include <openvdb/math/Math.h>
7 #include <openvdb/math/Vec3.h>
8
9 #include <gtest/gtest.h>
10
11 #include <sstream>
12 #include <algorithm>
13 #include <cmath>
14 #include <ctime>
15
16
17 1 class TestQuantizedUnitVec: public ::testing::Test
18 {
19 protected:
20 // Generate a random number in the range [0, 1].
21 120000 double randNumber() { return double(rand()) / (double(RAND_MAX) + 1.0); }
22 };
23
24
25 ////////////////////////////////////////
26
27
28 namespace {
29 const uint16_t
30 MASK_XSIGN = 0x8000, // 1000000000000000
31 MASK_YSIGN = 0x4000, // 0100000000000000
32 MASK_ZSIGN = 0x2000; // 0010000000000000
33 }
34
35
36 ////////////////////////////////////////
37
38
39
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestQuantizedUnitVec, testQuantization)
40 {
41 using namespace openvdb;
42 using namespace openvdb::math;
43
44 //
45 // Check sign bits
46 //
47 Vec3s unitVec = Vec3s(-1.0, -1.0, -1.0);
48 1 unitVec.normalize();
49
50
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 uint16_t quantizedVec = QuantizedUnitVec::pack(unitVec);
51
52
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_XSIGN));
53
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_YSIGN));
54
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_ZSIGN));
55
56 1 unitVec[0] = -unitVec[0];
57 1 unitVec[2] = -unitVec[2];
58 1 quantizedVec = QuantizedUnitVec::pack(unitVec);
59
60
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_XSIGN));
61
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_YSIGN));
62
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_ZSIGN));
63
64 1 unitVec[1] = -unitVec[1];
65 1 quantizedVec = QuantizedUnitVec::pack(unitVec);
66
67
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_XSIGN));
68
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_YSIGN));
69
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_ZSIGN));
70
71 QuantizedUnitVec::flipSignBits(quantizedVec);
72
73
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_XSIGN));
74
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_YSIGN));
75
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_ZSIGN));
76
77 1 unitVec[2] = -unitVec[2];
78
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 quantizedVec = QuantizedUnitVec::pack(unitVec);
79 QuantizedUnitVec::flipSignBits(quantizedVec);
80
81
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_XSIGN));
82
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE((quantizedVec & MASK_YSIGN));
83
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1 EXPECT_TRUE(!(quantizedVec & MASK_ZSIGN));
84
85 //
86 // Check conversion error
87 //
88 const double tol = 0.05; // component error tolerance
89
90 const int numNormals = 40000;
91
92
93 // init
94 1 srand(0);
95 const int n = int(std::sqrt(double(numNormals)));
96 const double xScale = (2.0 * M_PI) / double(n);
97 const double yScale = M_PI / double(n);
98
99 double x, y, theta, phi;
100 Vec3s n0, n1;
101
102 // generate random normals, by uniformly distributing points on a unit-sphere.
103
104 // loop over a [0 to n) x [0 to n) grid.
105
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 1 times.
201 for (int a = 0; a < n; ++a) {
106
2/2
✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 200 times.
40200 for (int b = 0; b < n; ++b) {
107
108 // jitter, move to random pos. inside the current cell
109 40000 x = double(a) + randNumber();
110 40000 y = double(b) + randNumber();
111
112 // remap to a lat/long map
113 40000 theta = y * yScale; // [0 to PI]
114 40000 phi = x * xScale; // [0 to 2PI]
115
116 // convert to cartesian coordinates on a unit sphere.
117 // spherical coordinate triplet (r=1, theta, phi)
118 40000 n0[0] = float(std::sin(theta)*std::cos(phi));
119 40000 n0[1] = float(std::sin(theta)*std::sin(phi));
120 40000 n0[2] = float(std::cos(theta));
121
122
1/14
✗ Branch 1 not taken.
✓ Branch 2 taken 40000 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40000 EXPECT_NEAR(1.0, n0.length(), 1e-6);
123
124 40000 n1 = QuantizedUnitVec::unpack(QuantizedUnitVec::pack(n0));
125
126
1/14
✗ Branch 1 not taken.
✓ Branch 2 taken 40000 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40000 EXPECT_NEAR(1.0, n1.length(), 1e-6);
127
128
1/14
✗ Branch 1 not taken.
✓ Branch 2 taken 40000 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40000 EXPECT_NEAR(n0[0], n1[0], tol);
129
1/14
✗ Branch 1 not taken.
✓ Branch 2 taken 40000 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40000 EXPECT_NEAR(n0[1], n1[1], tol);
130
1/14
✗ Branch 1 not taken.
✓ Branch 2 taken 40000 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40000 EXPECT_NEAR(n0[2], n1[2], tol);
131
132
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
40000 float sumDiff = std::abs(n0[0] - n1[0]) + std::abs(n0[1] - n1[1])
133 40000 + std::abs(n0[2] - n1[2]);
134
135
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 40000 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
40000 EXPECT_TRUE(sumDiff < (2.0 * tol));
136 }
137 }
138 1 }
139