Grid2dUtility::Grid2dUtility() { offset = Vec2r(0,0); scale = Vec2r(0,0); dimension = Vec2i(0,0); h = 0.0; }
std::array<Vec2r, 4> Grid2dUtility::corners(int pixelId) const { Vec2r offset = gridToWorld(pixelId); std::array<Vec2r, 4> corners; corners[0] = offset; corners[1] = offset+Vec2r(h,0); corners[2] = offset+Vec2r(h,h); corners[3] = offset+Vec2r(0,h); return corners; }
void Smoother::computeCurvature() { int i; Vec2r BA, BC, normalCurvature; for (i = 1; i < (_nbVertices - 1); ++i) { BA = _vertex[i - 1] - _vertex[i]; BC = _vertex[i + 1] - _vertex[i]; real lba = BA.norm(), lbc = BC.norm(); BA.normalizeSafe(); BC.normalizeSafe(); normalCurvature = BA + BC; _normal[i] = Vec2r(-(BC - BA)[1], (BC - BA)[0]); _normal[i].normalizeSafe(); _curvature[i] = normalCurvature * _normal[i]; if (lba + lbc > M_EPSILON) _curvature[i] /= (0.5 * lba + lbc); } _curvature[0] = _curvature[1]; _curvature[_nbVertices - 1] = _curvature[_nbVertices - 2]; Vec2r di(_vertex[1] - _vertex[0]); _normal[0] = Vec2r(-di[1], di[0]); _normal[0].normalizeSafe(); di = _vertex[_nbVertices - 1] - _vertex[_nbVertices - 2]; _normal[_nbVertices - 1] = Vec2r(-di[1], di[0]); _normal[_nbVertices - 1].normalizeSafe(); if (_isClosedCurve) { BA = _vertex[_nbVertices - 2] - _vertex[0]; BC = _vertex[1] - _vertex[0]; real lba = BA.norm(), lbc = BC.norm(); BA.normalizeSafe(); BC.normalizeSafe(); normalCurvature = BA + BC; _normal[i] = Vec2r(-(BC - BA)[1], (BC - BA)[0]); _normal[i].normalizeSafe(); _curvature[i] = normalCurvature * _normal[i]; if (lba + lbc > M_EPSILON) _curvature[i] /= (0.5 * lba + lbc); _normal[_nbVertices - 1] = _normal[0]; _curvature[_nbVertices - 1] = _curvature[0]; } }
void WingedEdgeBuilder::buildTriangles(const real *vertices, const real *normals, vector<FrsMaterial>& iMaterials, const real *texCoords, const IndexedFaceSet::FaceEdgeMark *iFaceEdgeMarks, const unsigned *vindices, const unsigned *nindices, const unsigned *mindices, const unsigned *tindices, const unsigned nvertices) { WShape *currentShape = _current_wshape; // the current shape begin built vector<WVertex *> triangleVertices; vector<Vec3r> triangleNormals; vector<Vec2r> triangleTexCoords; vector<bool> triangleFaceEdgeMarks; // Each triplet of vertices is considered as an independent triangle for (unsigned int i = 0; i < nvertices / 3; i++) { triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 1] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 2] / 3]); triangleNormals.push_back(Vec3r(normals[nindices[3 * i]], normals[nindices[3 * i] + 1], normals[nindices[3 * i] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[3 * i + 1]], normals[nindices[3 * i + 1] + 1], normals[nindices[3 * i + 1] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[3 * i + 2]], normals[nindices[3 * i + 2] + 1], normals[nindices[3 * i + 2] + 2])); if (texCoords) { triangleTexCoords.push_back(Vec2r(texCoords[tindices[3 * i]], texCoords[tindices[3 * i] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[3 * i + 1]], texCoords[tindices[3 * i + 1] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[3 * i + 2]], texCoords[tindices[3 * i + 2] + 1])); } triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::FACE_MARK) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V1V2) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V2V3) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V3V1) != 0); } if (mindices) currentShape->MakeFace(triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, mindices[0]); else currentShape->MakeFace(triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0); }
void Smoother::iteration() { computeCurvature(); for (int i = 1; i < (_nbVertices - 1); ++i) { real motionNormal = _factorCurvature * _curvature[i] * edgeStopping(_curvature[i], _anisoNormal); real diffC1 = _curvature[i] - _curvature[i - 1]; real diffC2 = _curvature[i] - _curvature[i + 1]; real motionCurvature = edgeStopping(diffC1, _anisoCurvature) * diffC1 + edgeStopping(diffC2, _anisoCurvature) * diffC2; //_factorCurvatureDifference; motionCurvature *= _factorCurvatureDifference; // motionCurvature = _factorCurvatureDifference * (diffC1 + diffC2); if (_safeTest) _vertex[i] = Vec2r(_vertex[i] + (motionNormal + motionCurvature) * _normal[i]); Vec2r v1(_vertex[i - 1] - _vertex[i]); Vec2r v2(_vertex[i + 1] - _vertex[i]); real d1 = v1.norm(); real d2 = v2.norm(); _vertex[i] = Vec2r( _vertex[i] + _factorPoint * edgeStopping(d2, _anisoPoint) * (_vertex[i - 1] - _vertex[i]) + _factorPoint * edgeStopping(d1, _anisoPoint) * (_vertex[i + 1] - _vertex[i])); } if (_isClosedCurve) { real motionNormal = _factorCurvature * _curvature[0] * edgeStopping(_curvature[0], _anisoNormal); real diffC1 = _curvature[0] - _curvature[_nbVertices - 2]; real diffC2 = _curvature[0] - _curvature[1]; real motionCurvature = edgeStopping(diffC1, _anisoCurvature) * diffC1 + edgeStopping(diffC2, _anisoCurvature) * diffC2; //_factorCurvatureDifference; motionCurvature *= _factorCurvatureDifference; // motionCurvature = _factorCurvatureDifference * (diffC1 + diffC2); _vertex[0] = Vec2r(_vertex[0] + (motionNormal + motionCurvature) * _normal[0]); _vertex[_nbVertices - 1] = _vertex[0]; } }
real ViewEdge::getLength2D() const { float length = 0.0f; ViewEdge::const_fedge_iterator itlast = fedge_iterator_last(); ViewEdge::const_fedge_iterator it = fedge_iterator_begin(), itend = fedge_iterator_end(); Vec2r seg; do { seg = Vec2r((*it)->orientation2d()[0], (*it)->orientation2d()[1]); length += seg.norm(); ++it; } while ((it != itend) && (it != itlast)); return length; }
Vec2r SVertex::ImageSpaceNormal() const { if (_Normals.size() == 0) return Vec2r(0,0); Vec3r normal = *(_Normals.begin()); Vec3r pos = _Point3D; Vec2r imgNormal = SilhouetteGeomEngine::WorldToImage2(pos + normal) - SilhouetteGeomEngine::WorldToImage2(pos); imgNormal.normalize(); return imgNormal; }
int SpatialNoiseShader::shade(Stroke &ioStroke) const { Interface0DIterator v, v2; v = ioStroke.verticesBegin(); Vec2r p(v->getProjectedX(), v->getProjectedY()); v2 = v; ++v2; Vec2r p0(v2->getProjectedX(), v2->getProjectedY()); p0 = p + 2 * (p - p0); StrokeVertex *sv; sv = dynamic_cast<StrokeVertex *>(&(*v)); real initU = sv->strokeLength() * real(NB_VALUE_NOISE); if (_pureRandom) initU += RandGen::drand48() * real(NB_VALUE_NOISE); Functions0D::VertexOrientation2DF0D fun; while (!v.isEnd()) { sv = dynamic_cast<StrokeVertex *>(&(*v)); Vec2r p(sv->getPoint()); if (fun(v) < 0) return -1; Vec2r vertexOri(fun.result); Vec2r ori2d(vertexOri[0], vertexOri[1]); ori2d = Vec2r(p - p0); ori2d.normalizeSafe(); PseudoNoise mynoise; real bruit; if (_smooth) bruit = mynoise.turbulenceSmooth(_xScale * sv->curvilinearAbscissa() + initU, _nbOctave); else bruit = mynoise.turbulenceLinear(_xScale * sv->curvilinearAbscissa() + initU, _nbOctave); Vec2r noise(-ori2d[1] * _amount * bruit, ori2d[0] * _amount * bruit); sv->setPoint(p[0] + noise[0], p[1] + noise[1]); p0 = p; ++v; } ioStroke.UpdateLength(); return 0; }
const FEdge *ViewMap::getClosestFEdge(real x, real y) const { // find the closest of this candidates: real minDist = DBL_MAX; FEdge *winner = NULL; for (fedges_container::const_iterator fe = _FEdges.begin(), feend = _FEdges.end(); fe != feend; fe++) { Vec2d A((*fe)->vertexA()->point2D()[0], (*fe)->vertexA()->point2D()[1]); Vec2d B((*fe)->vertexB()->point2D()[0], (*fe)->vertexB()->point2D()[1]); real dist = GeomUtils::distPointSegment<Vec2r>(Vec2r(x, y), A, B); if (dist < minDist) { minDist = dist; winner = (*fe); } } return winner; }
bool FlatFloor::LoadParameter(const Strings& param, bool& parameterLoaded) { if(param[0] == "[SegmentNum]") { m_segmentNum = ToUInt(param[1]); if(m_pCollAABB) delete m_pCollAABB; m_pCollAABB = new CollAABB(Vec2r(m_segmentNum * WORLD_UNIT, WORLD_UNIT)); m_pos.X += (m_segmentNum - 1) * HALF_WORLD_UNIT; parameterLoaded = true; } return true; }
GUISpriteSheet::GUISpriteSheet() : GUIElement(Vec2r(), Vec2r(), nullptr) { }
void WingedEdgeBuilder::buildTriangleStrip(const real *vertices, const real *normals, vector<FrsMaterial>& iMaterials, const real *texCoords, const IndexedFaceSet::FaceEdgeMark *iFaceEdgeMarks, const unsigned *vindices, const unsigned *nindices, const unsigned *mindices, const unsigned *tindices, const unsigned nvertices) { unsigned nDoneVertices = 2; // number of vertices already treated unsigned nTriangle = 0; // number of the triangle currently being treated //int nVertex = 0; // vertex number WShape *currentShape = _current_wshape; // the current shape being built vector<WVertex *> triangleVertices; vector<Vec3r> triangleNormals; vector<Vec2r> triangleTexCoords; vector<bool> triangleFaceEdgeMarks; while (nDoneVertices < nvertices) { //clear the vertices list: triangleVertices.clear(); //Then rebuild it: if (0 == nTriangle % 2) { // if nTriangle is even triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle + 1] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle + 2] / 3]); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle]], normals[nindices[nTriangle] + 1], normals[nindices[nTriangle] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle + 1]], normals[nindices[nTriangle + 1] + 1], normals[nindices[nTriangle + 1] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle + 2]], normals[nindices[nTriangle + 2] + 1], normals[nindices[nTriangle + 2] + 2])); if (texCoords) { triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle]], texCoords[tindices[nTriangle] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle + 1]], texCoords[tindices[nTriangle + 1] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle + 2]], texCoords[tindices[nTriangle + 2] + 1])); } } else { // if nTriangle is odd triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle + 2] / 3]); triangleVertices.push_back(currentShape->getVertexList()[vindices[nTriangle + 1] / 3]); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle]], normals[nindices[nTriangle] + 1], normals[nindices[nTriangle] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle + 2]], normals[nindices[nTriangle + 2] + 1], normals[nindices[nTriangle + 2] + 2])); triangleNormals.push_back(Vec3r(normals[nindices[nTriangle + 1]], normals[nindices[nTriangle + 1] + 1], normals[nindices[nTriangle + 1] + 2])); if (texCoords) { triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle]], texCoords[tindices[nTriangle] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle + 2]], texCoords[tindices[nTriangle + 2] + 1])); triangleTexCoords.push_back(Vec2r(texCoords[tindices[nTriangle + 1]], texCoords[tindices[nTriangle + 1] + 1])); } } triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::FACE_MARK) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V1V2) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V2V3) != 0); triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V3V1) != 0); if (mindices) { currentShape->MakeFace(triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, mindices[nTriangle / 3]); } else { currentShape->MakeFace(triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0); } nDoneVertices++; // with a strip, each triangle is one vertex more nTriangle++; } }
Menu::Menu() : GUIElement(Vec2r(0,0), Vec2r(1,1), this) { TheCursor::Instance()->ShowCursor(); }
Camera::Camera() { m_pos = Vec2r(0.0f, 0.5f); }
GUIButton::GUIButton() : GUIElement(Vec2r(), Vec2r(), nullptr) { }