mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Draw all horizons and sky base, in front of stars (#7932)
Move star draw to before sun glow texture draw and before sun draw, not currently essential but the logical order. Will be necessary if a 'no far ground' option is added, to draw stars behind the sun.
This commit is contained in:
parent
56f22bfa5c
commit
08884d258b
@ -228,7 +228,7 @@ void Sky::render()
|
|||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw far cloudy fog thing
|
// Draw far cloudy fog thing at and below all horizons
|
||||||
for (u32 j = 0; j < 4; j++) {
|
for (u32 j = 0; j < 4; j++) {
|
||||||
video::SColor c = cloudyfogcolor;
|
video::SColor c = cloudyfogcolor;
|
||||||
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
|
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
|
||||||
@ -252,22 +252,96 @@ void Sky::render()
|
|||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw bottom far cloudy fog thing
|
|
||||||
video::SColor c = cloudyfogcolor;
|
|
||||||
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 1, 0, c, t, t);
|
|
||||||
vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t);
|
|
||||||
vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o);
|
|
||||||
vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
|
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
|
||||||
|
|
||||||
// If sun, moon and stars are (temporarily) disabled, abort here
|
// If sun, moon and stars are (temporarily) disabled, abort here
|
||||||
if (!m_bodies_visible)
|
if (!m_bodies_visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
driver->setMaterial(m_materials[2]);
|
// Draw stars before sun and moon to be behind them
|
||||||
|
do {
|
||||||
|
driver->setMaterial(m_materials[1]);
|
||||||
|
// Tune values so that stars first appear just after the sun
|
||||||
|
// disappears over the horizon, and disappear just before the sun
|
||||||
|
// appears over the horizon.
|
||||||
|
// Also tune so that stars are at full brightness from time 20000 to
|
||||||
|
// time 4000.
|
||||||
|
float starbrightness = MYMAX(0, MYMIN(1,
|
||||||
|
(0.25 - fabs(wicked_time_of_day < 0.5 ?
|
||||||
|
wicked_time_of_day : (1.0 - wicked_time_of_day))) * 20));
|
||||||
|
float f = starbrightness;
|
||||||
|
float d = 0.007 / 2;
|
||||||
|
video::SColor starcolor(255, f * 90, f * 90, f * 90);
|
||||||
|
// Stars are only drawn when brighter than skycolor
|
||||||
|
if (starcolor.getBlue() < m_skycolor.getBlue())
|
||||||
|
break;
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
u16 indices[SKY_STAR_COUNT * 3];
|
||||||
|
video::S3DVertex vertices[SKY_STAR_COUNT * 3];
|
||||||
|
for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
|
||||||
|
indices[i * 3 + 0] = i * 3 + 0;
|
||||||
|
indices[i * 3 + 1] = i * 3 + 1;
|
||||||
|
indices[i * 3 + 2] = i * 3 + 2;
|
||||||
|
v3f r = m_stars[i];
|
||||||
|
core::CMatrix4<f32> a;
|
||||||
|
a.buildRotateFromTo(v3f(0, 1, 0), r);
|
||||||
|
v3f p = v3f(-d, 1, -d);
|
||||||
|
v3f p1 = v3f(d, 1, 0);
|
||||||
|
v3f p2 = v3f(-d, 1, d);
|
||||||
|
a.rotateVect(p);
|
||||||
|
a.rotateVect(p1);
|
||||||
|
a.rotateVect(p2);
|
||||||
|
p.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
p1.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
p2.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
vertices[i * 3 + 0].Pos = p;
|
||||||
|
vertices[i * 3 + 0].Color = starcolor;
|
||||||
|
vertices[i * 3 + 1].Pos = p1;
|
||||||
|
vertices[i * 3 + 1].Color = starcolor;
|
||||||
|
vertices[i * 3 + 2].Pos = p2;
|
||||||
|
vertices[i * 3 + 2].Color = starcolor;
|
||||||
|
}
|
||||||
|
driver->drawIndexedTriangleList(vertices, SKY_STAR_COUNT * 3,
|
||||||
|
indices, SKY_STAR_COUNT);
|
||||||
|
#else
|
||||||
|
u16 indices[SKY_STAR_COUNT * 4];
|
||||||
|
video::S3DVertex vertices[SKY_STAR_COUNT * 4];
|
||||||
|
for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
|
||||||
|
indices[i * 4 + 0] = i * 4 + 0;
|
||||||
|
indices[i * 4 + 1] = i * 4 + 1;
|
||||||
|
indices[i * 4 + 2] = i * 4 + 2;
|
||||||
|
indices[i * 4 + 3] = i * 4 + 3;
|
||||||
|
v3f r = m_stars[i];
|
||||||
|
core::CMatrix4<f32> a;
|
||||||
|
a.buildRotateFromTo(v3f(0, 1, 0), r);
|
||||||
|
v3f p = v3f(-d, 1, -d);
|
||||||
|
v3f p1 = v3f( d, 1, -d);
|
||||||
|
v3f p2 = v3f( d, 1, d);
|
||||||
|
v3f p3 = v3f(-d, 1, d);
|
||||||
|
a.rotateVect(p);
|
||||||
|
a.rotateVect(p1);
|
||||||
|
a.rotateVect(p2);
|
||||||
|
a.rotateVect(p3);
|
||||||
|
p.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
p1.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
p2.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
p3.rotateXYBy(wicked_time_of_day * 360 - 90);
|
||||||
|
vertices[i * 4 + 0].Pos = p;
|
||||||
|
vertices[i * 4 + 0].Color = starcolor;
|
||||||
|
vertices[i * 4 + 1].Pos = p1;
|
||||||
|
vertices[i * 4 + 1].Color = starcolor;
|
||||||
|
vertices[i * 4 + 2].Pos = p2;
|
||||||
|
vertices[i * 4 + 2].Color = starcolor;
|
||||||
|
vertices[i * 4 + 3].Pos = p3;
|
||||||
|
vertices[i * 4 + 3].Color = starcolor;
|
||||||
|
}
|
||||||
|
driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT * 4,
|
||||||
|
indices, SKY_STAR_COUNT, video::EVT_STANDARD,
|
||||||
|
scene::EPT_QUADS, video::EIT_16BIT);
|
||||||
|
#endif
|
||||||
|
} while(false);
|
||||||
|
|
||||||
// Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png)
|
// Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png)
|
||||||
{
|
{
|
||||||
|
driver->setMaterial(m_materials[2]);
|
||||||
float mid1 = 0.25;
|
float mid1 = 0.25;
|
||||||
float mid = wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1);
|
float mid = wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1);
|
||||||
float a_ = 1.0f - std::fabs(wicked_time_of_day - mid) * 35.0f;
|
float a_ = 1.0f - std::fabs(wicked_time_of_day - mid) * 35.0f;
|
||||||
@ -366,89 +440,6 @@ void Sky::render()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw stars before moon to be behind the moon
|
|
||||||
do {
|
|
||||||
driver->setMaterial(m_materials[1]);
|
|
||||||
// Tune values so that stars first appear just after the sun
|
|
||||||
// disappears over the horizon, and disappear just before the sun
|
|
||||||
// appears over the horizon.
|
|
||||||
// Also tune so that stars are at full brightness from time 20000 to
|
|
||||||
// time 4000.
|
|
||||||
float starbrightness = MYMAX(0, MYMIN(1,
|
|
||||||
(0.25 - fabs(wicked_time_of_day < 0.5 ?
|
|
||||||
wicked_time_of_day : (1.0 - wicked_time_of_day))) * 20));
|
|
||||||
float f = starbrightness;
|
|
||||||
float d = 0.007 / 2;
|
|
||||||
video::SColor starcolor(255, f * 90, f * 90, f * 90);
|
|
||||||
// Stars are only drawn when brighter than skycolor
|
|
||||||
if (starcolor.getBlue() < m_skycolor.getBlue())
|
|
||||||
break;
|
|
||||||
#ifdef __ANDROID__
|
|
||||||
u16 indices[SKY_STAR_COUNT * 3];
|
|
||||||
video::S3DVertex vertices[SKY_STAR_COUNT * 3];
|
|
||||||
for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
|
|
||||||
indices[i * 3 + 0] = i * 3 + 0;
|
|
||||||
indices[i * 3 + 1] = i * 3 + 1;
|
|
||||||
indices[i * 3 + 2] = i * 3 + 2;
|
|
||||||
v3f r = m_stars[i];
|
|
||||||
core::CMatrix4<f32> a;
|
|
||||||
a.buildRotateFromTo(v3f(0, 1, 0), r);
|
|
||||||
v3f p = v3f(-d, 1, -d);
|
|
||||||
v3f p1 = v3f(d, 1, 0);
|
|
||||||
v3f p2 = v3f(-d, 1, d);
|
|
||||||
a.rotateVect(p);
|
|
||||||
a.rotateVect(p1);
|
|
||||||
a.rotateVect(p2);
|
|
||||||
p.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
p1.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
p2.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
vertices[i * 3 + 0].Pos = p;
|
|
||||||
vertices[i * 3 + 0].Color = starcolor;
|
|
||||||
vertices[i * 3 + 1].Pos = p1;
|
|
||||||
vertices[i * 3 + 1].Color = starcolor;
|
|
||||||
vertices[i * 3 + 2].Pos = p2;
|
|
||||||
vertices[i * 3 + 2].Color = starcolor;
|
|
||||||
}
|
|
||||||
driver->drawIndexedTriangleList(vertices, SKY_STAR_COUNT * 3,
|
|
||||||
indices, SKY_STAR_COUNT);
|
|
||||||
#else
|
|
||||||
u16 indices[SKY_STAR_COUNT * 4];
|
|
||||||
video::S3DVertex vertices[SKY_STAR_COUNT * 4];
|
|
||||||
for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
|
|
||||||
indices[i * 4 + 0] = i * 4 + 0;
|
|
||||||
indices[i * 4 + 1] = i * 4 + 1;
|
|
||||||
indices[i * 4 + 2] = i * 4 + 2;
|
|
||||||
indices[i * 4 + 3] = i * 4 + 3;
|
|
||||||
v3f r = m_stars[i];
|
|
||||||
core::CMatrix4<f32> a;
|
|
||||||
a.buildRotateFromTo(v3f(0, 1, 0), r);
|
|
||||||
v3f p = v3f(-d, 1, -d);
|
|
||||||
v3f p1 = v3f( d, 1, -d);
|
|
||||||
v3f p2 = v3f( d, 1, d);
|
|
||||||
v3f p3 = v3f(-d, 1, d);
|
|
||||||
a.rotateVect(p);
|
|
||||||
a.rotateVect(p1);
|
|
||||||
a.rotateVect(p2);
|
|
||||||
a.rotateVect(p3);
|
|
||||||
p.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
p1.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
p2.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
p3.rotateXYBy(wicked_time_of_day * 360 - 90);
|
|
||||||
vertices[i * 4 + 0].Pos = p;
|
|
||||||
vertices[i * 4 + 0].Color = starcolor;
|
|
||||||
vertices[i * 4 + 1].Pos = p1;
|
|
||||||
vertices[i * 4 + 1].Color = starcolor;
|
|
||||||
vertices[i * 4 + 2].Pos = p2;
|
|
||||||
vertices[i * 4 + 2].Color = starcolor;
|
|
||||||
vertices[i * 4 + 3].Pos = p3;
|
|
||||||
vertices[i * 4 + 3].Color = starcolor;
|
|
||||||
}
|
|
||||||
driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT * 4,
|
|
||||||
indices, SKY_STAR_COUNT, video::EVT_STANDARD,
|
|
||||||
scene::EPT_QUADS, video::EIT_16BIT);
|
|
||||||
#endif
|
|
||||||
} while(false);
|
|
||||||
|
|
||||||
// Draw moon
|
// Draw moon
|
||||||
if (wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7) {
|
if (wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7) {
|
||||||
if (!m_moon_texture) {
|
if (!m_moon_texture) {
|
||||||
@ -525,27 +516,40 @@ void Sky::render()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw far cloudy fog thing below East and West horizons.
|
// Draw far cloudy fog thing below all horizons in front of sun, moon
|
||||||
// These act as horizons that the sun and moon rise and set over.
|
// and stars.
|
||||||
driver->setMaterial(m_materials[1]);
|
driver->setMaterial(m_materials[1]);
|
||||||
|
|
||||||
for (u32 j = 0; j < 2; j++) {
|
for (u32 j = 0; j < 4; j++) {
|
||||||
video::SColor c = cloudyfogcolor;
|
video::SColor c = cloudyfogcolor;
|
||||||
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
|
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
|
||||||
vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t);
|
vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t);
|
||||||
vertices[2] = video::S3DVertex( 1, -0.02, -1, 0, 0, 1, c, o, o);
|
vertices[2] = video::S3DVertex( 1, -0.02, -1, 0, 0, 1, c, o, o);
|
||||||
vertices[3] = video::S3DVertex(-1, -0.02, -1, 0, 0, 1, c, t, o);
|
vertices[3] = video::S3DVertex(-1, -0.02, -1, 0, 0, 1, c, t, o);
|
||||||
for (video::S3DVertex &vertex : vertices) {
|
for (video::S3DVertex &vertex : vertices) {
|
||||||
//if (wicked_time_of_day < 0.5)
|
|
||||||
if (j == 0)
|
if (j == 0)
|
||||||
|
// Don't switch
|
||||||
|
{}
|
||||||
|
else if (j == 1)
|
||||||
// Switch from -Z (south) to +X (east)
|
// Switch from -Z (south) to +X (east)
|
||||||
vertex.Pos.rotateXZBy(90);
|
vertex.Pos.rotateXZBy(90);
|
||||||
else
|
else if (j == 2)
|
||||||
// Switch from -Z (south) to -X (west)
|
// Switch from -Z (south) to -X (west)
|
||||||
vertex.Pos.rotateXZBy(-90);
|
vertex.Pos.rotateXZBy(-90);
|
||||||
|
else
|
||||||
|
// Switch from -Z (south) to +Z (north)
|
||||||
|
vertex.Pos.rotateXZBy(-180);
|
||||||
}
|
}
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw bottom far cloudy fog thing in front of sun, moon and stars
|
||||||
|
video::SColor c = cloudyfogcolor;
|
||||||
|
vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 1, 0, c, t, t);
|
||||||
|
vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t);
|
||||||
|
vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o);
|
||||||
|
vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
|
||||||
|
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user