// Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "custominstancing.h" #include #include struct InstanceTableEntry { QVector4D row0; QVector4D row1; QVector4D row2; QVector4D color; QVector4D instanceData; }; void CustomInstancing::setInstanceCount(int instanceCount) { if (m_instanceCount == instanceCount) return; m_instanceCount = instanceCount; emit instanceCountChanged(m_instanceCount); } QByteArray CustomInstancing::getInstanceBuffer(int *instanceCount) { QByteArray instanceData; if (instanceCount) *instanceCount = m_instanceCount; if (m_instanceCount == 0) return instanceData; instanceData.resize(m_instanceCount * 20 * sizeof(float)); auto array = reinterpret_cast(instanceData.data()); const int rows = floor(sqrt(m_instanceCount)); const int columns = m_instanceCount/rows; for (int i = 0; i < m_instanceCount; ++i) { QMatrix4x4 xform; int ix = i % columns; int iy = i / columns; float x = 100.0 * (ix - columns/2); float y = 100.0 * (iy - rows/2); float z = (x*x + y*y)/1000; xform(0, 3) += x; xform(1, 3) += y; xform(2, 3) += z; float scale = 0.75; xform(0, 0) = scale; xform(1, 1) = scale; xform(2, 2) = scale; QVector4D color(float(ix)/columns, float(iy)/columns, 1.0, float(i) / m_instanceCount); array[i] = { xform.row(0), xform.row(1), xform.row(2), color, {} }; } return instanceData; }