All pastes #363974 Raw Edit

Anonymous

public text v1 · immutable
#363974 ·published 2007-02-19 20:59 UTC
rendered paste body
DerivedMesh *clothModifier_do(ClothModifierData *clmd,
                                          Object *ob, DerivedMesh *dm,
                                          int useRenderParams, int isFinalCalc)
{
	int numverts = dm->getNumVerts(dm);
	int numedges = dm->getNumEdges(dm);
	int numfaces = dm->getNumFaces(dm);
	
	MEdge *medge = CDDM_get_edges(dm);
	MFace *mface = CDDM_get_faces(dm);
	int numtris = 0;
	int numquads = 0;
	int i =0;
	DerivedMesh *result = NULL;
	int tempquads = 0;
	int countquads=0;
	
	// edges = BLI_edgehash_new();
	
	// create new triangle mesh
	for(i = 0; i < numfaces; i++)
	{
		if(mface[i].v4)
			numquads++;
		else
			numtris++;	
	}
	
	// error handling
	if((numquads == numtris)&& numtris==0)
		return dm;
	
	result = CDDM_from_template(dm, numverts, numedges + numquads, (numquads * 2) + numtris);

	if(!result)
		return NULL;

	for(i = 0; i < numverts; i++) {
		MVert inMV;
		MVert *mv = CDDM_get_vert(result, i);

		dm->getVert(dm, i, &inMV);

		DM_copy_vert_data(dm, result, i, i, 1);
		*mv = inMV;
	}

	for(i = 0; i < numedges; i++) {
		MEdge inMED;
		MEdge *med = CDDM_get_edge(result, i);

		dm->getEdge(dm, i, &inMED);

		DM_copy_edge_data(dm, result, i, i, 1);
		*med = inMED;
	}

	for(i = 0; i < numquads; i++) {
		if(mface[i].v4) {
			MEdge inMED;
			MEdge *med = CDDM_get_edge(result, i+numedges);

			inMED.v1 = mface[i].v1;
			inMED.v2 = mface[i].v3;

			*med = inMED;
		}
	}

	for(i = 0; i < numtris + numquads; i++) {
		MFace inMF;
		int index4, index1;
		MFace *mf = CDDM_get_face(result, i);

		dm->getFace(dm, i, &inMF);

		// DM_copy_face_data(dm, result, i, i, 1);

		index4 = inMF.v4;
		inMF.v4 = 0;

		*mf = inMF;

		test_index_face(mf, &result->faceData, numtris + numquads + countquads, 3);

		if(mface[i].v4)
		{
			MFace *mf = CDDM_get_face(result, numtris + numquads + countquads);

			// DM_copy_face_data(dm, result, i, numtris + numquads + countquads, 1);
			
			index1 = inMF.v1;
			inMF.v1 = index4;
			inMF.v2 = index1;
			inMF.v4 = 0;

			*mf = inMF;

			test_index_face(mf, &result->faceData, numtris + numquads + countquads, 3);

			countquads++;
		}

	}

	CDDM_lower_num_verts(result, numfaces);
	CDDM_lower_num_edges(result, numedges+numquads);
	CDDM_lower_num_faces(result, (numquads * 2) + numtris);

	return result;
		
}