void MdlObject::Optimize ()
{
	OptimizeVertices();

	// remove double linked vertices
	vector<Poly*> npl;
	for (int a=0;a<poly.size();a++) {
		Poly *pl=poly[a];

		bool finished;
		do {
			finished=true;
			for (int i=0,j=(int)pl->verts.size()-1;i<pl->verts.size();j=i++) 
				if (pl->verts[i] == pl->verts[j]) {
					pl->verts.erase (pl->verts.begin()+i);
					finished=false;
					break;
				}
		} while (!finished);

		if (pl->verts.size()>=3)
			npl.push_back(pl);
		else
			delete pl;
	}
	poly=npl;

	InvalidateRenderData();
}
void MdlObject::NormalizeNormals ()
{
	for (int a=0;a<verts.size();a++)
		verts[a].normal.normalize();
	for (int a=0;a<childs.size();a++)
		childs[a]->NormalizeNormals ();

	InvalidateRenderData();
}
void MdlObject::TransformVertices (const Matrix& transform)
{
	Matrix normalTransform = Math::CreateNormalTransform (transform);

	// transform and add the child vertices to the parent vertices list
	for (int a=0;a<verts.size();a++) 
	{
		Vertex&v = verts[a];
		Vector3 tpos, tnormal;
		
		transform.apply (&v.pos, &tpos);
		v.pos = tpos;
		normalTransform.apply (&v.normal, &tnormal);
		v.normal = tnormal;
	}
	InvalidateRenderData();
}
Exemple #4
0
void PolyMesh::MoveGeometry (PolyMesh *dst)
{
	// offset the vertex indices and move polygons
	for (unsigned int a=0;a<poly.size();a++)
	{
		Poly *pl = poly[a];

		for (unsigned int b=0;b<pl->verts.size();b++) 
			pl->verts [b] += (int)dst->verts.size();
	}
	dst->poly.insert (dst->poly.end(), poly.begin(),poly.end());
	poly.clear ();

	// insert the child vertices
	dst->verts.insert (dst->verts.end(),verts.begin(),verts.end());
	verts.clear ();

	InvalidateRenderData();
}