256 lines
6.7 KiB
C
256 lines
6.7 KiB
C
/*
|
|
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
|
|
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
|
|
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
|
|
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
|
|
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
|
|
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
|
|
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
|
|
**
|
|
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
|
|
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
|
|
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
|
|
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
|
|
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
|
|
** THE UNITED STATES.
|
|
**
|
|
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
|
|
**
|
|
** $Revision$
|
|
** $Date$
|
|
*/
|
|
#include <conio.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include <glide.h>
|
|
|
|
int main( int argc, char **argv )
|
|
{
|
|
GrMipMapId_t mmid1, mmid2;
|
|
Gu3dfInfo info1, info2;
|
|
static GrHwConfiguration hwconfig;
|
|
GrVertex vtx[4];
|
|
int width, height;
|
|
float smult, tmult;
|
|
|
|
if((argc != 2) && (argc != 3) )
|
|
{
|
|
fprintf( stderr, "Usage: view3df file1.3df [file2.3df]\n" );
|
|
exit( -1 );
|
|
}
|
|
|
|
grGlideInit();
|
|
|
|
if ( !grSstQueryHardware( &hwconfig ) )
|
|
{
|
|
fprintf( stderr, "main: grSstQueryHardware failed!" );
|
|
exit( -1 );
|
|
}
|
|
|
|
grSstSelect( 0 );
|
|
if ( !grSstWinOpen( 0,
|
|
GR_RESOLUTION_640x480,
|
|
GR_REFRESH_60Hz,
|
|
GR_COLORFORMAT_ABGR,
|
|
GR_ORIGIN_UPPER_LEFT,
|
|
2, 0 ) )
|
|
{
|
|
fprintf( stderr, "main: grSstOpen failed!" );
|
|
exit( -1 );
|
|
}
|
|
|
|
grRenderBuffer( GR_BUFFER_FRONTBUFFER );
|
|
|
|
/*********/
|
|
if( !gu3dfGetInfo( argv[1], &info1 ) )
|
|
{
|
|
fprintf( stderr, "Not able to get info on %s\n", argv[1] );
|
|
exit( -1 );
|
|
}
|
|
info1.data = malloc( info1.mem_required );
|
|
gu3dfLoad( argv[1], &info1 );
|
|
|
|
mmid1 = guTexAllocateMemory( 0, 0x3,
|
|
info1.header.width, info1.header.height,
|
|
info1.header.format,
|
|
GR_MIPMAP_NEAREST_DITHER,
|
|
info1.header.small_lod, info1.header.large_lod,
|
|
info1.header.aspect_ratio,
|
|
GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP,
|
|
GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR,
|
|
0.0F,
|
|
FXFALSE );
|
|
|
|
guTexDownloadMipMap( mmid1, info1.data, &info1.table.nccTable );
|
|
|
|
/*********/
|
|
if (argc == 3) {
|
|
if( !gu3dfGetInfo( argv[2], &info2 ) )
|
|
{
|
|
fprintf( stderr, "Not able to get info on %s\n", argv[2] );
|
|
exit( -1 );
|
|
}
|
|
info2.data = malloc( info2.mem_required );
|
|
gu3dfLoad( argv[2], &info2 );
|
|
|
|
mmid2 = guTexAllocateMemory( 0, 0x3,
|
|
info2.header.width, info2.header.height,
|
|
info2.header.format,
|
|
GR_MIPMAP_NEAREST_DITHER,
|
|
info2.header.small_lod, info2.header.large_lod,
|
|
info2.header.aspect_ratio,
|
|
GR_TEXTURECLAMP_WRAP, GR_TEXTURECLAMP_WRAP,
|
|
GR_TEXTUREFILTER_BILINEAR, GR_TEXTUREFILTER_BILINEAR,
|
|
0.0F,
|
|
FXFALSE );
|
|
|
|
guTexDownloadMipMap( mmid2, info2.data, &info2.table.nccTable );
|
|
}
|
|
|
|
/*********/
|
|
grTexCombineFunction( GR_TMU0, GR_TEXTURECOMBINE_DECAL );
|
|
guColorCombineFunction( GR_COLORCOMBINE_DECAL_TEXTURE );
|
|
|
|
/*********/
|
|
guTexSource( mmid1 );
|
|
|
|
width = info1.header.width;
|
|
height = info1.header.height;
|
|
|
|
switch( info1.header.aspect_ratio )
|
|
{
|
|
case GR_ASPECT_8x1:
|
|
smult = 1.0f;
|
|
tmult = 0.125f;
|
|
break;
|
|
case GR_ASPECT_4x1:
|
|
smult = 1.0f;
|
|
tmult = 0.25f;
|
|
break;
|
|
case GR_ASPECT_2x1:
|
|
smult = 1.0f;
|
|
tmult = 0.5f;
|
|
break;
|
|
case GR_ASPECT_1x1:
|
|
smult = 1.0f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x2:
|
|
smult = 0.5f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x4:
|
|
smult = 0.25f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x8:
|
|
smult = 0.125f;
|
|
tmult = 1.0f;
|
|
break;
|
|
}
|
|
|
|
vtx[0].x = 0.0f;
|
|
vtx[0].y = 0.0f + 100.0f;
|
|
vtx[0].oow = 1.0f;
|
|
vtx[0].tmuvtx[0].sow = 0.0f;
|
|
vtx[0].tmuvtx[0].tow = 0.0f;
|
|
|
|
vtx[1].x = width - 1.0f;
|
|
vtx[1].y = 0.0f + 100.0f;
|
|
vtx[1].oow = 1.0f;
|
|
vtx[1].tmuvtx[0].sow = 255.0f * smult;
|
|
vtx[1].tmuvtx[0].tow = 0.0f;
|
|
|
|
vtx[2].x = width - 1.0f;
|
|
vtx[2].y = height - 1.0f + 100.0f;
|
|
vtx[2].oow = 1.0f;
|
|
vtx[2].tmuvtx[0].sow = 255.0f * smult;
|
|
vtx[2].tmuvtx[0].tow = 255.0f * tmult;
|
|
|
|
vtx[3].x = 0.0f;
|
|
vtx[3].y = height - 1.0f + 100.0f;
|
|
vtx[3].oow = 1.0f;
|
|
vtx[3].tmuvtx[0].sow = 0.0f;
|
|
vtx[3].tmuvtx[0].tow = 255.0f * tmult;
|
|
|
|
grDrawTriangle( &vtx[0], &vtx[1], &vtx[2] );
|
|
grDrawTriangle( &vtx[0], &vtx[2], &vtx[3] );
|
|
|
|
/****************/
|
|
if (argc == 3) {
|
|
guTexSource( mmid2 );
|
|
width = info2.header.width;
|
|
height = info2.header.height;
|
|
|
|
switch( info2.header.aspect_ratio )
|
|
{
|
|
case GR_ASPECT_8x1:
|
|
smult = 1.0f;
|
|
tmult = 0.125f;
|
|
break;
|
|
case GR_ASPECT_4x1:
|
|
smult = 1.0f;
|
|
tmult = 0.25f;
|
|
break;
|
|
case GR_ASPECT_2x1:
|
|
smult = 1.0f;
|
|
tmult = 0.5f;
|
|
break;
|
|
case GR_ASPECT_1x1:
|
|
smult = 1.0f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x2:
|
|
smult = 0.5f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x4:
|
|
smult = 0.25f;
|
|
tmult = 1.0f;
|
|
break;
|
|
case GR_ASPECT_1x8:
|
|
smult = 0.125f;
|
|
tmult = 1.0f;
|
|
break;
|
|
}
|
|
|
|
vtx[0].x = 0.0f + 258.0f;
|
|
vtx[0].y = 0.0f + 100.0f;
|
|
vtx[0].oow = 1.0f;
|
|
vtx[0].tmuvtx[0].sow = 0.0f;
|
|
vtx[0].tmuvtx[0].tow = 0.0f;
|
|
|
|
vtx[1].x = width - 1 + 258.0f;
|
|
vtx[1].y = 0.0f + 100.0f;
|
|
vtx[1].oow = 1.0f;
|
|
vtx[1].tmuvtx[0].sow = 255.0f * smult;
|
|
vtx[1].tmuvtx[0].tow = 0.0f;
|
|
|
|
vtx[2].x = width - 1 + 258.0f;
|
|
vtx[2].y = height - 1 + 100.0f;
|
|
vtx[2].oow = 1.0f;
|
|
vtx[2].tmuvtx[0].sow = 255.0f * smult;
|
|
vtx[2].tmuvtx[0].tow = 255.0f * tmult;
|
|
|
|
vtx[3].x = 0.0f + 258.0f;
|
|
vtx[3].y = height - 1 + 100.0f;
|
|
vtx[3].oow = 1.0f;
|
|
vtx[3].tmuvtx[0].sow = 0.0f;
|
|
vtx[3].tmuvtx[0].tow = 255.0f * tmult;
|
|
|
|
grDrawTriangle( &vtx[0], &vtx[1], &vtx[2] );
|
|
grDrawTriangle( &vtx[0], &vtx[2], &vtx[3] );
|
|
}
|
|
|
|
printf( "Hit a key to exit\n" );
|
|
fflush( stdout );
|
|
getch();
|
|
|
|
grGlideShutdown();
|
|
|
|
return 0;
|
|
}
|