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