void HyperspaceCloud::Render(const vector3d &viewCoords, const matrix4x4d &viewTransform) { Render::State::UseProgram(Render::simpleShader); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glPushMatrix(); glTranslatef(float(viewCoords.x), float(viewCoords.y), float(viewCoords.z)); // face the camera dammit vector3d zaxis = viewCoords.NormalizedSafe(); vector3d xaxis = vector3d(0,1,0).Cross(zaxis).Normalized(); vector3d yaxis = zaxis.Cross(xaxis); matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).InverseOf(); glMultMatrixd(&rot[0]); // precise to the rendered frame (better than PHYSICS_HZ granularity) double preciseTime = Pi::game->GetTime() + Pi::GetGameTickAlpha()*Pi::game->GetTimeStep(); float radius = 1000.0f + 200.0f*float(noise(10.0*preciseTime, 0, 0)); if (m_isArrival) { make_circle_thing(radius, Color(1.0,1.0,1.0,1.0), Color(0.0,0.0,1.0,0.0)); } else { make_circle_thing(radius, Color(1.0,1.0,1.0,1.0), Color(1.0,0.0,0.0,0.0)); } glPopMatrix(); glDisable(GL_BLEND); glEnable(GL_LIGHTING); }
void Star::Render(Graphics::Renderer *renderer, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { renderer->SetDepthTest(false); glPushMatrix(); double radius = GetClipRadius(); double rad = radius; vector3d fpos = viewCoords; double len = fpos.Length(); while (len > 1000.0f) { rad *= 0.25; fpos = 0.25*fpos; len *= 0.25; } matrix4x4d trans = matrix4x4d::Identity(); trans.Translate(float(fpos.x), float(fpos.y), float(fpos.z)); // face the camera dammit vector3d zaxis = viewCoords.NormalizedSafe(); vector3d xaxis = vector3d(0,1,0).Cross(zaxis).Normalized(); vector3d yaxis = zaxis.Cross(xaxis); matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).InverseOf(); renderer->SetTransform(trans * rot); const float *col = StarSystem::starRealColors[GetSystemBody()->type]; Random(rand); renderer->SetBlendMode(BLEND_ALPHA); //render star halo VertexArray va(ATTRIB_POSITION | ATTRIB_DIFFUSE); const Color bright(col[0], col[1], col[2], 1.f); const Color dark(0.f, 0.f, 0.f, 0.f); va.Add(vector3f(0.f), bright); for (float ang=0; ang<2*M_PI; ang+=0.26183+rand.Double(0,0.4)) { va.Add(vector3f(rad*sin(ang), rad*cos(ang), 0), dark); } va.Add(vector3f(0.f, rad, 0.f), dark); renderer->DrawTriangles(&va, Graphics::vtxColorMaterial, TRIANGLE_FAN); renderer->SetBlendMode(BLEND_SOLID); glPopMatrix(); renderer->SetDepthTest(true); TerrainBody::Render(renderer, camera, viewCoords, viewTransform); }
static int l_vector_unit(lua_State *L) { LUA_DEBUG_START(L); if (lua_isnumber(L, 1)) { double x = luaL_checknumber(L, 1); double y = luaL_checknumber(L, 2); double z = luaL_checknumber(L, 3); const vector3d v = vector3d(x, y, z); LuaVector::PushToLua(L, v.NormalizedSafe()); } else { const vector3d *v = LuaVector::CheckFromLua(L, 1); LuaVector::PushToLua(L, v->NormalizedSafe()); } LUA_DEBUG_END(L, 1); return 1; }
void Star::Render(Graphics::Renderer *renderer, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { double radius = GetClipRadius(); double rad = radius; vector3d fpos = viewCoords; double len = fpos.Length(); while (len > 1000.0f) { rad *= 0.25; fpos = 0.25*fpos; len *= 0.25; } matrix4x4d trans = matrix4x4d::Identity(); trans.Translate(float(fpos.x), float(fpos.y), float(fpos.z)); // face the camera dammit vector3d zaxis = viewCoords.NormalizedSafe(); vector3d xaxis = vector3d(0,1,0).Cross(zaxis).Normalized(); vector3d yaxis = zaxis.Cross(xaxis); matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).Inverse(); renderer->SetTransform(trans * rot); Random rand; //render star halo VertexArray va(ATTRIB_POSITION | ATTRIB_DIFFUSE); const Color bright(StarSystem::starRealColors[GetSystemBody()->GetType()]); const Color dark(Color::BLANK); va.Add(vector3f(0.f), bright); for (float ang=0; ang<2*M_PI; ang+=0.26183+rand.Double(0,0.4)) { va.Add(vector3f(rad*sin(ang), rad*cos(ang), 0), dark); } va.Add(vector3f(0.f, rad, 0.f), dark); renderer->DrawTriangles(&va, m_haloState, Graphics::vtxColorMaterial, TRIANGLE_FAN); TerrainBody::Render(renderer, camera, viewCoords, viewTransform); renderer->GetStats().AddToStatCount(Graphics::Stats::STAT_STARS, 1); }
void HyperspaceCloud::Render(Renderer *renderer, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { matrix4x4d trans = matrix4x4d::Identity(); trans.Translate(float(viewCoords.x), float(viewCoords.y), float(viewCoords.z)); // face the camera dammit vector3d zaxis = viewCoords.NormalizedSafe(); vector3d xaxis = vector3d(0,1,0).Cross(zaxis).Normalized(); vector3d yaxis = zaxis.Cross(xaxis); matrix4x4d rot = matrix4x4d::MakeRotMatrix(xaxis, yaxis, zaxis).InverseOf(); renderer->SetTransform(trans * rot); // precise to the rendered frame (better than PHYSICS_HZ granularity) const double preciseTime = Pi::game->GetTime() + Pi::GetGameTickAlpha()*Pi::game->GetTimeStep(); // Flickering gradient circle, departure clouds are red and arrival clouds blue // XXX could just alter the scale instead of recreating the model const float radius = 1000.0f + 200.0f*float(noise(10.0*preciseTime, 0, 0)); m_graphic.vertices->Clear(); Color outerColor = m_isArrival ? Color::BLUE : Color::RED; outerColor.a = 0; make_circle_thing(*m_graphic.vertices.get(), radius, Color::WHITE, outerColor); renderer->DrawTriangles(m_graphic.vertices.get(), m_graphic.renderState, m_graphic.material.get(), TRIANGLE_FAN); }