static void _read_point(int *triangles, int num, OBJ_Counts counts, int num_cur, char *pointer) { if (counts.existence_of_normal) { if (counts.existence_of_tex_point) sscanf(pointer, "%i/%i/%i", &ARRAY_2D(triangles, num_cur, (num - 1) * 3, 9), &ARRAY_2D(triangles, num_cur, (num - 1) * 3 + 1, 9), &ARRAY_2D(triangles, num_cur, (num - 1) * 3 + 2, 9)); else sscanf(pointer, "%i//%i", &ARRAY_2D(triangles, num_cur, (num - 1) * 3, 9), &ARRAY_2D(triangles, num_cur, (num - 1) * 3 + 2, 9)); } else { if (counts.existence_of_tex_point) sscanf(pointer, "%i/%i", &ARRAY_2D(triangles, num_cur, (num - 1) * 3, 9), &ARRAY_2D(triangles, num_cur, (num - 1) * 3 + 1, 9)); else sscanf(pointer, "%i", &ARRAY_2D(triangles, num_cur, (num - 1) * 3, 9)); } }
/* *********************************************************** */ void GetSlice (double ***Vdbl, Image *image, Grid *grid) /* * * PURPOSE * * get a 2D slice from the 3D array Vdbl. * The array is actually written to disk and * re-open for reading immediately after by * proc #0. * Store its content as 2D rgb structure inside * image->rgb. * * * ************************************************************* */ { int i, j, k; int nx, ny, nz; int col_offset, row_offset; int offset, ir, ic; char filename[256]; float xflt, slice_min, slice_max; static float **slice; static RGB **rgb; FILE *fl; size_t dsize = sizeof(float); #if DIMENSIONS == 1 print1 ("! PPM output disabled in 1-D\n"); return; #endif /* ------------------------------------------------ Write the whole array in single precision Slice are post-processed later ------------------------------------------------ */ fl = OpenBinaryFile ("tmp_file.out", SZ_float, "w"); WriteBinaryArray ((Convert_dbl2flt(Vdbl,0))[0][0], dsize, SZ_float, fl, -1); CloseBinaryFile (fl, SZ_float); #ifdef PARALLEL MPI_Barrier (MPI_COMM_WORLD); #endif if (prank != 0) return; /* -- rank 0 will do the rest -- */ /* ------------------------------------------------ get global dimensions ------------------------------------------------ */ nx = grid[IDIR].gend + 1 - grid[IDIR].nghost; ny = grid[JDIR].gend + 1 - grid[JDIR].nghost; nz = grid[KDIR].gend + 1 - grid[KDIR].nghost; /* ----------------------------------------- Allocate memory: make slices big enough to contain slices of different sizes. ----------------------------------------- */ if (slice == NULL) { ic = MAX(nx,ny); ir = MAX(ny,nz); slice = ARRAY_2D(ir, ic, float); rgb = ARRAY_2D(ir, ic, RGB); }
void evas_model_load_file_obj(Evas_Canvas3D_Mesh *mesh, Eina_File *file) { long i; OBJ_Counts counts;//count elements of mesh in .obj Eina_Bool will_check_next_char = EINA_FALSE; Eina_Bool first_char_is_v = EINA_FALSE; Eina_Bool first_char_is_f = EINA_FALSE; float *pos = NULL, *nor = NULL, *tex = NULL; int stride_pos = 0, stride_nor = 0, stride_tex = 0; int j, k, data_for_one_point; char *current, *map; float *_vertices_obj = NULL, *_normales_obj = NULL, *_tex_coords_obj = NULL; int *_triangles; map = eina_file_map_all(file, EINA_FILE_SEQUENTIAL); if (map == NULL) { ERR("Failed to create map from file %s\n", eina_file_filename_get(file)); return; } counts = _count_elements(map); _vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float)); data_for_one_point = 1; if (counts.existence_of_normal) { data_for_one_point++; _normales_obj = malloc(counts._normal_counter * 3 * sizeof(float)); } if (counts.existence_of_tex_point) { data_for_one_point++; _tex_coords_obj = malloc(counts._texture_point_counter * 3 * sizeof(float)); } _triangles = malloc(counts._triangles_counter * 9 * sizeof(int)); if ((map == NULL) || (_vertices_obj == NULL) || (_triangles == NULL) || ((counts.existence_of_normal) && (_normales_obj == NULL)) || ((counts.existence_of_tex_point) && (_tex_coords_obj == NULL))) { ERR("Allocate memory is failed."); free(_vertices_obj); free(_triangles); if (counts.existence_of_normal) free(_normales_obj); if (counts.existence_of_tex_point) free(_tex_coords_obj); return; } current = map; i = 0; /* put data to arrays */ for (; *current != '\00'; i++) { if (will_check_next_char) { if (first_char_is_v) { switch (*current) { case ' ': PUT_DATA_TO_ARRAY(vertices, vertex) i--; break; case 't': current++; if (counts.existence_of_tex_point) { PUT_DATA_TO_ARRAY(tex_coords, texture_point) } break; case 'n': current++; if (counts.existence_of_normal) { PUT_DATA_TO_ARRAY(normales, normal) } break; default: break; } first_char_is_v = EINA_FALSE; will_check_next_char = EINA_FALSE; } else if (first_char_is_f) { char *auxiliary_pointer = current; int count_of_triangles_in_line; int the_first_point = counts.current_triangles_counter; _analyze_face_line(auxiliary_pointer, &count_of_triangles_in_line); current++; i++; _read_point(_triangles, 1, counts, the_first_point, current); AFTER_NEXT_SPACE(current) for (j = 0; j < count_of_triangles_in_line; j++) { auxiliary_pointer = current; if (counts.current_triangles_counter != the_first_point) { ARRAY_2D(_triangles, counts.current_triangles_counter, 0, 9) = \ ARRAY_2D(_triangles, the_first_point, 0, 9); ARRAY_2D(_triangles, counts.current_triangles_counter, 1, 9) = \ ARRAY_2D(_triangles, the_first_point, 1, 9); ARRAY_2D(_triangles, counts.current_triangles_counter, 2, 9) = \ ARRAY_2D(_triangles, the_first_point, 2, 9); } _read_point(_triangles, 2, counts, counts.current_triangles_counter, auxiliary_pointer); AFTER_NEXT_SPACE(auxiliary_pointer); _read_point(_triangles, 3, counts, counts.current_triangles_counter, auxiliary_pointer); AFTER_NEXT_SPACE(current); counts.current_triangles_counter++; } first_char_is_f = EINA_FALSE; } else { switch (*current) { case 'v': first_char_is_v = EINA_TRUE; break; case 'f': first_char_is_f = EINA_TRUE; break; case 'm': will_check_next_char = EINA_FALSE; break; default: will_check_next_char = EINA_FALSE; break; } } }
void evas_3d_mesh_file_obj_set(Evas_3D_Mesh *mesh, const char *file) { long length, i; char * start = _file_to_buf(file, &length); OBJ_Counts counts = _count_elements(start, length);//count elements of mesh in .obj Eina_Bool will_check_next_char = EINA_FALSE; Eina_Bool first_char_is_v = EINA_FALSE; Eina_Bool first_char_is_f = EINA_FALSE; float *pos, *nor, *tex; int stride_pos, stride_nor, stride_tex; int j, k; char * current; float *_vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float)); float *_normales_obj = malloc(counts._normal_counter * 3 * sizeof(float)); float *_tex_coords_obj = malloc(counts._texture_point_counter * 3 * sizeof(float)); /* triangle has 3 points, every point has 3(vertix, texture and normal) coord */ int *_triangles = malloc(counts._triangles_counter * 9 * sizeof(int)); if ((start == NULL) || (_vertices_obj == NULL) || (_normales_obj == NULL) || (_tex_coords_obj == NULL) || (_triangles == NULL)) { ERR("Allocate memory is failed."); free(start); free(_vertices_obj); free(_normales_obj); free(_tex_coords_obj); free(_triangles); return; } current = start; i = 0; /* put data to arrays */ for (; length > i; i++) { if (will_check_next_char) { if (first_char_is_v) { switch (*current) { case ' ': PUT_DATA_TO_ARRAY(vertices, vertex) i--; break; case 't': current++; PUT_DATA_TO_ARRAY(tex_coords, texture_point) break; case 'n': current++; PUT_DATA_TO_ARRAY(normales, normal) break; default: break; } first_char_is_v = EINA_FALSE; will_check_next_char = EINA_FALSE; } else if (first_char_is_f) { char * auxiliary_pointer = current; int count_of_triangles_in_line; _analyze_face_line(auxiliary_pointer, &count_of_triangles_in_line); current++; i++; int first_pos, first_tex, first_norm; sscanf (current,"%i/%i/%i", &first_pos, &first_tex, &first_norm); do { current++; i++; } while (*current != ' '); current++; i++; for (j = 0; j < count_of_triangles_in_line; j++) { auxiliary_pointer = current; ARRAY_2D(_triangles, counts.current_triangles_counter, 0, 9) = first_pos; ARRAY_2D(_triangles, counts.current_triangles_counter, 1, 9) = first_tex; ARRAY_2D(_triangles, counts.current_triangles_counter, 2, 9) = first_norm; sscanf (auxiliary_pointer,"%i/%i/%i %i/%i/%i", &ARRAY_2D(_triangles, counts.current_triangles_counter, 3, 9), &ARRAY_2D(_triangles, counts.current_triangles_counter, 4, 9), &ARRAY_2D(_triangles, counts.current_triangles_counter, 5, 9), &ARRAY_2D(_triangles, counts.current_triangles_counter, 6, 9), &ARRAY_2D(_triangles, counts.current_triangles_counter, 7, 9), &ARRAY_2D(_triangles, counts.current_triangles_counter, 8, 9)); while (*current != ' ') { current++; i++; } counts.current_triangles_counter++; } first_char_is_f = EINA_FALSE; } else { switch (*current) { case 'v': first_char_is_v = EINA_TRUE; break; case 'f': first_char_is_f = EINA_TRUE; break; case 'm': will_check_next_char = EINA_FALSE; break; default: will_check_next_char = EINA_FALSE; break; } } } else if (*current == '\n')