@@ -3931,15 +3931,6 @@ void Planet::draw(StelCore* core, float maxMagLabels, const QFont& planetNameFon
39313931 return ;
39323932}
39333933
3934- class StelPainterLight
3935- {
3936- public:
3937- Vec3d position;
3938- Vec3f diffuse;
3939- Vec3f ambient;
3940- };
3941- static StelPainterLight light;
3942-
39433934void Planet::PlanetShaderVars::initLocations (QOpenGLShaderProgram* p)
39443935{
39453936 GL (p->bind ());
@@ -4514,6 +4505,8 @@ void Planet::draw3dModel(StelCore* core, StelProjector::ModelViewTranformP trans
45144505 }
45154506 #endif
45164507
4508+ StelPainterLight light;
4509+
45174510 // Set the main source of light to be the sun.
45184511 // This must be the aberrated sun! (Mostly theoretically, this displacement seems more important for the shadows, done elsewhere...)
45194512 Vec3d sunPos = ssm->getSun ()->getEclipticPos () + ssm->getSun ()->getAberrationPush ();
@@ -4564,20 +4557,20 @@ void Planet::draw3dModel(StelCore* core, StelProjector::ModelViewTranformP trans
45644557
45654558 if (ssm->getFlagUseObjModels () && !objModelPath.isEmpty ())
45664559 {
4567- if (!drawObjModel (&sPainter , screenRd))
4560+ if (!drawObjModel (light, &sPainter , screenRd))
45684561 {
4569- drawSphere (&sPainter , screenRd, drawOnlyRing);
4562+ drawSphere (light, &sPainter , screenRd, drawOnlyRing);
45704563 }
45714564 }
45724565 else if (!survey || survey.colors ->getInterstate () < 1 .0f )
45734566 {
4574- drawSphere (&sPainter , screenRd, drawOnlyRing);
4567+ drawSphere (light, &sPainter , screenRd, drawOnlyRing);
45754568 }
45764569
45774570 if (survey && survey.colors ->getInterstate () > 0 .0f )
45784571 {
4579- drawSurvey (core, &sPainter );
4580- drawSphere (&sPainter , screenRd, true );
4572+ drawSurvey (light, core, &sPainter );
4573+ drawSphere (light, &sPainter , screenRd, true );
45814574 }
45824575
45834576
@@ -4788,7 +4781,7 @@ void Planet::computeModelMatrix(Mat4d &result, bool solarEclipseCase) const
47884781}
47894782
47904783Planet::RenderData Planet::setCommonShaderUniforms (const StelPainter& painter, QOpenGLShaderProgram* shader, const PlanetShaderVars& shaderVars,
4791- const bool hasNormalMap, const bool hasHorizonMap)
4784+ const StelPainterLight& light, const bool hasNormalMap, const bool hasHorizonMap)
47924785{
47934786 RenderData data;
47944787
@@ -4878,7 +4871,7 @@ Planet::RenderData Planet::setCommonShaderUniforms(const StelPainter& painter, Q
48784871 return data;
48794872}
48804873
4881- void Planet::drawSphere (StelPainter* painter, float screenRd, bool drawOnlyRing)
4874+ void Planet::drawSphere (const StelPainterLight& light, StelPainter* painter, float screenRd, bool drawOnlyRing)
48824875{
48834876 const float sphereScaleF=static_cast <float >(sphereScale);
48844877 if (horizonMap)
@@ -4968,7 +4961,7 @@ void Planet::drawSphere(StelPainter* painter, float screenRd, bool drawOnlyRing)
49684961
49694962 GL (shader->bind ());
49704963
4971- RenderData rData = setCommonShaderUniforms (*painter,shader,*shaderVars, isMoon,isMoon);
4964+ RenderData rData = setCommonShaderUniforms (*painter,shader,*shaderVars,light, isMoon,isMoon);
49724965 if (this ==ssm->getSun ())
49734966 {
49744967 const auto color = painter->getColor ();
@@ -5190,7 +5183,7 @@ void Planet::drawSphere(StelPainter* painter, float screenRd, bool drawOnlyRing)
51905183}
51915184
51925185// Draw the Hips survey.
5193- void Planet::drawSurvey (StelCore* core, StelPainter* painter)
5186+ void Planet::drawSurvey (const StelPainterLight& light, StelCore* core, StelPainter* painter)
51945187{
51955188 if (!Planet::initShader ()) return ;
51965189 static SolarSystem* ssm = GETSTELMODULE (SolarSystem);
@@ -5218,7 +5211,7 @@ void Planet::drawSurvey(StelCore* core, StelPainter* painter)
52185211 }
52195212
52205213 GL (shader->bind ());
5221- RenderData rData = setCommonShaderUniforms (*painter, shader, *shaderVars, !!survey.normals , !!survey.horizons );
5214+ RenderData rData = setCommonShaderUniforms (*painter, shader, *shaderVars, light, !!survey.normals , !!survey.horizons );
52225215 QVector<Vec3f> projectedVertsArray;
52235216 QVector<Vec3f> vertsArray;
52245217 const double angle = 2 * getSpheroidAngularRadius (core) * M_PI_180;
@@ -5400,7 +5393,7 @@ bool Planet::ensureObjLoaded()
54005393 return true ;
54015394}
54025395
5403- bool Planet::drawObjModel (StelPainter *painter, float screenRd)
5396+ bool Planet::drawObjModel (const StelPainterLight& light, StelPainter *painter, float screenRd)
54045397{
54055398 Q_UNUSED (screenRd) // screen size unused for now, use it for LOD or something?
54065399
@@ -5419,7 +5412,7 @@ bool Planet::drawObjModel(StelPainter *painter, float screenRd)
54195412 QMatrix4x4 shadowMatrix;
54205413 bool shadowmapping = false ;
54215414 if (ssm->getFlagShowObjSelfShadows ())
5422- shadowmapping = drawObjShadowMap (painter,shadowMatrix);
5415+ shadowmapping = drawObjShadowMap (light. position , painter, shadowMatrix);
54235416
54245417 if (objModel->texture )
54255418 {
@@ -5512,7 +5505,7 @@ bool Planet::drawObjModel(StelPainter *painter, float screenRd)
55125505 GL (shd->enableAttributeArray (" vertex" ));
55135506 objModel->projPosBuffer ->release ();
55145507
5515- setCommonShaderUniforms (*painter,shd,*shdVars,false ,false );
5508+ setCommonShaderUniforms (*painter,shd,*shdVars,light, false ,false );
55165509
55175510 // draw that model using the array wrapper
55185511 objModel->arr ->draw ();
@@ -5527,7 +5520,7 @@ bool Planet::drawObjModel(StelPainter *painter, float screenRd)
55275520 return true ;
55285521}
55295522
5530- bool Planet::drawObjShadowMap (StelPainter *painter, QMatrix4x4& shadowMatrix)
5523+ bool Planet::drawObjShadowMap (const Vec3d& lightPosition, StelPainter *painter, QMatrix4x4& shadowMatrix)
55315524{
55325525 if (!shadowInitialized)
55335526 if (!initFBO ())
@@ -5543,7 +5536,7 @@ bool Planet::drawObjShadowMap(StelPainter *painter, QMatrix4x4& shadowMatrix)
55435536 // computeModelMatrix(modelMatrix);
55445537 // Mat4d worldToModel = modelMatrix.inverse();
55455538
5546- Vec3d lightDir = light. position ;
5539+ Vec3d lightDir = lightPosition ;
55475540 projector->getModelViewTransform ()->backward (lightDir);
55485541 // Vec3d lightDir(worldToModel[12], worldToModel[13], worldToModel[14]);
55495542 lightDir.normalize ();
0 commit comments