Skip to content
OE_display.cpp 32.9 KiB
Newer Older
				curcolor = color->getThreadColor();
raoul's avatar
raoul committed
				{
raoul's avatar
raoul committed
				}
raoul's avatar
raoul committed
				{
					(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();
raoul's avatar
raoul committed
				(curcolor*OE_color(1, 1, 1, style->instLineBeforeCurrentColor.a)).gl();
			}
		}

		for (; pt < document->instPoints.size(); pt++)
raoul's avatar
raoul committed
			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);
	style->instStartPointColor.gl();
	glPointSize(style->instStartPointSize);
raoul's avatar
raoul committed
		glVertex2f(document->instPoints.at(0).x/scaleRatio, document->instPoints.at(0).y/scaleRatio);
	if (document->curPoint < document->instPoints.size())
	{
		style->instCurPointColor.gl();
		glPointSize(style->instCurPointSize);
raoul's avatar
raoul committed
			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)
raoul's avatar
raoul committed
	{
raoul's avatar
raoul committed
	}
	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
raoul's avatar
raoul committed
			glVertex2f(zero.x-hoopSize.x, zero.y-hoopSize.y);
			glVertex2f(zero.x-hoopSize.x, zero.y+hoopSize.y);
raoul's avatar
raoul committed
			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);
raoul's avatar
raoul committed
			(style->gridColor * OE_color(1, 1, 1, maxf(0.0f, 0.2f-zoom*2))).gl();
raoul's avatar
raoul committed
			int offset = (int)-hoopSize.x;
			while (offset<hoopSize.x)
raoul's avatar
raoul committed
					glVertex2f(zero.x+offset, zero.y-hoopSize.y);
					glVertex2f(zero.x+offset, zero.y+hoopSize.y);
raoul's avatar
raoul committed
			offset = (int)-hoopSize.y;
			while (offset<hoopSize.y)
raoul's avatar
raoul committed
					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);
raoul's avatar
raoul committed
			offset = (int)-hoopSize.x+(int)hoopSize.x%10;
			while (offset<hoopSize.x)
raoul's avatar
raoul committed
				glVertex2f(zero.x+offset, zero.y-hoopSize.y);
				glVertex2f(zero.x+offset, zero.y+hoopSize.y);
raoul's avatar
raoul committed
			offset = (int)-hoopSize.y+(int)hoopSize.y%10;
			while (offset<hoopSize.y)
raoul's avatar
raoul committed
					glVertex2f(zero.x-hoopSize.x, zero.y+offset);
					glVertex2f(zero.x+hoopSize.x, zero.y+offset);
		float zeroSize = style->zeroSize;
raoul's avatar
raoul committed
			glVertex2f(zero.x-zeroSize, zero.y);
			glVertex2f(zero.x, zero.y+zeroSize);
raoul's avatar
raoul committed
			glVertex2f(zero.x+zeroSize, zero.y);
			glVertex2f(zero.x, zero.y-zeroSize);
raoul's avatar
raoul committed
			glVertex2f(zero.x-zeroSize, zero.y);
raoul's avatar
raoul committed
			glVertex2f(zero.x-zeroSize, zero.y);
			glVertex2f(zero.x+zeroSize, zero.y);
raoul's avatar
raoul committed
			glVertex2f(zero.x, zero.y-zeroSize);
			glVertex2f(zero.x, zero.y+zeroSize);
raoul's avatar
raoul committed
	{
		refreshAll();
	}*/
raoul's avatar
raoul committed
	if (style->drawCurves)
	{
		std::list<OE_pointcurve*>::iterator curve = document->curves.begin();
		while (curve != document->curves.end())
		{
raoul's avatar
raoul committed
			drawCurve(*curve);
			curve++;
		}

		curve = document->selectedCurves.begin();
		while (curve != document->selectedCurves.end())
		{
raoul's avatar
raoul committed
			drawCurveControl(*curve);
			selectionBounds += (*curve)->getBound();
			curve++;
		}
	}

raoul's avatar
raoul committed
	if (style->drawStitches)
	{
		std::list<OE_stitchs*>::iterator stitch = document->stitchs.begin();
		int curpoint = document->curPoint;
		while (stitch != document->stitchs.end())
		{
raoul's avatar
raoul committed
			drawStitch(*stitch, curpoint);
			curpoint -= (*stitch)->getPoints().size();
			stitch++;
		}

		stitch = document->selectedStitchs.begin();
		while (stitch != document->selectedStitchs.end())
		{
raoul's avatar
raoul committed
			drawStitchControl(*stitch);
			selectionBounds += (*stitch)->getBound();
			stitch++;
		}
	}
raoul's avatar
raoul committed
	if (style->drawCommands)
	{
raoul's avatar
raoul committed
	}
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;

	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);
raoul's avatar
raoul committed
		glVertex2f(zero.x, zero.y);
	glEnd();
	glPopName();
*/

	glPushName(1); //id of the move tool
	drawSelectionTools(true);
	glPopName();

raoul's avatar
raoul committed
	if (style->selectStitches)
	{
		glLoadName(1); //id of the stitches

		index = 0;
		glPushName(index); //init the stitches index

		stitch = selectedStitches.begin();
		while (stitch != selectedStitches.end())
		{
raoul's avatar
raoul committed
			drawStitchControl(*stitch, true);
raoul's avatar
raoul committed
	if (style->selectCurves)
	{
		glLoadName(2); //id of the curves
		index = 0;
		glPushName(index); //init the curves index

		curve = selectedCurves.begin();
		while (curve != selectedCurves.end())
		{
raoul's avatar
raoul committed
			drawCurveControl(*curve, true);
raoul's avatar
raoul committed
	if (style->selectStitches)
	{
		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())
		{
raoul's avatar
raoul committed
			drawStitch(*stitch, curpoint);
			curpoint -= (*stitch)->getPoints().size();
			stitch++;
			index++;
			glLoadName(index);
		}
		glPopName();
	}

raoul's avatar
raoul committed
	if (style->selectCurves)
	{
		glLoadName(2); //id of the curves
		index = 0;
		glPushName(index); //init the curves index

		curve = document->curves.begin();
		while (curve != document->curves.end())
		{
raoul's avatar
raoul committed
			drawCurve(*curve);
/** \brief move and zoom to see the entire document
 */
void OE_display::showAll()
{
	if (document)
raoul's avatar
raoul committed
		float xMin, yMin, xMax, yMax;
		BoundingBox bound = document->getBound();
		viewPos.x = (bound.getMax().x + bound.getMin().x)/2;
		viewPos.y = (bound.getMax().y + bound.getMin().y)/2;
raoul's avatar
raoul committed

		zoom = maxf((bound.getMax().x - bound.getMin().x)/width/1.5, (bound.getMax().y - bound.getMin().y)/height/1.5);
void OE_display::zoomSelection()
raoul's avatar
raoul committed
		float xMin, yMin, xMax, yMax;
		BoundingBox bound = controller->getSelectionBoundingBox();
		viewPos.x = (bound.getMax().x + bound.getMin().x)/2;
		viewPos.y = (bound.getMax().y + bound.getMin().y)/2;

raoul's avatar
raoul committed
		zoom = maxf((bound.getMax().x - bound.getMin().x)/width/1.5, (bound.getMax().y - bound.getMin().y)/height/1.5);
void OE_display::mouse_Pos(double x, double y)
{
raoul's avatar
raoul committed
	if (pan)
	{
		viewPos = viewPos + (mouse-vector_2d(x, y))*zoom*2;
raoul's avatar
raoul committed
	}
raoul's avatar
raoul committed
	mouse.x = x;
	mouse.y = y;
raoul's avatar
raoul committed
	absMouse = viewPos+(mouse-vector_2d(width, height)/2)*zoom*2;
raoul's avatar
raoul committed

void OE_display::mouse_Button(int button, int action, int mods)
{
	if (button == GLFW_MOUSE_BUTTON_MIDDLE)
raoul's avatar
raoul committed
	{
		pan = action == GLFW_PRESS;
	}
void OE_display::scroll(double xoffset, double yoffset)
{
raoul's avatar
raoul committed
	if (!pan)
	{
		if (yoffset>0)
		{
			zoom = zoom/1.1;
		}
		else
		{
			zoom = zoom*1.1;
		}
void OE_display::resize(int width, int height)
{
	this->width = width;
	this->height = height;
}

raoul's avatar
raoul committed
void OE_display::key(int key, int scancode, int action, int mods)
{
}

vector_2d OE_display::screenToDocument(vector_2d pos)
{
raoul's avatar
raoul committed
	return viewPos+(pos-vector_2d(width, height)/2)*zoom*2;