summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp206
1 files changed, 93 insertions, 113 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 778615cf9..04b9f105d 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -54,6 +54,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "subgame.h"
#include "quicktune_shortcutter.h"
#include "clientmap.h"
+#include "sky.h"
/*
Setting this to 1 enables a special camera mode that forces
@@ -543,51 +544,6 @@ PointedThing getPointedThing(Client *client, v3f player_position,
return result;
}
-void update_skybox(video::IVideoDriver* driver, ITextureSource *tsrc,
- scene::ISceneManager* smgr, scene::ISceneNode* &skybox,
- float brightness)
-{
- if(skybox)
- {
- skybox->remove();
- }
-
- /*// Disable skybox if FarMesh is enabled
- if(g_settings->getBool("enable_farmesh"))
- return;*/
-
- if(brightness >= 0.7)
- {
- skybox = smgr->addSkyBoxSceneNode(
- tsrc->getTextureRaw("skybox2.png"),
- tsrc->getTextureRaw("skybox3.png"),
- tsrc->getTextureRaw("skybox1.png"),
- tsrc->getTextureRaw("skybox1.png"),
- tsrc->getTextureRaw("skybox1.png"),
- tsrc->getTextureRaw("skybox1.png"));
- }
- else if(brightness >= 0.2)
- {
- skybox = smgr->addSkyBoxSceneNode(
- tsrc->getTextureRaw("skybox2_dawn.png"),
- tsrc->getTextureRaw("skybox3_dawn.png"),
- tsrc->getTextureRaw("skybox1_dawn.png"),
- tsrc->getTextureRaw("skybox1_dawn.png"),
- tsrc->getTextureRaw("skybox1_dawn.png"),
- tsrc->getTextureRaw("skybox1_dawn.png"));
- }
- else
- {
- skybox = smgr->addSkyBoxSceneNode(
- tsrc->getTextureRaw("skybox2_night.png"),
- tsrc->getTextureRaw("skybox3_night.png"),
- tsrc->getTextureRaw("skybox1_night.png"),
- tsrc->getTextureRaw("skybox1_night.png"),
- tsrc->getTextureRaw("skybox1_night.png"),
- tsrc->getTextureRaw("skybox1_night.png"));
- }
-}
-
/*
Draws a screen with a single text on it.
Text will be removed when the screen is drawn the next time.
@@ -679,10 +635,6 @@ void the_game(
//const s32 hotbar_imagesize = 64;
s32 hotbar_imagesize = 48;
- // The color of the sky
- //video::SColor skycolor = video::SColor(255,140,186,250);
- video::SColor bgcolor_bright = video::SColor(255,170,200,230);
-
/*
Draw "Loading" screen
*/
@@ -892,13 +844,6 @@ void the_game(
client.afterContentReceived();
/*
- Create skybox
- */
- float old_brightness = 1.0;
- scene::ISceneNode* skybox = NULL;
- update_skybox(driver, tsrc, smgr, skybox, 1.0);
-
- /*
Create the camera node
*/
Camera camera(smgr, draw_control);
@@ -912,13 +857,18 @@ void the_game(
Clouds
*/
- float cloud_height = BS*100;
Clouds *clouds = NULL;
if(g_settings->getBool("enable_clouds"))
{
- clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
- cloud_height, time(0));
+ clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1, time(0));
}
+
+ /*
+ Skybox thingy
+ */
+
+ Sky *sky = NULL;
+ sky = new Sky(smgr->getRootSceneNode(), smgr, -1);
/*
FarMesh
@@ -1022,7 +972,7 @@ void the_game(
// A test
//throw con::PeerNotFoundException("lol");
- float brightness = 1.0;
+ float recent_turn_speed = 0.0;
core::list<float> frametime_log;
@@ -1054,6 +1004,9 @@ void the_game(
u32 show_profiler = 0;
u32 show_profiler_max = 3; // Number of pages
+ float time_of_day = 0;
+ float time_of_day_smooth = 0;
+
/*
Main loop
*/
@@ -1639,6 +1592,7 @@ void the_game(
NOTE: Do this before client.setPlayerControl() to not cause a camera lag of one frame
*/
+ float turn_amount = 0;
if((device->isWindowActive() && noMenuActive()) || random_input)
{
if(!random_input)
@@ -1668,11 +1622,14 @@ void the_game(
dx -= dtime * keyspeed;
if(input->isKeyDown(irr::KEY_RIGHT))
dx += dtime * keyspeed;*/
-
- camera_yaw -= dx*0.2;
- camera_pitch += dy*0.2;
+
+ float d = 0.2;
+ camera_yaw -= dx*d;
+ camera_pitch += dy*d;
if(camera_pitch < -89.5) camera_pitch = -89.5;
if(camera_pitch > 89.5) camera_pitch = 89.5;
+
+ turn_amount = v2f(dx, dy).getLength() * d;
}
input->setMousePos(displaycenter.X, displaycenter.Y);
}
@@ -1684,6 +1641,8 @@ void the_game(
//infostream<<"window inactive"<<std::endl;
first_loop_after_window_activation = true;
}
+ recent_turn_speed = recent_turn_speed * 0.9 + turn_amount * 0.1;
+ //std::cerr<<"recent_turn_speed = "<<recent_turn_speed<<std::endl;
/*
Player speed control
@@ -1786,8 +1745,6 @@ void the_game(
}
else if(event.type == CE_TEXTURES_UPDATED)
{
- update_skybox(driver, tsrc, smgr, skybox, brightness);
-
update_wielded_item_trigger = true;
}
}
@@ -2155,41 +2112,77 @@ void the_game(
/*
Calculate stuff for drawing
*/
-
+
/*
- Calculate general brightness
+ Fog range
*/
- u32 daynight_ratio = client.getDayNightRatio();
- u8 light8 = decode_light((daynight_ratio * LIGHT_SUN) / 1000);
- brightness = (float)light8/255.0;
- video::SColor bgcolor;
- if(brightness >= 0.2 && brightness < 0.7)
- bgcolor = video::SColor(
- 255,
- bgcolor_bright.getRed() * brightness,
- bgcolor_bright.getGreen() * brightness*0.7,
- bgcolor_bright.getBlue() * brightness*0.5);
+
+ f32 fog_range;
+ if(farmesh)
+ {
+ fog_range = BS*farmesh_range;
+ }
else
- bgcolor = video::SColor(
- 255,
- bgcolor_bright.getRed() * brightness,
- bgcolor_bright.getGreen() * brightness,
- bgcolor_bright.getBlue() * brightness);
+ {
+ fog_range = draw_control.wanted_range*BS + 0.0*MAP_BLOCKSIZE*BS;
+ fog_range *= 0.9;
+ if(draw_control.range_all)
+ fog_range = 100000*BS;
+ }
/*
- Update skybox
+ Calculate general brightness
*/
- if(fabs(brightness - old_brightness) > 0.01)
- update_skybox(driver, tsrc, smgr, skybox, brightness);
+ u32 daynight_ratio = client.getEnv().getDayNightRatio();
+ float time_brightness = (float)decode_light(
+ (daynight_ratio * LIGHT_SUN) / 1000) / 255.0;
+ float direct_brightness = 0;
+ bool sunlight_seen = false;
+ if(g_settings->getBool("free_move")){
+ direct_brightness = time_brightness;
+ sunlight_seen = true;
+ } else {
+ ScopeProfiler sp(g_profiler, "Detecting background light", SPT_AVG);
+ float old_brightness = sky->getBrightness();
+ direct_brightness = (float)client.getEnv().getClientMap()
+ .getBackgroundBrightness(MYMIN(fog_range*1.2, 60*BS),
+ daynight_ratio, (int)(old_brightness*255.5), &sunlight_seen)
+ / 255.0;
+ }
+
+ time_of_day = client.getEnv().getTimeOfDayF();
+ float maxsm = 0.05;
+ if(fabs(time_of_day - time_of_day_smooth) > maxsm &&
+ fabs(time_of_day - time_of_day_smooth + 1.0) > maxsm &&
+ fabs(time_of_day - time_of_day_smooth - 1.0) > maxsm)
+ time_of_day_smooth = time_of_day;
+ float todsm = 0.05;
+ if(time_of_day_smooth > 0.8 && time_of_day < 0.2)
+ time_of_day_smooth = time_of_day_smooth * (1.0-todsm)
+ + (time_of_day+1.0) * todsm;
+ else
+ time_of_day_smooth = time_of_day_smooth * (1.0-todsm)
+ + time_of_day * todsm;
+
+ sky->update(time_of_day_smooth, time_brightness, direct_brightness,
+ sunlight_seen);
+
+ float brightness = sky->getBrightness();
+ video::SColor bgcolor = sky->getBgColor();
+ video::SColor skycolor = sky->getSkyColor();
/*
Update clouds
*/
- if(clouds)
- {
- clouds->step(dtime);
- clouds->update(v2f(player_position.X, player_position.Z),
- brightness);
+ if(clouds){
+ if(sky->getCloudsVisible()){
+ clouds->setVisible(true);
+ clouds->step(dtime);
+ clouds->update(v2f(player_position.X, player_position.Z),
+ sky->getCloudColor());
+ } else{
+ clouds->setVisible(false);
+ }
}
/*
@@ -2208,35 +2201,17 @@ void the_game(
brightness, farmesh_range);
}
- // Store brightness value
- old_brightness = brightness;
-
/*
Fog
*/
if(g_settings->getBool("enable_fog") == true && !force_fog_off)
{
- f32 range;
- if(farmesh)
- {
- range = BS*farmesh_range;
- }
- else
- {
- range = draw_control.wanted_range*BS + 0.0*MAP_BLOCKSIZE*BS;
- range *= 0.9;
- if(draw_control.range_all)
- range = 100000*BS;
- /*if(range < 50*BS)
- range = range * 0.5 + 25*BS;*/
- }
-
driver->setFog(
bgcolor,
video::EFT_FOG_LINEAR,
- range*0.4,
- range*1.0,
+ fog_range*0.4,
+ fog_range*1.0,
0.01,
false, // pixel fog
false // range fog
@@ -2443,15 +2418,15 @@ void the_game(
{
TimeTaker timer("beginScene");
- driver->beginScene(false, true, bgcolor);
//driver->beginScene(false, true, bgcolor);
+ //driver->beginScene(true, true, bgcolor);
+ driver->beginScene(true, true, skycolor);
beginscenetime = timer.stop(true);
}
//timer3.stop();
-
+
//infostream<<"smgr->drawAll()"<<std::endl;
-
{
TimeTaker timer("smgr");
smgr->drawAll();
@@ -2570,6 +2545,11 @@ void the_game(
NULL);
}
+ // Clear Z buffer
+ driver->clearZBuffer();
+ // Draw some sky things
+ //draw_horizon(driver, camera.getCameraNode());
+
/*
End scene
*/