X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=libs%2Fpicomodel%2Fpm_terrain.c;fp=libs%2Fpicomodel%2Fpm_terrain.c;h=93b79840f7b0722ae17705e74871b92b0baf86d9;hb=9557abbf571aaf6bd9180e05baa209f25ebade3a;hp=b31671193f60ee059087ae3c3d7c74c813e5de95;hpb=0b86577ab8b9bcd3403b77eafc33c2048b147d35;p=xonotic%2Fnetradiant.git diff --git a/libs/picomodel/pm_terrain.c b/libs/picomodel/pm_terrain.c index b3167119..93b79840 100644 --- a/libs/picomodel/pm_terrain.c +++ b/libs/picomodel/pm_terrain.c @@ -1,36 +1,36 @@ /* ----------------------------------------------------------------------------- -PicoModel Library + PicoModel Library -Copyright (c) 2003, Randy Reddig & seaw0lf -All rights reserved. + Copyright (c) 2003, Randy Reddig & seaw0lf + All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. + Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. -Neither the names of the copyright holders nor the names of its contributors may -be used to endorse or promote products derived from this software without -specific prior written permission. + Neither the names of the copyright holders nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ */ + ----------------------------------------------------------------------------- */ @@ -46,75 +46,72 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. typedef struct tga_s { - unsigned char id_length, colormap_type, image_type; - unsigned short colormap_index, colormap_length; - unsigned char colormap_size; - unsigned short x_origin, y_origin, width, height; - unsigned char pixel_size, attributes; + unsigned char id_length, colormap_type, image_type; + unsigned short colormap_index, colormap_length; + unsigned char colormap_size; + unsigned short x_origin, y_origin, width, height; + unsigned char pixel_size, attributes; } tga_t; /* -_terrain_load_tga_buffer() -loads a tga image into a newly allocated image buffer -fixme: replace/clean this function -*/ + _terrain_load_tga_buffer() + loads a tga image into a newly allocated image buffer + fixme: replace/clean this function + */ + +void _terrain_load_tga_buffer( unsigned char *buffer, unsigned char **pic, int *width, int *height ){ + int row, column; + int columns, rows, numPixels; + unsigned char *pixbuf; + unsigned char *buf_p; + tga_t targa_header; + unsigned char *targa_rgba; + -void _terrain_load_tga_buffer( unsigned char *buffer, unsigned char **pic, int *width, int *height ) -{ - int row, column; - int columns, rows, numPixels; - unsigned char *pixbuf; - unsigned char *buf_p; - tga_t targa_header; - unsigned char *targa_rgba; - - *pic = NULL; - - if( buffer == NULL ) + + if ( buffer == NULL ) { return; - + } + buf_p = buffer; - + targa_header.id_length = *buf_p++; targa_header.colormap_type = *buf_p++; targa_header.image_type = *buf_p++; - - targa_header.colormap_index = _pico_little_short ( *(short*)buf_p ); + + targa_header.colormap_index = _pico_little_short( *(short*)buf_p ); buf_p += 2; - targa_header.colormap_length = _pico_little_short ( *(short*) buf_p ); + targa_header.colormap_length = _pico_little_short( *(short*) buf_p ); buf_p += 2; targa_header.colormap_size = *buf_p++; - targa_header.x_origin = _pico_little_short ( *(short*) buf_p ); + targa_header.x_origin = _pico_little_short( *(short*) buf_p ); buf_p += 2; - targa_header.y_origin = _pico_little_short ( *(short*) buf_p ); + targa_header.y_origin = _pico_little_short( *(short*) buf_p ); buf_p += 2; - targa_header.width = _pico_little_short ( *(short*) buf_p ); + targa_header.width = _pico_little_short( *(short*) buf_p ); buf_p += 2; - targa_header.height = _pico_little_short ( *(short*) buf_p ); + targa_header.height = _pico_little_short( *(short*) buf_p ); buf_p += 2; targa_header.pixel_size = *buf_p++; targa_header.attributes = *buf_p++; - if( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) - { - _pico_printf( PICO_ERROR, "Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported\n"); + if ( targa_header.image_type != 2 && targa_header.image_type != 10 && targa_header.image_type != 3 ) { + _pico_printf( PICO_ERROR, "Only type 2 (RGB), 3 (gray), and 10 (RGB) TGA images supported\n" ); pic = NULL; return; } - if( targa_header.colormap_type != 0 ) - { + if ( targa_header.colormap_type != 0 ) { _pico_printf( PICO_ERROR, "Indexed color TGA images not supported\n" ); return; } - if( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 && targa_header.image_type != 3 ) - { - _pico_printf( PICO_ERROR, "Only 32 or 24 bit TGA images supported (not indexed color)\n"); + if ( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 && targa_header.image_type != 3 ) { + _pico_printf( PICO_ERROR, "Only 32 or 24 bit TGA images supported (not indexed color)\n" ); pic = NULL; return; } @@ -123,29 +120,31 @@ void _terrain_load_tga_buffer( unsigned char *buffer, unsigned char **pic, int * rows = targa_header.height; numPixels = columns * rows; - if (width) + if ( width ) { *width = columns; - if (height) + } + if ( height ) { *height = rows; + } targa_rgba = _pico_alloc( numPixels * 4 ); *pic = targa_rgba; - if (targa_header.id_length != 0) + if ( targa_header.id_length != 0 ) { buf_p += targa_header.id_length; // skip TARGA image comment - - if ( targa_header.image_type==2 || targa_header.image_type == 3 ) - { + + } + if ( targa_header.image_type == 2 || targa_header.image_type == 3 ) { // Uncompressed RGB or gray scale image - for(row=rows-1; row>=0; row--) + for ( row = rows - 1; row >= 0; row-- ) { - pixbuf = targa_rgba + row*columns*4; - for(column=0; column=0; row--) { - pixbuf = targa_rgba + row*columns*4; - for(column=0; column= 0; row-- ) { + pixbuf = targa_rgba + row * columns * 4; + for ( column = 0; column < columns; ) { + packetHeader = *buf_p++; + packetSize = 1 + ( packetHeader & 0x7f ); + if ( packetHeader & 0x80 ) { // run-length packet + switch ( targa_header.pixel_size ) { + case 24: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = 255; + break; + case 32: + blue = *buf_p++; + green = *buf_p++; + red = *buf_p++; + alphabyte = *buf_p++; + break; + default: + //Error("LoadTGA: illegal pixel_size '%d' in file '%s'\n", targa_header.pixel_size, name ); + break; } - - for(j=0;j0) + if ( column == columns ) { // run spans across rows + column = 0; + if ( row > 0 ) { row--; - else + } + else{ goto breakOut; - pixbuf = targa_rgba + row*columns*4; + } + pixbuf = targa_rgba + row * columns * 4; } } } else { // non run-length packet - for(j=0;j0) + if ( column == columns ) { // pixel packet run spans across rows + column = 0; + if ( row > 0 ) { row--; - else + } + else{ goto breakOut; - pixbuf = targa_rgba + row*columns*4; - } + } + pixbuf = targa_rgba + row * columns * 4; + } } } } - breakOut:; +breakOut:; } } /* fix vertically flipped image */ - if( (targa_header.attributes & (1<<5)) ) - { + if ( ( targa_header.attributes & ( 1 << 5 ) ) ) { int flip; - for (row = 0; row < .5f * rows; row++) + for ( row = 0; row < .5f * rows; row++ ) { - for (column = 0; column < columns; column++) + for ( column = 0; column < columns; column++ ) { - flip = *( (int*)targa_rgba + row * columns + column); - *( (int*)targa_rgba + row * columns + column) = *( (int*)targa_rgba + ( ( rows - 1 ) - row ) * columns + column ); + flip = *( (int*)targa_rgba + row * columns + column ); + *( (int*)targa_rgba + row * columns + column ) = *( (int*)targa_rgba + ( ( rows - 1 ) - row ) * columns + column ); *( (int*)targa_rgba + ( ( rows - 1 ) - row ) * columns + column ) = flip; } } @@ -293,34 +294,34 @@ void _terrain_load_tga_buffer( unsigned char *buffer, unsigned char **pic, int * /* -_terrain_canload() -validates a picoterrain file -*/ + _terrain_canload() + validates a picoterrain file + */ + +static int _terrain_canload( PM_PARAMS_CANLOAD ){ + picoParser_t *p; + -static int _terrain_canload( PM_PARAMS_CANLOAD ) -{ - picoParser_t *p; - - /* create pico parser */ p = _pico_new_parser( (const picoByte_t*) buffer, bufSize ); - if( p == NULL ) + if ( p == NULL ) { return PICO_PMV_ERROR_MEMORY; - + } + /* get first token */ - if( _pico_parse_first( p ) == NULL) + if ( _pico_parse_first( p ) == NULL ) { return PICO_PMV_ERROR_IDENT; - + } + /* check first token */ - if( _pico_stricmp( p->token, "picoterrain" ) ) - { + if ( _pico_stricmp( p->token, "picoterrain" ) ) { _pico_free_parser( p ); return PICO_PMV_ERROR_IDENT; } - + /* free the pico parser object */ _pico_free_parser( p ); - + /* file seems to be a valid picoterrain file */ return PICO_PMV_OK; } @@ -328,259 +329,255 @@ static int _terrain_canload( PM_PARAMS_CANLOAD ) /* -_terrain_load() -loads a picoterrain file -*/ + _terrain_load() + loads a picoterrain file + */ + +static picoModel_t *_terrain_load( PM_PARAMS_LOAD ){ + int i, j, v, pw[ 5 ], r; + picoParser_t *p; + + char *shader, *heightmapFile, *colormapFile; + picoVec3_t scale, origin; + + unsigned char *imageBuffer; + int imageBufSize, w, h, cw, ch; + unsigned char *heightmap, *colormap, *heightPixel, *colorPixel; + + picoModel_t *picoModel; + picoSurface_t *picoSurface; + picoShader_t *picoShader; + picoVec3_t xyz, normal; + picoVec2_t st; + picoColor_t color; + -static picoModel_t *_terrain_load( PM_PARAMS_LOAD ) -{ - int i, j, v, pw[ 5 ], r; - picoParser_t *p; - - char *shader, *heightmapFile, *colormapFile; - picoVec3_t scale, origin; - - unsigned char *imageBuffer; - int imageBufSize, w, h, cw, ch; - unsigned char *heightmap, *colormap, *heightPixel, *colorPixel; - - picoModel_t *picoModel; - picoSurface_t *picoSurface; - picoShader_t *picoShader; - picoVec3_t xyz, normal; - picoVec2_t st; - picoColor_t color; - - /* create pico parser */ p = _pico_new_parser( (const picoByte_t*) buffer, bufSize ); - if( p == NULL ) + if ( p == NULL ) { return NULL; - + } + /* get first token */ - if( _pico_parse_first( p ) == NULL) + if ( _pico_parse_first( p ) == NULL ) { return NULL; - + } + /* check first token */ - if( _pico_stricmp( p->token, "picoterrain" ) ) - { + if ( _pico_stricmp( p->token, "picoterrain" ) ) { _pico_printf( PICO_ERROR, "Invalid PicoTerrain model" ); _pico_free_parser( p ); return NULL; } - + /* setup */ shader = heightmapFile = colormapFile = NULL; _pico_set_vec( scale, 512, 512, 32 ); - + /* parse ase model file */ - while( 1 ) + while ( 1 ) { /* get first token on line */ - if( !_pico_parse_first( p ) ) + if ( !_pico_parse_first( p ) ) { break; - + } + /* skip empty lines */ - if( !p->token || !p->token[ 0 ] ) + if ( !p->token || !p->token[ 0 ] ) { continue; - + } + /* shader */ - if( !_pico_stricmp( p->token, "shader" ) ) - { - if( _pico_parse( p, 0 ) && p->token[ 0 ] ) - { - if( shader != NULL ) + if ( !_pico_stricmp( p->token, "shader" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( shader != NULL ) { _pico_free( shader ); + } shader = _pico_clone_alloc( p->token ); } } - + /* heightmap */ - else if( !_pico_stricmp( p->token, "heightmap" ) ) - { - if( _pico_parse( p, 0 ) && p->token[ 0 ] ) - { - if( heightmapFile != NULL ) + else if ( !_pico_stricmp( p->token, "heightmap" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( heightmapFile != NULL ) { _pico_free( heightmapFile ); + } heightmapFile = _pico_clone_alloc( p->token ); } } - + /* colormap */ - else if( !_pico_stricmp( p->token, "colormap" ) ) - { - if( _pico_parse( p, 0 ) && p->token[ 0 ] ) - { - if( colormapFile != NULL ) + else if ( !_pico_stricmp( p->token, "colormap" ) ) { + if ( _pico_parse( p, 0 ) && p->token[ 0 ] ) { + if ( colormapFile != NULL ) { _pico_free( colormapFile ); + } colormapFile = _pico_clone_alloc( p->token ); } } - + /* scale */ - else if( !_pico_stricmp( p->token, "scale" ) ) - { + else if ( !_pico_stricmp( p->token, "scale" ) ) { _pico_parse_vec( p, scale ); } - + /* skip unparsed rest of line and continue */ _pico_parse_skip_rest( p ); } - + /* ----------------------------------------------------------------- */ - + /* load heightmap */ heightmap = imageBuffer = NULL; _pico_load_file( heightmapFile, &imageBuffer, &imageBufSize ); _terrain_load_tga_buffer( imageBuffer, &heightmap, &w, &h ); _pico_free( heightmapFile ); _pico_free_file( imageBuffer ); - - if( heightmap == NULL || w < 2 || h < 2 ) - { + + if ( heightmap == NULL || w < 2 || h < 2 ) { _pico_printf( PICO_ERROR, "PicoTerrain model with invalid heightmap" ); - if( shader != NULL ) + if ( shader != NULL ) { _pico_free( shader ); - if( colormapFile != NULL ) + } + if ( colormapFile != NULL ) { _pico_free( colormapFile ); + } _pico_free_parser( p ); return NULL; } - + /* set origin (bottom lowest corner of terrain mesh) */ - _pico_set_vec( origin, (w / -2) * scale[ 0 ], (h / -2) * scale[ 1 ], -128 * scale[ 2 ] ); - + _pico_set_vec( origin, ( w / -2 ) * scale[ 0 ], ( h / -2 ) * scale[ 1 ], -128 * scale[ 2 ] ); + /* load colormap */ colormap = imageBuffer = NULL; _pico_load_file( colormapFile, &imageBuffer, &imageBufSize ); _terrain_load_tga_buffer( imageBuffer, &colormap, &cw, &ch ); _pico_free( colormapFile ); _pico_free_file( imageBuffer ); - - if( cw != w || ch != h ) - { + + if ( cw != w || ch != h ) { _pico_printf( PICO_WARNING, "PicoTerrain colormap/heightmap size mismatch" ); _pico_free( colormap ); colormap = NULL; } - + /* ----------------------------------------------------------------- */ - + /* create new pico model */ picoModel = PicoNewModel(); - if( picoModel == NULL ) - { + if ( picoModel == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model" ); return NULL; } - + /* do model setup */ PicoSetModelFrameNum( picoModel, frameNum ); PicoSetModelNumFrames( picoModel, 1 ); /* sea */ PicoSetModelName( picoModel, fileName ); PicoSetModelFileName( picoModel, fileName ); - + /* allocate new pico surface */ picoSurface = PicoNewSurface( picoModel ); - if( picoSurface == NULL ) - { + if ( picoSurface == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" ); PicoFreeModel( picoModel ); /* sea */ return NULL; } - + /* terrain surfaces are triangle meshes */ PicoSetSurfaceType( picoSurface, PICO_TRIANGLES ); - + /* set surface name */ PicoSetSurfaceName( picoSurface, "picoterrain" ); - + /* create new pico shader */ picoShader = PicoNewShader( picoModel ); - if( picoShader == NULL ) - { + if ( picoShader == NULL ) { _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" ); PicoFreeModel( picoModel ); _pico_free( shader ); return NULL; } - + /* detox and set shader name */ _pico_setfext( shader, "" ); _pico_unixify( shader ); PicoSetShaderName( picoShader, shader ); _pico_free( shader ); - + /* associate current surface with newly created shader */ PicoSetSurfaceShader( picoSurface, picoShader ); - + /* make bogus normal */ _pico_set_vec( normal, 0.0f, 0.0f, 0.0f ); - + /* create mesh */ - for( j = 0; j < h; j++ ) + for ( j = 0; j < h; j++ ) { - for( i = 0; i < w; i++ ) + for ( i = 0; i < w; i++ ) { /* get pointers */ - v = i + (j * w); + v = i + ( j * w ); heightPixel = heightmap + v * 4; colorPixel = colormap - ? colormap + v * 4 - : NULL; - + ? colormap + v * 4 + : NULL; + /* set xyz */ _pico_set_vec( xyz, origin[ 0 ] + scale[ 0 ] * i, - origin[ 1 ] + scale[ 1 ] * j, - origin[ 2 ] + scale[ 2 ] * heightPixel[ 0 ] ); + origin[ 1 ] + scale[ 1 ] * j, + origin[ 2 ] + scale[ 2 ] * heightPixel[ 0 ] ); PicoSetSurfaceXYZ( picoSurface, v, xyz ); - + /* set normal */ PicoSetSurfaceNormal( picoSurface, v, normal ); - + /* set st */ st[ 0 ] = (float) i; st[ 1 ] = (float) j; PicoSetSurfaceST( picoSurface, 0, v, st ); - + /* set color */ - if( colorPixel != NULL ) + if ( colorPixel != NULL ) { _pico_set_color( color, colorPixel[ 0 ], colorPixel[ 1 ], colorPixel[ 2 ], colorPixel[ 3 ] ); - else + } + else{ _pico_set_color( color, 255, 255, 255, 255 ); + } PicoSetSurfaceColor( picoSurface, 0, v, color ); - + /* set triangles (zero alpha in heightmap suppresses this quad) */ - if( i < (w - 1) && j < (h - 1) && heightPixel[ 3 ] >= 128 ) - { + if ( i < ( w - 1 ) && j < ( h - 1 ) && heightPixel[ 3 ] >= 128 ) { /* set indexes */ - pw[ 0 ] = i + (j * w); - pw[ 1 ] = i + ((j + 1) * w); - pw[ 2 ] = i + 1 + ((j + 1) * w); - pw[ 3 ] = i + 1 + (j * w); - pw[ 4 ] = i + (j * w); /* same as pw[ 0 ] */ - + pw[ 0 ] = i + ( j * w ); + pw[ 1 ] = i + ( ( j + 1 ) * w ); + pw[ 2 ] = i + 1 + ( ( j + 1 ) * w ); + pw[ 3 ] = i + 1 + ( j * w ); + pw[ 4 ] = i + ( j * w ); /* same as pw[ 0 ] */ + /* set radix */ - r = (i + j) & 1; - + r = ( i + j ) & 1; + /* make first triangle */ - PicoSetSurfaceIndex( picoSurface, (v * 6 + 0), (picoIndex_t) pw[ r + 0 ] ); - PicoSetSurfaceIndex( picoSurface, (v * 6 + 1), (picoIndex_t) pw[ r + 1 ] ); - PicoSetSurfaceIndex( picoSurface, (v * 6 + 2), (picoIndex_t) pw[ r + 2 ] ); - + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 0 ), (picoIndex_t) pw[ r + 0 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 1 ), (picoIndex_t) pw[ r + 1 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 2 ), (picoIndex_t) pw[ r + 2 ] ); + /* make second triangle */ - PicoSetSurfaceIndex( picoSurface, (v * 6 + 3), (picoIndex_t) pw[ r + 0 ] ); - PicoSetSurfaceIndex( picoSurface, (v * 6 + 4), (picoIndex_t) pw[ r + 2 ] ); - PicoSetSurfaceIndex( picoSurface, (v * 6 + 5), (picoIndex_t) pw[ r + 3 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 3 ), (picoIndex_t) pw[ r + 0 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 4 ), (picoIndex_t) pw[ r + 2 ] ); + PicoSetSurfaceIndex( picoSurface, ( v * 6 + 5 ), (picoIndex_t) pw[ r + 3 ] ); } } } - + /* free stuff */ _pico_free_parser( p ); _pico_free( heightmap ); _pico_free( colormap ); - + /* return the new pico model */ return picoModel; } @@ -590,15 +587,15 @@ static picoModel_t *_terrain_load( PM_PARAMS_LOAD ) /* pico file format module definition */ const picoModule_t picoModuleTerrain = { - "1.3", /* module version string */ - "PicoTerrain", /* module display name */ - "Randy Reddig", /* author's name */ - "2003 Randy Reddig", /* module copyright */ + "1.3", /* module version string */ + "PicoTerrain", /* module display name */ + "Randy Reddig", /* author's name */ + "2003 Randy Reddig", /* module copyright */ { - "picoterrain", NULL, NULL, NULL /* default extensions to use */ + "picoterrain", NULL, NULL, NULL /* default extensions to use */ }, - _terrain_canload, /* validation routine */ - _terrain_load, /* load routine */ - NULL, /* save validation routine */ - NULL /* save routine */ + _terrain_canload, /* validation routine */ + _terrain_load, /* load routine */ + NULL, /* save validation routine */ + NULL /* save routine */ };