Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
*/
#include "OE_interfaceDisplay.h"
#include "OE_utils.h"
#include "OE_controller.h"
#include <iostream>
#include <GL/gl.h>
#include <cstdlib>
#include <math.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
OE_interfaceDisplay::OE_interfaceDisplay()
{
editDisplay = new OE_editDisplay();
commandDisplay = new OE_commandDisplay();
curDisplay = editDisplay;
}
OE_interfaceDisplay::OE_interfaceDisplay(OE_document document)
{
editDisplay = new OE_editDisplay();
editDisplay->setDocument(&document);
commandDisplay = new OE_commandDisplay();
commandDisplay->setDocument(&document);
curDisplay = editDisplay;
}
OE_interfaceDisplay::~OE_interfaceDisplay()
{
delete editDisplay;
delete commandDisplay;
}
bool OE_interfaceDisplay::setDocument(OE_document * document)
{
this->document = document;
if(document)
{
editDisplay->setDocument(document);
commandDisplay->setDocument(document);
}
return true;
}
bool OE_interfaceDisplay::setController(OE_controller* controller)
{
this->controller = controller;
if(controller)
{
if (editDisplay) editDisplay->setController(controller);
if (commandDisplay) commandDisplay->setController(controller);
}
return true;
}
void OE_interfaceDisplay::showAll()
{
if (curDisplay) curDisplay->showAll();
}
void OE_interfaceDisplay::mouse_Pos(double x, double y)
{
if (curDisplay) curDisplay->mouse_Pos(x, y);
}
void OE_interfaceDisplay::mouse_Button(int button, int action, int mods)
{
modState = mods;
if (curDisplay) curDisplay->mouse_Button(button, action, mods);
if((curDisplay == editDisplay)&&(button == GLFW_MOUSE_BUTTON_LEFT)&&(action==GLFW_RELEASE))
{
if (!(mods&&GLFW_MOD_SHIFT))
document->selectedCurves.clear();
select();
}
}
void OE_interfaceDisplay::scroll(double xoffset, double yoffset)
{
if (curDisplay) curDisplay->scroll(xoffset, yoffset);
}
void OE_interfaceDisplay::resize(int width, int height)
{
if (curDisplay) curDisplay->resize(width, height);
}
void OE_interfaceDisplay::key(int key, int scancode, int action, int mods)
{
modState = mods;
if((action == GLFW_PRESS)&&(curDisplay == editDisplay))
{
if ((key == GLFW_KEY_Z)&&(mods == GLFW_MOD_CONTROL))
{
if (controller) controller->undoAction();
}
if ((key == GLFW_KEY_Z)&&(mods == GLFW_MOD_CONTROL+GLFW_MOD_SHIFT))
{
if (controller) controller->redoAction();
}
}
if((action == GLFW_RELEASE)&&(key == GLFW_KEY_F5))
{
if(curDisplay == editDisplay)
{
if (controller) controller->generateInstructions();
curDisplay = commandDisplay;
}
else
curDisplay = editDisplay;
}
curDisplay->key( key, scancode, action, mods);
}
/** \brief set selection
*
* \return true if all is ok
*
*/
bool OE_interfaceDisplay::select()
{
GLuint selectBuf[64];
GLint hits;
std::list<OE_curve*> selectedCurves;
std::list<OE_stitchs*> selectedStitches;
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
glSelectBuffer(64, selectBuf);
draw(true);
hits = glRenderMode(GL_RENDER);
GLuint i, nb_names, name, *ptr;
std::cout<<"hits : "<<std::endl;
ptr = (GLuint *) selectBuf;
for (GLuint i = 0; i < hits; i++) { // for each hit
GLuint names = *ptr;
if (names==2) //name count
{
ptr+=3;
if (*ptr == 0) //tools index
{
ptr++;
if(*ptr == 0)
std::cout<<" zero ";
ptr++;
}else if (*ptr == 1) //stitches index
{
ptr++;
std::cout<<" stitch "<<*ptr;ptr++;
if (document->stitchs.size() > *ptr)
{
std::list<OE_stitchs*>::iterator it = document->stitchs.begin();
std::advance(it, *ptr);
selectedStitches.push_back(*it);
}
}else if (*ptr == 2) //curves index
{
ptr++;
std::cout<<" curve "<<*ptr;
if (document->curves.size() > *ptr)
{
std::list<OE_curve*>::iterator it = document->curves.begin();
std::advance(it, *ptr);
selectedCurves.push_back(*it);
}
ptr++;
}else
{
ptr++;
std::cout<<" unrecognized item "<<*ptr;ptr++;
}
std::cout<<std::endl;
}
else
{
std::cout<<" strange hit! probably a bug : "<< names<<std::endl; ptr+=3;
std::cout<<" names are ";
for (GLuint j = 0; j < names; j++) { /* for each name */
std::cout<< *ptr<<" ";
ptr++;
}
std::cout<<std::endl;
}
}
controller->selectCurves(selectedCurves, !(modState&&GLFW_MOD_SHIFT));
controller->selectStitches(selectedStitches, !(modState&&GLFW_MOD_SHIFT));
/** \brief draw the document on screen
*
* \return true if all is ok
*
*/
bool OE_interfaceDisplay::draw()
{
draw(false);
}
/** \brief draw the document on screen
*
* \return true if all is ok
*
*/
bool OE_interfaceDisplay::draw(bool select)
{
if (select)
{
glRenderMode(GL_SELECT);
//Initialisation de la pile des noms
glInitNames();
glPushName(0);
}
float wzoom, hzoom;
glViewport(0, 0, width, height);
glClearColor(220.0f/255.0f, 220.0f/255.0f, 220.0f/255.0f, 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();
wzoom = (float)width*zoom;
hzoom = (float)height*zoom;
float absMousex = cx+(mouseX-width/2)*zoom*2;
float absMousey = cy+(mouseY-height/2)*zoom*2;
if(select)
glOrtho(absMousex-5*zoom, absMousex+5*zoom, absMousey+3*zoom, absMousey-3*zoom, -1, 1);
else
glOrtho(cx-wzoom, cx+wzoom, cy+hzoom, cy-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);
if (document && curDisplay)
{
if(select && (curDisplay == editDisplay))
editDisplay->select();
else
curDisplay->draw();
}
if(!select)
{
glLineWidth(3);
glBegin(GL_LINES);
glColor4d(0.0f, 0.0f, 0.0f, 0.5f);
glVertex2f(absMousex,-10000);
glVertex2f(absMousex,10000);
glVertex2f(-10000,absMousey);
glVertex2f(10000,absMousey);
glEnd();