static void position_system_lights(Frame *camFrame, Frame *frame, int &lightNum) { if (lightNum > 3) return; // not using frame->GetSBodyFor() because it snoops into parent frames, // causing duplicate finds for static and rotating frame SBody *body = frame->m_sbody; if (body && (body->GetSuperType() == SBody::SUPERTYPE_STAR)) { int light; switch (lightNum) { case 3: light = GL_LIGHT3; break; case 2: light = GL_LIGHT2; break; case 1: light = GL_LIGHT1; break; default: light = GL_LIGHT0; break; } // position light at sol matrix4x4d m; Frame::GetFrameTransform(frame, camFrame, m); vector3d lpos = (m * vector3d(0,0,0)); double dist = lpos.Length() / AU; lpos *= 1.0/dist; // normalize float lightPos[4]; lightPos[0] = float(lpos.x); lightPos[1] = float(lpos.y); lightPos[2] = float(lpos.z); lightPos[3] = 0; const float *col = StarSystem::starRealColors[body->type]; float lightCol[4] = { col[0], col[1], col[2], 0 }; float ambCol[4] = { 0,0,0,0 }; if (Render::IsHDREnabled()) { for (int i=0; i<4; i++) { // not too high or we overflow our float16 colorbuffer lightCol[i] *= float(std::min(10.0*StarSystem::starLuminosities[body->type] / dist, 10000.0)); } } glLightfv(light, GL_POSITION, lightPos); glLightfv(light, GL_DIFFUSE, lightCol); glLightfv(light, GL_AMBIENT, ambCol); glLightfv(light, GL_SPECULAR, lightCol); glEnable(light); lightNum++; } for (std::list<Frame*>::iterator i = frame->m_children.begin(); i!=frame->m_children.end(); ++i) { position_system_lights(camFrame, *i, lightNum); } }
/* * Attribute: superType * * The supertype of the body, as a <Constants.BodySuperType> constant * * Availability: * * alpha 10 * * Status: * * stable */ static int l_sbody_attr_super_type(lua_State *l) { SBody *sbody = LuaSBody::GetFromLua(1); lua_pushstring(l, LuaConstants::GetConstantString(l, "BodySuperType", sbody->GetSuperType())); return 1; }