30 SoSeparator* pGrid =
new SoSeparator;
34 SoFaceSet* pSoFaceSet =
new SoFaceSet;
35 pSoFaceSet->numVertices.set1Value(0, 4);
43 SoTextureCoordinate2* pSoTextureCoordinate2 =
new SoTextureCoordinate2;
44 pSoTextureCoordinate2->point.set1Value(0, SbVec2f(1.0f, 1.0f));
45 pSoTextureCoordinate2->point.set1Value(1, SbVec2f(1.0f, 0.0f));
46 pSoTextureCoordinate2->point.set1Value(2, SbVec2f(0.0f, 0.0f));
47 pSoTextureCoordinate2->point.set1Value(3, SbVec2f(0.0f, 1.0f));
49 SoTextureCoordinateBinding* pSoTextureCoordinateBinding =
new SoTextureCoordinateBinding;
50 pSoTextureCoordinateBinding->value.setValue(SoTextureCoordinateBinding::PER_VERTEX);
55 pGrid->addChild(pSoTextureCoordinate2);
56 pGrid->addChild(pSoTextureCoordinateBinding);
59 pGrid->addChild(pSoFaceSet);
62 node->addChild(pGrid);
77 if (element.sizeX <= 0 || element.sizeY <= 0)
80 << element.sizeX <<
" x " << element.sizeY <<
").";
86 constexpr int maxDimension = std::numeric_limits<std::int16_t>::max();
87 if (element.sizeX > maxDimension || element.sizeY > maxDimension)
90 << element.sizeX <<
" x " << element.sizeY <<
", max is " << maxDimension
91 <<
" per dimension).";
97 const std::size_t sizeX =
static_cast<std::size_t
>(element.sizeX);
98 const std::size_t sizeY =
static_cast<std::size_t
>(element.sizeY);
99 const std::size_t expectedCellCount = sizeX * sizeY;
101 if (element.colors.size() != expectedCellCount)
104 <<
"Ignoring grid element with mismatched color data: "
105 <<
"expected " << expectedCellCount <<
" colors (" << element.sizeX
106 <<
" x " << element.sizeY <<
") but got " << element.colors.size()
114 const float X = element.sizeY * element.resolution;
115 const float Y = element.sizeX * element.resolution;
126 using Color = std::array<unsigned char, 4>;
128 std::vector<Color> pixels(expectedCellCount);
130 for (std::size_t
x = 0;
x < sizeX;
x++)
132 for (std::size_t y = 0; y < sizeY; y++)
134 const std::size_t idx = (
x * sizeY) + y;
136 const auto& color = element.colors[idx];
137 pixels[idx] =
Color{color.r, color.g, color.b, color.a};
142 pSoTexture2->image.setValue(SbVec2s{
static_cast<std::int16_t
>(element.sizeX),
143 static_cast<std::int16_t
>(element.sizeY)},
145 reinterpret_cast<const unsigned char*
>(pixels.data()));