Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
SUMA_gts_insert.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 static void vertex_load (GtsPoint * p, gpointer * data)
00017 {
00018   float *NodeList = (float *)data[0];
00019   int *n = (int *)data[1];
00020   NodeList[*n*3] = (float) p->x;
00021   NodeList[*n*3+1] = (float) p->y;
00022   NodeList[*n*3+2] = (float) p->z;
00023   fprintf (stderr, "Node %d: %g %g %g\n", *n, (double)NodeList[*n*3], (double)NodeList[*n*3+1] , (double)NodeList[*n*3+2]);
00024   GTS_OBJECT (p)->reserved = GUINT_TO_POINTER ((*((guint *) data[1]))++);
00025   *n++; 
00026 }
00027 static void face_load (GtsTriangle * t, gpointer * data)
00028 {
00029   int *FaceSetList = (int *)data[0];
00030   int *n = (int *)data[1];
00031   GtsVertex * v1, * v2, * v3;
00032   gts_triangle_vertices (t, &v1, &v2, &v3);
00033   FaceSetList[*n*3] = (int)GPOINTER_TO_UINT (GTS_OBJECT (v1)->reserved);
00034   FaceSetList[*n*3+1] =(int) GPOINTER_TO_UINT (GTS_OBJECT (v2)->reserved);
00035   FaceSetList[*n*3+2] = (int)GPOINTER_TO_UINT (GTS_OBJECT (v3)->reserved);
00036   fprintf (stderr, "Triangle %d: %d %d %d\n", *n, FaceSetList[*n*3], FaceSetList[*n*3+1], FaceSetList[*n*3+2]);
00037   GTS_OBJECT (t)->reserved = GUINT_TO_POINTER ((*((guint *) data[1]))++);
00038   *n++; 
00039 }
00040 
00041 
00042 void gts_surface_suma (GtsSurface * s, 
00043                               float **NodeListp, int *N_Nodep, int *NodeDimp, 
00044                               int **FaceSetListp, int *N_FaceSetp, int *FaceSetDimp)
00045 {
00046   guint n = 0;
00047   gpointer data[2];
00048   GtsSurfaceStats stats;
00049   float *NodeList = NULL;
00050   int *FaceSetList = NULL;
00051   
00052   g_return_if_fail (s != NULL);
00053 
00054   
00055 
00056   gts_surface_stats (s, &stats);
00057   
00058   
00059   fprintf (stderr,
00060            "gts_surface_suma: Number of vertices %u\n",
00061            stats.edges_per_vertex.n);
00062   fprintf (stderr,
00063            "gts_surface_suma: Number of triangles %u\n",
00064            stats.n_faces);
00065   NodeList = (float *)calloc( stats.edges_per_vertex.n * 3, sizeof(float));
00066   FaceSetList = (int *)calloc(stats.n_faces * 3, sizeof(int)); 
00067   
00068   if (!NodeList || !FaceSetList) { 
00069    fprintf(stderr,"Critical Error gts_surface_suma: Could not allocate.\n");
00070    g_return_if_fail (0);
00071   }
00072   
00073   
00074   n = 0;
00075   data[0] = (gpointer)NodeList;
00076   data[1] = (gpointer)&n;
00077   gts_surface_foreach_vertex (s, (GtsFunc) vertex_load, data);
00078   
00079   
00080   n = 0;
00081   data[0] = (gpointer)FaceSetList;
00082   data[1] = (gpointer)&n; 
00083   gts_surface_foreach_face (s, (GtsFunc) face_load , data);
00084   
00085   
00086 
00087   gts_surface_foreach_vertex (s, (GtsFunc) gts_object_reset_reserved, NULL);  
00088   gts_surface_foreach_face (s, (GtsFunc) gts_object_reset_reserved, NULL);  
00089   
00090   
00091   *N_FaceSetp = (int)stats.n_faces;
00092   *N_Nodep = (int)stats.edges_per_vertex.n;
00093   *NodeListp = NodeList;
00094   *FaceSetListp = FaceSetList;
00095   *NodeDimp = 3;
00096   *FaceSetDimp = 3;
00097   return;
00098 }