2 ======================================================================
5 Vertex map functions for an LWO2 reader.
8 ====================================================================== */
10 #include "../picointernal.h"
15 ======================================================================
18 Free memory used by an lwVMap.
19 ====================================================================== */
21 void lwFreeVMap( lwVMap *vmap )
24 if ( vmap->name ) _pico_free( vmap->name );
25 if ( vmap->vindex ) _pico_free( vmap->vindex );
26 if ( vmap->pindex ) _pico_free( vmap->pindex );
28 if ( vmap->val[ 0 ] ) _pico_free( vmap->val[ 0 ] );
29 _pico_free( vmap->val );
37 ======================================================================
40 Read an lwVMap from a VMAP or VMAD chunk in an LWO2.
41 ====================================================================== */
43 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
46 unsigned char *buf, *bp;
52 /* read the whole chunk */
55 buf = getbytes( fp, cksize );
56 if ( !buf ) return NULL;
58 vmap = _pico_calloc( 1, sizeof( lwVMap ));
64 /* initialize the vmap */
66 vmap->perpoly = perpoly;
70 vmap->type = sgetU4( &bp );
71 vmap->dim = sgetU2( &bp );
72 vmap->name = sgetS0( &bp );
75 /* count the vmap records */
78 while ( bp < buf + cksize ) {
82 bp += vmap->dim * sizeof( float );
86 /* allocate the vmap */
89 vmap->vindex = _pico_calloc( npts, sizeof( int ));
90 if ( !vmap->vindex ) goto Fail;
92 vmap->pindex = _pico_calloc( npts, sizeof( int ));
93 if ( !vmap->pindex ) goto Fail;
96 if ( vmap->dim > 0 ) {
97 vmap->val = _pico_calloc( npts, sizeof( float * ));
98 if ( !vmap->val ) goto Fail;
99 f = _pico_alloc( npts * vmap->dim * sizeof( float ));
101 for ( i = 0; i < npts; i++ )
102 vmap->val[ i ] = f + i * vmap->dim;
105 /* fill in the vmap values */
108 for ( i = 0; i < npts; i++ ) {
109 vmap->vindex[ i ] = sgetVX( &bp );
111 vmap->pindex[ i ] = sgetVX( &bp );
112 for ( j = 0; j < vmap->dim; j++ )
113 vmap->val[ i ][ j ] = sgetF4( &bp );
120 if ( buf ) _pico_free( buf );
127 ======================================================================
130 Fill in the lwVMapPt structure for each point.
131 ====================================================================== */
133 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap )
138 /* count the number of vmap values for each point */
143 for ( i = 0; i < vm->nverts; i++ )
144 ++point->pt[ vm->vindex[ i ]].nvmaps;
148 /* allocate vmap references for each mapped point */
150 for ( i = 0; i < point->count; i++ ) {
151 if ( point->pt[ i ].nvmaps ) {
152 point->pt[ i ].vm = _pico_calloc( point->pt[ i ].nvmaps, sizeof( lwVMapPt ));
153 if ( !point->pt[ i ].vm ) return 0;
154 point->pt[ i ].nvmaps = 0;
158 /* fill in vmap references for each mapped point */
162 if ( !vm->perpoly ) {
163 for ( i = 0; i < vm->nverts; i++ ) {
165 n = point->pt[ j ].nvmaps;
166 point->pt[ j ].vm[ n ].vmap = vm;
167 point->pt[ j ].vm[ n ].index = i;
168 ++point->pt[ j ].nvmaps;
179 ======================================================================
182 Fill in the lwVMapPt structure for each polygon vertex.
183 ====================================================================== */
185 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap )
191 /* count the number of vmap values for each polygon vertex */
196 for ( i = 0; i < vm->nverts; i++ ) {
197 for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
198 pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
199 if ( vm->vindex[ i ] == pv->index ) {
209 /* allocate vmap references for each mapped vertex */
211 for ( i = 0; i < polygon->count; i++ ) {
212 for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) {
213 pv = &polygon->pol[ i ].v[ j ];
215 pv->vm = _pico_calloc( pv->nvmaps, sizeof( lwVMapPt ));
216 if ( !pv->vm ) return 0;
222 /* fill in vmap references for each mapped point */
227 for ( i = 0; i < vm->nverts; i++ ) {
228 for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
229 pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
230 if ( vm->vindex[ i ] == pv->index ) {
231 pv->vm[ pv->nvmaps ].vmap = vm;
232 pv->vm[ pv->nvmaps ].index = i;