]> git.lizzy.rs Git - minetest.git/blobdiff - src/game.cpp
Make m_media_fetch_threads to contain MediaFetchThread* instead of MediaFetchThread
[minetest.git] / src / game.cpp
index 5ce214cb8d3150c253c63c1be99d028654667f10..dbb71369fbaf1da3ab9d397af74fa30c6cde8d47 100644 (file)
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <IGUIButton.h>
 #include <IGUIStaticText.h>
 #include <IGUIFont.h>
+#include <IMaterialRendererServices.h>
 #include "client.h"
 #include "server.h"
 #include "guiPauseMenu.h"
@@ -50,6 +51,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "main.h" // For g_settings
 #include "itemdef.h"
 #include "tile.h" // For TextureSource
+#include "shader.h" // For ShaderSource
 #include "logoutputbuffer.h"
 #include "subgame.h"
 #include "quicktune_shortcutter.h"
@@ -834,6 +836,53 @@ class GameOnDemandSoundFetcher: public OnDemandSoundFetcher
        }
 };
 
+class GameGlobalShaderConstantSetter : public IShaderConstantSetter
+{
+       Sky *m_sky;
+       bool *m_force_fog_off;
+       f32 *m_fog_range;
+       Client *m_client;
+
+public:
+       GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
+                       f32 *fog_range, Client *client):
+               m_sky(sky),
+               m_force_fog_off(force_fog_off),
+               m_fog_range(fog_range),
+               m_client(client)
+       {}
+       ~GameGlobalShaderConstantSetter() {}
+
+       virtual void onSetConstants(video::IMaterialRendererServices *services,
+                       bool is_highlevel)
+       {
+               if(!is_highlevel)
+                       return;
+
+               // Background color
+               video::SColor bgcolor = m_sky->getBgColor();
+               video::SColorf bgcolorf(bgcolor);
+               float bgcolorfa[4] = {
+                       bgcolorf.r,
+                       bgcolorf.g,
+                       bgcolorf.b,
+                       bgcolorf.a,
+               };
+               services->setPixelShaderConstant("skyBgColor", bgcolorfa, 4);
+
+               // Fog distance
+               float fog_distance = *m_fog_range;
+               if(*m_force_fog_off)
+                       fog_distance = 10000*BS;
+               services->setPixelShaderConstant("fogDistance", &fog_distance, 1);
+
+               // Day-night ratio
+               u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
+               float daynight_ratio_f = (float)daynight_ratio / 1000.0;
+               services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
+       }
+};
+
 void the_game(
        bool &kill,
        bool random_input,
@@ -876,6 +925,9 @@ void the_game(
        // Create texture source
        IWritableTextureSource *tsrc = createTextureSource(device);
        
+       // Create shader source
+       IWritableShaderSource *shsrc = createShaderSource(device);
+       
        // These will be filled by data received from the server
        // Create item definition manager
        IWritableItemDefManager *itemdef = createItemDefManager();
@@ -943,7 +995,7 @@ void the_game(
        MapDrawControl draw_control;
 
        Client client(device, playername.c_str(), password, draw_control,
-                       tsrc, itemdef, nodedef, sound, &eventmgr);
+                       tsrc, shsrc, itemdef, nodedef, sound, &eventmgr);
        
        // Client acts as our GameDef
        IGameDef *gamedef = &client;
@@ -1162,7 +1214,7 @@ void the_game(
 
        // First line of debug text
        gui::IGUIStaticText *guitext = guienv->addStaticText(
-                       L"Minetest-c55",
+                       L"Minetest",
                        core::rect<s32>(5, 5, 795, 5+text_height),
                        false, false);
        // Second line of debug text
@@ -1246,6 +1298,7 @@ void the_game(
        bool show_hud = true;
        bool show_chat = true;
        bool force_fog_off = false;
+       f32 fog_range = 100*BS;
        bool disable_camera_update = false;
        bool show_debug = g_settings->getBool("show_debug");
        bool show_profiler_graph = false;
@@ -1255,6 +1308,12 @@ void the_game(
        float time_of_day = 0;
        float time_of_day_smooth = 0;
 
+       /*
+               Shader constants
+       */
+       shsrc->addGlobalConstantSetter(new GameGlobalShaderConstantSetter(
+                       sky, &force_fog_off, &fog_range, &client));
+
        /*
                Main loop
        */
@@ -1416,10 +1475,16 @@ void the_game(
                        g_gamecallback->changepassword_requested = false;
                }
 
+               /* Process TextureSource's queue */
+               tsrc->processQueue();
+
+               /* Process ItemDefManager's queue */
+               itemdef->processQueue(gamedef);
+
                /*
-                       Process TextureSource's queue
+                       Process ShaderSource's queue
                */
-               tsrc->processQueue();
+               shsrc->processQueue();
 
                /*
                        Random calculations
@@ -1513,7 +1578,7 @@ void the_game(
                                        <<"Launching inventory"<<std::endl;
                        
                        GUIFormSpecMenu *menu =
-                               new GUIFormSpecMenu(guienv, guiroot, -1,
+                               new GUIFormSpecMenu(device, guiroot, -1,
                                        &g_menumgr,
                                        &client, gamedef);
 
@@ -1600,6 +1665,23 @@ void the_game(
                                        statustext += L" (note: no 'fast' privilege)";
                        }
                }
+               else if(input->wasKeyDown(getKeySetting("keymap_noclip")))
+               {
+                       if(g_settings->getBool("noclip"))
+                       {
+                               g_settings->set("noclip","false");
+                               statustext = L"noclip disabled";
+                               statustext_time = 0;
+                       }
+                       else
+                       {
+                               g_settings->set("noclip","true");
+                               statustext = L"noclip enabled";
+                               statustext_time = 0;
+                               if(!client.checkPrivilege("noclip"))
+                                       statustext += L" (note: no 'noclip' privilege)";
+                       }
+               }
                else if(input->wasKeyDown(getKeySetting("keymap_screenshot")))
                {
                        irr::video::IImage* const image = driver->createScreenShot(); 
@@ -2296,7 +2378,7 @@ void the_game(
                                        /* Create menu */
 
                                        GUIFormSpecMenu *menu =
-                                               new GUIFormSpecMenu(guienv, guiroot, -1,
+                                               new GUIFormSpecMenu(device, guiroot, -1,
                                                        &g_menumgr,
                                                        &client, gamedef);
                                        menu->setFormSpec(meta->getString("formspec"),
@@ -2424,7 +2506,6 @@ void the_game(
                        Fog range
                */
        
-               f32 fog_range;
                if(farmesh)
                {
                        fog_range = BS*farmesh_range;
@@ -2441,8 +2522,7 @@ void the_game(
                        Calculate general brightness
                */
                u32 daynight_ratio = client.getEnv().getDayNightRatio();
-               float time_brightness = (float)decode_light(
-                               (daynight_ratio * LIGHT_SUN) / 1000) / 255.0;
+               float time_brightness = decode_light_f((float)daynight_ratio/1000.0);
                float direct_brightness = 0;
                bool sunlight_seen = false;
                if(g_settings->getBool("free_move")){
@@ -2544,7 +2624,7 @@ void the_game(
                //TimeTaker guiupdatetimer("Gui updating");
                
                const char program_name_and_version[] =
-                       "Minetest-c55 " VERSION_STRING;
+                       "Minetest " VERSION_STRING;
 
                if(show_debug)
                {
@@ -2750,6 +2830,76 @@ void the_game(
                {
                        TimeTaker timer("smgr");
                        smgr->drawAll();
+                       
+                       if(g_settings->getBool("anaglyph"))
+                       {
+                               irr::core::vector3df oldPosition = camera.getCameraNode()->getPosition();
+                               irr::core::vector3df oldTarget   = camera.getCameraNode()->getTarget();
+
+                               irr::core::matrix4 startMatrix   = camera.getCameraNode()->getAbsoluteTransformation();
+
+                               irr::core::vector3df focusPoint  = (camera.getCameraNode()->getTarget() -
+                                                                                camera.getCameraNode()->getAbsolutePosition()).setLength(1) +
+                                                                                camera.getCameraNode()->getAbsolutePosition() ;
+
+                               //Left eye...
+                               irr::core::vector3df leftEye;
+                               irr::core::matrix4   leftMove;
+
+                               leftMove.setTranslation( irr::core::vector3df(-g_settings->getFloat("anaglyph_strength"),0.0f,0.0f) );
+                               leftEye=(startMatrix*leftMove).getTranslation();
+
+                               //clear the depth buffer, and color
+                               driver->beginScene( true, true, irr::video::SColor(0,200,200,255) );
+
+                               driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_RED;
+                               driver->getOverrideMaterial().EnableFlags  = irr::video::EMF_COLOR_MASK;
+                               driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX + 
+                                                                                                                        irr::scene::ESNRP_SOLID +
+                                                                                                                        irr::scene::ESNRP_TRANSPARENT +
+                                                                                                                        irr::scene::ESNRP_TRANSPARENT_EFFECT +
+                                                                                                                        irr::scene::ESNRP_SHADOW;
+
+                               camera.getCameraNode()->setPosition( leftEye );
+                               camera.getCameraNode()->setTarget( focusPoint );
+
+                               smgr->drawAll(); // 'smgr->drawAll();' may go here
+
+
+                               //Right eye...
+                               irr::core::vector3df rightEye;
+                               irr::core::matrix4   rightMove;
+
+                               rightMove.setTranslation( irr::core::vector3df(g_settings->getFloat("anaglyph_strength"),0.0f,0.0f) );
+                               rightEye=(startMatrix*rightMove).getTranslation();
+
+                               //clear the depth buffer
+                               driver->clearZBuffer();
+
+                               driver->getOverrideMaterial().Material.ColorMask = irr::video::ECP_GREEN + irr::video::ECP_BLUE;
+                               driver->getOverrideMaterial().EnableFlags  = irr::video::EMF_COLOR_MASK;
+                               driver->getOverrideMaterial().EnablePasses = irr::scene::ESNRP_SKY_BOX +
+                                                                                                                        irr::scene::ESNRP_SOLID +
+                                                                                                                        irr::scene::ESNRP_TRANSPARENT +
+                                                                                                                        irr::scene::ESNRP_TRANSPARENT_EFFECT +
+                                                                                                                        irr::scene::ESNRP_SHADOW;
+
+                               camera.getCameraNode()->setPosition( rightEye );
+                               camera.getCameraNode()->setTarget( focusPoint );
+
+                               smgr->drawAll(); // 'smgr->drawAll();' may go here
+
+
+                               //driver->endScene();
+
+                               driver->getOverrideMaterial().Material.ColorMask=irr::video::ECP_ALL;
+                               driver->getOverrideMaterial().EnableFlags=0;
+                               driver->getOverrideMaterial().EnablePasses=0;
+
+                               camera.getCameraNode()->setPosition( oldPosition );
+                               camera.getCameraNode()->setTarget( oldTarget );
+                       }
+
                        scenetime = timer.stop(true);
                }
                
@@ -2825,11 +2975,6 @@ void the_game(
                //timer10.stop();
                //TimeTaker //timer11("//timer11");
 
-               /*
-                       Draw gui
-               */
-               // 0-1ms
-               guienv->drawAll();
 
                /*
                        Draw hotbar
@@ -2855,6 +3000,12 @@ void the_game(
                                        NULL);
                }
 
+               /*
+                       Draw gui
+               */
+               // 0-1ms
+               guienv->drawAll();
+
                /*
                        End scene
                */
@@ -2931,9 +3082,11 @@ void the_game(
        
        if(!sound_is_dummy)
                delete sound;
+
+       delete tsrc;
+       delete shsrc;
        delete nodedef;
        delete itemdef;
-       delete tsrc;
 }