コード例 #1
0
ファイル: SpaceStation.cpp プロジェクト: Nikoraito/pioneer
vector3d SpaceStation::GetTargetIndicatorPosition(const Frame *relTo) const
{
	// return the next waypoint if permission has been granted for player,
	// and the docking point's position once the docking anim starts
	for (int i=0; i<MAX_DOCKING_PORTS; i++) {
		if (i >= m_type->numDockingPorts) break;
		if ((m_shipDocking[i].ship == Pi::player) && (m_shipDocking[i].stage > 0)) {

			SpaceStationType::positionOrient_t dport;
			if (!m_type->GetShipApproachWaypoints(i, m_shipDocking[i].stage+1, dport))
				PiVerify(m_type->GetDockAnimPositionOrient(i, m_type->numDockingStages,
				1.0f, vector3d(0.0), dport, m_shipDocking[i].ship));
			matrix4x4d rot;
			GetRotMatrix(rot);

			matrix4x4d m;
			Frame::GetFrameRenderTransform(GetFrame(), relTo, m);
			return m * (GetInterpolatedPosition() + (rot*dport.pos));
		}
	}
	return GetInterpolatedPositionRelTo(relTo);
}
コード例 #2
0
ファイル: Body.cpp プロジェクト: AaronSenese/pioneer
vector3d Body::GetInterpolatedPositionRelTo(const Frame *relTo) const
{
	matrix4x4d m;
	Frame::GetFrameRenderTransform(m_frame, relTo, m);
	return m * GetInterpolatedPosition();
}
コード例 #3
0
ファイル: Projectile.cpp プロジェクト: Thargoid/pioneer
void Projectile::Render(const vector3d &viewCoords, const matrix4x4d &viewTransform)
{
	vector3d _from = viewTransform * GetInterpolatedPosition();
	vector3d _to = viewTransform * (GetInterpolatedPosition() + m_dirVel);
	vector3d _dir = _to - _from;
	vector3f from(&_from.x);
	vector3f dir = vector3f(_dir).Normalized();

	vector3f v1, v2;
	matrix4x4f m = matrix4x4f::Identity();
	v1.x = dir.y; v1.y = dir.z; v1.z = dir.x;
	v2 = v1.Cross(dir).Normalized();
	v1 = v2.Cross(dir);
	m[0] = v1.x; m[4] = v2.x; m[8] = dir.x;
	m[1] = v1.y; m[5] = v2.y; m[9] = dir.y;
	m[2] = v1.z; m[6] = v2.z; m[10] = dir.z;

	m[12] = from.x;
	m[13] = from.y;
	m[14] = from.z;

	glDisable(GL_LIGHTING);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE);	
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glEnable(GL_BLEND);
	glDepthMask(GL_FALSE);
	glDisable(GL_CULL_FACE);
	glEnable(GL_TEXTURE_2D);

	glPushMatrix();
	glMultMatrixf(&m[0]);

	// increase visible size based on distance from camera, z is always negative
	// allows them to be smaller while maintaining visibility for game play
	float dist_scale = float(viewCoords.z / -500);
	float length = Equip::lasers[m_type].length + dist_scale;
	float width = Equip::lasers[m_type].width + dist_scale;
	glScalef(width, width, length);

	Color color = Equip::lasers[m_type].color;
	// fade them out as they age so they don't suddenly disappear
	// this matches the damage fall-off calculation
	float base_alpha = sqrt(1.0f - m_age/Equip::lasers[m_type].lifespan);
	// fade out side quads when viewing nearly edge on
	vector3f view_dir = vector3f(viewCoords).Normalized();
	color.a = base_alpha * (1.f - powf(fabs(dir.Dot(view_dir)), length));

	const int flare_size = 4*6;
	Render::State::UseProgram(m_prog);
	if (color.a > 0.01f) {
		m_sideTex->Bind();
		m_prog->SetUniform("texture0", 0);
		m_prog->SetUniform("color", color);
		glColor4f(color.r, color.g, color.b, color.a);
		glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &m_verts[0].pos);
		glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &m_verts[0].u);
		glDrawArrays(GL_TRIANGLES, 0, flare_size);
	}

	// fade out glow quads when viewing nearly edge on
	// these and the side quads fade at different rates
	// so that they aren't both at the same alpha as that looks strange
	color.a = base_alpha * powf(fabs(dir.Dot(view_dir)), width);

	if (color.a > 0.01f) {
		m_glowTex->Bind();
		m_prog->SetUniform("color", color);
		glColor4f(color.r, color.g, color.b, color.a);
		glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &m_verts[0].pos);
		glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &m_verts[0].u);
		glDrawArrays(GL_TRIANGLES, flare_size, flare_size);
		m_glowTex->Unbind();
	}

	Render::State::UseProgram(0);
	glPopMatrix();
	glDisable(GL_TEXTURE_2D);
	glColor3f(1.f, 1.f, 1.f);
	glDisable(GL_BLEND);
	glDepthMask(GL_TRUE);
	glEnable(GL_CULL_FACE);
	glDisableClientState(GL_VERTEX_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	
}
コード例 #4
0
ファイル: Projectile.cpp プロジェクト: mightyzero/pioneer
void Projectile::Render(Graphics::Renderer *renderer, const vector3d &viewCoords, const matrix4x4d &viewTransform)
{
	vector3d _from = viewTransform * GetInterpolatedPosition();
	vector3d _to = viewTransform * (GetInterpolatedPosition() + m_dirVel);
	vector3d _dir = _to - _from;
	vector3f from(&_from.x);
	vector3f dir = vector3f(_dir).Normalized();

	vector3f v1, v2;
	matrix4x4f m = matrix4x4f::Identity();
	v1.x = dir.y; v1.y = dir.z; v1.z = dir.x;
	v2 = v1.Cross(dir).Normalized();
	v1 = v2.Cross(dir);
	m[0] = v1.x; m[4] = v2.x; m[8] = dir.x;
	m[1] = v1.y; m[5] = v2.y; m[9] = dir.y;
	m[2] = v1.z; m[6] = v2.z; m[10] = dir.z;

	m[12] = from.x;
	m[13] = from.y;
	m[14] = from.z;

	renderer->SetBlendMode(Graphics::BLEND_ALPHA_ONE);
	renderer->SetDepthWrite(false);

	glPushMatrix();
	glMultMatrixf(&m[0]);

	// increase visible size based on distance from camera, z is always negative
	// allows them to be smaller while maintaining visibility for game play
	const float dist_scale = float(viewCoords.z / -500);
	const float length = Equip::lasers[m_type].length + dist_scale;
	const float width = Equip::lasers[m_type].width + dist_scale;
	glScalef(width, width, length);

	Color color = Equip::lasers[m_type].color;
	// fade them out as they age so they don't suddenly disappear
	// this matches the damage fall-off calculation
	const float base_alpha = sqrt(1.0f - m_age/Equip::lasers[m_type].lifespan);
	// fade out side quads when viewing nearly edge on
	vector3f view_dir = vector3f(viewCoords).Normalized();
	color.a = base_alpha * (1.f - powf(fabs(dir.Dot(view_dir)), length));

	if (color.a > 0.01f) {
		m_sideMat.diffuse = color;
		renderer->DrawTriangles(m_sideVerts.Get(), &m_sideMat);
	}

	// fade out glow quads when viewing nearly edge on
	// these and the side quads fade at different rates
	// so that they aren't both at the same alpha as that looks strange
	color.a = base_alpha * powf(fabs(dir.Dot(view_dir)), width);

	if (color.a > 0.01f) {
		m_glowMat.diffuse = color;
		renderer->DrawTriangles(m_glowVerts.Get(), &m_glowMat);
	}

	glPopMatrix();
	renderer->SetBlendMode(Graphics::BLEND_SOLID);
	renderer->SetDepthWrite(true);
}