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 _pico_free( vmap->name );
27 _pico_free( vmap->vindex );
30 _pico_free( vmap->pindex );
33 if ( vmap->val[ 0 ] ) {
34 _pico_free( vmap->val[ 0 ] );
36 _pico_free( vmap->val );
44 ======================================================================
47 Read an lwVMap from a VMAP or VMAD chunk in an LWO2.
48 ====================================================================== */
50 lwVMap *lwGetVMap( picoMemStream_t *fp, int cksize, int ptoffset, int poloffset,
52 unsigned char *buf, *bp;
58 /* read the whole chunk */
61 buf = getbytes( fp, cksize );
66 vmap = _pico_calloc( 1, sizeof( lwVMap ) );
72 /* initialize the vmap */
74 vmap->perpoly = perpoly;
78 vmap->type = sgetU4( &bp );
79 vmap->dim = sgetU2( &bp );
80 vmap->name = sgetS0( &bp );
83 /* count the vmap records */
86 while ( bp < buf + cksize ) {
91 bp += vmap->dim * sizeof( float );
95 /* allocate the vmap */
98 vmap->vindex = _pico_calloc( npts, sizeof( int ) );
99 if ( !vmap->vindex ) {
103 vmap->pindex = _pico_calloc( npts, sizeof( int ) );
104 if ( !vmap->pindex ) {
109 if ( vmap->dim > 0 ) {
110 vmap->val = _pico_calloc( npts, sizeof( float * ) );
114 f = _pico_alloc( npts * vmap->dim * sizeof( float ) );
118 for ( i = 0; i < npts; i++ )
119 vmap->val[ i ] = f + i * vmap->dim;
122 /* fill in the vmap values */
125 for ( i = 0; i < npts; i++ ) {
126 vmap->vindex[ i ] = sgetVX( &bp );
128 vmap->pindex[ i ] = sgetVX( &bp );
130 for ( j = 0; j < vmap->dim; j++ )
131 vmap->val[ i ][ j ] = sgetF4( &bp );
147 ======================================================================
150 Fill in the lwVMapPt structure for each point.
151 ====================================================================== */
153 int lwGetPointVMaps( lwPointList *point, lwVMap *vmap ){
157 /* count the number of vmap values for each point */
161 if ( !vm->perpoly ) {
162 for ( i = 0; i < vm->nverts; i++ )
163 ++point->pt[ vm->vindex[ i ]].nvmaps;
168 /* allocate vmap references for each mapped point */
170 for ( i = 0; i < point->count; i++ ) {
171 if ( point->pt[ i ].nvmaps ) {
172 point->pt[ i ].vm = _pico_calloc( point->pt[ i ].nvmaps, sizeof( lwVMapPt ) );
173 if ( !point->pt[ i ].vm ) {
176 point->pt[ i ].nvmaps = 0;
180 /* fill in vmap references for each mapped point */
184 if ( !vm->perpoly ) {
185 for ( i = 0; i < vm->nverts; i++ ) {
187 n = point->pt[ j ].nvmaps;
188 point->pt[ j ].vm[ n ].vmap = vm;
189 point->pt[ j ].vm[ n ].index = i;
190 ++point->pt[ j ].nvmaps;
201 ======================================================================
204 Fill in the lwVMapPt structure for each polygon vertex.
205 ====================================================================== */
207 int lwGetPolyVMaps( lwPolygonList *polygon, lwVMap *vmap ){
212 /* count the number of vmap values for each polygon vertex */
217 for ( i = 0; i < vm->nverts; i++ ) {
218 for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
219 pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
220 if ( vm->vindex[ i ] == pv->index ) {
230 /* allocate vmap references for each mapped vertex */
232 for ( i = 0; i < polygon->count; i++ ) {
233 for ( j = 0; j < polygon->pol[ i ].nverts; j++ ) {
234 pv = &polygon->pol[ i ].v[ j ];
236 pv->vm = _pico_calloc( pv->nvmaps, sizeof( lwVMapPt ) );
245 /* fill in vmap references for each mapped point */
250 for ( i = 0; i < vm->nverts; i++ ) {
251 for ( j = 0; j < polygon->pol[ vm->pindex[ i ]].nverts; j++ ) {
252 pv = &polygon->pol[ vm->pindex[ i ]].v[ j ];
253 if ( vm->vindex[ i ] == pv->index ) {
254 pv->vm[ pv->nvmaps ].vmap = vm;
255 pv->vm[ pv->nvmaps ].index = i;