void Model::AddCylinder(float radius, float height)
{
	const double M_PI = 3.14159265358979;
	int round = 6;

	uint16_t startIndex = GetNextVertexIndex();

	for(int i = 0; i <= round; i++)
	{
		double sangle = i * M_PI * 2. / round;
		for (int t = -1; t <= 1; t += 2)
		{
			Vector3f v = Vector3f(cos(sangle) * radius, sin(sangle) * radius, t * height);
			AddVertex(Vertex(v, Color(127, 0, 127, 255), float(i), float(t), Vector3f(cos(sangle), sin(sangle), 0)));
		}
	}

	// Renumber indices
	for (uint16_t s = 0; s < round; s++)
	{
		uint16_t s1 = s + 1;
		auto get = [&](uint16_t s, uint16_t t){
			return s * 2 + t + startIndex;
		};
		AddTriangle(get(s, 0),
			get(s, 1),
			get(s1, 0));
		AddTriangle(get(s1, 0),
			get(s, 1),
			get(s1, 1));
	}
}
//{CodeReview:Triangulation}
void EarClipper::Triangulate_R(VertexListIteratorList& ears, std::vector<const FVector2*>& triangles)
{
   if (vertices.size() == 3)
   {
      AddTriangle(triangles, vertices.begin(), true);
   }
   else if (vertices.size() < 3)
   {
      AddRemainingTriangles(triangles);
   }
   else
   {
      assert( !ears.empty() );

      VertexList::iterator ear = ears.front();
      ears.pop_front();

      VertexList::iterator firstAdjacent = ear.previous();
      VertexList::iterator secondAdjacent = ear.next();

      AddTriangle(triangles, ear, false);

      vertices.erase(ear);

      ReclassifyVertex(firstAdjacent, ears);
      ReclassifyVertex(secondAdjacent, ears);

      AdjustForPossibleResultingCollinearity(ears, firstAdjacent, secondAdjacent);

      Triangulate_R(ears, triangles);
   }
}
void RayTracingEnvironment::AddQuad(
	int32 id, const Vector &v1, const Vector &v2, const Vector &v3,
	const Vector &v4,							// specify vertices in cw or ccw order
	const Vector &color)
{
	AddTriangle(id,v1,v2,v3,color);
	AddTriangle(id+1,v1,v3,v4,color);
}
Exemple #4
0
void RayTracingEnvironment::AddBSPFace(int id,dface_t const &face)
{
    if (face.dispinfo!=-1)									// displacements must be dealt with elsewhere
        return;
    texinfo_t *tx =(face.texinfo>=0)?&(texinfo[face.texinfo]):0;
// 	if (tx && (tx->flags & (SURF_SKY|SURF_NODRAW)))
// 		return;
    if (tx)
    {
        printf("id %d flags=%x\n",id,tx->flags);
    }
    printf("side: ");
    for(int v=0; v<face.numedges; v++)
    {
        printf("(%f %f %f) ",XYZ(VertCoord(face,v)));
    }
    printf("\n");
    int ntris=face.numedges-2;
    for(int tri=0; tri<ntris; tri++)
    {

        AddTriangle(id,VertCoord(face,0),VertCoord(face,(tri+1)%face.numedges),
                    VertCoord(face,(tri+2)%face.numedges),Vector(1,1,1)); //colors[id % NELEMS(colors)]);
    }
}
Exemple #5
0
 void Mesh::ComputeConvexHull(const double * const pts, 
                              const size_t         nPts)
 {
     ResizePoints(0);
     ResizeTriangles(0);
     btConvexHullComputer ch;
     ch.compute(pts, 3 * sizeof(double), (int) nPts, -1.0, -1.0);
     for (int v = 0; v < ch.vertices.size(); v++)
     {
         AddPoint(Vec3<double>(ch.vertices[v].getX(), ch.vertices[v].getY(), ch.vertices[v].getZ()));
     }
     const int nt = ch.faces.size();
     for (int t = 0; t < nt; ++t)
     {
         const btConvexHullComputer::Edge * sourceEdge = &(ch.edges[ch.faces[t]]);
         int a = sourceEdge->getSourceVertex();
         int b = sourceEdge->getTargetVertex();
         const btConvexHullComputer::Edge * edge = sourceEdge->getNextEdgeOfFace();
         int c = edge->getTargetVertex();
         while (c != a)
         {
             AddTriangle(Vec3<int>(a, b, c));
             edge = edge->getNextEdgeOfFace();
             b = c;
             c = edge->getTargetVertex();
         }
     }
 }
Exemple #6
0
void AddNewShape(const std::vector<std::string> & inputParts, std::vector<std::shared_ptr<CShape>> & figures, std::vector<std::shared_ptr<sf::Shape>> & shapes)
{
	if (inputParts.size() == 4 && inputParts[0].compare(std::string("point")) == 0)
	{
		AddPoint(inputParts, figures, shapes);
	}
	else if (inputParts.size() == 6 && inputParts[0].compare(std::string("line")) == 0)
	{
		AddLine(inputParts, figures, shapes);
	}
	else if (inputParts.size() == 9 && inputParts[0].compare(std::string("triangle")) == 0)
	{
		AddTriangle(inputParts, figures, shapes);
	}
	else if (inputParts.size() == 7 && inputParts[0].compare(std::string("rectangle")) == 0)
	{
		AddRectangle(inputParts, figures, shapes);
	}
	else if (inputParts.size() == 6 && inputParts[0].compare(std::string("circle")) == 0 && std::stod(inputParts[3]) >= 0)
	{
		AddCircle(inputParts, figures, shapes);
	}
	else
	{
		throw std::invalid_argument("Incorrect command");
	}
}
Exemple #7
0
//---------------------------------------------------------
void Poly3D::BuildTriangles()
//---------------------------------------------------------
{
  // Calculate the center of the polygon

  umWARNING("Poly3D::BuildTriangles()", "TODO: Check from where this is called!");

  int Nr=m_xyz.num_rows(), Nc=m_xyz.num_cols();
  DMat t_xyz; t_xyz.borrow(Nr,Nc, m_xyz.data());
  DVec cent = t_xyz.row_sums()  / (double)m_N;
//DVec cent = sum(poly.m_xyz,2) / (double)m_N;

  // Sort the points by angle where the angle is 
  // measured from the center of the polygon
  SortPoints(cent);

  // now build triangles
  DVec a,b; double totalarea = 0.0;
  for (int i=1; i<=m_N; ++i) {
    a = t_xyz(All,i);
  //b = poly.m_xyz(All, mod(i,poly.m_N)+1);
    b = t_xyz(All, 1 + (i%m_N));
    AddTriangle(cent, a, b);
    totalarea += m_areas(i);
  }

  // Clear the polygon if the total area 
  // of the polygon is too small.
  double tol = 1e-6;
  if (totalarea < tol) {
    Clear();
  }
}
Exemple #8
0
bool CMesh::Init(CGeometry *pOrgGeom, CStrAny sMatSemantic, uint8_t btMatSemanticIndex)
{
  ASSERT(pOrgGeom && pOrgGeom->m_ePrimitiveType == CGeometry::PT_TRIANGLELIST);
  UINT uiVertices, uiIndices, i;

  m_pOrgGeom = pOrgGeom;

  uiVertices = pOrgGeom->GetVBVertexCount();
  uiIndices = pOrgGeom->GetIBIndexCount();
  ASSERT(uiVertices && uiIndices);
  CAutoDeleteArrayPtr<TVertex *> pVertices(new TVertex *[uiVertices]);

  static CStrAny sPOSITION(ST_CONST, "POSITION");

  int iPosIndex, iPosOffset, iVertSize;
  int iMatIndex, iMatOffset;
  CInputDesc::TInputElement *pPosElem, *pMatElem;

  pPosElem = pOrgGeom->m_pInputDesc->GetElementInfo(sPOSITION, 0, &iPosIndex);
  ASSERT(pPosElem && pPosElem->m_Type == CInputDesc::T_FLOAT && pPosElem->m_btElements == 3);
  iPosOffset = pOrgGeom->m_pInputDesc->GetElementOffset(iPosIndex);
  iVertSize = pOrgGeom->m_pInputDesc->GetSize();

  if (sMatSemantic.Length()) {
    pMatElem = pOrgGeom->m_pInputDesc->GetElementInfo(sMatSemantic, btMatSemanticIndex, &iMatIndex);
    ASSERT(pMatElem && pMatElem->m_Type == CInputDesc::T_FLOAT);
    iMatOffset = pOrgGeom->m_pInputDesc->GetElementOffset(iMatIndex);
  } else
    iMatOffset = -1;

  UINT uiVertMapFlags = (pOrgGeom->m_pVB->m_uiFlags & CResource::RF_KEEPSYSTEMCOPY) ? CResource::RMF_SYSTEM_ONLY : 0;
  uint8_t *pVertex = pOrgGeom->m_pVB->Map(0, uiVertMapFlags);
  ASSERT(pVertex);

  int iMatID = 0;
  for (i = 0; i < uiVertices; i++) {
    CVector<3> *pPos = (CVector<3> *) (pVertex + iPosOffset);
    if (iMatOffset >= 0)
      iMatID = (int) *(float *) (pVertex + iMatOffset);
    pVertices[i] = AddVertex(*pPos, iMatID);
    pVertex += iVertSize;
  }

  pOrgGeom->m_pVB->Unmap();

  UINT uiIndMapFlags = (pOrgGeom->m_pIB->m_uiFlags & CResource::RF_KEEPSYSTEMCOPY) ? CResource::RMF_SYSTEM_ONLY : 0;
  uint16_t *pIndex = (uint16_t *) pOrgGeom->m_pIB->Map(0, uiIndMapFlags);
  ASSERT(pIndex);

  for (i = 0; i < uiIndices; i += 3) {
    ASSERT(pIndex[0] < uiVertices && pIndex[1] < uiVertices && pIndex[2] < uiVertices);
    AddTriangle(pVertices[pIndex[0]], pVertices[pIndex[1]], pVertices[pIndex[2]]);
    pIndex += 3;
  }

  pOrgGeom->m_pIB->Unmap();

  return true;
}
void Model::AddSphere(float scale)
{
	const double M_PI = 3.14159265358979;
	int slices = 16, stacks = 8;

	uint16_t startIndex = GetNextVertexIndex();

	Vector3f northPos(0, scale, 0);
	AddVertex(Vertex(northPos, Color(127, 127, 127, 255), 0, 1, northPos));

	Vector3f southPos(0, -scale, 0);
	AddVertex(Vertex(southPos, Color(127, 127, 127, 255), 0, 0, southPos));

	for (int s = 0; s <= slices; s++)
	{
		double sangle = s * M_PI * 2. / slices;
		for (int t = 0; t <= stacks; t++)
		{
			double tangle = t * M_PI / stacks - M_PI;
			Vector3f v = Vector3f(cos(sangle) * sin(tangle), cos(tangle), sin(sangle) * sin(tangle));
			AddVertex(Vertex(v * scale, Color(127,127,127,255), float(s), float(t), v));
		}
	}

	startIndex += 2;

	// Renumber indices
	for (uint16_t s = 0; s < slices; s++)
	{
		for (uint16_t t = 0; t < stacks; t++)
		{
			uint16_t s1 = s + 1;
			uint16_t t1 = t + 1;
			auto get = [&](uint16_t s, uint16_t t){
				return s * (stacks + 1) + t + startIndex;
			};
			AddTriangle(get(s, t),
				get(s1, t),
				get(s, t1));
			AddTriangle(get(s1, t),
				get(s1, t1),
				get(s, t1));
		}
	}
}
Exemple #10
0
unsigned int Triangulation::Create(cdt_skeleton cdt_skel){
  for(unsigned int i = 0; i < cdt_skel.size(); i++){
    StartNewLayer();
    for(unsigned int j = 0; j < cdt_skel[i].size(); j++){
      AddTriangle(UP);
      for(unsigned int k = 0; k < cdt_skel[i][j]; k++) AddTriangle(DOWN);
    }
  }

  //Add cap to top of triangulation
  StartNewLayer();
  for(unsigned int i = 0; i < LastLayer->size(); i++){
    if((*LastLayer)[i]->orientation == DOWN) AddTriangle(UP);
  }
  StartNewLayer();
  Simplex.pop_back();
  return 0;
}
BOOL CConvexHullGenerator::FindFirstPairTriangles(CArrayExtremeTrianglePtr* papcTriangles, int iMaxXIndex, int iMinXIndex, int iFarIndex)
{
	CHalfSpaceHelper			cHalfSpace;
	int							i;
	CExtremeTriangle*			pcTriangleUp;
	CExtremeTriangle*			pcTriangleDown;
	SFloat3*					psPosition;

	pcTriangleUp = AddTriangle(GetPosition(mpsPoints, iStride, iMaxXIndex), 
		GetPosition(mpsPoints, iStride, iMinXIndex), 
		GetPosition(mpsPoints, iStride, iFarIndex));

	pcTriangleDown = AddTriangle(GetPosition(mpsPoints, iStride, iMaxXIndex), 
		GetPosition(mpsPoints, iStride, iFarIndex), 
		GetPosition(mpsPoints, iStride, iMinXIndex));

	for (i = 0; i < iNumPoints; i++)
	{
		psPosition = GetPosition(mpsPoints, iStride, i);
		if ((i != iMaxXIndex) && (i != iMinXIndex) && (i != iFarIndex))
		{
			if (!pcTriangleUp->Contains(psPosition))
			{
				pcTriangleUp->maiVisible.Add(i);
			}
			else if (!pcTriangleDown->Contains(psPosition))
			{
				pcTriangleDown->maiVisible.Add(i);
			}
			else
			{
				gcUserError.Set("No triangle contained point");
				return FALSE;
			}
		}
	}

	//These triangles ARE sorted at this point.
	papcTriangles->Add(&pcTriangleUp);
	papcTriangles->Add(&pcTriangleDown);
	return TRUE;
}
Exemple #12
0
void Geometry::BuildRep1()
{
	tr.clear();
	for(int i=0;i<face.size();i++)
	{
		//printf("%d %d %d | ",face[i].x,face[i].y,face[i].z);
		AddTriangle(vert[face[i].x],vert[face[i].y],vert[face[i].z]);
	}
	RebuildTrBB();


}
// TODO: if this is only called to add a fresh start triangle, all vertices must be added
void CBlockOption::AddOneTriangle(
	STri			* const pTri,
	const CObject	* const pOb)
{
	int		i;

	// Add the triangle to the block
	AddTriangle(pTri);

	// Add the vertices to the block
	for(i = 0; i < 3; ++i)
		AddVertexCheckDup(&pOb->m_pVtx[pTri->pwIdx[i]]);
}
Exemple #14
0
void onea::Lumiere::Generate(vector< LigneShape<float> > &vec)
{
    m_shape.clear();

    float buf=(M_PI*2)/(float)m_qualite;

    for(unsigned int i=0; i < m_qualite; ++i)
    {
        AddTriangle(sf::Vector2f((float)((float)m_rayon*cos((float)i*buf))
                                 ,(float)((float)m_rayon*sin((float)i*buf))) ,
                    sf::Vector2f((float)((float)m_rayon*cos((float)(i+1)*buf))
                                 ,(float)((float)m_rayon*sin((float)(i+1)*buf))), 0, vec);
    }
}
Exemple #15
0
void CBlockOption::Add(
	const CBlockOption	* const pSrc,
	const CObject		* const pOb)
{
	int i;

	// Add vertices from job to block
	for(i = 0; i < pSrc->nVtxNum; ++i)
		AddVertexCheckDup(pSrc->psVtx[i]);

	// Add triangles from job to block
	for(i = 0; i < pSrc->nTriNum; ++i)
		AddTriangle(pSrc->psTri[i]);
}
Exemple #16
0
void  TLFFaceImageDescriptor::AddTriangle(TLFTriangle*  t)
{
   if (t == NULL)
    return;
   if (t->GetChild(0) == 0 && t->GetParent() != NULL)
   {
       this->m_List.AddTriangle(t);
   }
   else
   {
        for (int i = 0; i < 4; i++)
        {
            AddTriangle(t->GetChild(i));
        }
   }
}
Exemple #17
0
/** Draws a wireframe mesh */
void BaseLineRenderer::AddWireframeMesh(const std::vector<ExVertexStruct>& vertices, const std::vector<VERTEX_INDEX>& indices, const D3DXVECTOR4& color, const D3DXMATRIX* world)
{
	for(int i=0;i<indices.size();i+=3)
	{
		D3DXVECTOR3 vx[3];
		for(int v=0;v<3;v++)
		{
			if(world)
				D3DXVec3TransformCoord(&vx[v], vertices[indices[i + v]].Position.toD3DXVECTOR3(), world);
			else
				vx[v] = *vertices[indices[i + v]].Position.toD3DXVECTOR3();
		}

		AddTriangle(vx[0], vx[1], vx[2], color);
	}
}
    bool MeshMaterialGraphicsObject::InitializeAsync()
    {
        assert(_mesh != nullptr);
        SetMaterial(material());

        for (size_t i = 0; i < _mesh->vertices->size(); i++)
        {
            AddVertex((*_mesh->vertices)[i], (*_mesh->texCoords)[i], (*_mesh->normals)[i]);
        }
        for (Vector<3, unsigned> triangle : *_mesh->triangles)
        {
            AddTriangle(triangle[0], triangle[1], triangle[2]);
        }
        for (Vector<4, unsigned> quad : *_mesh->quads)
        {
            AddQuad(quad[0], quad[1], quad[2], quad[3]);
        }

        return VboGraphicsObject::InitializeAsync();
    }
Exemple #19
0
void Game1::Update(unsigned int time)
{
	KeyboardState cState = Keyboard::GetState();
	MouseState mState = Mouse::GetState();
	world->Step(time * 0.001f, 6, 2);
	if (cState.IsKeyDown(SDLK_y) && !oldState.IsKeyDown(SDLK_y))
	{
		AddCube(mState.X, mState.Y, mState.RelX, mState.RelY);
	}
	if (cState.IsKeyDown(SDLK_x) && !oldState.IsKeyDown(SDLK_x))
	{
		AddCircle(mState.X, mState.Y, mState.RelX * 10, mState.RelY * 10);
	}
	if (cState.IsKeyDown(SDLK_c) && !oldState.IsKeyDown(SDLK_c))
	{
		AddTriangle(mState.X, mState.Y, mState.RelX * 10, mState.RelY * 10);
	}
	if (cState.IsKeyDown(SDLK_v) && !oldState.IsKeyDown(SDLK_v))
	{
		AddRope(mState.X, mState.Y);
	}
	oldState = cState;
}
Exemple #20
0
void onea::Lumiere::AddTriangle(Vector2f pt1, Vector2f pt2, int minimum_wall, vector< LigneShape<float> > &m_wall)
{
    int w = minimum_wall;
    for(std::vector< LigneShape<float> >::iterator IterWall=m_wall.begin()+minimum_wall; IterWall!=m_wall.end(); ++IterWall,++w)
    {
        // l1 et l2 sont les positions relatives au centre de la lumière des deux extrémités du mur
        sf::Vector2f l1(IterWall->pt1.position.x-m_position.x, IterWall->pt1.position.y-m_position.y);
        sf::Vector2f l2(IterWall->pt2.position.x-m_position.x, IterWall->pt2.position.y -m_position.y);

        if(l1.x * l1.x + l1.y * l1.y < m_rayon * m_rayon) {
            Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);

            if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                    if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                        if((l1.y >= 0 && i.y >= 0) || (l1.y <= 0 && i.y <= 0))
                            if((l1.x >= 0 && i.x >= 0) || (l1.x <= 0 && i.x <= 0))
                                AddTriangle(i, pt2, w, m_wall), pt2 = i;
        }

        if(l2.x * l2.x + l2.y * l2.y < m_rayon * m_rayon) {
            sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
            if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                    if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                        if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                            if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                                AddTriangle(pt1, i, w, m_wall), pt1 = i;
        }

        sf::Vector2f m = Collision(l1, l2, sf::Vector2f(0,0), pt1);
        sf::Vector2f n = Collision(l1, l2, sf::Vector2f(0,0), pt2);
        sf::Vector2f o = Collision(l1, l2, pt1, pt2);

        if((m.x != 0 || m.y != 0) && (n.x != 0 || n.y != 0))
            pt1 = m, pt2 = n;
        else
        {
            if((m.x != 0 || m.y != 0) && (o.x != 0 || o.y != 0))
                AddTriangle(m ,o , w, m_wall), pt1 = o;
            if((n.x != 0 || n.y != 0) && (o.x != 0 || o.y != 0))
                AddTriangle(o ,n , w, m_wall), pt2 = o;
        }

    }

    float intensity;

    m_shape.push_back(Triangle());

    m_shape.back().AddPoint(0, 0,  sf::Color((int)(m_intensite*m_couleur.r/255),
                            (int)(m_intensite*m_couleur.g/255),
                            (int)(m_intensite*m_couleur.b/255)),sf::Color(255,255,255)
                           );

    intensity = m_intensite-sqrt(pt1.x*pt1.x + pt1.y*pt1.y)*m_intensite/m_rayon;
    m_shape.back().AddPoint(pt1.x, pt1.y,  sf::Color((int)(intensity*m_couleur.r/255),
                            (int)(intensity*m_couleur.g/255),
                            (int)(intensity*m_couleur.b/255)),sf::Color(255,255,255));

    intensity = m_intensite-sqrt(pt2.x*pt2.x + pt2.y*pt2.y)*m_intensite/m_rayon;
    m_shape.back().AddPoint(pt2.x, pt2.y,  sf::Color((int)(intensity*m_couleur.r/255),
                            (int)(intensity*m_couleur.g/255),
                            (int)(intensity*m_couleur.b/255)),sf::Color(255,255,255));

    m_shape.back().setPosition(m_position);
}
Exemple #21
0
bool TLFFaceImageDescriptor::CreateTriangles(int depth)
{
    if (this->IsEmpty())
        return false;

    for (int i = 0; i < 32; i++)
    {
        if (this->m_Triangles[i] != NULL)
        {
            delete this->m_Triangles[i];
            this->m_Triangles[i] = NULL;
        }
    }
    this->m_List.Clear();
  //  FILE* f = fopen("index.txt", "r+t");
    int d = depth;
//    int k,i2,i3;

    for (int i = 0; i < 22;i++)
    {
    //    fscanf(f,"%d\t%d\t%d\t%d\n", &k,&i1,&i2,&i3);
        m_tindex[i] = gtri[i];
        m_Triangles[i] = new TLFTriangle(m_points[gtri[i].v1], m_points[gtri[i].v2], m_points[gtri[i].v3], NULL, d, i);
        AddTriangle(m_Triangles[i]);
    }
/*
    m_Triangles[0] = new TLFTriangle(m_points[0], m_points[18], m_points[19], NULL, d, 0);
    fprintf(f,"%d\t%d\t%d\t%d\n", 0,0,18,19);
    m_Triangles[1] = new TLFTriangle(m_points[0], m_points[19], m_points[1], NULL, d, 1);
    fprintf(f,"%d\t%d\t%d\t%d\n", 1,0,19,1);
    m_Triangles[2] = new TLFTriangle(m_points[1], m_points[19], m_points[20], NULL, d, 2);
    fprintf(f,"%d\t%d\t%d\t%d\n", 2,1,19,20);
    m_Triangles[3] = new TLFTriangle(m_points[2], m_points[21], m_points[22], NULL, d, 3);
    fprintf(f,"%d\t%d\t%d\t%d\n", 3,2,21,22);
    m_Triangles[4] = new TLFTriangle(m_points[2], m_points[22], m_points[3], NULL, d, 4);
    fprintf(f,"%d\t%d\t%d\t%d\n", 4,2,22,3);
    m_Triangles[5] = new TLFTriangle(m_points[3], m_points[22], m_points[23], NULL, d, 5);
    fprintf(f,"%d\t%d\t%d\t%d\n", 5,3,22,23);
    m_Triangles[6] = new TLFTriangle(m_points[16], m_points[6], m_points[8], NULL, d, 6);
    fprintf(f,"%d\t%d\t%d\t%d\n", 6,16,6,8);
    m_Triangles[7] = new TLFTriangle(m_points[20], m_points[4], m_points[5], NULL, d, 7);
    fprintf(f,"%d\t%d\t%d\t%d\n", 7,20,4,5);
    m_Triangles[8] = new TLFTriangle(m_points[20], m_points[5], m_points[21], NULL, d, 8);
    fprintf(f,"%d\t%d\t%d\t%d\n", 8,20,5,21);
    m_Triangles[9] = new TLFTriangle(m_points[21], m_points[5], m_points[6], NULL, d, 9);
    fprintf(f,"%d\t%d\t%d\t%d\n", 9,21,5,6);
    m_Triangles[10] = new TLFTriangle(m_points[10], m_points[7], m_points[4], NULL, d, 10);
    fprintf(f,"%d\t%d\t%d\t%d\n", 10,10,7,4);
    m_Triangles[11] = new TLFTriangle(m_points[7], m_points[4], m_points[5], NULL, d, 11);
    fprintf(f,"%d\t%d\t%d\t%d\n", 11,7,4,5);
    m_Triangles[12] = new TLFTriangle(m_points[7], m_points[5], m_points[8], NULL, d, 12);
    fprintf(f,"%d\t%d\t%d\t%d\n", 12,7,5,8);
    m_Triangles[13] = new TLFTriangle(m_points[8], m_points[5], m_points[6], NULL, d, 13);
    fprintf(f,"%d\t%d\t%d\t%d\n", 13,8,5,6);
    m_Triangles[14] = new TLFTriangle(m_points[7], m_points[13], m_points[8], NULL, d, 14);
    fprintf(f,"%d\t%d\t%d\t%d\n", 14,7,13,8);
    m_Triangles[15] = new TLFTriangle(m_points[1], m_points[20], m_points[4], NULL, d, 15);
    fprintf(f,"%d\t%d\t%d\t%d\n", 15,1,20,4);
    m_Triangles[16] = new TLFTriangle(m_points[2], m_points[21], m_points[6], NULL, d, 16);
    fprintf(f,"%d\t%d\t%d\t%d\n", 16,2,21,6);
    m_Triangles[17] = new TLFTriangle(m_points[0], m_points[1], m_points[4], NULL, d, 17);
    fprintf(f,"%d\t%d\t%d\t%d\n", 17,0,1,4);
    m_Triangles[18] = new TLFTriangle(m_points[2], m_points[3], m_points[6], NULL, d, 18);
    fprintf(f,"%d\t%d\t%d\t%d\n", 18,2,3,6);
    m_Triangles[19] = new TLFTriangle(m_points[23], m_points[3], m_points[17], NULL, d, 19);
    fprintf(f,"%d\t%d\t%d\t%d\n", 19,23,3,17);
    m_Triangles[20] = new TLFTriangle(m_points[3], m_points[6], m_points[17], NULL, d, 20);
    fprintf(f,"%d\t%d\t%d\t%d\n", 20,3,6,17);
    m_Triangles[21] = new TLFTriangle(m_points[17], m_points[6], m_points[16], NULL, d, 21);
    fprintf(f,"%d\t%d\t%d\t%d\n", 21,17,6,16);
    m_Triangles[22] = new TLFTriangle(m_points[16], m_points[8], m_points[15], NULL, d, 22);
    fprintf(f,"%d\t%d\t%d\t%d\n", 2,16,8,15);
    m_Triangles[23] = new TLFTriangle(m_points[15], m_points[8], m_points[14], NULL, d, 23);
    fprintf(f,"%d\t%d\t%d\t%d\n", 23,15,8,14);
    m_Triangles[24] = new TLFTriangle(m_points[13], m_points[8], m_points[14], NULL, d, 24);
    fprintf(f,"%d\t%d\t%d\t%d\n", 24,13,8,14);
    m_Triangles[25] = new TLFTriangle(m_points[7], m_points[12], m_points[13], NULL, d, 25);
    fprintf(f,"%d\t%d\t%d\t%d\n", 25,7,12,13);
    m_Triangles[26] = new TLFTriangle(m_points[7], m_points[12], m_points[13], NULL, d, 26);
    fprintf(f,"%d\t%d\t%d\t%d\n", 26,7,12,13);
    m_Triangles[27] = new TLFTriangle(m_points[7], m_points[11], m_points[12], NULL, d, 27);
    fprintf(f,"%d\t%d\t%d\t%d\n", 27,7,11,12);
    m_Triangles[28] = new TLFTriangle(m_points[7], m_points[10], m_points[11], NULL, d, 28);
    fprintf(f,"%d\t%d\t%d\t%d\n", 28,7,10,11);
    m_Triangles[29] = new TLFTriangle(m_points[4], m_points[10], m_points[9], NULL, d, 29);
    fprintf(f,"%d\t%d\t%d\t%d\n", 29,4,10,9);
    m_Triangles[30] = new TLFTriangle(m_points[4], m_points[9], m_points[0], NULL, d, 30);
    fprintf(f,"%d\t%d\t%d\t%d\n", 30,4,9,0);
    m_Triangles[31] = new TLFTriangle(m_points[18], m_points[0], m_points[9], NULL, d, 31);
    fprintf(f,"%d\t%d\t%d\t%d\n", 31,18,0,9);
    fclose(f);

    f = fopen("index22.txt", "r+t");
    for (int i = 0; i < 32; i++)
    {
        fscanf(f, "%d\t%d\t%d\t%d\n", &m_tindex[i].idx, &m_tindex[i].v1, &m_tindex[i].v2, &m_tindex[i].v3);
    }
*/
 //   fclose(f);
    return true;
}
Exemple #22
0
void CMesh::CollapseEdge(TEdge *pEdge, bool bRemoveSecond)
{
  TVertex *p2Remain, *p2Remove;
  CArray<TVertex *> arrInvalVerts;
  TEdgeHash hashEvaluatedEdges;
  int i, iTri;
  ASSERT(pEdge);
  p2Remain = pEdge->m_pVertices[!bRemoveSecond];
  p2Remove = pEdge->m_pVertices[bRemoveSecond];

  for (i = 0; i < p2Remove->m_pTriangles->m_iCount; i++) {
    TVertex *pOther0, *pOther1;
    p2Remove->m_pTriangles->At(i)->GetOtherVertices(p2Remove, pOther0, pOther1);
    arrInvalVerts.Append(pOther0);
    arrInvalVerts.Append(pOther1);
  }

  ASSERT(pEdge->m_pTriangles[0]);
  // Order of removal is important, if we remove the first one first and it's the only one left, 
  // the edge will get deleted and the attempt to remove the other one will crash
  RemoveTriangle(pEdge->m_pTriangles[1]); 
  RemoveTriangle(pEdge->m_pTriangles[0]);
  ASSERT(!GetEdge(p2Remain, p2Remove));

/*
#ifdef _DEBUG
  {
    for (int i = 0; i < p2Remove->m_pTriangles->m_iCount; i++) {
      TVertex *pVert0, *pVert1;
      TTriangle *pTri = p2Remove->m_pTriangles->At(i);
      pTri->GetOtherVertices(p2Remove, pVert0, pVert1);
      TTriangle kTestTri(p2Remain, pVert0, pVert1);
      TTriangleHash::TIter it = m_hashTriangles.Find(&kTestTri);
      ASSERT(!it);
      if (it)
        TEdge *pE = GetEdge(pVert0, pVert1);
    }
  }
#endif
*/

  while (p2Remove->m_pTriangles->m_iCount > 0) {
    TVertex *pVert0, *pVert1;
    TTriangle *pTri = p2Remove->m_pTriangles->At(p2Remove->m_pTriangles->m_iCount - 1);
    pTri->GetOtherVertices(p2Remove, pVert0, pVert1);
    int iTriIndex = pTri->m_iIndex;
    RemoveTriangle(pTri);
    AddTriangle(p2Remain, pVert0, pVert1, iTriIndex);
  }
  m_hashVertices.RemoveValue(p2Remove);
  delete p2Remove;

  for (i = 0; i < arrInvalVerts.m_iCount; i++) {
    for (iTri = 0; iTri < arrInvalVerts[i]->m_pTriangles->m_iCount; iTri++) {
      TVertex *pOther[2];
      TEdge *pEdge;
      int iVert;
      arrInvalVerts[i]->m_pTriangles->At(iTri)->GetOtherVertices(arrInvalVerts[i], pOther[0], pOther[1]);
      for (iVert = 0; iVert < 2; iVert++) {
        pEdge = GetEdge(arrInvalVerts[i], pOther[iVert]);
        if (hashEvaluatedEdges.Find(pEdge))
          continue;
        EvaluateEdge(pEdge, false);
        EvaluateEdge(pEdge, true);
        hashEvaluatedEdges.Add(pEdge);
      }
    }
  }
}
void Model::AddSolidColorBox(float x1, float y1, float z1,
    float x2, float y2, float z2,
    Color c)
{
    float t;

    if(x1 > x2)
    {
        t = x1;
        x1 = x2;
        x2 = t;
    }
    if(y1 > y2)
    {
        t = y1;
        y1 = y2;
        y2 = t;
    }
    if(z1 > z2)
    {
        t = z1;
        z1 = z2;
        z2 = t;
    }

    // Cube vertices and their normals.
    Vector3f CubeVertices[][3] =
    {
        Vector3f(x1, y2, z1), Vector3f(z1, x1), Vector3f(0.0f, 1.0f, 0.0f),
        Vector3f(x2, y2, z1), Vector3f(z1, x2), Vector3f(0.0f, 1.0f, 0.0f),
        Vector3f(x2, y2, z2), Vector3f(z2, x2), Vector3f(0.0f, 1.0f, 0.0f),
        Vector3f(x1, y2, z2), Vector3f(z2, x1), Vector3f(0.0f, 1.0f, 0.0f),

        Vector3f(x1, y1, z1), Vector3f(z1, x1), Vector3f(0.0f, -1.0f, 0.0f),
        Vector3f(x2, y1, z1), Vector3f(z1, x2), Vector3f(0.0f, -1.0f, 0.0f),
        Vector3f(x2, y1, z2), Vector3f(z2, x2), Vector3f(0.0f, -1.0f, 0.0f),
        Vector3f(x1, y1, z2), Vector3f(z2, x1), Vector3f(0.0f, -1.0f, 0.0f),

        Vector3f(x1, y1, z2), Vector3f(z2, y1), Vector3f(-1.0f, 0.0f, 0.0f),
        Vector3f(x1, y1, z1), Vector3f(z1, y1), Vector3f(-1.0f, 0.0f, 0.0f),
        Vector3f(x1, y2, z1), Vector3f(z1, y2), Vector3f(-1.0f, 0.0f, 0.0f),
        Vector3f(x1, y2, z2), Vector3f(z2, y2), Vector3f(-1.0f, 0.0f, 0.0f),

        Vector3f(x2, y1, z2), Vector3f(z2, y1), Vector3f(1.0f, 0.0f, 0.0f),
        Vector3f(x2, y1, z1), Vector3f(z1, y1), Vector3f(1.0f, 0.0f, 0.0f),
        Vector3f(x2, y2, z1), Vector3f(z1, y2), Vector3f(1.0f, 0.0f, 0.0f),
        Vector3f(x2, y2, z2), Vector3f(z2, y2), Vector3f(1.0f, 0.0f, 0.0f),

        Vector3f(x1, y1, z1), Vector3f(x1, y1), Vector3f(0.0f, 0.0f, -1.0f),
        Vector3f(x2, y1, z1), Vector3f(x2, y1), Vector3f(0.0f, 0.0f, -1.0f),
        Vector3f(x2, y2, z1), Vector3f(x2, y2), Vector3f(0.0f, 0.0f, -1.0f),
        Vector3f(x1, y2, z1), Vector3f(x1, y2), Vector3f(0.0f, 0.0f, -1.0f),

        Vector3f(x1, y1, z2), Vector3f(x1, y1), Vector3f(0.0f, 0.0f, 1.0f),
        Vector3f(x2, y1, z2), Vector3f(x2, y1), Vector3f(0.0f, 0.0f, 1.0f),
        Vector3f(x2, y2, z2), Vector3f(x2, y2), Vector3f(0.0f, 0.0f, 1.0f),
        Vector3f(x1, y2, z2), Vector3f(x1, y2), Vector3f(0.0f, 0.0f, 1.0f)
    };


    uint16_t startIndex = GetNextVertexIndex();

    enum
    {
        CubeVertexCount = sizeof(CubeVertices) / sizeof(CubeVertices[0]),
        CubeIndexCount  = sizeof(CubeIndices) / sizeof(CubeIndices[0])
    };

    for(int v = 0; v < CubeVertexCount; v++)
    {
        AddVertex(Vertex(CubeVertices[v][0], c, CubeVertices[v][1].x, CubeVertices[v][1].y, CubeVertices[v][2]));
    }

    // Renumber indices
    for(int i = 0; i < CubeIndexCount / 3; i++)
    {
        AddTriangle(CubeIndices[i * 3] + startIndex,
            CubeIndices[i * 3 + 1] + startIndex,
            CubeIndices[i * 3 + 2] + startIndex);
    }
}
Exemple #24
0
int LoadSU2Elements(FILE *FilHdl, Mesh *Msh)
{
	int  ref=1;
	char   str[1024];

	int iMark, NbrMark=0, CptElt;
	int iElt, NbrElt=0, typ, is[8], swi[8], buf, s, idx, res;

  Msh->NbrTri = Msh->NbrTet = Msh->NbrHex =  Msh->NbrEfr = Msh->NbrQua = Msh->NbrPyr = Msh->NbrPri = 0;
  
  rewind(FilHdl);
  do
	{
		res = fscanf(FilHdl, "%s", str);
	}while( (res != EOF) && strcmp(str, "NELEM=") );
	
	fscanf(FilHdl, "%d", &NbrElt);
  fgets (str, sizeof str, FilHdl);
	
  idx=0;
	
  for (iElt=0; iElt<NbrElt; iElt++) {
    fscanf(FilHdl, "%d", &typ);

    if ( typ == SU2_TRIANGLE ) {
      
      for (s=0; s<3; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
				if ( swi[s] > Msh->NbrVer ) {
					printf("  ## ERROR LoadSU2Elements: vertex out of bound (vid=%d)\n", swi[s]);
					return 0;
				}
      }

			fscanf(FilHdl, "%d", &buf);
      
      Msh->NbrTri++;

			if ( Msh->NbrTri > Msh->MaxNbrTri ) {
				printf("  ## ERROR LoadSU2Elements: triangle out of bound (tid=%d, max=%d)\n", Msh->NbrTri, Msh->MaxNbrTri);
				return 0;
			}
			
			switchTriIdx(swi,is);
      AddTriangle(Msh,Msh->NbrTri,is,ref);

    }
    else if ( typ == SU2_TETRAHEDRAL ) {
      for (s=0; s<4; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
      }
			
      idx++;
			Msh->NbrTet++;
			
			if ( Msh->NbrTet > Msh->MaxNbrTet ) {
				printf("  ## ERROR LoadSU2Elements: tetra out of bound (tid=%d)\n", Msh->NbrTet);
				return 0;
			}
			
			switchTetIdx(swi,is);
			AddTetrahedron(Msh,Msh->NbrTet,is,ref);
    }
    else if ( typ == SU2_HEXAHEDRAL ) {
      for (s=0; s<8; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
      }
      fscanf(FilHdl, "%d", &idx);
      Msh->NbrHex++;
			
			if ( Msh->NbrHex > Msh->MaxNbrHex ) {
				printf("  ## ERROR LoadSU2Elements: hexahedron out of bound (hid=%d)\n", Msh->NbrHex);
				return 0;
			}
			
			switchHexIdx(swi,is);
			AddHexahedron(Msh,Msh->NbrHex,is,ref);
    }
    else if ( typ == SU2_PYRAMID ) {
      for (s=0; s<5; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
				is[s] = buf+1;
      }
      fscanf(FilHdl, "%d", &idx);
			Msh->NbrPyr++;
    
			if ( Msh->NbrPyr > Msh->MaxNbrPyr ) {
				printf("  ## ERROR LoadSU2Elements: pyramid out of bound (id=%d)\n", Msh->NbrPyr);
				return 0;
			}
    
			//switchPyrIdx(swi,is);
      AddPyramid(Msh,Msh->NbrPyr,is,ref);
			
			int i=Msh->NbrPyr;
			if ( i== 1 )
				printf("PYR %d : %d %d %d %d %d\n", i, Msh->Pyr[i][0], Msh->Pyr[i][1], Msh->Pyr[i][2], Msh->Pyr[i][3], Msh->Pyr[i][4]);
    
    }
    else if ( typ == SU2_RECTANGLE ) {
      for (s=0; s<4; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
      }
			
      Msh->NbrQua++;
    
			if ( Msh->NbrQua > Msh->MaxNbrQua ) {
				printf("  ## ERROR LoadSU2Elements: quad out of bound (id=%d)\n", Msh->NbrQua);
				return 0;
			}
    
			switchQuaIdx(swi,is);
      //DefaultQuadrilateral(Msh,Msh->NbrQua,&Msh->Qua[NbrQua],is,ref);
			AddQuadrilateral(Msh,Msh->NbrQua,is,ref);
    }
    else if ( typ == SU2_WEDGE ) {
			
      for (s=0; s<6; s++) {
        fscanf(FilHdl, "%d", &buf);
        swi[s] = buf+1;
				is[s] = buf+1;
      }
      fscanf(FilHdl, "%d", &idx);
     	Msh->NbrPri++;
    
			if ( Msh->NbrPri > Msh->MaxNbrPri ) {
				printf("  ## ERROR LoadSU2Elements: prism out of bound (id=%d)\n", Msh->NbrPri);
				return 0;
			}
    
			//switchPriIdx(swi,is);
      //DefaultPrism(Msh,Msh->NbrPri,&Msh->Pri[NbrPri],is,ref);
			AddPrism(Msh,Msh->NbrPri,is,ref);
    }
    //else if ( typ == SU2_LINE ) {
    //  for (s=0; s<2; s++) {
    //    fscanf(FilHdl, "%d", &buf);
    //    swi[s] = buf+1;
    //  }
		//	NbrEfr++;
		//				
		//	if ( NbrEfr > Msh->MaxNbrEfr ) {
		//		printf("  ## ERROR LoadSU2Elements: boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr );
		//		return 0;
		//	}
    //
    //   DefaultBdyEdge(Msh,Msh->NbrEfr,&Msh->Efr[NbrEfr],swi,ref);  
    //}
    //else if ( typ == SU2_LINEP2 ) {
    //  
    //  fscanf(FilHdl, "%d %d %d", &swi[0], &swi[1], &swi[2]);
		//	for (s=0; s<3; s++) 
    //  	swi[s]++;
    //
		//	NbrP2Efr++;
		//	
		//	if ( NbrP2Efr > Msh->MaxNbrP2Efr ) {
		//		printf("  ## ERROR LoadSU2Elements: P2 boundary edge out of bound (id=%d, max=%d)\n", NbrP2Efr,Msh->MaxNbrP2Efr );
		//		return 0;
		//	}
		//	
		//	switchP2EfrIdx(swi,is);
		//	NbrEfr++;
		//	if ( NbrEfr > Msh->MaxNbrEfr ) {
		//		printf("  ## ERROR LoadSU2Elements: P1 boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr );
		//		return 0;
		//	}
    //  DefaultBdyEdge(Msh,NbrEfr,&Msh->Efr[NbrEfr],is,ref);
    //  DefaultP2BdyEdge(Msh,NbrP2Efr,&Msh->Efr[NbrP2Efr],is[2],NbrEfr,&Msh->Efr[NbrEfr]);  
    //}
		//else if ( typ == SU2_TRIANGLEP2 ) {
    //
    //  //fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[3],&swi[1],&swi[4],&swi[2],&swi[5]);
		//	//fscanf(FilHdl, "%d %d %d %d %d %d", &swi[3],&swi[0],&swi[4],&swi[1],&swi[5],&swi[2]);
		//	//fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[1],&swi[2],&swi[3],&swi[4],&swi[5]);
		//	fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[3],&swi[1],&swi[5],&swi[4],&swi[2]);
		//	for (s=0; s<6; s++)	
    //  	swi[s]++;
    //  
		//	
		//	NbrP2Tri++;
    //
		//	if ( NbrP2Tri > Msh->MaxNbrP2Tri ) {
		//		printf("  ## ERROR LoadSU2Elements: P2 triangle out of bound (id=%d, max=%d)\n", NbrP2Tri,Msh->MaxNbrP2Tri );
		//		return 0;
		//	}
		//	
		//	switchP2TriIdx(swi,is);
		//	
		//	
		//	NbrTri++;
		//	
		//	if ( NbrTri > Msh->MaxNbrTri ) {
		//		printf("  ## ERROR LoadSU2Elements: P1 triangle out of bound (id=%d, max=%d)\n", NbrTri,Msh->MaxNbrTri );
		//		return 0;
		//	}
		//	
    //  DefaultTriangle(Msh,NbrTri,&Msh->Tri[NbrTri],is,ref);
    //  DefaultP2Triangle(Msh,NbrP2Tri,&Msh->P2Tri[NbrP2Tri],&is[3],NbrTri,&Msh->Tri[NbrTri]);
    //
    //}
	  //
		else {
			printf("  ## ERROR : Unknown element type %d\n", typ);
			return 0;
		}
    
    fgets (str, sizeof str, FilHdl); 

  }//for iElt

	//--- Read boundary elements
	
	//rewind(FilHdl);
  //do
	//{
	//	res = fscanf(FilHdl, "%s", str);
	//}while( (res != EOF) && strcmp(str, "NMARK=") );
	//fscanf(FilHdl, "%d", &NbrMark);
	//fgets (str, sizeof str, FilHdl); 
	
	rewind(FilHdl);
 	NbrMark = GetSU2KeywordValue (FilHdl, "NMARK=");
		
  for (iMark=1; iMark<=NbrMark; iMark++) {
		
		GetSU2KeywordValueStr (FilHdl, "MARKER_TAG=", str);
		//printf("      Tag %s becomes reference %d\n", str, iMark);
		
		
		if ( !strcmp(str,"SEND_RECEIVE") ) {
			printf("      Tag %s was ignored.\n", str);
			continue;
		}
		
		CptElt = GetSU2KeywordValue (FilHdl, "MARKER_ELEMS=");
		
    for (iElt=0; iElt<CptElt; iElt++) {
		
      fscanf(FilHdl, "%d", &typ);
      
      if ( typ == SU2_TRIANGLE ) {
        for (s=0; s<3; s++) {
          fscanf(FilHdl, "%d", &buf);
          swi[s] = buf+1;
        }

	      Msh->NbrTri++;

				if ( Msh->NbrTri > Msh->MaxNbrTri ) {
					printf("  ## ERROR LoadSU2Elements: triangle out of bound (tid=%d, max=%d)\n", Msh->NbrTri, Msh->MaxNbrTri);
					return 0;
				}

				switchTriIdx(swi,is);
	      AddTriangle(Msh,Msh->NbrTri,is,iMark);
      }
      else if ( typ == SU2_RECTANGLE ) {
								
	      for (s=0; s<4; s++) {
	        fscanf(FilHdl, "%d", &buf);
	        swi[s] = buf+1;
	      }
				
	      Msh->NbrQua++;

				if ( Msh->NbrQua > Msh->MaxNbrQua ) {
					printf("  ## ERROR LoadSU2Elements: quad out of bound (id=%d)\n", Msh->NbrQua);
					return 0;
				}

				switchQuaIdx(swi,is);
	      //DefaultQuadrilateral(Msh,Msh->NbrQua,&Msh->Qua[NbrQua],is,iMark);
				AddQuadrilateral(Msh,Msh->NbrQua,is,iMark);
      }
      else if ( typ == SU2_LINE ) {
	      for (s=0; s<2; s++) {
	        fscanf(FilHdl, "%d", &buf);
	        swi[s] = buf+1;
	      }
				Msh->NbrEfr++;
				
				if ( Msh->NbrEfr > Msh->MaxNbrEfr ) {
					printf("  ## ERROR LoadSU2Elements: boundary edge out of bound (id=%d, max=%d)\n", Msh->NbrEfr, Msh->MaxNbrEfr);
					return 0;
				}
				
	      //DefaultBdyEdge(Msh,Msh->NbrEfr,&Msh->Efr[NbrEfr],swi,iMark);
				AddEdge(Msh,Msh->NbrEfr,swi,iMark);
      }
	    //else if ( typ == SU2_LINEP2 ) {
      //
	    //  fscanf(FilHdl, "%d %d %d", &swi[0], &swi[2], &swi[1]);
			//	for (s=0; s<3; s++) 
	    //  	swi[s]++;
      //
			//	NbrP2Efr++;
			//	if ( NbrP2Efr > Msh->MaxNbrP2Efr ) {
			//		printf("  ## ERROR LoadSU2Elements: P2 boundary edge out of bound (id=%d, max=%d)\n", NbrP2Efr,Msh->MaxNbrP2Efr );
			//		return 0;
			//	}
			//	
			//	switchP2EfrIdx(swi,is);
			//	
			//	NbrEfr++;
			//	if ( NbrEfr > Msh->MaxNbrEfr ) {
			//		printf("  ## ERROR LoadSU2Elements: P1 boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr );
			//		return 0;
			//	}
			//	
	    //  DefaultBdyEdge(Msh,NbrEfr,&Msh->Efr[NbrEfr],is,iMark);
	    //  DefaultP2BdyEdge(Msh,NbrP2Efr,&Msh->Efr[NbrP2Efr],is[2],NbrEfr,&Msh->Efr[NbrEfr]);  
	    //}
			else {
				printf("  ## ERROR : Unknown element type %d\n", typ);
				return 0;
			}
			fgets (str, sizeof str, FilHdl);
			
    }
	}
  
	
	
	return 1;
}
Exemple #25
0
void CXMLParser::TraverseGetInformation(TiXmlElement* root)
{
	TiXmlElement *childroot=root->FirstChildElement();
	while(childroot!=NULL)
	{
		if(strcmp(childroot->Value(),"VertexBuffer")==0)
		{
			char *pointStr=(char *)childroot->FirstChildElement()->GetText();
			AddPoint(pointStr);
			char *normalStr=(char *)childroot->FirstChildElement()->NextSiblingElement()->GetText();
			AddNormals(normalStr);
		}
		else if(strcmp(childroot->Value(),"Faces")==0)
		{
			TiXmlElement *triangleElem=childroot->FirstChildElement();
			while (triangleElem!=NULL)
			{
				if(strcmp(triangleElem->Value(),"Face")==0)
				{
					TiXmlAttribute *triangleAttribute=triangleElem->FirstAttribute();
					while(triangleAttribute!=NULL)
					{
						if(strcmp(triangleAttribute->Name(),"triangles")==0)
						{
							char *triangleStr=(char *)triangleAttribute->Value();
							if(IsTriangleStrWithSplit(triangleStr)==true)
							{
								AddTriangle(triangleStr);
							}
							else
							{
								AddIdTriangle(triangleStr);
							}
						}
						if(strcmp(triangleAttribute->Name(),"strips")==0)
						{
							char *stripStr=(char *)triangleAttribute->Value();
							AddStrips(stripStr);
						}
						if(strcmp(triangleAttribute->Name(),"fans")==0)
						{
							char *fanStr=(char *)triangleAttribute->Value();
							AddFans(fanStr);
						}
						triangleAttribute=triangleAttribute->Next();
					}
				}
				triangleElem=triangleElem->NextSiblingElement();
			}
		}
		else if(strcmp(childroot->Value(),"Edges")==0)
		{
			TiXmlElement *polyElem=childroot->FirstChildElement();
			while(polyElem!=NULL)
			{
				if(strcmp(polyElem->Value(),"Polyline")==0)
				{
					char *polyStr=(char *)polyElem->FirstAttribute()->Value();
					AddPoly(polyStr);
				}
				polyElem=polyElem->NextSiblingElement();
			}
		}
		/*else if (strcmp(childroot->Value(),"PolygonalLOD")==0)
		{
			TiXmlElement *triangleElem=childroot->FirstChildElement()->FirstChildElement();
			while (triangleElem!=NULL)
			{
				if(strcmp(triangleElem->Value(),"Face")==0)
				{
					TiXmlAttribute *triangleAttribute=triangleElem->FirstAttribute();
					while(triangleAttribute!=NULL)
					{
						if(strcmp(triangleAttribute->Name(),"triangles")==0)
						{
							char *triangleStr=(char *)triangleAttribute->Value();
							if(IsTriangleStrWithSplit(triangleStr)==true)
							{
								AddTriangle(triangleStr);
							}
							else
							{
								AddIdTriangle(triangleStr);
							}
						}
						if(strcmp(triangleAttribute->Name(),"strips")==0)
						{
							char *stripStr=(char *)triangleAttribute->Value();
							AddStrips(stripStr);
						}
						if(strcmp(triangleAttribute->Name(),"fans")==0)
						{
							char *fanStr=(char *)triangleAttribute->Value();
							AddFans(fanStr);
						}
						triangleAttribute=triangleAttribute->Next();
					}
				}
				triangleElem=triangleElem->NextSiblingElement();
			}
		}*/
		childroot=childroot->NextSiblingElement();
	}
}
Exemple #26
0
void DebugRenderer::AddTriangle(const Vector3& v1, const Vector3& v2, const Vector3& v3, const Color& color, bool depthTest)
{
    AddTriangle(v1, v2, v3, color.ToUInt(), depthTest);
}
Exemple #27
0
void DebugRenderer::AddPolygon(const Vector3& v1, const Vector3& v2, const Vector3& v3, const Vector3& v4, unsigned color, bool depthTest)
{
    AddTriangle(v1, v2, v3, color, depthTest);
    AddTriangle(v3, v4, v1, color, depthTest);
}
void Graphics_LayerRenderer(bool isOpenGLMode)
{
	StartGraphicsTest();
	SetGLEnable(isOpenGLMode);

	asd::Log* log = asd::Log_Imp::Create(u"graphics.html", u"レイヤー");

	auto window = asd::Window_Imp::Create(640, 480, asd::ToAString(u"レイヤー").c_str(), log, false, asd::WindowPositionType::Default, isOpenGLMode ? asd::GraphicsDeviceType::OpenGL : asd::GraphicsDeviceType::DirectX11, asd::ColorSpaceType::LinearSpace, false);
	ASSERT_TRUE(window != nullptr);

	auto synchronizer = std::make_shared<asd::Synchronizer>();
	auto file = asd::File_Imp::Create(synchronizer);
	ASSERT_TRUE(file != nullptr);

	asd::GraphicsOption go;
	go.IsFullScreen = false;
	go.IsReloadingEnabled = false;
	go.ColorSpace = asd::ColorSpaceType::LinearSpace;
	go.GraphicsDevice = isOpenGLMode ? asd::GraphicsDeviceType::OpenGL : asd::GraphicsDeviceType::DirectX11;
	auto graphics = asd::Graphics_Imp::Create(window, isOpenGLMode ? asd::GraphicsDeviceType::OpenGL : asd::GraphicsDeviceType::DirectX11, log, file, go);
	ASSERT_TRUE(graphics != nullptr);

	auto renderer = new asd::LayerRenderer(graphics);
	ASSERT_TRUE(renderer != nullptr);

	auto texture = graphics->CreateTexture2D(asd::ToAString(u"Data/Texture/Sample1.png").c_str());
	ASSERT_TRUE(texture != nullptr);

	int32_t time = 0;
	while (window->DoEvent())
	{
		graphics->Begin();
		graphics->Clear(true, false, asd::Color(0, 0, 0, 255));

		{
			asd::Vector2DF lpos[4];
			lpos[0].X = 0;
			lpos[0].Y = 0;
			lpos[1].X = 600;
			lpos[1].Y = 0;
			lpos[2].X = 640;
			lpos[2].Y = 480;
			lpos[3].X = 0;
			lpos[3].Y = 440;
			renderer->SetWindowSize(asd::Vector2DI(640, 480));
			renderer->SetTexture(texture.get());
			renderer->SetLayerPosition(lpos);
		}

		{
			asd::Vector2DF positions[4];
			asd::Color colors[4];
			asd::Vector2DF uvs[4];

			colors[0] = asd::Color(255, 255, 255, 255);
			colors[1] = asd::Color(255, 255, 255, 255);
			colors[2] = asd::Color(255, 255, 255, 255);

			positions[0].X = 0.0f;
			positions[0].Y = 0.0f;
			positions[1].X = 1.0f;
			positions[1].Y = 0.0f;
			positions[2].X = 1.0f;
			positions[2].Y = 1.0f;


			uvs[0].X = 0;
			uvs[0].Y = 0;
			uvs[1].X = 1;
			uvs[1].Y = 0;
			uvs[2].X = 1;
			uvs[2].Y = 1;

			renderer->AddTriangle(positions, colors, uvs);
		}

		{
			asd::Vector2DF positions[4];
			asd::Color colors[4];
			asd::Vector2DF uvs[4];

			colors[0] = asd::Color(255, 255, 255, 255);
			colors[1] = asd::Color(255, 255, 255, 255);
			colors[2] = asd::Color(255, 255, 255, 255);

			positions[0].X = 0.0f;
			positions[0].Y = 0.0f;
			positions[1].X = 0.5f;
			positions[1].Y = 1.0f;
			positions[2].X = 0.0f;
			positions[2].Y = 0.5f;

			uvs[0].X = 0;
			uvs[0].Y = 0;
			uvs[1].X = 1;
			uvs[1].Y = 1;
			uvs[2].X = 0;
			uvs[2].Y = 1;

			renderer->AddTriangle(positions, colors, uvs);
		}
		

		renderer->DrawCache();
		renderer->ClearCache();

		graphics->Present();

		graphics->End();

		if (time == 10)
		{
			SAVE_SCREEN_SHOT(graphics, 0);
		}

		if (time == 11)
		{
			window->Close();
		}
		time++;
	}

	texture.reset();
	renderer->Release();
	graphics->Release();
	file->Release();
	window->Release();
	delete log;
}
		CShpereMeshNode::CShpereMeshNode(float fRadius, uint uSlices, uint uStacks)
			:m_fRadius(fRadius), m_uSlices(uSlices), m_uStacks(uStacks)
		{
			m_uVertNum = uSlices * uStacks * 6;
			float drho = (float)(3.141592653589) / (float)uSlices;
			float dtheta = 2.0f * (float)(3.141592653589) / (float)uSlices;
			float ds = 1.0f / (float)uSlices;
			float dt = 1.0f / (float)uSlices;
			float t = 1.0f;
			float s = 0.0f;
			uint i, j;     // Looping variables

			for (i = 0; i < uSlices; i++)
			{
				float rho = (float)i * drho;
				float srho = (float)(sin(rho));
				float crho = (float)(cos(rho));
				float srhodrho = (float)(sin(rho + drho));
				float crhodrho = (float)(cos(rho + drho));

				s = 0.0f;
				CVector3 vVertex[4];
				CVector3 vNormal[4];
				CVector2 vTexture[4];

				for (j = 0; j < uSlices; j++)
				{
					float theta = (j == uSlices) ? 0.0f : j * dtheta;
					float stheta = (float)(-sin(theta));
					float ctheta = (float)(cos(theta));

					float x = stheta * srho;
					float y = ctheta * srho;
					float z = crho;

					vTexture[0].x = s;
					vTexture[0].y = t;
					vNormal[0].x = x;
					vNormal[0].y = y;
					vNormal[0].z = z;
					vVertex[0].x = x * fRadius;
					vVertex[0].y = y * fRadius;
					vVertex[0].z = z * fRadius;

					x = stheta * srhodrho;
					y = ctheta * srhodrho;
					z = crhodrho;

					vTexture[1].x = s;
					vTexture[1].y = t - dt;
					vNormal[1].x = x;
					vNormal[1].y = y;
					vNormal[1].z = z;
					vVertex[1].x = x * fRadius;
					vVertex[1].y = y * fRadius;
					vVertex[1].z = z * fRadius;


					theta = ((j + 1) == uSlices) ? 0.0f : (j + 1) * dtheta;
					stheta = (float)(-sin(theta));
					ctheta = (float)(cos(theta));

					x = stheta * srho;
					y = ctheta * srho;
					z = crho;

					s += ds;
					vTexture[2].x = s;
					vTexture[2].y = t;
					vNormal[2].x = x;
					vNormal[2].y = y;
					vNormal[2].z = z;
					vVertex[2].x = x * fRadius;
					vVertex[2].y = y * fRadius;
					vVertex[2].z = z * fRadius;

					x = stheta * srhodrho;
					y = ctheta * srhodrho;
					z = crhodrho;

					vTexture[3].x = s;
					vTexture[3].y = t - dt;
					vNormal[3].x = x;
					vNormal[3].y = y;
					vNormal[3].z = z;
					vVertex[3].x = x * fRadius;
					vVertex[3].y = y * fRadius;
					vVertex[3].z = z * fRadius;

					AddTriangle(vVertex, vNormal, vTexture);

					// Rearrange for next triangle
					memcpy(&vVertex[0], &vVertex[1], sizeof(CVector3));
					memcpy(&vNormal[0], &vNormal[1], sizeof(CVector3));
					memcpy(&vTexture[0], &vTexture[1], sizeof(CVector2));

					memcpy(&vVertex[1], &vVertex[3], sizeof(CVector3));
					memcpy(&vNormal[1], &vNormal[3], sizeof(CVector3));
					memcpy(&vTexture[1], &vTexture[3], sizeof(CVector2));

					AddTriangle(vVertex, vNormal, vTexture);
				}
				t -= dt;
			}
		}
Exemple #30
0
void Geometry::AddQuad(vec3 a,vec3 b,vec3 c,vec3 d)
{
	AddTriangle(a,b,c);
	AddTriangle(a,c,d);
}