Newer
Older
std::list<vector_2d>::iterator stepPt = linkstitch->stepPts.begin();
while (stepPt != linkstitch->stepPts.end())
{
p = (*stepPt + prevVert)/2;
glVertex2f(p.x-uiSize, p.y);
glVertex2f(p.x+uiSize, p.y);
glVertex2f(p.x, p.y+uiSize);
glVertex2f(p.x, p.y-uiSize);
prevVert = *stepPt;
stepPt++;
}
p = (points.at(points.size()-1) + prevVert)/2;
glVertex2f(p.x-uiSize, p.y);
glVertex2f(p.x+uiSize, p.y);
glVertex2f(p.x, p.y+uiSize);
glVertex2f(p.x, p.y-uiSize);
glEnd();
}
return true;
}
}
/** \brief draw the instruction points
*
* \return true if all is ok
*
*/
bool OE_display::drawCommands()
{
float scaleRatio = document->getPulseByMm();
if (document->instPoints.size() == 0)
return false;
unsigned i;
// Points
glPointSize(style->instPointSize);
glBegin(GL_POINTS);
style->instLineBeforeCurrentColor.gl();
for (i = 1; i < document->curPoint; i++)
{
glVertex2f(document->instPoints.at(i).x/scaleRatio, document->instPoints.at(i).y/scaleRatio);
style->instLineAfterCurrentColor.gl();
for (i = document->curPoint; i < document->instPoints.size(); i++)
{
glVertex2f(document->instPoints.at(i).x/scaleRatio, document->instPoints.at(i).y/scaleRatio);
}
glEnd();
//draw lines
unsigned pt = 0;
glLineWidth(style->instLineWidth);
glBegin(GL_LINE_STRIP);
for (; pt < document->instCommand.at(i)->getIdPoint(); pt++)
if (pt == document->curPoint)
{
(curcolor*OE_color(1, 1, 1, style->instLineBeforeCurrentColor.a)).gl();
}
glVertex2f(document->instPoints.at(pt).x/scaleRatio, document->instPoints.at(pt).y/scaleRatio);
OE_waitcolor* color = dynamic_cast<OE_waitcolor*> (document->instCommand.at(i));
if (color)
{
curcolor = color->getThreadColor();
if (pt > document->curPoint)
curcolor.gl();
{
(curcolor*OE_color(1, 1, 1, style->instLineBeforeCurrentColor.a)).gl();
}
}
OE_start* start = dynamic_cast<OE_start*> (document->instCommand.at(i));
if (start)
{
curcolor = start->getThreadColor();
(curcolor*OE_color(1, 1, 1, style->instLineBeforeCurrentColor.a)).gl();
}
}
for (; pt < document->instPoints.size(); pt++)
if (pt == document->curPoint)
{
(curcolor*OE_color(1, 1, 1, style->instLineBeforeCurrentColor.a)).gl();
}
glVertex2f(document->instPoints.at(pt).x/scaleRatio, document->instPoints.at(pt).y/scaleRatio);
glEnd();
// start point
style->instStartPointColor.gl();
glPointSize(style->instStartPointSize);
glBegin(GL_POINTS);
glVertex2f(document->instPoints.at(0).x/scaleRatio, document->instPoints.at(0).y/scaleRatio);
glEnd();
// current point
if (document->curPoint < document->instPoints.size())
{
style->instCurPointColor.gl();
glPointSize(style->instCurPointSize);
glBegin(GL_POINTS);
glVertex2f(document->instPoints.at(document->curPoint).x/scaleRatio, document->instPoints.at(document->curPoint).y/scaleRatio);
glEnd();
}
return true;
}
/** \brief draw the document on screen
*
* \return true if all is ok
*
*/
bool OE_display::draw()
{
if (!document)
return false;
float wzoom, hzoom;
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
glViewport(0, 0, width, height);
glClearColor(style->backgroundColor.r, style->backgroundColor.g, style->backgroundColor.b, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glEnd();
wzoom = (float)width*zoom;
hzoom = (float)height*zoom;
glOrtho(viewPos.x-wzoom, viewPos.x+wzoom, viewPos.y+hzoom, viewPos.y-hzoom, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glColor4ub(255,255,255,255);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
vector_2d hoopSize = document->getHoopSize()/2;
vector_2d zero = document->getZeroPoint();
//draw hoop
if (style->drawHoop)
{
glLineWidth(3);
glBegin(GL_LINE_STRIP);
style->hoopColor.gl();
glVertex2f(zero.x-hoopSize.x, zero.y-hoopSize.y);
glVertex2f(zero.x-hoopSize.x, zero.y+hoopSize.y);
glVertex2f(zero.x+hoopSize.x, zero.y+hoopSize.y);
glVertex2f(zero.x+hoopSize.x, zero.y-hoopSize.y);
glVertex2f(zero.x-hoopSize.x, zero.y-hoopSize.y);
glEnd();
}
//draw grid
if (style->drawGrid)
{
glLineWidth(1.5);
glBegin(GL_LINES);
(style->gridColor * OE_color(1, 1, 1, maxf(0.0f, 0.2f-zoom*2))).gl();
int offset = (int)-hoopSize.x;
while (offset<hoopSize.x)
glVertex2f(zero.x+offset, zero.y-hoopSize.y);
glVertex2f(zero.x+offset, zero.y+hoopSize.y);
offset += 1;
}
glVertex2f(zero.x-hoopSize.x, zero.y+offset);
glVertex2f(zero.x+hoopSize.x, zero.y+offset);
offset += 1;
}
//glColor4d(0.0f, 0.0f, 0.0f, 0.1f);
style->gridColor.gl();
offset = (int)-hoopSize.x+(int)hoopSize.x%10;
while (offset<hoopSize.x)
glVertex2f(zero.x+offset, zero.y-hoopSize.y);
glVertex2f(zero.x+offset, zero.y+hoopSize.y);
offset += 10;
}
offset = (int)-hoopSize.y+(int)hoopSize.y%10;
while (offset<hoopSize.y)
glVertex2f(zero.x-hoopSize.x, zero.y+offset);
glVertex2f(zero.x+hoopSize.x, zero.y+offset);
offset += 10;
}
glEnd();
}
//draw 0
if (style->drawZero)
float zeroSize = style->zeroSize;
glLineWidth(1.5);
glBegin(GL_LINE_STRIP);
style->zeroColor.gl();
glVertex2f(zero.x-zeroSize, zero.y);
glVertex2f(zero.x, zero.y+zeroSize);
glVertex2f(zero.x+zeroSize, zero.y);
glVertex2f(zero.x, zero.y-zeroSize);
glEnd();
glBegin(GL_LINES);
style->zeroColor.gl();
glVertex2f(zero.x-zeroSize, zero.y);
glVertex2f(zero.x+zeroSize, zero.y);
glVertex2f(zero.x, zero.y-zeroSize);
glVertex2f(zero.x, zero.y+zeroSize);
glEnd();
}
refreshAll();
document->lock();
/*if (changeDpi)
selectionBounds.init = false;
{
std::list<OE_pointcurve*>::iterator curve = document->curves.begin();
while (curve != document->curves.end())
{
curve++;
}
curve = document->selectedCurves.begin();
while (curve != document->selectedCurves.end())
{
selectionBounds += (*curve)->getBound();
curve++;
}
}
{
std::list<OE_stitchs*>::iterator stitch = document->stitchs.begin();
int curpoint = document->curPoint;
while (stitch != document->stitchs.end())
{
curpoint -= (*stitch)->getPoints().size();
stitch++;
}
stitch = document->selectedStitchs.begin();
while (stitch != document->selectedStitchs.end())
{
selectionBounds += (*stitch)->getBound();
stitch++;
}
}
drawCommands();
document->unlock();
drawSelectionTools();
return true;
}
bool OE_display::pick(std::list<OE_pointcurve*> selectedCurves, std::list<OE_stitchs*> selectedStitches)
{
std::list<OE_pointcurve*>::iterator curve;
std::list<OE_stitchs*>::iterator stitch;
int index;
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
glViewport(0, 0, width, height);
glClearColor(0.85f, 0.85f, 0.85f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glEnd();
glOrtho(absMouse.x-7*zoom, absMouse.x+7*zoom, absMouse.y+7*zoom, absMouse.y-7*zoom, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glColor4ub(255,255,255,255);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glRenderMode(GL_SELECT);
//Init of name stack
glInitNames();
glPushName(0); //id of the tools
/* glPushName(0); //id of the zero tool
//draw 0
vector_2d zero = document->getZeroPoint();
glPointSize(6);
glBegin(GL_POINT);
glEnd();
glPopName();
*/
glPushName(1); //id of the move tool
drawSelectionTools(true);
glPopName();
//if (changeDpi)
refreshAll();
// if sitches are selectables draw their controls
{
glLoadName(1); //id of the stitches
index = 0;
glPushName(index); //init the stitches index
stitch = selectedStitches.begin();
while (stitch != selectedStitches.end())
{
stitch++;
index++;
glLoadName(index);
}
glPopName();
}
// if curves are selectables draw their controls
{
glLoadName(2); //id of the curves
index = 0;
glPushName(index); //init the curves index
curve = selectedCurves.begin();
while (curve != selectedCurves.end())
{
curve++;
index++;
glLoadName(index);
}
glPopName();
}
// if sitches are selectables draw the stitch
{
glLoadName(1); //id of the stitches
index = 0;
glPushName(index); //init the stitches index
int curpoint = document->curPoint;
stitch = document->stitchs.begin();
while (stitch != document->stitchs.end())
{
curpoint -= (*stitch)->getPoints().size();
stitch++;
index++;
glLoadName(index);
}
glPopName();
}
// if curves are selectables draw them
{
glLoadName(2); //id of the curves
index = 0;
glPushName(index); //init the curves index
curve = document->curves.begin();
while (curve != document->curves.end())
{
curve++;
index++;
glLoadName(index);
}
glPopName();
}
}
/** \brief move and zoom to see the entire document
*/
void OE_display::showAll()
{
if (document)
BoundingBox bound = document->getBound();
viewPos.x = (bound.getMax().x + bound.getMin().x)/2;
viewPos.y = (bound.getMax().y + bound.getMin().y)/2;
zoom = maxf((bound.getMax().x - bound.getMin().x)/width/1.5, (bound.getMax().y - bound.getMin().y)/height/1.5);
changeDpi = true;
void OE_display::zoomSelection()
3dsman
committed
{
if (document&&controller)
{
3dsman
committed
BoundingBox bound = controller->getSelectionBoundingBox();
viewPos.x = (bound.getMax().x + bound.getMin().x)/2;
viewPos.y = (bound.getMax().y + bound.getMin().y)/2;
zoom = maxf((bound.getMax().x - bound.getMin().x)/width/1.5, (bound.getMax().y - bound.getMin().y)/height/1.5);
changeDpi = true;
3dsman
committed
}
}
viewPos = viewPos + (mouse-vector_2d(x, y))*zoom*2;
absMouse = viewPos+(mouse-vector_2d(width, height)/2)*zoom*2;
bool redraw = false;
if (event->button() == Qt::MiddleButton)
pan = event->type() == QEvent::MouseButtonPress;
if (pan)
redraw = true;
void OE_display::scroll(double xoffset, double yoffset)
{
if (!pan)
{
if (yoffset>0)
{
zoom = zoom/1.1;
}
else
{
zoom = zoom*1.1;
}
changeDpi = true;
}
void OE_display::resize(int width, int height)
{
this->width = width;
this->height = height;
}
void OE_display::keyPressEvent(QKeyEvent* event)
{
if (event->isAutoRepeat()) // does not seems to work in my VM...
return;
key(event);
}
void OE_display::keyReleaseEvent(QKeyEvent* event)
{
key(event);
}
void OE_display::key(QKeyEvent *event)
//DEBUG printf("%s \"%s\"\n", event->type()==QEvent::KeyPress?"Keypress":"Keyrelease", event->text().toStdString().c_str(), event->count()); fflush(stdout);
update(); // TODO only when necessary
vector_2d OE_display::screenToDocument(vector_2d pos)
{