Compare commits
59 Commits
MeshOptimi
...
sqc-20_aud
Author | SHA1 | Date | |
---|---|---|---|
|
18a5d98c57 | ||
|
81240c6f70 | ||
|
f1ddd67655 | ||
|
a054a7bff1 | ||
|
b712c950c6 | ||
|
9cbf20ba21 | ||
|
3f774d7c2e | ||
|
f2095f6e5b | ||
|
93062e49e2 | ||
|
c85f7df15e | ||
|
6668127f15 | ||
|
54c25e6f78 | ||
|
bf164af23b | ||
|
0d948e3a28 | ||
|
b97890fff3 | ||
|
432b8545a7 | ||
|
54e2f32aba | ||
|
90fdc8ed1b | ||
|
47906776c8 | ||
|
cddc59d6cf | ||
|
965e78309e | ||
|
0452920697 | ||
|
fa9f0a3a8a | ||
|
43f3ce1428 | ||
|
8be8852596 | ||
|
8b3baa9063 | ||
|
bfda5e8948 | ||
|
aacb3b4ceb | ||
|
09dd3d332f | ||
|
ef8a050545 | ||
|
033365c961 | ||
|
ace555a93e | ||
|
6bea176979 | ||
|
2532dfb258 | ||
|
954b976f27 | ||
|
180fd39f2e | ||
|
7e043eb9f8 | ||
|
df52d4a084 | ||
|
7eabee38ad | ||
|
4dbcb08a11 | ||
|
8bc74624c3 | ||
|
3ff2634e51 | ||
|
4c2e8a12ad | ||
|
d96c2a45c2 | ||
|
f0912614a4 | ||
|
421632a0d7 | ||
|
e685396589 | ||
|
15d3864e4a | ||
|
47d7fbfc27 | ||
|
035436c639 | ||
|
20d15a1559 | ||
|
6b2f7face7 | ||
|
1a215c823b | ||
|
9a0f162f33 | ||
|
2bb55e5bf6 | ||
|
51b0795c62 | ||
|
703b432fb7 | ||
|
b7ca0253ca | ||
|
c3058070e5 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -373,3 +373,8 @@ FodyWeavers.xsd
|
||||
/x64/Release/SQCSim2023.exe
|
||||
/x64/Debug/SQCSim2023.exe
|
||||
/x64/Debug/SQCSim2021.pdb
|
||||
/SQCSim-srv/cmake/*
|
||||
!/SQCSim-srv/cmake/CMakeLists.txt
|
||||
/SQCSim2021/cmake/*
|
||||
!/SQCSim2021/cmake/CMakeLists.txt
|
||||
/SQCSim2021/SQCSim-client
|
||||
|
BIN
Debug/glew32.dll
BIN
Debug/glew32.dll
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
158
SQCSim-common/SQCSim-common.vcxproj
Normal file
158
SQCSim-common/SQCSim-common.vcxproj
Normal file
@@ -0,0 +1,158 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>17.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{ee91ab12-4225-4a4d-931d-69d72f6d91fb}</ProjectGuid>
|
||||
<RootNamespace>SQCSimcommon</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="array2d.h" />
|
||||
<ClInclude Include="array3d.h" />
|
||||
<ClInclude Include="blockinfo.h" />
|
||||
<ClInclude Include="bullet.h" />
|
||||
<ClInclude Include="chunk.h" />
|
||||
<ClInclude Include="define.h" />
|
||||
<ClInclude Include="matrix4.h" />
|
||||
<ClInclude Include="opensimplex.h" />
|
||||
<ClInclude Include="player.h" />
|
||||
<ClInclude Include="netprotocol.h" />
|
||||
<ClInclude Include="transformation.h" />
|
||||
<ClInclude Include="vector3.h" />
|
||||
<ClInclude Include="world.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="blockinfo.cpp" />
|
||||
<ClCompile Include="bullet.cpp" />
|
||||
<ClCompile Include="chunk.cpp" />
|
||||
<ClCompile Include="netprotocol.cpp" />
|
||||
<ClCompile Include="opensimplex.cpp" />
|
||||
<ClCompile Include="player.cpp" />
|
||||
<ClCompile Include="transformation.cpp" />
|
||||
<ClCompile Include="world.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
84
SQCSim-common/SQCSim-common.vcxproj.filters
Normal file
84
SQCSim-common/SQCSim-common.vcxproj.filters
Normal file
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Fichiers sources">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers d%27en-tête">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers de ressources">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="world.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="player.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="opensimplex.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="array2d.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="array3d.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="blockinfo.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="bullet.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="chunk.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="define.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="matrix4.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vector3.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="netprotocol.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="transformation.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="world.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="blockinfo.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="bullet.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="chunk.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="opensimplex.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="player.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="netprotocol.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="transformation.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@@ -1,15 +1,15 @@
|
||||
#include "bullet.h"
|
||||
#include "world.h"
|
||||
|
||||
Bullet::Bullet(Player& player) {
|
||||
m_startpos = m_currentpos = player.GetPOV() + player.GetDirection();
|
||||
m_velocity = player.GetDirection();
|
||||
}
|
||||
Bullet::Bullet(Vector3f pos, Vector3f dir) : m_startpos(pos), m_currentpos(pos), m_velocity(dir) {}
|
||||
|
||||
Bullet::Bullet(Vector3f pos, Vector3f dir, uint64_t tid): m_startpos(pos), m_currentpos(pos), m_velocity(dir), m_tid(tid) {}
|
||||
|
||||
Bullet::~Bullet() {}
|
||||
|
||||
bool Bullet::Update(World* world, Transformation& tran, float elapsedtime) {
|
||||
for (int x = 0; x < 1000; ++x) {
|
||||
bool Bullet::Update(World* world, float elapsedtime, int perframe) {
|
||||
int max = 100 / perframe;
|
||||
for (int x = 0; x < max; ++x) {
|
||||
m_currentpos += m_velocity * elapsedtime;
|
||||
|
||||
if (!world->ChunkAt(m_currentpos))
|
||||
@@ -30,3 +30,15 @@ void Bullet::Transpose(int& x, int& z) {
|
||||
m_startpos.x -= x * CHUNK_SIZE_X;
|
||||
m_startpos.z -= z * CHUNK_SIZE_Z;
|
||||
}
|
||||
|
||||
Vector3f Bullet::getPos() const {
|
||||
return m_currentpos;
|
||||
}
|
||||
|
||||
Vector3f Bullet::getVel() const {
|
||||
return m_velocity;
|
||||
}
|
||||
|
||||
uint64_t Bullet::getTeamID(){
|
||||
return m_tid;
|
||||
}
|
29
SQCSim-common/bullet.h
Normal file
29
SQCSim-common/bullet.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#ifndef BULLET_H__
|
||||
#define BULLET_H__
|
||||
|
||||
#include "define.h"
|
||||
#include "vector3.h"
|
||||
|
||||
class World;
|
||||
|
||||
class Bullet {
|
||||
public:
|
||||
Bullet(Vector3f pos, Vector3f dir);
|
||||
Bullet(Vector3f pos, Vector3f dir, uint64_t tid);
|
||||
~Bullet();
|
||||
|
||||
bool Update(World* world, float elapsedtime, int perframe);
|
||||
void Transpose(int& x, int& z);
|
||||
Vector3f getPos() const;
|
||||
Vector3f getVel() const;
|
||||
uint64_t getTeamID();
|
||||
|
||||
private:
|
||||
Vector3f m_startpos,
|
||||
m_currentpos,
|
||||
m_velocity;
|
||||
uint64_t m_tid = 0;
|
||||
};
|
||||
|
||||
#endif // BULLET_H__
|
||||
|
142
SQCSim-common/chunk.cpp
Normal file
142
SQCSim-common/chunk.cpp
Normal file
@@ -0,0 +1,142 @@
|
||||
#include "chunk.h"
|
||||
#include "world.h"
|
||||
|
||||
Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y) {
|
||||
//std::ostringstream pos; // V<>rifie l'existence d'un fichier .chunk avec sa position.
|
||||
//pos << CHUNK_PATH << x << '_' << y << ".chunk";
|
||||
//std::ifstream input(pos.str(), std::fstream::binary);
|
||||
|
||||
//if (input.fail()) {
|
||||
OpenSimplexNoise::Noise simplex = OpenSimplexNoise::Noise(seed);
|
||||
m_blocks.Reset(BTYPE_AIR);
|
||||
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Montagnes
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
float xnoiz, ynoiz;
|
||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 4096.;
|
||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 4096.;
|
||||
double height = 0;
|
||||
for (int x = 0; x < 39; ++x) {
|
||||
height += simplex.eval(xnoiz, ynoiz);
|
||||
height *= .79;
|
||||
xnoiz *= 1.139;
|
||||
ynoiz *= 1.139;
|
||||
}
|
||||
height = height * 2000. * simplex.eval((double)(ix + x * CHUNK_SIZE_X) / 512., (double)(iz + y * CHUNK_SIZE_Z) / 512.);
|
||||
height /= (CHUNK_SIZE_Y / 1.9);
|
||||
height += 15.;
|
||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy)
|
||||
SetBlock(ix, iy, iz, BTYPE_METAL, nullptr);
|
||||
}
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Collines
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
float xnoiz, ynoiz;
|
||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 512.;
|
||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 512.;
|
||||
float height = simplex.eval(xnoiz, ynoiz) * 50.f;// +1.f;
|
||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy) {
|
||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
SetBlock(ix, iy, iz, BTYPE_GRASS, nullptr);
|
||||
}
|
||||
}
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Lacs"
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
for (int iy = 0; iy < 13; ++iy) {
|
||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
SetBlock(ix, iy, iz, BTYPE_ICE, nullptr);
|
||||
}
|
||||
}
|
||||
//for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Arbres"
|
||||
// for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
// float xnoiz, ynoiz;
|
||||
// xnoiz = (double)(iz * CHUNK_SIZE_Y + x * CHUNK_SIZE_X) / 256.;
|
||||
// ynoiz = (double)(ix * CHUNK_SIZE_Y + y * CHUNK_SIZE_Z) / 256.;
|
||||
// bool tree = (int)(abs(simplex.eval(xnoiz, ynoiz)) * 17933.f) % CHUNK_SIZE_Y > 126 ? true : false;
|
||||
// for (int iy = 0; iy < CHUNK_SIZE_Y - 10; ++iy)
|
||||
// if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
// if (GetBlock(ix, iy - 1, iz) == BTYPE_GRASS)
|
||||
// if (tree) {
|
||||
// for (int i = 0; i < (int)(abs(simplex.eval(xnoiz, ynoiz) * 4)) % 42 + 1; ++i)
|
||||
// SetBlock(ix, iy + i, iz, BTYPE_DIRT, nullptr);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
/* }
|
||||
else {
|
||||
input.seekg(0, std::ios_base::end);
|
||||
int size = input.tellg();
|
||||
input.seekg(0, std::ios_base::beg);
|
||||
|
||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||
input.read(data, size);
|
||||
input.close();
|
||||
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix)
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz)
|
||||
for (int iy = 0; iy < CHUNK_SIZE_Y; ++iy)
|
||||
m_blocks.Set(ix, iy, iz, data[ix + (iz * CHUNK_SIZE_X) + (iy * CHUNK_SIZE_Z * CHUNK_SIZE_X)]);
|
||||
}*/
|
||||
}
|
||||
|
||||
Chunk::~Chunk() {
|
||||
/*if (m_isModified) {
|
||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||
|
||||
for (int x = 0; x < CHUNK_SIZE_X; ++x)
|
||||
for (int z = 0; z < CHUNK_SIZE_Z; ++z)
|
||||
for (int y = 0; y < CHUNK_SIZE_Y; ++y)
|
||||
data[x + (z * CHUNK_SIZE_X) + (y * CHUNK_SIZE_Z * CHUNK_SIZE_X)] = (char)GetBlock(x, y, z);
|
||||
|
||||
std::ostringstream pos;
|
||||
pos << CHUNK_PATH << m_posX << '_' << m_posY << ".chunk";
|
||||
|
||||
std::ofstream output(pos.str(), std::fstream::binary);
|
||||
output.write(data, sizeof(data));
|
||||
output.close();
|
||||
}*/
|
||||
}
|
||||
|
||||
void Chunk::RemoveBlock(int x, int y, int z, World* world) {
|
||||
m_blocks.Set(x, y, z, BTYPE_AIR);
|
||||
CheckNeighbors(x, y, world);
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
|
||||
m_blocks.Set(x, y, z, type);
|
||||
if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas v<>rifier les chunks voisines.
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
BlockType Chunk::GetBlock(int x, int y, int z) { return m_blocks.Get(x, y, z); }
|
||||
|
||||
void Chunk::CheckNeighbors(unsigned int x, unsigned int z, World* world) {
|
||||
unsigned int cx, cy;
|
||||
|
||||
world->GetScope(cx, cy);
|
||||
|
||||
if (x == 0 && m_posX - cx >= 0 &&
|
||||
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
||||
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X &&
|
||||
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z))
|
||||
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
|
||||
if (z == 0 && m_posY - cy >= 0 &&
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z))
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y &&
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z))
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
}
|
||||
|
||||
void Chunk::GetPosition(unsigned int& x, unsigned int& y) const { x = m_posX; y = m_posY; }
|
||||
|
||||
bool Chunk::IsDirty() const { return m_isDirty; }
|
||||
|
||||
void Chunk::MakeDirty() { m_isDirty = true; }
|
||||
|
||||
void Chunk::MakeClean() { m_isDirty = false; }
|
||||
|
||||
void Chunk::MakeModified() { m_isModified = true; }
|
||||
|
37
SQCSim-common/chunk.h
Normal file
37
SQCSim-common/chunk.h
Normal file
@@ -0,0 +1,37 @@
|
||||
#ifndef CHUNK_H__
|
||||
#define CHUNK_H__
|
||||
|
||||
#include "define.h"
|
||||
#include "array2d.h"
|
||||
#include "array3d.h"
|
||||
#include "blockinfo.h"
|
||||
#include "opensimplex.h"
|
||||
|
||||
class World;
|
||||
|
||||
class Chunk {
|
||||
private:
|
||||
Array3d<BlockType> m_blocks = Array3d<BlockType>(CHUNK_SIZE_X, CHUNK_SIZE_Y, CHUNK_SIZE_Z);
|
||||
bool m_isDirty = true;
|
||||
bool m_isModified = false;
|
||||
|
||||
unsigned int m_posX; // Position du chunk dans l'array constituant le monde.
|
||||
unsigned int m_posY;
|
||||
|
||||
public:
|
||||
Chunk(unsigned int x, unsigned int y, int64_t seed);
|
||||
~Chunk();
|
||||
|
||||
void RemoveBlock(int x, int y, int z, World* world);
|
||||
void SetBlock(int x, int y, int z, BlockType type, World* world);
|
||||
BlockType GetBlock(int x, int y, int z);
|
||||
void CheckNeighbors(unsigned int x, unsigned int z, World* world);
|
||||
void GetPosition(unsigned int& x, unsigned int& y) const;
|
||||
|
||||
bool IsDirty() const;
|
||||
void MakeDirty();
|
||||
void MakeClean();
|
||||
void MakeModified();
|
||||
};
|
||||
|
||||
#endif // CHUNK_H__
|
65
SQCSim-common/define.h
Normal file
65
SQCSim-common/define.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#ifndef DEFINE_H__
|
||||
#define DEFINE_H__
|
||||
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
|
||||
#define SRV_PORT 1025
|
||||
#define CLI_PORT 1026
|
||||
|
||||
#define CHUNK_SIZE_X 4
|
||||
#define CHUNK_SIZE_Y 64
|
||||
#define CHUNK_SIZE_Z 4
|
||||
#define MAX_SELECTION_DISTANCE 5
|
||||
#define SEED 0
|
||||
#define COUNTDOWN 300
|
||||
|
||||
#define WORLD_SIZE_X 64
|
||||
#define WORLD_SIZE_Y 64
|
||||
|
||||
#define FRAMES_RENDER_CHUNKS 1
|
||||
#define FRAMES_UPDATE_CHUNKS 1
|
||||
#define FRAMES_DELETE_CHUNKS 1
|
||||
|
||||
#define THREADS_GENERATE_CHUNKS 8
|
||||
#define THREADS_UPDATE_CHUNKS 6
|
||||
#define THREADS_DELETE_CHUNKS 3
|
||||
|
||||
#define VIEW_DISTANCE 512 // Si les chunks arr<72>tent de s'afficher pendant une game et qu'il y a un access violation quand tu quitte, il faut augmenter ce chiffre.
|
||||
#define TEXTURE_SIZE 512
|
||||
#define MAX_BULLETS 512
|
||||
|
||||
typedef uint8_t BlockType;
|
||||
enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_LAST };
|
||||
typedef uint64_t Timestamp;
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#pragma comment(lib,"wsock32.lib") // Pour pouvoir faire fonctionner le linker sans le vcxproject
|
||||
#pragma comment(lib,"ws2_32.lib")
|
||||
#include <ws2tcpip.h>
|
||||
#include <Windows.h>
|
||||
#include <cstdio>
|
||||
#include <ctime>
|
||||
|
||||
#define popen _popen
|
||||
#define pclose _pclose
|
||||
|
||||
#else // Pas _WIN32
|
||||
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <cstring>
|
||||
|
||||
#define SOCKET int
|
||||
#define INVALID_SOCKET -1
|
||||
#define closesocket close
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
|
||||
#endif // DEFINE_H__
|
506
SQCSim-common/netprotocol.cpp
Normal file
506
SQCSim-common/netprotocol.cpp
Normal file
@@ -0,0 +1,506 @@
|
||||
#include "netprotocol.h"
|
||||
|
||||
void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::INPUT;
|
||||
|
||||
uint64_t time = in->timestamp;
|
||||
uint8_t time8[sizeof(uint64_t)] = {(time >> 56) & 0xFF,
|
||||
(time >> 48) & 0xFF,
|
||||
(time >> 40) & 0xFF,
|
||||
(time >> 32) & 0xFF,
|
||||
(time >> 24) & 0xFF,
|
||||
(time >> 16) & 0xFF,
|
||||
(time >> 8 ) & 0xFF,
|
||||
time & 0xFF};
|
||||
|
||||
memcpy(*buf + 1, time8, sizeof(uint64_t));
|
||||
|
||||
uint64_t sid = in->sid;
|
||||
uint8_t sid8[sizeof(uint64_t)] = {(sid >> 56) & 0xFF,
|
||||
(sid >> 48) & 0xFF,
|
||||
(sid >> 40) & 0xFF,
|
||||
(sid >> 32) & 0xFF,
|
||||
(sid >> 24) & 0xFF,
|
||||
(sid >> 16) & 0xFF,
|
||||
(sid >> 8 ) & 0xFF,
|
||||
sid & 0xFF};
|
||||
|
||||
memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t));
|
||||
|
||||
Keys keys = in->keys;
|
||||
uint8_t keys8 = // Reste un bit.
|
||||
keys.forward & 0b10000000 |
|
||||
keys.backward & 0b01000000 |
|
||||
keys.left & 0b00100000 |
|
||||
keys.right & 0b00010000 |
|
||||
keys.jump & 0b00001000 |
|
||||
keys.shoot & 0b00000100 |
|
||||
keys.block & 0b00000010 ;
|
||||
|
||||
memcpy(*buf + sizeof(uint64_t) + 2, &keys8, sizeof(uint8_t));
|
||||
|
||||
uint32_t vec[3];
|
||||
memcpy(vec, &in->direction, sizeof(Vector3f)); // Pour d<>naturer les floats.
|
||||
|
||||
uint8_t vec8[3 * sizeof(uint32_t)] = {
|
||||
(vec[0] >> 24) & 0xFF,
|
||||
(vec[0] >> 16) & 0xFF,
|
||||
(vec[0] >> 8) & 0xFF,
|
||||
vec[0] & 0xFF,
|
||||
(vec[1] >> 24) & 0xFF,
|
||||
(vec[1] >> 16) & 0xFF,
|
||||
(vec[1] >> 8) & 0xFF,
|
||||
vec[1] & 0xFF,
|
||||
(vec[2] >> 24) & 0xFF,
|
||||
(vec[2] >> 16) & 0xFF,
|
||||
(vec[2] >> 8) & 0xFF,
|
||||
vec[2] & 0xFF};
|
||||
|
||||
memcpy(*buf + sizeof(uint64_t) + 3, vec8, sizeof(uint32_t) * 3);
|
||||
|
||||
*buflen = sizeof(uint64_t) + 3 + sizeof(uint32_t) * 3;
|
||||
}
|
||||
|
||||
void netprot::Serialize(Output* out, char* buf[], uint32_t* buflen) {
|
||||
|
||||
}
|
||||
|
||||
void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) {
|
||||
|
||||
}
|
||||
|
||||
void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::TEAMINF;
|
||||
|
||||
size_t namesize = std::strlen(tinfo->name) + 1;
|
||||
|
||||
memcpy(*buf + 1, &tinfo->name, namesize);
|
||||
uint64_t tid = tinfo->id;
|
||||
uint8_t tid8[sizeof(uint64_t)] = {
|
||||
(tid >> 56) & 0xFF,
|
||||
(tid >> 48) & 0xFF,
|
||||
(tid >> 40) & 0xFF,
|
||||
(tid >> 32) & 0xFF,
|
||||
(tid >> 24) & 0xFF,
|
||||
(tid >> 16) & 0xFF,
|
||||
(tid >> 8) & 0xFF,
|
||||
tid & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + namesize + 2, tid8, sizeof(uint64_t));
|
||||
|
||||
*buflen = namesize + sizeof(uint64_t) + 2;
|
||||
}
|
||||
|
||||
void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::LOGINF;
|
||||
|
||||
size_t namesize = std::strlen(linfo->name) + 1;
|
||||
|
||||
memcpy(*buf + 1, &linfo->name, namesize);
|
||||
uint64_t sid = linfo->sid;
|
||||
uint8_t sid8[sizeof(uint64_t)] = {
|
||||
(sid >> 56) & 0xFF,
|
||||
(sid >> 48) & 0xFF,
|
||||
(sid >> 40) & 0xFF,
|
||||
(sid >> 32) & 0xFF,
|
||||
(sid >> 24) & 0xFF,
|
||||
(sid >> 16) & 0xFF,
|
||||
(sid >> 8) & 0xFF,
|
||||
sid & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + namesize + 2, sid8, sizeof(uint64_t));
|
||||
|
||||
uint64_t tid = linfo->tid;
|
||||
uint8_t tid8[sizeof(uint64_t)] = {
|
||||
(tid >> 56) & 0xFF,
|
||||
(tid >> 48) & 0xFF,
|
||||
(tid >> 40) & 0xFF,
|
||||
(tid >> 32) & 0xFF,
|
||||
(tid >> 24) & 0xFF,
|
||||
(tid >> 16) & 0xFF,
|
||||
(tid >> 8) & 0xFF,
|
||||
tid & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t));
|
||||
|
||||
*buflen = namesize + sizeof(uint64_t) * 2 + 2;
|
||||
}
|
||||
|
||||
void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::PLAYINF;
|
||||
|
||||
size_t namesize = std::strlen(pinfo->name) + 1;
|
||||
|
||||
memcpy(*buf + 1, &pinfo->name, namesize);
|
||||
uint64_t id = pinfo->id;
|
||||
uint8_t id8[sizeof(uint64_t)] = {
|
||||
(id >> 56) & 0xFF,
|
||||
(id >> 48) & 0xFF,
|
||||
(id >> 40) & 0xFF,
|
||||
(id >> 32) & 0xFF,
|
||||
(id >> 24) & 0xFF,
|
||||
(id >> 16) & 0xFF,
|
||||
(id >> 8) & 0xFF,
|
||||
id & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + namesize + 2, id8, sizeof(uint64_t));
|
||||
|
||||
uint64_t tid = pinfo->tid;
|
||||
uint8_t tid8[sizeof(uint64_t)] = {
|
||||
(tid >> 56) & 0xFF,
|
||||
(tid >> 48) & 0xFF,
|
||||
(tid >> 40) & 0xFF,
|
||||
(tid >> 32) & 0xFF,
|
||||
(tid >> 24) & 0xFF,
|
||||
(tid >> 16) & 0xFF,
|
||||
(tid >> 8) & 0xFF,
|
||||
tid & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t));
|
||||
|
||||
*buflen = namesize + sizeof(uint64_t) * 2 + 2;
|
||||
}
|
||||
|
||||
void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::GAMEINFO;
|
||||
|
||||
uint64_t game = ginfo->seed;
|
||||
uint8_t seed8[sizeof(uint64_t)] = {
|
||||
(game >> 56) & 0xFF,
|
||||
(game >> 48) & 0xFF,
|
||||
(game >> 40) & 0xFF,
|
||||
(game >> 32) & 0xFF,
|
||||
(game >> 24) & 0xFF,
|
||||
(game >> 16) & 0xFF,
|
||||
(game >> 8) & 0xFF,
|
||||
game & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + 1, seed8, sizeof(uint64_t));
|
||||
|
||||
game = ginfo->countdown;
|
||||
uint8_t count8[sizeof(uint64_t)] = {
|
||||
(game >> 56) & 0xFF,
|
||||
(game >> 48) & 0xFF,
|
||||
(game >> 40) & 0xFF,
|
||||
(game >> 32) & 0xFF,
|
||||
(game >> 24) & 0xFF,
|
||||
(game >> 16) & 0xFF,
|
||||
(game >> 8) & 0xFF,
|
||||
game & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + sizeof(uint64_t) + 1, count8, sizeof(uint64_t));
|
||||
|
||||
game = ginfo->countdown;
|
||||
uint8_t gtype8[sizeof(uint64_t)] = {
|
||||
(game >> 56) & 0xFF,
|
||||
(game >> 48) & 0xFF,
|
||||
(game >> 40) & 0xFF,
|
||||
(game >> 32) & 0xFF,
|
||||
(game >> 24) & 0xFF,
|
||||
(game >> 16) & 0xFF,
|
||||
(game >> 8) & 0xFF,
|
||||
game & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + sizeof(uint64_t) + 1, gtype8, sizeof(uint64_t));
|
||||
|
||||
*buflen = sizeof(uint64_t) * 3 + 1;
|
||||
}
|
||||
|
||||
void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::CHAT;
|
||||
|
||||
uint64_t src = chat->src_id;
|
||||
uint8_t src8[sizeof(uint64_t)] = {
|
||||
(src >> 56) & 0xFF,
|
||||
(src >> 48) & 0xFF,
|
||||
(src >> 40) & 0xFF,
|
||||
(src >> 32) & 0xFF,
|
||||
(src >> 24) & 0xFF,
|
||||
(src >> 16) & 0xFF,
|
||||
(src >> 8) & 0xFF,
|
||||
src & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + 1, src8, sizeof(uint64_t));
|
||||
|
||||
uint64_t dst = chat->dest_id;
|
||||
uint8_t dst8[sizeof(uint64_t)] = {
|
||||
(dst >> 56) & 0xFF,
|
||||
(dst >> 48) & 0xFF,
|
||||
(dst >> 40) & 0xFF,
|
||||
(dst >> 32) & 0xFF,
|
||||
(dst >> 24) & 0xFF,
|
||||
(dst >> 16) & 0xFF,
|
||||
(dst >> 8) & 0xFF,
|
||||
dst & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + 1 + sizeof(uint64_t), dst8, sizeof(uint64_t));
|
||||
|
||||
uint64_t dstteam = chat->dest_id;
|
||||
uint8_t dstt8[sizeof(uint64_t)] = {
|
||||
(dstteam >> 56) & 0xFF,
|
||||
(dstteam >> 48) & 0xFF,
|
||||
(dstteam >> 40) & 0xFF,
|
||||
(dstteam >> 32) & 0xFF,
|
||||
(dstteam >> 24) & 0xFF,
|
||||
(dstteam >> 16) & 0xFF,
|
||||
(dstteam >> 8) & 0xFF,
|
||||
dstteam & 0xFF
|
||||
};
|
||||
|
||||
memcpy(*buf + 1 + sizeof(uint64_t) * 2, dstt8, sizeof(uint64_t));
|
||||
|
||||
size_t messize = std::strlen(chat->mess) + 1;
|
||||
|
||||
memcpy(*buf + 1 + sizeof(uint64_t) * 3, &chat->mess, messize);
|
||||
|
||||
*buflen = messize + sizeof(uint64_t) * 3 + 2;
|
||||
}
|
||||
|
||||
void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) {
|
||||
*buf[0] = netprot::PACKET_TYPE::ERRLOG;
|
||||
|
||||
size_t messize = std::strlen(errlog->mess) + 1;
|
||||
|
||||
memcpy(*buf + 1, &errlog->mess, messize);
|
||||
|
||||
memcpy(*buf + 1 + messize, &errlog->is_fatal, sizeof(bool));
|
||||
|
||||
*buflen = messize + sizeof(bool) + 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(Output* out, char* buf, const uint32_t buflen) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(Sync* sync, char* buf, const uint32_t buflen) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(LoginInfo))
|
||||
return false;
|
||||
|
||||
size_t namesize = std::strlen(buf) + 1;
|
||||
|
||||
if (namesize > 32)
|
||||
return false;
|
||||
|
||||
memcpy(&tinfo->name, &buf[1], namesize);
|
||||
|
||||
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(diff, &buf[namesize + 1], sizeof(uint64_t));
|
||||
tinfo->id =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(LoginInfo))
|
||||
return false;
|
||||
|
||||
size_t namesize = std::strlen(buf) + 1;
|
||||
|
||||
if (namesize > 32)
|
||||
return false;
|
||||
|
||||
memcpy(&linfo->name, &buf[1], namesize);
|
||||
|
||||
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(diff, &buf[namesize + 1], sizeof(uint64_t));
|
||||
linfo->sid =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
memcpy(diff, &buf[namesize + sizeof(uint64_t) + 1], sizeof(uint64_t));
|
||||
linfo->tid =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(PlayerInfo))
|
||||
return false;
|
||||
|
||||
size_t namesize = std::strlen(buf) + 1;
|
||||
|
||||
if (namesize > 32)
|
||||
return false;
|
||||
|
||||
memcpy(&pinfo->name, &buf[1], namesize);
|
||||
|
||||
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(diff, &buf[namesize + 1], sizeof(uint64_t));
|
||||
pinfo->id =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
memcpy(diff, &buf[namesize + sizeof(uint64_t) + 1], sizeof(uint64_t));
|
||||
pinfo->tid =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(GameInfo))
|
||||
return false;
|
||||
|
||||
uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(diff, &buf[1], sizeof(uint64_t));
|
||||
ginfo->seed =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
memcpy(diff, &buf[sizeof(uint64_t) + 1], sizeof(uint64_t));
|
||||
ginfo->countdown =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
memcpy(diff, &buf[sizeof(uint64_t) * 2 + 1], sizeof(uint64_t));
|
||||
ginfo->gameType =
|
||||
(uint64_t)diff[0] << 56 |
|
||||
(uint64_t)diff[1] << 48 |
|
||||
(uint64_t)diff[2] << 40 |
|
||||
(uint64_t)diff[3] << 32 |
|
||||
(uint64_t)diff[4] << 24 |
|
||||
(uint64_t)diff[5] << 16 |
|
||||
(uint64_t)diff[6] << 8 |
|
||||
(uint64_t)diff[7];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(Chat* chat, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(Chat))
|
||||
return false;
|
||||
|
||||
uint8_t src[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(src, &buf[1], sizeof(uint64_t));
|
||||
chat->src_id =
|
||||
(uint64_t)src[0] << 56 |
|
||||
(uint64_t)src[1] << 48 |
|
||||
(uint64_t)src[2] << 40 |
|
||||
(uint64_t)src[3] << 32 |
|
||||
(uint64_t)src[4] << 24 |
|
||||
(uint64_t)src[5] << 16 |
|
||||
(uint64_t)src[6] << 8 |
|
||||
(uint64_t)src[7];
|
||||
|
||||
uint8_t dst[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(dst, &buf[1 + sizeof(uint64_t)], sizeof(uint64_t));
|
||||
chat->dest_id =
|
||||
(uint64_t)dst[0] << 56 |
|
||||
(uint64_t)dst[1] << 48 |
|
||||
(uint64_t)dst[2] << 40 |
|
||||
(uint64_t)dst[3] << 32 |
|
||||
(uint64_t)dst[4] << 24 |
|
||||
(uint64_t)dst[5] << 16 |
|
||||
(uint64_t)dst[6] << 8 |
|
||||
(uint64_t)dst[7];
|
||||
|
||||
uint8_t dstt[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 };
|
||||
memcpy(dstt, &buf[1 + sizeof(uint64_t) * 2], sizeof(uint64_t));
|
||||
chat->dest_team_id =
|
||||
(uint64_t)dstt[0] << 56 |
|
||||
(uint64_t)dstt[1] << 48 |
|
||||
(uint64_t)dstt[2] << 40 |
|
||||
(uint64_t)dstt[3] << 32 |
|
||||
(uint64_t)dstt[4] << 24 |
|
||||
(uint64_t)dstt[5] << 16 |
|
||||
(uint64_t)dstt[6] << 8 |
|
||||
(uint64_t)dstt[7];
|
||||
|
||||
size_t messsize = std::strlen(buf + sizeof(uint64_t) * 3) + 1;
|
||||
|
||||
if (messsize > 140)
|
||||
return false;
|
||||
|
||||
memcpy(&chat->mess, &buf[1 + sizeof(uint64_t) * 3], messsize);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool netprot::Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen) {
|
||||
if (buflen <= sizeof(ErrorLog))
|
||||
return false;
|
||||
|
||||
size_t messsize = std::strlen(buf) + 1;
|
||||
|
||||
if (messsize > 140)
|
||||
return false;
|
||||
|
||||
memcpy(&errlog->mess, &buf[1], messsize);
|
||||
memcpy(&errlog->is_fatal, &buf[1 + messsize], sizeof(bool));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
netprot::PacketType netprot::getType(char* buf, const uint32_t buflen) {
|
||||
if (buflen < 1 ||
|
||||
buf[0] >= netprot::PACKET_TYPE::LAST_PACK ||
|
||||
buf[0] <= netprot::PACKET_TYPE::ERR)
|
||||
return netprot::PACKET_TYPE::ERR;
|
||||
return buf[0];
|
||||
}
|
120
SQCSim-common/netprotocol.h
Normal file
120
SQCSim-common/netprotocol.h
Normal file
@@ -0,0 +1,120 @@
|
||||
#ifndef NETPROTOCOL_H__
|
||||
#define NETPROTOCOL_H__
|
||||
|
||||
#include "define.h"
|
||||
#include <string>
|
||||
#include "vector3.h"
|
||||
|
||||
/* Protocole Particulier de Partie <20> Plusieurs Personnes (PPPPP) */
|
||||
|
||||
// Packet: packet[0] = PacketType, packet[1..n-1] = {packet}
|
||||
|
||||
namespace netprot {
|
||||
typedef uint8_t PacketType;
|
||||
enum PACKET_TYPE {
|
||||
ERR, INPUT, OUTPUT, SYNC,
|
||||
TEAMINF, SELFINF, PLAYINF, LOGINF,
|
||||
CHUNKMOD, PLAYERMOD, PICKUPMOD,
|
||||
GAMEINFO, ENDINFO , CHAT, ERRLOG,
|
||||
LAST_PACK
|
||||
};
|
||||
|
||||
struct Keys {
|
||||
bool forward,
|
||||
backward,
|
||||
left,
|
||||
right,
|
||||
jump,
|
||||
shoot,
|
||||
block;
|
||||
};
|
||||
|
||||
struct States {
|
||||
bool jumping,
|
||||
shooting,
|
||||
hit,
|
||||
powerup;
|
||||
};
|
||||
|
||||
struct Input { // cli -> srv UDP ~frame
|
||||
Timestamp timestamp;
|
||||
uint64_t sid = 0;
|
||||
Keys keys; // 0bFBLRJS__ bit-packing de bool.
|
||||
Vector3f direction;
|
||||
};
|
||||
|
||||
struct Output { // srv -> cli UDP ~frame
|
||||
Timestamp timestamp;
|
||||
uint64_t id = 0;
|
||||
Vector3f position,
|
||||
direction;
|
||||
States states; // 0bJSH_____ bit-packing de bool.
|
||||
};
|
||||
|
||||
struct Sync { // srv -> cli TCP ~second
|
||||
Timestamp timestamp;
|
||||
uint64_t sid = 0;
|
||||
uint32_t timer = 0;
|
||||
uint16_t ammo = 0;
|
||||
uint8_t hp = 0;
|
||||
Vector3f position;
|
||||
};
|
||||
|
||||
struct TeamInfo { // cli <-> srv TCP once
|
||||
char name[32];
|
||||
uint64_t id = 0;
|
||||
};
|
||||
|
||||
struct LoginInfo { // cli <-> srv TCP once
|
||||
char name[32];
|
||||
uint64_t sid = 0,
|
||||
tid = 0;
|
||||
};
|
||||
|
||||
struct PlayerInfo { // cli <-> srv TCP once
|
||||
char name[32];
|
||||
uint64_t id = 0,
|
||||
tid = 0;
|
||||
};
|
||||
|
||||
struct GameInfo { // cli <-> srv TCP event (before game start)/ once
|
||||
uint64_t seed;
|
||||
uint32_t countdown;
|
||||
uint8_t gameType; // TOOD: enum.
|
||||
};
|
||||
|
||||
struct Chat { // cli <-> srv TCP event
|
||||
uint64_t src_id = 0,
|
||||
dest_id = 0,
|
||||
dest_team_id = 0;
|
||||
char mess[140]; // Good 'nough for twitr, good 'nough for me.
|
||||
};
|
||||
|
||||
struct ErrorLog { // srv -> cli TCP event
|
||||
char mess[140];
|
||||
bool is_fatal;
|
||||
};
|
||||
|
||||
void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli
|
||||
void Serialize(Output* out, char* buf[], uint32_t* buflen); // srv
|
||||
void Serialize(Sync* sync, char* buf[], uint32_t* buflen); // srv
|
||||
void Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen); // cli/srv
|
||||
void Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen); // cli/srv
|
||||
void Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen); // srv
|
||||
void Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen); // cli/srv
|
||||
void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv
|
||||
void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv
|
||||
|
||||
bool Deserialize(Input* in, char* buf, const uint32_t buflen); // srv
|
||||
bool Deserialize(Output* out, char* buf, const uint32_t buflen); // cli
|
||||
bool Deserialize(Sync* sync, char* buf, const uint32_t buflen); // cli
|
||||
bool Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen); // cli/srv
|
||||
bool Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen); // cli/srv
|
||||
bool Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen); // cli
|
||||
bool Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen); // cli
|
||||
bool Deserialize(Chat* chat, char* buf, const uint32_t buflen); // srv/cli
|
||||
bool Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen); // srv
|
||||
|
||||
PacketType getType(char* buf, uint32_t buflen); // srv/cli
|
||||
}
|
||||
#endif
|
@@ -5,7 +5,7 @@ Player::Player(const Vector3f& position, float rotX, float rotY) : m_position(po
|
||||
m_velocity = Vector3f(0, 0, 0);
|
||||
m_airborne = true;
|
||||
m_hp = 0.75f; //TODO: Remettre à 1.0f
|
||||
m_username = "Zelda Bee-Bop";
|
||||
m_username = "Zelda Bee-Bop56";
|
||||
}
|
||||
|
||||
void Player::TurnLeftRight(float value) {
|
||||
@@ -66,8 +66,8 @@ Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jum
|
||||
return delta;
|
||||
}
|
||||
|
||||
void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio* audio) {
|
||||
static irrklang::ISound* step; // Pour les sons de pas.
|
||||
Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime) {
|
||||
Player::Sound snd = Player::Sound::NOSOUND;
|
||||
static float timing = 0.f;
|
||||
/* Gestion de collisions */
|
||||
BlockType bt1, bt2, bt3;
|
||||
@@ -88,7 +88,7 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio
|
||||
if (bt3 != BTYPE_AIR) {
|
||||
m_velocity.y = 0;
|
||||
if (timing == 0.f) {
|
||||
if (m_airborne) audio->Create3DAudioObj(step, AUDIO_PATH "hit.wav", GetPosition(), GetVelocity(), 1.f);
|
||||
if (m_airborne) snd = Player::Sound::FALL;
|
||||
timing = .3f;
|
||||
}
|
||||
m_airborne = false;
|
||||
@@ -112,7 +112,8 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio
|
||||
input.x = m_velocity.x = -0.5f;
|
||||
m_velocity.y = 0.3;
|
||||
m_velocity.z *= .5f;
|
||||
} else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
|
||||
}
|
||||
else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
|
||||
input.x = m_velocity.x = 0;
|
||||
m_velocity.z *= .5f;
|
||||
}
|
||||
@@ -127,7 +128,8 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio
|
||||
input.z = m_velocity.z = -0.5f;
|
||||
m_velocity.y = 0.3;
|
||||
m_velocity.x *= .5f;
|
||||
} else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
|
||||
}
|
||||
else if (bt1 != BTYPE_AIR || bt2 != BTYPE_AIR || bt3 != BTYPE_AIR) {
|
||||
input.z = m_velocity.z = 0;
|
||||
m_velocity.x *= .5f;
|
||||
}
|
||||
@@ -139,10 +141,10 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio
|
||||
m_velocity.x += input.x * 2.f * elapsedTime;
|
||||
m_velocity.z += input.z * 2.f * elapsedTime;
|
||||
|
||||
if (input.x == 0.f)
|
||||
if (input.x == 0.f)
|
||||
m_velocity.x *= .8f;
|
||||
|
||||
if (input.z == 0.f)
|
||||
|
||||
if (input.z == 0.f)
|
||||
m_velocity.z *= .8f;
|
||||
}
|
||||
else {
|
||||
@@ -166,23 +168,20 @@ void Player::ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio
|
||||
static float bobbingtime = 0; // Gestion de la caméra
|
||||
static bool leftright = false;
|
||||
static bool isStep = false;
|
||||
if (bobbingtime <= 360.f)
|
||||
if (bobbingtime <= 360.f)
|
||||
bobbingtime += elapsedTime * 20.f; else bobbingtime = 0;
|
||||
|
||||
|
||||
if ((sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) < -.2f && !m_airborne) {
|
||||
Vector3f vstep;
|
||||
if (leftright)
|
||||
vstep = Vector3f(GetPosition().x + GetDirection().z, GetPosition().y - 1.7f, GetPosition().z + GetDirection().x);
|
||||
else vstep = Vector3f(GetPosition().x - GetDirection().z, GetPosition().y - 1.7f, GetPosition().z - GetDirection().x);
|
||||
if (!isStep) {
|
||||
audio->Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, GetVelocity(), .8f);
|
||||
leftright = !leftright;
|
||||
snd = Player::Sound::STEP;
|
||||
}
|
||||
isStep = true;
|
||||
}
|
||||
else isStep = false;
|
||||
m_POV = m_position.y;
|
||||
m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f;
|
||||
|
||||
return snd;
|
||||
}
|
||||
|
||||
void Player::ApplyTransformation(Transformation& transformation, bool rel) const {
|
@@ -1,19 +1,21 @@
|
||||
#ifndef _PLAYER_H__
|
||||
#define _PLAYER_H__
|
||||
#include "vector3.h"
|
||||
#include "transformation.h"
|
||||
#include "audio.h"
|
||||
#include <cmath>
|
||||
#ifndef PLAYER_H__
|
||||
#define PLAYER_H__
|
||||
|
||||
class World;
|
||||
#include <cmath>
|
||||
#include "transformation.h"
|
||||
#include "vector3.h"
|
||||
|
||||
class World;
|
||||
|
||||
class Player {
|
||||
public:
|
||||
enum Sound { NOSOUND, STEP, FALL };
|
||||
|
||||
Player(const Vector3f& position, float rotX = 0, float rotY = 0);
|
||||
void TurnLeftRight(float value);
|
||||
void TurnTopBottom(float value);
|
||||
Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime);
|
||||
void ApplyPhysics(Vector3f input, World* world, float elapsedTime, Audio* audio);
|
||||
Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime);
|
||||
void ApplyTransformation(Transformation& transformation, bool rel = true) const;
|
||||
|
||||
Vector3f GetPosition() const;
|
@@ -51,10 +51,10 @@ void Transformation::ApplyScale(const Vector3f& v)
|
||||
ApplyScale(v.x, v.y, v.z);
|
||||
}
|
||||
|
||||
void Transformation::Use() const
|
||||
{
|
||||
glLoadMatrixf(m_stack.top().GetInternalValues());
|
||||
}
|
||||
//void Transformation::Use() const
|
||||
//{
|
||||
// glLoadMatrixf(m_stack.top().GetInternalValues());
|
||||
//}
|
||||
|
||||
const Matrix4f& Transformation::GetMatrix() const
|
||||
{
|
@@ -1,9 +1,10 @@
|
||||
#ifndef TRANSFORMATION_H__
|
||||
#define TRANSFORMATION_H__
|
||||
|
||||
#include <stack>
|
||||
#include "define.h"
|
||||
#include "matrix4.h"
|
||||
#include "vector3.h"
|
||||
#include <stack>
|
||||
|
||||
class Transformation
|
||||
{
|
||||
@@ -24,7 +25,7 @@ class Transformation
|
||||
void ApplyScale(float x, float y, float z);
|
||||
void ApplyScale(const Vector3f& v);
|
||||
|
||||
void Use() const;
|
||||
//void Use() const;
|
||||
|
||||
const Matrix4f& GetMatrix() const;
|
||||
|
410
SQCSim-common/world.cpp
Normal file
410
SQCSim-common/world.cpp
Normal file
@@ -0,0 +1,410 @@
|
||||
#include "world.h"
|
||||
|
||||
World::World() {}
|
||||
|
||||
World::~World() {}
|
||||
|
||||
Array2d<Chunk*>& World::GetChunks() { return m_chunks; }
|
||||
|
||||
void World::SetSeed(uint64_t seed) {
|
||||
m_seed = seed;
|
||||
}
|
||||
|
||||
Chunk* World::ChunkAt(float x, float y, float z) const {
|
||||
int cx = (int)x / CHUNK_SIZE_X;
|
||||
int cz = (int)z / CHUNK_SIZE_Z;
|
||||
|
||||
if (x < 0 || y < 0 || z < 0 ||
|
||||
x >= WORLD_SIZE_X * CHUNK_SIZE_X ||
|
||||
z >= CHUNK_SIZE_Z * WORLD_SIZE_Y ||
|
||||
y > CHUNK_SIZE_Y)
|
||||
return 0;
|
||||
|
||||
return m_chunks.Get(cx, cz);
|
||||
}
|
||||
|
||||
Chunk* World::ChunkAt(const Vector3f& pos) const { return ChunkAt(pos.x, pos.y, pos.z); }
|
||||
|
||||
BlockType World::BlockAt(float x, float y, float z, BlockType defaultBlockType) const {
|
||||
Chunk* c = ChunkAt(x, y, z);
|
||||
|
||||
if (!c)
|
||||
return defaultBlockType;
|
||||
|
||||
int bx = (int)x % CHUNK_SIZE_X;
|
||||
int by = (int)y % CHUNK_SIZE_Y;
|
||||
int bz = (int)z % CHUNK_SIZE_Z;
|
||||
|
||||
return c->GetBlock(bx, by, bz);
|
||||
}
|
||||
|
||||
BlockType World::BlockAt(const Vector3f& pos, BlockType defaultBlockType) const {
|
||||
return BlockAt(pos.x, pos.y, pos.z, defaultBlockType);
|
||||
}
|
||||
|
||||
void World::TransposeWorld(Vector3f& player, Bullet* bullets[MAX_BULLETS]) {
|
||||
int x = 0, y = 0;
|
||||
|
||||
if (player.x > (WORLD_SIZE_X * CHUNK_SIZE_X) * .6f) ++x;
|
||||
else if (player.x < (WORLD_SIZE_X * CHUNK_SIZE_X) * .4f) --x;
|
||||
if (player.z > (WORLD_SIZE_Y * CHUNK_SIZE_Z) * .6f) ++y;
|
||||
else if (player.z < (WORLD_SIZE_Y * CHUNK_SIZE_Z) * .4f) --y;
|
||||
|
||||
if (!x && !y) return;
|
||||
|
||||
if (x > 0) {
|
||||
for (int ax = 0; ax < WORLD_SIZE_X; ++ax)
|
||||
for (int ay = 0; ay < WORLD_SIZE_Y; ++ay)
|
||||
if (ax - x >= 0) {
|
||||
m_chunks.Set(ax - x, ay,
|
||||
m_chunks.Remove(ax, ay));
|
||||
if (ax == WORLD_SIZE_X - 1 && m_chunks.Get(ax - x, ay))
|
||||
m_chunks.Get(ax - x, ay)->MakeDirty();
|
||||
}
|
||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||
}
|
||||
else if (x < 0) {
|
||||
for (int ax = WORLD_SIZE_X - 1; ax >= 0; --ax)
|
||||
for (int ay = WORLD_SIZE_Y - 1; ay >= 0; --ay)
|
||||
if (ax - x < WORLD_SIZE_X) {
|
||||
m_chunks.Set(ax - x, ay,
|
||||
m_chunks.Remove(ax, ay));
|
||||
if (ax == 0 && m_chunks.Get(ax - x, ay))
|
||||
m_chunks.Get(ax - x, ay)->MakeDirty();
|
||||
}
|
||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||
}
|
||||
|
||||
if (y > 0) {
|
||||
for (int ax = 0; ax < WORLD_SIZE_X; ++ax)
|
||||
for (int ay = 0; ay < WORLD_SIZE_Y; ++ay)
|
||||
if (ay - y >= 0) {
|
||||
m_chunks.Set(ax, ay - y,
|
||||
m_chunks.Remove(ax, ay));
|
||||
if (ay == WORLD_SIZE_Y - 1 && m_chunks.Get(ax, ay - y))
|
||||
m_chunks.Get(ax, ay - y)->MakeDirty();
|
||||
}
|
||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||
}
|
||||
else if (y < 0) {
|
||||
for (int ax = WORLD_SIZE_X - 1; ax >= 0; --ax)
|
||||
for (int ay = WORLD_SIZE_Y - 1; ay >= 0; --ay)
|
||||
if (ay - y < WORLD_SIZE_Y) {
|
||||
m_chunks.Set(ax, ay - y,
|
||||
m_chunks.Remove(ax, ay));
|
||||
if (ay == 0 && m_chunks.Get(ax, ay - y))
|
||||
m_chunks.Get(ax, ay - y)->MakeDirty();
|
||||
}
|
||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||
}
|
||||
|
||||
m_center[0] += x; m_center[1] += y;
|
||||
player.x -= x * CHUNK_SIZE_X;
|
||||
player.z -= y * CHUNK_SIZE_Z;
|
||||
|
||||
for (int index = 0; index < MAX_BULLETS; ++index)
|
||||
if (bullets[index]) bullets[index]->Transpose(x, y);
|
||||
}
|
||||
|
||||
void World::CleanUpWorld(int& deleteframes, bool clear = false) {
|
||||
if (clear) {
|
||||
while (m_tbDeleted.size() > 0) {
|
||||
delete m_tbDeleted.back();
|
||||
m_tbDeleted.pop_back();
|
||||
}
|
||||
}
|
||||
if (!m_tbDeleted.empty() && !deleteframes) {
|
||||
int deleted = 0;
|
||||
while (deleted < THREADS_DELETE_CHUNKS) {
|
||||
|
||||
|
||||
}
|
||||
delete m_tbDeleted.back();
|
||||
m_tbDeleted.pop_back();
|
||||
deleteframes = FRAMES_DELETE_CHUNKS;
|
||||
}
|
||||
}
|
||||
|
||||
void World::GetScope(unsigned int& x, unsigned int& y) {
|
||||
x = m_center[0];
|
||||
y = m_center[1];
|
||||
}
|
||||
|
||||
void World::Update(Bullet* bullets[MAX_BULLETS], const Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]) {
|
||||
UpdateWorld(player_pos, blockinfo);
|
||||
//TransposeWorld(player_pos, bullets);
|
||||
}
|
||||
//
|
||||
//void World::UpdateChunk(int& updates, unsigned int chx, unsigned int chy, BlockInfo* blockinfo[BTYPE_LAST]) {
|
||||
// if (updates == 0 && ChunkAt(chx, 1, chy) &&
|
||||
// ChunkAt(chx, 1, chy)->IsDirty()) {
|
||||
// ChunkAt(chx, 1, chy)->Update(blockinfo, this);
|
||||
// updates = FRAMES_UPDATE_CHUNKS;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
void World::ChangeBlockAtCursor(BlockType blockType, const Vector3f& player_pos, const Vector3f& player_dir, bool& block) {
|
||||
Vector3f currentPos = player_pos;
|
||||
Vector3f currentBlock = currentPos;
|
||||
Vector3f ray = player_dir;
|
||||
bool found = false;
|
||||
|
||||
if (block) return;
|
||||
|
||||
while ((currentPos - currentBlock).Length() <= MAX_SELECTION_DISTANCE && !found) {
|
||||
currentBlock += ray / 10.f;
|
||||
|
||||
BlockType bt = BlockAt(currentBlock);
|
||||
|
||||
if (bt != BTYPE_AIR)
|
||||
found = true;
|
||||
}
|
||||
|
||||
if (found)
|
||||
if (blockType != BTYPE_AIR) {
|
||||
found = false;
|
||||
while ((currentPos - currentBlock).Length() >= 1.7f && !found) {
|
||||
currentBlock -= ray / 10.f;
|
||||
|
||||
BlockType bt = BlockAt(currentBlock);
|
||||
|
||||
if (bt == BTYPE_AIR) { // V<>rification pour <20>tre s<>r que le bloc <20> changer n'est pas dans le joueur.
|
||||
int Bx = (int)currentBlock.x;
|
||||
int By = (int)currentBlock.y;
|
||||
int Bz = (int)currentBlock.z;
|
||||
|
||||
int Px = (int)currentPos.x;
|
||||
int PyA = (int)currentPos.y;
|
||||
int PyB = (int)(currentPos.y - .9f);
|
||||
int PyC = (int)(currentPos.y - 1.7f);
|
||||
int Pz = (int)currentPos.z;
|
||||
|
||||
if (!(Bx == Px &&
|
||||
(By == PyA ||
|
||||
By == PyB ||
|
||||
By == PyC) &&
|
||||
Bz == Pz))
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (found && (int)currentBlock.y < CHUNK_SIZE_Y) {
|
||||
int bx = (int)currentBlock.x % CHUNK_SIZE_X;
|
||||
int by = (int)currentBlock.y % CHUNK_SIZE_Y;
|
||||
int bz = (int)currentBlock.z % CHUNK_SIZE_Z;
|
||||
|
||||
ChunkAt(currentBlock)->SetBlock(bx, by, bz, blockType, this);
|
||||
ChunkAt(currentBlock)->MakeModified();
|
||||
block = true;
|
||||
}
|
||||
}
|
||||
|
||||
void World::ChangeBlockAtPosition(BlockType blockType, Vector3f pos) {
|
||||
int bx = (int)pos.x % CHUNK_SIZE_X;
|
||||
int by = (int)pos.y % CHUNK_SIZE_Y;
|
||||
int bz = (int)pos.z % CHUNK_SIZE_Z;
|
||||
|
||||
ChunkAt(pos)->SetBlock(bx, by, bz, blockType, this);
|
||||
ChunkAt(pos)->MakeModified();
|
||||
}
|
||||
|
||||
void World::UpdateWorld(const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]) {
|
||||
int cx = player.x;
|
||||
int cy = player.z;
|
||||
static int frameGenerate = 1;
|
||||
static int frameUpdate = 2;
|
||||
static int frameDelete = 3;
|
||||
int side = 0;
|
||||
int threads = 0;
|
||||
std::future<Chunk*> genThList[THREADS_GENERATE_CHUNKS];
|
||||
//std::future<void> delThList[THREADS_DELETE_CHUNKS];
|
||||
|
||||
if (frameGenerate > 0) --frameGenerate;
|
||||
if (frameUpdate > 0) --frameUpdate;
|
||||
if (frameDelete > 0) --frameDelete;
|
||||
|
||||
if (!frameGenerate)
|
||||
while (side * CHUNK_SIZE_X <= VIEW_DISTANCE * 2 + CHUNK_SIZE_X) {
|
||||
int tx = -side, ty = -side;
|
||||
int chx = 0;
|
||||
int chy = 0;
|
||||
|
||||
for (; tx <= side; ++tx) {
|
||||
if (frameGenerate)
|
||||
break;
|
||||
chx = cx + tx * CHUNK_SIZE_X;
|
||||
chy = cy + ty * CHUNK_SIZE_Z;
|
||||
if (chx < WORLD_SIZE_X * CHUNK_SIZE_X && chy < WORLD_SIZE_Y * CHUNK_SIZE_Z &&
|
||||
chx >= 0 && chy >= 0 && !ChunkAt(chx, 1, chy))
|
||||
genThList[threads++] = std::async(std::launch::async,
|
||||
[](unsigned int x, unsigned int y, uint64_t seed) {
|
||||
return new Chunk(x, y, seed); },
|
||||
chx / CHUNK_SIZE_X + m_center[0],
|
||||
chy / CHUNK_SIZE_Z + m_center[1],
|
||||
m_seed);
|
||||
if (threads == THREADS_GENERATE_CHUNKS) frameGenerate = FRAMES_RENDER_CHUNKS;
|
||||
}
|
||||
for (; ty <= side; ++ty) {
|
||||
if (frameGenerate)
|
||||
break;
|
||||
chx = cx + tx * CHUNK_SIZE_X;
|
||||
chy = cy + ty * CHUNK_SIZE_Z;
|
||||
if (chx < WORLD_SIZE_X * CHUNK_SIZE_X && chy < WORLD_SIZE_Y * CHUNK_SIZE_Z &&
|
||||
chx >= 0 && chy >= 0 && !ChunkAt(chx, 1, chy))
|
||||
genThList[threads++] = std::async(std::launch::async,
|
||||
[](unsigned int x, unsigned int y, uint64_t seed) {
|
||||
return new Chunk(x, y, seed); },
|
||||
chx / CHUNK_SIZE_X + m_center[0],
|
||||
chy / CHUNK_SIZE_Z + m_center[1],
|
||||
m_seed);
|
||||
if (threads == THREADS_GENERATE_CHUNKS) frameGenerate = FRAMES_RENDER_CHUNKS;
|
||||
}
|
||||
for (; tx >= -side; --tx) {
|
||||
if (frameGenerate)
|
||||
break;
|
||||
chx = cx + tx * CHUNK_SIZE_X;
|
||||
chy = cy + ty * CHUNK_SIZE_Z;
|
||||
if (chx < WORLD_SIZE_X * CHUNK_SIZE_X && chy < WORLD_SIZE_Y * CHUNK_SIZE_Z &&
|
||||
chx >= 0 && chy >= 0 && !ChunkAt(chx, 1, chy))
|
||||
genThList[threads++] = std::async(std::launch::async,
|
||||
[](unsigned int x, unsigned int y, uint64_t seed) {
|
||||
return new Chunk(x, y, seed); },
|
||||
chx / CHUNK_SIZE_X + m_center[0],
|
||||
chy / CHUNK_SIZE_Z + m_center[1],
|
||||
m_seed);
|
||||
if (threads == THREADS_GENERATE_CHUNKS) frameGenerate = FRAMES_RENDER_CHUNKS;
|
||||
}
|
||||
for (; ty >= -side; --ty) {
|
||||
if (frameGenerate)
|
||||
break;
|
||||
chx = cx + tx * CHUNK_SIZE_X;
|
||||
chy = cy + ty * CHUNK_SIZE_Z;
|
||||
if (chx < WORLD_SIZE_X * CHUNK_SIZE_X && chy < WORLD_SIZE_Y * CHUNK_SIZE_Z &&
|
||||
chx >= 0 && chy >= 0 && !ChunkAt(chx, 1, chy))
|
||||
genThList[threads++] = std::async(std::launch::async,
|
||||
[](unsigned int x, unsigned int y, uint64_t seed) {
|
||||
return new Chunk(x, y, seed); },
|
||||
chx / CHUNK_SIZE_X + m_center[0],
|
||||
chy / CHUNK_SIZE_Z + m_center[1],
|
||||
m_seed);
|
||||
if (threads == THREADS_GENERATE_CHUNKS) frameGenerate = FRAMES_RENDER_CHUNKS;
|
||||
}
|
||||
if (frameGenerate)
|
||||
break;
|
||||
++side;
|
||||
}
|
||||
|
||||
if (threads > 0) {
|
||||
for (int i = 0; i < threads; ++i)
|
||||
genThList[i].wait();
|
||||
|
||||
for (int i = 0; i < threads; ++i) {
|
||||
unsigned int x, y;
|
||||
Chunk* chunk = genThList[i].get();
|
||||
chunk->GetPosition(x, y);
|
||||
m_chunks.Set(x - m_center[0], y - m_center[1], chunk);
|
||||
}
|
||||
}
|
||||
|
||||
side = 0;
|
||||
threads = 0;
|
||||
|
||||
//if (!frameUpdate)
|
||||
// while (side * CHUNK_SIZE_X <= VIEW_DISTANCE * 2) {
|
||||
// int tx = -side, ty = -side;
|
||||
|
||||
// for (; tx <= side; ++tx) {
|
||||
// if (frameUpdate)
|
||||
// break;
|
||||
// unsigned int chx = cx + tx * CHUNK_SIZE_X, chy = cy + ty * CHUNK_SIZE_Z;
|
||||
// if (ChunkAt(chx, 1, chy) &&
|
||||
// ChunkAt(chx, 1, chy)->IsDirty()) {
|
||||
// updateThList[threads++] =
|
||||
// std::async(std::launch::async,
|
||||
// [](Chunk* chunk, BlockInfo* blockinfo[BTYPE_LAST], World* world) {
|
||||
// chunk->Update(blockinfo, world); return chunk; }, ChunkAt(chx, 1, chy), blockinfo, this);
|
||||
// if (threads == THREADS_UPDATE_CHUNKS) frameUpdate = FRAMES_UPDATE_CHUNKS;
|
||||
// }
|
||||
// }
|
||||
// for (; ty <= side; ++ty) {
|
||||
// if (frameUpdate)
|
||||
// break;
|
||||
// unsigned int chx = cx + tx * CHUNK_SIZE_X, chy = cy + ty * CHUNK_SIZE_Z;
|
||||
// if (ChunkAt(chx, 1, chy) &&
|
||||
// ChunkAt(chx, 1, chy)->IsDirty()) {
|
||||
// updateThList[threads++] =
|
||||
// std::async(std::launch::async,
|
||||
// [](Chunk* chunk, BlockInfo* blockinfo[BTYPE_LAST], World* world) {
|
||||
// chunk->Update(blockinfo, world); return chunk; }, ChunkAt(chx, 1, chy), blockinfo, this);
|
||||
// if (threads == THREADS_UPDATE_CHUNKS) frameUpdate = FRAMES_UPDATE_CHUNKS;
|
||||
// }
|
||||
// }
|
||||
// for (; tx >= -side; --tx) {
|
||||
// if (frameUpdate)
|
||||
// break;
|
||||
// unsigned int chx = cx + tx * CHUNK_SIZE_X, chy = cy + ty * CHUNK_SIZE_Z;
|
||||
// if (ChunkAt(chx, 1, chy) &&
|
||||
// ChunkAt(chx, 1, chy)->IsDirty()) {
|
||||
// updateThList[threads++] =
|
||||
// std::async(std::launch::async,
|
||||
// [](Chunk* chunk, BlockInfo* blockinfo[BTYPE_LAST], World* world) {
|
||||
// chunk->Update(blockinfo, world); return chunk; }, ChunkAt(chx, 1, chy), blockinfo, this);
|
||||
// if (threads == THREADS_UPDATE_CHUNKS) frameUpdate = FRAMES_UPDATE_CHUNKS;
|
||||
// }
|
||||
// }
|
||||
// for (; ty >= -side; --ty) {
|
||||
// if (frameUpdate)
|
||||
// break;
|
||||
// unsigned int chx = cx + tx * CHUNK_SIZE_X, chy = cy + ty * CHUNK_SIZE_Z;
|
||||
// if (ChunkAt(chx, 1, chy) &&
|
||||
// ChunkAt(chx, 1, chy)->IsDirty()) {
|
||||
// updateThList[threads++] =
|
||||
// std::async(std::launch::async,
|
||||
// [](Chunk* chunk, BlockInfo* blockinfo[BTYPE_LAST], World* world) {
|
||||
// chunk->Update(blockinfo, world); return chunk; }, ChunkAt(chx, 1, chy), blockinfo, this);
|
||||
// if (threads == THREADS_UPDATE_CHUNKS) frameUpdate = FRAMES_UPDATE_CHUNKS;
|
||||
// }
|
||||
// }
|
||||
// if (frameUpdate)
|
||||
// break;
|
||||
// ++side;
|
||||
// }
|
||||
|
||||
//if (threads > 0) {
|
||||
// for (int i = 0; i < threads; ++i) {
|
||||
// updateThList[i].wait();
|
||||
// Chunk* chunk = updateThList[i].get();
|
||||
// chunk->FlushMeshToVBO();
|
||||
// }
|
||||
//}
|
||||
|
||||
threads = 0;
|
||||
|
||||
//int del = THREADS_DELETE_CHUNKS;
|
||||
//while (!m_tbDeleted.empty() && del--) { // Moins rapide que le bout en dessous, mais -beaucoup- plus stable.
|
||||
// m_tbDeleted.back()->FlushVBO();
|
||||
// m_tbDeleted.back()->~Chunk();
|
||||
// m_tbDeleted.pop_back();
|
||||
//}
|
||||
|
||||
/*while (!m_tbDeleted.empty() && !frameDelete) {
|
||||
if (m_tbDeleted.back()) {
|
||||
m_tbDeleted.back()->FlushVBO();
|
||||
delThList[threads] =
|
||||
std::async(std::launch::async,
|
||||
[](Chunk* chunk) { delete chunk; }, m_tbDeleted.back());
|
||||
m_tbDeleted.pop_back();
|
||||
if (++threads > THREADS_DELETE_CHUNKS) frameDelete = FRAMES_DELETE_CHUNKS;
|
||||
}
|
||||
else m_tbDeleted.pop_back();
|
||||
}*/
|
||||
|
||||
/*for (int x = 0; x < threads; ++x) {
|
||||
delThList[x].wait();
|
||||
delThList[x].get();
|
||||
}*/
|
||||
}
|
||||
|
||||
int World::GettbDeleted() const { return m_tbDeleted.size(); }
|
@@ -1,22 +1,18 @@
|
||||
#ifndef WORLD_H__
|
||||
#define WORLD_H__
|
||||
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <future>
|
||||
#include <thread>
|
||||
#include "define.h"
|
||||
#include "chunk.h"
|
||||
#include "array2d.h"
|
||||
#include "vector3.h"
|
||||
#include "player.h"
|
||||
#include "transformation.h"
|
||||
#include "shader.h"
|
||||
#include "array2d.h"
|
||||
#include "bullet.h"
|
||||
#include "textureatlas.h"
|
||||
#include "chunk.h"
|
||||
|
||||
class Chunk;
|
||||
class Player;
|
||||
class Bullet;
|
||||
|
||||
class World {
|
||||
@@ -26,30 +22,32 @@ public:
|
||||
|
||||
Array2d<Chunk*>& GetChunks();
|
||||
|
||||
void SetSeed(uint64_t seed);
|
||||
|
||||
Chunk* ChunkAt(float x, float y, float z) const;
|
||||
Chunk* ChunkAt(const Vector3f& pos) const;
|
||||
|
||||
BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const;
|
||||
BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const;
|
||||
|
||||
void Update(int& rendercount, Bullet* bullets[MAX_BULLETS], Player& player, Transformation& world, Shader& shader, TextureAtlas& atlas, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||
void Update(Bullet* bullets[MAX_BULLETS], const Vector3f& player_pos, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||
|
||||
void GetScope(unsigned int& x, unsigned int& y);
|
||||
|
||||
void ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block);
|
||||
void ChangeBlockAtCursor(BlockType blockType, const Vector3f& player_pos, const Vector3f& player_dir, bool& block);
|
||||
void ChangeBlockAtPosition(BlockType blockType, Vector3f pos);
|
||||
void CleanUpWorld(int& deleteframes, bool clear);
|
||||
int GettbDeleted() const;
|
||||
private:
|
||||
Array2d<Chunk*> m_chunks = Array2d<Chunk*>(WORLD_SIZE_X, WORLD_SIZE_Y);
|
||||
std::vector<Chunk*> m_tbDeleted;
|
||||
uint64_t m_seed = 0;
|
||||
|
||||
unsigned int m_center[2] = { UINT16_MAX / 2 - WORLD_SIZE_X, UINT16_MAX / 2 - WORLD_SIZE_Y };
|
||||
|
||||
void UpdateChunk(int& updates, unsigned int chx, unsigned int chy, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||
void RenderWorld(int& rendercount, Player& player, Transformation& world, Shader& shader);
|
||||
void UpdateWorld(Player& player, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||
void TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]);
|
||||
void UpdateWorld(const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]);
|
||||
void TransposeWorld(Vector3f& player, Bullet* bullets[MAX_BULLETS]);
|
||||
|
||||
};
|
||||
#endif // WORLD_H__
|
148
SQCSim-srv/SQCSim-srv.vcxproj
Normal file
148
SQCSim-srv/SQCSim-srv.vcxproj
Normal file
@@ -0,0 +1,148 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>17.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{d3bb3300-25f0-42bf-a934-fac33b5c7d25}</ProjectGuid>
|
||||
<RootNamespace>SQCSimsrv</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>Default</LanguageStandard>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="connection.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="server.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="connection.h" />
|
||||
<ClInclude Include="define.h" />
|
||||
<ClInclude Include="server.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SQCSim-common\SQCSim-common.vcxproj">
|
||||
<Project>{ee91ab12-4225-4a4d-931d-69d72f6d91fb}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
39
SQCSim-srv/SQCSim-srv.vcxproj.filters
Normal file
39
SQCSim-srv/SQCSim-srv.vcxproj.filters
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Fichiers sources">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers d%27en-tête">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Fichiers de ressources">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="server.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="connection.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="define.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="server.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="connection.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
30
SQCSim-srv/cmake/CMakeLists.txt
Normal file
30
SQCSim-srv/cmake/CMakeLists.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
cmake_minimum_required(VERSION 3.18.4)
|
||||
|
||||
project(SQCSim-Server VERSION 0.1)
|
||||
|
||||
add_compile_options("-Wno-narrowing")
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_STANDARD_REQUIRED True)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../out")
|
||||
|
||||
set(SQCSIM_COMMON_DIR "../../SQCSim-common/")
|
||||
|
||||
add_library(SQCSim-common
|
||||
"${SQCSIM_COMMON_DIR}blockinfo.cpp"
|
||||
"${SQCSIM_COMMON_DIR}bullet.cpp"
|
||||
"${SQCSIM_COMMON_DIR}chunk.cpp"
|
||||
"${SQCSIM_COMMON_DIR}netprotocol.cpp"
|
||||
"${SQCSIM_COMMON_DIR}opensimplex.cpp"
|
||||
"${SQCSIM_COMMON_DIR}player.cpp"
|
||||
"${SQCSIM_COMMON_DIR}transformation.cpp"
|
||||
"${SQCSIM_COMMON_DIR}world.cpp"
|
||||
)
|
||||
|
||||
add_executable(SQCSim-server
|
||||
"../connection.cpp"
|
||||
"../server.cpp"
|
||||
"../main.cpp"
|
||||
)
|
||||
|
||||
target_link_libraries(SQCSim-server PUBLIC SQCSim-common)
|
54
SQCSim-srv/connection.cpp
Normal file
54
SQCSim-srv/connection.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include "connection.h"
|
||||
|
||||
|
||||
|
||||
Connection::Connection(SOCKET sock,
|
||||
sockaddr_in sockaddr,
|
||||
netprot::LoginInfo log,
|
||||
netprot::PlayerInfo play):
|
||||
m_sock(sock),
|
||||
m_addr(sockaddr),
|
||||
m_loginfo(log),
|
||||
m_playinfo(play) {
|
||||
|
||||
}
|
||||
|
||||
Connection::~Connection() {
|
||||
closesocket(m_sock);
|
||||
}
|
||||
|
||||
uint64_t Connection::GetHash(bool self) const { return self? m_loginfo.sid: m_playinfo.id; }
|
||||
|
||||
uint64_t Connection::GetTeamHash() const { return m_loginfo.tid; }
|
||||
|
||||
std::string Connection::GetName() const { return m_loginfo.name; }
|
||||
|
||||
void Connection::AddInput(netprot::Input in) {
|
||||
m_input_manifest.insert({ in.timestamp, in });
|
||||
}
|
||||
|
||||
netprot::Output* Connection::getOutput(Timestamp time) {
|
||||
auto out = m_output_manifest.find(time);
|
||||
if (out != m_output_manifest.end())
|
||||
return &out->second;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
netprot::Sync Connection::getSync(Timestamp time) {
|
||||
netprot::Sync sync;
|
||||
auto out = m_output_manifest.find(time);
|
||||
if (out != m_output_manifest.end()) {
|
||||
sync.timestamp = out->second.timestamp;
|
||||
sync.position = out->second.position;
|
||||
sync.sid = m_loginfo.sid;
|
||||
}
|
||||
return sync;
|
||||
}
|
||||
|
||||
void Connection::CleanInputManifest(Timestamp time) {
|
||||
auto wat = m_input_manifest.find(time);
|
||||
|
||||
while (wat != m_input_manifest.begin())
|
||||
m_input_manifest.erase(wat--);
|
||||
|
||||
}
|
42
SQCSim-srv/connection.h
Normal file
42
SQCSim-srv/connection.h
Normal file
@@ -0,0 +1,42 @@
|
||||
#ifndef CONNECTION_H__
|
||||
#define CONNECTION_H__
|
||||
|
||||
#include <deque>
|
||||
#include <map>
|
||||
#include "../SQCSim-common/player.h"
|
||||
#include "../SQCSim-common/vector3.h"
|
||||
#include "../SQCSim-common/netprotocol.h"
|
||||
#include "define.h"
|
||||
|
||||
class Connection {
|
||||
public:
|
||||
Connection(
|
||||
SOCKET sock,
|
||||
sockaddr_in sockaddr,
|
||||
netprot::LoginInfo log,
|
||||
netprot::PlayerInfo play);
|
||||
~Connection();
|
||||
|
||||
Player* player = nullptr;
|
||||
|
||||
uint64_t GetHash(bool self = true) const;
|
||||
uint64_t GetTeamHash() const;
|
||||
std::string GetName() const;
|
||||
|
||||
void AddInput(netprot::Input in);
|
||||
netprot::Output* getOutput(Timestamp time);
|
||||
netprot::Sync getSync(Timestamp time);
|
||||
|
||||
void CleanInputManifest(Timestamp time);
|
||||
private:
|
||||
std::map<Timestamp, netprot::Input> m_input_manifest;
|
||||
std::map<Timestamp, netprot::Output> m_output_manifest;
|
||||
std::map<Timestamp, netprot::Chat> m_chatlog;
|
||||
|
||||
SOCKET m_sock;
|
||||
sockaddr_in m_addr;
|
||||
netprot::LoginInfo m_loginfo;
|
||||
netprot::PlayerInfo m_playinfo;
|
||||
|
||||
};
|
||||
#endif
|
17
SQCSim-srv/define.h
Normal file
17
SQCSim-srv/define.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef SRV_DEFINE_H__
|
||||
#define SRV_DEFINE_H__
|
||||
|
||||
#include "../SQCSim-common/define.h"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <cctype>
|
||||
#include <string>
|
||||
|
||||
#define MAX_CONNECTIONS 16
|
||||
#define ID_LIST_SIZE 127
|
||||
#define BUFFER_LENGTH 150
|
||||
|
||||
typedef unsigned char LogDest;
|
||||
enum LOG_DEST { CONSOLE, LOGFILE, LOG_LAST };
|
||||
|
||||
#endif
|
9
SQCSim-srv/main.cpp
Normal file
9
SQCSim-srv/main.cpp
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "server.h"
|
||||
|
||||
int main() {
|
||||
Server* server = new Server();
|
||||
if (server->Init() == 0)
|
||||
if (server->Ready() == 0)
|
||||
server->Run();
|
||||
delete server;
|
||||
}
|
327
SQCSim-srv/server.cpp
Normal file
327
SQCSim-srv/server.cpp
Normal file
@@ -0,0 +1,327 @@
|
||||
#include "server.h"
|
||||
|
||||
Server::Server(LogDest log) {
|
||||
m_log = log;
|
||||
if (log == LOG_DEST::LOGFILE) {
|
||||
m_logfile = std::ofstream("server.log", std::ofstream::out);
|
||||
if (!m_logfile.is_open()) {
|
||||
m_log = LOG_DEST::CONSOLE; // Fallback console.
|
||||
Log("Ouverture fichier log: repli vers console.", true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Server::~Server() {
|
||||
if (m_logfile.is_open())
|
||||
m_logfile.close();
|
||||
if (m_sock_udp)
|
||||
closesocket(m_sock_udp);
|
||||
if (m_sock_tcp)
|
||||
closesocket(m_sock_tcp);
|
||||
#ifdef _WIN32
|
||||
WSACleanup();
|
||||
#endif
|
||||
}
|
||||
|
||||
int Server::Init() {
|
||||
Log("Initialisation du serveur...", false, false);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (WSAStartup(MAKEWORD(2, 2), &m_wsaData) != 0) { /* Initialisation de l'environnement reseau (Windows only) */
|
||||
Log("Initialisation WinSock.", true, true);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
m_sock_udp = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (m_sock_udp == INVALID_SOCKET) { /* Creation du socket UDP */
|
||||
Log("Creation Socket UDP.", true, true);
|
||||
return 2;
|
||||
}
|
||||
|
||||
m_sock_tcp = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (m_sock_tcp == INVALID_SOCKET) { /* Creation du socket TCP */
|
||||
Log("Creation Socket TCP.", true, true);
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* Creation structure donnes descripteur du socket serveur */
|
||||
sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(SRV_PORT);
|
||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
if (bind(m_sock_udp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket UDP au port */
|
||||
Log("Association Socket UDP.", true, true);
|
||||
return 4;
|
||||
}
|
||||
|
||||
if (bind(m_sock_tcp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket TCP au port */
|
||||
Log("Association Socket TCP.", true, true);
|
||||
return 5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Server::Ready() {
|
||||
if (listen(m_sock_tcp, MAX_CONNECTIONS) < 0) {
|
||||
Log("<EFBFBD>coute sur le port TCP.", true, true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
char* buf = new char[150];
|
||||
uint32_t buflen = 150;
|
||||
bool readystart = false;
|
||||
srand(time(NULL));
|
||||
|
||||
Log("<EFBFBD> l'<27>coute sur le port: " + std::to_string(SRV_PORT), false, false);
|
||||
|
||||
buildIdList(ID_LIST_SIZE);
|
||||
|
||||
m_game.countdown = 360;
|
||||
m_game.gameType = 1;
|
||||
m_game.seed = 9370707;
|
||||
|
||||
while (!readystart) {
|
||||
sockaddr_in sockad;
|
||||
unsigned int addrlen = sizeof(sockad);
|
||||
SOCKET sock = accept(m_sock_tcp, (sockaddr*)&sockad, &addrlen);
|
||||
|
||||
if (sock < 0)
|
||||
Log("Erreur de connexion", true, false);
|
||||
else if (sock > 0) {
|
||||
std::string str = "Nouvelle connection provenant de: ";
|
||||
char* strbuf = new char[BUFFER_LENGTH];
|
||||
uint32_t strbuflen = BUFFER_LENGTH;
|
||||
|
||||
str.append(inet_ntop(AF_INET, &sockad.sin_addr, strbuf, strbuflen)).append(": ").append(std::to_string(sockad.sin_port));
|
||||
|
||||
if (recv(sock, buf, buflen, 0) > 0) {
|
||||
netprot::LoginInfo log;
|
||||
netprot::PlayerInfo play;
|
||||
if (netprot::Deserialize(&log, buf, buflen)) {
|
||||
log.sid = getUniqueId();
|
||||
|
||||
log.tid = 0;
|
||||
|
||||
str.append(" Nom: ").append(log.name);
|
||||
Log(str, false, false);
|
||||
str = "";
|
||||
|
||||
str.append(log.name).append(" SID: [").append(std::to_string(log.sid).append("]"));
|
||||
Log(str, false, false);
|
||||
|
||||
//netprot::Serialize(&log, &buf, &buflen);
|
||||
//send(sock, buf, buflen, 0);
|
||||
//buflen = 150;
|
||||
sendPack<netprot::LoginInfo>(sock, &log, &buf, &buflen);
|
||||
|
||||
play.id = getUniqueId();
|
||||
memcpy(play.name, log.name, std::strlen(log.name) + 1);
|
||||
play.tid = log.tid;
|
||||
|
||||
//netprot::Serialize(&m_game, &buf, &buflen);
|
||||
//send(sock, buf, buflen, 0);
|
||||
sendPack<netprot::GameInfo>(sock, &m_game, &buf, &buflen);
|
||||
Connection* conn = new Connection(sock, sockad, log, play);
|
||||
|
||||
m_players[log.sid] = conn;
|
||||
readystart = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Server::Run() {
|
||||
|
||||
Log("Partie en cours...", false, false);
|
||||
}
|
||||
|
||||
inline std::string Server::LogTimestamp() {
|
||||
time_t rawtime;
|
||||
struct tm timeinfo;
|
||||
char buffer[80];
|
||||
|
||||
time(&rawtime);
|
||||
|
||||
#ifdef _WIN32
|
||||
localtime_s(&timeinfo, &rawtime);
|
||||
#else
|
||||
localtime_r(&rawtime, &timeinfo);
|
||||
#endif
|
||||
|
||||
strftime(buffer, sizeof(buffer), "%d-%m-%Y %H:%M:%S", &timeinfo);
|
||||
std::string str(buffer);
|
||||
|
||||
return "[" + str + "] ";
|
||||
}
|
||||
|
||||
void Server::Log(std::string str, bool is_error = false, bool is_fatal = false) {
|
||||
switch (m_log) {
|
||||
case LOG_DEST::LOGFILE:
|
||||
m_logfile << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
||||
break;
|
||||
case LOG_DEST::CONSOLE:
|
||||
default:
|
||||
std::cout << LogTimestamp() << (is_fatal ? "FATAL " : "") << (is_error ? "ERROR " : "") << str << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_fatal) {
|
||||
if (m_sock_udp)
|
||||
closesocket(m_sock_udp);
|
||||
if (m_sock_tcp)
|
||||
closesocket(m_sock_tcp);
|
||||
#ifdef _WIN32
|
||||
WSACleanup();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Server::buildIdList(size_t size) {
|
||||
std::set<uint64_t> lst;
|
||||
|
||||
do lst.insert(((uint64_t)rand() << 25) % 8675309); // EIGHT SIX SEVENFIVE THREE AUGHT NIIIIIIiIIiiIiINE!
|
||||
while (lst.size() < size);
|
||||
|
||||
m_ids = std::vector<uint64_t>(lst.begin(), lst.end());
|
||||
}
|
||||
|
||||
uint64_t Server::getUniqueId() {
|
||||
uint64_t id = m_ids.back();
|
||||
m_ids.pop_back();
|
||||
return id;
|
||||
}
|
||||
|
||||
// Test serialize/deserialize:
|
||||
/*
|
||||
netprot::LoginInfo log, log2;
|
||||
std::cout << "Nom? ";
|
||||
std::cin.getline(log.name, 32); // NO! STD::CIN >> VARIABLE;! EVEEEEEERRRR!!!
|
||||
log.sid = 12345;
|
||||
char* buf = new char[150];
|
||||
uint32_t buflen = 150;
|
||||
|
||||
netprot::Serialize(&log, &buf, &buflen);
|
||||
|
||||
bool is_work = netprot::Deserialize(&log2, buf, buflen);
|
||||
|
||||
std::string str;
|
||||
str.append(is_work ? "Y " : "N ").append(log2.name).append(": ").append(std::to_string(log2.sid));
|
||||
|
||||
Log(str, false, false);
|
||||
*/
|
||||
|
||||
|
||||
///* Recevoir paquet */
|
||||
//while (true) {
|
||||
// char buffer[2048];
|
||||
// sockaddr_in client;
|
||||
//
|
||||
//#ifdef _WIN32 // Mais pourquoi?
|
||||
// int clen = sizeof(client);
|
||||
//#else
|
||||
// unsigned int clen = sizeof(client);
|
||||
//#endif
|
||||
//
|
||||
// int count = recvfrom(socket_udp, buffer, sizeof(buffer) - 1, 0, (sockaddr*)&client, &clen);
|
||||
//
|
||||
// if (count < 0) {
|
||||
// Log("Erreur de reception de paquet.", socket_udp);
|
||||
// return 4;
|
||||
// }
|
||||
//
|
||||
// buffer[count] = '\0';
|
||||
//
|
||||
// /* G<>rer le paquet re<72>u */
|
||||
// std::string commande(buffer);
|
||||
//
|
||||
// if (commande.find("echo ") == 0) { /* ECHO */
|
||||
// std::string::size_type pos = commande.find(' ');
|
||||
// std::string parametres = commande.substr(pos + 1);
|
||||
//
|
||||
// sendto(socket_udp, parametres.c_str(), parametres.length(), 0, (const sockaddr*)&client, sizeof(client));
|
||||
// }
|
||||
// else if (commande.find("date ") == 0) { /* DATE */
|
||||
// time_t rawtime;
|
||||
// struct tm* timeinfo = new tm();
|
||||
// char tbuffer[80];
|
||||
//
|
||||
// time(&rawtime);
|
||||
//
|
||||
//#ifdef _WIN32
|
||||
// localtime_s(timeinfo, &rawtime);
|
||||
//#else
|
||||
// localtime_r(&rawtime, timeinfo);
|
||||
//#endif
|
||||
//
|
||||
// strftime(tbuffer, 80, "%a %b %e %T %G", timeinfo);
|
||||
//
|
||||
// sendto(socket_udp, tbuffer, sizeof(tbuffer), 0, (const sockaddr*)&client, sizeof(client));
|
||||
// delete timeinfo;
|
||||
// }
|
||||
// else if (commande.find("ping ") == 0) { /* PING */
|
||||
// sendto(socket_udp, "pong", sizeof("pong"), 0, (const sockaddr*)&client, sizeof(client));
|
||||
// }
|
||||
// else if (commande.find("usager ") == 0) { /* USAGER */
|
||||
// std::string user;
|
||||
//
|
||||
//#ifdef _WIN32
|
||||
// wchar_t userbuf[30];
|
||||
// DWORD usersize = 30;
|
||||
//
|
||||
// GetUserNameW(userbuf, &usersize);
|
||||
//
|
||||
// std::wstring wuser = userbuf;
|
||||
// user = std::string(wuser.begin(), wuser.end());
|
||||
//#else
|
||||
// char ptr[30];
|
||||
// getlogin_r(ptr, sizeof(ptr) - 1);
|
||||
// user = std::string(ptr);
|
||||
//#endif
|
||||
//
|
||||
// sendto(socket_udp, user.c_str(), user.length(), 0, (const sockaddr*)&client, sizeof(client));
|
||||
// }
|
||||
// else if (commande.find("exec ") == 0) { /* EXEC */
|
||||
// std::string::size_type pos = commande.find(' ');
|
||||
// std::string parametres = commande.substr(pos + 1);
|
||||
//
|
||||
// FILE* pipe = nullptr;
|
||||
// char buffer[301]; // 300 caract<63>res + '\0'
|
||||
// std::string reponse;
|
||||
//
|
||||
// pipe = popen(parametres.c_str(), "r");
|
||||
//
|
||||
// if (!pipe)
|
||||
// reponse = "Erreur de commande!";
|
||||
// else while (!feof(pipe)) {
|
||||
// if (fgets(buffer, sizeof(buffer) - 1, pipe))
|
||||
// reponse += buffer;
|
||||
// }
|
||||
//
|
||||
// if (pipe)
|
||||
// pclose(pipe);
|
||||
//
|
||||
// if (reponse.length() > 300)
|
||||
// reponse = reponse.substr(0, 300);
|
||||
// else if (reponse.length() < 1)
|
||||
// reponse = "OK!";
|
||||
//
|
||||
// sendto(socket_udp, reponse.c_str(), reponse.length(), 0, (const sockaddr*)&client, sizeof(client));
|
||||
// }
|
||||
// else if (commande.find("bye ") == 0) { /* BYE */
|
||||
// Log("", 0); // Message d'erreur pas de message d'erreur!
|
||||
// return 0;
|
||||
// }
|
||||
// else sendto(socket_udp, "huh?", sizeof("huh?"), 0, (const sockaddr*)&client, sizeof(client)); /* DEFAULT */
|
||||
//}
|
||||
//
|
||||
///* Ce bout de code ne devrait theoriquement jamais etre atteint, mais au cas. */
|
||||
//Log("", 0);
|
||||
//return 0;
|
||||
//return false;
|
||||
//}
|
||||
//
|
54
SQCSim-srv/server.h
Normal file
54
SQCSim-srv/server.h
Normal file
@@ -0,0 +1,54 @@
|
||||
#ifndef SERVER_H__
|
||||
#define SERVER_H__
|
||||
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include "../SQCSim-common/world.h"
|
||||
#include "../SQCSim-common/netprotocol.h"
|
||||
#include "define.h"
|
||||
#include "connection.h"
|
||||
|
||||
class Server {
|
||||
public:
|
||||
Server(LogDest log = LOG_DEST::CONSOLE);
|
||||
~Server();
|
||||
|
||||
int Init();
|
||||
int Ready();
|
||||
void Run();
|
||||
|
||||
private:
|
||||
#ifdef _WIN32
|
||||
WSADATA m_wsaData;
|
||||
#endif
|
||||
SOCKET m_sock_udp = 0,
|
||||
m_sock_tcp = 0;
|
||||
LogDest m_log;
|
||||
std::ofstream m_logfile;
|
||||
|
||||
std::map<uint64_t, Connection*> m_players;
|
||||
std::map <Timestamp, netprot::Chat> m_chatlog;
|
||||
std::vector<uint64_t> m_ids;
|
||||
netprot::GameInfo m_game;
|
||||
|
||||
World* m_world = nullptr;
|
||||
|
||||
std::string LogTimestamp();
|
||||
void Log(std::string str, bool is_error, bool is_fatal);
|
||||
void buildIdList(size_t size);
|
||||
|
||||
uint64_t getUniqueId();
|
||||
template <class T> void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen);
|
||||
|
||||
};
|
||||
|
||||
template <class T>
|
||||
void Server::sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) {
|
||||
netprot::Serialize(pack, buf, buflen);
|
||||
send(sock, *buf, *buflen, 0);
|
||||
*buflen = BUFFER_LENGTH;
|
||||
}
|
||||
|
||||
#endif
|
@@ -19,46 +19,39 @@
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="array2d.h" />
|
||||
<ClInclude Include="array3d.h" />
|
||||
<ClInclude Include="audio.h" />
|
||||
<ClInclude Include="blockinfo.h" />
|
||||
<ClInclude Include="bullet.h" />
|
||||
<ClInclude Include="chunk.h" />
|
||||
<ClInclude Include="connector.h" />
|
||||
<ClInclude Include="define.h" />
|
||||
<ClInclude Include="engine.h" />
|
||||
<ClInclude Include="matrix4.h" />
|
||||
<ClInclude Include="mesh.h" />
|
||||
<ClInclude Include="openglcontext.h" />
|
||||
<ClInclude Include="opensimplex.h" />
|
||||
<ClInclude Include="player.h" />
|
||||
<ClInclude Include="shader.h" />
|
||||
<ClInclude Include="skybox.h" />
|
||||
<ClInclude Include="texture.h" />
|
||||
<ClInclude Include="textureatlas.h" />
|
||||
<ClInclude Include="tool.h" />
|
||||
<ClInclude Include="transformation.h" />
|
||||
<ClInclude Include="vector3.h" />
|
||||
<ClInclude Include="vertexbuffer.h" />
|
||||
<ClInclude Include="world.h" />
|
||||
<ClInclude Include="worldrenderer.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="audio.cpp" />
|
||||
<ClCompile Include="blockinfo.cpp" />
|
||||
<ClCompile Include="bullet.cpp" />
|
||||
<ClCompile Include="chunk.cpp" />
|
||||
<ClCompile Include="connector.cpp" />
|
||||
<ClCompile Include="engine.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="mesh.cpp" />
|
||||
<ClCompile Include="openglcontext.cpp" />
|
||||
<ClCompile Include="opensimplex.cpp" />
|
||||
<ClCompile Include="player.cpp" />
|
||||
<ClCompile Include="shader.cpp" />
|
||||
<ClCompile Include="skybox.cpp" />
|
||||
<ClCompile Include="texture.cpp" />
|
||||
<ClCompile Include="textureatlas.cpp" />
|
||||
<ClCompile Include="tool.cpp" />
|
||||
<ClCompile Include="transformation.cpp" />
|
||||
<ClCompile Include="vertexbuffer.cpp" />
|
||||
<ClCompile Include="world.cpp" />
|
||||
<ClCompile Include="worldrenderer.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SQCSim-common\SQCSim-common.vcxproj">
|
||||
<Project>{ee91ab12-4225-4a4d-931d-69d72f6d91fb}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{A21FD938-1FEA-4687-AB86-0EABAC30877B}</ProjectGuid>
|
||||
@@ -112,8 +105,8 @@
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>external\irrKlang-1.6.0\include;external\glew170\include;external\devil178\include;external\sfml23\include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>external\glew170\lib;external\devil178\lib;external\sfml23\lib;$(LibraryPath);external\irrKlang-1.6.0\lib\Win32-visualStudio</LibraryPath>
|
||||
<IncludePath>external\irrKlang-1.6.0\include;external\glew210\include;external\devil180\include;external\sfml251-32\include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>external\glew210\lib\Release\Win32;external\sfml251-32\lib;external\devil180\lib\x86\Release;external\irrKlang-1.6.0\lib\Win32-visualStudio;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
@@ -122,8 +115,8 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>external\irrKlang-1.6.0\include;external\sfml23\include;external\devil178\include;external\glew170\include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>external\sfml23\lib;external\devil178\lib;external\glew170\lib;$(LibraryPath);external\irrKlang-1.6.0\lib\Win32-visualStudio</LibraryPath>
|
||||
<IncludePath>external\devil180\include;external\irrKlang-1.6.0\include;external\sfml251-32\include;external\glew210\include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>external\sfml251-32\lib;external\devil180\lib\x86\Release;external\glew210\lib\Release\Win32;$(LibraryPath);external\irrKlang-1.6.0\lib\Win32-visualStudio</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
@@ -175,8 +168,8 @@
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>irrKlang.lib;sfml-main.lib;sfml-system.lib;sfml-window.lib;sfml-graphics.lib;GlU32.Lib;OpenGL32.Lib;DevIL.lib;ILU.lib;ILUT.lib;glew32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
@@ -197,8 +190,8 @@
|
||||
<FloatingPointModel>Fast</FloatingPointModel>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>irrKlang.lib;sfml-main.lib;sfml-system.lib;sfml-window.lib;sfml-graphics.lib;GlU32.Lib;OpenGL32.Lib;DevIL.lib;ILU.lib;ILUT.lib;glew32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
|
@@ -11,51 +11,21 @@
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="array3d.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="blockinfo.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="chunk.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="define.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="engine.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="matrix4.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="openglcontext.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="texture.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="transformation.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vector3.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="player.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="shader.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="tool.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vertexbuffer.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="array2d.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="skybox.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
@@ -65,23 +35,23 @@
|
||||
<ClInclude Include="textureatlas.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="world.h">
|
||||
<ClInclude Include="connector.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="bullet.h">
|
||||
<ClInclude Include="openglcontext.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="opensimplex.h">
|
||||
<ClInclude Include="tool.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="mesh.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="worldrenderer.h">
|
||||
<Filter>Fichiers d%27en-tête</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="blockinfo.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="chunk.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="engine.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
@@ -94,18 +64,9 @@
|
||||
<ClCompile Include="texture.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="transformation.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="player.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="shader.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="tool.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="vertexbuffer.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
@@ -118,13 +79,16 @@
|
||||
<ClCompile Include="textureatlas.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="world.cpp">
|
||||
<ClCompile Include="connector.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="bullet.cpp">
|
||||
<ClCompile Include="tool.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="opensimplex.cpp">
|
||||
<ClCompile Include="mesh.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="worldrenderer.cpp">
|
||||
<Filter>Fichiers sources</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
|
@@ -2,17 +2,17 @@
|
||||
|
||||
Audio::Audio() {
|
||||
m_engine = irrklang::createIrrKlangDevice();
|
||||
m_engine->setDopplerEffectParameters(1);
|
||||
m_engine->setRolloffFactor(1);
|
||||
m_engine->setDefault3DSoundMinDistance(1);
|
||||
m_engine->setDopplerEffectParameters(10);
|
||||
m_engine->setRolloffFactor(2);
|
||||
m_engine->setDefault3DSoundMinDistance(.1);
|
||||
m_engine->setDefault3DSoundMaxDistance(1000);
|
||||
}
|
||||
|
||||
Audio::Audio(const char * music) {
|
||||
m_engine = irrklang::createIrrKlangDevice();
|
||||
m_engine->setDopplerEffectParameters(1);
|
||||
m_engine->setRolloffFactor(1);
|
||||
m_engine->setDefault3DSoundMinDistance(1);
|
||||
m_engine->setRolloffFactor(2);
|
||||
m_engine->setDefault3DSoundMinDistance(.1);
|
||||
m_engine->setDefault3DSoundMaxDistance(1000);
|
||||
m_music = m_engine->play2D(music, false, true, true, irrklang::ESM_STREAMING);
|
||||
}
|
||||
@@ -28,10 +28,11 @@ void Audio::Update3DAudio(Vector3f pos, Vector3f dir, Vector3f vel) {
|
||||
irrklang::vec3df(vel.x, vel.y, vel.z));
|
||||
}
|
||||
|
||||
void Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, float volume = 1) {
|
||||
sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), false, false, true, irrklang::ESM_NO_STREAMING, true);
|
||||
irrklang::ISound* Audio::Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, bool is_looped = false, float volume = 1) {
|
||||
sound = m_engine->play3D(name, irrklang::vec3df(pos.x, pos.y, pos.z), is_looped, false, true, is_looped? irrklang::ESM_STREAMING: irrklang::ESM_NO_STREAMING, true);
|
||||
sound->setVelocity(irrklang::vec3df(vel.x, vel.y, vel.z));
|
||||
sound->setVolume(volume);
|
||||
return sound;
|
||||
}
|
||||
|
||||
void Audio::Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume = 1) {
|
||||
|
@@ -1,24 +1,30 @@
|
||||
#ifndef AUDIO_H__
|
||||
#define AUDIO_H__
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <irrKlang.h>
|
||||
#include <ik_ISoundSource.h>
|
||||
#else
|
||||
#include "./external/irrKlang-64bit-1.6.0/include/irrKlang.h"
|
||||
#include "./external/irrKlang-64bit-1.6.0/include/ik_ISoundSource.h"
|
||||
#endif
|
||||
|
||||
#include "../SQCSim-common/vector3.h"
|
||||
#include "define.h"
|
||||
#include "vector3.h"
|
||||
|
||||
class Audio {
|
||||
private:
|
||||
irrklang::ISoundEngine* m_engine;
|
||||
irrklang::ISound* m_music;
|
||||
|
||||
public:
|
||||
Audio();
|
||||
Audio(const char* music);
|
||||
~Audio();
|
||||
irrklang::ISoundEngine* m_engine;
|
||||
|
||||
void Update3DAudio(Vector3f pos, Vector3f dir, Vector3f speed);
|
||||
|
||||
void Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, float volume);
|
||||
irrklang::ISound* Create3DAudioObj(irrklang::ISound* sound, const char* name, Vector3f pos, Vector3f vel, bool is_looped, float volume);
|
||||
|
||||
void Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& vel, float volume);
|
||||
|
||||
@@ -29,4 +35,4 @@ public:
|
||||
void PauseEngine();
|
||||
};
|
||||
|
||||
#endif // AUDIO_H__
|
||||
#endif // AUDIO_H__
|
||||
|
@@ -1,27 +0,0 @@
|
||||
#ifndef BULLET_H__
|
||||
#define BULLET_H__
|
||||
|
||||
#include "audio.h"
|
||||
#include "player.h"
|
||||
#include "vertexbuffer.h"
|
||||
#include "texture.h"
|
||||
|
||||
class World;
|
||||
|
||||
class Bullet {
|
||||
public:
|
||||
Bullet(Player& player);
|
||||
~Bullet();
|
||||
|
||||
bool Update(World* world, Transformation& tran, float elapsedtime);
|
||||
void Transpose(int& x, int& z);
|
||||
|
||||
private:
|
||||
Vector3f m_startpos;
|
||||
Vector3f m_currentpos;
|
||||
Vector3f m_velocity;
|
||||
|
||||
};
|
||||
|
||||
#endif // BULLET_H__
|
||||
|
@@ -1,274 +0,0 @@
|
||||
#include "chunk.h"
|
||||
#include "world.h"
|
||||
|
||||
Chunk::Chunk(unsigned int x, unsigned int y) : m_posX(x), m_posY(y) {
|
||||
//std::ostringstream pos; // V<>rifie l'existence d'un fichier .chunk avec sa position.
|
||||
//pos << CHUNK_PATH << x << '_' << y << ".chunk";
|
||||
//std::ifstream input(pos.str(), std::fstream::binary);
|
||||
|
||||
//if (input.fail()) {
|
||||
OpenSimplexNoise::Noise simplex = OpenSimplexNoise::Noise(SEED);
|
||||
m_blocks.Reset(BTYPE_AIR);
|
||||
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Montagnes
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
float xnoiz, ynoiz;
|
||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 4096.;
|
||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 4096.;
|
||||
double height = 0;
|
||||
for (int x = 0; x < 39; ++x) {
|
||||
height += simplex.eval(xnoiz, ynoiz);
|
||||
height *= .79;
|
||||
xnoiz *= 1.139;
|
||||
ynoiz *= 1.139;
|
||||
}
|
||||
height = height * 2000. * simplex.eval((double)(ix + x * CHUNK_SIZE_X) / 512., (double)(iz + y * CHUNK_SIZE_Z) / 512.);
|
||||
height /= (CHUNK_SIZE_Y / 1.9);
|
||||
height += 15.;
|
||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy)
|
||||
SetBlock(ix, iy, iz, BTYPE_METAL, nullptr);
|
||||
}
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // Collines
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
float xnoiz, ynoiz;
|
||||
xnoiz = (double)(ix + x * CHUNK_SIZE_X) / 512.;
|
||||
ynoiz = (double)(iz + y * CHUNK_SIZE_Z) / 512.;
|
||||
float height = simplex.eval(xnoiz, ynoiz) * 50.f;// +1.f;
|
||||
for (int iy = 0; iy <= (int)height % CHUNK_SIZE_Y; ++iy) {
|
||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
SetBlock(ix, iy, iz, BTYPE_GRASS, nullptr);
|
||||
}
|
||||
}
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Lacs"
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
for (int iy = 0; iy < 13; ++iy) {
|
||||
if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
SetBlock(ix, iy, iz, BTYPE_ICE, nullptr);
|
||||
}
|
||||
}
|
||||
//for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // "Arbres"
|
||||
// for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) {
|
||||
// float xnoiz, ynoiz;
|
||||
// xnoiz = (double)(iz * CHUNK_SIZE_Y + x * CHUNK_SIZE_X) / 256.;
|
||||
// ynoiz = (double)(ix * CHUNK_SIZE_Y + y * CHUNK_SIZE_Z) / 256.;
|
||||
// bool tree = (int)(abs(simplex.eval(xnoiz, ynoiz)) * 17933.f) % CHUNK_SIZE_Y > 126 ? true : false;
|
||||
// for (int iy = 0; iy < CHUNK_SIZE_Y - 10; ++iy)
|
||||
// if (GetBlock(ix, iy, iz) == BTYPE_AIR)
|
||||
// if (GetBlock(ix, iy - 1, iz) == BTYPE_GRASS)
|
||||
// if (tree) {
|
||||
// for (int i = 0; i < (int)(abs(simplex.eval(xnoiz, ynoiz) * 4)) % 42 + 1; ++i)
|
||||
// SetBlock(ix, iy + i, iz, BTYPE_DIRT, nullptr);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
/* }
|
||||
else {
|
||||
input.seekg(0, std::ios_base::end);
|
||||
int size = input.tellg();
|
||||
input.seekg(0, std::ios_base::beg);
|
||||
|
||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||
input.read(data, size);
|
||||
input.close();
|
||||
|
||||
for (int ix = 0; ix < CHUNK_SIZE_X; ++ix)
|
||||
for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz)
|
||||
for (int iy = 0; iy < CHUNK_SIZE_Y; ++iy)
|
||||
m_blocks.Set(ix, iy, iz, data[ix + (iz * CHUNK_SIZE_X) + (iy * CHUNK_SIZE_Z * CHUNK_SIZE_X)]);
|
||||
}*/
|
||||
}
|
||||
|
||||
Chunk::~Chunk() {
|
||||
/*if (m_isModified) {
|
||||
char data[CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z];
|
||||
|
||||
for (int x = 0; x < CHUNK_SIZE_X; ++x)
|
||||
for (int z = 0; z < CHUNK_SIZE_Z; ++z)
|
||||
for (int y = 0; y < CHUNK_SIZE_Y; ++y)
|
||||
data[x + (z * CHUNK_SIZE_X) + (y * CHUNK_SIZE_Z * CHUNK_SIZE_X)] = (char)GetBlock(x, y, z);
|
||||
|
||||
std::ostringstream pos;
|
||||
pos << CHUNK_PATH << m_posX << '_' << m_posY << ".chunk";
|
||||
|
||||
std::ofstream output(pos.str(), std::fstream::binary);
|
||||
output.write(data, sizeof(data));
|
||||
output.close();
|
||||
}*/
|
||||
}
|
||||
|
||||
void Chunk::RemoveBlock(int x, int y, int z, World* world) {
|
||||
m_blocks.Set(x, y, z, BTYPE_AIR);
|
||||
CheckNeighbors(x, y, world);
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) {
|
||||
m_blocks.Set(x, y, z, type);
|
||||
if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas v<>rifier les chunks voisines.
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
BlockType Chunk::GetBlock(int x, int y, int z) { return m_blocks.Get(x, y, z); }
|
||||
|
||||
NEIGHBOR_CHUNK_POSITION Chunk::CheckNeighbors(unsigned int x, unsigned int z, World* world) {
|
||||
unsigned int cx, cy;
|
||||
|
||||
world->GetScope(cx, cy);
|
||||
|
||||
if (x == 0 && m_posX - cx >= 0 && world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) {
|
||||
world->ChunkAt((m_posX - cx - 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
return X_MINUS;
|
||||
}
|
||||
else if (x == CHUNK_SIZE_X - 1 && m_posX - cx < WORLD_SIZE_X && world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)) {
|
||||
world->ChunkAt((m_posX - cx + 1) * CHUNK_SIZE_X, 1, (m_posY - cy) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
return X_PLUS;
|
||||
}
|
||||
|
||||
if (z == 0 && m_posY - cy >= 0 && world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)) {
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy - 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
return Z_MINUS;
|
||||
}
|
||||
else if (z == CHUNK_SIZE_X - 1 && m_posY - cy < WORLD_SIZE_Y && world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)) {
|
||||
world->ChunkAt((m_posX - cx) * CHUNK_SIZE_X, 1, (m_posY - cy + 1) * CHUNK_SIZE_Z)->MakeDirty();
|
||||
return Z_PLUS;
|
||||
}
|
||||
|
||||
return NONE;
|
||||
}
|
||||
|
||||
void Chunk::GetPosition(unsigned int& x, unsigned int& y) const { x = m_posX; y = m_posY; }
|
||||
|
||||
void Chunk::AddAllVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int cx, int cy, int x, int y, int z, float u, float v, float s, World* world) {
|
||||
if (world->BlockAt(cx + 1, y, cy) == BTYPE_AIR) {
|
||||
AddXPlusVertices(vd, count, bt, x, y, z, u, v, s);
|
||||
}
|
||||
if (world->BlockAt(cx - 1, y, cy) == BTYPE_AIR) {
|
||||
AddXMinusVertices(vd, count, bt, x, y, z, u, v, s);
|
||||
}
|
||||
if (world->BlockAt(cx, y, cy + 1) == BTYPE_AIR) {
|
||||
AddZPlusVertices(vd, count, bt, x, y, z, u, v, s);
|
||||
}
|
||||
if (world->BlockAt(cx, y, cy - 1) == BTYPE_AIR) {
|
||||
AddZMinusVertices(vd, count, bt, x, y, z, u, v, s);
|
||||
}
|
||||
}
|
||||
|
||||
void Chunk::FlushMeshToVBO() {
|
||||
m_vertexBuffer.SetMeshData(m_vd, m_vcount);
|
||||
m_vcount = 0;
|
||||
delete[] m_vd;
|
||||
}
|
||||
|
||||
void Chunk::FlushVBO() {
|
||||
m_vertexBuffer.Flush();
|
||||
}
|
||||
|
||||
void Chunk::Update(BlockInfo* blockinfo[BTYPE_LAST], World* world) {
|
||||
float u, v, s;
|
||||
// Update mesh
|
||||
if (m_isDirty) {
|
||||
int maxVertexCount = (CHUNK_SIZE_X * CHUNK_SIZE_Y * CHUNK_SIZE_Z) * (6 * 4);
|
||||
m_vd = new VertexBuffer::VertexData[maxVertexCount];
|
||||
m_vcount = 0;
|
||||
for (int x = 0; x < CHUNK_SIZE_X; ++x) {
|
||||
for (int z = 0; z < CHUNK_SIZE_Z; ++z) {
|
||||
for (int y = 0; y < CHUNK_SIZE_Y; ++y) {
|
||||
if (m_vcount > USHRT_MAX)
|
||||
break;
|
||||
|
||||
BlockType bt = GetBlock(x, y, z);
|
||||
|
||||
if (bt != BTYPE_AIR) {
|
||||
blockinfo[bt]->GetTexture(u, v, s);
|
||||
AddBlockToMesh(m_vd, m_vcount, bt, x, y, z, u, v, s, world);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_vcount > USHRT_MAX) {
|
||||
m_vcount = USHRT_MAX;
|
||||
std::cout << "[ Chunk :: Update ] Chunk data truncaned , too much vertices to have a 16 bit index " << std::endl;
|
||||
}
|
||||
}
|
||||
m_isDirty = false;
|
||||
}
|
||||
|
||||
void Chunk::AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType bt,
|
||||
int x, int y, int z, float u, float v, float s, World* world) {
|
||||
|
||||
unsigned int cex, cey;
|
||||
|
||||
world->GetScope(cex, cey);
|
||||
|
||||
int cx = x + (m_posX - cex) * CHUNK_SIZE_X, cy = z + (m_posY - cey) * CHUNK_SIZE_Z;
|
||||
|
||||
bool isOnBorder = (x == 0 || x == CHUNK_SIZE_X - 1 ||
|
||||
z == 0 || z == CHUNK_SIZE_Z - 1 ||
|
||||
y == 0 || y == CHUNK_SIZE_Y - 1);
|
||||
|
||||
NEIGHBOR_CHUNK_POSITION ncp = CheckNeighbors(x, z, world);
|
||||
|
||||
if (y == CHUNK_SIZE_Y - 1 || GetBlock(x, y + 1, z) == BTYPE_AIR) { // Y+
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .8f, .8f, .8f, u, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .8f, .8f, .8f, u, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .8f, .8f, .8f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, .8f, .8f, .8f, u + s, v);
|
||||
}
|
||||
|
||||
if (y == 0 || GetBlock(x, y - 1, z) == BTYPE_AIR) { // Y-
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .2f, .2f, .2f, u, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z, .2f, .2f, .2f, u, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, .2f, .2f, .2f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .2f, .2f, .2f, u + s, v);
|
||||
}
|
||||
|
||||
if (!isOnBorder || (x == CHUNK_SIZE_X - 1 && ncp == X_PLUS) || (x == CHUNK_SIZE_X - 1 && ncp == NONE)) { // X+
|
||||
AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world);
|
||||
}
|
||||
else if (!isOnBorder || (x == 0 && ncp == X_MINUS) || (x == 0 && ncp == NONE)) { // X-
|
||||
AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world);
|
||||
}
|
||||
else if (!isOnBorder || (z == CHUNK_SIZE_Z - 1 && ncp == Z_PLUS) || (z == CHUNK_SIZE_Z - 1 && ncp == NONE)) { // Z+
|
||||
AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world);
|
||||
}
|
||||
else if (!isOnBorder || (z == 0 && ncp == Z_MINUS) || (z == 0 && ncp == NONE)) { // Z-
|
||||
AddAllVertices(vd, count, bt, cx, cy, x, y, z, u, v, s, world);
|
||||
}
|
||||
}
|
||||
|
||||
void Chunk::AddXPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) {
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, .9f, .9f, .9f, u, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, .9f, .9f, .9f, u, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .9f, .9f, .9f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .9f, .9f, .9f, u + s, v);
|
||||
}
|
||||
|
||||
void Chunk::AddXMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) {
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .5f, .5f, .5f, u, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, .5f, .5f, .5f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z, .5f, .5f, .5f, u + s, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .5f, .5f, .5f, u, v);
|
||||
}
|
||||
|
||||
void Chunk::AddZPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) {
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z + 1.f, .4f, .4f, .4f, u, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z + 1.f, .4f, .4f, .4f, u + s, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z + 1.f, .4f, .4f, .4f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z + 1.f, .4f, .4f, .4f, u, v + s);
|
||||
}
|
||||
|
||||
void Chunk::AddZMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s) {
|
||||
vd[count++] = VertexBuffer::VertexData(x, y + 1.f, z, 1.f, 1.f, 1.f, u, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y + 1.f, z, 1.f, 1.f, 1.f, u + s, v + s);
|
||||
vd[count++] = VertexBuffer::VertexData(x + 1.f, y, z, 1.f, 1.f, 1.f, u + s, v);
|
||||
vd[count++] = VertexBuffer::VertexData(x, y, z, 1.f, 1.f, 1.f, u, v);
|
||||
}
|
||||
|
||||
void Chunk::Render() const { m_vertexBuffer.Render(); }
|
||||
|
||||
bool Chunk::IsDirty() const { return m_isDirty; }
|
||||
|
||||
void Chunk::MakeDirty() { m_isDirty = true; }
|
||||
|
||||
void Chunk::MakeModified() { m_isModified = true; }
|
||||
|
@@ -1,54 +0,0 @@
|
||||
#ifndef CHUNK_H__
|
||||
#define CHUNK_H__
|
||||
#include "define.h"
|
||||
#include "array3d.h"
|
||||
#include "array2d.h"
|
||||
#include "vertexbuffer.h"
|
||||
#include "blockinfo.h"
|
||||
#include "opensimplex.h"
|
||||
|
||||
class World;
|
||||
|
||||
class Chunk {
|
||||
private:
|
||||
Array3d<BlockType> m_blocks = Array3d<BlockType>(CHUNK_SIZE_X, CHUNK_SIZE_Y, CHUNK_SIZE_Z);
|
||||
VertexBuffer m_vertexBuffer;
|
||||
bool m_isDirty = true;
|
||||
bool m_isModified = false;
|
||||
|
||||
unsigned int m_posX; // Position du chunk dans l'array constituant le monde.
|
||||
unsigned int m_posY;
|
||||
|
||||
VertexBuffer::VertexData* m_vd;
|
||||
int m_vcount;
|
||||
|
||||
void AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s, World* world);
|
||||
|
||||
public:
|
||||
Chunk(unsigned int x, unsigned int y);
|
||||
~Chunk();
|
||||
|
||||
void RemoveBlock(int x, int y, int z, World* world);
|
||||
void SetBlock(int x, int y, int z, BlockType type, World* world);
|
||||
BlockType GetBlock(int x, int y, int z);
|
||||
NEIGHBOR_CHUNK_POSITION CheckNeighbors(unsigned int x, unsigned int z, World* world);
|
||||
void GetPosition(unsigned int& x, unsigned int& y) const;
|
||||
|
||||
void AddAllVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt,int cx, int cy, int x, int y, int z, float u, float v, float s, World* world);
|
||||
void AddXPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s);
|
||||
void AddXMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s);
|
||||
void AddZPlusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s);
|
||||
void AddZMinusVertices(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s);
|
||||
|
||||
void Update(BlockInfo* blockinfo[BTYPE_LAST], World* world);
|
||||
void FlushMeshToVBO();
|
||||
|
||||
void FlushVBO();
|
||||
|
||||
void Render() const;
|
||||
bool IsDirty() const;
|
||||
void MakeDirty();
|
||||
void MakeModified();
|
||||
};
|
||||
|
||||
#endif // CHUNK_H__
|
68
SQCSim2021/cmake/CMakeLists.txt
Normal file
68
SQCSim2021/cmake/CMakeLists.txt
Normal file
@@ -0,0 +1,68 @@
|
||||
cmake_minimum_required(VERSION 3.18.4)
|
||||
|
||||
project(SQCSim-Client VERSION 0.8)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_STANDARD_REQUIRED True)
|
||||
|
||||
set(CMAKE_BUILD_DIRECTORY "./build")
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../")
|
||||
|
||||
set(SQCSIM_COMMON_DIR "../../SQCSim-common/")
|
||||
set(SQCSIM_EXTERN_DIR "../external/")
|
||||
|
||||
find_package(SFML COMPONENTS system window graphics REQUIRED)
|
||||
find_package(DevIL REQUIRED)
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(GLEW REQUIRED)
|
||||
|
||||
find_library(IRRKLANG_LIBRARY
|
||||
NAMES libIrrKlang.so
|
||||
PATHS "${SQCSIM_EXTERN_DIR}/irrKlang-64bit-1.6.0/lib/linux-gcc-64/")
|
||||
|
||||
include_directories(
|
||||
${SQCSIM_EXTERN_DIR}/irrKlang-64bit-1.6.0/include/
|
||||
${SFML_INCLUDE_DIRS}
|
||||
${IL_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
|
||||
add_library(SQCSim-common
|
||||
"${SQCSIM_COMMON_DIR}blockinfo.cpp"
|
||||
"${SQCSIM_COMMON_DIR}bullet.cpp"
|
||||
"${SQCSIM_COMMON_DIR}chunk.cpp"
|
||||
"${SQCSIM_COMMON_DIR}netprotocol.cpp"
|
||||
"${SQCSIM_COMMON_DIR}opensimplex.cpp"
|
||||
"${SQCSIM_COMMON_DIR}player.cpp"
|
||||
"${SQCSIM_COMMON_DIR}transformation.cpp"
|
||||
"${SQCSIM_COMMON_DIR}world.cpp"
|
||||
)
|
||||
|
||||
add_executable(SQCSim-client
|
||||
"../audio.cpp"
|
||||
"../connector.cpp"
|
||||
"../engine.cpp"
|
||||
"../mesh.cpp"
|
||||
"../openglcontext.cpp"
|
||||
"../shader.cpp"
|
||||
"../skybox.cpp"
|
||||
"../texture.cpp"
|
||||
"../textureatlas.cpp"
|
||||
"../tool.cpp"
|
||||
"../vertexbuffer.cpp"
|
||||
"../worldrenderer.cpp"
|
||||
"../main.cpp"
|
||||
)
|
||||
|
||||
target_link_libraries(SQCSim-client PUBLIC SQCSim-common
|
||||
${IRRKLANG_LIBRARY}
|
||||
sfml-system
|
||||
sfml-window
|
||||
sfml-graphics
|
||||
GL
|
||||
GLU
|
||||
GLEW
|
||||
${IL_LIBRARIES}
|
||||
${ILU_LIBRARIES}
|
||||
)
|
||||
|
101
SQCSim2021/connector.cpp
Normal file
101
SQCSim2021/connector.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "connector.h"
|
||||
|
||||
Connector::Connector() {}
|
||||
|
||||
Connector::~Connector() {}
|
||||
|
||||
int Connector::Init() {
|
||||
#ifdef _WIN32
|
||||
if (WSAStartup(MAKEWORD(2, 2), &m_wsaData) != 0) { /* Initialisation de l'environnement reseau (Windows only) */
|
||||
std::cout << "Initialisation WinSock." << std::endl;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
m_sock_udp = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (m_sock_udp == INVALID_SOCKET) { /* Creation du socket UDP */
|
||||
std::cout << "Creation Socket UDP." << std::endl;
|
||||
return 2;
|
||||
}
|
||||
|
||||
m_sock_tcp = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (m_sock_tcp == INVALID_SOCKET) { /* Creation du socket TCP */
|
||||
std::cout << "Creation Socket TCP." << std::endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* Creation structure donnes descripteur du socket serveur */
|
||||
sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(CLI_PORT);
|
||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
if (bind(m_sock_udp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket UDP au port */
|
||||
std::cout << "Association Socket UDP." << std::endl;
|
||||
return 4;
|
||||
}
|
||||
|
||||
if (bind(m_sock_tcp, (sockaddr*)&addr, sizeof(addr)) != 0) { /* Associer le socket TCP au port */
|
||||
std::cout << "Association Socket TCP." << std::endl;
|
||||
return 5;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Connector::Connect(char* srv_addr, std::string name) {
|
||||
sockaddr_in add;
|
||||
m_srvsockaddr.sin_family = AF_INET;
|
||||
m_srvsockaddr.sin_port = htons(SRV_PORT);
|
||||
|
||||
if (inet_pton(AF_INET, srv_addr, &m_srvsockaddr.sin_addr) <= 0) {
|
||||
std::cout << "Addresse serveur invalide." << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (connect(m_sock_tcp, (sockaddr*)&m_srvsockaddr, sizeof(m_srvsockaddr)) < 0) {
|
||||
std::cout << "<EFBFBD>chec de la connexion." << std::endl;
|
||||
}
|
||||
|
||||
char* buf = new char[150];
|
||||
uint32_t buflen = 150;
|
||||
netprot::LoginInfo log;
|
||||
memcpy(&log.name, name.c_str(), name.size() + 1);
|
||||
|
||||
netprot::Serialize(&log, &buf, &buflen);
|
||||
|
||||
int se = send(m_sock_tcp, buf, buflen, 0);
|
||||
|
||||
delete[] buf;
|
||||
buf = new char[150] {0};
|
||||
buflen = 150;
|
||||
int rpack = 0;
|
||||
|
||||
while (rpack < 2) {
|
||||
recv(m_sock_tcp, buf, buflen, 0);
|
||||
|
||||
switch (netprot::getType(buf, buflen)) {
|
||||
case netprot::PACKET_TYPE::LOGINF:
|
||||
if (!netprot::Deserialize(&m_loginfo, buf, buflen)) {
|
||||
std::cout << "Packet LoginInfo invalide." << std::endl;
|
||||
return 2;
|
||||
}
|
||||
++rpack;
|
||||
break;
|
||||
case netprot::PACKET_TYPE::GAMEINFO:
|
||||
if (!netprot::Deserialize(&m_gameinfo, buf, buflen)) {
|
||||
std::cout << "Packet GameInfo invalide." << std::endl;
|
||||
return 3;
|
||||
}
|
||||
++rpack;
|
||||
break;
|
||||
default:
|
||||
std::cout << "Packet invalide." << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t Connector::getId() const { return m_loginfo.sid; }
|
||||
|
||||
unsigned int Connector::getSeed() const { return m_gameinfo.seed; }
|
36
SQCSim2021/connector.h
Normal file
36
SQCSim2021/connector.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef CONNECTOR_H__
|
||||
#define CONNECTOR_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "../SQCSim-common/netprotocol.h"
|
||||
#include "define.h"
|
||||
|
||||
class Connector {
|
||||
public:
|
||||
Connector();
|
||||
~Connector();
|
||||
|
||||
int Init();
|
||||
int Connect(char* srv_addr, std::string name);
|
||||
uint64_t getId() const;
|
||||
unsigned int getSeed() const;
|
||||
|
||||
//void SendInput();
|
||||
//int Sync();
|
||||
private:
|
||||
#ifdef _WIN32
|
||||
WSADATA m_wsaData;
|
||||
#endif
|
||||
std::map<Timestamp, netprot::Input> m_inputmanifest;
|
||||
std::map<uint64_t, netprot::PlayerInfo> m_players;
|
||||
std::map<uint64_t, netprot::TeamInfo> m_teams;
|
||||
|
||||
netprot::LoginInfo m_loginfo;
|
||||
netprot::GameInfo m_gameinfo;
|
||||
|
||||
sockaddr_in m_srvsockaddr;
|
||||
SOCKET m_sock_udp = 0,
|
||||
m_sock_tcp = 0;
|
||||
|
||||
};
|
||||
#endif
|
@@ -1,73 +1,39 @@
|
||||
#ifndef DEFINE_H__
|
||||
#define DEFINE_H__
|
||||
#ifndef CLI_DEFINE_H__
|
||||
#define CLI_DEFINE_H__
|
||||
|
||||
//#define SFML_STATIC true
|
||||
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
#include <iomanip>
|
||||
#include <GL/glew.h>
|
||||
#include <SFML/Window.hpp>
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include <iostream>
|
||||
#include "../SQCSim-common/define.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <GL/glew.h>
|
||||
#include <gl/GL.h>
|
||||
#include <gl/GLU.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
#include <climits>
|
||||
#endif
|
||||
|
||||
#define CHUNK_SIZE_X 16
|
||||
#define CHUNK_SIZE_Y 128
|
||||
#define CHUNK_SIZE_Z 16
|
||||
#define MAX_SELECTION_DISTANCE 5
|
||||
#define SEED 12345
|
||||
#define NETWORK_TEST false
|
||||
#define SRV_ADDR "127.0.0.1"
|
||||
#define COUNTDOWN 300
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define WORLD_SIZE_X 2
|
||||
#define WORLD_SIZE_Y 2
|
||||
|
||||
#define FRAMES_RENDER_CHUNKS 4
|
||||
#define FRAMES_UPDATE_CHUNKS 4
|
||||
#define FRAMES_DELETE_CHUNKS 4
|
||||
|
||||
#define THREADS_GENERATE_CHUNKS 1
|
||||
#define THREADS_UPDATE_CHUNKS 1
|
||||
#define THREADS_DELETE_CHUNKS 1
|
||||
|
||||
#define VIEW_DISTANCE 256
|
||||
#define TEXTURE_SIZE 128
|
||||
#define MAX_BULLETS 64
|
||||
#define BULLET_UPDATES_PER_FRAME 20
|
||||
|
||||
#define BASE_WIDTH 640
|
||||
#define BASE_HEIGHT 480
|
||||
#endif
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define WORLD_SIZE_X 2
|
||||
#define WORLD_SIZE_Y 2
|
||||
|
||||
#define FRAMES_RENDER_CHUNKS 1
|
||||
#define FRAMES_UPDATE_CHUNKS 1
|
||||
#define FRAMES_DELETE_CHUNKS 1
|
||||
|
||||
#define THREADS_GENERATE_CHUNKS 12
|
||||
#define THREADS_UPDATE_CHUNKS 5
|
||||
#define THREADS_DELETE_CHUNKS 2
|
||||
|
||||
#define VIEW_DISTANCE 1024
|
||||
#define TEXTURE_SIZE 512
|
||||
#define MAX_BULLETS 512
|
||||
#endif
|
||||
|
||||
|
||||
typedef uint8_t BlockType;
|
||||
enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_LAST };
|
||||
enum NEIGHBOR_CHUNK_POSITION { NONE, X_MINUS, X_PLUS, Z_MINUS, Z_PLUS };
|
||||
|
||||
//#define TEXTURE_PATH "../SQCSim2021/media/textures/"
|
||||
//#define SHADER_PATH "../SQCSim2021/media/shaders/"
|
||||
//#define AUDIO_PATH "../SQCSim2021/media/audio/"
|
||||
//#define CHUNK_PATH "../SQCSim2021/media/chunks/"
|
||||
|
||||
#define TEXTURE_PATH "./media/textures/"
|
||||
#define SHADER_PATH "./media/shaders/"
|
||||
#define AUDIO_PATH "./media/audio/"
|
||||
#define CHUNK_PATH "./media/chunks/"
|
||||
#define MENU_ITEM_PATH "./media/menu_items/"
|
||||
|
||||
#endif // DEFINE_H__
|
||||
|
0
SQCSim2021/docs/analyse_preliminaire.md
Normal file
0
SQCSim2021/docs/analyse_preliminaire.md
Normal file
1
SQCSim2021/docs/analyse_serveur.md
Normal file
1
SQCSim2021/docs/analyse_serveur.md
Normal file
@@ -0,0 +1 @@
|
||||
|
@@ -1,8 +1,22 @@
|
||||
#include "engine.h"
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include "transformation.h"
|
||||
#include "player.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
#include <queue>
|
||||
|
||||
|
||||
|
||||
// Define a structure to represent notifications
|
||||
struct Notification {
|
||||
std::string message;
|
||||
float displayStartTime = 0.0f;
|
||||
};
|
||||
|
||||
// Use a queue to manage notifications
|
||||
//std::queue<Notification> notificationQueue;
|
||||
// Use a vector to manage notifications
|
||||
std::vector<Notification> notifications;
|
||||
|
||||
Engine::Engine() {}
|
||||
|
||||
@@ -14,6 +28,200 @@ Engine::~Engine() {
|
||||
m_world.GetChunks().Get(x, y)->~Chunk();
|
||||
}
|
||||
|
||||
void Engine::DrawMenu()
|
||||
{
|
||||
static const int sTitle = 400;
|
||||
static const int sButton = 225;
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
glOrtho(0, Width(), 0, Height(), -1, 1);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
MenuBGTexture.Bind();
|
||||
glLoadIdentity();
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 0);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(800, 0);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(800, 600);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 600);
|
||||
glEnd();
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
if (m_gamestate != GameState::OPTIONS)
|
||||
{
|
||||
MenuTitleTexture.Bind();
|
||||
glTranslated(200, 300, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 200);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sTitle, 200);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sTitle, 300);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 300);
|
||||
glEnd();
|
||||
|
||||
MenuStartTexture.Bind();
|
||||
glTranslated(80, -225, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 100);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 100);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
/*MenuResumeTexture.Bind();
|
||||
glTranslated(0, -100, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();*/
|
||||
|
||||
/*MenuOptionsTexture.Bind();
|
||||
glTranslated(0, -100, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();*/
|
||||
|
||||
MenuQuitTexture.Bind();
|
||||
glTranslated(0, -100, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 100);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 100);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/*MenuOptionsTexture.Bind();
|
||||
glTranslated(200, 0, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 0);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sTitle, 0);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sTitle, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
WireFrameTexture.Bind();
|
||||
glTranslated(0, 300, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
OnOffBtnTexture.Bind();
|
||||
glTranslated(200, 0, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
glTranslated(-400, -300, 0);
|
||||
|
||||
MusicTexture.Bind();
|
||||
glTranslated(200, 200, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
OnOffBtnTexture.Bind();
|
||||
glTranslated(200, 0, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 125);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 125);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();
|
||||
|
||||
BackBtnTexture.Bind();
|
||||
glTranslated(-375, 175, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 140);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(sButton, 140);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(sButton, 200);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, 200);
|
||||
glEnd();*/
|
||||
}
|
||||
|
||||
//glEnable(GL_LIGHTING);
|
||||
glDisable(GL_BLEND);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
ShowCursor();
|
||||
}
|
||||
|
||||
void Engine::Init() {
|
||||
GLenum glewErr = glewInit();
|
||||
if (glewErr != GLEW_OK) {
|
||||
@@ -21,11 +229,11 @@ void Engine::Init() {
|
||||
abort();
|
||||
}
|
||||
|
||||
//glDisable(GL_FRAMEBUFFER_SRGB);
|
||||
//glEnable(GL_DEPTH_TEST);
|
||||
//glEnable(GL_STENCIL_TEST);
|
||||
//glEnable(GL_POINT_SMOOTH);
|
||||
//glEnable(GL_BLEND);
|
||||
glDisable(GL_FRAMEBUFFER_SRGB);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glEnable(GL_POINT_SMOOTH);
|
||||
glEnable(GL_BLEND);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
@@ -35,24 +243,46 @@ void Engine::Init() {
|
||||
gluPerspective(45.0f, (float)Width() / (float)Height(), 0.1f, VIEW_DISTANCE);
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||
//glDisable(GL_BLEND);
|
||||
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
//glBlendEquation(GL_FUNC_SUBTRACT);
|
||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||
glDisable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glBlendEquation(GL_FUNC_SUBTRACT);
|
||||
|
||||
//
|
||||
// Objet de skybox avec sa propre texture et son propre shader!
|
||||
m_skybox.Init(0.2f);
|
||||
|
||||
// Objet de musique!
|
||||
m_audio.ToggleMusicState();
|
||||
//m_audio.ToggleMusicState();
|
||||
|
||||
// Array pour les balles.
|
||||
for (int x = 0; x < MAX_BULLETS; ++x)
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) {
|
||||
m_bullets[x] = nullptr;
|
||||
m_whoosh[x] = nullptr; // = m_audio.m_engine.m_audio.m_engine->addSoundSourceFromFile(AUDIO_PATH "noise.ogg", irrklang::ESM_AUTO_DETECT, false);
|
||||
}
|
||||
|
||||
uint64_t seed = SEED;
|
||||
std::string playname = "La Chienne <20> Jacques";
|
||||
if (NETWORK_TEST) { // Test connexion r<>seau.
|
||||
if (!m_conn.Init()) {
|
||||
if (!m_conn.Connect(SRV_ADDR, playname)) {
|
||||
// setup jeu en r<>seau.
|
||||
std::cout << "ID re<72>u du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl;
|
||||
std::cout << "Seed re<72>u du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl;
|
||||
seed = m_conn.getSeed();
|
||||
}
|
||||
else std::cout << "Erreur de connexion." << std::endl;
|
||||
}
|
||||
else std::cout << "Erreur de cr<63>ation de socket." << std::endl;
|
||||
}
|
||||
|
||||
m_world.SetSeed(seed);
|
||||
|
||||
// Init Chunks
|
||||
m_world.GetChunks().Reset(nullptr);
|
||||
|
||||
|
||||
|
||||
// Gestion de souris.
|
||||
CenterMouse();
|
||||
HideCursor();
|
||||
@@ -64,8 +294,13 @@ void Engine::LoadResource() {
|
||||
LoadTexture(m_skybox.GetTexture(), TEXTURE_PATH "skybox.png", true);
|
||||
LoadTexture(m_textureCrosshair, TEXTURE_PATH "cross.bmp", true);
|
||||
LoadTexture(m_textureFont, TEXTURE_PATH "font.bmp", true);
|
||||
LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", false);
|
||||
LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", true);
|
||||
|
||||
LoadTexture(MenuTitleTexture, MENU_ITEM_PATH "test.png");
|
||||
LoadTexture(MenuBGTexture, MENU_ITEM_PATH "test.png");
|
||||
LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png");
|
||||
LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png");
|
||||
LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png");
|
||||
TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png");
|
||||
TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png");
|
||||
TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png");
|
||||
@@ -100,6 +335,89 @@ void Engine::LoadResource() {
|
||||
|
||||
void Engine::UnloadResource() {}
|
||||
|
||||
void Engine::SystemNotification(std::string systemLog) {
|
||||
std::string message = "";
|
||||
|
||||
message = systemLog;
|
||||
|
||||
DisplayNotification(message);
|
||||
}
|
||||
void Engine::KillNotification(Player killer, Player killed) {
|
||||
std::string message = "";
|
||||
|
||||
message = killed.GetUsername() + " killed by -> " + killer.GetUsername();
|
||||
|
||||
DisplayNotification(message);
|
||||
}
|
||||
|
||||
|
||||
void Engine::DisplayNotification(std::string message) {
|
||||
|
||||
if (message.length() > 45) {
|
||||
message = message.substr(0, 45);
|
||||
}
|
||||
// Create a new notification and add it to the queue
|
||||
Notification newNotification;
|
||||
newNotification.message = message;
|
||||
newNotification.displayStartTime = m_time;
|
||||
|
||||
notifications.push_back(newNotification);
|
||||
}
|
||||
|
||||
// Add a method to process the notification queue
|
||||
void Engine::ProcessNotificationQueue() {
|
||||
m_textureFont.Bind();
|
||||
float scale = GetScale();
|
||||
unsigned int xOffset = Width() - Width() * 0.26;
|
||||
unsigned int yOffset = Height() - (Height() / 2.2);
|
||||
|
||||
// Iterate through the notifications and display them
|
||||
for (auto it = notifications.begin(); it != notifications.end(); ) {
|
||||
float timeSinceDisplay = m_time - it->displayStartTime;
|
||||
|
||||
// Display the notification message with vertical offset
|
||||
unsigned int y = yOffset - (static_cast<unsigned int>(scale * 20) * (it - notifications.begin()));
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
|
||||
glLoadIdentity();
|
||||
glOrtho(0, Width(), 0, Height(), -1, 1);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
PrintText(xOffset, y, scale, it->message);
|
||||
|
||||
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR);
|
||||
glBlendEquation(GL_FUNC_SUBTRACT);
|
||||
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
// Check if it's time to remove the notification (display for 2 seconds)
|
||||
if (timeSinceDisplay >= 4.0f) {
|
||||
it = notifications.erase(it); // Remove the notification
|
||||
}
|
||||
else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Engine::DisplayCrosshair() {
|
||||
m_textureCrosshair.Bind();
|
||||
static const int crossSize = 32;
|
||||
@@ -120,7 +438,8 @@ void Engine::DisplayCrosshair() {
|
||||
void Engine::DisplayCurrentItem() {
|
||||
}
|
||||
|
||||
void Engine::DisplayHud() {
|
||||
|
||||
void Engine::DisplayHud(int timer) {
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glLoadIdentity();
|
||||
glDisable(GL_BLEND);
|
||||
@@ -133,7 +452,7 @@ void Engine::DisplayHud() {
|
||||
float playerHp = m_player.GetHP();
|
||||
float facteurOmbrage = m_displayInfo ? 0.5f : 1.0f;
|
||||
|
||||
// Arri<72>re-plan (Barre HP)
|
||||
// Arri<72>re-plan (Barre HP)
|
||||
glColor3f(1.0f * facteurOmbrage, 1.0f * facteurOmbrage, 1.0f * facteurOmbrage);
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(fPosX, fPosY - fBarHeight); // Bas-Gauche
|
||||
@@ -142,7 +461,7 @@ void Engine::DisplayHud() {
|
||||
glVertex2f(fPosX, fPosY); // Haut-Gauche
|
||||
glEnd();
|
||||
|
||||
//TODO: Associer avec m<>chanique de vie du joueur
|
||||
//TODO: Associer avec m<>chanique de vie du joueur
|
||||
|
||||
// Barre HP
|
||||
glColor3f(0.0f * facteurOmbrage, 1.0f * facteurOmbrage, 0.0f * facteurOmbrage);
|
||||
@@ -153,7 +472,7 @@ void Engine::DisplayHud() {
|
||||
glVertex2f(fPosX, fPosY); // Haut-Gauche
|
||||
glEnd();
|
||||
|
||||
// Barre <20>quip
|
||||
// Barre <20>quip
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glColor3f(1.0f * facteurOmbrage, 1.0f * facteurOmbrage, 1.0f * facteurOmbrage);
|
||||
@@ -174,7 +493,7 @@ void Engine::DisplayHud() {
|
||||
glTexCoord2f(1, 1); glVertex2i(0, itemHeight);
|
||||
glEnd();
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
//glDisable(GL_BLEND);
|
||||
|
||||
// Username
|
||||
glEnable(GL_BLEND);
|
||||
@@ -186,6 +505,12 @@ void Engine::DisplayHud() {
|
||||
std::ostringstream ss;
|
||||
ss << m_player.GetUsername();
|
||||
PrintText(fPosX, fPosY, scale, ss.str());
|
||||
|
||||
//Countdown
|
||||
ss.str("");
|
||||
ss << "Time: " << (int)(timer / 60) << ":" << std::setw(2) << std::setfill('0') << timer % 60;
|
||||
PrintText(Width() - Width() * 0.15, Height() - (Height() / 19.2), scale, ss.str());
|
||||
|
||||
}
|
||||
|
||||
void Engine::DisplayInfo(float elapsedTime, BlockType bloc) {
|
||||
@@ -205,7 +530,7 @@ void Engine::DisplayInfo(float elapsedTime, BlockType bloc) {
|
||||
ss << " To-Be-Deleted Chunks : " << m_world.GettbDeleted();
|
||||
PrintText(x, Height() - (Height() / 10.7), scale, ss.str());
|
||||
ss.str("");
|
||||
ss << " Velocity : " << m_player.GetVelocity(); // IMPORTANT : on utilise l <20> operateur << pour afficher la position
|
||||
ss << " Velocity : " << m_player.GetVelocity(); // IMPORTANT : on utilise l <20> operateur << pour afficher la position
|
||||
PrintText(x, Height() / 48, scale, ss.str());
|
||||
ss.str("");
|
||||
ss << " Direction : " << m_player.GetDirection();
|
||||
@@ -230,6 +555,7 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) {
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
@@ -240,13 +566,25 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) {
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
int timer = GetCountdown(elapsedTime);
|
||||
|
||||
// Appel de la fonction pour l'affichage de notifications
|
||||
if (m_keyK) {
|
||||
SystemNotification(m_messageNotification);
|
||||
m_keyK = false;
|
||||
}
|
||||
if (m_keyL) {
|
||||
|
||||
KillNotification(m_player, m_player);
|
||||
m_keyL = false;
|
||||
}
|
||||
|
||||
if (m_displayInfo) {
|
||||
DisplayInfo(elapsedTime, bloc);
|
||||
}
|
||||
|
||||
if (m_displayHud) {
|
||||
DisplayHud();
|
||||
DisplayHud(timer);
|
||||
}
|
||||
|
||||
if (m_displayCrosshair) {
|
||||
@@ -295,95 +633,143 @@ float Engine::GetScale() const {
|
||||
}
|
||||
|
||||
int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; }
|
||||
int Engine::GetCountdown(float elapsedTime) {
|
||||
if (m_resetcountdown)
|
||||
{
|
||||
m_countdown = m_time + COUNTDOWN;
|
||||
m_resetcountdown = false;
|
||||
}
|
||||
if (m_countdown < m_time)
|
||||
Stop();
|
||||
if(!m_stopcountdown)
|
||||
m_time += elapsedTime;
|
||||
return m_countdown - (int)m_time;
|
||||
}
|
||||
|
||||
void Engine::Render(float elapsedTime) {
|
||||
//static float gameTime = elapsedTime;
|
||||
static float pollTime = 0;
|
||||
static float bulletTime = 0;
|
||||
static BlockType bloc = 1;
|
||||
|
||||
if (elapsedTime > 0.1f) return;
|
||||
|
||||
//gameTime += elapsedTime;
|
||||
pollTime += elapsedTime;
|
||||
|
||||
Transformation all;
|
||||
Transformation skybox;
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
// Transformations initiales
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
if (m_gamestate == GameState::PLAY)
|
||||
{
|
||||
HideCursor();
|
||||
CenterMouse(); //D<>placement de centermouse dans l'action de jouer
|
||||
|
||||
if (bulletTime > 0.f) bulletTime -= elapsedTime;
|
||||
if (bulletTime < 0.f) bulletTime = 0.f;
|
||||
//static float gameTime = elapsedTime;
|
||||
static irrklang::ISound* step; // Pour les sons de pas.
|
||||
static float pollTime = 0;
|
||||
static float bulletTime = 0;
|
||||
static BlockType bloc = 1;
|
||||
|
||||
if (pollTime >= .005f) {
|
||||
m_player.ApplyPhysics(m_player.GetInput(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, (bloc == BTYPE_LAST && bulletTime <= 0.f && m_mouseL), elapsedTime), &m_world, elapsedTime, &m_audio);
|
||||
m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonn<6E>es du joueur et
|
||||
// son vecteur de v<>locit<69> (pour l'effet Doppler)
|
||||
pollTime = 0;
|
||||
}
|
||||
if (elapsedTime > 0.1f) return;
|
||||
|
||||
m_player.ApplyTransformation(all);
|
||||
//gameTime += elapsedTime;
|
||||
pollTime += elapsedTime;
|
||||
|
||||
m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation
|
||||
// (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!).
|
||||
Transformation all;
|
||||
Transformation skybox;
|
||||
Vector3f vstep;
|
||||
|
||||
if (m_mouseWU) bloc++;
|
||||
else if (m_mouseWD) bloc--;
|
||||
if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1;
|
||||
else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST <20>quipe l'arme.
|
||||
m_mouseWU = m_mouseWD = false;
|
||||
// Transformations initiales
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
if (m_mouseL) {
|
||||
if (bloc != BTYPE_LAST)
|
||||
m_world.ChangeBlockAtCursor(bloc, m_player, m_block);
|
||||
else if (bulletTime <= 0.f) {
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow").
|
||||
if (!m_bullets[x]) {
|
||||
m_bullets[x] = new Bullet(m_player);
|
||||
break;
|
||||
}
|
||||
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<6D>re balle de l'array.
|
||||
m_bullets[0]->~Bullet();
|
||||
m_bullets[0] = new Bullet(m_player);
|
||||
}
|
||||
bulletTime = .1f;
|
||||
m_audio.Create3DAudioObj(m_powpow, AUDIO_PATH "windowsaccount.wav", m_player.GetPOV(), m_player.GetDirection() * 10, .5f);
|
||||
if (m_flash) { // Coupe le rendering et affiche un frame blanc, pour simuler un flash.
|
||||
glClearColor(.8f, .8f, .8f, 1.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
glClearColor(0.f, 0.f, 0.f, 1.f);
|
||||
return;
|
||||
if (bulletTime > 0.f) bulletTime -= elapsedTime;
|
||||
if (bulletTime < 0.f) bulletTime = 0.f;
|
||||
|
||||
static bool leftright = false;
|
||||
if (pollTime >= .005f) {
|
||||
Player::Sound snd = m_player.ApplyPhysics(m_player.GetInput(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, (bloc == BTYPE_LAST && bulletTime <= 0.f && m_mouseL), elapsedTime), &m_world, elapsedTime);
|
||||
switch (snd) {
|
||||
case Player::Sound::STEP:
|
||||
if (leftright)
|
||||
vstep = Vector3f(m_player.GetPosition().x + m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z + m_player.GetDirection().x);
|
||||
else vstep = Vector3f(m_player.GetPosition().x - m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z - m_player.GetDirection().x);
|
||||
m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), .8f);
|
||||
leftright = !leftright;
|
||||
break;
|
||||
case Player::Sound::FALL:
|
||||
m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), 1.f);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
m_audio.Update3DAudio(m_player.GetPOV(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonn<6E>es du joueur et
|
||||
// son vecteur de v<>locit<69> (pour l'effet Doppler)
|
||||
pollTime = 0;
|
||||
}
|
||||
|
||||
m_player.ApplyTransformation(all);
|
||||
|
||||
m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation
|
||||
// (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!).
|
||||
|
||||
if (m_mouseWU) bloc++;
|
||||
else if (m_mouseWD) bloc--;
|
||||
if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1;
|
||||
else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST <20>quipe l'arme.
|
||||
m_mouseWU = m_mouseWD = false;
|
||||
|
||||
if (m_mouseL) {
|
||||
if (bloc != BTYPE_LAST)
|
||||
m_world.ChangeBlockAtCursor(bloc, m_player.GetPosition(), m_player.GetDirection(), m_block);
|
||||
else if (bulletTime <= 0.f) {
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow").
|
||||
if (!m_bullets[x]) {
|
||||
m_bullets[x] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection());
|
||||
break;
|
||||
}
|
||||
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<6D>re balle de l'array.
|
||||
m_bullets[0]->~Bullet();
|
||||
m_bullets[0] = new Bullet(m_player.GetPOV() + m_player.GetDirection(), m_player.GetDirection());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (m_mouseR)
|
||||
m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player, m_block);
|
||||
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) // Array de bullets en jeu.
|
||||
if (m_bullets[x])
|
||||
if (m_bullets[x]->Update(&m_world, all, elapsedTime)) {
|
||||
m_bullets[x]->~Bullet();
|
||||
m_bullets[x] = nullptr;
|
||||
}
|
||||
|
||||
m_world.Update(m_renderCount, m_bullets, m_player, all, m_shader01, m_textureAtlas, m_blockinfo);
|
||||
|
||||
if (m_isSkybox) m_skybox.Render(skybox);
|
||||
|
||||
DrawHud(elapsedTime, bloc);
|
||||
m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player.GetPosition(), m_player.GetDirection(), m_block);
|
||||
|
||||
static bool fell = false;
|
||||
if (m_player.GetPosition().y < 1.7f && !fell) {
|
||||
m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f);
|
||||
fell = true;
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) { // Array de bullets en jeu.
|
||||
if (m_bullets[x]) {
|
||||
for (int b = 0; b < BULLET_UPDATES_PER_FRAME; ++b)
|
||||
if (m_bullets[x]->Update(&m_world, elapsedTime, BULLET_UPDATES_PER_FRAME)) {
|
||||
m_bullets[x]->~Bullet();
|
||||
if (m_whoosh[x])
|
||||
m_whoosh[x]->drop();
|
||||
m_bullets[x] = nullptr;
|
||||
m_whoosh[x] = nullptr;
|
||||
break;
|
||||
}
|
||||
else if (!m_whoosh[x]) {
|
||||
m_whoosh[x] = m_audio.Create3DAudioObj(m_whoosh[x], AUDIO_PATH "noise.wav", m_bullets[x]->getPos(), m_bullets[x]->getVel(), true, (m_bullets[x]->getPos() - m_player.GetPosition()).Length());
|
||||
}
|
||||
else m_audio.Render3DAudioObj(m_whoosh[x], m_bullets[x]->getPos(), m_bullets[x]->getVel(), 5 - (m_bullets[x]->getPos() - m_player.GetPosition()).Length());
|
||||
}
|
||||
}
|
||||
else if (m_player.GetPosition().y < -20.f) {
|
||||
m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); // Respawn si le bonho- joueur tombe en bas du monde.
|
||||
fell = false;
|
||||
|
||||
m_wrenderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas);
|
||||
m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo);
|
||||
m_wrenderer.UpdateWorld(&m_world, m_player.GetPosition(), m_blockinfo);
|
||||
|
||||
if (m_isSkybox) m_skybox.Render(skybox);
|
||||
|
||||
ProcessNotificationQueue();
|
||||
DrawHud(elapsedTime, bloc);
|
||||
|
||||
static bool fell = false;
|
||||
if (m_player.GetPosition().y < 1.7f && !fell) {
|
||||
m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), 1.f);
|
||||
fell = true;
|
||||
}
|
||||
else if (m_player.GetPosition().y < -20.f) {
|
||||
m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); // Respawn si le bonho- joueur tombe en bas du monde.
|
||||
fell = false;
|
||||
}
|
||||
|
||||
}
|
||||
else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS)
|
||||
{
|
||||
DrawMenu();
|
||||
}
|
||||
else if (m_gamestate == GameState::QUIT)
|
||||
Stop();
|
||||
}
|
||||
|
||||
void Engine::KeyPressEvent(unsigned char key) {
|
||||
@@ -409,14 +795,15 @@ void Engine::KeyPressEvent(unsigned char key) {
|
||||
}
|
||||
break;
|
||||
case 36: // ESC - Quitter
|
||||
Stop();
|
||||
m_gamestate = GameState::MAIN_MENU;
|
||||
//Stop();
|
||||
break;
|
||||
case 57: // Space - Sauter
|
||||
if (!m_keySpace) {
|
||||
m_keySpace = true;
|
||||
}
|
||||
break;
|
||||
case 94: // F10 - Plein <20>cran
|
||||
case 94: // F10 - Plein <20>cran
|
||||
IsFullscreen() ? SetFullscreen(false) : SetFullscreen(true);
|
||||
//SetFullscreen(!IsFullscreen());
|
||||
break;
|
||||
@@ -424,14 +811,27 @@ void Engine::KeyPressEvent(unsigned char key) {
|
||||
break;
|
||||
case 5: // F - Ignorer
|
||||
break;
|
||||
case 10: // K - Debugging DisplayNotification()
|
||||
m_keyK = true;
|
||||
m_messageNotification = "notifications systeme peuvent <20>tre affich<63>";
|
||||
break;
|
||||
case 11: // L - Debugging DisplayNotification()
|
||||
m_keyL = true;
|
||||
break;
|
||||
case 6: // G - Ignorer
|
||||
break;
|
||||
case 12: // M - Ignorer
|
||||
break;
|
||||
case 7: // H - Ignorer
|
||||
break;
|
||||
case 8: // I - Ignorer
|
||||
break;
|
||||
case 15: // P - Ignorer
|
||||
break;
|
||||
case 17: // R - Ignorer
|
||||
break;
|
||||
case 19: // T - Ignorer
|
||||
break;
|
||||
case 24: // Y - Ignorer
|
||||
break;
|
||||
case 255: // Fn - Ignorer
|
||||
@@ -456,6 +856,10 @@ void Engine::KeyReleaseEvent(unsigned char key) {
|
||||
case 5: // F - Toggle flash
|
||||
m_flash = !m_flash;
|
||||
break;
|
||||
case 6: // G - Toggle Stop Countdown
|
||||
m_stopcountdown = !m_stopcountdown;
|
||||
std::cout << "STOP COUNTDOWN " << (m_stopcountdown ? "enabled" : "disabled") << std::endl;
|
||||
break;
|
||||
case 7: // H - Toggle HUD
|
||||
m_displayHud = !m_displayHud;
|
||||
std::cout << "DISPLAY HUD " << (m_displayHud ? "enabled" : "disabled") << std::endl;
|
||||
@@ -464,15 +868,36 @@ void Engine::KeyReleaseEvent(unsigned char key) {
|
||||
m_displayInfo = !m_displayInfo;
|
||||
std::cout << "DISPLAY INFO " << (m_displayInfo ? "enabled" : "disabled") << std::endl;
|
||||
break;
|
||||
case 10: // K
|
||||
m_keyK = false;
|
||||
break;
|
||||
case 11: // L - Debugging DisplayNotification()
|
||||
m_keyL = false;
|
||||
break;
|
||||
case 12: // M - Toggle music
|
||||
m_audio.ToggleMusicState();
|
||||
break;
|
||||
case 15:
|
||||
for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow").
|
||||
if (!m_bullets[x]) {
|
||||
m_bullets[x] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f,0.f,1.f));
|
||||
break;
|
||||
}
|
||||
else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi<6D>re balle de l'array.
|
||||
m_bullets[0]->~Bullet();
|
||||
m_bullets[0] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f, 0.f, 1.f));
|
||||
}
|
||||
break;
|
||||
case 17: // R - Toggle skybox
|
||||
m_isSkybox = !m_isSkybox;
|
||||
break;
|
||||
case 18: // S - Stop reculer
|
||||
m_keyS = false;
|
||||
break;
|
||||
case 19: // T -Reset countdown
|
||||
m_resetcountdown = true;
|
||||
std::cout << "RESET COUNTDOWN" << std::endl;
|
||||
break;
|
||||
case 22: // W - Stop avancer
|
||||
m_keyW = false;
|
||||
break;
|
||||
@@ -493,35 +918,47 @@ void Engine::MouseMoveEvent(int x, int y) {
|
||||
m_player.TurnLeftRight(x - (Width() / 2));
|
||||
m_player.TurnTopBottom(y - (Height() / 2));
|
||||
|
||||
// Centrer la souris seulement si elle n'est pas d<>j<EFBFBD> centr<74>e
|
||||
// Il est n<>cessaire de faire la v<>rification pour <20>viter de tomber
|
||||
// dans une boucle infinie o<> l'appel <20> CenterMouse g<>n<EFBFBD>re un
|
||||
// Centrer la souris seulement si elle n'est pas d<>j<EFBFBD> centr<74>e
|
||||
// Il est n<>cessaire de faire la v<>rification pour <20>viter de tomber
|
||||
// dans une boucle infinie o<> l'appel <20> CenterMouse g<>n<EFBFBD>re un
|
||||
// MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre
|
||||
// MouseMoveEvent, etc
|
||||
if (x == (Width() / 2) && y == (Height() / 2))
|
||||
return;
|
||||
|
||||
CenterMouse();
|
||||
}
|
||||
|
||||
void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) {
|
||||
switch (button) {
|
||||
case MOUSE_BUTTON_LEFT:
|
||||
m_mouseL = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_RIGHT:
|
||||
m_mouseR = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_MIDDLE:
|
||||
m_mouseC = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_WHEEL_UP:
|
||||
m_mouseWU = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_WHEEL_DOWN:
|
||||
m_mouseWD = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_NONE: break;
|
||||
m_mousemx = x;
|
||||
m_mousemy = y;
|
||||
|
||||
if (m_gamestate == GameState::PLAY)
|
||||
{
|
||||
switch (button) {
|
||||
case MOUSE_BUTTON_LEFT:
|
||||
m_mouseL = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_RIGHT:
|
||||
m_mouseR = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_MIDDLE:
|
||||
m_mouseC = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_WHEEL_UP:
|
||||
m_mouseWU = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_WHEEL_DOWN:
|
||||
m_mouseWD = true;
|
||||
break;
|
||||
case MOUSE_BUTTON_NONE: break;
|
||||
}
|
||||
}
|
||||
else if (m_gamestate == GameState::MAIN_MENU)
|
||||
{
|
||||
if ((m_mousemx >= 285 && m_mousemx <= 490) && (m_mousemy >= 150 && m_mousemy <= 250))
|
||||
m_gamestate = GameState::PLAY;
|
||||
if ((m_mousemx >= 305 && m_mousemx <= 450) && (m_mousemy >= 300 && m_mousemy <= 400))
|
||||
m_gamestate = GameState::QUIT;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,25 +1,30 @@
|
||||
#ifndef ENGINE_H__
|
||||
#define ENGINE_H__
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include "../SQCSim-common/array2d.h"
|
||||
#include "../SQCSim-common/blockinfo.h"
|
||||
#include "../SQCSim-common/bullet.h"
|
||||
#include "../SQCSim-common/chunk.h"
|
||||
#include "../SQCSim-common/world.h"
|
||||
#include "../SQCSim-common/transformation.h"
|
||||
#include "../SQCSim-common/player.h"
|
||||
#include "define.h"
|
||||
#include "openglcontext.h"
|
||||
#include "texture.h"
|
||||
#include "transformation.h"
|
||||
#include "shader.h"
|
||||
#include "player.h"
|
||||
#include "chunk.h"
|
||||
#include "skybox.h"
|
||||
#include "audio.h"
|
||||
#include "textureatlas.h"
|
||||
#include "blockinfo.h"
|
||||
#include "array2d.h"
|
||||
#include "world.h"
|
||||
#include "bullet.h"
|
||||
#include "connector.h"
|
||||
#include "worldrenderer.h"
|
||||
|
||||
class Engine : public OpenglContext {
|
||||
public:
|
||||
Engine();
|
||||
virtual ~Engine();
|
||||
virtual void DrawMenu();
|
||||
virtual void Init();
|
||||
virtual void DeInit();
|
||||
virtual void LoadResource();
|
||||
@@ -35,21 +40,28 @@ private:
|
||||
float GetScale() const;
|
||||
|
||||
int GetFps(float elapsedTime) const;
|
||||
int GetCountdown(float elapsedTime);
|
||||
|
||||
bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps = true, bool stopOnError = true);
|
||||
|
||||
void SystemNotification(std::string systemLog);
|
||||
void KillNotification(Player killer, Player killed);
|
||||
void DisplayNotification(std::string message);
|
||||
void ProcessNotificationQueue();
|
||||
void DisplayCrosshair();
|
||||
void DisplayCurrentItem();
|
||||
void DisplayHud();
|
||||
void DisplayHud(int timer);
|
||||
void DisplayInfo(float elapsedTime, BlockType bloc);
|
||||
void DrawHud(float elapsedTime, BlockType bloc);
|
||||
void PrintText(float x, float y, float scale, const std::string& t);
|
||||
|
||||
Connector m_conn;
|
||||
Shader m_shader01;
|
||||
BlockInfo* m_blockinfo[BTYPE_LAST];
|
||||
TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST);
|
||||
|
||||
World m_world = World();
|
||||
WorldRenderer m_wrenderer = WorldRenderer();
|
||||
|
||||
Texture m_textureSkybox;
|
||||
Texture m_textureFont;
|
||||
@@ -59,16 +71,28 @@ private:
|
||||
Skybox m_skybox;
|
||||
Audio m_audio = Audio(AUDIO_PATH "start.wav");
|
||||
|
||||
irrklang::ISound* m_powpow;
|
||||
irrklang::ISound* m_scream;
|
||||
irrklang::ISound* m_powpow,
|
||||
* m_scream;
|
||||
irrklang::ISound *m_whoosh[MAX_BULLETS];
|
||||
|
||||
Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f));
|
||||
|
||||
|
||||
Bullet* m_bullets[MAX_BULLETS];
|
||||
|
||||
//Menu
|
||||
enum class GameState { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY };
|
||||
GameState m_gamestate = GameState::MAIN_MENU;
|
||||
Texture MenuTitleTexture;
|
||||
Texture MenuBGTexture;
|
||||
Texture MenuStartTexture;
|
||||
Texture MenuQuitTexture;
|
||||
Texture MenuOptionsTexture;
|
||||
|
||||
float m_scale;
|
||||
float m_time = 0;
|
||||
|
||||
int m_renderCount = 0;
|
||||
int m_countdown = COUNTDOWN;
|
||||
|
||||
bool m_wireframe = false;
|
||||
bool m_isSkybox = true;
|
||||
@@ -77,7 +101,11 @@ private:
|
||||
bool m_displayCrosshair = true;
|
||||
bool m_displayHud = true;
|
||||
bool m_displayInfo = false;
|
||||
bool m_resetcountdown = false;
|
||||
bool m_stopcountdown = false;
|
||||
|
||||
bool m_keyK = false;
|
||||
bool m_keyL = false;
|
||||
bool m_keyW = false;
|
||||
bool m_keyA = false;
|
||||
bool m_keyS = false;
|
||||
@@ -88,6 +116,11 @@ private:
|
||||
bool m_mouseC = false;
|
||||
bool m_mouseWU = false;
|
||||
bool m_mouseWD = false;
|
||||
//Pour trouver ou est la souris
|
||||
float m_mousemx = 0;
|
||||
float m_mousemy = 0;
|
||||
|
||||
std::string m_messageNotification = "";
|
||||
};
|
||||
|
||||
#endif // ENGINE_H__
|
||||
|
58
SQCSim2021/external/sfml251-32/doc/html/AlResource_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/AlResource_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Audio_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Audio_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Audio_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Audio_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
77
SQCSim2021/external/sfml251-32/doc/html/BlendMode_8hpp_source.html
vendored
Normal file
77
SQCSim2021/external/sfml251-32/doc/html/BlendMode_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/CircleShape_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/CircleShape_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Clipboard_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Clipboard_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Clock_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Clock_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Color_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Color_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
57
SQCSim2021/external/sfml251-32/doc/html/Config_8hpp_source.html
vendored
Normal file
57
SQCSim2021/external/sfml251-32/doc/html/Config_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/ContextSettings_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/ContextSettings_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
61
SQCSim2021/external/sfml251-32/doc/html/Context_8hpp_source.html
vendored
Normal file
61
SQCSim2021/external/sfml251-32/doc/html/Context_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/ConvexShape_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/ConvexShape_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
74
SQCSim2021/external/sfml251-32/doc/html/Cursor_8hpp_source.html
vendored
Normal file
74
SQCSim2021/external/sfml251-32/doc/html/Cursor_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
61
SQCSim2021/external/sfml251-32/doc/html/Drawable_8hpp_source.html
vendored
Normal file
61
SQCSim2021/external/sfml251-32/doc/html/Drawable_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
58
SQCSim2021/external/sfml251-32/doc/html/Err_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/Err_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
146
SQCSim2021/external/sfml251-32/doc/html/Event_8hpp_source.html
vendored
Normal file
146
SQCSim2021/external/sfml251-32/doc/html/Event_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/FileInputStream_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/FileInputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
63
SQCSim2021/external/sfml251-32/doc/html/Font_8hpp_source.html
vendored
Normal file
63
SQCSim2021/external/sfml251-32/doc/html/Font_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/Ftp_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/Ftp_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/GlResource_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/GlResource_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
70
SQCSim2021/external/sfml251-32/doc/html/Glsl_8hpp_source.html
vendored
Normal file
70
SQCSim2021/external/sfml251-32/doc/html/Glsl_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
63
SQCSim2021/external/sfml251-32/doc/html/Glyph_8hpp_source.html
vendored
Normal file
63
SQCSim2021/external/sfml251-32/doc/html/Glyph_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
98
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp.html
vendored
Normal file
98
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp.html
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>SFML - Simple and Fast Multimedia Library</title>
|
||||
<meta http-equiv="Content-Type" content="text/html;"/>
|
||||
<meta charset="utf-8"/>
|
||||
<!--<link rel='stylesheet' type='text/css' href="https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic"/>-->
|
||||
<link rel="stylesheet" type="text/css" href="doxygen.css" title="default" media="screen,print" />
|
||||
<script type="text/javascript" src="jquery.js"></script>
|
||||
<script type="text/javascript" src="dynsections.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="banner-container">
|
||||
<div id="banner">
|
||||
<span id="sfml">SFML 2.5.1</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content">
|
||||
<!-- Generated by Doxygen 1.8.14 -->
|
||||
<div id="navrow1" class="tabs">
|
||||
<ul class="tablist">
|
||||
<li><a href="index.html"><span>Main Page</span></a></li>
|
||||
<li><a href="pages.html"><span>Related Pages</span></a></li>
|
||||
<li><a href="modules.html"><span>Modules</span></a></li>
|
||||
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
||||
<li><a href="annotated.html"><span>Classes</span></a></li>
|
||||
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="navrow2" class="tabs2">
|
||||
<ul class="tablist">
|
||||
<li><a href="files.html"><span>File List</span></a></li>
|
||||
<li><a href="globals.html"><span>File Members</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="nav-path" class="navpath">
|
||||
<ul>
|
||||
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_c0a853e81d6f1c1f0a3eb7a27dc24256.html">SFML</a></li> </ul>
|
||||
</div>
|
||||
</div><!-- top -->
|
||||
<div class="header">
|
||||
<div class="summary">
|
||||
<a href="#define-members">Macros</a> </div>
|
||||
<div class="headertitle">
|
||||
<div class="title">GpuPreference.hpp File Reference</div> </div>
|
||||
</div><!--header-->
|
||||
<div class="contents">
|
||||
|
||||
<p>Headers.
|
||||
<a href="#details">More...</a></p>
|
||||
<div class="textblock"><code>#include <SFML/Config.hpp></code><br />
|
||||
</div>
|
||||
<p><a href="GpuPreference_8hpp_source.html">Go to the source code of this file.</a></p>
|
||||
<table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
|
||||
Macros</h2></td></tr>
|
||||
<tr class="memitem:ab0233c2d867cbd561036ed2440a4fec0"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="GpuPreference_8hpp.html#ab0233c2d867cbd561036ed2440a4fec0">SFML_DEFINE_DISCRETE_GPU_PREFERENCE</a></td></tr>
|
||||
<tr class="memdesc:ab0233c2d867cbd561036ed2440a4fec0"><td class="mdescLeft"> </td><td class="mdescRight">A macro to encourage usage of the discrete GPU. <a href="#ab0233c2d867cbd561036ed2440a4fec0">More...</a><br /></td></tr>
|
||||
<tr class="separator:ab0233c2d867cbd561036ed2440a4fec0"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table>
|
||||
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
||||
<div class="textblock"><p>Headers. </p>
|
||||
<p>File containing SFML_DEFINE_DISCRETE_GPU_PREFERENCE </p>
|
||||
|
||||
<p class="definition">Definition in file <a class="el" href="GpuPreference_8hpp_source.html">GpuPreference.hpp</a>.</p>
|
||||
</div><h2 class="groupheader">Macro Definition Documentation</h2>
|
||||
<a id="ab0233c2d867cbd561036ed2440a4fec0"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#ab0233c2d867cbd561036ed2440a4fec0">◆ </a></span>SFML_DEFINE_DISCRETE_GPU_PREFERENCE</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">#define SFML_DEFINE_DISCRETE_GPU_PREFERENCE</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
<p>A macro to encourage usage of the discrete GPU. </p>
|
||||
<p>In order to inform the Nvidia/AMD driver that an SFML application could benefit from using the more powerful discrete GPU, special symbols have to be publicly exported from the final executable.</p>
|
||||
<p>SFML defines a helper macro to easily do this.</p>
|
||||
<p>Place SFML_DEFINE_DISCRETE_GPU_PREFERENCE in the global scope of a source file that will be linked into the final executable. Typically it is best to place it where the main function is also defined. </p>
|
||||
|
||||
<p class="definition">Definition at line <a class="el" href="GpuPreference_8hpp_source.html#l00069">69</a> of file <a class="el" href="GpuPreference_8hpp_source.html">GpuPreference.hpp</a>.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- contents -->
|
||||
</div>
|
||||
<div id="footer-container">
|
||||
<div id="footer">
|
||||
SFML is licensed under the terms and conditions of the <a href="https://www.sfml-dev.org/license.php">zlib/png license</a>.<br>
|
||||
Copyright © Laurent Gomila ::
|
||||
Documentation generated by <a href="http://www.doxygen.org/" title="doxygen website">doxygen</a> ::
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
56
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/GpuPreference_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Graphics_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Http_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Http_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
62
SQCSim2021/external/sfml251-32/doc/html/Image_8hpp_source.html
vendored
Normal file
62
SQCSim2021/external/sfml251-32/doc/html/Image_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
62
SQCSim2021/external/sfml251-32/doc/html/InputSoundFile_8hpp_source.html
vendored
Normal file
62
SQCSim2021/external/sfml251-32/doc/html/InputSoundFile_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/InputStream_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/InputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
64
SQCSim2021/external/sfml251-32/doc/html/IpAddress_8hpp_source.html
vendored
Normal file
64
SQCSim2021/external/sfml251-32/doc/html/IpAddress_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
71
SQCSim2021/external/sfml251-32/doc/html/Joystick_8hpp_source.html
vendored
Normal file
71
SQCSim2021/external/sfml251-32/doc/html/Joystick_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
160
SQCSim2021/external/sfml251-32/doc/html/Keyboard_8hpp_source.html
vendored
Normal file
160
SQCSim2021/external/sfml251-32/doc/html/Keyboard_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Listener_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Listener_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/Lock_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/Lock_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Main_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Main_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/MemoryInputStream_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/MemoryInputStream_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
68
SQCSim2021/external/sfml251-32/doc/html/Mouse_8hpp_source.html
vendored
Normal file
68
SQCSim2021/external/sfml251-32/doc/html/Mouse_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
69
SQCSim2021/external/sfml251-32/doc/html/Music_8hpp_source.html
vendored
Normal file
69
SQCSim2021/external/sfml251-32/doc/html/Music_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
59
SQCSim2021/external/sfml251-32/doc/html/Mutex_8hpp_source.html
vendored
Normal file
59
SQCSim2021/external/sfml251-32/doc/html/Mutex_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
58
SQCSim2021/external/sfml251-32/doc/html/NativeActivity_8hpp_source.html
vendored
Normal file
58
SQCSim2021/external/sfml251-32/doc/html/NativeActivity_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Network_2Export_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Network_2Export_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
56
SQCSim2021/external/sfml251-32/doc/html/Network_8hpp_source.html
vendored
Normal file
56
SQCSim2021/external/sfml251-32/doc/html/Network_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
60
SQCSim2021/external/sfml251-32/doc/html/NonCopyable_8hpp_source.html
vendored
Normal file
60
SQCSim2021/external/sfml251-32/doc/html/NonCopyable_8hpp_source.html
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user