| @@ -6,18 +6,18 @@ SUBDIRS = data | |||
| noinst_LIBRARIES = liblol.a | |||
| liblol_a_SOURCES = \ | |||
| core.h tiler.cpp tiler.h dict.cpp dict.h array.h \ | |||
| core.h tiler.cpp tiler.h dict.cpp dict.h \ | |||
| audio.cpp audio.h scene.cpp scene.h font.cpp font.h layer.cpp layer.h \ | |||
| map.cpp map.h entity.cpp entity.h ticker.cpp ticker.h lolgl.h \ | |||
| tileset.cpp tileset.h forge.cpp forge.h video.cpp video.h log.cpp log.h \ | |||
| timer.cpp timer.h bitfield.h profiler.cpp profiler.h \ | |||
| world.cpp world.h sample.cpp sample.h sampler.cpp sampler.h \ | |||
| text.cpp text.h emitter.cpp emitter.h numeric.h hash.cpp hash.h \ | |||
| text.cpp text.h emitter.cpp emitter.h numeric.h \ | |||
| worldentity.cpp worldentity.h gradient.cpp gradient.h gradient.lolfx \ | |||
| platform.cpp platform.h sprite.cpp sprite.h camera.cpp camera.h \ | |||
| \ | |||
| lol/unit.h lol/debug.h \ | |||
| lol/core/array.h lol/core/string.h \ | |||
| lol/core/array.h lol/core/string.h lol/core/hash.h \ | |||
| lol/math/vector.h lol/math/half.h lol/math/real.h lol/math/remez.h \ | |||
| lol/math/math.h \ | |||
| \ | |||
| @@ -40,6 +40,8 @@ liblol_a_SOURCES = \ | |||
| $(android_sources) \ | |||
| $(bullet_sources) \ | |||
| \ | |||
| core/hash.cpp \ | |||
| \ | |||
| thread/threadbase.h thread/thread.h \ | |||
| \ | |||
| math/vector.cpp math/real.cpp math/half.cpp math/trig.cpp \ | |||
| @@ -77,6 +77,7 @@ static inline int isnan(float f) | |||
| #include <lol/debug.h> | |||
| #include <lol/core/array.h> | |||
| #include <lol/core/string.h> | |||
| #include <lol/core/hash.h> | |||
| #include <lol/math/math.h> | |||
| #include <lol/math/half.h> | |||
| #include <lol/math/real.h> | |||
| @@ -111,7 +112,6 @@ static inline int isnan(float f) | |||
| #include "world.h" | |||
| // Other objects | |||
| #include "hash.h" | |||
| #include "dict.h" | |||
| #include "map.h" | |||
| #include "layer.h" | |||
| @@ -0,0 +1,136 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2012 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://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include "core.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; | |||
| /* | |||
| * Public Hash classes | |||
| */ | |||
| uint32_t Hash<int8_t>::operator ()(int8_t x) | |||
| { | |||
| uint32_t ret = 0xffffffffu; | |||
| ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||
| return ret ^ 0xffffffffu; | |||
| } | |||
| uint32_t Hash<uint8_t>::operator ()(uint8_t x) | |||
| { | |||
| uint32_t ret = 0xffffffffu; | |||
| ret = data.crc32_table[(uint8_t)(ret ^ x)] ^ (ret >> 8); | |||
| return ret ^ 0xffffffffu; | |||
| } | |||
| uint32_t Hash<int16_t>::operator ()(int16_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; | |||
| } | |||
| uint32_t Hash<uint16_t>::operator ()(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; | |||
| } | |||
| uint32_t Hash<int32_t>::operator ()(int32_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; | |||
| } | |||
| uint32_t Hash<uint32_t>::operator ()(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; | |||
| } | |||
| uint32_t Hash<int64_t>::operator ()(int64_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; | |||
| } | |||
| uint32_t Hash<uint64_t>::operator ()(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; | |||
| } | |||
| uint32_t Hash<char const *>::operator ()(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; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -71,10 +71,12 @@ private: | |||
| /* Global shader cache */ | |||
| static Shader *shaders[]; | |||
| static Hash<char const *> hash; | |||
| static int nshaders; | |||
| }; | |||
| Shader *ShaderData::shaders[256]; | |||
| Hash<char const *> ShaderData::hash; | |||
| int ShaderData::nshaders = 0; | |||
| /* | |||
| @@ -137,8 +139,8 @@ Shader *Shader::Create(char const *lolfx) | |||
| if (!frag) | |||
| Log::Error("no fragment shader found… sorry, I’m gonna crash now.\n"); | |||
| uint32_t new_vert_crc = Hash::Crc32(vert); | |||
| uint32_t new_frag_crc = Hash::Crc32(frag); | |||
| uint32_t new_vert_crc = ShaderData::hash(vert); | |||
| uint32_t new_frag_crc = ShaderData::hash(frag); | |||
| for (int n = 0; n < ShaderData::nshaders; n++) | |||
| { | |||
| @@ -189,7 +191,7 @@ Shader::Shader(char const *vert, char const *frag) | |||
| #endif | |||
| /* Compile vertex shader */ | |||
| data->vert_crc = Hash::Crc32(vert); | |||
| data->vert_crc = ShaderData::hash(vert); | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| hr = D3DXCompileShader(vert, (UINT)strlen(vert), macros, NULL, "main", | |||
| "vs_3_0", 0, &shader_code, &error_msg, | |||
| @@ -233,7 +235,7 @@ Shader::Shader(char const *vert, char const *frag) | |||
| #endif | |||
| /* Compile fragment shader */ | |||
| data->frag_crc = Hash::Crc32(frag); | |||
| data->frag_crc = ShaderData::hash(frag); | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| hr = D3DXCompileShader(frag, (UINT)strlen(frag), macros, NULL, "main", | |||
| "ps_3_0", 0, &shader_code, &error_msg, | |||
| @@ -1,63 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 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://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include "core.h" | |||
| namespace lol | |||
| { | |||
| /* | |||
| * Hash implementation class | |||
| */ | |||
| static class HashData | |||
| { | |||
| friend class Hash; | |||
| 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; | |||
| } | |||
| } | |||
| private: | |||
| uint32_t crc32_table[256]; | |||
| } | |||
| hashdata; | |||
| static HashData * const data = &hashdata; | |||
| /* | |||
| * Public Hash class | |||
| */ | |||
| uint32_t Hash::Crc32(char const *str) | |||
| { | |||
| uint32_t ret = 0xffffffff, ch; | |||
| while ((ch = (uint8_t)*str++)) | |||
| ret = data->crc32_table[(uint8_t)(ret ^ ch)] ^ (ret >> 8); | |||
| return ret ^ 0xffffffff; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,31 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 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://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| // | |||
| // The Hash class | |||
| // -------------- | |||
| // | |||
| #if !defined __LOL_HASH_H__ | |||
| #define __LOL_HASH_H__ | |||
| namespace lol | |||
| { | |||
| class Hash | |||
| { | |||
| public: | |||
| static uint32_t Crc32(char const *data); | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_HASH_H__ | |||
| @@ -0,0 +1,43 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2012 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://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
| // | |||
| // | |||
| // The Hash class | |||
| // -------------- | |||
| // A very simple Hash class. | |||
| // | |||
| #if !defined __LOL_HASH_H__ | |||
| #define __LOL_HASH_H__ | |||
| namespace lol | |||
| { | |||
| template<typename T> class Hash; | |||
| template<> class Hash<int8_t> { public: uint32_t operator()(int8_t); }; | |||
| template<> class Hash<uint8_t> { public: uint32_t operator()(uint8_t); }; | |||
| template<> class Hash<int16_t> { public: uint32_t operator()(int16_t); }; | |||
| template<> class Hash<uint16_t> { public: uint32_t operator()(uint16_t); }; | |||
| template<> class Hash<int32_t> { public: uint32_t operator()(int32_t); }; | |||
| template<> class Hash<uint32_t> { public: uint32_t operator()(uint32_t); }; | |||
| template<> class Hash<int64_t> { public: uint32_t operator()(int64_t); }; | |||
| template<> class Hash<uint64_t> { public: uint32_t operator()(uint64_t); }; | |||
| template<> class Hash<char const *> | |||
| { | |||
| public: | |||
| uint32_t operator()(char const *x); | |||
| }; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_HASH_H__ | |||
| @@ -234,6 +234,7 @@ | |||
| <ClCompile Include="bullet\LinearMath\btQuickprof.cpp" /> | |||
| <ClCompile Include="bullet\LinearMath\btSerializer.cpp" /> | |||
| <ClCompile Include="camera.cpp" /> | |||
| <ClCompile Include="core\hash.cpp" /> | |||
| <ClCompile Include="debug\fps.cpp" /> | |||
| <ClCompile Include="debug\record.cpp" /> | |||
| <ClCompile Include="debug\stats.cpp" /> | |||
| @@ -257,7 +258,6 @@ | |||
| <ClCompile Include="gpu\texture.cpp" /> | |||
| <ClCompile Include="gpu\vertexbuffer.cpp" /> | |||
| <ClCompile Include="gradient.cpp" /> | |||
| <ClCompile Include="hash.cpp" /> | |||
| <ClCompile Include="image\codec\android-image.cpp" /> | |||
| <ClCompile Include="image\codec\dummy-image.cpp" /> | |||
| <ClCompile Include="image\codec\gdiplus-image.cpp" /> | |||
| @@ -572,7 +572,6 @@ | |||
| <ClInclude Include="gpu\texture.h" /> | |||
| <ClInclude Include="gpu\vertexbuffer.h" /> | |||
| <ClInclude Include="gradient.h" /> | |||
| <ClInclude Include="hash.h" /> | |||
| <ClInclude Include="image\image-private.h" /> | |||
| <ClInclude Include="image\image.h" /> | |||
| <ClInclude Include="input\input.h" /> | |||
| @@ -583,6 +582,8 @@ | |||
| <ClInclude Include="loldebug.h" /> | |||
| <ClInclude Include="lolgl.h" /> | |||
| <ClInclude Include="lol\core\array.h" /> | |||
| <ClInclude Include="lol\core\hash.h" /> | |||
| <ClInclude Include="lol\core\string.h" /> | |||
| <ClInclude Include="lol\debug.h" /> | |||
| <ClInclude Include="lol\math\half.h" /> | |||
| <ClInclude Include="lol\math\math.h" /> | |||