105void Strip::createStrip(
const vector<StrokeVertex *> &iStrokeVertices)
108 if (iStrokeVertices.size() < 2) {
110 cout <<
"Warning: strip has less than 2 vertices" << endl;
114 _vertices.reserve(2 * iStrokeVertices.size());
124 vector<StrokeVertex *>::const_iterator
v, vend,
v2, vPrev;
126 int orientationErrors = 0;
129 v2 =
v = iStrokeVertices.begin();
135 Vec2r orthDir(-dir[1], dir[0]);
139 Vec2r stripDir(orthDir);
143 if (userDir.
norm() > 1
e-6) {
145 real dp = userDir * orthDir;
147 userDir = userDir * (-1.0f);
160 Vec2r userDir = _stroke->getBeginningOrientation();
161 if (userDir !=
Vec2r(0, 0)) {
163 real o1 = (orthDir * userDir);
164 real o2 = crossP(orthDir, userDir);
165 real orientation = o1 * o2;
166 if (orientation > 0) {
169 _vertex[0] = _vertex[1] + userDir;
172 _vertex[0] = _vertex[1] - userDir;
175 if (orientation < 0) {
178 _vertex[1] = _vertex[0] + userDir;
181 _vertex[1] = _vertex[0] - userDir;
189 for (vend = iStrokeVertices.end(), ++
v, ++
v2;
v2 != vend; vPrev =
v++, ++
v2) {
197 float dirNorm = dir.
norm();
199 Vec2r orthDir(-dir[1], dir[0]);
200 Vec2r stripDir = orthDir;
203 if (userDir.
norm() > 1
e-6) {
205 real dp = userDir * orthDir;
207 userDir = userDir * (-1.0f);
217 Vec2r dirPrev(p - pPrev);
218 float dirPrevNorm = dirPrev.
norm();
220 Vec2r orthDirPrev(-dirPrev[1], dirPrev[0]);
221 Vec2r stripDirPrev = orthDirPrev;
224 if (userDir.
norm() > 1
e-6) {
226 real dp = userDir * orthDir;
228 userDir = userDir * (-1.0f);
230 stripDirPrev = userDir;
243 Vec2r(p + thickness[1] * stripDirPrev),
244 Vec2r(p + thickness[1] * stripDir),
245 Vec2r(p2 + thickness[1] * stripDir),
256 Vec2r(p - thickness[0] * stripDirPrev),
257 Vec2r(p - thickness[0] * stripDir),
258 Vec2r(p2 - thickness[0] * stripDir),
269 stripDir = stripDir + stripDirPrev;
283 _vertices[i - 2]->setPoint2d(p + thickness[1] * stripDir);
286 vec_tmp =
_vertices[i - 1]->point2d() - p;
291 _vertices[i - 1]->setPoint2d(p - thickness[0] * stripDir);
299 orthDir =
Vec2r(-dir[1], dir[0]);
303 Vec2r stripDirLast(orthDir);
307 if (userDir.
norm() > 1
e-6) {
309 real dp = userDir * orthDir;
311 userDir = userDir * (-1.0f);
313 stripDirLast = userDir;
328 userDir = _stroke->getEndingOrientation();
329 if (userDir !=
Vec2r(0, 0)) {
331 real o1 = (orthDir * userDir);
332 real o2 = crossP(orthDir, userDir);
333 real orientation = o1 * o2;
334 if (orientation > 0) {
337 _vertex[n] = _vertex[n - 1] + userDir;
340 _vertex[n] = _vertex[n - 1] - userDir;
343 if (orientation < 0) {
346 _vertex[n - 1] = _vertex[n] + userDir;
349 _vertex[n - 1] = _vertex[n] - userDir;
357 if (iStrokeVertices.size() < 3) {
358 _averageThickness = 0.5 * (thicknessLast[1] + thicknessLast[0] + thickness[0] + thickness[1]);
361 if (orientationErrors > 0) {
363 cout <<
"Warning: " << orientationErrors
364 <<
" invalid zero-length orientation vector(s) found.\n";
368 if (i != 2 *
int(iStrokeVertices.size())) {
370 cout <<
"Warning: problem with stripe size\n";
380void Strip::cleanUpSingularities(
const vector<StrokeVertex *> &iStrokeVertices)
388 cout <<
"Warning: strip vertex " << k <<
" non valid" << endl;
395 if (iStrokeVertices.size() < 2) {
399 vector<StrokeVertex *>::const_iterator
v, vend,
v2;
402 bool singu1 =
false, singu2 =
false;
403 int timeSinceSingu1 = 0, timeSinceSingu2 = 0;
406 v = iStrokeVertices.begin();
407 for (vend = iStrokeVertices.end();
v != vend;
v++) {
425 if ((dir1 * dir) < -
ZERO) {
431 int toto = i - timeSinceSingu1;
433 cerr <<
"Stephane dit \"Toto\"" << endl;
437 for (j = i - timeSinceSingu1; j <= i; j++) {
440 avP =
Vec2r(1.0 /
float(timeSinceSingu1 + 1) * avP);
441 for (j = i - timeSinceSingu1; j <= i; j++) {
449 if ((dir2 * dir) < -
ZERO) {
455 int toto = i - timeSinceSingu2;
457 cerr <<
"Stephane dit \"Toto\"" << endl;
461 for (j = i - timeSinceSingu2; j <= i; j++) {
464 avP =
Vec2r(1.0 /
float(timeSinceSingu2 + 1) * avP);
465 for (j = i - timeSinceSingu2; j <= i; j++) {
479 for (j = i - timeSinceSingu1; j < i; j++) {
482 avP =
Vec2r(1.0 /
float(timeSinceSingu1) * avP);
483 for (j = i - timeSinceSingu1; j < i; j++) {
490 for (j = i - timeSinceSingu2; j < i; j++) {
493 avP =
Vec2r(1.0 /
float(timeSinceSingu2) * avP);
494 for (j = i - timeSinceSingu2; j < i; j++) {
502 cout <<
"Warning: strip vertex " << k <<
" non valid after cleanup" << endl;
551void Strip::computeTexCoordWithTips(
const vector<StrokeVertex *> &iStrokeVertices,
556 vector<StrokeVertex *>::const_iterator
v, vend;
561 float u = 0, uPrev = 0;
566 v = iStrokeVertices.begin();
567 vend = iStrokeVertices.end();
568 l = (*v)->strokeLength() / spacedThickness;
574 <<
" strokeLength=" << (*v)->strokeLength() << endl;
577 vector<StrokeVertexRep *>::iterator currentSV =
_vertices.begin();
580 for (;
v != vend;
v++) {
599 if (
v != vend && i >= 2) {
602 t = (0.25 - uPrev) / (u - uPrev);
607 for (
int k = 0; k < 2; k++) {
619 for (
int k = 0; k < 2; k++) {
620 currentSV =
_vertices.insert(currentSV, tvRep[k]);
625 for (
int k = 0; k < 2; k++) {
631 for (
int k = 0; k < 2; k++) {
632 currentSV =
_vertices.insert(currentSV, tvRep[k]);
640 for (;
v != vend;
v++) {
661 if (
v != vend && i >= 2) {
669 for (
int k = 0; k < 2; k++) {
681 for (
int k = 0; k < 2; k++) {
682 currentSV =
_vertices.insert(currentSV, tvRep[k]);
687 for (
int k = 0; k < 2; k++) {
693 for (
int k = 0; k < 2; k++) {
694 currentSV =
_vertices.insert(currentSV, tvRep[k]);
700 for (;
v != vend;
v++) {
717 cerr <<
"u=" << u <<
" i=" << i <<
"/" << _sizeStrip << endl;
719 for (i = 0; i < _sizeStrip; i++) {
723 for (i = 0; i < _sizeStrip; i++) {
724 cerr <<
"(" << _texCoord[i][0] <<
", " << _texCoord[i][1] <<
") ";
729 for (i = 0; i < _sizeStrip / 2; i++) {
730 vec_tmp = _vertex[2 * i] - _vertex[2 * i + 1];
733 cerr <<
"Warning (from Fredo): There is a pb in the texture coordinates computation" << endl;
static TextureManager * getInstance()
uint getDefaultTextureId() const