/*
-======================================================================
-vmap.c
+ ======================================================================
+ vmap.c
-Vertex map functions for an LWO2 reader.
+ Vertex map functions for an LWO2 reader.
-Ernie Wright 17 Sep 00
-====================================================================== */
+ Ernie Wright 17 Sep 00
+ ====================================================================== */
#include "../picointernal.h"
#include "lwo2.h"
/*
-======================================================================
-lwFreeVMap()
-
-Free memory used by an lwVMap.
-====================================================================== */
-
-void lwFreeVMap( lwVMap *vmap )
-{
- if ( vmap ) {
- if ( vmap->name ) _pico_free( vmap->name );
- if ( vmap->vindex ) _pico_free( vmap->vindex );
- if ( vmap->pindex ) _pico_free( vmap->pindex );
- if ( vmap->val ) {
- if ( vmap->val[ 0 ] ) _pico_free( vmap->val[ 0 ] );
- _pico_free( vmap->val );
- }
- _pico_free( vmap );
- }
+ ======================================================================
+ lwFreeVMap()
+
+ Free memory used by an lwVMap.
+ ====================================================================== */
+
+void lwFreeVMap( lwVMap *vmap ){
+ if ( vmap ) {
+ if ( vmap->name ) {
+ _pico_free( vmap->name );
+ }
+ if ( vmap->vindex ) {
+ _pico_free( vmap->vindex );
+ }
+ if ( vmap->pindex ) {
+ _pico_free( vmap->pindex );
+ }
+ if ( vmap->val ) {
+ if ( vmap->val[ 0 ] ) {
+ _pico_free( vmap->val[ 0 ] );
+ }
+ _pico_free( vmap->val );
+ }
+ _pico_free( vmap );
+ }
}
/*
-======================================================================
-lwGetVMap()
+ ======================================================================
+ lwGetVMap()
-Read an lwVMap from a VMAP or VMAD chunk in an LWO2.
-====================================================================== */
+ Read an lwVMap from a VMAP or VMAD chunk in an LWO2.
+ ====================================================================== */
lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
- int perpoly )
-{
- unsigned char *buf, *bp;
- lwVMap *vmap;
- float *f;
- int i, j, npts, rlen;
-
-
- /* read the whole chunk */
-
- set_flen( 0 );
- buf = getbytes( fp, cksize );
- if ( !buf ) return NULL;
-
- vmap = _pico_calloc( 1, sizeof( lwVMap ));
- if ( !vmap ) {
- _pico_free( buf );
- return NULL;
- }
-
- /* initialize the vmap */
-
- vmap->perpoly = perpoly;
-
- bp = buf;
- set_flen( 0 );
- vmap->type = sgetU4( &bp );
- vmap->dim = sgetU2( &bp );
- vmap->name = sgetS0( &bp );
- rlen = get_flen();
-
- /* count the vmap records */
-
- npts = 0;
- while ( bp < buf + cksize ) {
- i = sgetVX( &bp );
- if ( perpoly )
- i = sgetVX( &bp );
- bp += vmap->dim * sizeof( float );
- ++npts;
- }
-
- /* allocate the vmap */
-
- vmap->nverts = npts;
- vmap->vindex = _pico_calloc( npts, sizeof( int ));
- if ( !vmap->vindex ) goto Fail;
- if ( perpoly ) {
- vmap->pindex = _pico_calloc( npts, sizeof( int ));
- if ( !vmap->pindex ) goto Fail;
- }
-
- if ( vmap->dim > 0 ) {
- vmap->val = _pico_calloc( npts, sizeof( float * ));
- if ( !vmap->val ) goto Fail;
- f = _pico_alloc( npts * vmap->dim * sizeof( float ));
- if ( !f ) goto Fail;
- for ( i = 0; i < npts; i++ )
- vmap->val[ i ] = f + i * vmap->dim;
- }
-
- /* fill in the vmap values */
-
- bp = buf + rlen;
- for ( i = 0; i < npts; i++ ) {
- vmap->vindex[ i ] = sgetVX( &bp );
- if ( perpoly )
- vmap->pindex[ i ] = sgetVX( &bp );
- for ( j = 0; j < vmap->dim; j++ )
- vmap->val[ i ][ j ] = sgetF4( &bp );
- }
-
- _pico_free( buf );
- return vmap;
+ int perpoly ){
+ unsigned char *buf, *bp;
+ lwVMap *vmap;
+ float *f;
+ int i, j, npts, rlen;
+
+
+ /* read the whole chunk */
+
+ set_flen( 0 );
+ buf = getbytes( fp, cksize );
+ if ( !buf ) {
+ return NULL;
+ }
+
+ vmap = _pico_calloc( 1, sizeof( lwVMap ) );
+ if ( !vmap ) {
+ _pico_free( buf );
+ return NULL;
+ }
+
+ /* initialize the vmap */
+
+ vmap->perpoly = perpoly;
+
+ bp = buf;
+ set_flen( 0 );
+ vmap->type = sgetU4( &bp );
+ vmap->dim = sgetU2( &bp );
+ vmap->name = sgetS0( &bp );
+ rlen = get_flen();
+
+ /* count the vmap records */
+
+ npts = 0;
+ while ( bp < buf + cksize ) {
+ i = sgetVX( &bp );
+ if ( perpoly ) {
+ i = sgetVX( &bp );
+ }
+ bp += vmap->dim * sizeof( float );
+ ++npts;
+ }
+
+ /* allocate the vmap */
+
+ vmap->nverts = npts;
+ vmap->vindex = _pico_calloc( npts, sizeof( int ) );
+ if ( !vmap->vindex ) {
+ goto Fail;
+ }
+ if ( perpoly ) {
+ vmap->pindex = _pico_calloc( npts, sizeof( int ) );
+ if ( !vmap->pindex ) {
+ goto Fail;
+ }
+ }
+
+ if ( vmap->dim > 0 ) {
+ vmap->val = _pico_calloc( npts, sizeof( float * ) );
+ if ( !vmap->val ) {
+ goto Fail;
+ }
+ f = _pico_alloc( npts * vmap->dim * sizeof( float ) );
+ if ( !f ) {
+ goto Fail;
+ }
+ for ( i = 0; i < npts; i++ )
+ vmap->val[ i ] = f + i * vmap->dim;
+ }
+
+ /* fill in the vmap values */
+
+ bp = buf + rlen;
+ for ( i = 0; i < npts; i++ ) {
+ vmap->vindex[ i ] = sgetVX( &bp );
+ if ( perpoly ) {
+ vmap->pindex[ i ] = sgetVX( &bp );
+ }
+ for ( j = 0; j < vmap->dim; j++ )
+ vmap->val[ i ][ j ] = sgetF4( &bp );
+ }
+
+ _pico_free( buf );
+ return vmap;
Fail:
- if ( buf ) _pico_free( buf );
- lwFreeVMap( vmap );
- return NULL;
+ if ( buf ) {
+ _pico_free( buf );
+ }
+ lwFreeVMap( vmap );
+ return NULL;
}
/*
-======================================================================
-lwGetPointVMaps()
-
-Fill in the lwVMapPt structure for each point.
-====================================================================== */
-
-int lwGetPointVMaps( lwPointList *point, lwVMap *vmap )
-{
- lwVMap *vm;
- int i, j, n;
-
- /* count the number of vmap values for each point */
-
- vm = vmap;
- while ( vm ) {
- if ( !vm->perpoly )
- for ( i = 0; i < vm->nverts; i++ )
- ++point->pt[ vm->vindex[ i ]].nvmaps;
- vm = vm->next;
- }
-
- /* allocate vmap references for each mapped point */
-
- for ( i = 0; i < point->count; i++ ) {
- if ( point->pt[ i ].nvmaps ) {
- point->pt[ i ].vm = _pico_calloc( point->pt[ i ].nvmaps, sizeof( lwVMapPt ));
- if ( !point->pt[ i ].vm ) return 0;
- point->pt[ i ].nvmaps = 0;
- }
- }
-
- /* fill in vmap references for each mapped point */
-
- vm = vmap;
- while ( vm ) {
- if ( !vm->perpoly ) {
- for ( i = 0; i < vm->nverts; i++ ) {
- j = vm->vindex[ i ];
- n = point->pt[ j ].nvmaps;
- point->pt[ j ].vm[ n ].vmap = vm;
- point->pt[ j ].vm[ n ].index = i;
- ++point->pt[ j ].nvmaps;
- }
- }
- vm = vm->next;
- }
-
- return 1;
+ ======================================================================
+ lwGetPointVMaps()
+
+ Fill in the lwVMapPt structure for each point.
+ ====================================================================== */
+
+int lwGetPointVMaps( lwPointList *point, lwVMap *vmap ){
+ lwVMap *vm;
+ int i, j, n;
+
+ /* count the number of vmap values for each point */
+
+ vm = vmap;
+ while ( vm ) {
+ if ( !vm->perpoly ) {
+ for ( i = 0; i < vm->nverts; i++ )
+ ++point->pt[ vm->vindex[ i ]].nvmaps;
+ }
+ vm = vm->next;
+ }
+
+ /* allocate vmap references for each mapped point */
+
+ for ( i = 0; i < point->count; i++ ) {
+ if ( point->pt[ i ].nvmaps ) {
+ point->pt[ i ].vm = _pico_calloc( point->pt[ i ].nvmaps, sizeof( lwVMapPt ) );
+ if ( !point->pt[ i ].vm ) {
+ return 0;
+ }
+ point->pt[ i ].nvmaps = 0;
+ }
+ }
+
+ /* fill in vmap references for each mapped point */
+
+ vm = vmap;
+ while ( vm ) {
+ if ( !vm->perpoly ) {
+ for ( i = 0; i < vm->nverts; i++ ) {
+ j = vm->vindex[ i ];
+ n = point->pt[ j ].nvmaps;
+ point->pt[ j ].vm[ n ].vmap = vm;
+ point->pt[ j ].vm[ n ].index = i;
+ ++point->pt[ j ].nvmaps;
+ }
+ }
+ vm = vm->next;
+ }
+
+ return 1;
}
/*
-======================================================================
-lwGetPolyVMaps()
-
-Fill in the lwVMapPt structure for each polygon vertex.
-====================================================================== */
-
-int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap )
-{
- lwVMap *vm;
- lwPolVert *pv;
- int i, j;
-
- /* count the number of vmap values for each polygon vertex */
-
- vm = vmap;
- while ( vm ) {
- if ( vm->perpoly ) {
- for ( i = 0; i < vm->nverts; i++ ) {
- for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
- pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
- if ( vm->vindex[ i ] == pv->index ) {
- ++pv->nvmaps;
- break;
- }
- }
- }
- }
- vm = vm->next;
- }
-
- /* allocate vmap references for each mapped vertex */
-
- for ( i = 0; i < polygon->count; i++ ) {
- for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) {
- pv = &polygon->pol[ i ].v[ j ];
- if ( pv->nvmaps ) {
- pv->vm = _pico_calloc( pv->nvmaps, sizeof( lwVMapPt ));
- if ( !pv->vm ) return 0;
- pv->nvmaps = 0;
- }
- }
- }
-
- /* fill in vmap references for each mapped point */
-
- vm = vmap;
- while ( vm ) {
- if ( vm->perpoly ) {
- for ( i = 0; i < vm->nverts; i++ ) {
- for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
- pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
- if ( vm->vindex[ i ] == pv->index ) {
- pv->vm[ pv->nvmaps ].vmap = vm;
- pv->vm[ pv->nvmaps ].index = i;
- ++pv->nvmaps;
- break;
- }
- }
- }
- }
- vm = vm->next;
- }
-
- return 1;
+ ======================================================================
+ lwGetPolyVMaps()
+
+ Fill in the lwVMapPt structure for each polygon vertex.
+ ====================================================================== */
+
+int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap ){
+ lwVMap *vm;
+ lwPolVert *pv;
+ int i, j;
+
+ /* count the number of vmap values for each polygon vertex */
+
+ vm = vmap;
+ while ( vm ) {
+ if ( vm->perpoly ) {
+ for ( i = 0; i < vm->nverts; i++ ) {
+ for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
+ pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
+ if ( vm->vindex[ i ] == pv->index ) {
+ ++pv->nvmaps;
+ break;
+ }
+ }
+ }
+ }
+ vm = vm->next;
+ }
+
+ /* allocate vmap references for each mapped vertex */
+
+ for ( i = 0; i < polygon->count; i++ ) {
+ for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) {
+ pv = &polygon->pol[ i ].v[ j ];
+ if ( pv->nvmaps ) {
+ pv->vm = _pico_calloc( pv->nvmaps, sizeof( lwVMapPt ) );
+ if ( !pv->vm ) {
+ return 0;
+ }
+ pv->nvmaps = 0;
+ }
+ }
+ }
+
+ /* fill in vmap references for each mapped point */
+
+ vm = vmap;
+ while ( vm ) {
+ if ( vm->perpoly ) {
+ for ( i = 0; i < vm->nverts; i++ ) {
+ for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
+ pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
+ if ( vm->vindex[ i ] == pv->index ) {
+ pv->vm[ pv->nvmaps ].vmap = vm;
+ pv->vm[ pv->nvmaps ].index = i;
+ ++pv->nvmaps;
+ break;
+ }
+ }
+ }
+ }
+ vm = vm->next;
+ }
+
+ return 1;
}