void render_cloud_polygon ( int number_of_points, cloud_3d_textured_reference *point_references, vertex *transformed_points, cloud_3d_point *source_points, float alpha_blend, screen *texture ) { int count, alpha, first_point, this_point, previous_point, outcode, outcode2; vertex *polygon; first_point = point_references->point; this_point = first_point; outcode = transformed_points[this_point].outcode; outcode2 = transformed_points[this_point].outcode; convert_float_to_int ( ( source_points[this_point].a * alpha_blend * 255 ), &alpha ); transformed_points[this_point].u = point_references->u; transformed_points[this_point].v = point_references->v; transformed_points[this_point].alpha = alpha; point_references++; for ( count = 1; count < number_of_points; count++ ) { previous_point = this_point; this_point = point_references->point; outcode |= transformed_points[this_point].outcode; outcode2 &= transformed_points[this_point].outcode; convert_float_to_int ( ( source_points[this_point].a * alpha_blend * 255 ), &alpha ); transformed_points[this_point].u = point_references->u; transformed_points[this_point].v = point_references->v; transformed_points[this_point].alpha = alpha; cloud_transformed_3d_points[previous_point].next_vertex = &cloud_transformed_3d_points[this_point]; point_references++; } cloud_transformed_3d_points[this_point].next_vertex = NULL; if ( !outcode2 ) { polygon = &cloud_transformed_3d_points[first_point]; clip_3d_coord = 0; if ( outcode & CLIP_HITHER ) { polygon = hither_clip_3d_polygon ( polygon, &outcode ); if ( !polygon ) { return; } } if ( outcode ) { apply_perspective_to_polygon_texture ( polygon ); polygon = clip_3d_polygon ( polygon, outcode ); if ( !polygon ) { return; } remove_perspective_from_polygon_texture ( polygon ); } if ( polygon ) { set_d3d_int_state ( D3DRENDERSTATE_SPECULARENABLE, FALSE ); set_d3d_int_state ( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA ); set_d3d_int_state ( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA ); set_d3d_gouraud_shaded_textured_renderstate ( texture ); set_d3d_texture_stage_state ( 0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP ); set_d3d_texture_stage_state ( 0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP ); set_d3d_texture_stage_state ( 0, D3DTSS_MAGFILTER, D3DTFG_LINEAR ); set_d3d_texture_stage_state ( 0, D3DTSS_MINFILTER, D3DTFN_LINEAR ); { int number_of_vertices; vertex *vert; LPD3DTLVERTEX vertices, vptr; vert = polygon; vertices = get_d3d_vertices_address ( polygon, &number_of_vertices ); vptr = vertices; while ( vert ) { real_colour specular; specular.colour = d3d_fog_intensity; specular.red = vert->specular; specular.green = vert->specular; specular.blue = vert->specular; *( ( int * ) &vptr->sx ) = *( ( int * ) &vert->i ); *( ( int * ) &vptr->sy ) = *( ( int * ) &vert->j ); *( ( int * ) &vptr->tu ) = *( ( int * ) &vert->u ); *( ( int * ) &vptr->tv ) = *( ( int * ) &vert->v ); *( ( int * ) &vptr->rhw ) = *( ( int * ) &vert->q ); vptr->sz = ( vert->q * zbuffer_factor ) + zbuffer_constant; vptr->r = vert->red; vptr->g = vert->green; vptr->b = vert->blue; vptr->a = vert->alpha; vptr->color = vert->colour; vptr->specular = specular.colour; if ( vptr->sz >= 1.0 ) { vptr->sz = 0.999; } vptr++; vert = vert->next_vertex; } draw_fan_primitive ( number_of_vertices, vertices ); } // draw_wbuffered_gouraud_shaded_textured_polygon ( polygon ); } } }
void render_smoke_trail_polygon ( vertex *poly, screen *texture, int additive ) { int outcode; vertex *tmp; tmp = poly; outcode = 0; while ( tmp ) { outcode |= tmp->outcode; tmp = tmp->next_vertex; } if ( outcode ) { clip_3d_coord = 0; if ( outcode & CLIP_HITHER ) { poly = hither_clip_3d_polygon ( poly, &outcode ); if ( !poly ) { outcode = 0; } } if ( outcode ) { apply_perspective_to_polygon_texture ( poly ); poly = clip_3d_polygon ( poly, outcode ); if ( poly ) { remove_perspective_from_polygon_texture ( poly ); } } } if ( poly ) { // d3d_fog_intensity = RGBA_MAKE ( 0, 0, 0, 255 ); // // Set the required renderstates // set_d3d_int_state ( D3DRENDERSTATE_SPECULARENABLE, FALSE ); // set_d3d_int_state ( D3DRENDERSTATE_CULLMODE, D3DCULL_NONE ); set_d3d_texture_stage_state ( 0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP ); set_d3d_texture_stage_state ( 0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP ); set_d3d_texture_stage_state ( 0, D3DTSS_MAGFILTER, D3DTFG_LINEAR ); set_d3d_texture_stage_state ( 0, D3DTSS_MINFILTER, D3DTFN_LINEAR ); set_d3d_texture_stage_state ( 0, D3DTSS_MIPFILTER, D3DTFP_NONE ); if ( additive ) { set_d3d_int_state ( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE ); set_d3d_int_state ( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE ); set_d3d_gouraud_shaded_textured_renderstate ( texture ); draw_wbuffered_gouraud_shaded_textured_polygon ( poly ); } else { set_d3d_int_state ( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA ); set_d3d_int_state ( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA ); set_d3d_gouraud_shaded_textured_renderstate ( texture ); draw_wbuffered_gouraud_shaded_textured_polygon ( poly ); } // set_d3d_int_state ( D3DRENDERSTATE_CULLMODE, D3DCULL_CCW ); } }
void render_unclipped_3d_terrain_tree_gouraud_textured_diffuse_lit_polygon ( object_3d_face *this_face, struct OBJECT_3D_INFO *object_base ) { texture_map *texture; int count; object_transformed_2d_point *vert, *transformed_points; LPD3DTLVERTEX destination_vertices; object_3d_short_textured_point *texture_list; point_3d_plain_reference *gouraud_list; texture = &system_textures[current_object_3d_surface->texture_index]; transformed_points = transformed_3d_2d_points + object_base->points_base; texture_list = NULL; //current_object_3d_texture_list; gouraud_list = NULL; //current_object_3d_gouraud_list; // // Should draw a gouraud shaded polygon // set_d3d_gouraud_shaded_textured_renderstate ( texture ); // set_d3d_int_state ( D3DRENDERSTATE_TEXTUREMAG, current_object_3d_texture_filter ); // set_d3d_int_state ( D3DRENDERSTATE_TEXTUREMIN, current_object_3d_texture_mipmap ); // set_d3d_int_state ( D3DRENDERSTATE_TEXTUREADDRESS, current_object_3d_texture_address ); destination_vertices = get_d3d_vertices_points_address ( this_face->number_of_points ); for ( count = 0; count < this_face->number_of_points; count++ ) { int ir, ig, ib; float r, g, b; real_colour colour; vert = NULL; //transformed_points + current_object_3d_point_list[count].point; *( ( int * ) &destination_vertices[count].sx ) = *( ( int * ) &vert->i ); *( ( int * ) &destination_vertices[count].sy ) = *( ( int * ) &vert->j ); destination_vertices[count].sz = vert->q; destination_vertices[count].rhw = vert->q; destination_vertices[count].tu = ( ( float ) texture_list->u ) / OBJECT_3D_TEXTURE_UV_SCALE; destination_vertices[count].tv = ( ( float ) texture_list->v ) / OBJECT_3D_TEXTURE_UV_SCALE; r = current_object_3d_transformed_normals[gouraud_list->point].r; g = current_object_3d_transformed_normals[gouraud_list->point].g; b = current_object_3d_transformed_normals[gouraud_list->point].b; convert_float_to_int ( ( r * current_tree_colour_red ), &ir ); convert_float_to_int ( ( g * current_tree_colour_green ), &ig ); convert_float_to_int ( ( b * current_tree_colour_blue ), &ib ); colour.red = ir; colour.green = ig; colour.blue = ib; colour.alpha = current_tree_colour_alpha; destination_vertices[count].color = colour.colour; destination_vertices[count].specular = d3d_fog_intensity; gouraud_list++; texture_list++; } draw_fan_primitive ( this_face->number_of_points, destination_vertices ); }