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