[Bf-blender-cvs] [f7d2e5c0caf] soc-2019-adaptive-cloth: Cloth: obj export support Done for testing purposes, export out the meshes as obj and render the obj sequence separately Current limitation: only upto 6 verts per face supported, easy to add more but mesh should stay triangulated for the most part
ishbosamiya
noreply at git.blender.org
Thu Jun 13 21:16:05 CEST 2019
Commit: f7d2e5c0caf4978941e29da086f64e5746fd92c2
Author: ishbosamiya
Date: Wed Jun 12 22:48:19 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rBf7d2e5c0caf4978941e29da086f64e5746fd92c2
Cloth: obj export support
Done for testing purposes, export out the meshes as obj and render the obj sequence separately
Current limitation: only upto 6 verts per face supported, easy to add more but mesh should stay triangulated for the most part
===================================================================
M source/blender/blenkernel/intern/cloth.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 8e91de7e71f..9609602bbb5 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -573,6 +573,100 @@ static BMVert *cloth_remeshing_split_edge_keep_triangles(BMesh *bm,
return new_v;
}
+static void cloth_remeshing_export_obj(BMesh *bm, char *file_name)
+{
+ FILE *fout = fopen(file_name, "w");
+ if (!fout) {
+ printf("File not written, couldn't find path to %s\n", file_name);
+ return;
+ }
+ printf("Writing file %s\n", file_name);
+ typedef struct Vert {
+ float co[3];
+ float no[3];
+ } Vert;
+ typedef struct UV {
+ float uv[2];
+ } UV;
+ typedef struct Face {
+ int *vi;
+ int *uv;
+ int len;
+ BMFace *bm_face;
+ } Face;
+ Vert *verts;
+ verts = MEM_mallocN(sizeof(Vert) * bm->totvert, "Verts");
+ Face *faces;
+ faces = MEM_mallocN(sizeof(Face) * bm->totface, "Faces");
+ for (int i = 0; i < bm->totface; i++) {
+ faces[i].vi = NULL;
+ faces[i].uv = NULL;
+ faces[i].len = 0;
+ faces[i].bm_face = NULL;
+ }
+ BMVert *v;
+ BMIter viter;
+ int vert_i = 0;
+ int face_i = 0;
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
+ copy_v3_v3(verts[vert_i].co, v->co);
+ copy_v3_v3(verts[vert_i].no, v->no);
+ BMFace *f;
+ BMIter fiter;
+ BM_ITER_ELEM (f, &fiter, v, BM_FACES_OF_VERT) {
+ int curr_i = face_i;
+ for (int i = 0; i < face_i; i++) {
+ if (faces[i].bm_face == f) {
+ curr_i = i;
+ break;
+ }
+ }
+ if (faces[curr_i].len == 0) {
+ faces[curr_i].len = 1;
+ faces[curr_i].vi = MEM_mallocN(sizeof(int) * 6, "face vi");
+ faces[curr_i].uv = MEM_mallocN(sizeof(int) * 6, "face uv");
+ faces[curr_i].bm_face = f;
+ face_i++;
+ }
+ faces[curr_i].vi[faces[curr_i].len - 1] = vert_i + 1;
+ faces[curr_i].uv[faces[curr_i].len - 1] = vert_i + 1;
+ faces[curr_i].len++;
+ }
+ vert_i++;
+ }
+
+ for (int i = 0; i < bm->totvert; i++) {
+ fprintf(fout, "v %f %f %f\n", verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+ }
+
+ for (int i = 0; i < bm->totvert; i++) {
+ fprintf(fout, "vn %f %f %f\n", verts[i].no[0], verts[i].no[1], verts[i].no[2]);
+ }
+
+ for (int i = 0; i < bm->totface; i++) {
+ fprintf(fout, "f ");
+ for (int j = 0; j < faces[i].len - 1; j++) {
+ fprintf(fout, "%d//%d ", faces[i].vi[j], faces[i].vi[j]);
+ }
+ fprintf(fout, "\n");
+ }
+
+ for (int i = 0; i < bm->totface; i++) {
+ if (faces[i].vi) {
+ MEM_freeN(faces[i].vi);
+ }
+ if (faces[i].uv) {
+ MEM_freeN(faces[i].uv);
+ }
+ }
+
+ MEM_freeN(faces);
+ MEM_freeN(verts);
+
+ fclose(fout);
+ printf("File %s written\n", file_name);
+}
+
static bool cloth_remeshing_split_edges(ClothModifierData *clmd, LinkNodePair *sizing)
{
BMesh *bm = clmd->clothObject->bm;
@@ -638,9 +732,15 @@ static void cloth_remeshing_static(ClothModifierData *clmd)
/**
* Split edges
*/
- while (cloth_remeshing_split_edges(clmd, &sizing)) {
- /* empty while */
- }
+ /* while (cloth_remeshing_split_edges(clmd, &sizing)) { */
+ /* /\* empty while *\/ */
+ /* } */
+ cloth_remeshing_split_edges(clmd, &sizing);
+ static int file_no = 0;
+ file_no++;
+ char file_name[100];
+ sprintf(file_name, "/tmp/objs/%03d.obj", file_no);
+ cloth_remeshing_export_obj(clmd->clothObject->bm, file_name);
/**
* Collapse edges
More information about the Bf-blender-cvs
mailing list