-
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#include <memory>
|
||||
#include <Common/Packets.hpp>
|
||||
#include <glm/ext.hpp>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
|
||||
namespace LV::Client {
|
||||
@@ -163,6 +165,9 @@ void ServerSession::onCursorPosChange(int32_t width, int32_t height) {
|
||||
}
|
||||
|
||||
void ServerSession::onCursorMove(float xMove, float yMove) {
|
||||
xMove /= 10.f;
|
||||
yMove /= 10.f;
|
||||
|
||||
glm::vec3 deltaPYR;
|
||||
|
||||
static constexpr float PI = glm::pi<float>(), PI2 = PI*2, PI_HALF = PI/2, PI_DEG = PI/180;
|
||||
@@ -186,6 +191,26 @@ void ServerSession::onCursorBtn(ISurfaceEventListener::EnumCursorBtn btn, bool s
|
||||
void ServerSession::onKeyboardBtn(int btn, int state) {
|
||||
if(btn == GLFW_KEY_TAB && !state) {
|
||||
CursorMode = CursorMode == EnumCursorMoveMode::Default ? EnumCursorMoveMode::MoveAndHidden : EnumCursorMoveMode::Default;
|
||||
Keys.clear();
|
||||
}
|
||||
|
||||
|
||||
if(CursorMode == EnumCursorMoveMode::MoveAndHidden)
|
||||
{
|
||||
if(btn == GLFW_KEY_W)
|
||||
Keys.W = state;
|
||||
else if(btn == GLFW_KEY_A)
|
||||
Keys.A = state;
|
||||
else if(btn == GLFW_KEY_S)
|
||||
Keys.S = state;
|
||||
else if(btn == GLFW_KEY_D)
|
||||
Keys.D = state;
|
||||
else if(btn == GLFW_KEY_LEFT_SHIFT)
|
||||
Keys.SHIFT = state;
|
||||
else if(btn == GLFW_KEY_SPACE)
|
||||
Keys.SPACE = state;
|
||||
else if(btn == GLFW_KEY_LEFT_CONTROL)
|
||||
Keys.CTRL = state;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,17 +221,62 @@ void ServerSession::onJoystick() {
|
||||
void ServerSession::atFreeDrawTime(GlobalTime gTime, float dTime) {
|
||||
GTime = gTime;
|
||||
|
||||
Pos += glm::vec3(Speed) * dTime;
|
||||
Speed -= glm::dvec3(Speed) * double(dTime);
|
||||
|
||||
glm::mat4 rot(1);
|
||||
float deltaTime = 1-std::min<float>(gTime-PYR_At, 1/PYR_TIME_DELTA)*PYR_TIME_DELTA;
|
||||
rot = glm::rotate(rot, PYR.y-deltaTime*PYR_Offset.y, {0, 1, 0});
|
||||
|
||||
float mltpl = 16*dTime*Pos::Object_t::BS;
|
||||
if(Keys.CTRL)
|
||||
mltpl *= 16;
|
||||
|
||||
Speed += glm::vec3(rot*glm::vec4(0, 0, 1, 1)*float(Keys.W))*mltpl;
|
||||
Speed += glm::vec3(rot*glm::vec4(-1, 0, 0, 1)*float(Keys.A))*mltpl;
|
||||
Speed += glm::vec3(rot*glm::vec4(0, 0, -1, 1)*float(Keys.S))*mltpl;
|
||||
Speed += glm::vec3(rot*glm::vec4(1, 0, 0, 1)*float(Keys.D))*mltpl;
|
||||
Speed += glm::vec3(0, -1, 0)*float(Keys.SHIFT)*mltpl;
|
||||
Speed += glm::vec3(0, 1, 0)*float(Keys.SPACE)*mltpl;
|
||||
|
||||
{
|
||||
std::unordered_map<WorldId_c, std::tuple<std::unordered_set<Pos::GlobalChunk>, std::unordered_set<Pos::GlobalChunk>>> changeOrAddList_removeList;
|
||||
|
||||
// Пакеты
|
||||
ParsedPacket *pack;
|
||||
while(NetInputPackets.pop(pack)) {
|
||||
if(pack->Level1 == ToClient::L1::Content && ToClient::L2Content(pack->Level2) == ToClient::L2Content::ChunkVoxels) {
|
||||
PP_Content_ChunkVoxels &p = *dynamic_cast<PP_Content_ChunkVoxels*>(pack);
|
||||
Pos::GlobalRegion rPos(p.Pos.X >> 4, p.Pos.Y >> 4, p.Pos.Z >> 4);
|
||||
Pos::Local16_u cPos(p.Pos.X & 0xf, p.Pos.Y & 0xf, p.Pos.Z & 0xf);
|
||||
External.Worlds[p.Id].Regions[rPos].Chunks[cPos].Voxels = std::move(p.Cubes);
|
||||
|
||||
auto &pair = changeOrAddList_removeList[p.Id];
|
||||
std::get<0>(pair).insert(p.Pos);
|
||||
}
|
||||
|
||||
delete pack;
|
||||
}
|
||||
|
||||
if(RS && !changeOrAddList_removeList.empty()) {
|
||||
for(auto &pair : changeOrAddList_removeList) {
|
||||
RS->onChunksChange(pair.first, std::get<0>(pair.second), std::get<1>(pair.second));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!RS)
|
||||
return;
|
||||
|
||||
// Расчёт камеры
|
||||
{
|
||||
float deltaTime = 1-std::min<float>(gTime-PYR_At, 1/PYR_TIME_DELTA)*PYR_TIME_DELTA;
|
||||
glm::quat quat =
|
||||
glm::angleAxis(PYR.x-deltaTime*PYR_Offset.x, glm::vec3(1.f, 0.f, 0.f))
|
||||
* glm::angleAxis(PYR.y-deltaTime*PYR_Offset.y, glm::vec3(0.f, 1.f, 0.f));
|
||||
|
||||
RS->setCameraPos(0, {0, 0, 0}, quat);
|
||||
glm::quat quat =
|
||||
glm::angleAxis(PYR.x-deltaTime*PYR_Offset.x, glm::vec3(-1.f, 0.f, 0.f))
|
||||
* glm::angleAxis(PYR.y-deltaTime*PYR_Offset.y, glm::vec3(0.f, -1.f, 0.f));
|
||||
|
||||
RS->setCameraPos(0, Pos, quat);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,6 +457,7 @@ coro<> ServerSession::rP_Content(Net::AsyncSocket &sock) {
|
||||
Pos::GlobalChunk pos = *(Pos::GlobalChunk*) &posKey;
|
||||
|
||||
std::vector<VoxelCube> cubes(co_await sock.read<uint16_t>());
|
||||
uint16_t debugCubesCount = cubes.size();
|
||||
|
||||
for(size_t iter = 0; iter < cubes.size(); iter++) {
|
||||
VoxelCube &cube = cubes[iter];
|
||||
@@ -409,7 +480,7 @@ coro<> ServerSession::rP_Content(Net::AsyncSocket &sock) {
|
||||
|
||||
while(!NetInputPackets.push(packet));
|
||||
|
||||
LOG.info() << "Приняты воксели чанка " << int(wcId) << " / " << pos.X << ":" << pos.Y << ":" << pos.Z << " Вокселей " << cubes.size();
|
||||
LOG.info() << "Приняты воксели чанка " << int(wcId) << " / " << pos.X << ":" << pos.Y << ":" << pos.Z << " Вокселей " << debugCubesCount;
|
||||
|
||||
co_return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user