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