Skip to content
This repository was archived by the owner on Jan 21, 2023. It is now read-only.

Commit

Permalink
Code cleanup and minor optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
QuestionableM committed Jan 28, 2022
1 parent 1fcfa56 commit 0cc7c71
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 66 deletions.
133 changes: 74 additions & 59 deletions Code/Tile/Tile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,12 +592,7 @@ void Tile::WriteColorMap(const std::wstring& dir) const
WritePngImage(color_map, color_map_path, (unsigned)col_width, (unsigned)col_height);
}

void Tile::SampleTextures(
GroundTexture* tex1,
GroundTexture* out_tex,
const std::vector<float>& material_map,
const std::size_t& gnd_width,
const std::size_t& gnd_height) const
void Tile::SampleTextures(GroundTexture* tex1, GroundTexture* out_tex, const std::vector<float>& material_map, const std::size_t& gnd_width, const std::size_t& gnd_height) const
{
constexpr const float mul_div = 1.0f / 255.0f;

Expand Down Expand Up @@ -646,30 +641,65 @@ void Tile::SampleTextures(
}
}

static const std::wstring GroundTextureNames[] = { L"Dif", L"Asg", L"Nor" };
void Tile::WriteGroundTextures(const std::wstring& dir) const
void Tile::FillGndTexture(GroundTexture* mGndTex, const std::size_t& tex_id)
{
if (this->Type != 0 || !ConvertSettings::ExportGroundTextures) return;
GroundTexture* pDefTex = GroundTextureDatabase::GetDefaultTexture(tex_id);
pDefTex->LoadImageData();

const std::vector<long long> ground_data = this->GetGround();
const std::size_t gnd_tex_x = mGndTex->GetWidth();
const std::size_t gnd_tex_y = mGndTex->GetHeight();

const std::size_t tex_width = 4096 * (std::size_t)this->Width;
const std::size_t tex_height = 4096 * (std::size_t)this->Height;
const std::size_t def_size_x = pDefTex->GetWidth();
const std::size_t def_size_y = pDefTex->GetHeight();

const std::size_t gnd_width = (std::size_t)this->Width * 64 + 1;
const std::size_t gnd_height = (std::size_t)this->Height * 64 + 1;
const std::size_t def_x_amount = gnd_tex_x / def_size_x;
const std::size_t def_y_amount = gnd_tex_y / def_size_y;

const std::size_t def_width_one = def_size_x;

for (std::size_t y = 0; y < def_y_amount; y++)
{
const std::size_t real_y = y * def_size_y;

for (std::size_t x = 0; x < def_x_amount; x++)
{
const std::size_t real_x = x * def_size_x;
const std::size_t idx = real_x + real_y * gnd_tex_y;

for (std::size_t z = 0; z < def_size_y; z++)
{
const std::size_t global_offset = (idx + z * gnd_tex_x) * 3;
const std::size_t local_offset = (z * def_width_one) * 3;

const std::size_t gnd_width2 = gnd_width - 1;
const std::size_t gnd_height2 = gnd_height - 1;
std::memcpy(mGndTex->Data() + global_offset, pDefTex->Data() + local_offset, def_width_one * 3);
}
}
}

pDefTex->Clear();
}

struct MaterialData
{
std::vector<float> MatData;
bool HasMatData;
};

std::array<std::vector<float>, 8> MaterialData = {};
std::array<bool, 8> HasMatDataMap = { false };
void Tile::FillMaterialMap(std::array<MaterialData, 8>& mat_data) const
{
const std::vector<long long> ground_data = this->GetGround();

const std::size_t gnd_width = (std::size_t)this->Width * 64 + 1;
const std::size_t gnd_height = (std::size_t)this->Height * 64 + 1;

for (std::size_t mat_id = 0; mat_id < 8; mat_id++)
{
const std::size_t mat_offset = 8 * mat_id;

std::vector<float>& material_vec = MaterialData[mat_id];
MaterialData& cur_mat = mat_data[mat_id];

bool& has_data = cur_mat.HasMatData;
std::vector<float>& material_vec = cur_mat.MatData;
material_vec.resize(gnd_width * gnd_height);

for (std::size_t y = 0; y < gnd_height; y++)
Expand All @@ -682,65 +712,50 @@ void Tile::WriteGroundTextures(const std::wstring& dir) const

material_vec[x + y * gnd_width] = float_chunk;

if (!HasMatDataMap[mat_id] && cur_chunk != 0)
HasMatDataMap[mat_id] = true;
if (!has_data && cur_chunk != 0)
has_data = true;
}
}
}
}

for (std::size_t texture_id = 0; texture_id < 3; texture_id++)
{
const std::size_t writing_gnd_idx = static_cast<std::size_t>(ProgState::FillingGndDif) + (3 * texture_id);
ProgCounter::SetState(static_cast<ProgState>(writing_gnd_idx), 8);

GroundTexture gnd_tex;
gnd_tex.AllocateMemory(tex_width, tex_height);

{
GroundTexture* pDefTex = GroundTextureDatabase::GetDefaultTexture(texture_id);
pDefTex->LoadImageData();

const std::size_t def_size_x = pDefTex->GetWidth();
const std::size_t def_size_y = pDefTex->GetHeight();

const std::size_t def_x_amount = tex_width / def_size_x;
const std::size_t def_y_amount = tex_height / def_size_y;
static const std::wstring GroundTextureNames[] = { L"Dif", L"Asg", L"Nor" };
void Tile::WriteGroundTextures(const std::wstring& dir) const
{
if (this->Type != 0 || !ConvertSettings::ExportGroundTextures) return;

const std::size_t def_width_one = def_size_x;
std::array<MaterialData, 8> MaterialMap = {};

for (std::size_t y = 0; y < def_y_amount; y++)
{
const std::size_t real_y = y * def_size_y;
this->FillMaterialMap(MaterialMap);


for (std::size_t x = 0; x < def_x_amount; x++)
{
const std::size_t real_x = x * def_size_x;
const std::size_t tex_width = 4096 * (std::size_t)this->Width;
const std::size_t tex_height = 4096 * (std::size_t)this->Height;

const std::size_t idx = real_x + real_y * tex_height;
const std::size_t gnd_width2 = (std::size_t)this->Width * 64;
const std::size_t gnd_height2 = (std::size_t)this->Height * 64;

for (std::size_t z = 0; z < def_size_y; z++)
{
const std::size_t global_offset = (idx + z * tex_width) * 3;
const std::size_t local_offset = (z * def_width_one) * 3;
for (std::size_t texture_id = 0; texture_id < 3; texture_id++)
{
const std::size_t writing_gnd_idx = static_cast<std::size_t>(ProgState::FillingGndDif) + (3 * texture_id);

std::memcpy(gnd_tex.Data() + global_offset, pDefTex->Data() + local_offset, def_width_one * 3);
}
}
}
GroundTexture gnd_tex;
gnd_tex.AllocateMemory(tex_width, tex_height);

pDefTex->Clear();
}
ProgCounter::SetState(static_cast<ProgState>(writing_gnd_idx), 8);
Tile::FillGndTexture(&gnd_tex, texture_id);

ProgCounter::SetState(static_cast<ProgState>(writing_gnd_idx + 1), 8);

for (std::size_t mat_id = 0; mat_id < 8; mat_id++)
{
if (HasMatDataMap[mat_id])
const MaterialData& cur_mat = MaterialMap[mat_id];

if (cur_mat.HasMatData)
{
GroundTexture* pGndTex = GroundTextureDatabase::GetTexture(mat_id, texture_id);
pGndTex->LoadImageData();

this->SampleTextures(pGndTex, &gnd_tex, MaterialData[mat_id], gnd_width2, gnd_height2);
this->SampleTextures(pGndTex, &gnd_tex, cur_mat.MatData, gnd_width2, gnd_height2);

pGndTex->Clear();
}
Expand Down
10 changes: 3 additions & 7 deletions Code/Tile/Tile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,9 @@ class Tile
void WriteMaterials(const std::wstring& dir) const;
void WriteColorMap(const std::wstring& dir) const;

void SampleTextures(
GroundTexture* tex1,
GroundTexture* out_tex,
const std::vector<float>& material_map,
const std::size_t& gnd_width,
const std::size_t& gnd_height
) const;
static void FillGndTexture(GroundTexture* mGndTex, const std::size_t& tex_id);
void FillMaterialMap(std::array<struct MaterialData, 8>& mat_data) const;
void SampleTextures(GroundTexture* tex1, GroundTexture* out_tex, const std::vector<float>& material_map, const std::size_t& gnd_width, const std::size_t& gnd_height) const;
void WriteGroundTextures(const std::wstring& dir) const;

public:
Expand Down

0 comments on commit 0cc7c71

Please sign in to comment.