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); }
vector3d Body::GetInterpolatedPositionRelTo(const Frame *relTo) const { matrix4x4d m; Frame::GetFrameRenderTransform(m_frame, relTo, m); return m * GetInterpolatedPosition(); }
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); }
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); }