diff --git a/src/drawscene.cpp b/src/drawscene.cpp index f7b916a8c..a69cf4403 100644 --- a/src/drawscene.cpp +++ b/src/drawscene.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "main.h" // for g_settings #include "settings.h" #include "clouds.h" +#include "clientmap.h" #include "util/timetaker.h" typedef enum { @@ -458,6 +459,14 @@ void draw_scene(video::IVideoDriver* driver, scene::ISceneManager* smgr, draw_plain(camera, show_hud, hud, hilightboxes, driver, draw_wield_tool, client, guienv); } + + /* + Post effects + */ + { + client.getEnv().getClientMap().renderPostFx(camera.getCameraMode()); + } + //TODO how to make those 3d too if (show_hud) { diff --git a/src/game.cpp b/src/game.cpp index 6076ac4a0..609ca1a1a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -319,7 +319,7 @@ PointedThing getPointedThing(Client *client, v3f player_position, // That didn't work, try to find a pointed at node - + v3s16 pos_i = floatToInt(player_position, BS); /*infostream<<"pos_i=("<0 ? a : 1); s16 zend = pos_i.Z + (camera_direction.Z>0 ? a : 1); s16 xend = pos_i.X + (camera_direction.X>0 ? a : 1); - + // Prevent signed number overflow if(yend==32767) yend=32766; @@ -483,7 +483,7 @@ public: while(m_log.size() > m_log_max_size) m_log.erase(m_log.begin()); } - + void draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver, gui::IGUIFont* font) const { @@ -532,7 +532,7 @@ public: s32 graphh = 50; s32 textx = x_left + m_log_max_size + 15; s32 textx2 = textx + 200 - 15; - + // Draw background /*{ u32 num_graphs = m_meta.size(); @@ -541,7 +541,7 @@ public: video::SColor bgcolor(120,0,0,0); driver->draw2DRectangle(bgcolor, rect, NULL); }*/ - + s32 meta_i = 0; for(std::map::const_iterator i = m_meta.begin(); i != m_meta.end(); i++){ @@ -627,7 +627,7 @@ class NodeDugEvent: public MtEvent public: v3s16 p; MapNode n; - + NodeDugEvent(v3s16 p, MapNode n): p(p), n(n) @@ -800,7 +800,7 @@ public: u32 daynight_ratio = m_client->getEnv().getDayNightRatio(); float daynight_ratio_f = (float)daynight_ratio / 1000.0; services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1); - + u32 animation_timer = porting::getTimeMs() % 100000; float animation_timer_f = (float)animation_timer / 100000.0; services->setPixelShaderConstant("animationTimer", &animation_timer_f, 1); @@ -1034,7 +1034,7 @@ static void show_pause_menu(GUIFormSpecMenu** cur_formspec, LocalFormspecHandler* txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU"); create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst); - + if (singleplayermode) { (*cur_formspec)->doPause = true; } @@ -1052,7 +1052,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, GUIFormSpecMenu* current_formspec = 0; video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); - + // Calculate text height using the font u32 text_height = font->getDimension(L"Random test string").Height; @@ -1065,19 +1065,19 @@ void the_game(bool &kill, bool random_input, InputHandler *input, draw_load_screen(text, device, guienv, font, 0, 0); delete[] text; } - + // 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(); // Create node definition manager IWritableNodeDefManager *nodedef = createNodeDefManager(); - + // Sound fetcher (useful when testing) GameOnDemandSoundFetcher soundfetcher; @@ -1109,7 +1109,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, // Sound maker SoundMaker soundmaker(sound, nodedef); soundmaker.registerReceiver(&eventmgr); - + // Add chat log output for errors to be shown in chat LogOutputBuffer chat_log_error_buf(LMT_ERROR); @@ -1158,7 +1158,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, } do{ // Client scope (breakable do-while(0)) - + /* Create client */ @@ -1169,9 +1169,9 @@ void the_game(bool &kill, bool random_input, InputHandler *input, delete[] text; } infostream<<"Creating client"<step(dtime); - + // End condition if(client.getState() == LC_Init){ could_connect = true; @@ -1269,14 +1269,14 @@ void the_game(bool &kill, bool random_input, InputHandler *input, infostream<<"Connect aborted [Escape]"<step(dtime); - + // End condition if(client.mediaReceived() && client.itemdefReceived() && @@ -1370,7 +1370,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, infostream<<"Connect aborted [Escape]"<getBool("enable_clouds")) { @@ -1481,7 +1481,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, sky = new Sky(smgr->getRootSceneNode(), smgr, -1); scene::ISceneNode* skybox = NULL; - + /* A copy of the local inventory */ @@ -1517,17 +1517,17 @@ void the_game(bool &kill, bool random_input, InputHandler *input, L"", core::rect(0,0,400,text_height*5+5) + v2s32(100,200), false, true); - + // Status text (displays info when showing and hiding GUI stuff, etc.) gui::IGUIStaticText *guitext_status = guienv->addStaticText( L"", core::rect(0,0,0,0), false, false); guitext_status->setVisible(false); - + std::wstring statustext; float statustext_time = 0; - + // Chat text gui::IGUIStaticText *guitext_chat = guienv->addStaticText( L"", @@ -1538,7 +1538,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, chat_backend.clearRecentChat(); // Chat backend and console GUIChatConsole *gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(), -1, &chat_backend, &client); - + // Profiler text (size is updated when text is updated) gui::IGUIStaticText *guitext_profiler = guienv->addStaticText( L"", @@ -1547,16 +1547,16 @@ void the_game(bool &kill, bool random_input, InputHandler *input, guitext_profiler->setBackgroundColor(video::SColor(120,0,0,0)); guitext_profiler->setVisible(false); guitext_profiler->setWordWrap(true); - + /* Some statistics are collected in these */ u32 drawtime = 0; u32 beginscenetime = 0; u32 endscenetime = 0; - + float recent_turn_speed = 0.0; - + ProfilerGraph graph; // Initially clear the profiler Profiler::GraphValues dummyvalues; @@ -1624,7 +1624,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, LocalPlayer* player = client.getEnv().getLocalPlayer(); player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; - + /* HUD object */ @@ -1658,7 +1658,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, busytime_u32 = 0; busytime = busytime_u32 / 1000.0; } - + g_profiler->graphAdd("mainloop_other", busytime - (float)drawtime/1000.0f); // Necessary for device->getTimer()->getTime() @@ -1673,7 +1673,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, g_settings->getFloat("pause_fps_max") : g_settings->getFloat("fps_max"); u32 frametime_min = 1000./fps_max; - + if(busytime_u32 < frametime_min) { u32 sleeptime = frametime_min - busytime_u32; @@ -1689,7 +1689,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, Time difference calculation */ f32 dtime; // in seconds - + u32 time = device->getTimer()->getTime(); if(time > lasttime) dtime = (time - lasttime) / 1000.0; @@ -1706,7 +1706,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, if(object_hit_delay_timer >= 0) object_hit_delay_timer -= dtime; time_from_last_punch += dtime; - + g_profiler->add("Elapsed time", dtime); g_profiler->avg("FPS", 1./dtime); @@ -1735,7 +1735,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, jitter1_max = 0.0; } } - + /* Busytime average and jitter calculation */ @@ -1743,7 +1743,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, static f32 busytime_avg1 = 0.0; busytime_avg1 = busytime_avg1 * 0.98 + busytime * 0.02; f32 busytime_jitter1 = busytime - busytime_avg1; - + static f32 busytime_jitter1_max_sample = 0.0; static f32 busytime_jitter1_min_sample = 0.0; { @@ -1767,7 +1767,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Handle miscellaneous stuff */ - + if(client.accessDenied()) { error_message = L"Access denied. Reason: " @@ -1811,7 +1811,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, Random calculations */ hud.resizeHotbar(); - + // Hilight boxes collected during the loop and displayed std::vector hilightboxes; @@ -1843,7 +1843,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Direct handling of user input */ - + // Reset input if window not active or some menu is active if(device->isWindowActive() == false || noMenuActive() == false @@ -1880,7 +1880,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, { infostream<<"the_game: " <<"Launching inventory"<isKeyDown(getKeySetting("keymap_jump")) && reset_jump_timer) { @@ -2160,7 +2160,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, new_playeritem = max_item; } } - + // Item selection for(u16 i=0; i<10; i++) { @@ -2210,7 +2210,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, Mouse and camera control 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) { @@ -2232,7 +2232,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, dy = -dy; } //infostream<<"window active, pos difference "<isKeyDown(irr::KEY_UP)) dy -= dtime * keyspeed; @@ -2242,14 +2242,14 @@ void the_game(bool &kill, bool random_input, InputHandler *input, dx -= dtime * keyspeed; if(input->isKeyDown(irr::KEY_RIGHT)) dx += dtime * keyspeed;*/ - + float d = g_settings->getFloat("mouse_sensitivity"); d = rangelim(d, 0.01, 100.0); 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((driver->getScreenSize().Width/2), @@ -2442,7 +2442,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, delete event.hudadd.size; continue; } - + e = new HudElement; e->type = (HudElementType)event.hudadd.type; e->pos = *event.hudadd.pos; @@ -2456,7 +2456,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, e->offset = *event.hudadd.offset; e->world_pos = *event.hudadd.world_pos; e->size = *event.hudadd.size; - + u32 new_id = player->addHud(e); //if this isn't true our huds aren't consistent assert(new_id == id); @@ -2487,7 +2487,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, delete event.hudchange.v2s32data; continue; } - + switch (event.hudchange.stat) { case HUD_STAT_POS: e->pos = *event.hudchange.v2fdata; @@ -2523,7 +2523,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, e->size = *event.hudchange.v2s32data; break; } - + delete event.hudchange.v3fdata; delete event.hudchange.v2fdata; delete event.hudchange.sdata; @@ -2569,7 +2569,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, } } } - + //TimeTaker //timer2("//timer2"); /* @@ -2590,7 +2590,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, playeritem.getDefinition(itemdef); ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(itemdef); - + /* Update camera */ @@ -2625,7 +2625,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, v3s16 camera_offset = camera.getOffset(); bool camera_offset_changed = (camera_offset != old_camera_offset); - + if(!disable_camera_update){ client.getEnv().getClientMap().updateCamera(camera_position, camera_direction, camera_fov, camera_offset); @@ -2636,7 +2636,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, clouds->updateCameraOffset(camera_offset); } } - + // Update sound listener sound->updateListener(camera.getCameraNode()->getPosition()+intToFloat(camera_offset, BS), v3f(0,0,0), // velocity @@ -2649,7 +2649,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, */ { soundmaker.step(dtime); - + ClientMap &map = client.getEnv().getClientMap(); MapNode n = map.getNodeNoEx(player->getStandingNodePos()); soundmaker.m_player_step_sound = nodedef->get(n).sound_footstep; @@ -2658,9 +2658,9 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Calculate what block is the crosshair pointing to */ - + //u32 t1 = device->getTimer()->getRealTime(); - + f32 d = playeritem_def.range; // max. distance f32 d_hand = itemdef->get("").range; if(d < 0 && d_hand >= 0) @@ -2754,7 +2754,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Check information text of node */ - + ClientMap &map = client.getEnv().getClientMap(); NodeMetadata *meta = map.getNodeMetadata(nodepos); if(meta){ @@ -2766,11 +2766,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input, infotext += narrow_to_wide(nodedef->get(n).name); } } - + /* Handle digging */ - + if(nodig_delay_timer <= 0.0 && input->getLeftState() && client.checkPrivilege("interact")) { @@ -2782,7 +2782,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, ldown_for_dig = true; } MapNode n = client.getEnv().getClientMap().getNode(nodepos); - + // NOTE: Similar piece of code exists on the server side for // cheat detection. // Get digging parameters @@ -2883,7 +2883,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, float mindelay = 0.15; if(nodig_delay_timer < mindelay) nodig_delay_timer = mindelay; - + // Send event to trigger sound MtEvent *e = new NodeDugEvent(nodepos, wasnode); gamedef->event()->put(e); @@ -2906,7 +2906,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, { repeat_rightclick_timer = 0; infostream<<"Ground right-clicked"<getString("formspec") == "hack:sign_text_input" @@ -2914,7 +2914,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, && !input->isKeyDown(getKeySetting("keymap_sneak"))) { infostream<<"Launching metadata text input"<getPosition(); v3f dir = (objpos - player_position).normalize(); - + bool disable_send = selected_object->directReportPunch( dir, &playeritem, time_from_last_punch); time_from_last_punch = 0; @@ -3021,7 +3021,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, } pointed_old = pointed; - + if(left_punch || input->getLeftClicked()) { camera.setDigging(0); // left click animation @@ -3032,7 +3032,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, input->resetLeftReleased(); input->resetRightReleased(); - + /* Calculate stuff for drawing */ @@ -3040,7 +3040,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Fog range */ - + if(draw_control.range_all) fog_range = 100000*BS; else { @@ -3067,7 +3067,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, 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 && @@ -3081,11 +3081,11 @@ void the_game(bool &kill, bool random_input, InputHandler *input, 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,camera.getCameraMode(), player->getYaw(), player->getPitch()); - + video::SColor bgcolor = sky->getBgColor(); video::SColor skycolor = sky->getSkyColor(); @@ -3102,18 +3102,18 @@ void the_game(bool &kill, bool random_input, InputHandler *input, clouds->setVisible(false); } } - + /* Update particles */ allparticles_step(dtime); allparticlespawners_step(dtime, client.getEnv()); - + /* Fog */ - + if(g_settings->getBool("enable_fog") && !force_fog_off) { driver->setFog( @@ -3144,7 +3144,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, */ //TimeTaker guiupdatetimer("Gui updating"); - + if(show_debug) { static float drawtime_avg = 0; @@ -3223,7 +3223,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, { guitext2->setVisible(false); } - + { guitext_info->setText(infotext.c_str()); guitext_info->setVisible(show_hud && g_menumgr.menuCount() == 0); @@ -3269,7 +3269,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, guitext_status->enableOverrideColor(true); } } - + /* Get chat messages from client */ @@ -3314,7 +3314,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, /* Inventory */ - + if(client.getPlayerItem() != new_playeritem) { client.selectPlayerItem(new_playeritem); @@ -3323,7 +3323,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, { //infostream<<"Updating local inventory"<draw2DRectangle(color, core::rect(0,0,screensize.X,screensize.Y), NULL); - + damage_flash -= 100.0*dtime; } @@ -3436,7 +3429,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, if (sky) sky->drop(); clear_particles(); - + /* cleanup menus */ while (g_menumgr.menuCount() > 0) { @@ -3486,7 +3479,7 @@ void the_game(bool &kill, bool random_input, InputHandler *input, } - + if(!sound_is_dummy) delete sound;