[DEV] update palette model to support 3 state by palette

This commit is contained in:
Edouard DUPIN 2021-05-31 21:52:30 +02:00
parent 320be27f8c
commit 3f654df8e3
2 changed files with 79 additions and 55 deletions

View File

@ -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);

View File

@ -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<String> 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<String> 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<PALETTE_ELEMENTS.size(); iii++) {
if (PALETTE_ELEMENTS.get(iii).equals(color)) {
public static synchronized int getColorId(final String color) {
for (int iii=0; iii<ResourcePaletteFile.PALETTE_ELEMENTS.size(); iii++) {
if (ResourcePaletteFile.PALETTE_ELEMENTS.get(iii).equals(color)) {
return iii;
}
}
PALETTE_ELEMENTS.add(color);
return PALETTE_ELEMENTS.size()-1;
ResourcePaletteFile.PALETTE_ELEMENTS.add(color);
return ResourcePaletteFile.PALETTE_ELEMENTS.size()-1;
}
public static int getColorMax() {
return COUNT_MAX_COLOR_PALETTE;
return ResourcePaletteFile.COUNT_MAX_COLOR_PALETTE;
}
public static int getHeight() {
return ResourcePaletteFile.COUNT_HEIGHT_PALETTE;
}
private Runnable updatePostAction = null;
@ -69,10 +76,12 @@ public class ResourcePaletteFile extends Resource {
return new ResourcePaletteFile(uri);
}
private Color errorColor = Color.ORANGE;
private final Color errorColor = Color.ORANGE;
private MaterialBase base = new MaterialBase();
private final SortedMap<String, MaterialBase> list = new TreeMap<String, MaterialBase>(); // !< List of all color in the file
private final SortedMap<String, MaterialBase> listNormal = new TreeMap<String, MaterialBase>(); // !< List of all color in the file
private final SortedMap<String, MaterialBase> listOver = new TreeMap<String, MaterialBase>(); // !< List of all color in the file
private final SortedMap<String, MaterialBase> listSelect = new TreeMap<String, MaterialBase>(); // !< 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<String, JsonNode> 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<String, MaterialBase> it : this.list.entrySet()) {
int id = getColorId(it.getKey());
for (Entry<String, MaterialBase> 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);
}
}