| @@ -34,9 +34,10 @@ public: | |||||
| virtual uint8_t *GetData() const; | virtual uint8_t *GetData() const; | ||||
| virtual bool RetrieveTiles(Array<ivec2, ivec2>& tiles) | virtual bool RetrieveTiles(Array<ivec2, ivec2>& tiles) | ||||
| { | { | ||||
| bool result = m_tiles.Count() > 0; | |||||
| tiles += m_tiles; | tiles += m_tiles; | ||||
| m_tiles.Empty(); | m_tiles.Empty(); | ||||
| return true; | |||||
| return result; | |||||
| } | } | ||||
| private: | private: | ||||
| @@ -54,33 +55,7 @@ bool ZedImageData::Open(char const *path) | |||||
| if (!lol::String(path).EndsWith(".RSC")) | if (!lol::String(path).EndsWith(".RSC")) | ||||
| return false; | return false; | ||||
| File file; | |||||
| file.Open(path, FileAccess::Read, true); | |||||
| //Put file in memory | |||||
| long file_size = file.GetSize(); | |||||
| Array<uint8_t> file_buffer; | |||||
| file_buffer.Resize(file_size); | |||||
| file.Read((uint8_t*)&file_buffer[0], file_size); | |||||
| file.Close(); | |||||
| //Get FileCount | |||||
| uint32_t file_pos = 0; | |||||
| uint16_t file_count = 0; | |||||
| file_count = *((uint16_t*)(&file_buffer[file_pos])); | |||||
| file_pos += sizeof(uint16_t); | |||||
| Array<long int> file_offset; | |||||
| file_offset.Resize(file_count); | |||||
| //Get all the file offsets | |||||
| for (int i = 0; i < file_count; i++) | |||||
| { | |||||
| file_offset[i] = *((long int*)(&file_buffer[file_pos])); | |||||
| file_pos += sizeof(long int); | |||||
| } | |||||
| file_offset << file_size; | |||||
| m_tiles.Reserve(file_count); | |||||
| //Compacter definition | |||||
| struct CompactSecondary | struct CompactSecondary | ||||
| { | { | ||||
| CompactSecondary(int32_t size) { m_size = size; } | CompactSecondary(int32_t size) { m_size = size; } | ||||
| @@ -145,6 +120,34 @@ bool ZedImageData::Open(char const *path) | |||||
| Array<CompactMain> m_primary; | Array<CompactMain> m_primary; | ||||
| }; | }; | ||||
| File file; | |||||
| file.Open(path, FileAccess::Read, true); | |||||
| //Put file in memory | |||||
| long file_size = file.GetSize(); | |||||
| Array<uint8_t> file_buffer; | |||||
| file_buffer.Resize(file_size); | |||||
| file.Read((uint8_t*)&file_buffer[0], file_size); | |||||
| file.Close(); | |||||
| //Get FileCount | |||||
| uint32_t file_pos = 0; | |||||
| uint16_t file_count = 0; | |||||
| file_count = *((uint16_t*)(&file_buffer[file_pos])); | |||||
| file_pos += sizeof(uint16_t); | |||||
| Array<long int> file_offset; | |||||
| file_offset.Resize(file_count); | |||||
| //Get all the file offsets | |||||
| for (int i = 0; i < file_count; i++) | |||||
| { | |||||
| file_offset[i] = *((long int*)(&file_buffer[file_pos])); | |||||
| file_pos += sizeof(long int); | |||||
| } | |||||
| file_offset << file_size; | |||||
| m_tiles.Reserve(file_count); | |||||
| Compacter2d compacter; | Compacter2d compacter; | ||||
| compacter.StepSetup(8, 8, 10); | compacter.StepSetup(8, 8, 10); | ||||
| @@ -171,45 +174,62 @@ bool ZedImageData::Open(char const *path) | |||||
| uint32_t data_length = (file_offset[i+1] - file_offset[i]) - header_length; | uint32_t data_length = (file_offset[i+1] - file_offset[i]) - header_length; | ||||
| uint32_t data_pos = file_offset[i] + header_length; | uint32_t data_pos = file_offset[i] + header_length; | ||||
| /* Seems useless in the end | |||||
| //Retrieve Header & footer | |||||
| Array<uint8_t> header_data; | |||||
| header_data.Resize(header_length); | |||||
| memcpy(&header_data[0], &file_buffer[file_offset[i]], header_length); | |||||
| Array<uint8_t> footer_data; | |||||
| uint32_t footer_length = lol::min((uint32_t)file_buffer.Count(), data_pos + data_length + header_length) - (data_pos + data_length); | |||||
| if (footer_length > 0) | |||||
| { | |||||
| footer_data.Resize(footer_length); | |||||
| memcpy(&footer_data[0], &file_buffer[data_pos + data_length], footer_length); | |||||
| } | |||||
| */ | |||||
| //Prepare buffer and tiles infos | //Prepare buffer and tiles infos | ||||
| int32_t convert_pos = file_convert.Count(); | int32_t convert_pos = file_convert.Count(); | ||||
| ivec2 size = ivec2(size_x, size_y); | ivec2 size = ivec2(size_x, size_y); | ||||
| compacter.Store(m_tiles.Count(), ivec2(size_x, size_y)); | compacter.Store(m_tiles.Count(), ivec2(size_x, size_y)); | ||||
| m_tiles.Push(ivec2(file_convert.Count(), data_length), ivec2(size_x, size_y)); | m_tiles.Push(ivec2(file_convert.Count(), data_length), ivec2(size_x, size_y)); | ||||
| file_convert.Resize(convert_pos + data_length); | file_convert.Resize(convert_pos + data_length); | ||||
| //Retrieve actual datas | |||||
| file_pos = data_pos; | |||||
| memcpy(&file_convert[convert_pos], &file_buffer[file_pos], data_length); | |||||
| file_pos += data_length; | |||||
| ivec2 size_16 = size; | |||||
| int32_t s_16 = 8; | |||||
| while (1) | |||||
| //Store size type | |||||
| { | { | ||||
| if (size_16.x <= s_16) | |||||
| ivec2 size_16 = size; | |||||
| int32_t s_16 = 16; | |||||
| while (1) | |||||
| { | { | ||||
| size_16.x = s_16; | |||||
| break; | |||||
| if (size_16.x <= s_16) | |||||
| { | |||||
| size_16.x = s_16; | |||||
| break; | |||||
| } | |||||
| s_16 <<= 1; | |||||
| } | } | ||||
| s_16 <<= 1; | |||||
| } | |||||
| s_16 = 8; | |||||
| while (1) | |||||
| { | |||||
| if (size_16.y <= s_16) | |||||
| s_16 = 8; | |||||
| while (1) | |||||
| { | { | ||||
| size_16.y = s_16; | |||||
| break; | |||||
| if (size_16.y <= s_16) | |||||
| { | |||||
| size_16.y = s_16; | |||||
| break; | |||||
| } | |||||
| s_16 <<= 1; | |||||
| } | } | ||||
| s_16 <<= 1; | |||||
| int j = 0; | |||||
| for (; j < available_sizes.Count(); j++) | |||||
| if (available_sizes[j] == size_16) | |||||
| break; | |||||
| if (j >= available_sizes.Count()) | |||||
| available_sizes << size_16; | |||||
| } | } | ||||
| int j = 0; | |||||
| for (; j < available_sizes.Count(); j++) | |||||
| if (available_sizes[j] == size_16) | |||||
| break; | |||||
| if (j >= available_sizes.Count()) | |||||
| available_sizes << size_16; | |||||
| //Retrieve actual datas | |||||
| file_pos = data_pos; | |||||
| memcpy(&file_convert[convert_pos], &file_buffer[file_pos], data_length); | |||||
| file_pos += data_length; | |||||
| } | } | ||||
| int32_t tex_sqrt = (int32_t)lol::sqrt((float)total_size); | int32_t tex_sqrt = (int32_t)lol::sqrt((float)total_size); | ||||