Fast sky with stairs optimization
This commit is contained in:
parent
0e39b9c715
commit
6797852eec
6
client/shaders/stars_shader/opengl_fragment.glsl
Normal file
6
client/shaders/stars_shader/opengl_fragment.glsl
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
uniform vec4 starColor;
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
gl_FragColor = starColor;
|
||||||
|
}
|
4
client/shaders/stars_shader/opengl_vertex.glsl
Normal file
4
client/shaders/stars_shader/opengl_vertex.glsl
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
gl_Position = mWorldViewProj * inVertexPosition;
|
||||||
|
}
|
@ -422,6 +422,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
|
|||||||
CachedVertexShaderSetting<float> m_animation_timer_vertex;
|
CachedVertexShaderSetting<float> m_animation_timer_vertex;
|
||||||
CachedPixelShaderSetting<float> m_animation_timer_pixel;
|
CachedPixelShaderSetting<float> m_animation_timer_pixel;
|
||||||
CachedPixelShaderSetting<float, 3> m_day_light;
|
CachedPixelShaderSetting<float, 3> m_day_light;
|
||||||
|
CachedPixelShaderSetting<float, 4> m_star_color;
|
||||||
CachedPixelShaderSetting<float, 3> m_eye_position_pixel;
|
CachedPixelShaderSetting<float, 3> m_eye_position_pixel;
|
||||||
CachedVertexShaderSetting<float, 3> m_eye_position_vertex;
|
CachedVertexShaderSetting<float, 3> m_eye_position_vertex;
|
||||||
CachedPixelShaderSetting<float, 3> m_minimap_yaw;
|
CachedPixelShaderSetting<float, 3> m_minimap_yaw;
|
||||||
@ -456,6 +457,7 @@ public:
|
|||||||
m_animation_timer_vertex("animationTimer"),
|
m_animation_timer_vertex("animationTimer"),
|
||||||
m_animation_timer_pixel("animationTimer"),
|
m_animation_timer_pixel("animationTimer"),
|
||||||
m_day_light("dayLight"),
|
m_day_light("dayLight"),
|
||||||
|
m_star_color("starColor"),
|
||||||
m_eye_position_pixel("eyePosition"),
|
m_eye_position_pixel("eyePosition"),
|
||||||
m_eye_position_vertex("eyePosition"),
|
m_eye_position_vertex("eyePosition"),
|
||||||
m_minimap_yaw("yawVec"),
|
m_minimap_yaw("yawVec"),
|
||||||
@ -509,6 +511,10 @@ public:
|
|||||||
sunlight.b };
|
sunlight.b };
|
||||||
m_day_light.set(dnc, services);
|
m_day_light.set(dnc, services);
|
||||||
|
|
||||||
|
video::SColorf star_color = m_sky->getCurrentStarColor();
|
||||||
|
float clr[4] = {star_color.r, star_color.g, star_color.b, star_color.a};
|
||||||
|
m_star_color.set(clr, services);
|
||||||
|
|
||||||
u32 animation_timer = porting::getTimeMs() % 1000000;
|
u32 animation_timer = porting::getTimeMs() % 1000000;
|
||||||
float animation_timer_f = (float)animation_timer / 100000.f;
|
float animation_timer_f = (float)animation_timer / 100000.f;
|
||||||
m_animation_timer_vertex.set(&animation_timer_f, services);
|
m_animation_timer_vertex.set(&animation_timer_f, services);
|
||||||
@ -1404,7 +1410,7 @@ bool Game::createClient(const std::string &playername,
|
|||||||
|
|
||||||
/* Skybox
|
/* Skybox
|
||||||
*/
|
*/
|
||||||
sky = new Sky(-1, texture_src);
|
sky = new Sky(-1, texture_src, shader_src);
|
||||||
scsf->setSky(sky);
|
scsf->setSky(sky);
|
||||||
skybox = NULL; // This is used/set later on in the main run loop
|
skybox = NULL; // This is used/set later on in the main run loop
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Minetest
|
Minetest
|
||||||
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
Copyright (C) 2020 numzero, Lobachevskiy Vitaliy <numzer0@yandex.ru>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU Lesser General Public License as published by
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
@ -34,16 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
using namespace irr::core;
|
using namespace irr::core;
|
||||||
|
|
||||||
Sky::Sky(s32 id, ITextureSource *tsrc) :
|
static video::SMaterial baseMaterial()
|
||||||
scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(),
|
|
||||||
RenderingEngine::get_scene_manager(), id)
|
|
||||||
{
|
{
|
||||||
setAutomaticCulling(scene::EAC_OFF);
|
|
||||||
m_box.MaxEdge.set(0, 0, 0);
|
|
||||||
m_box.MinEdge.set(0, 0, 0);
|
|
||||||
|
|
||||||
// Create material
|
|
||||||
|
|
||||||
video::SMaterial mat;
|
video::SMaterial mat;
|
||||||
mat.Lighting = false;
|
mat.Lighting = false;
|
||||||
#if ENABLE_GLES
|
#if ENABLE_GLES
|
||||||
@ -59,14 +52,31 @@ Sky::Sky(s32 id, ITextureSource *tsrc) :
|
|||||||
mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
||||||
mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
||||||
mat.BackfaceCulling = false;
|
mat.BackfaceCulling = false;
|
||||||
|
return mat;
|
||||||
|
};
|
||||||
|
|
||||||
m_materials[0] = mat;
|
Sky::Sky(s32 id, ITextureSource *tsrc, IShaderSource *ssrc) :
|
||||||
|
scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(),
|
||||||
|
RenderingEngine::get_scene_manager(), id)
|
||||||
|
{
|
||||||
|
setAutomaticCulling(scene::EAC_OFF);
|
||||||
|
m_box.MaxEdge.set(0, 0, 0);
|
||||||
|
m_box.MinEdge.set(0, 0, 0);
|
||||||
|
|
||||||
m_materials[1] = mat;
|
m_enable_shaders = g_settings->getBool("enable_shaders");
|
||||||
|
|
||||||
|
// Create materials
|
||||||
|
|
||||||
|
m_materials[0] = baseMaterial();
|
||||||
|
m_materials[0].MaterialType = ssrc->getShaderInfo(ssrc->getShader("stars_shader", TILE_MATERIAL_ALPHA, 0)).material;
|
||||||
|
m_materials[0].Lighting = true;
|
||||||
|
m_materials[0].ColorMaterial = video::ECM_NONE;
|
||||||
|
|
||||||
|
m_materials[1] = baseMaterial();
|
||||||
//m_materials[1].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
//m_materials[1].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
||||||
m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
|
|
||||||
m_materials[2] = mat;
|
m_materials[2] = baseMaterial();
|
||||||
m_materials[2].setTexture(0, tsrc->getTextureForMesh("sunrisebg.png"));
|
m_materials[2].setTexture(0, tsrc->getTextureForMesh("sunrisebg.png"));
|
||||||
m_materials[2].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
m_materials[2].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
//m_materials[2].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
//m_materials[2].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
||||||
@ -83,7 +93,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) :
|
|||||||
tsrc->getTexture(m_moon_params.tonemap) : NULL;
|
tsrc->getTexture(m_moon_params.tonemap) : NULL;
|
||||||
|
|
||||||
if (m_sun_texture) {
|
if (m_sun_texture) {
|
||||||
m_materials[3] = mat;
|
m_materials[3] = baseMaterial();
|
||||||
m_materials[3].setTexture(0, m_sun_texture);
|
m_materials[3].setTexture(0, m_sun_texture);
|
||||||
m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
// Disables texture filtering
|
// Disables texture filtering
|
||||||
@ -95,7 +105,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) :
|
|||||||
m_materials[3].Lighting = true;
|
m_materials[3].Lighting = true;
|
||||||
}
|
}
|
||||||
if (m_moon_texture) {
|
if (m_moon_texture) {
|
||||||
m_materials[4] = mat;
|
m_materials[4] = baseMaterial();
|
||||||
m_materials[4].setTexture(0, m_moon_texture);
|
m_materials[4].setTexture(0, m_moon_texture);
|
||||||
m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
// Disables texture filtering
|
// Disables texture filtering
|
||||||
@ -108,7 +118,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 5; i < 11; i++) {
|
for (int i = 5; i < 11; i++) {
|
||||||
m_materials[i] = mat;
|
m_materials[i] = baseMaterial();
|
||||||
m_materials[i].Lighting = true;
|
m_materials[i].Lighting = true;
|
||||||
m_materials[i].MaterialType = video::EMT_SOLID;
|
m_materials[i].MaterialType = video::EMT_SOLID;
|
||||||
}
|
}
|
||||||
@ -205,7 +215,7 @@ void Sky::render()
|
|||||||
|
|
||||||
const f32 t = 1.0f;
|
const f32 t = 1.0f;
|
||||||
const f32 o = 0.0f;
|
const f32 o = 0.0f;
|
||||||
static const u16 indices[4] = {0, 1, 2, 3};
|
static const u16 indices[6] = {0, 1, 2, 0, 2, 3};
|
||||||
video::S3DVertex vertices[4];
|
video::S3DVertex vertices[4];
|
||||||
|
|
||||||
driver->setMaterial(m_materials[1]);
|
driver->setMaterial(m_materials[1]);
|
||||||
@ -247,7 +257,7 @@ void Sky::render()
|
|||||||
vertex.Pos.rotateXZBy(180);
|
vertex.Pos.rotateXZBy(180);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,7 +283,7 @@ void Sky::render()
|
|||||||
// Switch from -Z (south) to +Z (north)
|
// Switch from -Z (south) to +Z (north)
|
||||||
vertex.Pos.rotateXZBy(-180);
|
vertex.Pos.rotateXZBy(-180);
|
||||||
}
|
}
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
@ -304,7 +314,7 @@ void Sky::render()
|
|||||||
// Switch from -Z (south) to -X (west)
|
// Switch from -Z (south) to -X (west)
|
||||||
vertex.Pos.rotateXZBy(-90);
|
vertex.Pos.rotateXZBy(-90);
|
||||||
}
|
}
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw sun
|
// Draw sun
|
||||||
@ -340,7 +350,7 @@ void Sky::render()
|
|||||||
// Switch from -Z (south) to +Z (north)
|
// Switch from -Z (south) to +Z (north)
|
||||||
vertex.Pos.rotateXZBy(-180);
|
vertex.Pos.rotateXZBy(-180);
|
||||||
}
|
}
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw bottom far cloudy fog thing in front of sun, moon and stars
|
// Draw bottom far cloudy fog thing in front of sun, moon and stars
|
||||||
@ -349,7 +359,7 @@ void Sky::render()
|
|||||||
vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, 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[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);
|
vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -593,7 +603,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol
|
|||||||
* wicked_time_of_day: current time of day, to know where should be the sun in the sky
|
* wicked_time_of_day: current time of day, to know where should be the sun in the sky
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
static const u16 indices[4] = {0, 1, 2, 3};
|
static const u16 indices[] = {0, 1, 2, 0, 2, 3};
|
||||||
std::array<video::S3DVertex, 4> vertices;
|
std::array<video::S3DVertex, 4> vertices;
|
||||||
if (!m_sun_texture) {
|
if (!m_sun_texture) {
|
||||||
driver->setMaterial(m_materials[1]);
|
driver->setMaterial(m_materials[1]);
|
||||||
@ -611,7 +621,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
draw_sky_body(vertices, -sunsizes[i], sunsizes[i], colors[i]);
|
draw_sky_body(vertices, -sunsizes[i], sunsizes[i], colors[i]);
|
||||||
place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90);
|
place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90);
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
driver->setMaterial(m_materials[3]);
|
driver->setMaterial(m_materials[3]);
|
||||||
@ -623,7 +633,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol
|
|||||||
c = video::SColor(255, 255, 255, 255);
|
c = video::SColor(255, 255, 255, 255);
|
||||||
draw_sky_body(vertices, -d, d, c);
|
draw_sky_body(vertices, -d, d, c);
|
||||||
place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90);
|
place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90);
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,7 +650,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC
|
|||||||
* the sky
|
* the sky
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
static const u16 indices[4] = {0, 1, 2, 3};
|
static const u16 indices[] = {0, 1, 2, 0, 2, 3};
|
||||||
std::array<video::S3DVertex, 4> vertices;
|
std::array<video::S3DVertex, 4> vertices;
|
||||||
if (!m_moon_texture) {
|
if (!m_moon_texture) {
|
||||||
driver->setMaterial(m_materials[1]);
|
driver->setMaterial(m_materials[1]);
|
||||||
@ -664,7 +674,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
draw_sky_body(vertices, moonsizes_1[i], moonsizes_2[i], colors[i]);
|
draw_sky_body(vertices, moonsizes_1[i], moonsizes_2[i], colors[i]);
|
||||||
place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90);
|
place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90);
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
driver->setMaterial(m_materials[4]);
|
driver->setMaterial(m_materials[4]);
|
||||||
@ -676,13 +686,12 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC
|
|||||||
c = video::SColor(255, 255, 255, 255);
|
c = video::SColor(255, 255, 255, 255);
|
||||||
draw_sky_body(vertices, -d, d, c);
|
draw_sky_body(vertices, -d, d, c);
|
||||||
place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90);
|
place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90);
|
||||||
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
|
driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day)
|
void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day)
|
||||||
{
|
{
|
||||||
driver->setMaterial(m_materials[1]);
|
|
||||||
// Tune values so that stars first appear just after the sun
|
// Tune values so that stars first appear just after the sun
|
||||||
// disappears over the horizon, and disappear just before the sun
|
// disappears over the horizon, and disappear just before the sun
|
||||||
// appears over the horizon.
|
// appears over the horizon.
|
||||||
@ -690,87 +699,18 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day)
|
|||||||
// to time 4000.
|
// to time 4000.
|
||||||
|
|
||||||
float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day);
|
float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day);
|
||||||
float starbrightness = clamp((0.25f - fabsf(tod)) * 20.0f, 0.0f, 1.0f);
|
float starbrightness = (0.25f - fabsf(tod)) * 20.0f;
|
||||||
|
m_star_color = m_star_params.starcolor;
|
||||||
float f = starbrightness;
|
m_star_color.a = clamp(starbrightness * m_star_color.a, 0.0f, 1.0f);
|
||||||
float d = (0.006 / 2) * m_star_params.scale;
|
if (m_star_color.a <= 0.0f) // Stars are only drawn when not fully transparent
|
||||||
|
|
||||||
video::SColor starcolor = m_star_params.starcolor;
|
|
||||||
starcolor.setAlpha(f * m_star_params.starcolor.getAlpha());
|
|
||||||
|
|
||||||
// Stars are only drawn when not fully transparent
|
|
||||||
if (m_star_params.starcolor.getAlpha() < 1)
|
|
||||||
return;
|
return;
|
||||||
#if ENABLE_GLES
|
m_materials[0].DiffuseColor = m_materials[0].EmissiveColor = m_star_color.toSColor();
|
||||||
u16 *indices = new u16[m_star_params.count * 3];
|
auto sky_rotation = core::matrix4().setRotationAxisRadians(2.0f * M_PI * (wicked_time_of_day - 0.25f), v3f(0.0f, 0.0f, 1.0f));
|
||||||
video::S3DVertex *vertices =
|
auto world_matrix = driver->getTransform(video::ETS_WORLD);
|
||||||
new video::S3DVertex[m_star_params.count * 3];
|
driver->setTransform(video::ETS_WORLD, world_matrix * sky_rotation);
|
||||||
for (u32 i = 0; i < m_star_params.count; i++) {
|
driver->setMaterial(m_materials[0]);
|
||||||
indices[i * 3 + 0] = i * 3 + 0;
|
driver->drawMeshBuffer(m_stars.get());
|
||||||
indices[i * 3 + 1] = i * 3 + 1;
|
driver->setTransform(video::ETS_WORLD, world_matrix);
|
||||||
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, m_star_params.count * 3,
|
|
||||||
indices, m_star_params.count);
|
|
||||||
delete[] indices;
|
|
||||||
delete[] vertices;
|
|
||||||
#else
|
|
||||||
u16 *indices = new u16[m_star_params.count * 4];
|
|
||||||
video::S3DVertex *vertices =
|
|
||||||
new video::S3DVertex[m_star_params.count * 4];
|
|
||||||
for (u32 i = 0; i < m_star_params.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, m_star_params.count * 4,
|
|
||||||
indices, m_star_params.count, video::EVT_STANDARD,
|
|
||||||
scene::EPT_QUADS, video::EIT_16BIT);
|
|
||||||
delete[] indices;
|
|
||||||
delete[] vertices;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sky::draw_sky_body(std::array<video::S3DVertex, 4> &vertices, float pos_1, float pos_2, const video::SColor &c)
|
void Sky::draw_sky_body(std::array<video::S3DVertex, 4> &vertices, float pos_1, float pos_2, const video::SColor &c)
|
||||||
@ -825,7 +765,7 @@ void Sky::setSunTexture(std::string sun_texture,
|
|||||||
m_sun_texture = tsrc->getTextureForMesh(m_sun_params.texture);
|
m_sun_texture = tsrc->getTextureForMesh(m_sun_params.texture);
|
||||||
|
|
||||||
if (m_sun_texture) {
|
if (m_sun_texture) {
|
||||||
m_materials[3] = m_materials[0];
|
m_materials[3] = baseMaterial();
|
||||||
m_materials[3].setTexture(0, m_sun_texture);
|
m_materials[3].setTexture(0, m_sun_texture);
|
||||||
m_materials[3].MaterialType = video::
|
m_materials[3].MaterialType = video::
|
||||||
EMT_TRANSPARENT_ALPHA_CHANNEL;
|
EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
@ -873,7 +813,7 @@ void Sky::setMoonTexture(std::string moon_texture,
|
|||||||
m_moon_texture = tsrc->getTextureForMesh(m_moon_params.texture);
|
m_moon_texture = tsrc->getTextureForMesh(m_moon_params.texture);
|
||||||
|
|
||||||
if (m_moon_texture) {
|
if (m_moon_texture) {
|
||||||
m_materials[4] = m_materials[0];
|
m_materials[4] = baseMaterial();
|
||||||
m_materials[4].setTexture(0, m_moon_texture);
|
m_materials[4].setTexture(0, m_moon_texture);
|
||||||
m_materials[4].MaterialType = video::
|
m_materials[4].MaterialType = video::
|
||||||
EMT_TRANSPARENT_ALPHA_CHANNEL;
|
EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
@ -895,19 +835,58 @@ void Sky::setStarCount(u16 star_count, bool force_update)
|
|||||||
// Allow force updating star count at game init.
|
// Allow force updating star count at game init.
|
||||||
if (m_star_params.count != star_count || force_update) {
|
if (m_star_params.count != star_count || force_update) {
|
||||||
m_star_params.count = star_count;
|
m_star_params.count = star_count;
|
||||||
m_stars.clear();
|
m_seed = (u64)myrand() << 32 | myrand();
|
||||||
// Rebuild the stars surrounding the camera
|
updateStars();
|
||||||
for (u16 i = 0; i < star_count; i++) {
|
}
|
||||||
v3f star = v3f(
|
}
|
||||||
myrand_range(-10000, 10000),
|
|
||||||
myrand_range(-10000, 10000),
|
|
||||||
myrand_range(-10000, 10000)
|
|
||||||
);
|
|
||||||
|
|
||||||
star.normalize();
|
void Sky::updateStars()
|
||||||
m_stars.emplace_back(star);
|
{
|
||||||
|
m_stars.reset(new scene::SMeshBuffer());
|
||||||
|
// Stupid IrrLicht doesn’t allow non-indexed rendering, and indexed quad
|
||||||
|
// rendering is slow due to lack of hardware support. So as indices are
|
||||||
|
// 16-bit and there are 4 vertices per star... the limit is 2^16/4 = 0x4000.
|
||||||
|
// That should be well enough actually.
|
||||||
|
if (m_star_params.count > 0x4000) {
|
||||||
|
warningstream << "Requested " << m_star_params.count << " stars but " << 0x4000 << " is the max\n";
|
||||||
|
m_star_params.count = 0x4000;
|
||||||
}
|
}
|
||||||
|
m_stars->Vertices.reallocate(4 * m_star_params.count);
|
||||||
|
m_stars->Indices.reallocate(6 * m_star_params.count);
|
||||||
|
|
||||||
|
video::SColor fallback_color = m_star_params.starcolor; // used on GLES 2 “without shaders”
|
||||||
|
PcgRandom rgen(m_seed);
|
||||||
|
float d = (0.003 / 2) * m_star_params.scale;
|
||||||
|
for (u16 i = 0; i < m_star_params.count; i++) {
|
||||||
|
v3f r = v3f(
|
||||||
|
rgen.range(-10000, 10000),
|
||||||
|
rgen.range(-10000, 10000),
|
||||||
|
rgen.range(-10000, 10000)
|
||||||
|
);
|
||||||
|
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);
|
||||||
|
m_stars->Vertices.push_back(video::S3DVertex(p, {}, fallback_color, {}));
|
||||||
|
m_stars->Vertices.push_back(video::S3DVertex(p1, {}, fallback_color, {}));
|
||||||
|
m_stars->Vertices.push_back(video::S3DVertex(p2, {}, fallback_color, {}));
|
||||||
|
m_stars->Vertices.push_back(video::S3DVertex(p3, {}, fallback_color, {}));
|
||||||
}
|
}
|
||||||
|
for (u16 i = 0; i < m_star_params.count; i++) {
|
||||||
|
m_stars->Indices.push_back(i * 4 + 0);
|
||||||
|
m_stars->Indices.push_back(i * 4 + 1);
|
||||||
|
m_stars->Indices.push_back(i * 4 + 2);
|
||||||
|
m_stars->Indices.push_back(i * 4 + 2);
|
||||||
|
m_stars->Indices.push_back(i * 4 + 3);
|
||||||
|
m_stars->Indices.push_back(i * 4 + 0);
|
||||||
|
}
|
||||||
|
m_stars->setHardwareMappingHint(scene::EHM_STATIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sky::setSkyColors(const SkyColor &sky_color)
|
void Sky::setSkyColors(const SkyColor &sky_color)
|
||||||
@ -939,7 +918,7 @@ void Sky::addTextureToSkybox(std::string texture, int material_id,
|
|||||||
// Keep a list of texture names handy.
|
// Keep a list of texture names handy.
|
||||||
m_sky_params.textures.emplace_back(texture);
|
m_sky_params.textures.emplace_back(texture);
|
||||||
video::ITexture *result = tsrc->getTextureForMesh(texture);
|
video::ITexture *result = tsrc->getTextureForMesh(texture);
|
||||||
m_materials[material_id+5] = m_materials[0];
|
m_materials[material_id+5] = baseMaterial();
|
||||||
m_materials[material_id+5].setTexture(0, result);
|
m_materials[material_id+5].setTexture(0, result);
|
||||||
m_materials[material_id+5].MaterialType = video::EMT_SOLID;
|
m_materials[material_id+5].MaterialType = video::EMT_SOLID;
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "irrlichttypes_extrabloated.h"
|
||||||
#include <ISceneNode.h>
|
#include <ISceneNode.h>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "irrlichttypes_extrabloated.h"
|
#include "irr_ptr.h"
|
||||||
|
#include "shader.h"
|
||||||
#include "skyparams.h"
|
#include "skyparams.h"
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -34,7 +36,7 @@ class Sky : public scene::ISceneNode
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//! constructor
|
//! constructor
|
||||||
Sky(s32 id, ITextureSource *tsrc);
|
Sky(s32 id, ITextureSource *tsrc, IShaderSource *ssrc);
|
||||||
|
|
||||||
virtual void OnRegisterSceneNode();
|
virtual void OnRegisterSceneNode();
|
||||||
|
|
||||||
@ -77,7 +79,7 @@ public:
|
|||||||
void setStarsVisible(bool stars_visible) { m_star_params.visible = stars_visible; }
|
void setStarsVisible(bool stars_visible) { m_star_params.visible = stars_visible; }
|
||||||
void setStarCount(u16 star_count, bool force_update);
|
void setStarCount(u16 star_count, bool force_update);
|
||||||
void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; }
|
void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; }
|
||||||
void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; }
|
void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; updateStars(); }
|
||||||
|
|
||||||
bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; }
|
bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; }
|
||||||
const video::SColorf &getCloudColor() const { return m_cloudcolor_f; }
|
const video::SColorf &getCloudColor() const { return m_cloudcolor_f; }
|
||||||
@ -101,6 +103,8 @@ public:
|
|||||||
void clearSkyboxTextures() { m_sky_params.textures.clear(); }
|
void clearSkyboxTextures() { m_sky_params.textures.clear(); }
|
||||||
void addTextureToSkybox(std::string texture, int material_id,
|
void addTextureToSkybox(std::string texture, int material_id,
|
||||||
ITextureSource *tsrc);
|
ITextureSource *tsrc);
|
||||||
|
const video::SColorf &getCurrentStarColor() const { return m_star_color; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
aabb3f m_box;
|
aabb3f m_box;
|
||||||
video::SMaterial m_materials[SKY_MATERIAL_COUNT];
|
video::SMaterial m_materials[SKY_MATERIAL_COUNT];
|
||||||
@ -154,6 +158,7 @@ private:
|
|||||||
bool m_clouds_enabled = true; // Initialised to true, reset only by set_sky API
|
bool m_clouds_enabled = true; // Initialised to true, reset only by set_sky API
|
||||||
bool m_directional_colored_fog;
|
bool m_directional_colored_fog;
|
||||||
bool m_in_clouds = true; // Prevent duplicating bools to remember old values
|
bool m_in_clouds = true; // Prevent duplicating bools to remember old values
|
||||||
|
bool m_enable_shaders = false;
|
||||||
|
|
||||||
video::SColorf m_bgcolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
|
video::SColorf m_bgcolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
video::SColorf m_skycolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
|
video::SColorf m_skycolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
@ -178,13 +183,17 @@ private:
|
|||||||
|
|
||||||
bool m_default_tint = true;
|
bool m_default_tint = true;
|
||||||
|
|
||||||
std::vector<v3f> m_stars;
|
u64 m_seed = 0;
|
||||||
|
irr_ptr<scene::SMeshBuffer> m_stars;
|
||||||
|
video::SColorf m_star_color;
|
||||||
|
|
||||||
video::ITexture *m_sun_texture;
|
video::ITexture *m_sun_texture;
|
||||||
video::ITexture *m_moon_texture;
|
video::ITexture *m_moon_texture;
|
||||||
video::ITexture *m_sun_tonemap;
|
video::ITexture *m_sun_tonemap;
|
||||||
video::ITexture *m_moon_tonemap;
|
video::ITexture *m_moon_tonemap;
|
||||||
|
|
||||||
|
void updateStars();
|
||||||
|
|
||||||
void draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor,
|
void draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor,
|
||||||
const video::SColor &suncolor2, float wicked_time_of_day);
|
const video::SColor &suncolor2, float wicked_time_of_day);
|
||||||
void draw_moon(video::IVideoDriver *driver, float moonsize, const video::SColor &mooncolor,
|
void draw_moon(video::IVideoDriver *driver, float moonsize, const video::SColor &mooncolor,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user