From f2062d6fe7545b6084bf9a472b71e5ad988f578a Mon Sep 17 00:00:00 2001 From: Dorian Wouters Date: Sat, 28 Mar 2015 14:31:39 +0100 Subject: [PATCH] Faster atlas creation Block selection Chunk de/compression now uses internal buffer directly (0-copy) Optimized Chunk vertices list order (faster vert access from GPU cache) F5 Debug info: added triangle count Implemented ladder climb Road + jump pad makes you jump farther Fixed bad fog color blending (alpha-channel) Changed LZFX and enet compilation to Release, -O3 --- AtlasCreator.cpp | 24 +- Blocks.cpp | 235 ++++++++---------- Blocks.hpp | 20 +- CaveGenerator.cpp | 22 +- Chunk.cpp | 55 ++-- Chunk.hpp | 1 - Font.cpp | 51 ++-- Font.hpp | 11 +- Game.cpp | 2 + Game.hpp | 1 + GameState.cpp | 104 +++++--- GameState.hpp | 5 +- GameWindow.cpp | 4 + GameWindow.hpp | 1 + GlobalProperties.cpp | 2 - GlobalProperties.hpp | 2 - LocalPlayer.cpp | 63 ++++- LocalPlayer.hpp | 3 +- Platform.cpp | 2 +- Player.cpp | 34 +-- Player.hpp | 23 +- Program.hpp | 24 +- Server.cpp | 39 +-- Server.hpp | 4 +- Sound.hpp | 14 +- SoundBuffer.cpp | 13 +- Superchunk.cpp | 43 ++-- VBO.hpp | 9 - assets/3d.f.glsl | 2 +- assets/3d.v.glsl | 8 +- assets/blocks/tex_block_bank_back_blue.png | Bin 202 -> 209 bytes assets/blocks/tex_block_bank_back_red.png | Bin 202 -> 209 bytes assets/blocks/tex_block_bank_blue.png | Bin 398 -> 0 bytes assets/blocks/tex_block_bank_front_blue.png | Bin 367 -> 385 bytes assets/blocks/tex_block_bank_front_red.png | Bin 367 -> 384 bytes assets/blocks/tex_block_bank_red.png | Bin 398 -> 0 bytes assets/blocks/tex_block_road.png | Bin 3452 -> 0 bytes assets/blocks/tex_block_road_bottom.png | Bin 3599 -> 0 bytes assets/blocks/tex_block_road_top.png | Bin 3027 -> 0 bytes .../{tex_icon_bank_blue.png => bank_blue.png} | Bin .../{tex_icon_bank_red.png => bank_red.png} | Bin .../icons/{tex_icon_beacon.png => beacon.png} | Bin ..._deconstruction.png => deconstruction.png} | Bin .../{tex_icon_explosive.png => explosive.png} | Bin assets/icons/{tex_icon_jump.png => jump.png} | Bin .../icons/{tex_icon_ladder.png => ladder.png} | Bin .../icons/{tex_icon_metal.png => metal.png} | Bin assets/icons/{tex_icon_road.png => road.png} | Bin ...tex_icon_solid_blue.png => solid_blue.png} | Bin .../{tex_icon_solid_red.png => solid_red.png} | Bin .../icons/{tex_icon_spikes.png => spikes.png} | Bin ...tex_icon_teleporter.png => teleporter.png} | Bin ...nslucent_blue.png => translucent_blue.png} | Bin ...ranslucent_red.png => translucent_red.png} | Bin enet/CMakeLists.txt | 4 +- lzfx/CMakeLists.txt | 4 + ui/Manager.cpp | 79 +++--- ui/Manager.hpp | 1 + 58 files changed, 499 insertions(+), 410 deletions(-) delete mode 100644 assets/blocks/tex_block_bank_blue.png delete mode 100644 assets/blocks/tex_block_bank_red.png delete mode 100644 assets/blocks/tex_block_road.png delete mode 100644 assets/blocks/tex_block_road_bottom.png delete mode 100644 assets/blocks/tex_block_road_top.png rename assets/icons/{tex_icon_bank_blue.png => bank_blue.png} (100%) rename assets/icons/{tex_icon_bank_red.png => bank_red.png} (100%) rename assets/icons/{tex_icon_beacon.png => beacon.png} (100%) rename assets/icons/{tex_icon_deconstruction.png => deconstruction.png} (100%) rename assets/icons/{tex_icon_explosive.png => explosive.png} (100%) rename assets/icons/{tex_icon_jump.png => jump.png} (100%) rename assets/icons/{tex_icon_ladder.png => ladder.png} (100%) rename assets/icons/{tex_icon_metal.png => metal.png} (100%) rename assets/icons/{tex_icon_road.png => road.png} (100%) rename assets/icons/{tex_icon_solid_blue.png => solid_blue.png} (100%) rename assets/icons/{tex_icon_solid_red.png => solid_red.png} (100%) rename assets/icons/{tex_icon_spikes.png => spikes.png} (100%) rename assets/icons/{tex_icon_teleporter.png => teleporter.png} (100%) rename assets/icons/{tex_icon_translucent_blue.png => translucent_blue.png} (100%) rename assets/icons/{tex_icon_translucent_red.png => translucent_red.png} (100%) diff --git a/AtlasCreator.cpp b/AtlasCreator.cpp index 8a1ba30..78ecccc 100644 --- a/AtlasCreator.cpp +++ b/AtlasCreator.cpp @@ -1,8 +1,13 @@ #include "AtlasCreator.hpp" #include "stb_image.h" -//#include #include #include +#include + +#define ENABLE_TIMING 0 +#if ENABLE_TIMING + #include +#endif namespace Diggler { @@ -14,7 +19,7 @@ AtlasCreator::AtlasCreator(int w, int h, int uw, int uh) : atlasWidth(w), atlasH throw std::invalid_argument("Atlas W/H is not divisor of Coord's type"); atlasData = new uint8[w * h * 4]; - std::fill_n(atlasData, w * h * 4, static_cast(0)); + memset(atlasData, w * h * 4, 0); } AtlasCreator::Coord AtlasCreator::add(const std::string& path) { @@ -62,16 +67,18 @@ AtlasCreator::Coord AtlasCreator::add(int width, int height, int channels, const targetY = lastY; } - //auto t1 = std::chrono::high_resolution_clock::now(); +#if ENABLE_TIMING + auto t1 = std::chrono::high_resolution_clock::now(); +#endif // Blit the texture onto the atlas for(int sourceY = 0; sourceY < height; ++sourceY) { int fromPad = sourceY * width; int toPad = (targetY + sourceY) * atlasWidth; + memcpy(&atlasData[(toPad+targetX)*4], &data[fromPad*4], width*4); +#if 0 // For platforms where memcpy would be slow for(int sourceX = 0; sourceX < width; sourceX += 2) { int from = (fromPad + sourceX) * 4; int to = (toPad + (targetX + sourceX)) * 4; - - // MMX-like copy, fast (actual MMX/SSE would be f'kin fast) #if HAS_NATIVE_64BIT *((int64*)(&atlasData[to])) = *((int64*)(&data[from])); #else @@ -79,9 +86,12 @@ AtlasCreator::Coord AtlasCreator::add(int width, int height, int channels, const *((int32*)(&atlasData[to + 4])) = *((int32*)(&data[from + 4])); #endif } +#endif } - //auto t2 = std::chrono::high_resolution_clock::now(); - //getDebugStream() << std::chrono::duration_cast(t2-t1).count() << std::endl; +#if ENABLE_TIMING + auto t2 = std::chrono::high_resolution_clock::now(); + getDebugStream() << std::chrono::duration_cast(t2-t1).count() << std::endl; +#endif lastX = targetX + unitWidth; lastY = targetY; diff --git a/Blocks.cpp b/Blocks.cpp index 4ae4087..55fa037 100644 --- a/Blocks.cpp +++ b/Blocks.cpp @@ -1,31 +1,64 @@ #include "Blocks.hpp" #include "GlobalProperties.hpp" +#include "stb_perlin.h" + +#define NON 0x0 +#define RED Blocks::TeamRed +#define BLU Blocks::TeamBlue +#define ANY (RED | BLU) namespace Diggler { -BlockTex sideTextures[(int)BlockType::LAST][6] = { - /* Air */ {BlockTex::None, BlockTex::None, BlockTex::None, BlockTex::None, BlockTex::None, BlockTex::None}, - /* Dirt */ {BlockTex::Dirt, BlockTex::Dirt, BlockTex::Dirt, BlockTex::Dirt, BlockTex::Dirt, BlockTex::Dirt}, - /* Ore */ {BlockTex::Ore, BlockTex::Ore, BlockTex::Ore, BlockTex::Ore, BlockTex::Ore, BlockTex::Ore}, - /* Gold */ {BlockTex::Gold, BlockTex::Gold, BlockTex::Gold, BlockTex::Gold, BlockTex::Gold, BlockTex::Gold}, - /*Diamond*/ {BlockTex::Diamond, BlockTex::Diamond, BlockTex::Diamond, BlockTex::Diamond, BlockTex::Diamond, BlockTex::Diamond}, - /* Rock */ {BlockTex::Rock, BlockTex::Rock, BlockTex::Rock, BlockTex::Rock, BlockTex::Rock, BlockTex::Rock}, - /* Ladder */{BlockTex::Ladder, BlockTex::Ladder, BlockTex::LadderTop, BlockTex::LadderTop, BlockTex::Ladder, BlockTex::Ladder}, - /* TNT*/ {BlockTex::Explosive, BlockTex::Explosive, BlockTex::Explosive, BlockTex::Explosive, BlockTex::Explosive, BlockTex::Explosive}, - /* Jump */ {BlockTex::Jump, BlockTex::Jump, BlockTex::JumpTop, BlockTex::TeleBottom, BlockTex::Jump, BlockTex::Jump}, - /* Shock */ {BlockTex::TeleSideA, BlockTex::TeleSideA, BlockTex::TeleBottom, BlockTex::Spikes, BlockTex::TeleSideB, BlockTex::TeleSideB}, - /*BankRed*/ {BlockTex::BankFrontRed, BlockTex::BankBackRed, BlockTex::BankTopRed, BlockTex::BankTopRed, BlockTex::BankLeftRed, BlockTex::BankRightRed}, - /*BankBlue*/{BlockTex::BankFrontBlue, BlockTex::BankBackBlue, BlockTex::BankTopBlue, BlockTex::BankTopBlue, BlockTex::BankLeftBlue, BlockTex::BankRightBlue}, - /*BeaconR*/ {BlockTex::TeleSideA, BlockTex::TeleSideA, BlockTex::BeaconRed, BlockTex::LadderTop, BlockTex::TeleSideB, BlockTex::TeleSideB}, - /*BeaconB*/ {BlockTex::TeleSideA, BlockTex::TeleSideA, BlockTex::BeaconBlue, BlockTex::LadderTop, BlockTex::TeleSideB, BlockTex::TeleSideB}, - /* Road */ {BlockTex::Road, BlockTex::Road, BlockTex::Road, BlockTex::Road, BlockTex::Road, BlockTex::Road}, - /* SolidR */{BlockTex::SolidRed, BlockTex::SolidRed, BlockTex::SolidRed, BlockTex::SolidRed, BlockTex::SolidRed, BlockTex::SolidRed}, - /* SolidB */{BlockTex::SolidBlue, BlockTex::SolidBlue, BlockTex::SolidBlue, BlockTex::SolidBlue, BlockTex::SolidBlue, BlockTex::SolidBlue}, - /* Metal */ {BlockTex::Metal, BlockTex::Metal, BlockTex::Metal, BlockTex::Metal, BlockTex::Metal, BlockTex::Metal}, - /*DirtSign*/{BlockTex::DirtSign, BlockTex::DirtSign, BlockTex::DirtSign, BlockTex::DirtSign, BlockTex::DirtSign, BlockTex::DirtSign}, - /* Lava */ {BlockTex::Lava, BlockTex::Lava, BlockTex::Lava, BlockTex::Lava, BlockTex::Lava, BlockTex::Lava}, - /* TransR */{BlockTex::TransRed, BlockTex::TransRed, BlockTex::TransRed, BlockTex::TransRed, BlockTex::TransRed, BlockTex::TransRed}, - /* TransB */{BlockTex::TransBlue, BlockTex::TransBlue, BlockTex::TransBlue, BlockTex::TransBlue, BlockTex::TransBlue, BlockTex::TransBlue}, +typedef BlockType Type; +const Blocks::TypeInfo Blocks::TypeInfos[(int)Type::LAST] = { + {Type::Air, "Air", 0, 0, 0, NON, "deconstruction.png"}, + {Type::Dirt, "Dirt", 0, 0, 0, NON, nullptr}, + {Type::Ore, "Ore", 0, 25, 0, NON, nullptr}, + {Type::Gold, "Gold", 100, 0, 0, NON, nullptr}, + {Type::Diamond, "Diamond", 1000, 25, 0, NON, nullptr}, + {Type::Rock, "Rock", 0, 0, 0, NON, nullptr}, + {Type::Ladder, "Ladder", 0, 0, 25, ANY, "ladder.png"}, + {Type::Explosive, "Explosives", 0, 0, 100, ANY, "explosive.png"}, + {Type::Jump, "Jump pad", 0, 0, 25, ANY, "jump.png"}, + {Type::Shock, "Shock Block", 0, 0, 50, ANY, "spikes.png"}, + {Type::BankRed, "Bank", 0, 0, 50, RED, "bank_red.png"}, + {Type::BankBlue, "Bank", 0, 0, 50, BLU, "bank_blue.png"}, + {Type::BeaconRed, "Beacon", 0, 0, 50, RED, "beacon.png"}, + {Type::BeaconBlue, "Beacon", 0, 0, 50, BLU, "beacon.png"}, + {Type::Road, "Road", 0, 0, 10, ANY, "road.png"}, + {Type::SolidRed, "Solid Block", 0, 0, 10, RED, "solid_red.png"}, + {Type::SolidBlue, "Solid Block", 0, 0, 10, BLU, "solid_blue.png"}, + {Type::Metal, "Metal Block", 0, 0, 0, NON, "metal.png"}, + {Type::DirtSign, "Dirt", 0, 0, 0, NON, nullptr}, + {Type::Lava, "Lava", 0, 0, 0, NON, nullptr}, + {Type::TransRed, "Force Field", 0, 0, 25, ANY, "translucent_red.png"}, + {Type::TransBlue, "Force Field", 0, 0, 25, ANY, "translucent_blue.png"} +}; + +typedef BlockTex Tex; +const Tex sideTextures[(int)Type::LAST][6] = { + /* Air */ {Tex::None, Tex::None, Tex::None, Tex::None, Tex::None, Tex::None}, + /* Dirt */ {Tex::Dirt, Tex::Dirt, Tex::Dirt, Tex::Dirt, Tex::Dirt, Tex::Dirt}, + /* Ore */ {Tex::Ore, Tex::Ore, Tex::Ore, Tex::Ore, Tex::Ore, Tex::Ore}, + /* Gold */ {Tex::Gold, Tex::Gold, Tex::Gold, Tex::Gold, Tex::Gold, Tex::Gold}, + /*Diamond*/ {Tex::Diamond, Tex::Diamond, Tex::Diamond, Tex::Diamond, Tex::Diamond, Tex::Diamond}, + /* Rock */ {Tex::Rock, Tex::Rock, Tex::Rock, Tex::Rock, Tex::Rock, Tex::Rock}, + /* Ladder */{Tex::Ladder, Tex::Ladder, Tex::LadderTop, Tex::LadderTop, Tex::Ladder, Tex::Ladder}, + /* TNT*/ {Tex::Explosive, Tex::Explosive, Tex::Explosive, Tex::Explosive, Tex::Explosive, Tex::Explosive}, + /* Jump */ {Tex::Jump, Tex::Jump, Tex::JumpTop, Tex::TeleBottom, Tex::Jump, Tex::Jump}, + /* Shock */ {Tex::TeleSideA, Tex::TeleSideA, Tex::TeleBottom, Tex::Spikes, Tex::TeleSideB, Tex::TeleSideB}, + /*BankRed*/ {Tex::BankFrontRed, Tex::BankBackRed, Tex::BankTopRed, Tex::BankTopRed, Tex::BankLeftRed, Tex::BankRightRed}, + /*BankBlue*/{Tex::BankFrontBlue, Tex::BankBackBlue, Tex::BankTopBlue, Tex::BankTopBlue, Tex::BankLeftBlue, Tex::BankRightBlue}, + /*BeaconR*/ {Tex::TeleSideA, Tex::TeleSideA, Tex::BeaconRed, Tex::LadderTop, Tex::TeleSideB, Tex::TeleSideB}, + /*BeaconB*/ {Tex::TeleSideA, Tex::TeleSideA, Tex::BeaconBlue, Tex::LadderTop, Tex::TeleSideB, Tex::TeleSideB}, + /* Road */ {Tex::Road, Tex::Road, Tex::Road, Tex::Road, Tex::Road, Tex::Road}, + /* SolidR */{Tex::SolidRed, Tex::SolidRed, Tex::SolidRed, Tex::SolidRed, Tex::SolidRed, Tex::SolidRed}, + /* SolidB */{Tex::SolidBlue, Tex::SolidBlue, Tex::SolidBlue, Tex::SolidBlue, Tex::SolidBlue, Tex::SolidBlue}, + /* Metal */ {Tex::Metal, Tex::Metal, Tex::Metal, Tex::Metal, Tex::Metal, Tex::Metal}, + /*DirtSign*/{Tex::DirtSign, Tex::DirtSign, Tex::DirtSign, Tex::DirtSign, Tex::DirtSign, Tex::DirtSign}, + /* Lava */ {Tex::Lava, Tex::Lava, Tex::Lava, Tex::Lava, Tex::Lava, Tex::Lava}, + /* TransR */{Tex::TransRed, Tex::TransRed, Tex::TransRed, Tex::TransRed, Tex::TransRed, Tex::TransRed}, + /* TransB */{Tex::TransBlue, Tex::TransBlue, Tex::TransBlue, Tex::TransBlue, Tex::TransBlue, Tex::TransBlue}, }; bool Blocks::isTransparent(BlockType t) { @@ -50,123 +83,55 @@ bool Blocks::isFaceVisible(BlockType t, BlockType other) { bool Blocks::canGoThrough(BlockType t, Player::Team team) { if (t == BlockType::Air) return true; - if (t != BlockType::TransRed && t != BlockType::TransBlue) - return false; return (t == BlockType::TransRed && team == Player::Team::Red) || (t == BlockType::TransBlue && team == Player::Team::Blue); } -int32 blend(int32 c1, int32 c2, uint8 val) { - uint ival = 256 - val; - uint v1_1 = c1 & 0xFF00FF; - uint v1_2 = c1 & 0x00FF00; - uint v2_1 = c2 & 0xFF00FF; - uint v2_2 = c2 & 0x00FF00; - uint res = - ( ( ( ( v1_1 * ival ) + ( v2_1 * val ) ) >> 8 ) & 0xFF00FF ) | - ( ( ( ( v1_2 * ival ) + ( v2_2 * val ) ) >> 8 ) & 0x00FF00 ); - return res; -} - -int lerp(int a, int b, float x) { - return a*(1-x) + b*x; -} -void makePerlin(int w, int h, uint8 *buf) { - uint8 noise[(h/4)*(w/4)]; - for (int i=0; i < (h/4)*(w/4); i++) - noise[i] = FastRand(255); - for (int x=0; x < w; x++) { - for (int y=0; y < h; y++) { - int target = (x/4) + (y/4)*(w/4); - buf[x+y*h] = sqrt(lerp(noise[target], noise[target+1], x%4/4.f) * - lerp(noise[target], noise[target+(w/4)], y%4/4.f)); - } - } -} - -#define AddTex(x, y) m_coords[(int)x] = m_atlasCreator->add(getAssetPath("blocks", y)) -#define AddTexP(i, x, y, z, d) m_coords[(int)i] = m_atlasCreator->add(x, y, z, d) +#define AddTex(b, t) m_coords[(int)b] = m_atlasCreator->add(getAssetPath("blocks", t)); Blocks::Blocks() : m_atlas(nullptr) { - m_atlasCreator = new AtlasCreator(64*8, 64*8); //64*((int)BlockTex::LAST/8)); - m_coords = new AtlasCreator::Coord[BlockTex::LAST]; - - if (GlobalProperties::UseProceduralTextures) { - uint8 *data = new uint8[64*64*4]; - uint8 *perlin = new uint8[64*64*4]; - makePerlin(64, 64, perlin); - for (int x=0; x < 64; x++) { - for (int y=0; y < 64; y++) { - int32 noise; // = blend(0x292018, 0xBF9860, FastRand(0, 255)); - if (x == 0 || x == 63 || y == 0 || y == 63) { - noise = 0x1B120B; - } else { - /*switch (FastRand(0, 4)) { - case 0: noise = 0x292018; break; - case 1: noise = 0x593F28; break; - case 2: noise = 0x87633E; break; - case 3: noise = 0xBF9860; break; - }*/ - /*if (perlin[x+y*64] < 64) - noise = 0x292018; - else if (perlin[x+y*64] < 128) - noise = 0x593F28; - else if (perlin[x+y*64] < 192) - noise = 0x87633E; - else - noise = 0xBF9860;*/ - noise = ((int)perlin[x+y*64] << 16) + ((int)perlin[x+y*64] << 8) + (int)perlin[x+y*64]; - } - data[0 + x*4 + y*64*4] = noise >> 16 & 0xFF; - data[1 + x*4 + y*64*4] = noise >> 8 & 0xFF; - data[2 + x*4 + y*64*4] = noise & 0xFF; - data[3 + x*4 + y*64*4] = 255; - } - } - AddTexP(BlockTex::Dirt, 64, 64, 4, data); - delete[] data; - delete[] perlin; - } else { - AddTex(BlockTex::Dirt, "tex_block_dirt.png");} - AddTex(BlockTex::DirtSign, "tex_block_dirt_sign.png"); - AddTex(BlockTex::Rock, "tex_block_rock.png"); - AddTex(BlockTex::Ore, "tex_block_ore.png"); - AddTex(BlockTex::Gold, "tex_block_silver.png"); - AddTex(BlockTex::Diamond, "tex_block_diamond.png"); - AddTex(BlockTex::HomeRed, "tex_block_home_red.png"); - AddTex(BlockTex::HomeBlue, "tex_block_home_blue.png"); - AddTex(BlockTex::SolidRed, "tex_block_red.png"); - AddTex(BlockTex::SolidBlue, "tex_block_blue.png"); - AddTex(BlockTex::Ladder, "tex_block_ladder.png"); - AddTex(BlockTex::LadderTop, "tex_block_ladder_top.png"); - AddTex(BlockTex::Spikes, "tex_block_spikes.png"); - AddTex(BlockTex::Jump, "tex_block_jump.png"); - AddTex(BlockTex::JumpTop, "tex_block_jump_top.png"); - AddTex(BlockTex::Explosive, "tex_block_explosive.png"); - AddTex(BlockTex::Metal, "tex_block_metal.png"); - AddTex(BlockTex::BankTopRed, "tex_block_bank_top_red.png"); - AddTex(BlockTex::BankLeftRed, "tex_block_bank_left_red.png"); - AddTex(BlockTex::BankFrontRed, "tex_block_bank_front_red.png"); - AddTex(BlockTex::BankRightRed, "tex_block_bank_right_red.png"); - AddTex(BlockTex::BankBackRed, "tex_block_bank_back_red.png"); - AddTex(BlockTex::BankTopBlue, "tex_block_bank_top_blue.png"); - AddTex(BlockTex::BankLeftBlue, "tex_block_bank_left_blue.png"); - AddTex(BlockTex::BankFrontBlue, "tex_block_bank_front_blue.png"); - AddTex(BlockTex::BankRightBlue, "tex_block_bank_right_blue.png"); - AddTex(BlockTex::BankBackBlue, "tex_block_bank_back_blue.png"); - AddTex(BlockTex::TeleSideA, "tex_block_teleporter_a.png"); - AddTex(BlockTex::TeleSideB, "tex_block_teleporter_b.png"); - AddTex(BlockTex::TeleTop, "tex_block_teleporter_top.png"); - AddTex(BlockTex::TeleBottom, "tex_block_teleporter_bottom.png"); - AddTex(BlockTex::Lava, "tex_block_lava.png"); - AddTex(BlockTex::Road, "tex_block_road_orig.png"); - AddTex(BlockTex::RoadTop, "tex_block_road_top.png"); - AddTex(BlockTex::RoadBottom, "tex_block_road_bottom.png"); - AddTex(BlockTex::BeaconRed, "tex_block_beacon_top_red.png"); - AddTex(BlockTex::BeaconBlue, "tex_block_beacon_top_blue.png"); - AddTex(BlockTex::TransRed, "tex_block_trans_red.png"); - AddTex(BlockTex::TransBlue, "tex_block_trans_blue.png"); - - + m_atlasCreator = new AtlasCreator(64*8, 64*8); //64*((int)Tex::LAST/8)); + m_coords = new AtlasCreator::Coord[Tex::LAST]; + + AddTex(Tex::Dirt, "tex_block_dirt.png"); + AddTex(Tex::DirtSign, "tex_block_dirt_sign.png"); + AddTex(Tex::Rock, "tex_block_rock.png"); + AddTex(Tex::Ore, "tex_block_ore.png"); + AddTex(Tex::Gold, "tex_block_silver.png"); + AddTex(Tex::Diamond, "tex_block_diamond.png"); + AddTex(Tex::HomeRed, "tex_block_home_red.png"); + AddTex(Tex::HomeBlue, "tex_block_home_blue.png"); + AddTex(Tex::SolidRed, "tex_block_red.png"); + AddTex(Tex::SolidBlue, "tex_block_blue.png"); + AddTex(Tex::Ladder, "tex_block_ladder.png"); + AddTex(Tex::LadderTop, "tex_block_ladder_top.png"); + AddTex(Tex::Spikes, "tex_block_spikes.png"); + AddTex(Tex::Jump, "tex_block_jump.png"); + AddTex(Tex::JumpTop, "tex_block_jump_top.png"); + AddTex(Tex::Explosive, "tex_block_explosive.png"); + AddTex(Tex::Metal, "tex_block_metal.png"); + AddTex(Tex::BankTopRed, "tex_block_bank_top_red.png"); + AddTex(Tex::BankLeftRed, "tex_block_bank_left_red.png"); + AddTex(Tex::BankFrontRed, "tex_block_bank_front_red.png"); + AddTex(Tex::BankRightRed, "tex_block_bank_right_red.png"); + AddTex(Tex::BankBackRed, "tex_block_bank_back_red.png"); + AddTex(Tex::BankTopBlue, "tex_block_bank_top_blue.png"); + AddTex(Tex::BankLeftBlue, "tex_block_bank_left_blue.png"); + AddTex(Tex::BankFrontBlue, "tex_block_bank_front_blue.png"); + AddTex(Tex::BankRightBlue, "tex_block_bank_right_blue.png"); + AddTex(Tex::BankBackBlue, "tex_block_bank_back_blue.png"); + AddTex(Tex::TeleSideA, "tex_block_teleporter_a.png"); + AddTex(Tex::TeleSideB, "tex_block_teleporter_b.png"); + AddTex(Tex::TeleTop, "tex_block_teleporter_top.png"); + AddTex(Tex::TeleBottom, "tex_block_teleporter_bottom.png"); + AddTex(Tex::Lava, "tex_block_lava.png"); + AddTex(Tex::Road, "tex_block_road_orig.png"); + AddTex(Tex::RoadTop, "tex_block_road_top.png"); + AddTex(Tex::RoadBottom, "tex_block_road_bottom.png"); + AddTex(Tex::BeaconRed, "tex_block_beacon_top_red.png"); + AddTex(Tex::BeaconBlue, "tex_block_beacon_top_blue.png"); + AddTex(Tex::TransRed, "tex_block_trans_red.png"); + AddTex(Tex::TransBlue, "tex_block_trans_blue.png"); + m_atlas = m_atlasCreator->getAtlas(); delete m_atlasCreator; } diff --git a/Blocks.hpp b/Blocks.hpp index 1ab6375..c3897fd 100644 --- a/Blocks.hpp +++ b/Blocks.hpp @@ -9,8 +9,8 @@ namespace Diggler { enum class BlockType : uint8_t { Air = 0, Dirt = 1, - Ore = 2, - Gold = 3, + Ore, + Gold, Diamond, Rock, Ladder, @@ -43,9 +43,9 @@ enum class FaceDirection : uint8_t { enum class BlockTex : uint8_t { None = 0, - Dirt = 1, - Ore = 2, - Gold = 3, + Dirt, + Ore, + Gold, Diamond, Rock, Jump, @@ -100,6 +100,16 @@ private: Blocks& operator=(const Blocks&) = delete; public: + constexpr static int TeamRed = 0x1, + TeamBlue = 0x2; + const static struct TypeInfo { + BlockType type; + const char *name; + int cashWorth, oreWorth, buildCost; + int teamCanBuild; + const char *icon; + } TypeInfos[(int)BlockType::LAST]; + Blocks(); ~Blocks(); static bool isTransparent(BlockType t); diff --git a/CaveGenerator.cpp b/CaveGenerator.cpp index 8c817d8..572c303 100644 --- a/CaveGenerator.cpp +++ b/CaveGenerator.cpp @@ -168,8 +168,7 @@ static void AddOre(Superchunk &sc, const CaveGenerator::GenConf &gc) { for (int y = 0; y < ys; y++) for (int z = 0; z < zs; z++) { float noise = stb_perlin_noise3(x/8.f, y/8.f+yRand, z/8.f); - if (sc.get(x, y, z) == BlockType::Dirt && noise > gc.ore.thresold) - sc.set(x, y, z, BlockType::Ore); + sc.set(x, y, z, (noise > gc.ore.thresold) ? BlockType::Ore : BlockType::Dirt); } } @@ -184,7 +183,7 @@ static void AddDiamond(Superchunk &sc, const CaveGenerator::GenConf &gc) { int z = FastRand(0, zs); int y = FastRandF()*(maxY-minY)+minY; - if (y > 2 && sc.get(x, y, z) == BlockType::Dirt) { + if (y > 2 && (sc.get(x, y, z) == BlockType::Dirt || sc.get(x, y, z) == BlockType::Ore)) { sc.set(x, y, z, BlockType::Diamond); numDiam--; } @@ -202,7 +201,7 @@ static void AddGold(Superchunk &sc, const CaveGenerator::GenConf &gc) { int z = FastRand(0, zs); int y = FastRandF()*(maxY-minY)+minY; - if (y > 2 && sc.get(x, y, z) == BlockType::Dirt) { + if (y > 2 && (sc.get(x, y, z) == BlockType::Dirt || sc.get(x, y, z) == BlockType::Ore)) { WalkL(sc, x, y, z, FastRand(gc.gold.minSize, gc.gold.maxSize), 1, BlockType::Gold, false, true); numVeins--; } @@ -214,10 +213,15 @@ void CaveGenerator::Generate(Superchunk &sc, const GenConf &gc) { int groundLevel = ys*gc.groundLevel; FastRandSeed(gc.seed); - for (int x = 0; x < xs; x++) - for (int y = 0; y < groundLevel; y++) - for (int z = 0; z < zs; z++) - sc.set(x, y, z, BlockType::Dirt); + if (gc.ore.enabled) + AddOre(sc, gc); + else + for (int x = 0; x < xs; x++) + for (int y = 0; y < groundLevel; y++) + for (int z = 0; z < zs; z++) + sc.set(x, y, z, BlockType::Dirt); + + // Mountains int yRand = FastRand(0xFFFF); for (int y = groundLevel; y < ys; y++) { float intensity = (groundLevel-y)/(float)(ys-groundLevel)+1; @@ -241,8 +245,6 @@ void CaveGenerator::Generate(Superchunk &sc, const GenConf &gc) { AddDiamond(sc, gc); if (gc.gold.enabled) AddGold(sc, gc); - if (gc.ore.enabled) - AddOre(sc, gc); } } \ No newline at end of file diff --git a/Chunk.cpp b/Chunk.cpp index df92c02..9dfbc9d 100644 --- a/Chunk.cpp +++ b/Chunk.cpp @@ -18,7 +18,6 @@ namespace Diggler { Chunk::Renderer Chunk::R = {0}; Texture *Chunk::TextureAtlas = nullptr; -Blocks *Chunk::BlkInf = nullptr; struct GLCoord { uint8 x, y, z, w; @@ -29,26 +28,25 @@ struct GLCoord { constexpr float Chunk::CullSphereRadius; constexpr float Chunk::MidX, Chunk::MidY, Chunk::MidZ; -Chunk::Chunk(int scx, int scy, int scz, Game *G) : blk2(nullptr), +Chunk::Chunk(int scx, int scy, int scz, Game *G) : blk2(nullptr), blk(nullptr), scx(scx), scy(scy), scz(scz), G(G), vbo(nullptr), lavaCount(0) { dirty = true; blk = new BlockType[CX*CY*CZ]; - for (int i=0; i < CX*CY*CZ; ++i) - blk[i] = BlockType::Air; + memset(blk, (int)BlockType::Air, CX*CY*CZ*sizeof(BlockType)); + //for (int i=0; i < CX*CY*CZ; ++i) + // blk[i] = BlockType::Air; if (GlobalProperties::IsClient) { vbo = new VBO; ibo = new VBO; if (R.prog == nullptr) { loadShader(); - - BlkInf = new Blocks(); - - TextureAtlas = BlkInf->getAtlas(); + TextureAtlas = G->B->getAtlas(); } } if (GlobalProperties::IsServer) { blk2 = new BlockType[CX*CY*CZ]; + memset(blk, (int)BlockType::Air, CX*CY*CZ*sizeof(BlockType)); } } @@ -166,6 +164,7 @@ void Chunk::updateServerSwap() { struct RGB { float r, g, b; }; void Chunk::updateClient() { mut.lock(); + Blocks &B = *G->B; GLCoord vertex[CX * CY * CZ * 6 /* faces */ * 4 /* vertices */ / 2 /* face removing (HSR) makes a lower vert max */]; GLushort index[CX * CY * CZ * 6 /* faces */ * 4 /* indices */ / 2 /* HSR */]; int v = 0, i = 0; @@ -227,8 +226,8 @@ void Chunk::updateClient() { if ((mayDisp && bn == BlockType::Lava && get(x-1, y+1, z) != BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; - tc = BlkInf->gTC(bt, FaceDirection::XDec); + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; + tc = B.gTC(bt, FaceDirection::XDec); vertex[v++] = {x, y, z, 0, tc->x, tc->v, .6f, .6f, .6f}; vertex[v++] = {x, y, z + 1, 0, tc->u, tc->v, .6f, .6f, .6f}; vertex[v++] = {x, y + 1, z, w, tc->x, tc->y, .6f, .6f, .6f}; @@ -240,8 +239,8 @@ void Chunk::updateClient() { if ((mayDisp && bn == BlockType::Lava && get(x+1, y+1, z) != BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; - tc = BlkInf->gTC(bt, FaceDirection::XInc); + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; + tc = B.gTC(bt, FaceDirection::XInc); vertex[v++] = {x + 1, y, z, 0, tc->u, tc->v, .6f, .6f, .6f}; vertex[v++] = {x + 1, y + 1, z, w, tc->u, tc->y, .6f, .6f, .6f}; vertex[v++] = {x + 1, y, z + 1, 0, tc->x, tc->v, .6f, .6f, .6f}; @@ -253,13 +252,13 @@ void Chunk::updateClient() { if ((hasWaves && bn == BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; float shade = (blk[I(x,y,z)] == BlockType::Shock) ? 1.5f : .2f;; - tc = BlkInf->gTC(bt, FaceDirection::YDec); - vertex[v++] = {x, y, z, 0, tc->x, tc->v, shade, shade, shade}; - vertex[v++] = {x + 1, y, z, 0, tc->u, tc->v, shade, shade, shade}; - vertex[v++] = {x, y, z + 1, 0, tc->x, tc->y, shade, shade, shade}; - vertex[v++] = {x + 1, y, z + 1, 0, tc->u, tc->y, shade, shade, shade}; + tc = B.gTC(bt, FaceDirection::YDec); + vertex[v++] = {x, y, z, 0, tc->u, tc->v, shade, shade, shade}; + vertex[v++] = {x + 1, y, z, 0, tc->u, tc->y, shade, shade, shade}; + vertex[v++] = {x, y, z + 1, 0, tc->x, tc->v, shade, shade, shade}; + vertex[v++] = {x + 1, y, z + 1, 0, tc->x, tc->y, shade, shade, shade}; } // Positive Y @@ -267,12 +266,12 @@ void Chunk::updateClient() { if ((hasWaves && bt == BlockType::Lava && bu != BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; - tc = BlkInf->gTC(bt, FaceDirection::YInc); - vertex[v++] = {x, y + 1, z, w, tc->u, tc->v, .8f, .8f, .8f}; - vertex[v++] = {x, y + 1, z + 1, w, tc->u, tc->y, .8f, .8f, .8f}; - vertex[v++] = {x + 1, y + 1, z, w, tc->x, tc->v, .8f, .8f, .8f}; - vertex[v++] = {x + 1, y + 1, z + 1, w, tc->x, tc->y, .8f, .8f, .8f}; + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; + tc = B.gTC(bt, FaceDirection::YInc); + vertex[v++] = {x, y + 1, z, w, tc->x, tc->v, .8f, .8f, .8f}; + vertex[v++] = {x, y + 1, z + 1, w, tc->u, tc->v, .8f, .8f, .8f}; + vertex[v++] = {x + 1, y + 1, z, w, tc->x, tc->y, .8f, .8f, .8f}; + vertex[v++] = {x + 1, y + 1, z + 1, w, tc->u, tc->y, .8f, .8f, .8f}; } // Negative Z @@ -280,8 +279,8 @@ void Chunk::updateClient() { if ((mayDisp && bn == BlockType::Lava && get(x, y+1, z-1) != BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; - tc = BlkInf->gTC(bt, FaceDirection::ZDec); + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; + tc = B.gTC(bt, FaceDirection::ZDec); vertex[v++] = {x, y, z, 0, tc->u, tc->v, .4f, .4f, .4f}; vertex[v++] = {x, y + 1, z, w, tc->u, tc->y, .4f, .4f, .4f}; vertex[v++] = {x + 1, y, z, 0, tc->x, tc->v, .4f, .4f, .4f}; @@ -293,8 +292,8 @@ void Chunk::updateClient() { if ((mayDisp && bn == BlockType::Lava && get(x, y+1, z+1) != BlockType::Lava) || Blocks::isFaceVisible(bt, bn)) { index[i++] = v; index[i++] = v+1; index[i++] = v+2; - index[i++] = v+3; index[i++] = v+2; index[i++] = v+1; - tc = BlkInf->gTC(bt, FaceDirection::ZInc); + index[i++] = v+2; index[i++] = v+1; index[i++] = v+3; + tc = B.gTC(bt, FaceDirection::ZInc); vertex[v++] = {x, y, z + 1, 0, tc->x, tc->v, .4f, .4f, .4f}; vertex[v++] = {x + 1, y, z + 1, 0, tc->u, tc->v, .4f, .4f, .4f}; vertex[v++] = {x, y + 1, z + 1, w, tc->x, tc->y, .4f, .4f, .4f}; diff --git a/Chunk.hpp b/Chunk.hpp index 8899ca1..fe93c22 100644 --- a/Chunk.hpp +++ b/Chunk.hpp @@ -44,7 +44,6 @@ public: uni_time; } R; static Texture *TextureAtlas; - static Blocks *BlkInf; BlockType *blk; int scx, scy, scz; Game *G; diff --git a/Font.cpp b/Font.cpp index 65e6ea7..117f461 100644 --- a/Font.cpp +++ b/Font.cpp @@ -10,11 +10,8 @@ namespace Diggler { -const Program *Font::RenderProgram = nullptr; -GLint Font::RenderProgram_uni_mvp = -1; -GLint Font::RenderProgram_att_coord = -1; -GLint Font::RenderProgram_att_texcoord = -1; -GLint Font::RenderProgram_att_color = -1; +Font::Renderer Font::R = {0}; + static const struct { float r, g, b; } ColorTable[16] = { {1.0f, 1.0f, 1.0f}, {0.66f, 0.66f, 0.66f}, @@ -35,12 +32,12 @@ static const struct { float r, g, b; } ColorTable[16] = { }; Font::Font(Game *G, const std::string& path) : G(G) { - if (!RenderProgram) { - RenderProgram = G->PM->getProgram(PM_2D | PM_TEXTURED | PM_COLORED); - RenderProgram_att_coord = RenderProgram->att("coord"); - RenderProgram_att_texcoord = RenderProgram->att("texcoord"); - RenderProgram_att_color = RenderProgram->att("color"); - RenderProgram_uni_mvp = RenderProgram->uni("mvp"); + if (!R.prog) { + R.prog = G->PM->getProgram(PM_2D | PM_TEXTURED | PM_COLORED); + R.att_coord = R.prog->att("coord"); + R.att_texcoord = R.prog->att("texcoord"); + R.att_color = R.prog->att("color"); + R.uni_mvp = R.prog->uni("mvp"); } m_texture = new Texture(path, Texture::PixelFormat::RGBA); std::ifstream source(path + ".fdf", std::ios_base::binary); @@ -68,7 +65,7 @@ struct Vertex { int x, y; float tx, ty; float r, g, b ,a; }; #define eraseCurChar() elements -= 6; -int Font::updateVBO(VBO &vbo, const std::string &text) const { +int Font::updateVBO(VBO &vbo, const std::string &text, GLenum usage) const { int elements = text.size()*6; Vertex *verts = new Vertex[elements]; uint8 c, w; int line = 0, cx = 0, v = 0; float l, r; @@ -116,28 +113,28 @@ int Font::updateVBO(VBO &vbo, const std::string &text) const { v += 6; cx += w; } - vbo.setData(verts, elements, GL_STATIC_DRAW); + vbo.setData(verts, elements, usage); delete[] verts; return elements; } -void Font::draw(const Diggler::VBO &vbo, int count, const glm::mat4& matrix) const { - glEnableVertexAttribArray(RenderProgram_att_coord); - glEnableVertexAttribArray(RenderProgram_att_texcoord); - glEnableVertexAttribArray(RenderProgram_att_color); - - RenderProgram->bind(); +void Font::draw(const VBO &vbo, int count, const glm::mat4& matrix) const { + glEnableVertexAttribArray(R.att_coord); + glEnableVertexAttribArray(R.att_texcoord); + glEnableVertexAttribArray(R.att_color); + + R.prog->bind(); m_texture->bind(); vbo.bind(); - glUniformMatrix4fv(RenderProgram_uni_mvp, 1, GL_FALSE, glm::value_ptr(matrix)); - glVertexAttribPointer(RenderProgram_att_coord, 2, GL_INT, GL_FALSE, sizeof(Vertex), 0); - glVertexAttribPointer(RenderProgram_att_texcoord, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, tx)); - glVertexAttribPointer(RenderProgram_att_color, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, r)); + glUniformMatrix4fv(R.uni_mvp, 1, GL_FALSE, glm::value_ptr(matrix)); + glVertexAttribPointer(R.att_coord, 2, GL_INT, GL_FALSE, sizeof(Vertex), 0); + glVertexAttribPointer(R.att_texcoord, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, tx)); + glVertexAttribPointer(R.att_color, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, r)); glDrawArrays(GL_TRIANGLES, 0, count); - - glDisableVertexAttribArray(RenderProgram_att_color); - glDisableVertexAttribArray(RenderProgram_att_texcoord); - glDisableVertexAttribArray(RenderProgram_att_coord); + + glDisableVertexAttribArray(R.att_color); + glDisableVertexAttribArray(R.att_texcoord); + glDisableVertexAttribArray(R.att_coord); } Font::Size Font::getSize(const std::string &text) const { diff --git a/Font.hpp b/Font.hpp index e2f3e99..9c016d3 100644 --- a/Font.hpp +++ b/Font.hpp @@ -22,8 +22,13 @@ private: float left, right; } *texPos; uint8 height; - static Program const *RenderProgram; - static GLint RenderProgram_uni_mvp, RenderProgram_att_coord, RenderProgram_att_texcoord, RenderProgram_att_color; + static struct Renderer { + const Program *prog; + GLint att_coord, + att_texcoord, + att_color, + uni_mvp; + } R; Game *G; Font(const Font &other) = delete; @@ -36,7 +41,7 @@ public: /// Updates the text VBO /// @returns the number of elements in the VBO - int updateVBO(VBO &vbo, const std::string &text) const; + int updateVBO(VBO &vbo, const std::string &text, GLenum usage = GL_STATIC_DRAW) const; void draw(const Diggler::VBO &vbo, int count, const glm::mat4& matrix) const; Size getSize(const std::string &text) const; int getHeight() const; diff --git a/Game.cpp b/Game.cpp index 2da29c3..278b4ca 100644 --- a/Game.cpp +++ b/Game.cpp @@ -12,6 +12,7 @@ Game::Game() : players(this), CCH(nullptr), GW(nullptr), LP(nullptr), PM(nullptr void Game::init() { if (GlobalProperties::IsClient) { + B = new Blocks; PM = new ProgramManager(*this); LP = new LocalPlayer(this); RP = new RenderProperties; { // TODO move somewhere else? @@ -30,6 +31,7 @@ void Game::init() { Game::~Game() { if (GlobalProperties::IsClient) { + delete B; delete PM; delete LP; delete RP; delete A; delete KB; diff --git a/Game.hpp b/Game.hpp index 996a970..5542102 100644 --- a/Game.hpp +++ b/Game.hpp @@ -27,6 +27,7 @@ public: class ChunkChangeHelper *CCH; // Client + Blocks *B; class Config *C; class GameWindow *GW; UI::Manager *UIM; diff --git a/GameState.cpp b/GameState.cpp index c787a21..8f0fad1 100644 --- a/GameState.cpp +++ b/GameState.cpp @@ -138,17 +138,30 @@ GameState::Bloom::~Bloom() { GameState::BuilderGun::BuilderGun() { tex = new Texture(getAssetPath("tools", "tex_tool_build.png"), Texture::PixelFormat::RGBA); - blockTexs.emplace(BlockType::Metal, new Texture(getAssetPath("icons", "tex_icon_metal.png"))); - currentBlock = BlockType::Metal; - currentBlockTex = blockTexs.at(BlockType::Metal); - index = 0; - deconstruct = false; + for (uint i=0; i < sizeof(Blocks::TypeInfos)/sizeof(*Blocks::TypeInfos); ++i) { + const Blocks::TypeInfo &inf = Blocks::TypeInfos[i]; + // TODO change to player's team + if (inf.teamCanBuild & Blocks::TeamRed) { + blockTexs.emplace_back(inf.type, new Texture(getAssetPath("icons", inf.icon), Texture::PixelFormat::RGB)); + } + } + select(1); } GameState::BuilderGun::~BuilderGun() { delete tex; - for (auto it : blockTexs) - delete it.second; + for (auto tuple : blockTexs) + delete std::get<1>(tuple); +} + +void GameState::BuilderGun::select(int idx) { + int max = blockTexs.size(); + if (idx < 0) + idx = max-1; + index = idx % max; + auto tuple = blockTexs.at(index); + currentBlock = std::get<0>(tuple); + currentBlockTex = std::get<1>(tuple); } void GameState::setupUI() { @@ -300,7 +313,7 @@ void GameState::onMouseButton(int key, int action, int mods) { msg.writeU16(face.x); msg.writeU16(face.y); msg.writeU16(face.z); - msg.writeU8((uint8)BlockType::Dirt); + msg.writeU8((uint8)m_builderGun.currentBlock); } sendMsg(msg, Net::Tfer::Rel, Net::Channels::MapUpdate); } @@ -341,7 +354,10 @@ void GameState::onResize(int w, int h) { } void GameState::onMouseScroll(double x, double y) { - + if (y < 0) + m_builderGun.select(m_builderGun.index-1); + if (y > 0) + m_builderGun.select(m_builderGun.index+1); } void GameState::updateViewport() { @@ -355,9 +371,21 @@ void GameState::updateViewport() { bloom.renderer.fbo->resize(w/bloom.scale, h/bloom.scale); //bloom.renderer.fb->tex->setFiltering(Texture::Filter::Linear, Texture::Filter::Linear); - m_crossHair.mat = glm::scale(glm::translate(*UIM.PM, - glm::vec3(w/2-5, h/2-5, 0)), - glm::vec3(5*UIM.Scale, 5*UIM.Scale, 0)); + { int tw = 5*UIM.Scale, th = 5*UIM.Scale; + m_crossHair.mat = glm::scale(glm::translate(*UIM.PM, + glm::vec3((w-tw)/2, (h-th)/2, 0)), + glm::vec3(tw, tw, 0)); + } + + { int scale = 3, tw = 120*scale, th = 126*scale; + m_builderGun.matGun = glm::scale(glm::translate(*UIM.PM, + glm::vec3((w-tw)/2, -46*scale, 0)), + glm::vec3(tw, th, 0)); + int iw = 39*scale, ih = 21*scale; + m_builderGun.matIcon = glm::scale(glm::translate(*UIM.PM, + glm::vec3((w-iw)/2-3*scale, 9*scale, 0)), + glm::vec3(iw, ih, 0)); + } int lineHeight = G->F->getHeight()*UIM.Scale; char str[15]; std::snprintf(str, 15, "Loot: %d/%d", G->LP->ore, Player::getMaxOre(G->LP->playerclass)); @@ -386,7 +414,7 @@ void GameState::updateViewport() { UI.headerBg.mat = glm::scale(glm::translate(*UIM.PM, glm::vec3(0, h-lineHeight, 0)), - glm::vec3(2*w, lineHeight, 0)); + glm::vec3(w, lineHeight, 0)); UI.DebugInfo->setPos(0, h-(lineHeight+UI.DebugInfo->getSize().y)); @@ -502,13 +530,13 @@ void GameState::gameLoop() { LP->forceCameraUpdate(); G->A->update(); LP->setHasNoclip(true); - while (!glfwWindowShouldClose(*W)) { + while (!W->shouldClose()) { if (!processNetwork()) return; T = glfwGetTime(); deltaT = T - lastT; G->Time = T; if (T > fpsT) { - char str[8]; std::sprintf(str, "FPS: %d", frames); //\f + char str[10]; std::sprintf(str, "FPS: %d", frames); UI.FPS->setText(std::string(str)); fpsT = T+1; frames = 0; @@ -527,16 +555,15 @@ void GameState::gameLoop() { glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_3dFbo->bind(); - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + if (bloom.enable) { + m_3dFbo->bind(); + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } LP->update(deltaT); - // TODO: disable teleport and kill player if (LP->position.y < -32) { LP->setDead(true, Player::DeathReason::Void, true); - // TODO: remove, TP player - LP->position.y = 10; } glm::mat4 m_transform = LP->getPVMatrix(); @@ -564,28 +591,27 @@ void GameState::gameLoop() { m_highlightBox.vbo.bind(); glVertexAttribPointer(m_highlightBox.att_coord, 3, GL_FLOAT, GL_FALSE, 0, 0); - glUniform4f(m_highlightBox.uni_unicolor, 1.f, 0.f, 0.f, .3f); + glUniform4f(m_highlightBox.uni_unicolor, 1.f, 1.f, 1.f, .1f); glUniformMatrix4fv(m_highlightBox.uni_mvp, 1, GL_FALSE, glm::value_ptr( - glm::scale(glm::translate(m_transform, glm::vec3(pointed)+glm::vec3(.5f)), glm::vec3(0.5*1.1)))); + glm::scale(glm::translate(m_transform, glm::vec3(pointed)+glm::vec3(.5f)), glm::vec3(0.5f*1.03f)))); glDrawArrays(GL_TRIANGLES, 0, 6*2*3); - glUniform4f(m_highlightBox.uni_unicolor, 0.f, 0.f, 1.f, .2f); + /*glUniform4f(m_highlightBox.uni_unicolor, 0.f, 0.f, 1.f, .2f); glUniformMatrix4fv(m_highlightBox.uni_mvp, 1, GL_FALSE, glm::value_ptr( glm::scale(glm::translate(m_transform, glm::vec3(face)+glm::vec3(.5f)), glm::vec3(0.40f+ sin(G->Time*4)*0.01f )))); - glDrawArrays(GL_TRIANGLES, 0, 6*2*3); + glDrawArrays(GL_TRIANGLES, 0, 6*2*3);*/ glDisableVertexAttribArray(m_highlightBox.att_coord); } glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - - m_3dFbo->unbind(); - G->UIM->drawFullTexV(*m_3dFbo->tex); - //G->UIM->drawFullRect(glm::vec4(1.f, 0.f, 0.f, 1-G->LP->health)); + LP->render(m_transform); if (bloom.enable) { + m_3dFbo->unbind(); + G->UIM->drawFullTexV(*m_3dFbo->tex); + m_3dFbo->tex->setFiltering(Texture::Filter::Linear, Texture::Filter::Linear); bloom.extractor.fbo->bind(); glViewport(0, 0, W->getW()/bloom.scale, W->getH()/bloom.scale); @@ -640,6 +666,7 @@ void GameState::gameLoop() { } /*** 2D PART ***/ + G->UIM->drawFullRect(glm::vec4(1.f, 0.f, 0.f, 1-G->LP->health)); updateUI(); drawUI(); } else { @@ -684,6 +711,16 @@ void GameState::updateUI() { UI.Altitude->setText(std::string(str)); } if (showDebugInfo) { + int verts = 0; + const static glm::vec3 cShift(Chunk::MidX, Chunk::MidY, Chunk::MidZ); + for (int x = 0; x < G->SC->getChunksX(); x++) + for (int y = 0; y < G->SC->getChunksY(); y++) + for (int z = 0; z < G->SC->getChunksZ(); z++) + if (G->SC->getChunk(x, y, z)) + if (G->LP->camera.frustum.sphereInFrustum(glm::vec3(x * CX, y * CY, z * CZ) + cShift, Chunk::CullSphereRadius)) { + verts += G->SC->getChunk(x, y, z)->vertices; + } + verts /= 3; std::ostringstream oss; oss << std::setprecision(3) << "HP: " << LP.health << std::endl << @@ -691,7 +728,8 @@ void GameState::updateUI() { "y: " << LP.position.y << std::endl << "z: " << LP.position.z << std::endl << "vy: " << LP.velocity.y << std::endl << - "rx: " << LP.angle << std::endl; + "rx: " << LP.angle << std::endl << + "chunk tris: " << verts; UI.DebugInfo->setText(oss.str()); } } @@ -703,8 +741,8 @@ void GameState::drawUI() { G->UIM->drawTex(m_crossHair.mat, *m_crossHair.tex); // TODO render weapon - //G->UIM->drawTexRect(UI::Element::Area {20, -20*3, 120*3, 126*3}, *m_builderGun.tex); - //G->UIM->drawTexRect(UI::Element::Area {20+37*3, 35*3, 117, 63}, *m_builderGun.currentBlockTex); + G->UIM->drawTex(m_builderGun.matGun, *m_builderGun.tex); + G->UIM->drawTex(m_builderGun.matIcon, *m_builderGun.currentBlockTex); } bool GameState::processNetwork() { diff --git a/GameState.hpp b/GameState.hpp index a7688a8..a60a435 100644 --- a/GameState.hpp +++ b/GameState.hpp @@ -73,14 +73,15 @@ private: } m_highlightBox; struct BuilderGun { + glm::mat4 matGun, matIcon; Texture *tex; - std::map blockTexs; + std::vector> blockTexs; int index; - bool deconstruct; BlockType currentBlock; Texture *currentBlockTex; BuilderGun(); ~BuilderGun(); + void select(int idx); } m_builderGun; KeyBindings *m_keybinds; diff --git a/GameWindow.cpp b/GameWindow.cpp index f86c74c..8d09cb0 100644 --- a/GameWindow.cpp +++ b/GameWindow.cpp @@ -111,6 +111,10 @@ GameWindow::~GameWindow() { } } +bool GameWindow::shouldClose() const { + return glfwWindowShouldClose(m_window); +} + void GameWindow::cbChar(char32 unichar) { m_currentState->onChar(unichar); } diff --git a/GameWindow.hpp b/GameWindow.hpp index eab17c9..9082838 100644 --- a/GameWindow.hpp +++ b/GameWindow.hpp @@ -38,6 +38,7 @@ public: inline int getW() const { return m_w; } inline int getH() const { return m_h; } + bool shouldClose() const; void cbMouseButton(int key, int action, int mods); void cbCursorPos(double x, double y); diff --git a/GlobalProperties.cpp b/GlobalProperties.cpp index 587173b..f3b11cb 100644 --- a/GlobalProperties.cpp +++ b/GlobalProperties.cpp @@ -11,8 +11,6 @@ const int GlobalProperties::DefaultServerPort = 17425; const unsigned int GlobalProperties::PlayerNameMaxLen = 30; char *GlobalProperties::PlayerName = nullptr; -bool GlobalProperties::UseProceduralTextures = false; - bool GlobalProperties::IsSoundEnabled = true; int GlobalProperties::UIScale = 2; diff --git a/GlobalProperties.hpp b/GlobalProperties.hpp index 92a50a3..eae1072 100644 --- a/GlobalProperties.hpp +++ b/GlobalProperties.hpp @@ -13,8 +13,6 @@ namespace GlobalProperties { extern const unsigned int PlayerNameMaxLen; extern char *PlayerName; - extern bool UseProceduralTextures; - extern bool IsSoundEnabled; extern int UIScale; diff --git a/LocalPlayer.cpp b/LocalPlayer.cpp index 8b606c7..fe2612a 100644 --- a/LocalPlayer.cpp +++ b/LocalPlayer.cpp @@ -1,10 +1,11 @@ #include "LocalPlayer.hpp" -#include "Game.hpp" #include #include #include #include +#include #include "Audio.hpp" +#include "Game.hpp" #include "network/NetHelper.hpp" namespace Diggler { @@ -16,13 +17,14 @@ static float MvmtDamping = 1/(Acceleration*2.f); static float Gravity = 18.0f; // -Y acceleration (blocks/sec/sec) static float JumpForce = Gravity/2.7f; +static float LadderClimbSpeed = 3.f; static float MaxSpeed = 5.f; static float RoadMaxSpeed = MaxSpeed*2; static float MinYVelocity = -80.f; -static float HurtYVelocity = -10.5f; +static float HurtYVelocity = -12.f; static float LethalYVelocity = -16.f; static int i(const float &f) { @@ -33,7 +35,7 @@ static int i(const float &f) { LocalPlayer::LocalPlayer(Game *G) : Player(G), goingForward(false), goingBackward(false), goingLeft(false), goingRight(false), hasGravity(true), hasNoclip(false), health(1) { - size = glm::vec3(0.3f, 1.9f, 0.3f); + size = glm::vec3(0.3f, 1.5f, 0.3f); eyesPos = glm::vec3(0.f, 1.3f, 0.f); } @@ -54,8 +56,8 @@ void LocalPlayer::lookAt(const glm::vec3& at) { G->A->updateAngle(); } -void LocalPlayer::update(const float &delta) { - health += delta/10; +void LocalPlayer::update(float delta) { + health += delta/5; if (health >= 1) health = 1; @@ -93,17 +95,27 @@ void LocalPlayer::update(const float &delta) { if (onGround) { if (velocity.y <= LethalYVelocity) { setDead(true, DeathReason::Fall, true); + position.y = (int)(position.y); velocity = glm::vec3(0); + camera.setPosition(position + eyesPos); + G->A->updatePos(); + health = 0; return; } G->A->playSound("hitground"); health -= (velocity.y-HurtYVelocity)/(LethalYVelocity-HurtYVelocity); + if (health < 0) + setDead(true, DeathReason::Fall, true); } } if (onGround) { BlockType b = G->SC->get(position.x, position.y-1, position.z); onGround = !Blocks::canGoThrough(b, team); - onRoad = (b == BlockType::Road); + if (onRoad) { + onRoad = (!onGround || b == BlockType::Road || b == BlockType::Jump); + } else { + onRoad = (b == BlockType::Road); + } } if (!onGround) velocity.y -= Gravity * delta; @@ -165,6 +177,10 @@ void LocalPlayer::update(const float &delta) { setDead(true, DeathReason::Lava, true); return; } + if (bNTop == BlockType::Ladder || bNBottom == BlockType::Ladder) { + velocity.y = LadderClimbSpeed; + velocity.z *= 0.75f; + } velocity.x = 0.f; } if (velocity.x < 0.f) @@ -173,6 +189,10 @@ void LocalPlayer::update(const float &delta) { setDead(true, DeathReason::Lava, true); return; } + if (bSTop == BlockType::Ladder || bSBottom == BlockType::Ladder) { + velocity.y = LadderClimbSpeed; + velocity.z *= 0.75f; + } velocity.x = 0.f; } if (velocity.z > 0.f) @@ -181,6 +201,10 @@ void LocalPlayer::update(const float &delta) { setDead(true, DeathReason::Lava, true); return; } + if (bETop == BlockType::Ladder || bEBottom == BlockType::Ladder) { + velocity.y = LadderClimbSpeed; + velocity.x *= 0.75f; + } velocity.z = 0.f; } if (velocity.z < 0.f) @@ -189,6 +213,10 @@ void LocalPlayer::update(const float &delta) { setDead(true, DeathReason::Lava, true); return; } + if (bWTop == BlockType::Ladder || bWBottom == BlockType::Ladder) { + velocity.y = LadderClimbSpeed; + velocity.x *= 0.75f; + } velocity.z = 0.f; } switch (bTop) { @@ -224,6 +252,29 @@ void LocalPlayer::update(const float &delta) { } } +void LocalPlayer::render(const glm::mat4 &transform) const { +#if 0 + const Program *P = G->PM->getProgram(PM_3D | PM_COLORED); + P->bind(); + glEnableVertexAttribArray(P->att("coord")); + glEnableVertexAttribArray(P->att("color")); + glUniformMatrix4fv(P->uni("mvp"), 1, GL_FALSE, glm::value_ptr(transform)); + static VBO vbo; + struct { float x, y, z, r, g, b; } pts[] = { + (int)position.x+.5f, (int)(position.y+size.y)+.5f, (int)(position.z+size.z)+.5f, 1.f, 0.f, 0.f, + (int)position.x+.5f, (int)(position.y+size.y)+.5f, (int)position.z+.5f, 0.f, 1.f, 0.f + }; + vbo.setData(pts, 2, GL_STREAM_DRAW); + vbo.bind(); + glPointSize(4.f); + glVertexAttribPointer(P->att("coord"), 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), 0); + glVertexAttribPointer(P->att("color"), 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (GLvoid*)(3*sizeof(float))); + glDrawArrays(GL_POINTS, 0, 2); + glDisableVertexAttribArray(P->att("color")); + glDisableVertexAttribArray(P->att("coord")); +#endif +} + void LocalPlayer::forceCameraUpdate() { camera.setPosition(position + eyesPos); } diff --git a/LocalPlayer.hpp b/LocalPlayer.hpp index 283b75d..5622148 100644 --- a/LocalPlayer.hpp +++ b/LocalPlayer.hpp @@ -31,7 +31,8 @@ public: inline glm::mat4 getPVMatrix() { return camera.getPVMatrix(); } void lookAt(const glm::vec3 &at); inline void setProjection(const glm::mat4 &p) { camera.setProjection(p); } - void update(const float &delta); + void update(float delta); + void render(const glm::mat4 &transform) const; void forceCameraUpdate(); void goForward(bool enable); void goBackward(bool enable); diff --git a/Platform.cpp b/Platform.cpp index 9c8f302..237abc2 100644 --- a/Platform.cpp +++ b/Platform.cpp @@ -214,7 +214,7 @@ std::ostream& Diggler::getDebugStreamRaw() { return std::cout; } -std::ostream &Diggler::getOutputStreamRaw() { +std::ostream& Diggler::getOutputStreamRaw() { return std::cout; } diff --git a/Player.cpp b/Player.cpp index 020512f..f2c26e0 100644 --- a/Player.cpp +++ b/Player.cpp @@ -9,10 +9,7 @@ namespace Diggler { Player::TexInfo ***Player::TexInfos = nullptr; -const Program *Player::RenderProgram = nullptr; -GLint Player::RenderProgram_attrib_texcoord = -1; -GLint Player::RenderProgram_attrib_coord = -1; -GLint Player::RenderProgram_uni_mvp = -1; +Player::Renderer Player::R = {0}; const char* Player::getTeamNameLowercase(Player::Team t) { switch (t) { @@ -71,10 +68,13 @@ Player::Player(Game *G) : team(Team::Red), isAlive(true), ore(0), loot(0) { if (GlobalProperties::IsClient) { if (TexInfos == nullptr) { - RenderProgram = G->PM->getProgram(PM_3D | PM_TEXTURED | PM_DISCARD); - RenderProgram_attrib_coord = RenderProgram->att("coord"); - RenderProgram_attrib_texcoord = RenderProgram->att("texcoord"); - RenderProgram_uni_mvp = RenderProgram->uni("mvp"); + R.prog = G->PM->getProgram(PM_3D | PM_TEXTURED | PM_FOG | PM_DISCARD); + R.att_coord = R.prog->att("coord"); + R.att_texcoord = R.prog->att("texcoord"); + R.uni_mvp = R.prog->uni("mvp"); + R.uni_unicolor = R.prog->uni("unicolor"); + R.uni_fogStart = R.prog->uni("fogStart"); + R.uni_fogEnd = R.prog->uni("fogEnd"); TexInfos = new TexInfo**[Team::LAST]; for (uint8 t=0; t < (uint8)Team::LAST; t++) { @@ -159,7 +159,7 @@ static inline int getSide(float angle) { } void Player::render(const glm::mat4 &transform) const { - RenderProgram->bind(); + R.prog->bind(); TexInfos[(uint8)team][(uint8)tool]->tex->bind(); int action = 1; if (velocity.x < -.5f || velocity.x > .5f || @@ -170,18 +170,20 @@ void Player::render(const glm::mat4 &transform) const { TexInfos[(uint8)team][(uint8)tool]->side[ getSide(rmod(atan2(position.x-G->LP->position.x, position.z-G->LP->position.z)-angle, M_PI*2))] .vbos[action]->bind(); - glEnableVertexAttribArray(RenderProgram_attrib_texcoord); - glEnableVertexAttribArray(RenderProgram_attrib_coord); + glEnableVertexAttribArray(R.att_texcoord); + glEnableVertexAttribArray(R.att_coord); + glUniform1f(R.uni_fogStart, G->RP->fogStart); + glUniform1f(R.uni_fogEnd, G->RP->fogEnd); glm::vec3 &lpPos = G->LP->position; float angle = atan2(lpPos.x-m_predictPos.x, lpPos.z-m_predictPos.z); static const glm::vec3 vecY(0.0, 1.0, 0.0); - glUniformMatrix4fv(RenderProgram_uni_mvp, 1, GL_FALSE, glm::value_ptr( + glUniformMatrix4fv(R.uni_mvp, 1, GL_FALSE, glm::value_ptr( glm::translate(transform, m_predictPos) * glm::rotate(angle, vecY))); - glVertexAttribPointer(RenderProgram_attrib_coord, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0); - glVertexAttribPointer(RenderProgram_attrib_texcoord, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (GLvoid*)(3*sizeof(float))); + glVertexAttribPointer(R.att_coord, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0); + glVertexAttribPointer(R.att_texcoord, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (GLvoid*)(3*sizeof(float))); glDrawArrays(GL_TRIANGLES, 0, 6); - glDisableVertexAttribArray(RenderProgram_attrib_coord); - glDisableVertexAttribArray(RenderProgram_attrib_texcoord); + glDisableVertexAttribArray(R.att_coord); + glDisableVertexAttribArray(R.att_texcoord); } void Player::setDead(bool dead, DeathReason dr, bool send) { diff --git a/Player.hpp b/Player.hpp index b140a80..498f934 100644 --- a/Player.hpp +++ b/Player.hpp @@ -13,7 +13,7 @@ class Game; class Texture; class Player { -private: +protected: static struct TexInfo { Texture *tex; union VBOs { @@ -23,8 +23,15 @@ private: VBO *vbos[4]; } side[4]; } ***TexInfos; - static const Program *RenderProgram; - static GLint RenderProgram_attrib_coord, RenderProgram_attrib_texcoord, RenderProgram_uni_mvp; + static struct Renderer { + const Program *prog; + GLint att_coord, + att_texcoord, + uni_mvp, + uni_unicolor, + uni_fogStart, + uni_fogEnd; + } R; glm::vec3 m_predictPos; Player(const Player&) = delete; @@ -82,12 +89,12 @@ public: Player(Game *G = nullptr); Player(Player&&); Player& operator=(Player&&); - virtual ~Player(); + ~Player(); - virtual void setPosVel(const glm::vec3 &pos, const glm::vec3 &vel, const glm::vec3 &acc = glm::vec3()); - virtual void update(const float &delta); - virtual void render(const glm::mat4 &transform) const; - virtual void setDead(bool, DeathReason = DeathReason::None, bool send = false); + void setPosVel(const glm::vec3 &pos, const glm::vec3 &vel, const glm::vec3 &acc = glm::vec3()); + void update(const float &delta); + void render(const glm::mat4 &transform) const; + void setDead(bool, DeathReason = DeathReason::None, bool send = false); }; } diff --git a/Program.hpp b/Program.hpp index 75cc99d..bef60bc 100644 --- a/Program.hpp +++ b/Program.hpp @@ -11,62 +11,62 @@ private: GLint linked = GL_FALSE; bool mustDestroy = false; std::string fshPath, vshPath; - + public: /// /// Creates an OpenGL Program from two existent shaders /// (shaders dtors won't be called when ~Program is called) /// Program(Shader* vsh, Shader* fsh); - + /// /// Creates an OpenGL Program shaders read from paths /// (shaders dtors will be called when ~Program is called) /// Program(const std::string& vshPath, const std::string& fshPath); - + /// /// Set shaders' #defines - /// @see Shader::setDefines(const std::vector); + /// @see Shader::setDefines(const std::vector&); /// void setDefines(const std::vector&); - + /// /// Links the shaders together /// @returns true on success, otherwise false /// @see getError() returns the error message /// bool link(); - + /// /// @returns The error message generated during link /// @see link() /// std::string getError() const; - + GLuint getId() const; operator GLuint() const { return getId(); } - + /// /// @param name Name of the attribute /// @returns OpenGL attribute ID /// GLint att(const std::string& name) const; - + /// /// @param name Name of the uniform /// @returns OpenGL uniform ID /// GLint uni(const std::string& name) const; - + /// /// Makes this Program active /// void bind() const; - + GLuint getFShId() const; GLuint getVShId() const; - + /// /// Destroys the shader, freeing OpenGL resources and the subsequent Shaders (if needed) /// diff --git a/Server.cpp b/Server.cpp index f3eafdb..25d01c9 100644 --- a/Server.cpp +++ b/Server.cpp @@ -243,35 +243,14 @@ Server::Server(Game &G, uint16 port) : G(G) { throw "Server init failed"; } -#if 0 - G.SC->setSize(4, 4, 4); + setup(); +} - //for (int i=0; i < 8192; i++) G.SC->set(FastRand(CX*G.SC->getChunksX()), FastRand(CY*G.SC->getChunksY()), FastRand(CZ*G.SC->getChunksZ()), (BlockType)(FastRand((int)BlockType::LAST))); - for(int x=0;xgetChunksX();x++) for(int z=0;z<(CZ*G.SC->getChunksZ())/2;z++) G.SC->set(x, 0, z, BlockType::Dirt); - for(int x=0;xgetChunksX();x++) for(int z=0;z<(CZ*G.SC->getChunksZ())/2;z++) G.SC->set(x, 0, z+(CZ*G.SC->getChunksZ())/2, BlockType::Road); - // for(int x=0;xgetChunksX();x++) for(int y=0;y<16;y++) for(int z=0;zgetChunksZ();z++) G.SC->set(x,y,z,BlockType::Dirt); - for(int x=0; x < (int)BlockType::LAST; x++) G.SC->set(x, 2, 0, (BlockType)(x)); - G.SC->set(4, 4, 4, BlockType::Shock); - G.SC->set(4, 0, 4, BlockType::Jump); - - G.SC->set(0, 1, 1, BlockType::Metal); - G.SC->set(0, 2, 1, BlockType::Metal); - G.SC->set(0, 3, 1, BlockType::Metal); - - G.SC->set(1, 3, 1, BlockType::Metal); - G.SC->set(2, 3, 1, BlockType::Metal); - - G.SC->set(3, 1, 1, BlockType::Metal); - G.SC->set(3, 2, 1, BlockType::Metal); - G.SC->set(3, 3, 1, BlockType::Metal); - - CaveGenerator::PaintAtPoint(*(G.SC), 8, 8, 8, 1, BlockType::Dirt); - CaveGenerator::PaintAtPoint(*(G.SC), 16, 8, 8, 2, BlockType::Dirt); - CaveGenerator::PaintAtPoint(*(G.SC), 24, 8, 8, 3, BlockType::Dirt); - - for(int x=0;xgetChunksX();x++) for(int z=0;z<(CZ*G.SC->getChunksZ())/2;z++) G.SC->set(x, 64, z, BlockType::Dirt); - G.SC->set(2*CX, 68, 2*CY, BlockType::Lava); -#else +void Server::setupInternals() { + +} + +void Server::setup() { G.CCH->enabled = false; G.SC->setSize(4, 4, 4); auto genStart = std::chrono::high_resolution_clock::now(); @@ -281,7 +260,6 @@ Server::Server(Game &G, uint16 port) : G(G) { auto genDelta = std::chrono::duration_cast(genEnd - genStart); getOutputStream() << "Map gen took " << genDelta.count() << "ms" << std::endl; G.CCH->enabled = true; -#endif //G.SC->save("/tmp/a"); //G.SC->load("/tmp/a"); @@ -293,6 +271,7 @@ Server::Server(Game &G, uint16 port) : G(G) { }*/ } + void chunk_updater(Game *G, Superchunk *sc, Host &H) { while (true) { for (int x=0; x < CX; x++) @@ -375,7 +354,7 @@ bool Server::isPlayerOnline(const std::string &playername) const { return false; } -void Server::kick(Player& p, Net::QuitReason r, const std::string& message) { +void Server::kick(Player &p, Net::QuitReason r, const std::string &message) { OutMessage msg(MessageType::PlayerQuit, r); msg.writeU32(p.id); msg.writeString(message); diff --git a/Server.hpp b/Server.hpp index c493233..418421d 100644 --- a/Server.hpp +++ b/Server.hpp @@ -29,6 +29,8 @@ public: Server(Game &G, uint16 port); ~Server(); + void setupInternals(); + void setup(); void run(); bool isPlayerOnline(const std::string &playername) const; @@ -36,7 +38,7 @@ public: Player* getPlayerById(uint32 id); Player* getPlayerByPeer(const Net::Peer &peer); Player* getPlayerByName(const std::string &name); - void kick(Player &p, Net::QuitReason r, const std::string& message = ""); + void kick(Player &p, Net::QuitReason r = Net::QuitReason::Kicked, const std::string& message = ""); }; } diff --git a/Sound.hpp b/Sound.hpp index dfae5e9..94ad538 100644 --- a/Sound.hpp +++ b/Sound.hpp @@ -23,25 +23,25 @@ public: void stop(); bool isPlaying() const; inline ALuint getId() const { return id; } - + float getGain() const; void setGain(float value); - + bool getLooping() const; void setLooping(bool value); - + float getPitch() const; void setPitch(float value); - + bool getRelative() const; void setRelative(bool value); - + glm::vec3 getPosition() const; void setPosition(const glm::vec3 &value); - + glm::vec3 getVelocity() const; void setVelocity(const glm::vec3 &value); - + glm::vec3 getDirection() const; void setDirection(const glm::vec3 &value); }; diff --git a/SoundBuffer.cpp b/SoundBuffer.cpp index 8f34d60..f4b4c49 100644 --- a/SoundBuffer.cpp +++ b/SoundBuffer.cpp @@ -63,23 +63,22 @@ void SoundBuffer::loadOgg(const std::string &path) { getDebugStream() << "Could not load " << path << " : " << error << std::endl; return; } - + // Get file info stb_vorbis_info info = stb_vorbis_get_info(stream); ALenum format = alGetFormat(info.channels, 16); // stb_vorbis always 16-bit samples - uint bufferSize = stb_vorbis_stream_length_in_samples(stream); //4096*8; - + uint bufferSize = stb_vorbis_stream_length_in_samples(stream); + // Create buffer ALshort *bufferData = new ALshort[bufferSize]; - + // Fill the buffer stb_vorbis_get_samples_short_interleaved(stream, info.channels, bufferData, bufferSize); - + // Send the buffer data alBufferData(id, format, bufferData, stb_vorbis_stream_length_in_samples(stream)*sizeof(ALshort), info.sample_rate); //getDebugStream() << path << ' ' << info.sample_rate << "Hz" << std::endl; - - // avoid memory leaks: delete the buffer and stb_vorbis instance + delete[] bufferData; stb_vorbis_close(stream); } diff --git a/Superchunk.cpp b/Superchunk.cpp index 9debab2..712636f 100644 --- a/Superchunk.cpp +++ b/Superchunk.cpp @@ -1,6 +1,7 @@ #include "Superchunk.hpp" -#include "Game.hpp" +#include #include +#include "Game.hpp" #include "lzfx/lzfx.h" #include "network/Network.hpp" @@ -37,6 +38,7 @@ void Superchunk::setSize(int x, int y, int z) { c[x] = new Chunk**[chunksY]; for (int y = 0; y < chunksY; y++) { c[x][y] = new Chunk*[chunksZ]; + //memset(c[x][y], chunksZ*sizeof(Chunk*), 0); for (int z = 0; z < chunksZ; z++) { c[x][y][z] = nullptr; } @@ -144,7 +146,7 @@ void Superchunk::render(const glm::mat4& transform) { c[x][y][z]->renderBatched(chunkTransform); } } - + glDisableVertexAttribArray(Chunk::R.att_wave); glDisableVertexAttribArray(Chunk::R.att_color); glDisableVertexAttribArray(Chunk::R.att_texcoord); @@ -192,19 +194,22 @@ void Superchunk::write(OutStream &msg) const { }; msg.writeData(&mth, sizeof(MapTransferHeader)); const BlockType *chunkData = nullptr; - uint compressedSize = CX * CY * CZ; - byte *compressed = new byte[compressedSize]; + uint initCompressedSize = CX*CY*CZ*sizeof(BlockType); + uint compressedSize; + byte *compressed = new byte[initCompressedSize]; for (int sx=0; sx < getChunksX(); sx++) { for (int sy=0; sy < getChunksY(); sy++) { for (int sz=0; sz < getChunksZ(); sz++) { - // Chunk may be uninitialized if (c[sx][sy][sz] == nullptr) { // Chunk is empty (not initialized), mark as missing msg.writeI16(-1); } else { chunkData = c[sx][sy][sz]->blk; - compressedSize = CX * CY * CZ; - lzfx_compress(chunkData, CX*CY*CZ, compressed, &compressedSize); + compressedSize = initCompressedSize; + int rz = lzfx_compress(chunkData, CX*CY*CZ*sizeof(BlockType), compressed, &compressedSize); + if (rz < 0) + getErrorStream() << "Failed compressing Chunk[" << sx << ',' << sy << + ' ' << sz << ']' << std::endl; msg.writeI16(compressedSize); msg.writeData(compressed, compressedSize); } @@ -219,15 +224,12 @@ void Superchunk::read(InStream &M) { M.readData(&mth, sizeof(mth)); setSize(mth.Chunks.x, mth.Chunks.y, mth.Chunks.z); int bytesRead = 0; - uint uncompressedDataSize = CX * CY * CZ; // Should not change - BlockType *uncompressedData = new BlockType[uncompressedDataSize/sizeof(BlockType)]; + uint uncDataSizeMust = CX*CY*CZ*sizeof(BlockType), uncDataSize = 0; for (int sx=0; sx < mth.Chunks.x; sx++) { for (int sy=0; sy < mth.Chunks.y; sy++) { for (int sz=0; sz < mth.Chunks.z; sz++) { int16 size = M.readI16(); - if (c[sx][sy][sz] != nullptr) { - delete c[sx][sy][sz]; // Bash out the old chunk - } + delete c[sx][sy][sz]; // Bash out the old chunk if (size == -1) { // Chunk is empty c[sx][sy][sz] = nullptr; // Keep out } else { @@ -235,17 +237,24 @@ void Superchunk::read(InStream &M) { byte *compressedData = new byte[size]; M.readData(compressedData, size); bytesRead += size; - uncompressedDataSize = CX * CY * CZ; - lzfx_decompress(compressedData, size, uncompressedData, &uncompressedDataSize); - for (int i=0; i < CX*CY*CZ; ++i) { - c[sx][sy][sz]->blk[i] = uncompressedData[i]; + uncDataSize = uncDataSizeMust; + int rz = lzfx_decompress(compressedData, size, c[sx][sy][sz]->blk, &uncDataSize); + if (rz < 0 || uncDataSize != uncDataSizeMust) { + if (rz < 0) { + getErrorStream() << "Chunk[" << sx << ',' << sy << ' ' << sz << + "] LZFX decompression failed" << std::endl; + } else { + getErrorStream() << "Chunk[" << sx << ',' << sy << ' ' << sz << + "] has bad size " << uncDataSize << '/' << uncDataSizeMust << std::endl; + } + delete c[sx][sy][sz]; + c[sx][sy][sz] = nullptr; } delete[] compressedData; } } } } - delete[] uncompressedData; getDebugStream() << "MapRead: read " << bytesRead << std::endl; } diff --git a/VBO.hpp b/VBO.hpp index 242b519..3fcab82 100644 --- a/VBO.hpp +++ b/VBO.hpp @@ -31,15 +31,6 @@ public: glBindBuffer(GL_ARRAY_BUFFER, id); glBufferData(GL_ARRAY_BUFFER, data.size()*sizeof(T), data.data(), usage); glBindBuffer(GL_ARRAY_BUFFER, currentBoundArray); - //getDebugStream() << "Set buffer " << typeid(T).name() << ' ' << data.size() << std::endl; - } - template void setData(const std::initializer_list& data, GLenum usage = GL_STATIC_DRAW) { - // TODO: Fix this, it's not working: data seems to always be empty - GLint currentBoundArray; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, ¤tBoundArray); - glBindBuffer(GL_ARRAY_BUFFER, id); - glBufferData(GL_ARRAY_BUFFER, data.size()*sizeof(T), data.begin(), usage); - glBindBuffer(GL_ARRAY_BUFFER, currentBoundArray); - //getDebugStream() << "Set buffer " << typeid(T).name() << ' ' << data.size() << std::endl; } template void setData(const T *data, uint count, GLenum usage = GL_STATIC_DRAW) { GLint currentBoundArray; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, ¤tBoundArray); diff --git a/assets/3d.f.glsl b/assets/3d.f.glsl index 244ddb6..426c37d 100755 --- a/assets/3d.f.glsl +++ b/assets/3d.f.glsl @@ -32,6 +32,6 @@ void main(void) { #endif #ifdef FOG float fogCoord = (gl_FragCoord.z/gl_FragCoord.w); - gl_FragColor = mix(gl_FragColor, vec4(0.0, 0.0, 0.0, 1.0), 1.0-clamp((fogEnd-fogCoord)/(fogEnd-fogStart), 0.0, 1.0)); + gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.0, 0.0, 0.0), 1.0-clamp((fogEnd-fogCoord)/(fogEnd-fogStart), 0.0, 1.0)); #endif } \ No newline at end of file diff --git a/assets/3d.v.glsl b/assets/3d.v.glsl index 406e1fb..a5aec71 100644 --- a/assets/3d.v.glsl +++ b/assets/3d.v.glsl @@ -26,9 +26,11 @@ void main(void) { #endif vec3 coord = coord.xyz; #ifdef WAVE - float yShift = sin(time+(coord.x+coord.z)/16.0*6*PI)*(wave) - wave; - coord.y += yShift; - //v_texcoord.y -= yShift/8.0; + if (wave != 0) { + float yShift = sin(time+(coord.x+coord.z)/16.0*6*PI)*(wave) - wave; + coord.y += yShift; + //v_texcoord.y -= yShift/8.0; + } #endif gl_Position = mvp * vec4(coord, 1); } \ No newline at end of file diff --git a/assets/blocks/tex_block_bank_back_blue.png b/assets/blocks/tex_block_bank_back_blue.png index 2dec1a02df2f7b3d6de9794e4accb0489d9e8b20..fa34319d3878996c90daf05d9367db0844cd66e8 100644 GIT binary patch delta 186 zcmX@bc#%=DGr-TCmrII^fq{Y7)59eQNIQTq3p0?6aL;)=QBkqJ%G1R$#N&9fff|E^ zPs|6VbR`js$D0qZENNimXV6X%Il{@Jz%`|yY2gZoM#hD;iS}qIL^3Y)>P^_{ ku_9^dj(2KTY#12U8f$6_tax?oKhQZ0p00i_>zopr06XhF{{R30 delta 179 zcmcb}c#2W6Gr-TCmrII^fq{Y7)59eQNZWug2Qx@SNz-AXqGElqr;B5V$MLt<4{{wa z;9$P6<=FrKPv@Sxlh||RAfI=hm>kF20Kr~`9dqsOy{=5md2+mCAyZRV~dz{*_?DDo2bP0l+XkKGW|qB diff --git a/assets/blocks/tex_block_bank_back_red.png b/assets/blocks/tex_block_bank_back_red.png index cb0b3014f0ad09d9263fe239093a2e7c20a0558d..46ed8f993dec62e05a065a1498c99a1c393bebbc 100644 GIT binary patch delta 186 zcmX@bc#%=DGr-TCmrII^fq{Y7)59eQNIQTq3p0?6aL;)=QBkqJ%G1R$#N&8!fD(g5 zNX!Q&btMsthnpQ(mozZ)GiWD>9N}b9;OZ%CTDams1LMp?iyDqjmGo&fdK~nCfzvL0 z4p&T!Q=`HW)_x`qg%nmlRv)hi70E$~$6op-ZqPV9p>Itf>tZf9(H<>@NXCU;y$M@A kRwOOm@lNfE4FiLpSl&?qiFVdQ&MBb@0Pr(BX8-^I delta 179 zcmcb}c#2W6Gr-TCmrII^fq{Y7)59eQNZWug2Qx@SNz-AXqGElqr;B5V$MLt<4{{wa z;9$OR<=FrKPv@Sxlh||RAfI=hm>kF20Kr~`9dqsOy{=5md2+mCAyZRV~dz{*_?DDo2M@?R_78y0;AHT0^>bP0l+XkKOk70= diff --git a/assets/blocks/tex_block_bank_blue.png b/assets/blocks/tex_block_bank_blue.png deleted file mode 100644 index a0514210da411afce6adf5e4b12ba39f4093f953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmV;90df9`P)uD7?hzrVj*eScX1 z009JhS{tw;tsz5(+F0pAA+%K<-^U(f}jtC zfWyzi-vF!@;6ww4x3@h2ti$vn%iCHSJOFnSjF{x?H0F7Nvm9?%>h{7t<8 diff --git a/assets/blocks/tex_block_bank_front_blue.png b/assets/blocks/tex_block_bank_front_blue.png index 2db1a7ec58c6e7d8cc608413acdff520a519a9f5..19aa8387670457cb9fe842d0e73974c837c72efa 100644 GIT binary patch delta 348 zcmV-i0i*u!0)Yb|iBL{Q4GJ0x0000DNk~Le0000$0000$1Oos709Z$C?U5lce;Y|e zK~zY`?Uqdn!Y~ws(-IVS))Q#K69l@>qRPt=@s6R=^f=vK{tDPT7^5)?iWUY?f2&+K!OegniMtBv5(}B{!3Sm`Vff@SG^vn{0Wc&F z0wU5Rw#4AFXwp3}Jt5X4i-uH7a6+~`(ZlK{pN<~0klDLBzAu&nBgs2C;68WPtO3r0_2YkfG5`g)Ce1g+d#d?35N;rGf3c6fog3r&tNH>GQkBx8Ehb! u!L|6t43#H8L+*yjKCAyPwM9Vg^WY6OjBiJs^!_XW0000=Am@?w!A!(d+28I!Fk9 z-E-#PsH{qe9j~+Meh8pjGC;>7aesC+z($1PTRZ=0fn6O)aU6jT7Y~R+>B9ke|B@B| z0IF8{@DuX(Bq0k8#1?oJEj(aXf4Oc#m;pnwa248x3YqR921X%axN)hAxsZhiFr=IW z6wxHMB;c|t=6eus0@b7-L)s+-AuBo4!|Emnz3@2Aa+gF#=N=hQMTo t(Bd02l#${LsT(Hwtp2~$76GZxgEz%5C%yloi@yK>002ovPDHLkV1lqpl1=~s delta 330 zcmV-Q0k!^s1MdPMiBL{Q4GJ0x0000DNk~Le0000y0000y2m=5B01YB3K#?IZe+fxM zK~zY`?Uun3gCGn<6O&lm|Nr0~Bp3t(h@EMt?jZ-qC%X&72s9v|`Lu5M6ntiz6eg&t z@CHSg(G?Kv96t^GU{467Ye&;5jEKx=<{p-1c>w_tWH2%_npuEFBpT?29oqp@+c~`3 zsLNOOGRMN;plxHmqp-1kuEB0$f2&n%o;7@5VOWB-Fld7@$?To5c&aggTjRa^jM>T^ zCk*=vOM7+-BZBUI{?rL`#eQKUx92Hc0#|JpjBoI?R0ISRuKH~#EUL+TJU)~F&*><^ zAyWpgXDf~ZY?hu<_&Bo|S|yq7TIRAEGdplY=0mtCvt#?t`~{h7@-h!xAO=JKp1=CP c{de$y-mm91V{Y;&qW}N^07*qoM6N<$g5GkA9smFU diff --git a/assets/blocks/tex_block_bank_red.png b/assets/blocks/tex_block_bank_red.png deleted file mode 100644 index 1a9ddb197eb70daa8d22ab3d6efdde30c9f0beab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 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 VM*Eb83E%(#002ovPDHLkV1m&(B3A$a diff --git a/assets/blocks/tex_block_road_top.png b/assets/blocks/tex_block_road_top.png deleted file mode 100644 index 97680f9afc5faa011f2ddc1dd7bd77736c5569fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3027 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 diff --git a/assets/icons/tex_icon_bank_blue.png b/assets/icons/bank_blue.png similarity index 100% rename from assets/icons/tex_icon_bank_blue.png rename to assets/icons/bank_blue.png diff --git a/assets/icons/tex_icon_bank_red.png b/assets/icons/bank_red.png similarity index 100% rename from assets/icons/tex_icon_bank_red.png rename to assets/icons/bank_red.png diff --git a/assets/icons/tex_icon_beacon.png b/assets/icons/beacon.png similarity index 100% rename from assets/icons/tex_icon_beacon.png rename to assets/icons/beacon.png diff --git a/assets/icons/tex_icon_deconstruction.png b/assets/icons/deconstruction.png similarity index 100% rename from assets/icons/tex_icon_deconstruction.png rename to assets/icons/deconstruction.png diff --git a/assets/icons/tex_icon_explosive.png b/assets/icons/explosive.png similarity index 100% rename from assets/icons/tex_icon_explosive.png rename to assets/icons/explosive.png diff --git a/assets/icons/tex_icon_jump.png b/assets/icons/jump.png similarity index 100% rename from assets/icons/tex_icon_jump.png rename to assets/icons/jump.png diff --git a/assets/icons/tex_icon_ladder.png b/assets/icons/ladder.png similarity index 100% rename from assets/icons/tex_icon_ladder.png rename to assets/icons/ladder.png diff --git a/assets/icons/tex_icon_metal.png b/assets/icons/metal.png similarity index 100% rename from assets/icons/tex_icon_metal.png rename to assets/icons/metal.png diff --git a/assets/icons/tex_icon_road.png b/assets/icons/road.png similarity index 100% rename from assets/icons/tex_icon_road.png rename to assets/icons/road.png diff --git a/assets/icons/tex_icon_solid_blue.png b/assets/icons/solid_blue.png similarity index 100% rename from assets/icons/tex_icon_solid_blue.png rename to assets/icons/solid_blue.png diff --git a/assets/icons/tex_icon_solid_red.png b/assets/icons/solid_red.png similarity index 100% rename from assets/icons/tex_icon_solid_red.png rename to assets/icons/solid_red.png diff --git a/assets/icons/tex_icon_spikes.png b/assets/icons/spikes.png similarity index 100% rename from assets/icons/tex_icon_spikes.png rename to assets/icons/spikes.png diff --git a/assets/icons/tex_icon_teleporter.png b/assets/icons/teleporter.png similarity index 100% rename from assets/icons/tex_icon_teleporter.png rename to assets/icons/teleporter.png diff --git a/assets/icons/tex_icon_translucent_blue.png b/assets/icons/translucent_blue.png similarity index 100% rename from assets/icons/tex_icon_translucent_blue.png rename to assets/icons/translucent_blue.png diff --git a/assets/icons/tex_icon_translucent_red.png b/assets/icons/translucent_red.png similarity index 100% rename from assets/icons/tex_icon_translucent_red.png rename to assets/icons/translucent_red.png diff --git a/enet/CMakeLists.txt b/enet/CMakeLists.txt index 33ebe46..cb52d57 100644 --- a/enet/CMakeLists.txt +++ b/enet/CMakeLists.txt @@ -2,8 +2,10 @@ cmake_minimum_required(VERSION 2.6) project(enet) -set(CMAKE_BUILD_TYPE "Debug") +set(CMAKE_BUILD_TYPE "Release") set(CMAKE_CC_FLAGS_DEBUG "${CMAKE_CC_FLAGS_DEBUG} -g") +set(CMAKE_CC_FLAGS_RELEASE "${CMAKE_CC_FLAGS_RELEASE} -O3") + add_definitions(-DHAS_FCNTL -DHAS_POLL -DHAS_SOCKLEN_T) set(ENET_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") diff --git a/lzfx/CMakeLists.txt b/lzfx/CMakeLists.txt index c713374..b28c55b 100644 --- a/lzfx/CMakeLists.txt +++ b/lzfx/CMakeLists.txt @@ -1,6 +1,10 @@ cmake_minimum_required(VERSION 2.6) project(lzfx) +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CC_FLAGS_DEBUG "${CMAKE_CC_FLAGS_DEBUG} -g") +set(CMAKE_CC_FLAGS_RELEASE "${CMAKE_CC_FLAGS_RELEASE} -O3") + set(LZFX_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(LZFX_INCLUDE_DIR ${LZFX_INCLUDE_DIR} PARENT_SCOPE) add_library(lzfx STATIC lzfx.c) \ No newline at end of file diff --git a/ui/Manager.cpp b/ui/Manager.cpp index 710795d..2c313f7 100644 --- a/ui/Manager.cpp +++ b/ui/Manager.cpp @@ -9,11 +9,10 @@ namespace Diggler { namespace UI { -static const Program *RP_Rect = nullptr; -static GLint RP_Rect_att_texcoord = -1; -static GLint RP_Rect_att_coord = -1; -static GLint RP_Rect_uni_mvp = -1; -static GLint RP_Rect_uni_unicolor = -1; +struct Renderer { + const Program *prog; + GLint att_texcoord, att_coord, uni_mvp, uni_unicolor; +} R = {0}, RR = {0}; Manager::Manager() : Scale(2) { PM = &m_projMatrix; @@ -24,12 +23,18 @@ Manager::Manager() : Scale(2) { void Manager::setup(Game *G) { this->G = G; - if (RP_Rect == nullptr) { - RP_Rect = G->PM->getProgram(PM_2D | PM_TEXTURED); - RP_Rect_att_coord = RP_Rect->att("coord"); - RP_Rect_att_texcoord = RP_Rect->att("texcoord"); - RP_Rect_uni_mvp = RP_Rect->uni("mvp"); - RP_Rect_uni_unicolor = RP_Rect->uni("unicolor"); + if (R.prog == nullptr) { + R.prog = G->PM->getProgram(PM_2D | PM_TEXTURED); + R.att_texcoord = R.prog->att("texcoord"); + R.att_coord = R.prog->att("coord"); + R.uni_mvp = R.prog->uni("mvp"); + R.uni_unicolor = R.prog->uni("unicolor"); + } + if (RR.prog == nullptr) { + RR.prog = G->PM->getProgram(PM_2D); + RR.att_coord = RR.prog->att("coord"); + RR.uni_mvp = RR.prog->uni("mvp"); + RR.uni_unicolor = RR.prog->uni("unicolor"); } m_rectVbo = new VBO(); uint8 verts[6*4] = { @@ -69,44 +74,50 @@ void Manager::setProjMat(const glm::mat4 &mat) { } void Manager::drawRect(const glm::mat4 &mat, const glm::vec4 &color) const { - RP_Rect->bind(); - glEnableVertexAttribArray(RP_Rect_att_coord); + RR.prog->bind(); + glEnableVertexAttribArray(RR.att_coord); - Texture::unbind(); m_rectVbo->bind(); - glUniform4f(RP_Rect_uni_unicolor, color.r, color.g, color.b, color.a); - glUniformMatrix4fv(RP_Rect_uni_mvp, 1, GL_FALSE, glm::value_ptr(mat)); - glVertexAttribPointer(RP_Rect_att_coord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), 0); + Texture::unbind(); + glUniform4f(RR.uni_unicolor, color.r, color.g, color.b, color.a); + glUniformMatrix4fv(RR.uni_mvp, 1, GL_FALSE, glm::value_ptr(mat)); + glVertexAttribPointer(RR.att_coord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), 0); glDrawArrays(GL_TRIANGLES, 0, 6); // OpenGL needs to be stateless. Definitely. Wait for Vulkan. - glUniform4f(RP_Rect_uni_unicolor, 1.f, 1.f, 1.f, 1.f); + glUniform4f(RR.uni_unicolor, 1.f, 1.f, 1.f, 1.f); - glDisableVertexAttribArray(RP_Rect_att_coord); + glDisableVertexAttribArray(RR.att_coord); } void Manager::drawFullRect(const glm::vec4 &color) const { drawRect(m_projMat1, color); } -void Manager::drawTex(const Element::Area &a, const Texture &t) const { - drawTex(glm::scale(glm::translate(*PM, glm::vec3(a.x, a.y, 0)), glm::vec3(a.w, a.h, 0)), t); -} - -void Manager::drawTex(const glm::mat4 &mat, const Texture &t) const { - RP_Rect->bind(); - glEnableVertexAttribArray(RP_Rect_att_coord); - glEnableVertexAttribArray(RP_Rect_att_texcoord); +void Manager::drawTex(const glm::mat4 &mat, const Texture &t, const glm::vec4 &color) const { + R.prog->bind(); + glEnableVertexAttribArray(R.att_coord); + glEnableVertexAttribArray(R.att_texcoord); t.bind(); m_rectVbo->bind(); - glUniformMatrix4fv(RP_Rect_uni_mvp, 1, GL_FALSE, glm::value_ptr(mat)); - glVertexAttribPointer(RP_Rect_att_coord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), 0); - glVertexAttribPointer(RP_Rect_att_texcoord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), (void*)(2*sizeof(uint8))); + glUniform4f(R.uni_unicolor, color.r, color.g, color.b, color.a); + glUniformMatrix4fv(R.uni_mvp, 1, GL_FALSE, glm::value_ptr(mat)); + glVertexAttribPointer(R.att_coord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), 0); + glVertexAttribPointer(R.att_texcoord, 2, GL_UNSIGNED_BYTE, GL_FALSE, 4*sizeof(uint8), (void*)(2*sizeof(uint8))); glDrawArrays(GL_TRIANGLES, 0, 6); + glUniform4f(R.uni_unicolor, 1.f, 1.f, 1.f, 1.f); - glDisableVertexAttribArray(RP_Rect_att_texcoord); - glDisableVertexAttribArray(RP_Rect_att_coord); + glDisableVertexAttribArray(R.att_texcoord); + glDisableVertexAttribArray(R.att_coord); +} + +void Manager::drawTex(const glm::mat4 &mat, const Texture &t) const { + drawTex(mat, t, glm::vec4(1.f)); +} + +void Manager::drawTex(const Element::Area &a, const Texture &t) const { + drawTex(glm::scale(glm::translate(*PM, glm::vec3(a.x, a.y, 0)), glm::vec3(a.w, a.h, 0)), t); } void Manager::drawFullTexV(const Texture &t) const { @@ -114,9 +125,7 @@ void Manager::drawFullTexV(const Texture &t) const { } void Manager::drawFullTexV(const Texture &t, const glm::vec4 &color) const { - glUniform4f(RP_Rect_uni_unicolor, color.r, color.g, color.b, color.a); - drawTex(m_projMat1V, t); - glUniform4f(RP_Rect_uni_unicolor, 1.f, 1.f, 1.f, 1.f); + drawTex(m_projMat1V, t, color); } } diff --git a/ui/Manager.hpp b/ui/Manager.hpp index 83caea7..15c0289 100644 --- a/ui/Manager.hpp +++ b/ui/Manager.hpp @@ -55,6 +55,7 @@ public: void drawFullRect(const glm::vec4 &color) const; void drawTex(const Element::Area&, const Texture&) const; void drawTex(const glm::mat4&, const Texture&) const; + void drawTex(const glm::mat4&, const Texture&, const glm::vec4 &color) const; void drawFullTexV(const Texture&) const; void drawFullTexV(const Texture&, const glm::vec4 &color) const;