[DEV] continue integration

This commit is contained in:
Edouard DUPIN 2021-03-16 00:25:37 +01:00
parent d55b83f5b8
commit b23e221988
16 changed files with 1929 additions and 703 deletions

View File

@ -5,5 +5,7 @@
open module org.atriasoft.etk {
exports org.atriasoft.etk;
exports org.atriasoft.etk.math;
exports org.atriasoft.etk.util;
requires transitive io.scenarium.logger;
}

View File

@ -1,25 +1,442 @@
package org.atriasoft.etk;
import java.util.Map;
import org.atriasoft.etk.math.FMath;
// TODO transform in record ...
public class Color {
@Override
public String toString() {
return "Color [r=" + r + ", g=" + g + ", b=" + b + ", a=" + a + "]";
public static final Color NONE = new Color(0x00, 0x00, 0x00, 0x00);
public static final Color ALICE_BLUE = new Color(0xF0, 0xF8, 0xFF, 0xFF);
public static final Color ANTIQUE_WHITE = new Color(0xFA, 0xEB, 0xD7, 0xFF);
public static final Color AQUA = new Color(0x00, 0xFF, 0xFF, 0xFF);
public static final Color AQUA_MARINE = new Color(0x7F, 0xFF, 0xD4, 0xFF);
public static final Color AZURE = new Color(0xF0, 0xFF, 0xFF, 0xFF);
public static final Color BEIGE = new Color(0xF5, 0xF5, 0xDC, 0xFF);
public static final Color BISQUE = new Color(0xFF, 0xE4, 0xC4, 0xFF);
public static final Color BLACK = new Color(0x00, 0x00, 0x00, 0xFF);
public static final Color BLANCHED_ALMOND = new Color(0xFF, 0xEB, 0xCD, 0xFF);
public static final Color BLUE = new Color(0x00, 0x00, 0xFF, 0xFF);
public static final Color BLUE_VIOLET = new Color(0x8A, 0x2B, 0xE2, 0xFF);
public static final Color BROWN = new Color(0xA5, 0x2A, 0x2A, 0xFF);
public static final Color BURLY_WOOD = new Color(0xDE, 0xB8, 0x87, 0xFF);
public static final Color CADET_BLUE = new Color(0x5F, 0x9E, 0xA0, 0xFF);
public static final Color CHARTREUSE = new Color(0x7F, 0xFF, 0x00, 0xFF);
public static final Color CHOCOLATE = new Color(0xD2, 0x69, 0x1E, 0xFF);
public static final Color CORAL = new Color(0xFF, 0x7F, 0x50, 0xFF);
public static final Color CORNFLOWER_BLUE = new Color(0x64, 0x95, 0xED, 0xFF);
public static final Color CORNSILK = new Color(0xFF, 0xF8, 0xDC, 0xFF);
public static final Color CRIMSON = new Color(0xDC, 0x14, 0x3C, 0xFF);
public static final Color CYAN = new Color(0x00, 0xFF, 0xFF, 0xFF);
public static final Color DARK_BLUE = new Color(0x00, 0x00, 0x8B, 0xFF);
public static final Color DARK_CYAN = new Color(0x00, 0x8B, 0x8B, 0xFF);
public static final Color DARK_GOLDENROD = new Color(0xB8, 0x86, 0x0B, 0xFF);
public static final Color DARK_GRAY = new Color(0xA9, 0xA9, 0xA9, 0xFF);
public static final Color DARK_GREY = new Color(0xA9, 0xA9, 0xA9, 0xFF);
public static final Color DARK_GREEN = new Color(0x00, 0x64, 0x00, 0xFF);
public static final Color DARK_KHAKI = new Color(0xBD, 0xB7, 0x6B, 0xFF);
public static final Color DARK_MAGENTA = new Color(0x8B, 0x00, 0x8B, 0xFF);
public static final Color DARK_OLIVEGREEN = new Color(0x55, 0x6B, 0x2F, 0xFF);
public static final Color DARK_ORANGE = new Color(0xFF, 0x8C, 0x00, 0xFF);
public static final Color DARK_ORCHID = new Color(0x99, 0x32, 0xCC, 0xFF);
public static final Color DARK_RED = new Color(0x8B, 0x00, 0x00, 0xFF);
public static final Color DARK_SALMON = new Color(0xE9, 0x96, 0x7A, 0xFF);
public static final Color DARK_SEAGREEN = new Color(0x8F, 0xBC, 0x8F, 0xFF);
public static final Color DARK_SLATE_BLUE = new Color(0x48, 0x3D, 0x8B, 0xFF);
public static final Color DARK_SLATE_GRAY = new Color(0x2F, 0x4F, 0x4F, 0xFF);
public static final Color DARK_SLATE_GREY = new Color(0x2F, 0x4F, 0x4F, 0xFF);
public static final Color DARK_TURQUOISE = new Color(0x00, 0xCE, 0xD1, 0xFF);
public static final Color DARK_VIOLET = new Color(0x94, 0x00, 0xD3, 0xFF);
public static final Color DEEP_PINK = new Color(0xFF, 0x14, 0x93, 0xFF);
public static final Color DEEP_SKY_BLUE = new Color(0x00, 0xBF, 0xFF, 0xFF);
public static final Color DIM_GRAY = new Color(0x69, 0x69, 0x69, 0xFF);
public static final Color DIM_GREY = new Color(0x69, 0x69, 0x69, 0xFF);
public static final Color DODGER_BLUE = new Color(0x1E, 0x90, 0xFF, 0xFF);
public static final Color FIRE_BRICK = new Color(0xB2, 0x22, 0x22, 0xFF);
public static final Color FLORAL_WHITE = new Color(0xFF, 0xFA, 0xF0, 0xFF);
public static final Color FOREST_GREEN = new Color(0x22, 0x8B, 0x22, 0xFF);
public static final Color FUCHSIA = new Color(0xFF, 0x00, 0xFF, 0xFF);
public static final Color GAINSBORO = new Color(0xDC, 0xDC, 0xDC, 0xFF);
public static final Color GHOST_WHITE = new Color(0xF8, 0xF8, 0xFF, 0xFF);
public static final Color GOLD = new Color(0xFF, 0xD7, 0x00, 0xFF);
public static final Color GOLDEN_ROD = new Color(0xDA, 0xA5, 0x20, 0xFF);
public static final Color GRAY = new Color(0x80, 0x80, 0x80, 0xFF);
public static final Color GREY = new Color(0x80, 0x80, 0x80, 0xFF);
public static final Color GREEN = new Color(0x00, 0x80, 0x00, 0xFF);
public static final Color GREEN_YELLOW = new Color(0xAD, 0xFF, 0x2F, 0xFF);
public static final Color HONEY_DEW = new Color(0xF0, 0xFF, 0xF0, 0xFF);
public static final Color HOT_PINK = new Color(0xFF, 0x69, 0xB4, 0xFF);
public static final Color INDIAN_RED = new Color(0xCD, 0x5C, 0x5C, 0xFF);
public static final Color INDIGO = new Color(0x4B, 0x00, 0x82, 0xFF);
public static final Color IVORY = new Color(0xFF, 0xFF, 0xF0, 0xFF);
public static final Color KHAKI = new Color(0xF0, 0xE6, 0x8C, 0xFF);
public static final Color LAVENDER = new Color(0xE6, 0xE6, 0xFA, 0xFF);
public static final Color LAVENDER_BLUSH = new Color(0xFF, 0xF0, 0xF5, 0xFF);
public static final Color LAWN_GREEN = new Color(0x7C, 0xFC, 0x00, 0xFF);
public static final Color LEMON_CHIFFON = new Color(0xFF, 0xFA, 0xCD, 0xFF);
public static final Color LIGHT_BLUE = new Color(0xAD, 0xD8, 0xE6, 0xFF);
public static final Color LIGHT_CORAL = new Color(0xF0, 0x80, 0x80, 0xFF);
public static final Color LIGHT_CYAN = new Color(0xE0, 0xFF, 0xFF, 0xFF);
public static final Color LIGHT_GOLDEN_ROD_YELLOW = new Color(0xFA, 0xFA, 0xD2, 0xFF);
public static final Color LIGHT_GRAY = new Color(0xD3, 0xD3, 0xD3, 0xFF);
public static final Color LIGHT_GREY = new Color(0xD3, 0xD3, 0xD3, 0xFF);
public static final Color LIGHT_GREEN = new Color(0x90, 0xEE, 0x90, 0xFF);
public static final Color LIGHT_PINK = new Color(0xFF, 0xB6, 0xC1, 0xFF);
public static final Color LIGHT_SALMON = new Color(0xFF, 0xA0, 0x7A, 0xFF);
public static final Color LIGHT_SEA_GREEN = new Color(0x20, 0xB2, 0xAA, 0xFF);
public static final Color LIGHT_SKY_BLUE = new Color(0x87, 0xCE, 0xFA, 0xFF);
public static final Color LIGHT_SLATE_GRAY = new Color(0x77, 0x88, 0x99, 0xFF);
public static final Color LIGHT_SLATE_GREY = new Color(0x77, 0x88, 0x99, 0xFF);
public static final Color LIGHT_STEEL_BLUE = new Color(0xB0, 0xC4, 0xDE, 0xFF);
public static final Color LIGHT_YELLOW = new Color(0xFF, 0xFF, 0xE0, 0xFF);
public static final Color LIME = new Color(0x00, 0xFF, 0x00, 0xFF);
public static final Color LIME_GREEN = new Color(0x32, 0xCD, 0x32, 0xFF);
public static final Color LINEN = new Color(0xFA, 0xF0, 0xE6, 0xFF);
public static final Color MAGENTA = new Color(0xFF, 0x00, 0xFF, 0xFF);
public static final Color MAROON = new Color(0x80, 0x00, 0x00, 0xFF);
public static final Color MEDIUM_AQUA_MARINE = new Color(0x66, 0xCD, 0xAA, 0xFF);
public static final Color MEDIUM_BLUE = new Color(0x00, 0x00, 0xCD, 0xFF);
public static final Color MEDIUM_ORCHID = new Color(0xBA, 0x55, 0xD3, 0xFF);
public static final Color MEDIUM_PURPLE = new Color(0x93, 0x70, 0xD8, 0xFF);
public static final Color MEDIUM_SEA_GREEN = new Color(0x3C, 0xB3, 0x71, 0xFF);
public static final Color MEDIUM_SLATE_BLUE = new Color(0x7B, 0x68, 0xEE, 0xFF);
public static final Color MEDIUM_SPRING_GREEN = new Color(0x00, 0xFA, 0x9A, 0xFF);
public static final Color MEDIUM_TURQUOISE = new Color(0x48, 0xD1, 0xCC, 0xFF);
public static final Color MEDIUM_VIOLET_RED = new Color(0xC7, 0x15, 0x85, 0xFF);
public static final Color MIDNIGHT_BLUE = new Color(0x19, 0x19, 0x70, 0xFF);
public static final Color MINT_CREAM = new Color(0xF5, 0xFF, 0xFA, 0xFF);
public static final Color MISTY_ROSE = new Color(0xFF, 0xE4, 0xE1, 0xFF);
public static final Color MOCCASIN = new Color(0xFF, 0xE4, 0xB5, 0xFF);
public static final Color NAVAJO_WHITE = new Color(0xFF, 0xDE, 0xAD, 0xFF);
public static final Color NAVY = new Color(0x00, 0x00, 0x80, 0xFF);
public static final Color OLDLACE = new Color(0xFD, 0xF5, 0xE6, 0xFF);
public static final Color OLIVE = new Color(0x80, 0x80, 0x00, 0xFF);
public static final Color OLIVE_DRAB = new Color(0x6B, 0x8E, 0x23, 0xFF);
public static final Color ORANGE = new Color(0xFF, 0xA5, 0x00, 0xFF);
public static final Color ORANGE_RED = new Color(0xFF, 0x45, 0x00, 0xFF);
public static final Color ORCHID = new Color(0xDA, 0x70, 0xD6, 0xFF);
public static final Color PALE_GOLDEN_ROD = new Color(0xEE, 0xE8, 0xAA, 0xFF);
public static final Color PALE_GREEN = new Color(0x98, 0xFB, 0x98, 0xFF);
public static final Color PALE_TURQUOISE = new Color(0xAF, 0xEE, 0xEE, 0xFF);
public static final Color PALE_VIOLET_RED = new Color(0xD8, 0x70, 0x93, 0xFF);
public static final Color PAPAYA_WHIP = new Color(0xFF, 0xEF, 0xD5, 0xFF);
public static final Color PEACH_PUFF = new Color(0xFF, 0xDA, 0xB9, 0xFF);
public static final Color PERU = new Color(0xCD, 0x85, 0x3F, 0xFF);
public static final Color PINK = new Color(0xFF, 0xC0, 0xCB, 0xFF);
public static final Color PLUM = new Color(0xDD, 0xA0, 0xDD, 0xFF);
public static final Color POWDER_BLUE = new Color(0xB0, 0xE0, 0xE6, 0xFF);
public static final Color PURPLE = new Color(0x80, 0x00, 0x80, 0xFF);
public static final Color RED = new Color(0xFF, 0x00, 0x00, 0xFF);
public static final Color ROSY_BROWN = new Color(0xBC, 0x8F, 0x8F, 0xFF);
public static final Color ROYAL_BLUE = new Color(0x41, 0x69, 0xE1, 0xFF);
public static final Color SADDLE_BROWN = new Color(0x8B, 0x45, 0x13, 0xFF);
public static final Color SALMON = new Color(0xFA, 0x80, 0x72, 0xFF);
public static final Color SANDY_BROWN = new Color(0xF4, 0xA4, 0x60, 0xFF);
public static final Color SEA_GREEN = new Color(0x2E, 0x8B, 0x57, 0xFF);
public static final Color SEA_SHELL = new Color(0xFF, 0xF5, 0xEE, 0xFF);
public static final Color SIENNA = new Color(0xA0, 0x52, 0x2D, 0xFF);
public static final Color SILVER = new Color(0xC0, 0xC0, 0xC0, 0xFF);
public static final Color SKY_BLUE = new Color(0x87, 0xCE, 0xEB, 0xFF);
public static final Color SLATE_BLUE = new Color(0x6A, 0x5A, 0xCD, 0xFF);
public static final Color SLATE_GRAY = new Color(0x70, 0x80, 0x90, 0xFF);
public static final Color SLATE_GREY = new Color(0x70, 0x80, 0x90, 0xFF);
public static final Color SNOW = new Color(0xFF, 0xFA, 0xFA, 0xFF);
public static final Color SPRING_GREEN = new Color(0x00, 0xFF, 0x7F, 0xFF);
public static final Color STEEL_BLUE = new Color(0x46, 0x82, 0xB4, 0xFF);
public static final Color TAN = new Color(0xD2, 0xB4, 0x8C, 0xFF);
public static final Color TEAL = new Color(0x00, 0x80, 0x80, 0xFF);
public static final Color THISTLE = new Color(0xD8, 0xBF, 0xD8, 0xFF);
public static final Color TOMATO = new Color(0xFF, 0x63, 0x47, 0xFF);
public static final Color TURQUOISE = new Color(0x40, 0xE0, 0xD0, 0xFF);
public static final Color VIOLET = new Color(0xEE, 0x82, 0xEE, 0xFF);
public static final Color WHEAT = new Color(0xF5, 0xDE, 0xB3, 0xFF);
public static final Color WHITE = new Color(0xFF, 0xFF, 0xFF, 0xFF);
public static final Color WHITE_SMOKE = new Color(0xF5, 0xF5, 0xF5, 0xFF);
public static final Color YELLOW = new Color(0xFF, 0xFF, 0x00, 0xFF);
public static final Color YELLOW_GREEN = new Color(0x9A, 0xCD, 0x32, 0xFF);
private static final Map<String, Color> NAMED_COLORS = Map.ofEntries(
//@formatter:off
Map.entry("none", NONE),
Map.entry("aliceblue", ALICE_BLUE),
Map.entry("antiquewhite", ANTIQUE_WHITE),
Map.entry("aqua", AQUA),
Map.entry("aquamarine", AQUA_MARINE),
Map.entry("azure", AZURE),
Map.entry("beige", BEIGE),
Map.entry("bisque", BISQUE),
Map.entry("black", BLACK),
Map.entry("blanchedalmond", BLANCHED_ALMOND),
Map.entry("blue", BLUE),
Map.entry("blueviolet", BLUE_VIOLET),
Map.entry("brown", BROWN),
Map.entry("burlywood", BURLY_WOOD),
Map.entry("cadetblue", CADET_BLUE),
Map.entry("chartreuse", CHARTREUSE),
Map.entry("chocolate", CHOCOLATE),
Map.entry("coral", CORAL),
Map.entry("cornflowerblue", CORNFLOWER_BLUE),
Map.entry("cornsilk", CORNSILK),
Map.entry("crimson", CRIMSON),
Map.entry("cyan", CYAN),
Map.entry("darkblue", DARK_BLUE),
Map.entry("darkcyan", DARK_CYAN),
Map.entry("darkgoldenrod", DARK_GOLDENROD),
Map.entry("darkgray", DARK_GRAY),
Map.entry("darkgrey", DARK_GREY),
Map.entry("darkgreen", DARK_GREEN),
Map.entry("darkkhaki", DARK_KHAKI),
Map.entry("darkmagenta", DARK_MAGENTA),
Map.entry("darkolivegreen", DARK_OLIVEGREEN),
Map.entry("darkorange", DARK_ORANGE),
Map.entry("darkorchid", DARK_ORCHID),
Map.entry("darkred", DARK_RED),
Map.entry("darksalmon", DARK_SALMON),
Map.entry("darkseagreen", DARK_SEAGREEN),
Map.entry("darkslateblue", DARK_SLATE_BLUE),
Map.entry("darkslategray", DARK_SLATE_GRAY),
Map.entry("darkslategrey", DARK_SLATE_GREY),
Map.entry("darkturquoise", DARK_TURQUOISE),
Map.entry("darkviolet", DARK_VIOLET),
Map.entry("deeppink", DEEP_PINK),
Map.entry("deepskyblue", DEEP_SKY_BLUE),
Map.entry("dimgray", DIM_GRAY),
Map.entry("dimgrey", DIM_GREY),
Map.entry("dodgerblue", DODGER_BLUE),
Map.entry("firebrick", FIRE_BRICK),
Map.entry("floralwhite", FLORAL_WHITE),
Map.entry("forestgreen", FOREST_GREEN),
Map.entry("fuchsia", FUCHSIA),
Map.entry("gainsboro", GAINSBORO),
Map.entry("ghostwhite", GHOST_WHITE),
Map.entry("gold", GOLD),
Map.entry("goldenrod", GOLDEN_ROD),
Map.entry("gray", GRAY),
Map.entry("grey", GREY),
Map.entry("green", GREEN),
Map.entry("greenyellow", GREEN_YELLOW),
Map.entry("honeydew", HONEY_DEW),
Map.entry("hotpink", HOT_PINK),
Map.entry("indianred", INDIAN_RED),
Map.entry("indigo", INDIGO),
Map.entry("ivory", IVORY),
Map.entry("khaki", KHAKI),
Map.entry("lavender", LAVENDER),
Map.entry("lavenderblush", LAVENDER_BLUSH),
Map.entry("lawngreen", LAWN_GREEN),
Map.entry("lemonchiffon", LEMON_CHIFFON),
Map.entry("lightblue", LIGHT_BLUE),
Map.entry("lightcoral", LIGHT_CORAL),
Map.entry("lightcyan", LIGHT_CYAN),
Map.entry("lightgoldenrodyellow", LIGHT_GOLDEN_ROD_YELLOW),
Map.entry("lightgray", LIGHT_GRAY),
Map.entry("lightgrey", LIGHT_GREY),
Map.entry("lightgreen", LIGHT_GREEN),
Map.entry("lightpink", LIGHT_PINK),
Map.entry("lightsalmon", LIGHT_SALMON),
Map.entry("lightseagreen", LIGHT_SEA_GREEN),
Map.entry("lightskyblue", LIGHT_SKY_BLUE),
Map.entry("lightslategray", LIGHT_SLATE_GRAY),
Map.entry("lightslategrey", LIGHT_SLATE_GREY),
Map.entry("lightsteelblue", LIGHT_STEEL_BLUE),
Map.entry("lightyellow", LIGHT_YELLOW),
Map.entry("lime", LIME),
Map.entry("limegreen", LIME_GREEN),
Map.entry("linen", LINEN),
Map.entry("magenta", MAGENTA),
Map.entry("maroon", MAROON),
Map.entry("mediumaquamarine", MEDIUM_AQUA_MARINE),
Map.entry("mediumblue", MEDIUM_BLUE),
Map.entry("mediumorchid", MEDIUM_ORCHID),
Map.entry("mediumpurple", MEDIUM_PURPLE),
Map.entry("mediumseagreen", MEDIUM_SEA_GREEN),
Map.entry("mediumslateblue", MEDIUM_SLATE_BLUE),
Map.entry("mediumspringgreen", MEDIUM_SPRING_GREEN),
Map.entry("mediumturquoise", MEDIUM_TURQUOISE),
Map.entry("mediumvioletred", MEDIUM_VIOLET_RED),
Map.entry("midnightblue", MIDNIGHT_BLUE),
Map.entry("mintcream", MINT_CREAM),
Map.entry("mistyrose", MISTY_ROSE),
Map.entry("moccasin", MOCCASIN),
Map.entry("navajowhite", NAVAJO_WHITE),
Map.entry("navy", NAVY),
Map.entry("oldlace", OLDLACE),
Map.entry("olive", OLIVE),
Map.entry("olivedrab", OLIVE_DRAB),
Map.entry("orange", ORANGE),
Map.entry("orangered", ORANGE_RED),
Map.entry("orchid", ORCHID),
Map.entry("palegoldenrod", PALE_GOLDEN_ROD),
Map.entry("palegreen", PALE_GREEN),
Map.entry("paleturquoise", PALE_TURQUOISE),
Map.entry("palevioletred", PALE_VIOLET_RED),
Map.entry("papayawhip", PAPAYA_WHIP),
Map.entry("peachpuff", PEACH_PUFF),
Map.entry("peru", PERU),
Map.entry("pink", PINK),
Map.entry("plum", PLUM),
Map.entry("powderblue", POWDER_BLUE),
Map.entry("purple", PURPLE),
Map.entry("red", RED),
Map.entry("rosybrown", ROSY_BROWN),
Map.entry("royalblue", ROYAL_BLUE),
Map.entry("saddlebrown", SADDLE_BROWN),
Map.entry("salmon", SALMON),
Map.entry("sandybrown", SANDY_BROWN),
Map.entry("seagreen", SEA_GREEN),
Map.entry("seashell", SEA_SHELL),
Map.entry("sienna", SIENNA),
Map.entry("silver", SILVER),
Map.entry("skyblue", SKY_BLUE),
Map.entry("slateblue", SLATE_BLUE),
Map.entry("slategray", SLATE_GRAY),
Map.entry("slategrey", SLATE_GREY),
Map.entry("snow", SNOW),
Map.entry("springgreen", SPRING_GREEN),
Map.entry("steelblue", STEEL_BLUE),
Map.entry("tan", TAN),
Map.entry("teal", TEAL),
Map.entry("thistle", THISTLE),
Map.entry("tomato", TOMATO),
Map.entry("turquoise", TURQUOISE),
Map.entry("violet", VIOLET),
Map.entry("wheat", WHEAT),
Map.entry("white", WHITE),
Map.entry("whitesmoke", WHITE_SMOKE),
Map.entry("yellow", YELLOW),
Map.entry("yellowgreen", YELLOW_GREEN)
//@formatter:on
);
public static Color get(final String name) {
return NAMED_COLORS.get(name.toLowerCase());
}
public static Color valueOf(final String colorBase) throws Exception {
// remove all white space...
String color = colorBase.replace(" \r\n\t\\(\\)", "");
if (color.isEmpty() == true) {
return new Color(0, 0, 0, 1.0f);
}
final Color named = get(colorBase);
if (named != null) {
return named.clone();
} else if (color.charAt(0) == '#') {
// MODEL: #RGB
// #RGBA
// #RRGGBB
// #RRGGBBAA
switch (color.length()) {
case 4: {
final float r = Integer.parseInt(color.substring(1, 2), 16) * 255.0f * 16.0f;
final float g = Integer.parseInt(color.substring(2, 3), 16) * 255.0f * 16.0f;
final float b = Integer.parseInt(color.substring(3, 4), 16) * 255.0f * 16.0f;
return new Color(r, g, b);
}
case 5: {
final float r = Integer.parseInt(color.substring(1, 2), 16) * 255.0f * 16.0f;
final float g = Integer.parseInt(color.substring(2, 3), 16) * 255.0f * 16.0f;
final float b = Integer.parseInt(color.substring(3, 4), 16) * 255.0f * 16.0f;
final float a = Integer.parseInt(color.substring(4, 5), 16) * 255.0f * 16.0f;
return new Color(r, g, b, a);
}
case 7: {
final float r = Integer.parseInt(color.substring(1, 3), 16) * 255.0f;
final float g = Integer.parseInt(color.substring(3, 5), 16) * 255.0f;
final float b = Integer.parseInt(color.substring(5, 7), 16) * 255.0f;
return new Color(r, g, b);
}
case 9: {
final float r = Integer.parseInt(color.substring(1, 3), 16) * 255.0f;
final float g = Integer.parseInt(color.substring(3, 5), 16) * 255.0f;
final float b = Integer.parseInt(color.substring(5, 7), 16) * 255.0f;
final float a = Integer.parseInt(color.substring(7, 9), 16) * 255.0f;
return new Color(r, g, b, a);
}
default:
throw new Exception("Can not parse color ... '" + colorBase + "'");
}
} else {
// Model: r.r,g.g,b.b
// r.r,g.g,b.b,a.a
// (r.r,g.g,b.b)
// (r.r,g.g,b.b,a.a)
// rgb(r.r,g.g,b.b)
// rgba(r.r,g.g,b.b,a.a)
// argb(a.a,r.r,g.g,b.b)
if (color.startsWith("argb") == true) {
color = color.replace("argb", "");
final String[] vals = color.split(",");
if (vals.length == 4) {
final float a = FMath.avg(0.0f, Float.parseFloat(vals[0]), 1.0f);
final float r = FMath.avg(0.0f, Float.parseFloat(vals[1]), 1.0f);
final float g = FMath.avg(0.0f, Float.parseFloat(vals[2]), 1.0f);
final float b = FMath.avg(0.0f, Float.parseFloat(vals[3]), 1.0f);
return new Color(r, g, b, a);
} else {
throw new Exception("Can not parse color ... '" + colorBase + "'");
}
}
color = color.replace("rgb", "");
color = color.replace("rgba", "");
final String[] vals = color.split(",");
if (vals.length == 3) {
final float r = FMath.avg(0.0f, Float.parseFloat(vals[0]), 1.0f);
final float g = FMath.avg(0.0f, Float.parseFloat(vals[1]), 1.0f);
final float b = FMath.avg(0.0f, Float.parseFloat(vals[2]), 1.0f);
return new Color(r, g, b);
} else if (vals.length == 4) {
final float r = FMath.avg(0.0f, Float.parseFloat(vals[0]), 1.0f);
final float g = FMath.avg(0.0f, Float.parseFloat(vals[1]), 1.0f);
final float b = FMath.avg(0.0f, Float.parseFloat(vals[2]), 1.0f);
final float a = FMath.avg(0.0f, Float.parseFloat(vals[3]), 1.0f);
return new Color(r, g, b, a);
} else {
throw new Exception("Can not parse color ... '" + colorBase + "'");
}
}
}
public float r;
public float g;
public float b;
public float a;
public Color(float r, float g, float b, float a) {
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
public Color(float r, float g, float b) {
public Color(final float r, final float g, final float b) {
super();
this.r = r;
this.g = g;
this.b = b;
this.a = 1.0f;
}
public Color(final float r, final float g, final float b, final float a) {
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
@Override
public Color clone() {
return new Color(this.r, this.g, this.b, this.a);
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Color)) {
return false;
}
final Color other = (Color) obj;
return other.r == this.r && other.g == this.g && other.b == this.b && other.a == this.a;
}
@Override
public String toString() {
return "rgba(" + this.r + ", " + this.g + ", " + this.b + ", " + this.a + ")";
}
}

View File

@ -1,39 +1,197 @@
package org.atriasoft.etk;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.atriasoft.etk.internal.Log;
public class Uri {
private static Map<String, String> genericMap = new HashMap<String, String>();
private static Map<String, String> genericMap = new HashMap<>();
private static Map<String, Class<?>> libraries = new HashMap<>();
private static Class<?> applicationClass = null;
public static void setGroup(String groupName, String basePath) {
static {
genericMap.put("DATA", "");
genericMap.put("THEME_GUI", "theme/");
}
public static void addLibrary(final String libName, final Class<?> classHandle) {
libraries.put(libName.toLowerCase(), classHandle);
}
public static byte[] getAllData(final Uri resourceName) {
final InputStream out = getStream(resourceName);
if (out == null) {
return null;
}
byte[] data = null;
try {
data = out.readAllBytes();
} catch (final IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
/*
public static Stream<Path> getResources(final URL element) {
try {
final URI uri = element.toURI();
FileSystem fs;
Path path;
if (uri.getScheme().contentEquals("jar")) {
try {
fs = FileSystems.getFileSystem(uri);
} catch (final FileSystemNotFoundException e) {
fs = FileSystems.newFileSystem(uri, Collections.<String, String> emptyMap());
}
String pathInJar = "/";
final String tmpPath = element.getPath();
final int idSeparate = tmpPath.indexOf('!');
if (idSeparate != -1) {
pathInJar = tmpPath.substring(idSeparate + 1);
while (pathInJar.startsWith("/")) {
pathInJar = pathInJar.substring(1);
}
}
path = fs.getPath(pathInJar);
} else {
fs = FileSystems.getDefault();
path = Paths.get(uri);
}
return Files.walk(path, 1);
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
return Stream.of();
}
}
*/
public static InputStream getStream(final Uri resourceName) {
Log.verbose("Load resource: " + resourceName);
String offset = "";
if (resourceName.group != null) {
final String ret = genericMap.get(resourceName.group);
if (ret != null) {
offset = ret;
}
}
InputStream out = null;
if (applicationClass == null) {
Log.warning("Application data class is not defined ...");
} else {
out = applicationClass.getResourceAsStream("/data/" + offset + resourceName.path);
}
if (out != null) {
// search in the libraries ...
if (resourceName.lib == null) {
return null;
} else {
final Class<?> libClass = libraries.get(resourceName.lib);
if (libClass == null) {
return null;
}
out = libClass.getResourceAsStream("/data/" + offset + resourceName.path);
}
}
if (out == null) {
Log.error("Can not load resource: '" + resourceName + "'");
}
return out;
}
public static List<Uri> listRecursive(final Uri uri) {
final List<Uri> out = new ArrayList<>();
return out;
}
public static void setApplication(final Class<?> classHandle) {
applicationClass = classHandle;
}
public static void setGroup(final String groupName, final String basePath) {
genericMap.put(groupName.toUpperCase(), basePath);
}
private final String value;
private final String group;
private final String path;
private final String lib;
// Format : DATA:jlfqkjsdflkjqs/sqldkhjflqksdjf/lll.png?lib=ewol
public Uri(String value) {
this.value = value;
if (value.contains(":") == true) {
final String[] ret = value.split(":", 2);
this.group = ret[0].toUpperCase();
;
value = ret[1];
} else {
this.group = "DATA";
}
if (value.contains("?lib=") == true) {
final String[] ret = value.split("?lib=", 2);
this.path = ret[0];
this.lib = ret[1].toLowerCase();
} else {
this.path = value;
this.lib = null;
}
}
public Uri(String group, String path) {
this.value = group.toUpperCase() + ":" + path;
}
public String getValue() {
return value;
public Uri(final String group, final String path) {
this(group, path, null);
}
public String getPath() {
String[] ret = value.split(":",2);
return genericMap.get(ret[0]) + "/" + ret[1];
public Uri(final String group, final String path, final String lib) {
if (group == null) {
this.group = null;
} else {
this.group = group.toUpperCase();
}
this.path = path;
if (lib == null) {
this.lib = null;
} else {
this.lib = lib.toLowerCase();
}
}
public String get() {
return getPath();
}
@Override
public String toString() {
return "Uri [value=" + value + "]";
public String getExtention() {
final String[] ret = this.path.split(".");
return ret[ret.length - 1];
}
public String getPath() {
return this.path;
}
public String getValue() {
return toString();
}
public boolean isEmpty() {
return this.path == null || this.path.isEmpty();
}
@Override
public String toString() {
String out = "";
if (this.group != null) {
out += this.group + ":";
}
out += this.path;
if (this.lib != null) {
out += "?lib=" + this.lib;
}
return out;
}
}

View File

@ -3,7 +3,7 @@ package org.atriasoft.etk.internal;
import io.scenarium.logger.LogLevel;
import io.scenarium.logger.Logger;
class Log {
public class Log {
private static final String LIB_NAME = "etk";
private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME);
private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL);
@ -14,47 +14,55 @@ class Log {
private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE);
private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO);
private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT);
private Log() {}
public static void print(String data) {
if (PRINT_PRINT)
Logger.print(LIB_NAME_DRAW, data);
}
public static void todo(String data) {
if (PRINT_TODO)
Logger.todo(LIB_NAME_DRAW, data);
}
public static void critical(String data) {
if (PRINT_CRITICAL)
public static void critical(final String data) {
if (PRINT_CRITICAL) {
Logger.critical(LIB_NAME_DRAW, data);
}
}
public static void error(String data) {
if (PRINT_ERROR)
Logger.error(LIB_NAME_DRAW, data);
}
public static void warning(String data) {
if (PRINT_WARNING)
Logger.warning(LIB_NAME_DRAW, data);
}
public static void info(String data) {
if (PRINT_INFO)
Logger.info(LIB_NAME_DRAW, data);
}
public static void debug(String data) {
if (PRINT_DEBUG)
public static void debug(final String data) {
if (PRINT_DEBUG) {
Logger.debug(LIB_NAME_DRAW, data);
}
}
public static void verbose(String data) {
if (PRINT_VERBOSE)
public static void error(final String data) {
if (PRINT_ERROR) {
Logger.error(LIB_NAME_DRAW, data);
}
}
public static void info(final String data) {
if (PRINT_INFO) {
Logger.info(LIB_NAME_DRAW, data);
}
}
public static void print(final String data) {
if (PRINT_PRINT) {
Logger.print(LIB_NAME_DRAW, data);
}
}
public static void todo(final String data) {
if (PRINT_TODO) {
Logger.todo(LIB_NAME_DRAW, data);
}
}
public static void verbose(final String data) {
if (PRINT_VERBOSE) {
Logger.verbose(LIB_NAME_DRAW, data);
}
}
public static void warning(final String data) {
if (PRINT_WARNING) {
Logger.warning(LIB_NAME_DRAW, data);
}
}
private Log() {}
}

View File

@ -5,6 +5,8 @@ public class Constant {
private Constant() {
}
// Machine epsilon
public static final float FLOAT_EPSILON = 0.0000001192f;
// Machine epsilon
public static final float MACHINE_EPSILON = 0.000001f;
// Pi constant

View File

@ -1,5 +1,7 @@
package org.atriasoft.etk.math;
import java.text.DecimalFormat;
public class FMath {
public static float abs(final float a) {
if (a < 0.0f) {
@ -15,7 +17,7 @@ public class FMath {
* @return true if it is in the range
*/
public static boolean approxEqual(final float a, final float b) {
return approxEqual(a, b, Constant.MACHINE_EPSILON);
return approxEqual(a, b, Constant.FLOAT_EPSILON);
}
/**
@ -57,6 +59,10 @@ public class FMath {
return FMath.min(FMath.max(value, lowerLimit), upperLimit);
}
public static String floatToString(final float value) {
return new DecimalFormat("#0.0000000000").format(value);
}
// TODO check this basic function ...
public static int floor(final float f) {
return (int) Math.floor(f);

View File

@ -192,6 +192,23 @@ public class Matrix3f {
+ this.mat[2] * (this.mat[3] * this.mat[7] - this.mat[6] * this.mat[4]);
}
/**
* @brief devide a value
* @param value value to devide all the matrix
*/
public Matrix3f devide(final float value) {
this.mat[0] /= value;
this.mat[1] /= value;
this.mat[2] /= value;
this.mat[3] /= value;
this.mat[4] /= value;
this.mat[5] /= value;
this.mat[6] /= value;
this.mat[7] /= value;
this.mat[8] /= value;
return this;
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
@ -280,11 +297,10 @@ public class Matrix3f {
public Matrix3f inverse() {
final float det = determinant();
//assert(Math.abs(det) > MACHINEEPSILON);
final float invDet = 1.0f / det;
this.set((this.mat[4] * this.mat[8] - this.mat[7] * this.mat[5]), -(this.mat[1] * this.mat[8] - this.mat[7] * this.mat[2]), (this.mat[1] * this.mat[5] - this.mat[2] * this.mat[4]),
-(this.mat[3] * this.mat[8] - this.mat[6] * this.mat[5]), (this.mat[0] * this.mat[8] - this.mat[6] * this.mat[2]), -(this.mat[0] * this.mat[5] - this.mat[3] * this.mat[2]),
(this.mat[3] * this.mat[7] - this.mat[6] * this.mat[4]), -(this.mat[0] * this.mat[7] - this.mat[6] * this.mat[1]), (this.mat[0] * this.mat[4] - this.mat[1] * this.mat[3]));
this.multiply(invDet);
devide(det);
return this;
}
@ -538,8 +554,9 @@ public class Matrix3f {
@Override
public String toString() {
return "Matrix3f(" + this.mat[0] + "," + this.mat[1] + "," + this.mat[2] + "," + this.mat[3] + "," + this.mat[4] + "," + this.mat[5] + "," + this.mat[6] + "," + this.mat[7] + "," + this.mat[8]
+ ")";
return "Matrix3f(" + FMath.floatToString(this.mat[0]) + "," + FMath.floatToString(this.mat[1]) + "," + FMath.floatToString(this.mat[2]) + "," + FMath.floatToString(this.mat[3]) + ","
+ FMath.floatToString(this.mat[4]) + "," + FMath.floatToString(this.mat[5]) + "," + FMath.floatToString(this.mat[6]) + "," + FMath.floatToString(this.mat[7]) + ","
+ FMath.floatToString(this.mat[8]) + ")";
}
/**

View File

@ -349,23 +349,22 @@ public class Matrix4f {
return clone();
}
final Matrix4f temp = new Matrix4f();
final float iDet = 1.0f / det;
temp.mat[0] = coFactor(0, 0) * iDet;
temp.mat[1] = coFactor(0, 1) * iDet;
temp.mat[2] = coFactor(0, 2) * iDet;
temp.mat[3] = coFactor(0, 3) * iDet;
temp.mat[4] = coFactor(1, 0) * iDet;
temp.mat[5] = coFactor(1, 1) * iDet;
temp.mat[6] = coFactor(1, 2) * iDet;
temp.mat[7] = coFactor(1, 3) * iDet;
temp.mat[8] = coFactor(2, 0) * iDet;
temp.mat[9] = coFactor(2, 1) * iDet;
temp.mat[10] = coFactor(2, 2) * iDet;
temp.mat[11] = coFactor(2, 3) * iDet;
temp.mat[12] = coFactor(3, 0) * iDet;
temp.mat[13] = coFactor(3, 1) * iDet;
temp.mat[14] = coFactor(3, 2) * iDet;
temp.mat[15] = coFactor(3, 3) * iDet;
temp.mat[0] = coFactor(0, 0) / det;
temp.mat[1] = coFactor(0, 1) / det;
temp.mat[2] = coFactor(0, 2) / det;
temp.mat[3] = coFactor(0, 3) / det;
temp.mat[4] = coFactor(1, 0) / det;
temp.mat[5] = coFactor(1, 1) / det;
temp.mat[6] = coFactor(1, 2) / det;
temp.mat[7] = coFactor(1, 3) / det;
temp.mat[8] = coFactor(2, 0) / det;
temp.mat[9] = coFactor(2, 1) / det;
temp.mat[10] = coFactor(2, 2) / det;
temp.mat[11] = coFactor(2, 3) / det;
temp.mat[12] = coFactor(3, 0) / det;
temp.mat[13] = coFactor(3, 1) / det;
temp.mat[14] = coFactor(3, 2) / det;
temp.mat[15] = coFactor(3, 3) / det;
return temp;
}

View File

@ -515,11 +515,19 @@ public class Quaternion {
this.w = 1.0f;
return this;
}
final float invLength = 1.0f / lengthTmp;
this.x *= invLength;
this.y *= invLength;
this.z *= invLength;
this.w *= invLength;
final double invLength = 1.0 / lengthTmp;
this.x = (float) (this.x * invLength);
this.y = (float) (this.y * invLength);
this.z = (float) (this.z * invLength);
this.w = (float) (this.w * invLength);
/*
this.x /= lengthTmp;
this.y /= lengthTmp;
this.z /= lengthTmp;
this.w /= lengthTmp;
*/
return this;
}
@ -705,6 +713,6 @@ public class Quaternion {
@Override
public String toString() {
return "Quaternion(" + this.x + "," + this.y + "," + this.z + "," + this.w + ")";
return "Quaternion(" + FMath.floatToString(this.x) + "," + FMath.floatToString(this.y) + "," + FMath.floatToString(this.z) + "," + FMath.floatToString(this.w) + ")";
}
}

View File

@ -0,0 +1,174 @@
package org.atriasoft.etk.math;
import org.atriasoft.etk.internal.Log;
public class Vector2b {
public static Vector2b valueOf(String value) {
boolean val1 = false;
boolean val2 = false;
// copy to permit to modify it :
while (value.length() > 0 && value.charAt(0) == '(') {
value = value.substring(1);
}
while (value.length() > 0 && value.charAt(0) == ')') {
value = value.substring(0, value.length() - 1);
}
final String[] values = value.split(",");
if (values.length > 2) {
Log.error("Can not parse Vector2f with more than 2 values: '" + value + "'");
}
if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Boolean.valueOf(values[0]);
val2 = val1;
} else {
val1 = Boolean.valueOf(values[0]);
val2 = Boolean.valueOf(values[1]);
}
return new Vector2b(val1, val2);
}
public boolean x = false;
public boolean y = false;
/* ****************************************************
* Constructor
*****************************************************/
public Vector2b() {
this.x = false;
this.y = false;
}
/**
* @brief Constructor from scalars
* @param xxx X value
* @param yyy Y value
*/
public Vector2b(final boolean xxx, final boolean yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Constructor with external vector
* @param obj The vector to add to this one
*/
public Vector2b(final Vector2b obj) {
this.x = obj.x;
this.y = obj.y;
}
@Override
public Vector2b clone() {
return new Vector2b(this.x, this.y);
}
/**
* @brief Get X value
* @return the x value
*/
public boolean getX() {
return this.x;
}
/**
* @brief Get Y value
* @return the y value
*/
public boolean getY() {
return this.y;
}
/**
* @brief In-Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are NOT identical
* @return false The Objects are identical
*/
public boolean isDifferent(final Vector2b obj) {
return (obj.x != this.x || obj.y != this.y);
}
/**
* @brief Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are identical
* @return false The Objects are NOT identical
*/
public boolean isEqual(final Vector2b obj) {
return (obj.x == this.x && obj.y == this.y);
}
/**
* @brief Operator= Asign the current object with a value
* @param val Value to assign on the object
*/
public void set(final boolean val) {
this.x = val;
this.y = val;
};
/**
* @brief Operator= Asign the current object with a value
* @param xxx X value
* @param yyy Y value
*/
public void set(final boolean xxx, final boolean yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Operator= Asign the current object with an other object
* @param obj Reference on the external object
*/
public void set(final Vector2b obj) {
this.x = obj.x;
this.y = obj.y;
}
public void setFalse() {
this.x = false;
this.y = false;
}
/**
* @brief Set 0 value on all the vector
*/
public void setTrue() {
this.x = true;
this.y = true;
}
/**
* @brief Set Value on the vector
* @param xxx X value.
* @param yyy Y value.
*/
public void setValue(final boolean xxx, final boolean yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Set the x value
* @param xxx New value
*/
public void setX(final boolean xxx) {
this.x = xxx;
}
/**
* @brief Set the y value
* @param yyy New value
*/
public void setY(final boolean yyy) {
this.y = yyy;
}
@Override
public String toString() {
return "(" + this.x + "," + this.y + ")";
}
}

View File

@ -1,11 +1,40 @@
package org.atriasoft.etk.math;
import org.atriasoft.etk.internal.Log;
public class Vector2f {
public static Vector2f valueOf(String value) {
float val1 = 0;
float val2 = 0;
// copy to permit to modify it :
while (value.length() > 0 && value.charAt(0) == '(') {
value = value.substring(1);
}
while (value.length() > 0 && value.charAt(0) == ')') {
value = value.substring(0, value.length() - 1);
}
final String[] values = value.split(",");
if (values.length > 2) {
Log.error("Can not parse Vector2f with more than 2 values: '" + value + "'");
}
if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Float.valueOf(values[0]);
val2 = val1;
} else {
val1 = Float.valueOf(values[0]);
val2 = Float.valueOf(values[1]);
}
return new Vector2f(val1, val2);
}
public static Vector2f zero() {
return new Vector2f(0, 0);
}
public float x = 0;
public float y = 0;
/* ****************************************************
@ -69,6 +98,14 @@ public class Vector2f {
return this;
}
public Vector2f addNew(final float val) {
return new Vector2f(this.x + val, this.y + val);
}
public Vector2f addNew(final Vector2f obj) {
return new Vector2f(this.x + obj.x, this.y + obj.y);
}
@Override
public Vector2f clone() {
return new Vector2f(this);
@ -120,6 +157,14 @@ public class Vector2f {
return this;
}
public Vector2f devideNew(final float val) {
return new Vector2f(this.x / val, this.y / val);
}
public Vector2f devideNew(final Vector2f obj) {
return new Vector2f(this.x / obj.x, this.y / obj.y);
}
/**
* @brief Return the distance between the ends of this and another vector
* This is semantically treating the vector like a point
@ -163,10 +208,10 @@ public class Vector2f {
// cast object
final Vector2f other = (Vector2f) obj;
// checks values
if (Float.floatToIntBits(this.x) != Float.floatToIntBits(other.x)) {
if (this.x != other.x) {
return false;
}
return Float.floatToIntBits(this.y) == Float.floatToIntBits(other.y);
return this.y == other.y;
}
/**
@ -320,6 +365,14 @@ public class Vector2f {
return this;
}
public Vector2f lessNew(final float val) {
return new Vector2f(this.x - val, this.y - val);
}
public Vector2f lessNew(final Vector2f obj) {
return new Vector2f(this.x - obj.x, this.y - obj.y);
}
/**
* @brief Return the axis with the largest value
* @return values are 0,1 for x or y
@ -354,19 +407,23 @@ public class Vector2f {
this.x *= obj.x;
this.y *= obj.y;
return this;
}
};
public Vector2f multiplyNew(final float val) {
return new Vector2f(this.x * val, this.y * val);
};
public Vector2f multiplyNew(final Vector2f obj) {
return new Vector2f(this.x * obj.x, this.y * obj.y);
};
/**
* @brief Normalize this vector x^2 + y^2 = 1
*/
public Vector2f normalize() {
this.devide(length());
return this;
};
}
/**
* @brief Return a normalized version of this vector
@ -489,7 +546,7 @@ public class Vector2f {
@Override
public String toString() {
return "Vector2f(" + this.x + "," + this.y + ")";
return "(" + this.x + "," + this.y + ")";
}
}

View File

@ -1,8 +1,37 @@
package org.atriasoft.etk.math;
import org.atriasoft.etk.internal.Log;
public class Vector2i {
public static Vector2i valueOf(String value) {
int val1 = 0;
int val2 = 0;
// copy to permit to modify it :
while (value.length() > 0 && value.charAt(0) == '(') {
value = value.substring(1);
}
while (value.length() > 0 && value.charAt(0) == ')') {
value = value.substring(0, value.length() - 1);
}
final String[] values = value.split(",");
if (values.length > 2) {
Log.error("Can not parse Vector2f with more than 2 values: '" + value + "'");
}
if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Integer.valueOf(values[0]);
val2 = val1;
} else {
val1 = Integer.valueOf(values[0]);
val2 = Integer.valueOf(values[1]);
}
return new Vector2i(val1, val2);
}
public int x = 0;
public int y = 0;
/* ****************************************************
* Constructor
*****************************************************/
@ -10,271 +39,67 @@ public class Vector2i {
this.x = 0;
this.y = 0;
}
/**
* @brief Constructor from scalars
* @param xxx X value
* @param yyy Y value
*/
public Vector2i(int xxx, int yyy) {
public Vector2i(final int xxx, final int yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Constructor with external vector
* @param obj The vector to add to this one
*/
public Vector2i(Vector2i obj) {
public Vector2i(final Vector2i obj) {
this.x = obj.x;
this.y = obj.y;
}
/**
* @brief Operator= Asign the current object with an other object
* @param obj Reference on the external object
*/
public void set(Vector2i obj) {
this.x = obj.x;
this.y = obj.y;
}
/**
* @brief Operator= Asign the current object with a value
* @param val Value to assign on the object
*/
public void set(int val) {
this.x = val;
this.y = val;
}
/**
* @brief Operator= Asign the current object with a value
* @param xxx X value
* @param yyy Y value
*/
public void set(int xxx, int yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are identical
* @return false The Objects are NOT identical
*/
public boolean isEqual(Vector2i obj) {
return ( obj.x == this.x
&& obj.y == this.y);
}
/**
* @brief In-Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are NOT identical
* @return false The Objects are identical
*/
public boolean isDifferent(Vector2i obj) {
return ( obj.x != this.x
|| obj.y != this.y);
}
public boolean isLowerOrEqual(Vector2i obj) {
return ( this.x <= obj.x
&& this.y <= obj.y);
}
public boolean isLower(Vector2i obj) {
return ( this.x < obj.x
&& this.y < obj.y);
}
public boolean isGreaterOrEqual(Vector2i obj) {
return ( this.x >= obj.x
&& this.y >= obj.y);
}
public boolean isGreater(Vector2i obj) {
return ( this.x > obj.x
&& this.y > obj.y);
}
/**
* @brief Operator+= Addition an other vertor with this one
* @param obj Reference on the external object
*/
void add(Vector2i obj) {
this.x += obj.x;
this.y += obj.y;
}
/**
* @brief Operator+= Addition an other vertor with this one
* @param val Value to addition at x/y
*/
public void add(int val) {
this.x += val;
this.y += val;
}
/**
* @brief Operator-= Decrement an other vertor with this one
* @param obj Reference on the external object
*/
public void less(Vector2i obj) {
this.x -= obj.x;
this.y -= obj.y;
}
/**
* @brief Operator-= Decrement an other vertor with this one
* @param val Value to addition at x/y
*/
public void less(int val) {
this.x -= val;
this.y -= val;
}
/**
* @brief Operator*= Multiplication an other vertor with this one
* @param obj Reference on the external object
*/
public void multiply(Vector2i obj) {
this.x *= obj.x;
this.y *= obj.y;
}
/**
* @brief Operator*= Multiplication an other vertor with this one
* @param val Value to addition at x/y
*/
public void multiply(int val) {
this.x *= val;
this.y *= val;
}
/**
* @brief Operator/ Dividing an other vertor with this one
* @param obj Reference on the external object
*/
public void devide(Vector2i obj) {
this.x /= obj.x;
this.y /= obj.y;
}
/**
* @brief Operator/ Dividing an other vertor with this one
* @param val Value to addition at x/y
*/
public void devide(int val) {
this.x /= val;
this.y /= val;
}
/**
* @brief Incrementation of this vector (+1 of 2 elements)
*/
public void increment() {
this.x++;
this.y++;
}
/**
* @brief Decrementation of this vector (-1 of 2 elements)
*/
public void decrement() {
this.x--;
this.y--;
}
/**
* @brief Return the cross product / determinant
* @param obj The other vector in the cross product
* @return cross product value
*/
public int cross(Vector2i obj) {
return this.x * obj.y
- this.y * obj.x;
}
/**
* @brief Return the dot product
* @param obj The other vector in the dot product
* @return Dot product value
*/
public int dot(Vector2i obj) {
return this.x * obj.x
+ this.y * obj.y;
}
/**
* @brief Get the length of the vector squared
* @return Squared length value.
*/
public int length2() {
return dot(this);
}
/**
* @brief Get the length of the vector
* @return Length value
*/
public int length() {
return (int) Math.sqrt(length2());
}
/**
* @brief Return the distance squared between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the square distance of the 2 points
*/
public int distance2(Vector2i obj) {
int deltaX = obj.x - this.x;
int deltaY = obj.y - this.y;
return deltaX*deltaX + deltaY*deltaY;
}
/**
* @brief Return the distance between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the distance of the 2 points
*/
public int distance(Vector2i obj) {
return (int)Math.sqrt(this.distance2(obj));
}
/**
* @brief Normalize this vector x^2 + y^2 = 1
*/
public void normalize() {
this.devide(length());
}
/**
* @brief Normalize this vector x^2 + y^2 = 1 (check if not deviding by 0, if it is the case ==> return (1,0))
* @return Local reference of the vector normalized
*/
public void safeNormalize() {
int tmp = length();
if (tmp != 0) {
this.devide(length());
return;
}
setValue(1,0);
return;
}
/**
* @brief Return a normalized version of this vector
* @return New vector containing the value
*/
public Vector2i normalized() {
Vector2i tmp = this.clone();
tmp.normalize();
return tmp;
}
/**
* @brief Return a vector will the absolute values of each element
* @return New vector containing the value
*/
public Vector2i absolute() {
return new Vector2i( Math.abs(this.x),
Math.abs(this.y));
return new Vector2i(Math.abs(this.x), Math.abs(this.y));
}
/**
* @brief Return the axis with the smallest value
* @return values are 0,1 for x or y
* @brief Operator+= Addition an other vertor with this one
* @param val Value to addition at x/y
*/
public int minAxis() {
return this.x < this.y ? 0 : 1;
public Vector2i add(final int val) {
this.x += val;
this.y += val;
return this;
}
/**
* @brief Return the axis with the largest value
* @return values are 0,1 for x or y
* @brief Operator+= Addition an other vertor with this one
* @param obj Reference on the external object
*/
public int maxAxis() {
return this.x < this.y ? 1 : 0;
public Vector2i add(final Vector2i obj) {
this.x += obj.x;
this.y += obj.y;
return this;
}
/**
* @brief Return the axis with the smallest ABSOLUTE value
* @return values 0,1 for x, or z
*/
public int furthestAxis() {
return absolute().minAxis();
public Vector2i addNew(final int val) {
return new Vector2i(this.x + val, this.y + val);
}
public Vector2i addNew(final Vector2i obj) {
return new Vector2i(this.x + obj.x, this.y + obj.y);
}
@Override
public Vector2i clone() {
return new Vector2i(this);
}
/**
* @brief Return the axis with the largest ABSOLUTE value
* @return values 0,1 for x or y
@ -282,20 +107,89 @@ public class Vector2i {
public int closestAxis() {
return absolute().maxAxis();
}
/**
* @brief Set the x value
* @param xxx New value
* @brief Return the cross product / determinant
* @param obj The other vector in the cross product
* @return cross product value
*/
public void setX(int xxx) {
this.x = xxx;
};
public int cross(final Vector2i obj) {
return this.x * obj.y - this.y * obj.x;
}
/**
* @brief Set the y value
* @param yyy New value
* @brief Decrementation of this vector (-1 of 2 elements)
*/
public void setY(int yyy) {
this.y = yyy;
};
public void decrement() {
this.x--;
this.y--;
}
/**
* @brief Operator/ Dividing an other vertor with this one
* @param val Value to addition at x/y
*/
public void devide(final int val) {
this.x /= val;
this.y /= val;
}
/**
* @brief Operator/ Dividing an other vertor with this one
* @param obj Reference on the external object
*/
public void devide(final Vector2i obj) {
this.x /= obj.x;
this.y /= obj.y;
}
public Vector2i devideNew(final int val) {
return new Vector2i(this.x / val, this.y / val);
}
public Vector2i devideNew(final Vector2i obj) {
return new Vector2i(this.x / obj.x, this.y / obj.y);
}
/**
* @brief Return the distance between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the distance of the 2 points
*/
public int distance(final Vector2i obj) {
return (int) Math.sqrt(distance2(obj));
}
/**
* @brief Return the distance squared between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the square distance of the 2 points
*/
public int distance2(final Vector2i obj) {
final int deltaX = obj.x - this.x;
final int deltaY = obj.y - this.y;
return deltaX * deltaX + deltaY * deltaY;
}
/**
* @brief Return the dot product
* @param obj The other vector in the dot product
* @return Dot product value
*/
public int dot(final Vector2i obj) {
return this.x * obj.x + this.y * obj.y;
}
/**
* @brief Return the axis with the smallest ABSOLUTE value
* @return values 0,1 for x, or z
*/
public int furthestAxis() {
return absolute().minAxis();
}
/**
* @brief Get X value
* @return the x value
@ -303,6 +197,7 @@ public class Vector2i {
public int getX() {
return this.x;
}
/**
* @brief Get Y value
* @return the y value
@ -310,31 +205,257 @@ public class Vector2i {
public int getY() {
return this.y;
}
/**
* @brief Incrementation of this vector (+1 of 2 elements)
*/
public void increment() {
this.x++;
this.y++;
}
/**
* @brief In-Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are NOT identical
* @return false The Objects are identical
*/
public boolean isDifferent(final Vector2i obj) {
return (obj.x != this.x || obj.y != this.y);
}
/**
* @brief Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are identical
* @return false The Objects are NOT identical
*/
public boolean isEqual(final Vector2i obj) {
return (obj.x == this.x && obj.y == this.y);
}
public boolean isGreater(final Vector2i obj) {
return (this.x > obj.x && this.y > obj.y);
}
public boolean isGreaterOrEqual(final Vector2i obj) {
return (this.x >= obj.x && this.y >= obj.y);
}
public boolean isLower(final Vector2i obj) {
return (this.x < obj.x && this.y < obj.y);
}
public boolean isLowerOrEqual(final Vector2i obj) {
return (this.x <= obj.x && this.y <= obj.y);
}
/**
* @brief Check if the vector is equal to (0,0)
* @return true The value is equal to (0,0)
* @return false The value is NOT equal to (0,0)
*/
public boolean isZero() {
return this.x == 0 && this.y == 0;
}
/**
* @brief Get the length of the vector
* @return Length value
*/
public int length() {
return (int) Math.sqrt(length2());
}
/**
* @brief Get the length of the vector squared
* @return Squared length value.
*/
public int length2() {
return dot(this);
}
/**
* @brief Operator-= Decrement an other vertor with this one
* @param val Value to addition at x/y
*/
public void less(final int val) {
this.x -= val;
this.y -= val;
}
/**
* @brief Operator-= Decrement an other vertor with this one
* @param obj Reference on the external object
*/
public void less(final Vector2i obj) {
this.x -= obj.x;
this.y -= obj.y;
}
public Vector2i lessNew(final int val) {
return new Vector2i(this.x - val, this.y - val);
}
public Vector2i lessNew(final Vector2i obj) {
return new Vector2i(this.x - obj.x, this.y - obj.y);
}
/**
* @brief Return the axis with the largest value
* @return values are 0,1 for x or y
*/
public int maxAxis() {
return this.x < this.y ? 1 : 0;
}
/**
* @brief Return the axis with the smallest value
* @return values are 0,1 for x or y
*/
public int minAxis() {
return this.x < this.y ? 0 : 1;
}
/**
* @brief Operator*= Multiplication an other vertor with this one
* @param val Value to addition at x/y
*/
public void multiply(final int val) {
this.x *= val;
this.y *= val;
}
/**
* @brief Operator*= Multiplication an other vertor with this one
* @param obj Reference on the external object
*/
public void multiply(final Vector2i obj) {
this.x *= obj.x;
this.y *= obj.y;
}
public Vector2i multiplyNew(final int val) {
return new Vector2i(this.x * val, this.y * val);
}
public Vector2i multiplyNew(final Vector2i obj) {
return new Vector2i(this.x * obj.x, this.y * obj.y);
}
/**
* @brief Normalize this vector x^2 + y^2 = 1
*/
public void normalize() {
this.devide(length());
}
/**
* @brief Return a normalized version of this vector
* @return New vector containing the value
*/
public Vector2i normalized() {
final Vector2i tmp = clone();
tmp.normalize();
return tmp;
}
/**
* @brief Normalize this vector x^2 + y^2 = 1 (check if not deviding by 0, if it is the case ==> return (1,0))
* @return Local reference of the vector normalized
*/
public void safeNormalize() {
final int tmp = length();
if (tmp != 0) {
this.devide(length());
return;
}
setValue(1, 0);
return;
};
/**
* @brief Operator= Asign the current object with a value
* @param val Value to assign on the object
*/
public void set(final int val) {
this.x = val;
this.y = val;
};
/**
* @brief Operator= Asign the current object with a value
* @param xxx X value
* @param yyy Y value
*/
public void set(final int xxx, final int yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Operator= Asign the current object with an other object
* @param obj Reference on the external object
*/
public void set(final Vector2i obj) {
this.x = obj.x;
this.y = obj.y;
}
public void setMax(final int xxx, final int yyy) {
this.x = Math.max(this.x, xxx);
this.y = Math.max(this.y, yyy);
}
/**
* @brief Set each element to the max of the current values and the values of another vector
* @param other The other vector to compare with
*/
public void setMax(Vector2i other) {
public void setMax(final Vector2i other) {
this.x = Math.max(this.x, other.x);
this.y = Math.max(this.y, other.y);
}
public void setMin(final int xxx, final int yyy) {
this.x = Math.min(this.x, xxx);
this.y = Math.min(this.y, yyy);
}
/**
* @brief Set each element to the min of the current values and the values of another vector
* @param other The other vector to compare with
*/
public void setMin(Vector2i other) {
public void setMin(final Vector2i other) {
this.x = Math.min(this.x, other.x);
this.y = Math.min(this.y, other.y);
}
/**
* @brief Set Value on the vector
* @param xxx X value.
* @param yyy Y value.
*/
public void setValue(int xxx, int yyy) {
public void setValue(final int xxx, final int yyy) {
this.x = xxx;
this.y = yyy;
}
/**
* @brief Set the x value
* @param xxx New value
*/
public void setX(final int xxx) {
this.x = xxx;
}
/**
* @brief Set the y value
* @param yyy New value
*/
public void setY(final int yyy) {
this.y = yyy;
}
/**
* @brief Set 0 value on all the vector
*/
@ -342,19 +463,7 @@ public class Vector2i {
this.x = 0;
this.y = 0;
}
/**
* @brief Check if the vector is equal to (0,0)
* @return true The value is equal to (0,0)
* @return false The value is NOT equal to (0,0)
*/
public boolean isZero() {
return this.x == 0
&& this.y == 0;
}
public Vector2i clone() {
return new Vector2i(this);
}
@Override
public String toString() {
return "Vector2i(" + this.x + "," + this.y + ")";

View File

@ -1,5 +1,7 @@
package org.atriasoft.etk.math;
import org.atriasoft.etk.internal.Log;
public class Vector3f {
/**
* @brief Get the length square between the 2 vectors
@ -14,12 +16,48 @@ public class Vector3f {
return x * x + y * y + z * z;
}
public static Vector3f valueOf(String value) {
float val1 = 0;
float val2 = 0;
float val3 = 0;
// copy to permit to modify it :
while (value.length() > 0 && value.charAt(0) == '(') {
value = value.substring(1);
}
while (value.length() > 0 && value.charAt(0) == ')') {
value = value.substring(0, value.length() - 1);
}
final String[] values = value.split(",");
if (values.length > 3) {
Log.error("Can not parse Vector3f with more than 3 values: '" + value + "'");
}
if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Float.valueOf(values[0]);
val2 = val1;
val3 = val1;
} else if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Float.valueOf(values[0]);
val2 = Float.valueOf(values[1]);
val3 = val2;
} else {
val1 = Float.valueOf(values[0]);
val2 = Float.valueOf(values[1]);
val3 = Float.valueOf(values[2]);
}
return new Vector3f(val1, val2, val3);
}
public static Vector3f zero() {
return new Vector3f(0, 0, 0);
}
public float x;
public float y;
public float z;
/**
@ -195,10 +233,9 @@ public class Vector3f {
*/
public Vector3f divide(final float val) {
if (val != 0.0f) {
final float tmpVal = 1.0f / val;
this.x *= tmpVal;
this.y *= tmpVal;
this.z *= tmpVal;
this.x /= val;
this.y /= val;
this.z /= val;
return this;
}
throw new IllegalArgumentException("divice by 0 (vector3f)");
@ -221,8 +258,7 @@ public class Vector3f {
*/
public Vector3f divideNew(final float val) {
if (val != 0.0f) {
final float tmpVal = 1.0f / val;
return new Vector3f(this.x * tmpVal, this.y * tmpVal, this.z * tmpVal);
return new Vector3f(this.x / val, this.y / val, this.z / val);
}
throw new IllegalArgumentException("divice by 0 (vector3f)");
}
@ -326,14 +362,14 @@ public class Vector3f {
final Vector3f vectorAbs = new Vector3f(Math.abs(this.x), Math.abs(this.y), Math.abs(this.z));
final int minElement = vectorAbs.getMinAxis();
if (minElement == 0) {
final float devider = 1.0f / (float) Math.sqrt(this.y * this.y + this.z * this.z);
return new Vector3f(0.0f, -this.z * devider, this.y * devider);
final float devider = (float) Math.sqrt(this.y * this.y + this.z * this.z);
return new Vector3f(0.0f, -this.z / devider, this.y / devider);
} else if (minElement == 1) {
final float devider = 1.0f / (float) Math.sqrt(this.x * this.x + this.z * this.z);
return new Vector3f(-this.z * devider, 0.0f, this.x * devider);
final float devider = (float) Math.sqrt(this.x * this.x + this.z * this.z);
return new Vector3f(-this.z / devider, 0.0f, this.x / devider);
}
final float devider = 1.0f / (float) Math.sqrt(this.x * this.x + this.y * this.y);
return new Vector3f(-this.y * devider, this.x * devider, 0.0f);
final float devider = (float) Math.sqrt(this.x * this.x + this.y * this.y);
return new Vector3f(-this.y / devider, this.x / devider, 0.0f);
}
/**
@ -726,7 +762,7 @@ public class Vector3f {
@Override
public String toString() {
return "Vector3f(" + this.x + "," + this.y + "," + this.z + ")";
return "Vector3f(" + FMath.floatToString(this.x) + "," + FMath.floatToString(this.y) + "," + FMath.floatToString(this.z) + ")";
}
/**

View File

@ -1,210 +1,88 @@
package org.atriasoft.etk.math;
import org.atriasoft.etk.internal.Log;
public class Vector3i {
public static Vector3i valueOf(String value) {
int val1 = 0;
int val2 = 0;
int val3 = 0;
// copy to permit to modify it :
while (value.length() > 0 && value.charAt(0) == '(') {
value = value.substring(1);
}
while (value.length() > 0 && value.charAt(0) == ')') {
value = value.substring(0, value.length() - 1);
}
final String[] values = value.split(",");
if (values.length > 3) {
Log.error("Can not parse Vector3f with more than 3 values: '" + value + "'");
}
if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Integer.valueOf(values[0]);
val2 = val1;
val3 = val1;
} else if (values.length == 1) {
// no coma ...
// in every case, we parse the first element :
val1 = Integer.valueOf(values[0]);
val2 = Integer.valueOf(values[1]);
val3 = val2;
} else {
val1 = Integer.valueOf(values[0]);
val2 = Integer.valueOf(values[1]);
val3 = Integer.valueOf(values[2]);
}
return new Vector3i(val1, val2, val3);
}
public static Vector3i zero() {
return new Vector3i(0, 0, 0);
}
public int x = 0;
public int y = 0;
public int z = 0;
/**
* @brief Default contructor
* @brief Default constructor
*/
public Vector3i() {
public Vector3i() {}
/**
* @brief Constructor from scalars
* @param value unique value for X,Y and Z value
*/
public Vector3i(final int value) {
this.x = value;
this.y = value;
this.z = value;
}
/**
* @brief Constructor from scalars
* @param xxx X value
* @param yyy Y value
* @param zzz Z value
*/
public Vector3i(int xxx, int yyy, int zzz) {
public Vector3i(final int xxx, final int yyy, final int zzz) {
this.x = xxx;
this.y = yyy;
this.z = zzz;
}
/**
* @brief Constructor from scalars
* @param value unique value for X,Y and Z value
*/
public Vector3i(int value) {
this.x = value;
this.y = value;
this.z = value;
}
/**
* @brief Constructor from other vector (copy)
* @param obj The vector to add to this one
*/
public Vector3i(Vector3i obj) {
public Vector3i(final Vector3i obj) {
this.x += obj.x;
this.y += obj.y;
this.z += obj.z;
}
/**
* @brief Add a vector to this one
* @param obj The vector to add to this one
*/
public Vector3i add(Vector3i obj) {
this.x += obj.x;
this.y += obj.y;
this.z += obj.z;
return this;
}
/**
* @brief Add a vector to this one
* @param obj The vector to add to this one
*/
public Vector3i addNew(Vector3i obj) {
return new Vector3i(this.x + obj.x,
this.y + obj.y,
this.z + obj.z);
}
/**
* @brief Subtract a vector from this one
* @param obj The vector to subtract
*/
public Vector3i less(Vector3i obj) {
this.x -= obj.x;
this.y -= obj.y;
this.z -= obj.z;
return this;
}
/**
* @brief Scale the vector
* @param val Scale factor
*/
public Vector3i multiply(int val) {
this.x *= val;
this.y *= val;
this.z *= val;
return this;
}
/**
* @brief Scale the vector
* @param val Scale factor
*/
public Vector3i multiplyNew(int val) {
return new Vector3i(this.x * val, this.y * val, this.z * val);
}
/**
* @brief Inversely scale the vector
* @param val Scale factor to divide by
*/
public void devide(int val) {
if (val != 0.0f) {
this.x /= val;
this.y /= val;
this.z /= val;
}
// TODO maybe throw ...
}
/**
* @brief Return the dot product
* @param obj The other vector in the dot product
* @return Dot product value
*/
public int dot(Vector3i obj) {
return this.x * obj.x
+ this.y * obj.y
+ this.z * obj.z;
}
/**
* @brief Get the length of the vector squared
* @return Squared length value.
*/
public int length2() {
return dot(this);
}
/**
* @brief Get the length of the vector
* @return Length value
*/
public int length() {
return (int) Math.sqrt(length2());
}
/**
* @brief Return the distance squared between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the square distance of the 2 points
*/
public int distance2(Vector3i obj) {
int deltaX = obj.x - this.x;
int deltaY = obj.y - this.y;
int deltaZ = obj.z - this.z;
return deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ;
}
/**
* @brief Return the distance between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the distance of the 2 points
*/
public int distance(Vector3i obj) {
return (int)Math.sqrt(this.distance2(obj));
}
/**
* @brief Normalize this vector x^2 + y^2 + z^2 = 1 (check if not deviding by 0, if it is the case ==> return (1,0,0))
*/
public void safeNormalize() {
int length = length();
if (length != 0.0f) {
this.devide(length);
}
this.setValue(1,0,0);
}
/**
* @brief Normalize this vector x^2 + y^2 + z^2 = 1
*/
public void normalize() {
this.devide(this.length());
}
/**
* @brief Return a normalized version of this vector
* @return New vector containing the value
*/
public Vector3i normalizeNew() {
Vector3i out = new Vector3i(this);
out.normalize();
return out;
}
/**
* @brief Return a normalized version of this vector (check if not deviding by 0, if it is the case ==> return (1,0,0))
* @return New vector containing the value
*/
public Vector3i safeNormalizeNew() {
Vector3i out = new Vector3i(this);
out.safeNormalize();
return out;
}
/**
* @brief Return a rotated version of this vector
* @param wAxis The axis to rotate about
* @param angle The angle to rotate by
* @return New vector containing the value
*/
public Vector3i rotateNew( Vector3i wAxis, int angle ) {
Vector3i out = wAxis.clone();
out.multiply( wAxis.dot( this ) );
Vector3i x = this.clone();
x.less(out);
Vector3i y = wAxis.cross( this );
x.multiply((int)Math.cos(angle));
y.multiply((int)Math.sin(angle));
out.add(x);
out.add(y);
return out;
}
/**
* @brief Calculate the angle between this and another vector
* @param obj The other vector
* @return Angle in radian
*/
public int angle(Vector3i obj) {
int s = (int) Math.sqrt(length2() * obj.length2());
if (0!=s) {
return (int) Math.acos(this.dot(obj) / s);
}
return 0;
}
/**
* @brief Return a vector will the absolute values of each element
* @return the curent reference
@ -215,46 +93,260 @@ public class Vector3i {
this.z = Math.abs(this.z);
return this;
}
/**
* @brief Return a vector will the absolute values of each element
* @return New vector containing the value
*/
public Vector3i absoluteNew() {
return new Vector3i( Math.abs(this.x),
Math.abs(this.y),
Math.abs(this.z));
return new Vector3i(Math.abs(this.x), Math.abs(this.y), Math.abs(this.z));
}
/**
* @brief Add a vector to this one
* @param obj The vector to add to this one
*/
public Vector3i add(final Vector3i obj) {
this.x += obj.x;
this.y += obj.y;
this.z += obj.z;
return this;
}
/**
* @brief Add a vector to this one
* @param obj The vector to add to this one
*/
public Vector3i addNew(final Vector3i obj) {
return new Vector3i(this.x + obj.x, this.y + obj.y, this.z + obj.z);
}
/**
* @brief Calculate the angle between this and another vector
* @param obj The other vector
* @return Angle in radian
*/
public int angle(final Vector3i obj) {
final int s = (int) Math.sqrt(length2() * obj.length2());
if (0 != s) {
return (int) Math.acos(dot(obj) / s);
}
return 0;
}
/**
* @brief Clone the current vector.
* @return New vector containing the value
*/
@Override
public Vector3i clone() {
return new Vector3i(this);
}
/**
* @brief Return the axis with the largest ABSOLUTE value
* @return values 0,1,2 for x, y, or z
*/
public int closestAxis() {
return absoluteNew().maxAxis();
}
/**
* @brief Return the cross product between this and another vector
* @param obj The other vector
* @return Vector with the result of the cross product
*/
public Vector3i cross(Vector3i obj) {
return new Vector3i(this.y * obj.z - this.z * obj.y,
this.z * obj.x - this.x * obj.z,
this.x * obj.y - this.y * obj.x);
public Vector3i cross(final Vector3i obj) {
return new Vector3i(this.y * obj.z - this.z * obj.y, this.z * obj.x - this.x * obj.z, this.x * obj.y - this.y * obj.x);
}
/**
* @brief Return the triple product between this and another vector and another
* @param obj1 The other vector 1
* @param obj2 The other vector 2
* @return Value with the result of the triple product
* @brief Inversely scale the vector
* @param val Scale factor to divide by
*/
public int triple(Vector3i obj1, Vector3i obj2) {
return this.x * (obj1.y * obj2.z - obj1.z * obj2.y)
+ this.y * (obj1.z * obj2.x - obj1.x * obj2.z)
+ this.z * (obj1.x * obj2.y - obj1.y * obj2.x);
public void devide(final int val) {
if (val != 0.0f) {
this.x /= val;
this.y /= val;
this.z /= val;
}
// TODO maybe throw ...
}
/**
* @brief Return the axis with the smallest value
* @brief Return the distance between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the distance of the 2 points
*/
public int distance(final Vector3i obj) {
return (int) Math.sqrt(distance2(obj));
}
/**
* @brief Return the distance squared between the ends of this and another vector
* This is symantically treating the vector like a point
* @param obj The other vector to compare distance
* @return the square distance of the 2 points
*/
public int distance2(final Vector3i obj) {
final int deltaX = obj.x - this.x;
final int deltaY = obj.y - this.y;
final int deltaZ = obj.z - this.z;
return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
}
/**
* @brief Return the dot product
* @param obj The other vector in the dot product
* @return Dot product value
*/
public int dot(final Vector3i obj) {
return this.x * obj.x + this.y * obj.y + this.z * obj.z;
}
/**
* @brief Return the axis with the smallest ABSOLUTE value
* @return values 0,1,2 for x, y, or z
*/
public int minAxis() {
if (this.x < this.y) {
return this.x < this.z ? 0 : 2;
}
return this.y < this.z ? 1 : 2;
public int furthestAxis() {
return absoluteNew().minAxis();
}
/**
* @brief Get the maximum value of the vector (x, y, z)
* @return The max value
*/
public int getMax() {
return Math.max(Math.max(this.x, this.y), this.z);
}
/**
* @brief Get the Axis id with the maximum value
* @return Axis ID 0,1,2
*/
public int getMaxAxis() {
return (this.x < this.y ? (this.y < this.z ? 2 : 1) : (this.x < this.z ? 2 : 0));
}
/**
* @brief Get the minimum value of the vector (x, y, z)
* @return The min value
*/
public int getMin() {
return Math.min(Math.min(this.x, this.y), this.z);
}
/**
* @brief Get the Axis id with the minimum value
* @return Axis ID 0,1,2
*/
public int getMinAxis() {
return (this.x < this.y ? (this.x < this.z ? 0 : 2) : (this.y < this.z ? 1 : 2));
}
/**
* @brief Create a skew matrix of the object
* @param obj0 Vector matric first line
* @param obj1 Vector matric second line
* @param obj2 Vector matric third line
*/
public void getSkewSymmetricMatrix(final Vector3i obj0, final Vector3i obj1, final Vector3i obj2) {
obj0.setValue(0, -this.z, this.y);
obj1.setValue(this.z, 0, -this.x);
obj2.setValue(-this.y, this.x, 0);
}
/**
* @brief Get X value
* @return the x value
*/
public int getX() {
return this.x;
}
/**
* @brief Get Y value
* @return the y value
*/
public int getY() {
return this.y;
}
/**
* @brief Get Z value
* @return the z value
*/
public int getZ() {
return this.z;
}
/**
* @brief In-Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are NOT identical
* @return false The Objects are identical
*/
public boolean isDifferent(final Vector3i obj) {
return ((this.z != obj.z) || (this.y != obj.y) || (this.x != obj.x));
}
/**
* @brief Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are identical
* @return false The Objects are NOT identical
*/
public boolean isEqual(final Vector3i obj) {
return ((this.z == obj.z) && (this.y == obj.y) && (this.x == obj.x));
}
/**
* @brief Check if the vector is equal to (0,0,0)
* @return true The value is equal to (0,0,0)
* @return false The value is NOT equal to (0,0,0)
*/
public boolean isZero() {
return this.x == 0 && this.y == 0 && this.z == 0;
}
/**
* @brief Get the length of the vector
* @return Length value
*/
public int length() {
return (int) Math.sqrt(length2());
}
/**
* @brief Get the length of the vector squared
* @return Squared length value.
*/
public int length2() {
return dot(this);
}
/**
* @brief Return the linear interpolation between this and another vector
* @param obj The other vector
* @param ratio The ratio of this to obj (ratio = 0 => return copy of this, ratio=1 => return other)
* @return New vector containing the value
*/
public Vector3i lerp(final Vector3i obj, final int ratio) {
return new Vector3i(this.x + (obj.x - this.x) * ratio, this.y + (obj.y - this.y) * ratio, this.z + (obj.z - this.z) * ratio);
}
/**
* @brief Subtract a vector from this one
* @param obj The vector to subtract
*/
public Vector3i less(final Vector3i obj) {
this.x -= obj.x;
this.y -= obj.y;
this.z -= obj.z;
return this;
}
/**
* @brief Return the axis with the largest value
* @return values 0,1,2 for x, y, or z
@ -265,212 +357,192 @@ public class Vector3i {
}
return this.x < this.z ? 2 : 0;
}
/**
* @brief Return the axis with the smallest ABSOLUTE value
* @brief Return the axis with the smallest value
* @return values 0,1,2 for x, y, or z
*/
public int furthestAxis() {
return absoluteNew().minAxis();
public int minAxis() {
if (this.x < this.y) {
return this.x < this.z ? 0 : 2;
}
return this.y < this.z ? 1 : 2;
}
/**
* @brief Return the axis with the largest ABSOLUTE value
* @return values 0,1,2 for x, y, or z
* @brief Scale the vector
* @param val Scale factor
*/
public int closestAxis() {
return absoluteNew().maxAxis();
}
/**
* @brief Return the linear interpolation between this and another vector
* @param obj The other vector
* @param ratio The ratio of this to obj (ratio = 0 => return copy of this, ratio=1 => return other)
* @return New vector containing the value
*/
public Vector3i lerp(Vector3i obj, int ratio) {
return new Vector3i(this.x + (obj.x - this.x) * ratio,
this.y + (obj.y - this.y) * ratio,
this.z + (obj.z - this.z) * ratio);
public Vector3i multiply(final int val) {
this.x *= val;
this.y *= val;
this.z *= val;
return this;
}
/**
* @brief Elementwise multiply this vector by the other
* @param obj The other vector
* @return the current reference
*/
public Vector3i multiply(Vector3i obj) {
public Vector3i multiply(final Vector3i obj) {
this.x *= obj.x;
this.y *= obj.y;
this.z *= obj.z;
return this;
}
/**
* @brief Scale the vector
* @param val Scale factor
*/
public Vector3i multiplyNew(final int val) {
return new Vector3i(this.x * val, this.y * val, this.z * val);
}
/**
* @brief Elementwise multiply this vector by the other
* @param obj The other vector
*/
public Vector3i multiplyNew(Vector3i obj) {
public Vector3i multiplyNew(final Vector3i obj) {
this.x *= obj.x;
this.y *= obj.y;
this.z *= obj.z;
return this;
}
/**
* @brief Set the x value
* @param x New value
* @brief Normalize this vector x^2 + y^2 + z^2 = 1
*/
public void setX(int x) {
this.x = x;
public void normalize() {
devide(length());
}
/**
* @brief Set the y value
* @param y New value
* @brief Return a normalized version of this vector
* @return New vector containing the value
*/
public void setY(int y) {
this.y = y;
public Vector3i normalizeNew() {
final Vector3i out = new Vector3i(this);
out.normalize();
return out;
}
/**
* @brief Set the z value
* @param z New value
* @brief Return a rotated version of this vector
* @param wAxis The axis to rotate about
* @param angle The angle to rotate by
* @return New vector containing the value
*/
public void setZ(int z) {
this.z = z;
public Vector3i rotateNew(final Vector3i wAxis, final int angle) {
final Vector3i out = wAxis.clone();
out.multiply(wAxis.dot(this));
final Vector3i x = clone();
x.less(out);
final Vector3i y = wAxis.cross(this);
x.multiply((int) Math.cos(angle));
y.multiply((int) Math.sin(angle));
out.add(x);
out.add(y);
return out;
}
/**
* @brief Get X value
* @return the x value
* @brief Normalize this vector x^2 + y^2 + z^2 = 1 (check if not deviding by 0, if it is the case ==> return (1,0,0))
*/
public int getX() {
return this.x;
public void safeNormalize() {
final int length = length();
if (length != 0.0f) {
devide(length);
}
setValue(1, 0, 0);
}
/**
* @brief Get Y value
* @return the y value
* @brief Return a normalized version of this vector (check if not deviding by 0, if it is the case ==> return (1,0,0))
* @return New vector containing the value
*/
public int getY() {
return this.y;
}
/**
* @brief Get Z value
* @return the z value
*/
public int getZ() {
return this.z;
}
/**
* @brief Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are identical
* @return false The Objects are NOT identical
*/
public boolean isEqual(Vector3i obj) {
return ( (this.z == obj.z)
&& (this.y == obj.y)
&& (this.x == obj.x));
}
/**
* @brief In-Equality compare operator with an other object.
* @param obj Reference on the comparing object
* @return true The Objects are NOT identical
* @return false The Objects are identical
*/
public boolean isDifferent(Vector3i obj) {
return ( (this.z != obj.z)
|| (this.y != obj.y)
|| (this.x != obj.x));
public Vector3i safeNormalizeNew() {
final Vector3i out = new Vector3i(this);
out.safeNormalize();
return out;
}
/**
* @brief Set each element to the max of the current values and the values of another Vector3f
* @param obj The other Vector3f to compare with
*/
public void setMax(Vector3i obj) {
public void setMax(final Vector3i obj) {
this.x = Math.max(this.x, obj.x);
this.y = Math.max(this.y, obj.y);
this.z = Math.max(this.z, obj.z);
}
/**
* @brief Set each element to the min of the current values and the values of another Vector3f
* @param obj The other Vector3f to compare with
*/
public void setMin(Vector3i obj) {
public void setMin(final Vector3i obj) {
this.x = Math.min(this.x, obj.x);
this.y = Math.min(this.y, obj.y);
this.z = Math.min(this.z, obj.z);
}
/**
* @brief Get the minimum value of the vector (x, y, z)
* @return The min value
*/
public int getMin() {
return Math.min(Math.min(this.x, this.y), this.z);
}
/**
* @brief Get the maximum value of the vector (x, y, z)
* @return The max value
*/
public int getMax() {
return Math.max(Math.max(this.x, this.y), this.z);
}
/**
* @brief Set Value on the vector
* @param xxx X value.
* @param yyy Y value.
* @param zzz Z value.
*/
public void setValue(int xxx, int yyy, int zzz) {
public void setValue(final int xxx, final int yyy, final int zzz) {
this.x = xxx;
this.y = yyy;
this.z = zzz;
}
/**
* @brief Create a skew matrix of the object
* @param obj0 Vector matric first line
* @param obj1 Vector matric second line
* @param obj2 Vector matric third line
* @brief Set the x value
* @param x New value
*/
public void getSkewSymmetricMatrix(Vector3i obj0,Vector3i obj1,Vector3i obj2) {
obj0.setValue(0 ,-z ,y);
obj1.setValue(z ,0 ,-x);
obj2.setValue(-y ,x ,0);
public void setX(final int x) {
this.x = x;
}
/**
* @brief Set the y value
* @param y New value
*/
public void setY(final int y) {
this.y = y;
}
/**
* @brief Set the z value
* @param z New value
*/
public void setZ(final int z) {
this.z = z;
}
/**
* @brief Set 0 value on all the vector
*/
public void setZero() {
setValue(0,0,0);
}
/**
* @brief Check if the vector is equal to (0,0,0)
* @return true The value is equal to (0,0,0)
* @return false The value is NOT equal to (0,0,0)
*/
public boolean isZero() {
return this.x == 0
&& this.y == 0
&& this.z == 0;
}
/**
* @brief Get the Axis id with the minimum value
* @return Axis ID 0,1,2
*/
public int getMinAxis() {
return (this.x < this.y ? (this.x < this.z ? 0 : 2) : (this.y < this.z ? 1 : 2));
}
/**
* @brief Get the Axis id with the maximum value
* @return Axis ID 0,1,2
*/
public int getMaxAxis() {
return (this.x < this.y ? (this.y < this.z ? 2 : 1) : (this.x < this.z ? 2 : 0));
}
/**
* @brief Clone the current vector.
* @return New vector containing the value
*/
public Vector3i clone() {
return new Vector3i(this);
}
public static Vector3i zero() {
return new Vector3i(0,0,0);
setValue(0, 0, 0);
}
@Override
public String toString() {
return "Vector3i(" + this.x + "," + this.y + "," + this.z + ")";
}
/**
* @brief Return the triple product between this and another vector and another
* @param obj1 The other vector 1
* @param obj2 The other vector 2
* @return Value with the result of the triple product
*/
public int triple(final Vector3i obj1, final Vector3i obj2) {
return this.x * (obj1.y * obj2.z - obj1.z * obj2.y) + this.y * (obj1.z * obj2.x - obj1.x * obj2.z) + this.z * (obj1.x * obj2.y - obj1.y * obj2.x);
}
}

View File

@ -0,0 +1,86 @@
package org.atriasoft.etk.theme;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.atriasoft.etk.internal.Log;
public class Theme {
private static Map<String, Path> g_listTheme = new HashMap<>();
private static Map<String, Path> g_listThemeDefault = new HashMap<>();
/**
* @brief get the folder from a Reference theme
* @param[in] _refName Theme cathegorie ex : "GUI" "SHADER" "DEFAULT"
* @return the path of the theme
*/
public static Path getName(final String _refName) {
return g_listTheme.get(_refName);
}
/**
* @brief get the default folder from a Reference theme
* @param[in] _refName Theme cathegorie ex : "GUI" "SHADER" "DEFAULT"
* @return the path of the theme
*/
public static Path getNameDefault(final String _refName) {
return g_listThemeDefault.get(_refName);
};
/**
* @brief initialize the theme system
*/
public static void init() {
};
/**
* @brief Get the list of all the theme folder availlable in the user Home/appl
* @return The list of elements
*/
public static Set<String> list() {
return g_listTheme.keySet();
}
/**
* @brief Set the Folder of a subset of a theme ...
* @param[in] _refName Theme cathegorie ex : "GUI" "SHADER" "DEFAULT"
* @param[in] _folderName The associated folder of the Theme (like "myTheme/folder/folder2/")
*/
public static void setName(final String _refName, final Path _folderName) {
Log.warning("Change theme : '" + _refName + "' : '" + _folderName + "'");
g_listTheme.put(_refName, _folderName);
updateProvider(_refName);
}
/**
* @brief Set the default folder of a subset of a theme ...
* @param[in] _refName Theme cathegorie ex : "GUI" "SHADER" "DEFAULT"
* @param[in] _folderName The associated default folder of the Theme (like "myTheme/color/default/")
*/
public static void setNameDefault(final String _refName, final Path _folderName) {
g_listThemeDefault.put(_refName, _folderName);
updateProvider(_refName);
}
/**
* @brief un-initialize the theme system
*/
public static void unInit() {
g_listTheme.clear();
g_listThemeDefault.clear();
}
public static void updateProvider(final String _refName) {
final Path base = getName(_refName);
final Path baseDefault = getNameDefault(_refName);
if (base == null) {
//etk::uri::provider::add("THEME_" + _refName, new ProviderTheme(new Path("theme") / baseDefault, Path("theme") / base));
} else {
//etk::uri::provider::add("THEME_" + _refName, new ProviderTheme(Path("theme") / base, Path("theme") / baseDefault));
}
};
}

View File

@ -0,0 +1,75 @@
package org.atriasoft.etk.util;
// Pair class
public class Pair<U, V> {
// Factory method for creating a Typed Pair immutable instance
public static <U, V> Pair<U, V> of(final U a, final V b) {
// calls private constructor
return new Pair<>(a, b);
}
public final U first; // first field of a Pair
public final V second; // second field of a Pair
// Constructs a new Pair with specified values
public Pair(final U first, final V second) {
this.first = first;
this.second = second;
}
@Override
// Checks specified object is "equal to" current object or not
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Pair<?, ?> pair = (Pair<?, ?>) o;
// call equals() method of the underlying objects
if (!this.first.equals(pair.first)) {
return false;
}
return this.second.equals(pair.second);
}
@Override
// Computes hash code for an object to support hash tables
public int hashCode() {
// use hash codes of the underlying objects
return 31 * this.first.hashCode() + this.second.hashCode();
}
@Override
public String toString() {
return "(" + this.first + ", " + this.second + ")";
}
}
// Program to implement Pair Class in Java
/*
class Main
{
public static void main(String[] args)
{
Pair<String, Integer> p1 = Pair.of("John", 26);
Pair<String, Integer> p2 = Pair.of("Tom", 30);
Pair<String, Integer> p3 = Pair.of("John", 26);
List<Pair<String, Integer>> pairs = new ArrayList<>();
pairs.add(p1);
pairs.add(p2);
pairs.add(p3);
System.out.println(pairs);
Set<Pair<String, Integer>> distinctPairs = new HashSet<>(pairs);
System.out.println(distinctPairs);
}
}
*/