mirror of https://github.com/CGAL/cgal
116 lines
3.8 KiB
C++
116 lines
3.8 KiB
C++
#include <CGAL/Three/TextRenderer.h>
|
|
#include <CGAL/Three/Scene_item.h>
|
|
#include <CGAL/Three/Scene_print_item_interface.h>
|
|
void TextRenderer::draw(CGAL::Three::Viewer_interface *viewer, const QVector3D& scaler)
|
|
{
|
|
QPainter *painter = viewer->getPainter();
|
|
if (!painter->isActive())
|
|
painter->begin(viewer);
|
|
QRect rect;
|
|
CGAL::qglviewer::Camera* camera = viewer->camera();
|
|
//Display the items textItems
|
|
for(TextListItem* list : textItems)
|
|
{
|
|
CGAL::Three::Scene_print_item_interface* item =
|
|
qobject_cast<CGAL::Three::Scene_print_item_interface*>(scene->item(scene->mainSelectionIndex()));
|
|
if( item &&
|
|
item->shouldDisplayIds(list->item())
|
|
){
|
|
for(TextItem* item : list->textList())
|
|
{
|
|
CGAL::qglviewer::Vec src(item->position().x(), item->position().y(),item->position().z());
|
|
if(viewer->testDisplayId(src.x, src.y, src.z))
|
|
{
|
|
if(item->is_3D())
|
|
{
|
|
src.x *= scaler.x();
|
|
src.y *= scaler.y();
|
|
src.z *= scaler.z();
|
|
rect = QRect(int(camera->projectedCoordinatesOf(src).x -item->width()/2),
|
|
int(camera->projectedCoordinatesOf(src).y -item->height()/2),
|
|
int(item->width()),
|
|
int(item->height()));
|
|
}
|
|
else
|
|
rect = QRect(int(src.x-item->width()/2),
|
|
int(src.y-item->height()/2),
|
|
int(item->width()),
|
|
int(item->height()));
|
|
|
|
painter->setFont(item->font());
|
|
QColor c = item->color().toHsv();
|
|
c.setHsv((c.hsvHue()+180)%360, 255,255,100);
|
|
painter->setBrush(QBrush(c));
|
|
painter->setPen(QPen(QColor(0,0,0,0)));
|
|
painter->drawRect(rect);
|
|
painter->setPen(QPen(item->color()));
|
|
painter->drawText(rect, item->text());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Display the local TextItems
|
|
for(TextItem* item : local_textItems)
|
|
{
|
|
CGAL::qglviewer::Vec src(item->position().x(), item->position().y(),item->position().z());
|
|
if(item->is_3D())
|
|
{
|
|
if(item->is_always_visible() || viewer->testDisplayId(src.x, src.y, src.z))
|
|
{
|
|
rect = QRect(int(camera->projectedCoordinatesOf(src).x-item->width()/2),
|
|
int(camera->projectedCoordinatesOf(src).y-item->height()/2),
|
|
int(item->width()),
|
|
int(item->height()));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rect = QRect(int(src.x-item->width()/2),
|
|
int(src.y-item->height()/2),
|
|
int(item->width()),
|
|
int(item->height()));
|
|
}
|
|
painter->setFont(item->font());
|
|
QColor c = item->color().toHsv();
|
|
c.setHsv((c.hsvHue()+180)%360, 255,255,100);
|
|
painter->setBrush(QBrush(c));
|
|
painter->setPen(QPen(QColor(0,0,0,0)));
|
|
painter->drawRect(rect);
|
|
painter->setPen(QPen(item->color()));
|
|
painter->drawText(rect, item->text());
|
|
}
|
|
}
|
|
|
|
void TextRenderer::addTextList(TextListItem *tl)
|
|
{
|
|
if(tl->textList().size() > max_textItems)
|
|
{
|
|
Q_EMIT sendMessage("There are too many textItems to display.",5000);
|
|
return;
|
|
}
|
|
textItems.append(tl);
|
|
}
|
|
|
|
void TextRenderer::addText(TextItem *ti)
|
|
{
|
|
local_textItems.append(ti);
|
|
}
|
|
|
|
void TextRenderer::addText(float p_x, float p_y, float p_z, QString p_text, bool p_3D, QFont p_font , QColor p_color )
|
|
{
|
|
local_textItems.append(new TextItem(p_x, p_y, p_z, p_text, p_3D, p_font, p_color));
|
|
}
|
|
|
|
void TextRenderer::removeText(TextItem *item)
|
|
{
|
|
local_textItems.removeAll(item);
|
|
}
|
|
|
|
void TextRenderer::removeTextList(TextListItem *p_list)
|
|
{
|
|
for(TextListItem *list : textItems)
|
|
if(list == p_list)
|
|
textItems.removeAll(list);
|
|
}
|