Esempio n. 1
0
Grid2dUtility::Grid2dUtility()
{
    offset = Vec2r(0,0);
    scale = Vec2r(0,0);
    dimension = Vec2i(0,0);
    h = 0.0;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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);
}
Esempio n. 5
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];
  }
}
Esempio n. 6
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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
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;
}
Esempio n. 10
0
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;
}
Esempio n. 11
0
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++;
	}
}
Esempio n. 13
0
Menu::Menu() : GUIElement(Vec2r(0,0), Vec2r(1,1), this)
{
	TheCursor::Instance()->ShowCursor();
}
Esempio n. 14
0
Camera::Camera()
{
  m_pos = Vec2r(0.0f, 0.5f);
}
Esempio n. 15
0
GUIButton::GUIButton() : GUIElement(Vec2r(), Vec2r(), nullptr)
{

}