diff options
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/draw.cc | 166 | ||||
| -rw-r--r-- | src/render/draw.h | 3 | 
2 files changed, 87 insertions, 82 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc index de08d1d..2efa411 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -260,45 +260,11 @@ void draw_sphere(math::Color const & color, float radius)  	}  } -void draw_globe(const core::EntityGlobe* globe) +void draw_globe_corona(const math::Vector3f location, const math::Color & color, const float radius, const size_t corona_id)   { -	/* -		Globes have to be rendered distance sorted, closest last. -		Globes behind farplane are rescaled and repositioned. -	*/ -	math::Vector3f location(globe->location()); -	float radius = globe->radius(); - -	GLfloat globe_specular[] = { 0.25f, 0.25f, 0.25f, 1.0f }; -	glMaterialfv(GL_FRONT, GL_SPECULAR, globe_specular); - -	if (globe->flag_is_set(core::Entity::Bright)) { -		// bright globe, render fullbright -		gl::disable(GL_LIGHTING); -	} - -	if (ext_render(globe)->distance() > (FARPLANE - globe->radius())) { -		// globe is behind the far plane, make a fake size calculation -		location = Camera::eye() + (location - Camera::eye()) * ((FARPLANE - globe->radius()) / ext_render(globe)->distance()); -		radius  *= (FARPLANE - globe->radius()) / (ext_render(globe)->distance()); - -		gl::depthmask(GL_FALSE); - -		if (has_zone_light) { -			// move zone light -			float fake_light[4]; -			for (size_t i = 0; i < 3; i++) { -				fake_light[i] = zone_light[i] + location[i] - globe->location()[i]; -			} -			fake_light[3] = 1.0f; -			glLightfv(zone_gllight, GL_POSITION, fake_light); -		} -	} -  	// draw the globe's corona -	if (globe->flag_is_set(core::Entity::Bright) && globe->corona_id()) { - -		math::Vector3f v = globe->location() - Camera::eye(); +	if (corona_id) { +		math::Vector3f v = location - Camera::eye();  		v.normalize();  		float a = dotproduct(v, Camera::axis().forward());  		if (a > 0.1f) { @@ -306,22 +272,22 @@ void draw_globe(const core::EntityGlobe* globe)  			gl::disable(GL_DEPTH_TEST);  			gl::enable(GL_TEXTURE_2D); -			Textures::bind(globe->corona_id()); +			Textures::bind(corona_id); -			math::Color color(globe->color()); -			color.a = a - 0.1f; +			math::Color drawcolor(color); +			drawcolor.a = a - 0.1f; -			gl::color(color); +			gl::color(drawcolor);  			gl::begin(gl::Quads);  			glTexCoord2f(0, 1); -			gl::vertex(location + (Camera::axis().up() - Camera::axis().left()) * radius * 4.0f); +			gl::vertex((Camera::axis().up() - Camera::axis().left()) * radius * 4.0f);  			glTexCoord2f(0, 0); -			gl::vertex(location + (Camera::axis().up() + Camera::axis().left()) * radius * 4.0f); +			gl::vertex((Camera::axis().up() + Camera::axis().left()) * radius * 4.0f);  			glTexCoord2f(1, 0); -			gl::vertex(location + (Camera::axis().up() * -1 + Camera::axis().left()) * radius * 4.0f); +			gl::vertex((Camera::axis().up() * -1 + Camera::axis().left()) * radius * 4.0f);  			glTexCoord2f(1, 1); -			gl::vertex(location + (Camera::axis().up() * -1 - Camera::axis().left()) * radius * 4.0f); +			gl::vertex((Camera::axis().up() * -1 - Camera::axis().left()) * radius * 4.0f);  			gl::end();  			Stats::quads++; @@ -330,51 +296,87 @@ void draw_globe(const core::EntityGlobe* globe)  			gl::enable(GL_DEPTH_TEST);  			gl::disable(GL_BLEND);  		} -	} -	 -	if (globe->texture_id()) { -		// textured globe -		Textures::bind(globe->texture_id()); -		gl::enable(GL_TEXTURE_2D); -	} -	 -	// draw the globe and apply rotation if required -	gl::push(); -	gl::translate(location); -	gl::multmatrix(globe->axis()); - -	if (globe->rotationspeed()) { -		float angle = math::degrees360f(core::application()->time() * globe->rotationspeed()); -		gl::rotate(angle, math::Vector3f::Zaxis()); -	} +	}	 +} -	draw_sphere(globe->color(), radius); -	gl::pop(); +void draw_pass_globes() +{ +	// FIXME is this ever reset ? +	GLfloat globe_specular[] = { 0.25f, 0.25f, 0.25f, 1.0f }; +	glMaterialfv(GL_FRONT, GL_SPECULAR, globe_specular); -	if (ext_render(globe)->distance() > (FARPLANE - globe->radius())) { +	// Globes have to be rendered distance sorted, closest last. +	// Globes behind farplane are rescaled and repositioned. +	for (Globes::reverse_iterator rit = globes_list.rbegin(); rit != globes_list.rend(); rit++) { +		const core::EntityGlobe *globe = (*rit).second; +		 +		math::Vector3f location(globe->location());	 +		float radius = globe->radius(); +		 +		if (ext_render(globe)->distance() > (FARPLANE - globe->radius())) { +			// globe is behind the far plane, make a fake size calculation +			location = Camera::eye() + (location - Camera::eye()) * ((FARPLANE - globe->radius()) / ext_render(globe)->distance()); +			radius  *= (FARPLANE - globe->radius()) / (ext_render(globe)->distance()); -		gl::depthmask(GL_TRUE); +			gl::depthmask(GL_FALSE); -		if (has_zone_light) { -			// restore zone light -			glLightfv(zone_gllight, GL_POSITION, zone_light); +			if (has_zone_light) { +				// move zone light +				float fake_light[4]; +				for (size_t i = 0; i < 3; i++) { +					fake_light[i] = zone_light[i] + location[i] - globe->location()[i]; +				} +				fake_light[3] = 1.0f; +				glLightfv(zone_gllight, GL_POSITION, fake_light); +			}  		} -	} +				 +		gl::push(); +		gl::translate(location); +		 +		if (globe->flag_is_set(core::Entity::Bright)) {  +			gl::disable(GL_LIGHTING); +			if (globe->corona_id()) { +				// draw globe corona +				// corona is rendered in camera space +				draw_globe_corona(location, globe->color(), radius, globe->corona_id()); +			} +		} +		 +		if (globe->texture_id()) { +			// textured globe +			Textures::bind(globe->texture_id()); +			gl::enable(GL_TEXTURE_2D); +		} +		 +		gl::multmatrix(globe->axis()); +	 +		if (globe->rotationspeed()) { +			float angle = math::degrees360f(core::application()->time() * globe->rotationspeed()); +			gl::rotate(angle, math::Vector3f::Zaxis()); +		} +		 +		draw_sphere(globe->color(), radius); -	if (globe->flag_is_set(core::Entity::Bright)) { -		gl::enable(GL_LIGHTING); -	} +		gl::pop(); +		 +		if (globe->texture_id()) { +			gl::disable(GL_TEXTURE_2D); +		} +		 +		if (globe->flag_is_set(core::Entity::Bright)) {  +			gl::enable(GL_LIGHTING); +		} +		 +		if (ext_render(globe)->distance() > (FARPLANE - globe->radius())) { -	if (globe->texture_id()) { -		gl::disable(GL_TEXTURE_2D); -	} -} +			gl::depthmask(GL_TRUE); -void draw_pass_globes() -{ -	// draw globes first, closest last -	for (Globes::reverse_iterator rit = globes_list.rbegin(); rit != globes_list.rend(); rit++) { -		draw_globe((*rit).second); +			if (has_zone_light) { +				// restore zone light +				glLightfv(zone_gllight, GL_POSITION, zone_light); +			} +		}  	}  } diff --git a/src/render/draw.h b/src/render/draw.h index 4a758b1..bc02bf5 100644 --- a/src/render/draw.h +++ b/src/render/draw.h @@ -29,6 +29,9 @@ void reset();  /// draw a sphere  void draw_sphere(math::Color const & color, float radius); +/// draw a corona +void draw_globe_corona(const math::Vector3f location, const math::Color & color, const float radius, const size_t corona_id); +  /// draw mode lights and flares  void draw_model_lights(model::Model *model, const float scale,  	const math::Vector3f & entity_location, const math::Axis & entity_axis,  | 
