Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/level.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,11 @@ bool Level::LoadPreset(const std::filesystem::path& filename)
m_propVisTreeTransparent.SetPreview(material, json[material + "_visTreeTransparent"]);
m_propVisTreeTransparent.Apply(material, m_materialToQuadblocks[material], m_quadblocks);
}
if (json.contains(material + "_drawOrderHigh"))
{
m_propDrawOrderHigh.SetPreview(material, json[material + "_drawOrderHigh"]);
m_propDrawOrderHigh.Apply(material, m_materialToQuadblocks[material], m_quadblocks);
}
}
}
}
Expand Down Expand Up @@ -606,6 +611,7 @@ bool Level::SavePreset(const std::filesystem::path& path)
materialJson[key + "_visTreeTransparent"] = m_propVisTreeTransparent.GetBackup(key);
materialJson[key + "_trigger"] = m_propTurboPads.GetBackup(key);
materialJson[key + "_speedImpact"] = m_propSpeedImpact.GetBackup(key);
materialJson[key + "_drawOrderHigh"] = m_propDrawOrderHigh.GetBackup(key);
}
materialJson["materials"] = materials;
SaveJSON(dirPath / "material.json", materialJson);
Expand Down Expand Up @@ -688,6 +694,7 @@ void Level::ManageTurbopad(Quadblock& quadblock)
turboPad.SetTurboPadIndex(TURBO_PAD_INDEX_NONE);
turboPad.SetHide(true);
turboPad.SetAnimated(false);
turboPad.SetDrawOrderHigh(0);

size_t index = m_quadblocks.size();
turboPadIndex = quadblock.GetTurboPadIndex();
Expand Down Expand Up @@ -1617,6 +1624,7 @@ bool Level::LoadOBJ(const std::filesystem::path& objFile)
m_propTurboPads.SetDefaultValue(material, QuadblockTrigger::NONE);
m_propCheckpointPathable.SetDefaultValue(material, true);
m_propVisTreeTransparent.SetDefaultValue(material, false);
m_propDrawOrderHigh.SetDefaultValue(material, static_cast<int>(0));
m_propTerrain.RegisterMaterial(this);
m_propQuadFlags.RegisterMaterial(this);
m_propDoubleSided.RegisterMaterial(this);
Expand All @@ -1625,6 +1633,7 @@ bool Level::LoadOBJ(const std::filesystem::path& objFile)
m_propSpeedImpact.RegisterMaterial(this);
m_propCheckpointPathable.RegisterMaterial(this);
m_propVisTreeTransparent.RegisterMaterial(this);
m_propDrawOrderHigh.RegisterMaterial(this);
}
}
bool sameUVs = true;
Expand Down
1 change: 1 addition & 0 deletions src/level.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ class Level
MaterialProperty<int, MaterialType::SPEED_IMPACT> m_propSpeedImpact;
MaterialProperty<bool, MaterialType::CHECKPOINT_PATHABLE> m_propCheckpointPathable;
MaterialProperty<bool, MaterialType::VISTREE_TRANSPARENT> m_propVisTreeTransparent;
MaterialProperty<int, MaterialType::DRAW_ORDER_HIGH> m_propDrawOrderHigh;

std::array<Model*, LevelModels::COUNT> m_models;

Expand Down
42 changes: 30 additions & 12 deletions src/levelui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -233,18 +233,27 @@ bool MaterialProperty<T, M>::RenderUI(const std::string& material, const std::ve
}
else if constexpr (M == MaterialType::DRAW_FLAGS)
{
if (ImGui::TreeNode("Draw Flags"))
T& preview = GetPreview(material);
ImGui::Checkbox("Double Sided", &preview);
ImGui::SameLine();
static ButtonUI drawFlagsApplyButton = ButtonUI();
if (drawFlagsApplyButton.Show(("Apply##drawflags" + material).c_str(), "Draw flags successfully updated.", UnsavedChanges(material)))
{
T& preview = GetPreview(material);
ImGui::Checkbox("Double Sided", &preview);

static ButtonUI drawFlagsApplyButton = ButtonUI();
if (drawFlagsApplyButton.Show(("Apply##drawflags" + material).c_str(), "Draw flags successfully updated.", UnsavedChanges(material)))
{
Apply(material, quadblockIndexes, quadblocks);
return true;
}
ImGui::TreePop();
Apply(material, quadblockIndexes, quadblocks);
return true;
}
}
else if constexpr (M == MaterialType::DRAW_ORDER_HIGH)
{
T& preview = GetPreview(material);
ImGui::Text("Z depth bias:"); ImGui::SameLine();
if (ImGui::InputInt("##draworderHigh", &preview)) { preview = Clamp(preview, static_cast<int>(INT8_MIN), static_cast<int>(INT8_MAX)); }
ImGui::SameLine();
static ButtonUI drawOrderHighButton = ButtonUI();
if (drawOrderHighButton.Show(("Apply##draworderHigh" + material).c_str(), "Draw Order High successfully updated.", UnsavedChanges(material)))
{
Apply(material, quadblockIndexes, quadblocks);
return true;
}
}
else if constexpr (M == MaterialType::CHECKPOINT)
Expand Down Expand Up @@ -549,7 +558,13 @@ void Level::RenderUI(Renderer& renderer)

m_propTerrain.RenderUI(material, quadblockIndexes, m_quadblocks);
m_propQuadFlags.RenderUI(material, quadblockIndexes, m_quadblocks);
m_propDoubleSided.RenderUI(material, quadblockIndexes, m_quadblocks);
if (ImGui::TreeNode("Draw Flags"))
{
m_propDoubleSided.RenderUI(material, quadblockIndexes, m_quadblocks);
m_propDrawOrderHigh.RenderUI(material, quadblockIndexes, m_quadblocks);
ImGui::TreePop();
}

m_propCheckpoints.RenderUI(material, quadblockIndexes, m_quadblocks);
m_propCheckpointPathable.RenderUI(material, quadblockIndexes, m_quadblocks);
m_propVisTreeTransparent.RenderUI(material, quadblockIndexes, m_quadblocks);
Expand Down Expand Up @@ -1415,6 +1430,9 @@ bool Quadblock::RenderUI(size_t checkpointCount, bool& resetBsp)
if (ImGui::TreeNode("Draw Flags"))
{
ImGui::Checkbox("Double Sided", &m_doubleSided);
ImGui::Text("Z depth bias:");
ImGui::SameLine();
if (ImGui::InputInt("##draworderHigh", &m_drawOrderHigh)) { m_drawOrderHigh = Clamp(m_drawOrderHigh, static_cast<int>(INT8_MIN), static_cast<int>(INT8_MAX)); }
const std::vector<std::string> s_rotateFlip = {"None", "Rotate 90", "Rotate 180", "Rotate -90", "Flip + Rotate 90", "Flip + Rotate 180", "Flip + Rotate -90", "Flip"};
const std::vector<std::string> s_faceDrawMode = {"Both", "Left", "Right", "None"};

Expand Down
2 changes: 2 additions & 0 deletions src/material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ template class MaterialProperty<QuadblockTrigger, MaterialType::TURBO_PAD>;
template class MaterialProperty<int, MaterialType::SPEED_IMPACT>;
template class MaterialProperty<bool, MaterialType::CHECKPOINT_PATHABLE>;
template class MaterialProperty<bool, MaterialType::VISTREE_TRANSPARENT>;
template class MaterialProperty<int, MaterialType::DRAW_ORDER_HIGH>;

static std::unordered_map<Level*, std::vector<MaterialBase*>> g_materials;

Expand Down Expand Up @@ -119,6 +120,7 @@ void MaterialProperty<T, M>::Apply(const std::string& material, const std::vecto
else if constexpr (M == MaterialType::SPEED_IMPACT) { quadblock.SetSpeedImpact(preview); }
else if constexpr (M == MaterialType::CHECKPOINT_PATHABLE) { quadblock.SetCheckpointPathable(preview); }
else if constexpr (M == MaterialType::VISTREE_TRANSPARENT) { quadblock.SetVisTreeTransparent(preview); }
else if constexpr (M == MaterialType::DRAW_ORDER_HIGH) { quadblock.SetDrawOrderHigh(preview); }
}
}
m_backup[material] = preview;
Expand Down
2 changes: 1 addition & 1 deletion src/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

enum class MaterialType
{
TERRAIN, QUAD_FLAGS, DRAW_FLAGS, CHECKPOINT, TURBO_PAD, SPEED_IMPACT, CHECKPOINT_PATHABLE, VISTREE_TRANSPARENT
TERRAIN, QUAD_FLAGS, DRAW_FLAGS, CHECKPOINT, TURBO_PAD, SPEED_IMPACT, CHECKPOINT_PATHABLE, VISTREE_TRANSPARENT, DRAW_ORDER_HIGH
};

class MaterialBase
Expand Down
2 changes: 1 addition & 1 deletion src/psx_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ namespace PSX
uint16_t index[NUM_VERTICES_QUADBLOCK]; // 0x0
uint16_t flags; // 0x12
uint32_t drawOrderLow; // 0x14
uint32_t drawOrderHigh; // 0x18
int8_t drawOrderHigh[4]; // 0x18
uint32_t offMidTextures[4]; // 0x1C
PSX::BoundingBox bbox; // 0x2C
uint8_t terrain; // 0x38
Expand Down
14 changes: 13 additions & 1 deletion src/quadblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ Quadblock::Quadblock(const PSX::Quadblock& quadblock, const std::vector<PSX::Ver
uint32_t packedFace = (quadblock.drawOrderLow >> (8 + i * 5)) & 0b11111;
m_faceRotateFlip[i] = packedFace & 0b111;
m_faceDrawMode[i] = (packedFace >> 3) & 0b11;
if (quadblock.drawOrderHigh[i] != 0) { m_drawOrderHigh = static_cast<int>(quadblock.drawOrderHigh[i]); }
}
m_terrain = quadblock.terrain;
m_checkpointIndex = quadblock.checkpointIndex;
Expand Down Expand Up @@ -561,6 +562,11 @@ bool Quadblock::GetVisTreeTransparent() const
return m_visTreeTransparent;
}

int Quadblock::GetDrawOrderHigh() const
{
return m_drawOrderHigh;
}

const QuadUV& Quadblock::GetQuadUV(size_t quad) const
{
return m_uvs[quad];
Expand Down Expand Up @@ -631,6 +637,11 @@ void Quadblock::SetVisTreeTransparent(bool transparent)
m_visTreeTransparent = transparent;
}

void Quadblock::SetDrawOrderHigh(int drawOrderHigh)
{
m_drawOrderHigh = drawOrderHigh;
}

void Quadblock::SetName(const std::string& name)
{
m_name = name;
Expand Down Expand Up @@ -837,8 +848,8 @@ std::vector<uint8_t> Quadblock::Serialize(size_t id, size_t offTextures, const s
{
uint32_t packedFace = m_faceRotateFlip[i] | (m_faceDrawMode[i] << 3);
quadblock.drawOrderLow |= packedFace << (8 + i * 5);
quadblock.drawOrderHigh[i] = static_cast<int8_t>(m_drawOrderHigh);
}
quadblock.drawOrderHigh = 0;
if (m_animated)
{
quadblock.offMidTextures[0] = static_cast<uint32_t>(m_animTexOffset[0] | 1);
Expand Down Expand Up @@ -902,6 +913,7 @@ void Quadblock::SetDefaultValues()
m_checkpointPathable = true;
m_checkpointStatus = false;
m_visTreeTransparent = false;
m_drawOrderHigh = 0x0;
m_trigger = QuadblockTrigger::NONE;
m_turboPadIndex = TURBO_PAD_INDEX_NONE;
m_hide = false;
Expand Down
3 changes: 3 additions & 0 deletions src/quadblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ class Quadblock
bool GetCheckpointStatus() const;
bool GetCheckpointPathable() const;
bool GetVisTreeTransparent() const;
int GetDrawOrderHigh() const;
const QuadUV& GetQuadUV(size_t quad) const;
const std::filesystem::path& GetTexPath() const;
const std::array<QuadUV, NUM_FACES_QUADBLOCK + 1>& GetUVs() const;
Expand All @@ -147,6 +148,7 @@ class Quadblock
void SetCheckpointStatus(bool active);
void SetCheckpointPathable(bool pathable);
void SetVisTreeTransparent(bool transparent);
void SetDrawOrderHigh(int drawOrderHigh);
void SetName(const std::string& name);
void SetTurboPadIndex(size_t index);
void SetHide(bool active);
Expand Down Expand Up @@ -189,6 +191,7 @@ class Quadblock
bool m_checkpointPathable;
bool m_checkpointStatus;
bool m_visTreeTransparent;
int m_drawOrderHigh;
bool m_hide;
Vertex m_p[NUM_VERTICES_QUADBLOCK];
BoundingBox m_bbox;
Expand Down