revision 847:2089244671d2
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 847:2089244671d2 |
parent | 846:32ab6b592a8a |
child | 848:34dc33c05106 |
author | nkeynes |
date | Sun Sep 07 04:23:49 2008 +0000 (15 years ago) |
Fog work-in-progress
1.1 --- a/src/pvr2/glrender.c Sat Sep 06 08:16:39 2008 +00001.2 +++ b/src/pvr2/glrender.c Sun Sep 07 04:23:49 2008 +00001.3 @@ -113,6 +113,7 @@1.4 glEnableClientState( GL_VERTEX_ARRAY );1.5 glEnableClientState( GL_TEXTURE_COORD_ARRAY );1.6 glEnableClientState( GL_SECONDARY_COLOR_ARRAY );1.7 + glEnableClientState( GL_FOG_COORDINATE_ARRAY_EXT );1.9 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);1.10 glClearDepth(0);1.11 @@ -181,6 +182,22 @@1.12 } else {1.13 glDisable( GL_TEXTURE_2D );1.14 }1.15 +1.16 + switch( POLY2_FOG_MODE(poly2) ) {1.17 + case PVR2_POLY_FOG_LOOKUP:1.18 + glFogfv( GL_FOG_COLOR, pvr2_scene.fog_lut_colour );1.19 + glEnable( GL_FOG );1.20 + break;1.21 + case PVR2_POLY_FOG_VERTEX:1.22 + if( POLY1_SPECULAR(poly1) ) {1.23 + glFogfv( GL_FOG_COLOR, pvr2_scene.fog_vert_colour );1.24 + glEnable( GL_FOG );1.25 + break;1.26 + } /* else fallthrough */1.27 + default:1.28 + glDisable( GL_FOG );1.29 + }1.30 +1.32 glShadeModel( POLY1_SHADE_MODEL(poly1) );1.34 @@ -296,7 +313,11 @@1.35 glColorPointer(4, GL_FLOAT, sizeof(struct vertex_struct), &pvr2_scene.vertex_array[0].rgba[0]);1.36 glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertex_struct), &pvr2_scene.vertex_array[0].u);1.37 glSecondaryColorPointerEXT(3, GL_FLOAT, sizeof(struct vertex_struct), pvr2_scene.vertex_array[0].offset_rgba );1.38 -1.39 + glFogCoordPointerEXT(GL_FLOAT, sizeof(struct vertex_struct), &pvr2_scene.vertex_array[0].offset_rgba[3] );1.40 + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);1.41 + glFogi(GL_FOG_MODE, GL_LINEAR);1.42 + glFogf(GL_FOG_START, 0.0);1.43 + glFogf(GL_FOG_END, 1.0);1.44 /* Turn on the shaders (if available) */1.45 glsl_enable_shaders(TRUE);
2.1 --- a/src/pvr2/pvr2mmio.h Sat Sep 06 08:16:39 2008 +00002.2 +++ b/src/pvr2/pvr2mmio.h Sun Sep 07 04:23:49 2008 +00002.3 @@ -89,6 +89,7 @@2.4 LONG_PORT( 0x164, TA_LISTBASE, PORT_MRW, 0, "TA Tile list start" )2.5 LONG_PORT( 0x1A8, PVRUNK7, PORT_MRW, 0, "PVR2 unknown register 7" )2.6 LONG_PORT( 0x1AC, PVRUNK8, PORT_MRW, 0, "PVR2 unknown register 8" )2.7 + LONG_PORT( 0x200, RENDER_FOGTABLE, PORT_MRW, 0, "Start of fog table" )2.8 MMIO_REGION_END2.10 MMIO_REGION_BEGIN( 0x005F9000, PVR2PAL, "Power VR/2 CLUT Palettes" )
3.1 --- a/src/pvr2/scene.c Sat Sep 06 08:16:39 2008 +00003.2 +++ b/src/pvr2/scene.c Sun Sep 07 04:23:49 2008 +00003.3 @@ -55,8 +55,15 @@3.4 return temp.f;3.5 }3.7 -3.8 -3.9 +static float parse_fog_density( uint32_t value )3.10 +{3.11 + union {3.12 + uint32_t i;3.13 + float f;3.14 + } u;3.15 + u.i = (((value+127)&0xFF)<<23)|((value & 0xFF00)<<7);3.16 + return u.f;3.17 +}3.20 struct pvr2_scene_struct pvr2_scene;3.21 @@ -245,7 +252,6 @@3.22 unpack_bgra(*data.ival++, vert->rgba);3.23 if( POLY1_SPECULAR(poly1) ) {3.24 unpack_bgra(*data.ival++, vert->offset_rgba);3.25 - vert->offset_rgba[3] = 1.0;3.26 } else {3.27 vert->offset_rgba[0] = 0.0;3.28 vert->offset_rgba[1] = 0.0;3.29 @@ -255,7 +261,6 @@3.31 if( force_alpha ) {3.32 vert->rgba[3] = 1.0;3.33 - vert->offset_rgba[3] = 1.0;3.34 }3.35 }3.37 @@ -329,6 +334,61 @@3.38 }3.39 }3.41 +static float scene_compute_lut_fog_vertex( float z, float fog_density, float fog_table[][2] )3.42 +{3.43 + union {3.44 + uint32_t i;3.45 + float f;3.46 + } v;3.47 + v.f = z * fog_density;3.48 + if( v.f < 1.0 ) v.f = 1.0;3.49 + else if( v.f > 255.9999 ) v.f = 255.9999;3.50 +3.51 + uint32_t index = ((v.i >> 18) & 0x0F)|((v.i>>19)&0x70);3.52 + return fog_table[index][0];3.53 +}3.54 +3.55 +/**3.56 + * Compute the fog coefficients for all polygons using lookup-table fog. It's3.57 + * a little more convenient to do this as a separate pass, since we don't have3.58 + * to worry about computed vertexes.3.59 + */3.60 +static void scene_compute_lut_fog( )3.61 +{3.62 + int i,j;3.63 +3.64 + float fog_density = parse_fog_density(MMIO_READ( PVR2, RENDER_FOGCOEFF ));3.65 + float fog_table[128][2];3.66 +3.67 + /* Parse fog table out into floating-point format */3.68 + for( i=0; i<128; i++ ) {3.69 + uint32_t ent = MMIO_READ( PVR2, RENDER_FOGTABLE + (i<<2) );3.70 + fog_table[i][0] = ((float)(((ent&0x0000FF00)>>8) + 1)) / 256.0;3.71 + fog_table[i][1] = ((float)((ent&0x000000FF) + 1)) / 256.0;3.72 + }3.73 +3.74 +3.75 + for( i=0; i<pvr2_scene.poly_count; i++ ) {3.76 + int mode = POLY2_FOG_MODE(pvr2_scene.poly_array[i].context[1]);3.77 + if( mode == PVR2_POLY_FOG_LOOKUP ) {3.78 + uint32_t index = pvr2_scene.poly_array[i].vertex_index;3.79 + for( j=0; j<=pvr2_scene.poly_array[i].vertex_count; j++ ) {3.80 + pvr2_scene.vertex_array[index+j].offset_rgba[3] =3.81 + scene_compute_lut_fog_vertex( pvr2_scene.vertex_array[index+j].z, fog_density, fog_table );3.82 + }3.83 + } else if( mode == PVR2_POLY_FOG_LOOKUP2 ) {3.84 + uint32_t index = pvr2_scene.poly_array[i].vertex_index;3.85 + for( j=0; j<=pvr2_scene.poly_array[i].vertex_count; j++ ) {3.86 + pvr2_scene.vertex_array[index+j].rgba[0] = pvr2_scene.fog_lut_colour[0];3.87 + pvr2_scene.vertex_array[index+j].rgba[1] = pvr2_scene.fog_lut_colour[1];3.88 + pvr2_scene.vertex_array[index+j].rgba[2] = pvr2_scene.fog_lut_colour[2];3.89 + pvr2_scene.vertex_array[index+j].rgba[3] =3.90 + scene_compute_lut_fog_vertex( pvr2_scene.vertex_array[index+j].z, fog_density, fog_table );3.91 + }3.92 + }3.93 + }3.94 +}3.95 +3.96 static void scene_add_vertexes( pvraddr_t poly_idx, int vertex_length,3.97 gboolean is_modified )3.98 {3.99 @@ -628,6 +688,12 @@3.100 */3.101 pvr2_scene.bounds[1] *= 2;3.102 }3.103 +3.104 + uint32_t fog_col = MMIO_READ( PVR2, RENDER_FOGTBLCOL );3.105 + unpack_bgra( fog_col, pvr2_scene.fog_lut_colour );3.106 + fog_col = MMIO_READ( PVR2, RENDER_FOGVRTCOL );3.107 + unpack_bgra( fog_col, pvr2_scene.fog_vert_colour );3.108 +3.109 uint32_t *tilebuffer = (uint32_t *)(video_base + MMIO_READ( PVR2, RENDER_TILEBASE ));3.110 uint32_t *segment = tilebuffer;3.111 pvr2_scene.segment_list = (struct tile_segment *)tilebuffer;3.112 @@ -688,6 +754,7 @@3.113 } while( (control & SEGMENT_END) == 0 );3.115 scene_extract_background();3.116 + scene_compute_lut_fog();3.118 vertex_buffer_unmap();3.119 }
4.1 --- a/src/pvr2/scene.h Sat Sep 06 08:16:39 2008 +00004.2 +++ b/src/pvr2/scene.h Sun Sep 07 04:23:49 2008 +00004.3 @@ -127,6 +127,9 @@4.4 /** Specifies the translucency auto-sort mode for the scene */4.5 tile_sort_mode_t sort_mode;4.7 + float fog_lut_colour[4];4.8 + float fog_vert_colour[4];4.9 +4.10 /** Pointer to the start of the tile segment list in PVR2 VRAM (32-bit) */4.11 struct tile_segment *segment_list;4.12 /** Map from PVR2 polygon address to an element of poly_array. */
5.1 --- a/src/pvr2/vertex.glsl Sat Sep 06 08:16:39 2008 +00005.2 +++ b/src/pvr2/vertex.glsl Sun Sep 07 04:23:49 2008 +00005.3 @@ -8,4 +8,5 @@5.4 gl_FrontColor = gl_Color;5.5 gl_FrontSecondaryColor = gl_SecondaryColor;5.6 gl_TexCoord[0] = gl_MultiTexCoord0;5.7 + gl_FogFragCoord = gl_FogCoord;5.8 }
.