From b01cc1ac677dc712c27337be8ee4f11ea336f31b Mon Sep 17 00:00:00 2001
From: Samo Penic <samo@andromeda>
Date: Sun, 05 Dec 2010 13:02:22 +0000
Subject: [PATCH] Fixed some nasty bugs. Still, I suspect the vertex neighbours are not correctly oriented or something, since tristar triangles are not successfully set. (tristar_no is not always the same as neigh_no!)

---
 src/triangle.c |  147 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 145 insertions(+), 2 deletions(-)

diff --git a/src/triangle.c b/src/triangle.c
index 79a0ada..959205a 100644
--- a/src/triangle.c
+++ b/src/triangle.c
@@ -4,6 +4,21 @@
 #include "triangle.h"
 #include<math.h>
 
+/** @brief Prepares the list for triangles.
+  *
+  * Create empty list for holding the information on triangles. Triangles are
+  * added later on with triangle_add().
+  * Returns pointer to the tlist datastructure it has created. This pointer must
+  * be assigned to some variable or it will be lost.
+  *
+  *
+  * Example of usage:
+  *     ts_triangle_list *tlist;
+  *		tlist=triangle_data_free();
+  *
+  *	    Initalized data structure for holding the information on triangles.
+  *		
+  */
 ts_triangle_list *init_triangle_list(){
     ts_triangle_list *tlist=(ts_triangle_list *)malloc(sizeof(ts_triangle_list));
 	tlist->n = 0;
@@ -11,7 +26,27 @@
 	return tlist;
 }
 
-
+/** @brief Add the triangle to the triangle list and create necessary data
+ * structures.
+  *
+  * Add the triangle ts_triangle with ts_triangle_data to the ts_triangle_list.
+  * The triangle list is resized, the ts_triangle is allocated and
+  * ts_triangle_data is allocated and zeroed. The function receives 4 arguments:
+  * ts_triangle_list *tlist as list of triangles and 3 ts_vertex *vtx as
+  * vertices that are used to form a triangle. Returns a pointer to newly
+  * created triangle. This pointer doesn't need assigning, since it is
+  * referenced by triangle list.
+  *
+  * WARNING: Function can be accelerated a bit by removing the NULL checks.
+  * However the time gained by removal doesn't justify the time spent by
+  * debugging stupid NULL pointers.
+  *
+  * Example of usage:
+  *		triangle_add(tlist, vlist->vtx[1], vlist->vtx[2], vlist->vtx[3]);
+  *
+  *	    Creates a triangle with given vertices and puts it into the list.
+  *		
+  */
 ts_triangle *triangle_add(ts_triangle_list *tlist, ts_vertex *vtx1, ts_vertex *vtx2, ts_vertex *vtx3){
         if(vtx1==NULL || vtx2==NULL || vtx3==NULL){
             return NULL;
@@ -32,6 +67,27 @@
         return tlist->tria[tlist->n-1];
 }
 
+/** @brief Add the neigbour to triangles.
+  *
+  * Add the neigbour to the list of neighbouring triangles. The
+  * neighbouring triangles are those, who share two vertices. Function resizes
+  * the list and adds the pointer to neighbour. It receives two arguments of
+  * ts_triangle type. It then adds eachother to eachother's list. Upon
+  * success it returns TS_SUCCESS, upon detecting NULL pointers 
+  * returns TS_FAIL and it FATALY ends when the data structure
+  * cannot be resized.
+  *
+  *
+  * WARNING: Function can be accelerated a bit by removing the NULL checks.
+  * However the time gained by removal doesn't justify the time spent by
+  * debugging stupid NULL pointers.
+  *
+  * Example of usage:
+  *		triangle_remove_neighbour(tlist->tria[3], tlist->tria[4]);
+  *
+  *	    Triangles 3 and 4 are not neighbours anymore.
+  *		
+  */
 
 ts_bool triangle_add_neighbour(ts_triangle *tria, ts_triangle *ntria){
     if(tria==NULL || ntria==NULL) return TS_FAIL;
@@ -52,7 +108,27 @@
 	return TS_SUCCESS;
 }
 
-
+/** @brief Remove the neigbours from triangle.
+  *
+  * Removes the neigbour from the list of neighbouring triangles. The
+  * neighbouring triangles are those, who share two vertices. Function resizes
+  * the list and deletes the pointer to neighbour. It receives two arguments of
+  * ts_triangle type. It then removes eachother form eachother's list. Upon
+  * success it returns TS_SUCCESS, upon failure to find the triangle in the
+  * neighbour list returns TS_FAIL and it FATALY ends when the datastructure
+  * cannot be resized.
+  *
+  * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
+  * job of programmer to make sure the pointer is valid.
+  *
+  * WARNING: Function is slow. Do not use it often!
+  *
+  * Example of usage:
+  *		triangle_remove_neighbour(tlist->tria[3], tlist->tria[4]);
+  *
+  *	    Triangles 3 and 4 are not neighbours anymore.
+  *		
+  */
 ts_bool triangle_remove_neighbour(ts_triangle *tria, ts_triangle *ntria){
     ts_uint i,j=0; 
     if(tria==NULL || ntria==NULL) return TS_FAIL;
@@ -91,6 +167,28 @@
     return TS_SUCCESS;
 }
 
+
+/** @brief Calculates normal vector of the triangle.
+
+  *
+  * Calculate normal vector of the triangle (xnorm, ynorm and znorm) and stores
+  * information in underlying ts_triangle_data data_structure.
+  *
+  * Function receives one argument of type ts_triangle. It should be corectly
+  * initialized with underlying data structure of type ts_triangle_data. the
+  * result is stored in triangle->data->xnorm, triangle->data->ynorm,
+  * triangle->data->znorm. Returns TS_SUCCESS on completion. 
+  *
+  * NOTE: Function uses math.h library. pow function implementation is selected
+  * accordind to the setting in genreal.h
+  *
+  * Example of usage:
+  *		triangle_normal_vector(tlist->tria[3]);
+  *
+  *	    Computes normals and stores information into tlist->tria[3]->xnorm,
+  *	    tlist->tria[3]->ynorm, tlist->tria[3]->znorm.
+  *		
+  */
 ts_bool triangle_normal_vector(ts_triangle *tria){
 	ts_double x21,x31,y21,y31,z21,z31,xden;
 	x21=tria->data->vertex[1]->data->x - tria->data->vertex[0]->data->x;
@@ -122,12 +220,57 @@
 }
 
 
+
+
+
+/** @brief Frees the memory allocated for data structure of triangle data
+ * (ts_triangle_data)
+  *
+  * Function frees the memory of ts_triangle_data previously allocated. It
+  * accepts one argument, the address of data structure. It destroys all
+  * pointers the structure might have (currently only neigh -- the pointer to
+  * list of neighbouring triangles) and data structure itself. The return value
+  * is always TS_SUCCESS.
+  *
+  * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
+  * job of programmer to make sure the pointer is valid.
+  *
+  * Example of usage:
+  *		triangle_data_free(tlist->tria[3]->data);
+  *
+  *	    Clears the data structure with all pointers.
+  *		
+  */
 ts_bool triangle_data_free(ts_triangle_data *data){
     if(data->neigh!=NULL) free(data->neigh);
     free(data);
     return TS_SUCCESS;
 }
 
+/** @brief Frees the memory allocated for data structure of triangle list
+ * (ts_triangle_list)
+  *
+  * Function frees the memory of ts_triangle_list previously allocated. It
+  * accepts one argument, the address of data structure. It destroys all
+  * ts_triangle's in the list with underlying data (by calling
+  * triangle_data_free()), and the list itself.
+  *
+  * Should be used eveytime the deletion of triangle list (created by
+  * init_triangle_list() and altered by add_triangle() or remove_triangle()) is desired.
+  *
+  * WARNING: The function doesn't check whether the pointer is NULL or invalid. It is the
+  * job of programmer to make sure the pointer is valid.
+  *
+  * WARNING: Careful when destroying triangle lists. There could be pointers to
+  * that information remaining in structures like vertex_data. This pointers
+  * will be rendered invalid by this operation and should not be used anymore.
+  *
+  * Example of usage:
+  *		triangle_list_free(tlist);
+  *
+  *	    Clears all the information on triangles.
+  *		
+  */
 ts_bool triangle_list_free(ts_triangle_list *tlist){
     ts_uint i;
     for(i=0;i<tlist->n;i++){

--
Gitblit v1.9.3