From 3f654df8e3eb9d97917a3b58b460997665010583 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 31 May 2021 21:52:30 +0200 Subject: [PATCH] [DEV] update palette model to support 3 state by palette --- .../loader3d/resources/ResourceMesh.java | 2 +- .../resources/ResourcePaletteFile.java | 132 +++++++++++------- 2 files changed, 79 insertions(+), 55 deletions(-) diff --git a/src/org/atriasoft/loader3d/resources/ResourceMesh.java b/src/org/atriasoft/loader3d/resources/ResourceMesh.java index a7bf7b2..b144b0f 100644 --- a/src/org/atriasoft/loader3d/resources/ResourceMesh.java +++ b/src/org/atriasoft/loader3d/resources/ResourceMesh.java @@ -460,7 +460,7 @@ void setNormalMode(final NormalMode _mode) { break; } float maxValues = ResourcePaletteFile.getColorMax(); - float height = 8.0f; + float height = ResourcePaletteFile.getHeight(); int indexColor = ResourcePaletteFile.getColorId(elem.getKey().substring(8)); Vector2f texturepos = new Vector2f((indexColor+0.5f)/maxValues, 0.5f/height); Log.error("find color : " + elem.getKey().substring(8) + " ==> " + indexColor + " pos = " + texturepos); diff --git a/src/org/atriasoft/loader3d/resources/ResourcePaletteFile.java b/src/org/atriasoft/loader3d/resources/ResourcePaletteFile.java index c46a580..cf20004 100644 --- a/src/org/atriasoft/loader3d/resources/ResourcePaletteFile.java +++ b/src/org/atriasoft/loader3d/resources/ResourcePaletteFile.java @@ -7,48 +7,55 @@ package org.atriasoft.loader3d.resources; */ import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; -import java.util.Map; -import java.util.Map.Entry; import org.atriasoft.egami.ImageByte; -import org.atriasoft.egami.ImageByteRGB; import org.atriasoft.egami.ImageByteRGBA; import org.atriasoft.ejson.Ejson; -import org.atriasoft.ejson.model.JsonArray; import org.atriasoft.ejson.model.JsonNode; import org.atriasoft.ejson.model.JsonObject; import org.atriasoft.etk.Color; -import org.atriasoft.etk.Tools; import org.atriasoft.etk.Uri; import org.atriasoft.etk.math.Vector4f; -import org.atriasoft.loader3d.internal.Log; -import org.atriasoft.loader3d.model.Material; -import org.atriasoft.loader3d.model.MaterialBase; import org.atriasoft.gale.resource.Resource; +import org.atriasoft.loader3d.internal.Log; +import org.atriasoft.loader3d.model.MaterialBase; /** * ColorFile is a Resource designed to be specific with the theme (for * example black, or white or orange ...) */ public class ResourcePaletteFile extends Resource { + private static final int COUNT_HEIGHT_PALETTE = 16; private static final int COUNT_MAX_COLOR_PALETTE = 32; - private static final List PALETTE_ELEMENTS = new ArrayList<>(COUNT_MAX_COLOR_PALETTE); + private static final String DEFINE_PALETTE = "palette"; + private static final String DEFINE_DEFAULT = "default"; + private static final String DEFINE_OVER = "over"; + private static final String DEFINE_SELECT = "select"; + private static final String DEFINE_SHINESS = "Ns"; + private static final String DEFINE_AMBIANT_FACTOR = "Ka"; + private static final String DEFINE_SPECULAR_FACTOR = "Ks"; + private static final String DEFINE_DIFFUSE_FACTOR = "Kd"; + private static final List PALETTE_ELEMENTS = new ArrayList<>(ResourcePaletteFile.COUNT_MAX_COLOR_PALETTE); static { - PALETTE_ELEMENTS.add("unknown"); + ResourcePaletteFile.PALETTE_ELEMENTS.add("unknown"); } - public static synchronized int getColorId(String color) { - for (int iii=0; iii list = new TreeMap(); // !< List of all color in the file + + private final SortedMap listNormal = new TreeMap(); // !< List of all color in the file + private final SortedMap listOver = new TreeMap(); // !< List of all color in the file + private final SortedMap listSelect = new TreeMap(); // !< List of all color in the file /** * Constructor of the color property file @@ -99,35 +108,35 @@ public class ResourcePaletteFile extends Resource { if (id == null) { return this.errorColor; } - Vector4f color = this.list.get(id).getAmbientFactor(); + Vector4f color = this.listNormal.get(id).getAmbientFactor(); return new Color(color.x(), color.y(), color.z(), color.w()); } - private MaterialBase configMaterial(JsonObject baseDefault) { - MaterialBase element = this.base.clone(); + private MaterialBase configMaterial(final JsonObject node, final MaterialBase parent) { + MaterialBase element = parent.clone(); try { - if (baseDefault != null) { - if (baseDefault.exist("Ns")) { - final double data = baseDefault.get("Ns").toJsonNumber().getValue(); + if (node != null) { + if (node.exist(ResourcePaletteFile.DEFINE_SHINESS)) { + final double data = node.get(ResourcePaletteFile.DEFINE_SHINESS).toJsonNumber().getValue(); Log.verbose(" Shininess " + data); element.setShininess((float)data); } - if (baseDefault.exist("Ka")) { - final String data = baseDefault.get("Ka").toJsonString().getValue(); + if (node.exist(ResourcePaletteFile.DEFINE_AMBIANT_FACTOR)) { + final String data = node.get(ResourcePaletteFile.DEFINE_AMBIANT_FACTOR).toJsonString().getValue(); Vector4f tmp = Vector4f.valueOf(data); tmp = tmp.withW(1); Log.verbose(" AmbientFactor " + tmp); element.setAmbientFactor(tmp); } - if (baseDefault.exist("Kd")) { - final String data = baseDefault.get("Kd").toJsonString().getValue(); + if (node.exist(ResourcePaletteFile.DEFINE_DIFFUSE_FACTOR)) { + final String data = node.get(ResourcePaletteFile.DEFINE_DIFFUSE_FACTOR).toJsonString().getValue(); Vector4f tmp = Vector4f.valueOf(data); tmp = tmp.withW(1); Log.verbose(" DiffuseFactor " + tmp); element.setDiffuseFactor(tmp); } - if (baseDefault.exist("Ks")) { - final String data = baseDefault.get("Ks").toJsonString().getValue(); + if (node.exist(ResourcePaletteFile.DEFINE_SPECULAR_FACTOR)) { + final String data = node.get(ResourcePaletteFile.DEFINE_SPECULAR_FACTOR).toJsonString().getValue(); Vector4f tmp = Vector4f.valueOf(data); tmp = tmp.withW(1); Log.verbose(" SpecularFactor " + tmp); @@ -143,23 +152,36 @@ public class ResourcePaletteFile extends Resource { @Override public synchronized void reload() { - this.list.clear(); + this.listNormal.clear(); this.base = new MaterialBase(); try { final JsonObject out = Ejson.parse(Uri.valueOf(this.name)).toJsonObject(); - final JsonObject baseDefault = out.get("default").toJsonObject(); - this.base = configMaterial(baseDefault); + final JsonObject baseDefault = out.get(ResourcePaletteFile.DEFINE_DEFAULT).toJsonObject(); + this.base = configMaterial(baseDefault, this.base); - final JsonObject baseObject = out.get("palette").toJsonObject(); + final JsonObject baseObject = out.get(ResourcePaletteFile.DEFINE_PALETTE).toJsonObject(); if (baseObject == null) { Log.error("Can not get basic object : 'palette' in file:" + this.name); Ejson.display(out); return; } for (Entry it : baseObject.getNodes().entrySet()) { - MaterialBase mat = configMaterial(it.getValue().toJsonObject()); - list.put(it.getKey(), mat); + JsonObject nodeMaterial = it.getValue().toJsonObject(); + MaterialBase mat = configMaterial(nodeMaterial, this.base); + this.listNormal.put(it.getKey(), mat); + if (nodeMaterial.exist(ResourcePaletteFile.DEFINE_OVER)) { + MaterialBase matOver = configMaterial(nodeMaterial.get(ResourcePaletteFile.DEFINE_OVER).toJsonObject(), mat); + this.listOver.put(it.getKey(), matOver); + } else { + this.listOver.put(it.getKey(), mat); + } + if (nodeMaterial.exist(ResourcePaletteFile.DEFINE_SELECT)) { + MaterialBase matSelect = configMaterial(nodeMaterial.get(ResourcePaletteFile.DEFINE_SELECT).toJsonObject(), mat); + this.listSelect.put(it.getKey(), matSelect); + } else { + this.listSelect.put(it.getKey(), mat); + } } } catch (final Exception e) { Log.error("chach exception in parsing config file... " + e.getMessage()); @@ -172,43 +194,45 @@ public class ResourcePaletteFile extends Resource { } } - public void onUpdate(Runnable object) { + public void onUpdate(final Runnable object) { this.updatePostAction = object; } public ImageByte getImageByte() { - int width = COUNT_MAX_COLOR_PALETTE; - int height = 8; + int width = ResourcePaletteFile.COUNT_MAX_COLOR_PALETTE; + int height = ResourcePaletteFile.COUNT_HEIGHT_PALETTE; ImageByteRGBA out = new ImageByteRGBA(width, height); //ImageByteRGB out = new ImageByteRGB(width, height); // clear the palette: //float val = 0.0f; for (int xxx=0; xxx < width; xxx++) { - for (int yyy=0; yyy < 8; yyy++) { + for (int yyy=0; yyy < ResourcePaletteFile.COUNT_HEIGHT_PALETTE; yyy++) { out.setColorFloat(xxx, yyy, 1, 1, 1, 1); //out.setColorFloat(xxx, yyy, val, val + 0.125f, val + 0.85f, 1); //val += 0.01f; } } - for (Entry it : this.list.entrySet()) { - int id = getColorId(it.getKey()); + for (Entry it : this.listNormal.entrySet()) { + int id = ResourcePaletteFile.getColorId(it.getKey()); MaterialBase mat = it.getValue(); + MaterialBase matOver = this.listOver.get(it.getKey()); + MaterialBase matSelect = this.listSelect.get(it.getKey()); Log.error("add Material in texture: '" + it.getKey() + "' ==> " + id + " mat=" + mat); // 2 element this will permit to change color in the future on depend on some parameters... - out.setColorFloat(id, 0, mat.getDiffuseFactor().x(), mat.getDiffuseFactor().y(), mat.getDiffuseFactor().z(), mat.getDiffuseFactor().w()); - out.setColorFloat(id, 1, mat.getDiffuseFactor().x(), mat.getDiffuseFactor().y(), mat.getDiffuseFactor().z(), mat.getDiffuseFactor().w()); - - out.setColorFloat(id, 2, mat.getSpecularFactor().x(), mat.getSpecularFactor().y(), mat.getSpecularFactor().z(), mat.getSpecularFactor().w()); - out.setColorFloat(id, 3, mat.getSpecularFactor().x(), mat.getSpecularFactor().y(), mat.getSpecularFactor().z(), mat.getSpecularFactor().w()); - - out.setColorFloat(id, 4, mat.getAmbientFactor().x(), mat.getAmbientFactor().y(), mat.getAmbientFactor().z(), mat.getAmbientFactor().w()); - out.setColorFloat(id, 5, mat.getAmbientFactor().x(), mat.getAmbientFactor().y(), mat.getAmbientFactor().z(), mat.getAmbientFactor().w()); - - out.setColorFloat(id, 6, mat.getShininess(), 1.0f, 1.0f, 1.0f); - + putColor(id, 0, out, mat); + putColor(id, 1, out, matOver); + putColor(id, 2, out, matSelect); + putColor(id, 3, out, mat); + // Note: this model permit to have interpolation of color normal <-> over ; normal <-> select ; over <-> select } return out; } + private void putColor(final int index, final int offset, final ImageByte image, final MaterialBase mat) { + image.setColorFloat(index, 0+offset, mat.getDiffuseFactor().x(), mat.getDiffuseFactor().y(), mat.getDiffuseFactor().z(), mat.getDiffuseFactor().w()); + image.setColorFloat(index, 4+offset, mat.getSpecularFactor().x(), mat.getSpecularFactor().y(), mat.getSpecularFactor().z(), mat.getSpecularFactor().w()); + image.setColorFloat(index, 8+offset, mat.getAmbientFactor().x(), mat.getAmbientFactor().y(), mat.getAmbientFactor().z(), mat.getAmbientFactor().w()); + image.setColorFloat(index, 12+offset, mat.getShininess(), 1.0f, 1.0f, 1.0f); + } }