CompositeAnimation::~CompositeAnimation() { // Toss the refs to all animations, but make sure we remove them from // any waiting lists first. clearRenderer(); m_transitions.clear(); m_keyframeAnimations.clear(); }
void LabelPainter::clear( void ) { _labels.clear(); clearRenderer(); }
void LabelPainter::changeLabels(glm::mat4 MVP) { clearRenderer(); mouseHandler::clearLabel(); if (_labels.size() > 0) { sortLabels(&_labels); vector<Label> viewLabels; int windowW,windowH; context::getWindowSize(&windowW, &windowH); int i = 0; glm::mat4 T = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, 0.0f)); glm::mat4 S = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f, 0.5f, 1.0f)); glm::mat4 MVP2 = S * T * MVP; // transforms world to 0..1-0..1 coordinates vector<int> x_topX; vector<int> y_topX; //select view labels while (i < _labels.size()) { glm::vec4 labelPos(_labels[i].x, _labels[i].y, 0.0f, 1.0f); labelPos = MVP2 * labelPos; if (labelPos.x >= 0.0f && labelPos.x <= 1.0f && labelPos.y >= 0.0f && labelPos.y <= 1.0f) { //inside viewLabels.push_back(_labels[i]); x_topX.push_back(labelPos.x * (float)windowW); y_topX.push_back(labelPos.y * (float)windowH); } i++; } if (viewLabels.size() > 0) { float maxW = viewLabels.front().weight; float minW = viewLabels.back().weight; float div = maxW - minW; vector<int> topX2RenderIndex; //add them to the correct renderer for (int i = 0; i < viewLabels.size(); i++) { float normedVal; if (div != 0) { normedVal = (viewLabels[i].weight - minW) / div; } else { normedVal = 0.5f; } ScaleOptions* so = &context::_scaleOptions[2]; float pointsX[4] = {so->_controlPoints[0][0], so->_controlPoints[1][0], so->_controlPoints[2][0], so->_controlPoints[3][0]}; float pointsY[4] = {so->_controlPoints[0][1], so->_controlPoints[1][1], so->_controlPoints[2][1], so->_controlPoints[3][1]}; float scaled = scale(normedVal, so->_linearMode, so->_exponent, pointsX, pointsY); int index = min(4, (int)floor(scaled * 5.0f)); _renderer[index]->addText(viewLabels[i].text, normedVal); topX2RenderIndex.push_back(index); } //calculate new positions vector<labelOrderCom::MovedBox>* newPos = NULL; if (ORDER_LABELS) { labelOrderCom::prepare(); int off[5] = {0,0,0,0,0}; for (int i = 0; i < viewLabels.size(); i++) { int rI = topX2RenderIndex[i]; PreparedText* label = _renderer[rI]->getTexts()->at(off[rI]); labelOrderCom::add(x_topX[i], y_topX[i], label->_textPixWidth, label->_textPixHeight); off[rI]++; } newPos = labelOrderCom::transmit(); for (int i = 0; i < newPos->size(); i++) { x_topX[newPos->at(i).id] = newPos->at(i).x; y_topX[newPos->at(i).id] = newPos->at(i).y; } } //set new positions int off[5] = {0,0,0,0,0}; for (int i = 0; i < viewLabels.size(); i++) { int rI = topX2RenderIndex[i]; float x = (float)x_topX[i] / (float)windowW; float y = (float)y_topX[i] / (float)windowH; _renderer[rI]->setCenter(off[rI], x, y); float w = _renderer[rI]->getTexts()->at(off[rI])->_textPixWidth; float h = _renderer[rI]->getTexts()->at(off[rI])->_textPixHeight; //update click listener float left = x - ((float) w / (float) windowW) / 2.0f; float right = x + ((float) w / (float) windowW) / 2.0f; float bottom = y - ((float) h / (float) windowH) / 2.0f; float up = y + ((float) h / (float) windowH) / 2.0f; mouseHandler::registerLabel(bottom, left, up, right, viewLabels[i].id); off[rI]++; } delete newPos; } } }
void Graph::clearRenderers() { while(centralWidget->count()) clearRenderer(centralWidget->count()-1); }