export distance field as TGA
This commit is contained in:
parent
6f883ff10d
commit
177764de2d
3 changed files with 40 additions and 1 deletions
|
@ -1335,6 +1335,42 @@ void TerrainEditor::registerLuaAPI() {
|
|||
LuaWrapper::createSystemClosure(L, "TerrainEditor", this, "placePrefabs", placePrefabs);
|
||||
}
|
||||
|
||||
void TerrainEditor::exportDistanceField(const DistanceField& df) const {
|
||||
OutputMemoryStream blob(m_app.getAllocator());
|
||||
|
||||
char filename[LUMIX_MAX_PATH];
|
||||
if (!os::getSaveFilename(Span(filename), "Targa TGA\0*.tga\0", "tga")) return;
|
||||
|
||||
const Path path(filename);
|
||||
Array<u32> data(m_app.getAllocator());
|
||||
data.resize(df.width * df.height);
|
||||
|
||||
for (u32 j = 0; j < df.height; ++j) {
|
||||
for (u32 i = 0; i < df.width; ++i) {
|
||||
const float dist = df.data[i + j * df.width];
|
||||
u8 d8 = u8(clamp(dist, 0.f, 255.f) + 0.5f);
|
||||
data[i + j * df.width] = d8 | (d8 << 8) | (d8 << 16) | (d8 << 24);
|
||||
}
|
||||
}
|
||||
|
||||
bool saved = Texture::saveTGA(&blob, df.width, df.height, gpu::TextureFormat::RGBA8, (const u8*)data.begin(), true, path, m_app.getAllocator());
|
||||
if (!saved) {
|
||||
logError("Failed to save ", path);
|
||||
return;
|
||||
}
|
||||
|
||||
os::OutputFile file;
|
||||
if (!file.open(filename)) {
|
||||
logError("Failed to open ", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.write(blob.data(), blob.size())) {
|
||||
logError("Failed to write ", filename, " properly, it's corrupted.");
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
void TerrainEditor::distanceFieldsUI(ComponentUID terrain_uid) {
|
||||
for (DistanceField& df : m_distance_fields) {
|
||||
if (ImGui::TreeNode(df.name.c_str(), "%s %d x %d", df.name.c_str(), df.width, df.height)) {
|
||||
|
@ -1428,6 +1464,8 @@ void TerrainEditor::distanceFieldsUI(ComponentUID terrain_uid) {
|
|||
if (ImGuiEx::IconButton(ICON_FA_PLUS, "Add spline")) {
|
||||
ImGui::OpenPopup("add_spline");
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGuiEx::IconButton(ICON_FA_FILE_EXPORT, "Export as texture")) exportDistanceField(df);
|
||||
|
||||
if (ImGui::BeginPopup("add_spline")) {
|
||||
CoreScene* core = (CoreScene*)render_scene->getUniverse().getScene(SPLINE_TYPE);
|
||||
|
|
|
@ -69,6 +69,7 @@ struct TerrainEditor final : StudioApp::MousePlugin {
|
|||
void addSpline(const struct Terrain& terrain, DistanceField& df, const struct Spline& spline, EntityRef spline_entity) const;
|
||||
|
||||
private:
|
||||
void exportDistanceField(const DistanceField& df) const;
|
||||
static int placeInstances(lua_State* L);
|
||||
static int placePrefabs(lua_State* L);
|
||||
void registerLuaAPI();
|
||||
|
|
|
@ -4418,7 +4418,7 @@ struct PipelineImpl final : Pipeline
|
|||
inst.scale = terrain->getScale();
|
||||
inst.hm_size = terrain->getSize();
|
||||
Shader* shader = terrain->m_material->getShader();
|
||||
inst.program = shader->getProgram(gpu::VertexDecl(), m_define_mask);
|
||||
inst.program = shader->getProgram(gpu::VertexDecl(), m_define_mask | terrain->m_material->getDefineMask());
|
||||
inst.material = terrain->m_material->getRenderData();
|
||||
if (isinf(inst.pos.x) || isinf(inst.pos.y) || isinf(inst.pos.z)) {
|
||||
m_instances.pop();
|
||||
|
|
Loading…
Reference in a new issue