//------------------------------------------------------------------------------ // rgb2hsv() -- converts a Red, Gree, Blue (RGB) color value to an // Hue, Saturation, Value (HSV) value. // // This code is based on '/usr/people/4Dgifts/iristools/libgutil/colormod.c' //------------------------------------------------------------------------------ void Hsv::rgb2hsv(osg::Vec3& hsv, const osg::Vec3& rgb) { LCreal cmax = lcMax( rgb[RED], lcMax(rgb[GREEN],rgb[BLUE]) ); LCreal cmin = lcMin( rgb[RED], lcMin(rgb[GREEN],rgb[BLUE]) ); LCreal cdelta = cmax - cmin; LCreal h = 0; LCreal s = 0; if ( cmax != 0.0 ) s = cdelta / cmax; if ( s != 0.0 ) { LCreal rc = (cmax - rgb[RED]) / cdelta; LCreal gc = (cmax - rgb[GREEN]) / cdelta; LCreal bc = (cmax - rgb[BLUE]) / cdelta; if ( rgb[RED] == cmax ) h = bc - gc; else if ( rgb[GREEN] == cmax ) h = 2.0f + rc - bc; else if ( rgb[BLUE] == cmax ) h = 4.0f + gc - rc; h *= 60.0f; if ( h < 0.0 ) h += 360.0f; } hsv[HUE] = h; hsv[VALUE] = cmax; hsv[SATURATION] = s; }
void lcTimelineWidget::ItemSelectionChanged() { lcArray<lcObject*> Selection; lcStep LastStep = 1; foreach (QTreeWidgetItem* PieceItem, selectedItems()) { lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); LastStep = lcMax(LastStep, Piece->GetStepShow()); Selection.Add(Piece); }
void lcTimelineWidget::Update(bool Clear, bool UpdateItems) { if (mIgnoreUpdates) return; lcModel* Model = lcGetActiveModel(); if (!Model) { mItems.clear(); clear(); return; } bool Blocked = blockSignals(true); if (Clear) { mItems.clear(); clear(); } lcStep LastStep = lcMax(Model->GetLastStep(), Model->GetCurrentStep()); for (int TopLevelItemIdx = LastStep; TopLevelItemIdx < topLevelItemCount(); ) { QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx); while (StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(0); lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); mItems.remove(Piece); delete PieceItem; } delete StepItem; } for (unsigned int TopLevelItemIdx = topLevelItemCount(); TopLevelItemIdx < LastStep; TopLevelItemIdx++) { QTreeWidgetItem* StepItem = new QTreeWidgetItem(this, QStringList(tr("Step %1").arg(TopLevelItemIdx + 1))); StepItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); addTopLevelItem(StepItem); StepItem->setExpanded(true); } const lcArray<lcPiece*>& Pieces = Model->GetPieces(); QTreeWidgetItem* StepItem = NULL; int PieceItemIndex = 0; lcStep Step = 0; for (int PieceIdx = 0; PieceIdx != Pieces.GetSize(); PieceIdx++) { lcPiece* Piece = Pieces[PieceIdx]; while (Step != Piece->GetStepShow()) { if (StepItem) { while (PieceItemIndex < StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex); lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); if (Pieces.FindIndex(RemovePiece) == -1) { mItems.remove(RemovePiece); delete PieceItem; } else { PieceItem->parent()->removeChild(PieceItem); topLevelItem(RemovePiece->GetStepShow() - 1)->addChild(PieceItem); } } } Step++; StepItem = topLevelItem(Step - 1); PieceItemIndex = 0; } QTreeWidgetItem* PieceItem = mItems.value(Piece); bool UpdateItem = UpdateItems; if (!PieceItem) { PieceItem = new QTreeWidgetItem(); PieceItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); PieceItem->setData(0, Qt::UserRole, qVariantFromValue<uintptr_t>((uintptr_t)Piece)); StepItem->insertChild(PieceItemIndex, PieceItem); mItems[Piece] = PieceItem; UpdateItem = true; } else { if (PieceItemIndex >= StepItem->childCount() || PieceItem != StepItem->child(PieceItemIndex)) { QTreeWidgetItem* PieceParent = PieceItem->parent(); if (PieceParent) PieceParent->removeChild(PieceItem); StepItem->insertChild(PieceItemIndex, PieceItem); } } if (UpdateItem) { PieceItem->setText(0, Piece->mPieceInfo->m_strDescription); int ColorIndex = Piece->mColorIndex; if (!mIcons.contains(ColorIndex)) { int Size = rowHeight(indexFromItem(PieceItem)); QImage Image(Size, Size, QImage::Format_ARGB32); Image.fill(QColor::fromRgbF(1.0, 1.0, 1.0, 0.0)); float* Color = gColorList[ColorIndex].Value; QPainter Painter(&Image); Painter.setPen(Qt::NoPen); Painter.setBrush(QColor::fromRgbF(Color[0], Color[1], Color[2])); Painter.drawEllipse(QPoint(Size / 2, Size / 2), Size / 2, Size / 2); mIcons[ColorIndex] = QIcon(QPixmap::fromImage(Image)); } PieceItem->setIcon(0, mIcons[ColorIndex]); QColor Color = palette().text().color(); if (Piece->IsHidden()) Color.setAlpha(128); PieceItem->setTextColor(0, Color); } PieceItem->setSelected(Piece->IsSelected()); PieceItemIndex++; } if (Step == 0) { Step = 1; StepItem = topLevelItem(0); } while (Step <= LastStep) { while (PieceItemIndex < StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex); lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); mItems.remove(RemovePiece); delete PieceItem; } Step++; StepItem = topLevelItem(Step - 1); PieceItemIndex = 0; } blockSignals(Blocked); }