| @@ -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 */ | |||||