15b539461dcc159bd89297443780d635ccc5e3564John Hoford/* 25b539461dcc159bd89297443780d635ccc5e3564John Hoford * Copyright (C) 2015 The Android Open Source Project 35b539461dcc159bd89297443780d635ccc5e3564John Hoford * 45b539461dcc159bd89297443780d635ccc5e3564John Hoford * Licensed under the Apache License, Version 2.0 (the "License"); 55b539461dcc159bd89297443780d635ccc5e3564John Hoford * you may not use this file except in compliance with the License. 65b539461dcc159bd89297443780d635ccc5e3564John Hoford * You may obtain a copy of the License at 75b539461dcc159bd89297443780d635ccc5e3564John Hoford * 85b539461dcc159bd89297443780d635ccc5e3564John Hoford * http://www.apache.org/licenses/LICENSE-2.0 95b539461dcc159bd89297443780d635ccc5e3564John Hoford * 105b539461dcc159bd89297443780d635ccc5e3564John Hoford * Unless required by applicable law or agreed to in writing, software 115b539461dcc159bd89297443780d635ccc5e3564John Hoford * distributed under the License is distributed on an "AS IS" BASIS, 125b539461dcc159bd89297443780d635ccc5e3564John Hoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b539461dcc159bd89297443780d635ccc5e3564John Hoford * See the License for the specific language governing permissions and 145b539461dcc159bd89297443780d635ccc5e3564John Hoford * limitations under the License. 155b539461dcc159bd89297443780d635ccc5e3564John Hoford */ 165b539461dcc159bd89297443780d635ccc5e3564John Hoford 175b539461dcc159bd89297443780d635ccc5e3564John Hofordpackage com.example.android.rs.vr.loaders; 185b539461dcc159bd89297443780d635ccc5e3564John Hoford 195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Allocation; 205b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.RenderScript; 215b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Type; 225b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.Log; 235b539461dcc159bd89297443780d635ccc5e3564John Hoford 245b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.ScriptC_bricked; 255b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.Volume; 265b539461dcc159bd89297443780d635ccc5e3564John Hoford 275b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.io.File; 285b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.io.FileInputStream; 295b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.nio.MappedByteBuffer; 305b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.nio.channels.FileChannel; 315b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Arrays; 325b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Comparator; 335b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.HashMap; 345b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Properties; 355b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Vector; 365b539461dcc159bd89297443780d635ccc5e3564John Hoford 375b539461dcc159bd89297443780d635ccc5e3564John Hoford/** 385b539461dcc159bd89297443780d635ccc5e3564John Hoford * Created by hoford on 2/2/15. 395b539461dcc159bd89297443780d635ccc5e3564John Hoford */ 405b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class LoaderRaw { 415b539461dcc159bd89297443780d635ccc5e3564John Hoford private static final String LOGTAG = "RawLoader"; 425b539461dcc159bd89297443780d635ccc5e3564John Hoford 435b539461dcc159bd89297443780d635ccc5e3564John Hoford /** 445b539461dcc159bd89297443780d635ccc5e3564John Hoford * This builds the volume based on a collection of raw image files 455b539461dcc159bd89297443780d635ccc5e3564John Hoford * @param rs The Renderscript context 465b539461dcc159bd89297443780d635ccc5e3564John Hoford * @param dir The directory containing the raw images 475b539461dcc159bd89297443780d635ccc5e3564John Hoford * @param prop property object containing information about the files 485b539461dcc159bd89297443780d635ccc5e3564John Hoford * @param listener To provide feedback 495b539461dcc159bd89297443780d635ccc5e3564John Hoford * @return The created volume 505b539461dcc159bd89297443780d635ccc5e3564John Hoford */ 515b539461dcc159bd89297443780d635ccc5e3564John Hoford public static Volume buildRSVolume(final RenderScript rs, File dir, Properties prop, 525b539461dcc159bd89297443780d635ccc5e3564John Hoford final VolumeLoader.ProgressListener listener) { 535b539461dcc159bd89297443780d635ccc5e3564John Hoford String[] dim = prop.getProperty("dim").split("x"); 545b539461dcc159bd89297443780d635ccc5e3564John Hoford Volume v = new Volume(); 555b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mDimx = Integer.parseInt(dim[0]); 565b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mDimy = Integer.parseInt(dim[1]); 575b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mDimz = Integer.parseInt(dim[2]); 585b539461dcc159bd89297443780d635ccc5e3564John Hoford String[] voxeldim = prop.getProperty("voxeldim").split(","); 595b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[0] = Float.parseFloat(voxeldim[0]); 605b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[1] = Float.parseFloat(voxeldim[1]); 615b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[2] = Float.parseFloat(voxeldim[2]); 625b539461dcc159bd89297443780d635ccc5e3564John Hoford Float min = Math.min(v.mVoxelDim[0], Math.min(v.mVoxelDim[1], v.mVoxelDim[2])); 635b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[0] /= min; 645b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[1] /= min; 655b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVoxelDim[2] /= min; 665b539461dcc159bd89297443780d635ccc5e3564John Hoford listener.progress(0, v.mDimz); 675b539461dcc159bd89297443780d635ccc5e3564John Hoford if (v.mDimz < 20) { 685b539461dcc159bd89297443780d635ccc5e3564John Hoford return null; 695b539461dcc159bd89297443780d635ccc5e3564John Hoford } 705b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, "Loading " + dir.getPath()); 715b539461dcc159bd89297443780d635ccc5e3564John Hoford File[] f = dir.listFiles(); 725b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, "dir contains " + f.length + " files"); 735b539461dcc159bd89297443780d635ccc5e3564John Hoford Arrays.sort(f, new Comparator<File>() { 745b539461dcc159bd89297443780d635ccc5e3564John Hoford 755b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 765b539461dcc159bd89297443780d635ccc5e3564John Hoford public int compare(File o1, File o2) { 775b539461dcc159bd89297443780d635ccc5e3564John Hoford 785b539461dcc159bd89297443780d635ccc5e3564John Hoford return Integer.decode(o1.getName()).compareTo(Integer.decode(o2.getName())); 795b539461dcc159bd89297443780d635ccc5e3564John Hoford } 805b539461dcc159bd89297443780d635ccc5e3564John Hoford }); 815b539461dcc159bd89297443780d635ccc5e3564John Hoford 825b539461dcc159bd89297443780d635ccc5e3564John Hoford int count = 0; 835b539461dcc159bd89297443780d635ccc5e3564John Hoford 845b539461dcc159bd89297443780d635ccc5e3564John Hoford 855b539461dcc159bd89297443780d635ccc5e3564John Hoford final Vector<File> toRun = new Vector<File>(); 865b539461dcc159bd89297443780d635ccc5e3564John Hoford final HashMap<File, Integer> fileMap = new HashMap<File, Integer>(); 875b539461dcc159bd89297443780d635ccc5e3564John Hoford for (int i = 0; i < f.length; i++) { 885b539461dcc159bd89297443780d635ccc5e3564John Hoford if (f[i].isDirectory()) { 895b539461dcc159bd89297443780d635ccc5e3564John Hoford continue; 905b539461dcc159bd89297443780d635ccc5e3564John Hoford } 915b539461dcc159bd89297443780d635ccc5e3564John Hoford 925b539461dcc159bd89297443780d635ccc5e3564John Hoford toRun.add(f[i]); 935b539461dcc159bd89297443780d635ccc5e3564John Hoford fileMap.put(f[i], count); 945b539461dcc159bd89297443780d635ccc5e3564John Hoford count++; 955b539461dcc159bd89297443780d635ccc5e3564John Hoford } 965b539461dcc159bd89297443780d635ccc5e3564John Hoford 975b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mDimz = count; 985b539461dcc159bd89297443780d635ccc5e3564John Hoford if (listener != null) { 995b539461dcc159bd89297443780d635ccc5e3564John Hoford listener.progress(0, v.mDimz); 1005b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1015b539461dcc159bd89297443780d635ccc5e3564John Hoford 1025b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVolumeAllocation = null; 1035b539461dcc159bd89297443780d635ccc5e3564John Hoford Allocation alloc_slice = null; 1045b539461dcc159bd89297443780d635ccc5e3564John Hoford ScriptC_bricked scriptC_bricked = new ScriptC_bricked(rs); 1055b539461dcc159bd89297443780d635ccc5e3564John Hoford FileInputStream inputStream; 1065b539461dcc159bd89297443780d635ccc5e3564John Hoford String pixel_spacing = null; 1075b539461dcc159bd89297443780d635ccc5e3564John Hoford String slice1_pos = null; 1085b539461dcc159bd89297443780d635ccc5e3564John Hoford String slice2_pos = null; 1095b539461dcc159bd89297443780d635ccc5e3564John Hoford boolean slice_spacing_set = false; 1105b539461dcc159bd89297443780d635ccc5e3564John Hoford int z = 0; 1115b539461dcc159bd89297443780d635ccc5e3564John Hoford for (File file : toRun) { 1125b539461dcc159bd89297443780d635ccc5e3564John Hoford try { 1135b539461dcc159bd89297443780d635ccc5e3564John Hoford inputStream = new FileInputStream(file); 1145b539461dcc159bd89297443780d635ccc5e3564John Hoford MappedByteBuffer mbb = inputStream.getChannel().map(FileChannel.MapMode.READ_ONLY, 1155b539461dcc159bd89297443780d635ccc5e3564John Hoford 0, v.mDimy * v.mDimx * 2); 1165b539461dcc159bd89297443780d635ccc5e3564John Hoford short[] slice = new short[v.mDimy * v.mDimx]; 1175b539461dcc159bd89297443780d635ccc5e3564John Hoford mbb.asShortBuffer().get(slice); 1185b539461dcc159bd89297443780d635ccc5e3564John Hoford inputStream.close(); 1195b539461dcc159bd89297443780d635ccc5e3564John Hoford mbb = null; 1205b539461dcc159bd89297443780d635ccc5e3564John Hoford if (v.mVolumeAllocation == null) { 1215b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, "make Volume " + z); 1225b539461dcc159bd89297443780d635ccc5e3564John Hoford Type.Builder b = new Type.Builder(rs, android.renderscript.Element.I16(rs)); 1235b539461dcc159bd89297443780d635ccc5e3564John Hoford b.setX(v.mDimx).setY(v.mDimy); 1245b539461dcc159bd89297443780d635ccc5e3564John Hoford alloc_slice = Allocation.createTyped(rs, b.create(), Allocation.USAGE_SCRIPT); 1255b539461dcc159bd89297443780d635ccc5e3564John Hoford b.setZ(v.mDimz); 1265b539461dcc159bd89297443780d635ccc5e3564John Hoford v.mVolumeAllocation = Allocation.createTyped(rs, 1275b539461dcc159bd89297443780d635ccc5e3564John Hoford b.create(), Allocation.USAGE_SCRIPT); 1285b539461dcc159bd89297443780d635ccc5e3564John Hoford scriptC_bricked.set_volume(v.mVolumeAllocation); 1295b539461dcc159bd89297443780d635ccc5e3564John Hoford 1305b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1315b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, "LOAD SLICE " + z); 1325b539461dcc159bd89297443780d635ccc5e3564John Hoford int size = v.mDimy * v.mDimx; 1335b539461dcc159bd89297443780d635ccc5e3564John Hoford alloc_slice.copyFromUnchecked(slice); 1345b539461dcc159bd89297443780d635ccc5e3564John Hoford scriptC_bricked.set_z(z); 1355b539461dcc159bd89297443780d635ccc5e3564John Hoford scriptC_bricked.forEach_copy(alloc_slice); 1365b539461dcc159bd89297443780d635ccc5e3564John Hoford z++; 1375b539461dcc159bd89297443780d635ccc5e3564John Hoford if (listener != null) { 1385b539461dcc159bd89297443780d635ccc5e3564John Hoford listener.progress(z, v.mDimz); 1395b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1405b539461dcc159bd89297443780d635ccc5e3564John Hoford 1415b539461dcc159bd89297443780d635ccc5e3564John Hoford } catch (Exception e) { 1425b539461dcc159bd89297443780d635ccc5e3564John Hoford e.printStackTrace(); 1435b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1445b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1455b539461dcc159bd89297443780d635ccc5e3564John Hoford rs.finish(); 1465b539461dcc159bd89297443780d635ccc5e3564John Hoford alloc_slice.destroy(); 1475b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG,"LOADING DONE ...."); 1485b539461dcc159bd89297443780d635ccc5e3564John Hoford 1495b539461dcc159bd89297443780d635ccc5e3564John Hoford scriptC_bricked.destroy(); 1505b539461dcc159bd89297443780d635ccc5e3564John Hoford return v; 1515b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1525b539461dcc159bd89297443780d635ccc5e3564John Hoford} 153