@@ -35,8 +35,8 @@ liblol_core_headers = \ | |||||
\ | \ | ||||
lol/base/all.h \ | lol/base/all.h \ | ||||
lol/base/avl_tree.h lol/base/features.h lol/base/tuple.h lol/base/types.h \ | lol/base/avl_tree.h lol/base/features.h lol/base/tuple.h lol/base/types.h \ | ||||
lol/base/array.h lol/base/assert.h lol/base/string.h lol/base/hash.h \ | |||||
lol/base/map.h lol/base/enum.h lol/base/log.h \ | |||||
lol/base/array.h lol/base/assert.h lol/base/string.h lol/base/map.h \ | |||||
lol/base/enum.h lol/base/log.h \ | |||||
\ | \ | ||||
lol/math/all.h \ | lol/math/all.h \ | ||||
lol/math/functions.h lol/math/vector.h lol/math/half.h lol/math/real.h \ | lol/math/functions.h lol/math/vector.h lol/math/half.h lol/math/real.h \ | ||||
@@ -88,8 +88,7 @@ liblol_core_sources = \ | |||||
easymesh/shinydebuglighting.lolfx easymesh/shinydebugnormal.lolfx \ | easymesh/shinydebuglighting.lolfx easymesh/shinydebugnormal.lolfx \ | ||||
easymesh/shinydebugUV.lolfx easymesh/shiny_SK.lolfx \ | easymesh/shinydebugUV.lolfx easymesh/shiny_SK.lolfx \ | ||||
\ | \ | ||||
base/assert.cpp base/hash.cpp base/log.cpp base/string.cpp \ | |||||
base/enum.cpp \ | |||||
base/assert.cpp base/log.cpp base/string.cpp base/enum.cpp \ | |||||
\ | \ | ||||
math/vector.cpp math/matrix.cpp math/transform.cpp math/trig.cpp \ | math/vector.cpp math/matrix.cpp math/transform.cpp math/trig.cpp \ | ||||
math/constants.cpp math/geometry.cpp math/real.cpp math/half.cpp \ | math/constants.cpp math/geometry.cpp math/real.cpp math/half.cpp \ | ||||
@@ -1,187 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#include <lol/engine-internal.h> | |||||
namespace lol | |||||
{ | |||||
/* | |||||
* hash implementations | |||||
*/ | |||||
static class HashData | |||||
{ | |||||
public: | |||||
HashData() | |||||
{ | |||||
/* Initialise CRC32 table */ | |||||
for (int i = 0; i < 256; i++) | |||||
{ | |||||
uint32_t tmp = i; | |||||
for (int j = 8; j--; ) | |||||
tmp = (tmp >> 1) ^ ((tmp & 1) ? 0xedb88320 : 0); | |||||
crc32_table[i] = tmp; | |||||
} | |||||
} | |||||
uint32_t crc32_table[256]; | |||||
} | |||||
const data; | |||||
/* | |||||
* Helper hash functions | |||||
*/ | |||||
static inline uint32_t Hash8(uint8_t x) | |||||
{ | |||||
uint32_t ret = 0xffffffffu; | |||||
ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||||
return ret ^ 0xffffffffu; | |||||
} | |||||
static inline uint32_t Hash16(uint16_t x) | |||||
{ | |||||
uint32_t ret = 0xffffffffu; | |||||
ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 8))] ^ (ret >> 8); | |||||
return ret ^ 0xffffffffu; | |||||
} | |||||
static inline uint32_t Hash32(uint32_t x) | |||||
{ | |||||
uint32_t ret = 0xffffffffu; | |||||
ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 8))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 16))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 24))] ^ (ret >> 8); | |||||
return ret ^ 0xffffffffu; | |||||
} | |||||
static inline uint32_t Hash64(uint64_t x) | |||||
{ | |||||
uint32_t ret = 0xffffffffu; | |||||
ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 8))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 16))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 24))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 32))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 40))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 48))] ^ (ret >> 8); | |||||
ret = data.crc32_table[(uint8_t)(ret ^ (x >> 56))] ^ (ret >> 8); | |||||
return ret ^ 0xffffffffu; | |||||
} | |||||
/* | |||||
* Integer hash functions | |||||
*/ | |||||
uint32_t hash<int8_t>::operator ()(int8_t x) const | |||||
{ | |||||
return Hash8((uint8_t)x); | |||||
} | |||||
uint32_t hash<uint8_t>::operator ()(uint8_t x) const | |||||
{ | |||||
return Hash8(x); | |||||
} | |||||
uint32_t hash<int16_t>::operator ()(int16_t x) const | |||||
{ | |||||
return Hash16((uint16_t)x); | |||||
} | |||||
uint32_t hash<uint16_t>::operator ()(uint16_t x) const | |||||
{ | |||||
return Hash16(x); | |||||
} | |||||
uint32_t hash<int32_t>::operator ()(int32_t x) const | |||||
{ | |||||
return Hash32((uint32_t)x); | |||||
} | |||||
uint32_t hash<uint32_t>::operator ()(uint32_t x) const | |||||
{ | |||||
return Hash32(x); | |||||
} | |||||
uint32_t hash<int64_t>::operator ()(int64_t x) const | |||||
{ | |||||
return Hash64((uint64_t)x); | |||||
} | |||||
uint32_t hash<uint64_t>::operator ()(uint64_t x) const | |||||
{ | |||||
return Hash64(x); | |||||
} | |||||
/* | |||||
* Floating-point hash functions | |||||
*/ | |||||
uint32_t hash<half>::operator ()(half f) const | |||||
{ | |||||
return Hash16(f.bits); | |||||
} | |||||
uint32_t hash<float>::operator ()(float f) const | |||||
{ | |||||
union { float tmp; uint32_t x; } u = { f }; | |||||
return Hash32(u.x); | |||||
} | |||||
uint32_t hash<double>::operator ()(double f) const | |||||
{ | |||||
union { double tmp; uint64_t x; } u = { f }; | |||||
return Hash64(u.x); | |||||
} | |||||
/* | |||||
* String and array hash functions | |||||
*/ | |||||
static uint32_t HashCharString(char const *s) | |||||
{ | |||||
uint32_t ret = 0xffffffffu, ch; | |||||
while ((ch = (uint8_t)*s++)) | |||||
ret = data.crc32_table[(uint8_t)(ret ^ ch)] ^ (ret >> 8); | |||||
return ret ^ 0xffffffffu; | |||||
} | |||||
uint32_t hash<char const *>::operator ()(char const *s) const | |||||
{ | |||||
return HashCharString(s); | |||||
} | |||||
uint32_t hash<std::string>::operator ()(std::string const &s) const | |||||
{ | |||||
return HashCharString(&s[0]); | |||||
} | |||||
uint32_t hash<char const *>::operator ()(String const &s) const | |||||
{ | |||||
return HashCharString(&s[0]); | |||||
} | |||||
uint32_t hash<String>::operator ()(String const &s) const | |||||
{ | |||||
return HashCharString(&s[0]); | |||||
} | |||||
uint32_t hash<String>::operator ()(char const *s) const | |||||
{ | |||||
return HashCharString(s); | |||||
} | |||||
} /* namespace lol */ | |||||
@@ -84,7 +84,7 @@ private: | |||||
// Benlitz: using a simple array could be faster since there is never more than a few attribute locations to store | // Benlitz: using a simple array could be faster since there is never more than a few attribute locations to store | ||||
std::map<uint64_t, GLint> attrib_locations; | std::map<uint64_t, GLint> attrib_locations; | ||||
std::map<uint64_t, bool> attrib_errors; | std::map<uint64_t, bool> attrib_errors; | ||||
uint32_t vert_crc, frag_crc; | |||||
size_t vert_crc, frag_crc; | |||||
/* Shader patcher */ | /* Shader patcher */ | ||||
static int GetVersion(); | static int GetVersion(); | ||||
@@ -92,12 +92,10 @@ private: | |||||
/* Global shader cache */ | /* Global shader cache */ | ||||
static Shader *shaders[]; | static Shader *shaders[]; | ||||
static hash<char const *> Hash; | |||||
static int nshaders; | static int nshaders; | ||||
}; | }; | ||||
Shader *ShaderData::shaders[256]; | Shader *ShaderData::shaders[256]; | ||||
hash<char const *> ShaderData::Hash; | |||||
int ShaderData::nshaders = 0; | int ShaderData::nshaders = 0; | ||||
/* | /* | ||||
@@ -202,8 +200,8 @@ Shader *Shader::Create(std::string const &name, std::string const &code) | |||||
std::string vert = p.m_programs["vert.glsl"]; | std::string vert = p.m_programs["vert.glsl"]; | ||||
std::string frag = p.m_programs["frag.glsl"]; | std::string frag = p.m_programs["frag.glsl"]; | ||||
uint32_t new_vert_crc = ShaderData::Hash(vert); | |||||
uint32_t new_frag_crc = ShaderData::Hash(frag); | |||||
size_t new_vert_crc = std::hash<std::string>{}(vert); | |||||
size_t new_frag_crc = std::hash<std::string>{}(frag); | |||||
for (int n = 0; n < ShaderData::nshaders; n++) | for (int n = 0; n < ShaderData::nshaders; n++) | ||||
{ | { | ||||
@@ -240,7 +238,7 @@ Shader::Shader(std::string const &name, | |||||
GLsizei len; | GLsizei len; | ||||
/* Compile vertex shader */ | /* Compile vertex shader */ | ||||
data->vert_crc = ShaderData::Hash(vert); | |||||
data->vert_crc = std::hash<std::string>{}(vert); | |||||
shader_code = ShaderData::Patch(vert, ShaderType::Vertex); | shader_code = ShaderData::Patch(vert, ShaderType::Vertex); | ||||
data->vert_id = glCreateShader(GL_VERTEX_SHADER); | data->vert_id = glCreateShader(GL_VERTEX_SHADER); | ||||
@@ -263,7 +261,7 @@ Shader::Shader(std::string const &name, | |||||
} | } | ||||
/* Compile fragment shader */ | /* Compile fragment shader */ | ||||
data->frag_crc = ShaderData::Hash(frag); | |||||
data->frag_crc = std::hash<std::string>{}(frag); | |||||
shader_code = ShaderData::Patch(frag, ShaderType::Fragment); | shader_code = ShaderData::Patch(frag, ShaderType::Fragment); | ||||
data->frag_id = glCreateShader(GL_FRAGMENT_SHADER); | data->frag_id = glCreateShader(GL_FRAGMENT_SHADER); | ||||
@@ -85,7 +85,6 @@ | |||||
<ClCompile Include="camera.cpp" /> | <ClCompile Include="camera.cpp" /> | ||||
<ClCompile Include="base\assert.cpp" /> | <ClCompile Include="base\assert.cpp" /> | ||||
<ClCompile Include="base\enum.cpp" /> | <ClCompile Include="base\enum.cpp" /> | ||||
<ClCompile Include="base\hash.cpp" /> | |||||
<ClCompile Include="base\log.cpp" /> | <ClCompile Include="base\log.cpp" /> | ||||
<ClCompile Include="base\string.cpp" /> | <ClCompile Include="base\string.cpp" /> | ||||
<ClCompile Include="debug\fps.cpp" /> | <ClCompile Include="debug\fps.cpp" /> | ||||
@@ -266,7 +265,6 @@ | |||||
<ClInclude Include="lol\base\assert.h" /> | <ClInclude Include="lol\base\assert.h" /> | ||||
<ClInclude Include="lol\base\enum.h" /> | <ClInclude Include="lol\base\enum.h" /> | ||||
<ClInclude Include="lol\base\features.h" /> | <ClInclude Include="lol\base\features.h" /> | ||||
<ClInclude Include="lol\base\hash.h" /> | |||||
<ClInclude Include="lol\base\log.h" /> | <ClInclude Include="lol\base\log.h" /> | ||||
<ClInclude Include="lol\base\map.h" /> | <ClInclude Include="lol\base\map.h" /> | ||||
<ClInclude Include="lol\base\string.h" /> | <ClInclude Include="lol\base\string.h" /> | ||||
@@ -261,9 +261,6 @@ | |||||
<ClCompile Include="base\enum.cpp"> | <ClCompile Include="base\enum.cpp"> | ||||
<Filter>base</Filter> | <Filter>base</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
<ClCompile Include="base\hash.cpp"> | |||||
<Filter>base</Filter> | |||||
</ClCompile> | |||||
<ClCompile Include="base\string.cpp"> | <ClCompile Include="base\string.cpp"> | ||||
<Filter>base</Filter> | <Filter>base</Filter> | ||||
</ClCompile> | </ClCompile> | ||||
@@ -613,9 +610,6 @@ | |||||
<ClInclude Include="lol\base\features.h"> | <ClInclude Include="lol\base\features.h"> | ||||
<Filter>lol\base</Filter> | <Filter>lol\base</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
<ClInclude Include="lol\base\hash.h"> | |||||
<Filter>lol\base</Filter> | |||||
</ClInclude> | |||||
<ClInclude Include="lol\base\map.h"> | <ClInclude Include="lol\base\map.h"> | ||||
<Filter>lol\base</Filter> | <Filter>lol\base</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
@@ -20,7 +20,6 @@ | |||||
#include <lol/base/array.h> | #include <lol/base/array.h> | ||||
#include <lol/base/avl_tree.h> | #include <lol/base/avl_tree.h> | ||||
#include <lol/base/string.h> | #include <lol/base/string.h> | ||||
#include <lol/base/hash.h> | |||||
#include <lol/base/map.h> | #include <lol/base/map.h> | ||||
#include <lol/base/enum.h> | #include <lol/base/enum.h> | ||||
@@ -1,56 +0,0 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||||
// This program is free software; you can redistribute it and/or | |||||
// modify it under the terms of the Do What The Fuck You Want To | |||||
// Public License, Version 2, as published by Sam Hocevar. See | |||||
// http://www.wtfpl.net/ for more details. | |||||
// | |||||
#pragma once | |||||
// | |||||
// The hash class | |||||
// -------------- | |||||
// A very simple hash class. | |||||
// | |||||
namespace lol | |||||
{ | |||||
template<typename T> struct hash; | |||||
template<> struct hash<int8_t> { uint32_t operator()(int8_t) const; }; | |||||
template<> struct hash<uint8_t> { uint32_t operator()(uint8_t) const; }; | |||||
template<> struct hash<int16_t> { uint32_t operator()(int16_t) const; }; | |||||
template<> struct hash<uint16_t> { uint32_t operator()(uint16_t) const; }; | |||||
template<> struct hash<int32_t> { uint32_t operator()(int32_t) const; }; | |||||
template<> struct hash<uint32_t> { uint32_t operator()(uint32_t) const; }; | |||||
template<> struct hash<int64_t> { uint32_t operator()(int64_t) const; }; | |||||
template<> struct hash<uint64_t> { uint32_t operator()(uint64_t) const; }; | |||||
template<> struct hash<half> { uint32_t operator()(half) const; }; | |||||
template<> struct hash<float> { uint32_t operator()(float) const; }; | |||||
template<> struct hash<double> { uint32_t operator()(double) const; }; | |||||
template<> struct hash<ldouble> { uint32_t operator()(ldouble) const; }; | |||||
template<> struct hash<char const *> | |||||
{ | |||||
uint32_t operator()(char const *x) const; | |||||
uint32_t operator()(String const &s) const; | |||||
}; | |||||
template<> struct hash<std::string> | |||||
{ | |||||
uint32_t operator()(std::string const &s) const; | |||||
}; | |||||
template<> struct hash<String> | |||||
{ | |||||
uint32_t operator()(String const &s) const; | |||||
uint32_t operator()(char const *x) const; | |||||
}; | |||||
} /* namespace lol */ | |||||