/*! \internal */ void CapsuleMesh::createGeometry(bool bForce) { // Create a new geometry node for this level of detail if necessary. QGLSceneNode *geometry = 0; QMap<int, QGLSceneNode *>::iterator It = d->lodGeometry.find(d->lod); if (It != d->lodGeometry.end()) geometry = *It; if (geometry && bForce) { if (d->currentCapsule) d->topNode->removeNode(d->currentCapsule); d->currentCapsule = 0; d->lodGeometry.erase(It); geometry->setParent(0); delete geometry; geometry = 0; } if (!geometry) { QGLBuilder builder; // For the cylinder int facets = 4 * (1 << d->lod); int layers = (1 << d->lod) - 1; // For the spheres int divisions = d->lod; // Sanity check - the height of the capsule must not be less than its // diameter. A minimal capsule is a sphere - where diameter == height. if (d->length < 2.0f * d->radius) { qWarning() << "Length of capsule must exceed its diameter" << " - correcting length."; d->length = 2.0f * d->radius; } float diameter = d->radius+d->radius; float cylinderHeight = d->length - diameter; float offset = cylinderHeight/2.0f; builder << QGL::Faceted; QGLSceneNode *s = 0; s = builder.newNode(); s->setObjectName(QLatin1String("Cylinder")); builder << QGLCylinder(diameter, diameter, cylinderHeight, facets, layers, false, false); s = builder.newNode(); s->setObjectName(QLatin1String("LeftEndCap")); builder << QGLDome(diameter, divisions, false); QMatrix4x4 translateMatrix; translateMatrix.setToIdentity(); translateMatrix.rotate(180.0f, 0.0f, 1.0f, 0.0f); translateMatrix.translate(0.0f, 0.0f, offset); builder.currentNode()->setLocalTransform(translateMatrix); s = builder.newNode(); s->setObjectName(QLatin1String("RightEndCap")); builder << QGLDome(diameter, divisions, false); translateMatrix.setToIdentity(); translateMatrix.translate(0.0f, 0.0f, offset); builder.currentNode()->setLocalTransform(translateMatrix); geometry = builder.finalizedSceneNode(); geometry->setParent(this); d->lodGeometry.insert(d->lod, geometry); } Q_ASSERT_X(geometry != 0, Q_FUNC_INFO, "Could not create/find geometry!"); if (d->currentCapsule != geometry) { if (d->currentCapsule) d->topNode->removeNode(d->currentCapsule); d->topNode->addNode(geometry); d->currentCapsule = geometry; } if (!d->sceneSet) { setScene(new CapsuleScene(d->topNode)); d->sceneSet = true; } }