Skip to content

Commit

Permalink
Merge pull request #264 from simlu/qa
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
simlu authored Oct 7, 2017
2 parents 1923b4e + fe23c23 commit 65bbcc5
Show file tree
Hide file tree
Showing 58 changed files with 166 additions and 90 deletions.
44 changes: 21 additions & 23 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,26 +27,24 @@ after_success:
- "~/.local/bin/aws s3 cp $TRAVIS_BUILD_DIR/target/build/voxelshop-bin.zip s3://$S3_BUCKET/build/$TRAVIS_BRANCH/voxelshop-bin.zip --region=$S3_REGION"

deploy:
provider: releases
prerelease: true
api_key:
secure: "mA6DaAr2VXyE8Zn0LPq7XX3e3/Dnlk3trkNDhuWNbs4jCISbCLBJalJEaovgd392/tKYjmOdN7kN+PUVyOwQZgwl2v7Q4cx0epMksibLhjICvVegGRMM/epPaOBqrQXy31gZN6RDKxVG/XFw9K9ez3TUZr0GmsjaRjQ9rNL62eRwvywrNzNFHLDJAWtM4Jl/DijN1LHO17OcecQArRA/Dk8y2r52DlKBXqQlksqfr3slJOH2natY/Nf2ZkfEyYZNRZ+6J9uKbkCTFncVoN80V/1nlA9QQ17gJx5ZnhpWqytebMgdRBKHgVECuLRHfw7vUzkQkk3V9U/VMxYTassWYYcfV9PNWCSshL4czl5LjMzRU65M+H2l/pISFwpwFM4E5u7A8lJ4KWclgfU7vFn/iWkb95NeAbYvPOfvB4OGIiaSI8xTWWL/tKdX+hmjWIKPSdhQd8B26syfJeqL2DcgE8uFjgisLZuBlWl7dKr11ausTPcA8lu4A4dWsZpuBVIPT6/Oi0XEFYVaTiy3CSV/XVV1XORME6G3UC0098DlWW/sZw5dA6jv/cf0o4IwttYDZdNq8fQVL2aXM7uJpv54gAjtBUpoFb/nNnkMw6MuN/xSzcgKs/ZWQk3HSPNuSuiWi/XPftNPUYJIJsZCeZscfKIBupzUhU9W8NX4r+LmYHA="
file: $TRAVIS_BUILD_DIR/target/build/voxelshop-bin.zip
skip_cleanup: true
on:
repo: $DEPLOY_REPO
branch: qa
tags: true
jdk: oraclejdk8

deploy:
provider: releases
api_key:
secure: "mA6DaAr2VXyE8Zn0LPq7XX3e3/Dnlk3trkNDhuWNbs4jCISbCLBJalJEaovgd392/tKYjmOdN7kN+PUVyOwQZgwl2v7Q4cx0epMksibLhjICvVegGRMM/epPaOBqrQXy31gZN6RDKxVG/XFw9K9ez3TUZr0GmsjaRjQ9rNL62eRwvywrNzNFHLDJAWtM4Jl/DijN1LHO17OcecQArRA/Dk8y2r52DlKBXqQlksqfr3slJOH2natY/Nf2ZkfEyYZNRZ+6J9uKbkCTFncVoN80V/1nlA9QQ17gJx5ZnhpWqytebMgdRBKHgVECuLRHfw7vUzkQkk3V9U/VMxYTassWYYcfV9PNWCSshL4czl5LjMzRU65M+H2l/pISFwpwFM4E5u7A8lJ4KWclgfU7vFn/iWkb95NeAbYvPOfvB4OGIiaSI8xTWWL/tKdX+hmjWIKPSdhQd8B26syfJeqL2DcgE8uFjgisLZuBlWl7dKr11ausTPcA8lu4A4dWsZpuBVIPT6/Oi0XEFYVaTiy3CSV/XVV1XORME6G3UC0098DlWW/sZw5dA6jv/cf0o4IwttYDZdNq8fQVL2aXM7uJpv54gAjtBUpoFb/nNnkMw6MuN/xSzcgKs/ZWQk3HSPNuSuiWi/XPftNPUYJIJsZCeZscfKIBupzUhU9W8NX4r+LmYHA="
file: $TRAVIS_BUILD_DIR/target/build/voxelshop-bin.zip
skip_cleanup: true
on:
repo: $DEPLOY_REPO
branch: master
tags: true
jdk: oraclejdk8
- provider: releases
prerelease: true
api_key:
secure: "mA6DaAr2VXyE8Zn0LPq7XX3e3/Dnlk3trkNDhuWNbs4jCISbCLBJalJEaovgd392/tKYjmOdN7kN+PUVyOwQZgwl2v7Q4cx0epMksibLhjICvVegGRMM/epPaOBqrQXy31gZN6RDKxVG/XFw9K9ez3TUZr0GmsjaRjQ9rNL62eRwvywrNzNFHLDJAWtM4Jl/DijN1LHO17OcecQArRA/Dk8y2r52DlKBXqQlksqfr3slJOH2natY/Nf2ZkfEyYZNRZ+6J9uKbkCTFncVoN80V/1nlA9QQ17gJx5ZnhpWqytebMgdRBKHgVECuLRHfw7vUzkQkk3V9U/VMxYTassWYYcfV9PNWCSshL4czl5LjMzRU65M+H2l/pISFwpwFM4E5u7A8lJ4KWclgfU7vFn/iWkb95NeAbYvPOfvB4OGIiaSI8xTWWL/tKdX+hmjWIKPSdhQd8B26syfJeqL2DcgE8uFjgisLZuBlWl7dKr11ausTPcA8lu4A4dWsZpuBVIPT6/Oi0XEFYVaTiy3CSV/XVV1XORME6G3UC0098DlWW/sZw5dA6jv/cf0o4IwttYDZdNq8fQVL2aXM7uJpv54gAjtBUpoFb/nNnkMw6MuN/xSzcgKs/ZWQk3HSPNuSuiWi/XPftNPUYJIJsZCeZscfKIBupzUhU9W8NX4r+LmYHA="
file: $TRAVIS_BUILD_DIR/target/build/voxelshop-bin.zip
skip_cleanup: true
on:
repo: $DEPLOY_REPO
branch: qa
tags: true
jdk: oraclejdk8
- provider: releases
api_key:
secure: "mA6DaAr2VXyE8Zn0LPq7XX3e3/Dnlk3trkNDhuWNbs4jCISbCLBJalJEaovgd392/tKYjmOdN7kN+PUVyOwQZgwl2v7Q4cx0epMksibLhjICvVegGRMM/epPaOBqrQXy31gZN6RDKxVG/XFw9K9ez3TUZr0GmsjaRjQ9rNL62eRwvywrNzNFHLDJAWtM4Jl/DijN1LHO17OcecQArRA/Dk8y2r52DlKBXqQlksqfr3slJOH2natY/Nf2ZkfEyYZNRZ+6J9uKbkCTFncVoN80V/1nlA9QQ17gJx5ZnhpWqytebMgdRBKHgVECuLRHfw7vUzkQkk3V9U/VMxYTassWYYcfV9PNWCSshL4czl5LjMzRU65M+H2l/pISFwpwFM4E5u7A8lJ4KWclgfU7vFn/iWkb95NeAbYvPOfvB4OGIiaSI8xTWWL/tKdX+hmjWIKPSdhQd8B26syfJeqL2DcgE8uFjgisLZuBlWl7dKr11ausTPcA8lu4A4dWsZpuBVIPT6/Oi0XEFYVaTiy3CSV/XVV1XORME6G3UC0098DlWW/sZw5dA6jv/cf0o4IwttYDZdNq8fQVL2aXM7uJpv54gAjtBUpoFb/nNnkMw6MuN/xSzcgKs/ZWQk3HSPNuSuiWi/XPftNPUYJIJsZCeZscfKIBupzUhU9W8NX4r+LmYHA="
file: $TRAVIS_BUILD_DIR/target/build/voxelshop-bin.zip
skip_cleanup: true
on:
repo: $DEPLOY_REPO
branch: master
tags: true
jdk: oraclejdk8
Binary file modified images/splash.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added resource/img/icons/application/icons/icon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed resource/img/icons/application/paintbucket.png
Binary file not shown.
9 changes: 2 additions & 7 deletions src/main/java/com/vitco/app/export/MagicaVoxelExporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,11 @@ protected boolean writeFile() throws IOException {

// ensure generated file is deterministic
Voxel[] voxels = data.getVisibleLayerVoxel();
Arrays.sort(voxels, new Comparator<Voxel>() {
@Override
public int compare(Voxel o1, Voxel o2) {
return o2.posId - o1.posId;
}
});
Arrays.sort(voxels, Comparator.comparingInt(o -> o.posId));

// write voxel data
for (Voxel voxel : voxels) {
final int vx = -(voxel.x - max[0]);
final int vx = voxel.x - min[0];
final int vy = -(voxel.y - max[1]);
final int vz = voxel.z - min[2];
final int colorId = colorPalette.get(voxel.getColor().getRGB()) + 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ public void setObjectName(String objectName) {
this.objectName = objectName;
}

// true if every voxel layer should be exported as its own object
private boolean useLayers = false;
public final void setUseLayers(boolean state) {
useLayers = state;
// the origin mode
public static final int SEPARATION_MERGED = 0;
public static final int SEPARATION_LAYER = 1;
public static final int SEPARATION_VOXEL = 2;
// setter for origin mode
private int separationMode = SEPARATION_MERGED;
public final void setSeparationMode(int separationMode) {
this.separationMode = separationMode;
}

// true if holes should be removed
Expand Down Expand Up @@ -125,7 +129,7 @@ public final boolean export(Data data, ErrorHandlerInterface errorHandler, File
// create data export objects
ExportDataManager exportDataManager = new ExportDataManager(
getProgressDialog(), getConsole(), data, padTextures, removeHoles, algorithm, useYUP, originMode,
forcePOT, useLayers, triangulateByColor, useVertexColoring, fixTJunctions, exportTexturedVoxels, useOverlappingUvs,
forcePOT, separationMode, triangulateByColor, useVertexColoring, fixTJunctions, exportTexturedVoxels, useOverlappingUvs,
useSkewedUvs);
ColladaFileExporter colladaFileExporter = new ColladaFileExporter(
getProgressDialog(), getConsole(), exportDataManager, prefix, objectName, useYUP, exportOrthogonalVertexNormals, useVertexColoring);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public class ColladaFileExporter extends ProgressReporter {
// overwriting of textures that belong to different files)
private final String texturePrefix;

// scale factor (useful for Blender)
private static final float SCALE = 0.05f;

// constructor
public ColladaFileExporter(ProgressDialog dialog, ConsoleInterface console, ExportDataManager exportDataManager,
String texturePrefix, String name, boolean useYUP, boolean exportOrthogonalVertexNormals, boolean useVertexColoring) {
Expand All @@ -48,7 +51,7 @@ public ColladaFileExporter(ProgressDialog dialog, ConsoleInterface console, Expo
initXmlFile(useYUP, useVertexColoring);
// create the object in the scene
setActivity("Creating Objects...", true);
writeObject(name);
writeObjects(name);
if (!useVertexColoring) {
// write the texture information
setActivity("Creating Textures...", true);
Expand All @@ -61,11 +64,13 @@ public ColladaFileExporter(ProgressDialog dialog, ConsoleInterface console, Expo
}

// create the object in the scene
private void writeObject(String name) {
private void writeObjects(String name) {
String cleanName = name.replace(" ", "_").replaceAll("[^a-zA-Z0-9_\\-\\.]", "").toLowerCase();
String[] layerNames = exportDataManager.getLayerNames();
HashSet<String> knownObjectIds = new HashSet<String>();
HashSet<String> knownObjectIds = new HashSet<>();
float[][] offsets = exportDataManager.getOffsets();
for (int layerRef = 0; layerRef < layerNames.length; layerRef++) {
float[] offset = offsets[layerRef];
String layerName = layerNames[layerRef];
String cleanLayerName = layerName.replace(" ", "_").replaceAll("[^a-zA-Z0-9_\\-\\.]", "").toLowerCase();
String objectId = cleanLayerName;
Expand All @@ -83,12 +88,12 @@ private void writeObject(String name) {
"type=NODE"
});
xmlFile.addAttrAndTextContent("translate", new String[]{"sid=location"},
"0 0 0");
(-SCALE * offset[0] * 2) + " " + (-SCALE * offset[2] * 2) + " " + (-SCALE * offset[1] * 2));
xmlFile.addAttrAndTextContent("rotate[-1]", new String[]{"sid=rotationZ"}, "0 0 1 0");
xmlFile.addAttrAndTextContent("rotate[-1]", new String[]{"sid=rotationY"}, "0 1 0 0");
xmlFile.addAttrAndTextContent("rotate[-1]", new String[]{"sid=rotationX"}, "1 0 0 0");
// scale the object down
xmlFile.addAttrAndTextContent("scale", new String[]{"sid=scale"}, "0.05 0.05 0.05");
xmlFile.addAttrAndTextContent("scale", new String[]{"sid=scale"}, SCALE + " " + SCALE + " " + SCALE);


// add the material to the object
Expand Down
137 changes: 100 additions & 37 deletions src/main/java/com/vitco/app/export/generic/ExportDataManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,48 @@ public class ExportDataManager extends ProgressReporter {
// whether to fix tjunction problems
private final boolean fixTJunctions;

// center of this object
// center of all voxels
private final float[] center;

// centers of individual objects
private final ArrayList<float[]> centers = new ArrayList<>();

// retrieve offsets
public final float[][] getOffsets() {
float[][] result = new float[centers.size()][];
for (int i = 0; i < result.length; i++) {
result[i] = centers.get(i).clone();
float[] entry = result[i];
switch (originMode) {
case ColladaExportWrapper.ORIGIN_CENTER:
entry[0] -= center[0];
entry[1] -= center[1];
entry[2] -= center[2];
break;
case ColladaExportWrapper.ORIGIN_PLANE_CENTER:
entry[0] -= center[0];
entry[1] -= 0.5f;
entry[2] -= center[2];
break;
case ColladaExportWrapper.ORIGIN_BOX_CENTER:
entry[0] -= DynamicSettings.VOXEL_PLANE_SIZE_X % 2 == 0 ? -0.5f : 0f;
entry[1] -= 0.5f - DynamicSettings.VOXEL_PLANE_RANGE_Y;
entry[2] -= DynamicSettings.VOXEL_PLANE_SIZE_Z % 2 == 0 ? -0.5f : 0f;
break;
case ColladaExportWrapper.ORIGIN_BOX_PLANE_CENTER:
entry[0] -= DynamicSettings.VOXEL_PLANE_SIZE_X % 2 == 0 ? -0.5f : 0f;
entry[1] -= 0.5f;
entry[2] -= DynamicSettings.VOXEL_PLANE_SIZE_Z % 2 == 0 ? -0.5f : 0f;
break;
case ColladaExportWrapper.ORIGIN_CROSS:
default:
break;
}
}

return result;
}

// -------------
// Layer names of layers that are being exported
private final ArrayList<String> layerNames = new ArrayList<String>();
Expand Down Expand Up @@ -101,26 +140,46 @@ public final TriTextureManager getTextureManager() {

// constructor
public ExportDataManager(ProgressDialog dialog, ConsoleInterface console, Data data, boolean usePadding, boolean removeHoles, int algorithm, boolean useYUP,
int originMode, boolean forcePOT, boolean useLayers, boolean triangulateByColor, boolean useVertexColoring, boolean fixTJunctions,
int originMode, boolean forcePOT, int separationMode, boolean triangulateByColor, boolean useVertexColoring, boolean fixTJunctions,
boolean exportTexturedVoxels, boolean useOverlappingUvs, boolean useSkewedUvs) {
super(dialog, console);

// create hull manager that exposes hull information
setActivity("Computing Hull...", true);
int minx = Integer.MAX_VALUE;
int maxx = Integer.MIN_VALUE;
int miny = Integer.MAX_VALUE;
int maxy = Integer.MIN_VALUE;
int minz = Integer.MAX_VALUE;
int maxz = Integer.MIN_VALUE;

if (useLayers) {
int gminx = Integer.MAX_VALUE;
int gmaxx = Integer.MIN_VALUE;
int gminy = Integer.MAX_VALUE;
int gmaxy = Integer.MIN_VALUE;
int gminz = Integer.MAX_VALUE;
int gmaxz = Integer.MIN_VALUE;
if (separationMode == ColladaExportWrapper.SEPARATION_VOXEL) {
// handle voxels separately
for (Voxel voxel : data.getVisibleLayerVoxel()) {
HullManagerExt<Voxel> hullManager = new HullManagerExt<>();
hullManager.update(voxel.posId, voxel);
hullManagers.add(hullManager);
layerNames.add("voxel_" + voxel.x + "_" + voxel.y + "_" + voxel.z);
centers.add(new float[] {voxel.x, voxel.y, voxel.z});
gminx = Math.min(gminx, voxel.x);
gmaxx = Math.max(gmaxx, voxel.x);
gminy = Math.min(gminy, voxel.y);
gmaxy = Math.max(gmaxy, voxel.y);
gminz = Math.min(gminz, voxel.z);
gmaxz = Math.max(gmaxz, voxel.z);
}
} else if (separationMode == ColladaExportWrapper.SEPARATION_LAYER) {
// handle layers separately
for (Integer layerId : data.getLayers()) {
if (data.getLayerVisible(layerId)) {
Voxel[] layerVoxel = data.getLayerVoxels(layerId);
if (layerVoxel.length != 0) {
HullManagerExt<Voxel> hullManager = new HullManagerExt<Voxel>();
HullManagerExt<Voxel> hullManager = new HullManagerExt<>();
int minx = Integer.MAX_VALUE;
int maxx = Integer.MIN_VALUE;
int miny = Integer.MAX_VALUE;
int maxy = Integer.MIN_VALUE;
int minz = Integer.MAX_VALUE;
int maxz = Integer.MIN_VALUE;
for (Voxel voxel : data.getLayerVoxels(layerId)) {
hullManager.update(voxel.posId, voxel);
minx = Math.min(minx, voxel.x);
Expand All @@ -132,12 +191,25 @@ public ExportDataManager(ProgressDialog dialog, ConsoleInterface console, Data d
}
layerNames.add(data.getLayerName(layerId));
hullManagers.add(hullManager);
centers.add(new float[] {(minx + maxx) / 2f, (miny + maxy) / 2f, (minz + maxz) / 2f});
gminx = Math.min(gminx, minx);
gmaxx = Math.max(gmaxx, maxx);
gminy = Math.min(gminy, miny);
gmaxy = Math.max(gmaxy, maxy);
gminz = Math.min(gminz, minz);
gmaxz = Math.max(gmaxz, maxz);
}
}
}
} else {
} else if (separationMode == ColladaExportWrapper.SEPARATION_MERGED) {
// merge all layers
HullManagerExt<Voxel> hullManager = new HullManagerExt<Voxel>();
HullManagerExt<Voxel> hullManager = new HullManagerExt<>();
int minx = Integer.MAX_VALUE;
int maxx = Integer.MIN_VALUE;
int miny = Integer.MAX_VALUE;
int maxy = Integer.MIN_VALUE;
int minz = Integer.MAX_VALUE;
int maxz = Integer.MIN_VALUE;
for (Voxel voxel : data.getVisibleLayerVoxel()) {
hullManager.update(voxel.posId, voxel);
minx = Math.min(minx, voxel.x);
Expand All @@ -149,11 +221,18 @@ public ExportDataManager(ProgressDialog dialog, ConsoleInterface console, Data d
}
layerNames.add("Merged");
hullManagers.add(hullManager);
centers.add(new float[] {(minx + maxx) / 2f, (miny + maxy) / 2f, (minz + maxz) / 2f});
gminx = Math.min(gminx, minx);
gmaxx = Math.max(gmaxx, maxx);
gminy = Math.min(gminy, miny);
gmaxy = Math.max(gmaxy, maxy);
gminz = Math.min(gminz, minz);
gmaxz = Math.max(gmaxz, maxz);
}
center = new float[] {
(minx + maxx) / 2f,
(miny + maxy) / 2f,
(minz + maxz) / 2f
(gminx + gmaxx) / 2f,
(gminy + gmaxy) / 2f,
(gminz + gmaxz) / 2f
};

// store references
Expand Down Expand Up @@ -308,8 +387,10 @@ private short[][][] fix3DTJunctionProblems(HullManagerExt<Voxel> hullManager, sh
private void extract(final int algorithm) {
setActivity("Extracting Mesh...", false);
// loop over all managers
for (final HullManagerExt<Voxel> hullManager : hullManagers) {
final TexTriangleManager triangleManager = new TexTriangleManager();
for (int i = 0; i < hullManagers.size(); i++) {
final int finalI = i;
HullManagerExt<Voxel> hullManager = hullManagers.get(i);
final TexTriangleManager triangleManager = new TexTriangleManager();
triangleManagers.add(triangleManager);
// loop over all sides
for (int side = 0; side < 6; side++) {
Expand Down Expand Up @@ -487,25 +568,7 @@ public boolean execute(int rgb, Collection<DelaunayTriangle> tris) {
texTri.invert(1);
texTri.invert(2);

if (originMode == ColladaExportWrapper.ORIGIN_CROSS) {
texTri.move(0.5f, 0.5f, 0.5f); // move one up
} else if (originMode == ColladaExportWrapper.ORIGIN_CENTER) {
texTri.move(center[0] + 0.5f, center[2] + 0.5f, center[1] + 0.5f);
} else if (originMode == ColladaExportWrapper.ORIGIN_PLANE_CENTER) {
texTri.move(center[0] + 0.5f, center[2] + 0.5f, 1f);
} else if (originMode == ColladaExportWrapper.ORIGIN_BOX_CENTER) {
texTri.move(
DynamicSettings.VOXEL_PLANE_SIZE_X % 2 == 0 ? 0f : 0.5f,
DynamicSettings.VOXEL_PLANE_SIZE_Z % 2 == 0 ? 0f : 0.5f,
1f - DynamicSettings.VOXEL_PLANE_RANGE_Y
);
} else if (originMode == ColladaExportWrapper.ORIGIN_BOX_PLANE_CENTER) {
texTri.move(
DynamicSettings.VOXEL_PLANE_SIZE_X % 2 == 0 ? 0f : 0.5f,
DynamicSettings.VOXEL_PLANE_SIZE_Z % 2 == 0 ? 0f : 0.5f,
1f
);
}
texTri.move(centers.get(finalI)[0] + 0.5f, centers.get(finalI)[2] + 0.5f, centers.get(finalI)[1] + 0.5f);

if (useYUP) {
texTri.swap(1, 2);
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/vitco/app/importer/VoxImporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ protected boolean read(FileIn fileIn, RandomAccessFileIn raf) throws IOException
return false;
}

ArrayList<Integer> voxels = new ArrayList<Integer>();
ArrayList<Integer> voxels = new ArrayList<>();
int[] palette = voxColors;

int[] offset = new int[3];
Expand Down Expand Up @@ -169,7 +169,7 @@ protected boolean read(FileIn fileIn, RandomAccessFileIn raf) throws IOException
for (Integer voxel : voxels) {
buf.position(0);
buf.putInt(voxel);
addVoxel(offset[0] -(buf.get(0) & 0xFF), -(buf.get(2) & 0xFF), -offset[1] + (buf.get(1) & 0xFF), palette[(buf.get(3) & 0xFF) - 1]);
addVoxel(-offset[0] + (buf.get(0) & 0xFF) - 1, -(buf.get(2) & 0xFF),-offset[1] + (buf.get(1) & 0xFF), palette[(buf.get(3) & 0xFF) - 1]);
}

return true;
Expand Down
Loading

0 comments on commit 65bbcc5

Please sign in to comment.