void Projectile::Render(Graphics::Renderer *renderer, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { vector3d _from = viewTransform * GetInterpPosition(); vector3d _to = viewTransform * (GetInterpPosition() + 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; // 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; renderer->SetTransform(m * matrix4x4f::ScaleMatrix(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))) * 255; if (color.a > 3) { s_sideMat->diffuse = color; renderer->DrawTriangles(s_sideVerts.get(), s_renderState, s_sideMat.get()); } // 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)) * 255; if (color.a > 3) { s_glowMat->diffuse = color; renderer->DrawTriangles(s_glowVerts.get(), s_renderState, s_glowMat.get()); } }
void ModelBody::RenderModel(Graphics::Renderer *r, const vector3d &viewCoords, const matrix4x4d &viewTransform) { matrix4x4d m2 = GetInterpOrient(); m2.SetTranslate(GetInterpPosition()); matrix4x4d t = viewTransform * m2; glPushMatrix(); // Otherwise newmodels leave a dirty matrix matrix4x4f trans; for (int i=0; i<12; i++) trans[i] = float(t[i]); trans[12] = viewCoords.x; trans[13] = viewCoords.y; trans[14] = viewCoords.z; trans[15] = 1.0f; m_model->Render(trans); glPopMatrix(); }
void ModelBody::RenderModel(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform, const bool setLighting) { std::vector<Graphics::Light> oldLights; Color oldAmbient; if (setLighting) SetLighting(r, camera, oldLights, oldAmbient); matrix4x4d m2 = GetInterpOrient(); m2.SetTranslate(GetInterpPosition()); matrix4x4d t = viewTransform * m2; glPushMatrix(); // Otherwise newmodels leave a dirty matrix matrix4x4f trans; for (int i=0; i<12; i++) trans[i] = float(t[i]); trans[12] = viewCoords.x; trans[13] = viewCoords.y; trans[14] = viewCoords.z; trans[15] = 1.0f; m_model->Render(trans); glPopMatrix(); if (setLighting) ResetLighting(r, oldLights, oldAmbient); }
vector3d Body::GetInterpPositionRelTo(const Frame *relTo) const { vector3d fpos = m_frame->GetInterpPositionRelTo(relTo); matrix3x3d forient = m_frame->GetInterpOrientRelTo(relTo); return forient * GetInterpPosition() + fpos; }