Ejemplo n.º 1
0
void InsertCorners(vector<m2::PointD> const & corners,
                   m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3,
                   AddPoligonPoint const & addPoligonPoint, int code1, int code2)
{
  int cornerInd = GetRectSideIndex(code1);
  int endCornerInd = GetRectSideIndex(code2);

  if (!IsPointInsideTriangle(corners[cornerInd], p1, p2, p3))
  {
    if (!IsPointInsideTriangle(corners[endCornerInd], p1, p2, p3))
      return;
    swap(cornerInd, endCornerInd);
  }

  while (cornerInd != endCornerInd)
  {
    addPoligonPoint(corners[cornerInd]);
    cornerInd = (cornerInd + 1) % 4;
  }
}
Ejemplo n.º 2
0
void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1,
                        m2::PointD const & p2, m2::PointD const & p3,
                        ClipTriangleByRectResultIt const & resultIterator)
{
  if (resultIterator == nullptr)
    return;

  if (rect.IsPointInside(p1) && rect.IsPointInside(p2) && rect.IsPointInside(p3))
  {
    resultIterator(p1, p2, p3);
    return;
  }

  const double kEps = 1e-8;
  vector<m2::PointD> poligon;
  auto const addPoligonPoint = [&poligon, kEps](m2::PointD const & pt)
  {
    if (poligon.empty() || !poligon.back().EqualDxDy(pt, kEps))
      poligon.push_back(pt);
  };

  vector<m2::PointD> const corners = { rect.LeftTop(), rect.RightTop(), rect.RightBottom(), rect.LeftBottom() };

  int firstClipCode[3];
  int lastClipCode[3];
  bool intersected[3];

  intersected[0] = IntersectEdge(rect, corners, p1, p2, p3, addPoligonPoint,
                                 0, 0, firstClipCode[0], lastClipCode[0]);

  intersected[1] = IntersectEdge(rect, corners, p2, p3, p1, addPoligonPoint,
                                 lastClipCode[0], 0, firstClipCode[1], lastClipCode[1]);

  intersected[2] = IntersectEdge(rect, corners, p3, p1, p2, addPoligonPoint,
                                 lastClipCode[1] != 0 ? lastClipCode[1] : lastClipCode[0],
                                 firstClipCode[0] != 0 ? firstClipCode[0] : firstClipCode[1],
                                 firstClipCode[2], lastClipCode[2]);

  int const intersectCount = intersected[0] + intersected[1] + intersected[2];
  if (intersectCount == 0)
  {
    if (IsPointInsideTriangle(rect.Center(), p1, p2, p3))
    {
      resultIterator(rect.LeftTop(), rect.RightTop(), rect.RightBottom());
      resultIterator(rect.RightBottom(), rect.LeftBottom(), rect.LeftTop());
    }
    return;
  }

  if (intersectCount == 1 && intersected[2])
    InsertCorners(corners, p1, p2, p3, addPoligonPoint, lastClipCode[2], firstClipCode[2]);

  if (!poligon.empty() && poligon.back().EqualDxDy(poligon[0], kEps))
    poligon.pop_back();

  if (poligon.size() < 3)
    return;

  for (size_t i = 0; i < poligon.size() - 2; ++i)
    resultIterator(poligon[0], poligon[i + 1], poligon[i + 2]);
}
Ejemplo n.º 3
0
//-------------------------------------------------------------
//- GetMeshPointFromSecondTexCoord
//- Get real vertex position and normal from mesh according to TexCoord1
//-------------------------------------------------------------
bool CSGPModelMF1::GetMeshPointFromSecondTexCoord( Vector3D& position, Vector3D& normal, const Vector2D& uv, const Matrix4x4& modelMatrix  )
{
	for( uint32 i=0; i<m_Header.m_iNumMeshes; i++ )
	{
		if( !m_pLOD0Meshes[i].m_pTexCoords1 || (m_pLOD0Meshes[i].m_iNumUV1==0) )
			continue;

		jassert( m_pLOD0Meshes[i].m_iNumUV0 == m_pLOD0Meshes[i].m_iNumUV1 );


		for( uint32 j=0; j<m_pLOD0Meshes[i].m_iNumIndices; j += 3 )
		{
			Vector3D v0(
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vPos[0],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vPos[1],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vPos[2] );
			Vector3D v1(
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vPos[0],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vPos[1],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vPos[2] );
			Vector3D v2(
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vPos[0],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vPos[1],
				m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vPos[2] );

			v0 = v0 * modelMatrix;
			v1 = v1 * modelMatrix;
			v2 = v2 * modelMatrix;

			Vector2D t0(m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].m_fTexCoord[0],
						m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].m_fTexCoord[1]	);
			Vector2D t1(m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].m_fTexCoord[0],
						m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].m_fTexCoord[1]	);
			Vector2D t2(m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].m_fTexCoord[0],
						m_pLOD0Meshes[i].m_pTexCoords1[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].m_fTexCoord[1]	);

			Vector3D samplePos = TexcoordToPos( v0, v1, v2, t0, t1, t2, uv );
			if( !IsPointInsideTriangle(v0, v1, v2, samplePos, 0.1f) )
				continue;
			else
			{
				Vector4D n0(
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vNormal[0],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vNormal[1],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j  ]  ].vNormal[2],
					0);
				Vector4D n1(
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vNormal[0],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vNormal[1],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+1]  ].vNormal[2],
					0);
				Vector4D n2(
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vNormal[0],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vNormal[1],
					m_pLOD0Meshes[i].m_pVertex[  m_pLOD0Meshes[i].m_pIndices[j+2]  ].vNormal[2],
					0);


				n0 = n0 * modelMatrix;
				n1 = n1 * modelMatrix;
				n2 = n2 * modelMatrix;

				Vector3D nn0(n0.x, n0.y, n0.z);
				Vector3D nn1(n1.x, n1.y, n1.z);
				Vector3D nn2(n2.x, n2.y, n2.z);
				nn0.Normalize();
				nn1.Normalize();
				nn2.Normalize();

				normal = TexcoordToPos( nn0, nn1, nn2, t0, t1, t2, uv );
				normal.Normalize();
				position = samplePos;

				return true;
			}
		}
	}
	return false;
}