Пример #1
0
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 );
		}
	}
}
Пример #2
0
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 );
	}
}
Пример #3
0
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 );
}