cbec90699f
- creato il progetto in Visual Studio per compilare come libreria statica - modifiche al codice originale per integrarlo nelle nostre librerie.
98 lines
4.0 KiB
C++
98 lines
4.0 KiB
C++
/*****************************************************************************/
|
|
/* */
|
|
/* Funzioni aggiunte per integrare fist con le nostre librerie */
|
|
/* Le modifiche nelle funzioni già esistenti sono idicate con MODIF */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include "defs.h"
|
|
#include "header.h"
|
|
|
|
#define BLOCK_SIZE 16384
|
|
|
|
//----------------------------------------------------------------------------
|
|
void
|
|
AddLoopInFace( global_struct *all, int nHoles, boolean bFirstLoop, int nPoints)
|
|
{
|
|
// versione ottimizzata di HandleFace
|
|
|
|
vertexdef *vert = &all->c_vertex;
|
|
listdef *list = &all->c_list;
|
|
|
|
int curr_loop = MakeLoopHeader(list) ;
|
|
if ( bFirstLoop) {
|
|
// se è il primo loop della faccia, inizializzo il numero dei suoi loops
|
|
InitFace( list, nHoles + 1) ;
|
|
}
|
|
|
|
// segnaposto per il loop corrente
|
|
list_ind loop_placeholder_ind = list->loops[curr_loop] ;
|
|
list->list[loop_placeholder_ind].prev = loop_placeholder_ind ;
|
|
list->list[loop_placeholder_ind].next = loop_placeholder_ind ;
|
|
|
|
// il primo vertice del loop corrente è nella posizione successiva al segnaposto
|
|
list->loops[curr_loop] = loop_placeholder_ind + 1 ;
|
|
|
|
// aggiungo i vertici del loop corrente
|
|
for ( int i = 0 ; i < nPoints ; i++) {
|
|
// recupero indice del vertice
|
|
int index = vert->num_vertices - nPoints + i ;
|
|
|
|
// aggiungo nella lista
|
|
if (list->num_list >= list->max_num_list) {
|
|
list->max_num_list += BLOCK_SIZE ;
|
|
list->list = (list_node*) ReallocateArray(list->memptr, list->list, list->max_num_list, sizeof(list_node), "list:list") ;
|
|
}
|
|
list_ind ind = list->num_list ;
|
|
list->list[ind].index = index ;
|
|
list->list[ind].prev = ( i == 0 ? ind + nPoints - 1 : ind - 1) ;
|
|
list->list[ind].next = ( i == nPoints - 1 ? ind - nPoints + 1 : ind + 1) ;
|
|
list->list[ind].bridge = false ;
|
|
list->list[ind].original = index ;
|
|
#ifdef PARTITION_FIST
|
|
list->list[ind].delete_reflex = false;
|
|
#endif
|
|
++list->num_list ;
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void
|
|
OptimizeMemoryAllocation( global_struct *all, int nLoops, int nVertices)
|
|
{
|
|
// alloco correttamente la memoria per alcune strutture di fist per evitare riallocazioni successive e per non occupare memoria
|
|
// inutile ( BLOCK_SIZE spesso è esagerato rispetto al caso da trattare)
|
|
|
|
// c_list
|
|
listdef* list = &all->c_list ;
|
|
// viene trattata una sola faccia
|
|
list->max_num_faces = 1 ;
|
|
list->faces = ( int*) ReallocateArray( list->memptr, list->faces, list->max_num_faces, sizeof( int), "list:faces") ;
|
|
// numero di loop
|
|
list->max_num_loops = nLoops ;
|
|
list->loops = ( list_ind*) ReallocateArray( list->memptr, list->loops, list->max_num_loops, sizeof( list_ind), "list:loops") ;
|
|
// la lista deve comprendere tutti i vertici, un segnaposto per ogni loop e due punti per ogni brigde
|
|
list->max_num_list = nVertices + 3 * nLoops ;
|
|
list->list = ( list_node*) ReallocateArray( list->memptr, list->list, list->max_num_list, sizeof( list_node), "list:list") ;
|
|
|
|
// c_vertex
|
|
vertexdef* vertices = &all->c_vertex ;
|
|
// 1 solo gruppo
|
|
vertices->max_num_groups = 1 ;
|
|
vertices->groups = ( int*) ReallocateArray( list->memptr, vertices->groups, vertices->max_num_groups, sizeof( int), "vertex:groups") ;
|
|
// numero di vertici
|
|
vertices->max_num_vertices = nVertices ;
|
|
vertices->vertices = ( vertex*) ReallocateArray( vertices->memptr, vertices->vertices, vertices->max_num_vertices, sizeof( vertex), "vertex:vertices") ;
|
|
|
|
// c_data
|
|
// il numero di punti è il numero di vertici
|
|
datadef* data = &all->c_data ;
|
|
data->max_num_pnts = nVertices ;
|
|
data->points = ( point*) ReallocateArray( data->memptr, data->points, data->max_num_pnts, sizeof( point), "data:points") ;
|
|
|
|
return ;
|
|
}
|