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(); }
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(); }