Esempio n. 1
0
void liquid_render_liquid(map_liquid_type *liq)
{
	int					lmap_txt_idx;
	float				uv_shift;

		// uv factor

	uv_shift=liquid_tide_get_uv_factor(liq);

		// get light map

	if (!setup.debug_on) {
		lmap_txt_idx=liq->lmap_txt_idx;
	}
	else {
		lmap_txt_idx=lmap_white_bitmap.gl_id;
	}

		// draw the reflection liquid
		// or just the regular texture

	if (!liquid_render_liquid_create_vertex(liq,uv_shift,FALSE)) return;

	liquid_render_liquid_layer(liq,liq->txt_idx,lmap_txt_idx,TRUE);
	
		// count the liquid polys
		
	view.count.liquid_poly+=((liq->vbo.vertex_count+2)>>2);

		// draw the overlay?

	if ((!liq->overlay.on) || (liq->overlay.txt_idx==-1)) return;

		// draw the overlay

	view.count.liquid_poly+=((liq->vbo.vertex_count+2)>>2);

	if (!liquid_render_liquid_create_vertex(liq,(uv_shift*0.5f),TRUE)) return;

	liquid_render_liquid_layer(liq,liq->overlay.txt_idx,lmap_txt_idx,FALSE);
}
Esempio n. 2
0
void liquid_render_liquid(int tick,map_liquid_type *liq)
{
	int							v_sz,quad_cnt,frame;
	bool						shader_on;
	texture_type				*texture;
	view_glsl_light_list_type	light_list;

		// setup texture

	texture=&map.textures[liq->txt_idx];
	frame=texture->animate.current_frame&max_texture_frame_mask;

	if (texture->additive) {
		glBlendFunc(GL_SRC_ALPHA,GL_ONE);
	}
	else {
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	}

		// determine if shader in use

	shader_on=(!dim3_debug) && (texture->shader_idx!=-1);

		// create vertexes

	v_sz=liquid_render_liquid_get_max_vertex(liq);

	liquid_render_liquid_create_vertex(tick,liq,v_sz,shader_on);

		// create quads

	quad_cnt=liquid_render_liquid_create_quads(liq);
	if (quad_cnt==0) {
		view_unbind_liquid_vertex_object();
		return;
	}
	
		// start vertex and UV array

	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3,GL_FLOAT,0,0);
		
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glTexCoordPointer(2,GL_FLOAT,0,(void*)((v_sz*3)*sizeof(float)));
		
		// shader drawing

	if (shader_on) {

		gl_lights_build_from_liquid(liq,&light_list);

		gl_shader_draw_start();
		gl_shader_draw_execute(texture,liq->txt_idx,frame,-1,1.0f,liq->alpha,&light_list);

		glDrawElements(GL_QUADS,(quad_cnt*4),GL_UNSIGNED_INT,(GLvoid*)0);
		
		gl_shader_draw_end();

	}

		// regular simple texture drawing

	else {

			// need color pointers for simple drawing

		glEnableClientState(GL_COLOR_ARRAY);
		glColorPointer(3,GL_FLOAT,0,(void*)((v_sz*(3+2))*sizeof(float)));

			// draw texture

		gl_texture_transparent_start();
		gl_texture_transparent_set(texture->frames[frame].bitmap.gl_id,liq->alpha);

		glDrawElements(GL_QUADS,(quad_cnt*4),GL_UNSIGNED_INT,(GLvoid*)0);

		gl_texture_transparent_end();

			// disable color array

		glDisableClientState(GL_COLOR_ARRAY);
	}

		// end arrays

	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);

		// unmap VBOs

	view_unbind_liquid_index_object();
	view_unbind_liquid_vertex_object();
}