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.engine;
185b539461dcc159bd89297443780d635ccc5e3564John Hoford
195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Matrix3f;
205b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Matrix4f;
215b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Script;
225b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.ScriptIntrinsicResize;
235b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.Log;
245b539461dcc159bd89297443780d635ccc5e3564John Hoford
255b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.text.DecimalFormat;
265b539461dcc159bd89297443780d635ccc5e3564John Hoford
275b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class VrPipline1 extends BasicPipeline {
285b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static final String LOGTAG = "VrPipline1";
295b539461dcc159bd89297443780d635ccc5e3564John Hoford
305b539461dcc159bd89297443780d635ccc5e3564John Hoford    float[] mMatrixBuffer = new float[16];
315b539461dcc159bd89297443780d635ccc5e3564John Hoford    ScriptC_vr scriptC_vr;
325b539461dcc159bd89297443780d635ccc5e3564John Hoford    ScriptIntrinsicResize script_resize;
335b539461dcc159bd89297443780d635ccc5e3564John Hoford    Script.LaunchOptions options = new Script.LaunchOptions();
345b539461dcc159bd89297443780d635ccc5e3564John Hoford
355b539461dcc159bd89297443780d635ccc5e3564John Hoford    @Override
365b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void initBuffers(VrState state) {
375b539461dcc159bd89297443780d635ccc5e3564John Hoford        super.initBuffers(state);
385b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
395b539461dcc159bd89297443780d635ccc5e3564John Hoford
405b539461dcc159bd89297443780d635ccc5e3564John Hoford    static DecimalFormat df = new DecimalFormat("      ##0.000");
415b539461dcc159bd89297443780d635ccc5e3564John Hoford
425b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static String trim(double d) {
435b539461dcc159bd89297443780d635ccc5e3564John Hoford        String s = df.format(d);
445b539461dcc159bd89297443780d635ccc5e3564John Hoford        return s.substring(s.length() - 6);
455b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
465b539461dcc159bd89297443780d635ccc5e3564John Hoford
475b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static String trim(float[] d) {
485b539461dcc159bd89297443780d635ccc5e3564John Hoford        String ret = "";
495b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < d.length; i++) {
505b539461dcc159bd89297443780d635ccc5e3564John Hoford            ret += ((i == 0) ? "[ " : " , ") + trim(d[i]);
515b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
525b539461dcc159bd89297443780d635ccc5e3564John Hoford        return ret + ("]");
535b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
545b539461dcc159bd89297443780d635ccc5e3564John Hoford
555b539461dcc159bd89297443780d635ccc5e3564John Hoford    private void creatOpacityAllocation(VrState state) {
565b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_opacity(state.mMaterial.getOpacityAllocation(state.mRs));
575b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
585b539461dcc159bd89297443780d635ccc5e3564John Hoford
595b539461dcc159bd89297443780d635ccc5e3564John Hoford    private void creatColorMapAllocation(VrState state) {
605b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_color_map(state.mMaterial.getColorMapAllocation(state.mRs));
615b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
625b539461dcc159bd89297443780d635ccc5e3564John Hoford
635b539461dcc159bd89297443780d635ccc5e3564John Hoford    @Override
645b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setupTriangles(VrState state) {
655b539461dcc159bd89297443780d635ccc5e3564John Hoford        super.setupTriangles(state);
665b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mCancel){
675b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
685b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
695b539461dcc159bd89297443780d635ccc5e3564John Hoford        Matrix m = state.mTransform.getMatrix(Transform.SCREEN_SPACE, Transform.VOLUME_SPACE);
705b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.getAsFloats(mMatrixBuffer);
715b539461dcc159bd89297443780d635ccc5e3564John Hoford        Matrix4f matrix4f = new Matrix4f(mMatrixBuffer);
725b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (scriptC_vr == null) {
735b539461dcc159bd89297443780d635ccc5e3564John Hoford            scriptC_vr = new ScriptC_vr(state.mRs);
745b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
755b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (script_resize == null) {
765b539461dcc159bd89297443780d635ccc5e3564John Hoford            script_resize = ScriptIntrinsicResize.create(state.mRs);
775b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
785b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_matrix4(matrix4f);
795b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < 9; i++) {
805b539461dcc159bd89297443780d635ccc5e3564John Hoford            int x = i % 3;
815b539461dcc159bd89297443780d635ccc5e3564John Hoford            int y = i / 3;
825b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMatrixBuffer[i] = mMatrixBuffer[x + y * 4];
835b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
845b539461dcc159bd89297443780d635ccc5e3564John Hoford        Matrix3f matrix3f = new Matrix3f(mMatrixBuffer);
855b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_matrix3(matrix3f);
865b539461dcc159bd89297443780d635ccc5e3564John Hoford        creatColorMapAllocation(state);
875b539461dcc159bd89297443780d635ccc5e3564John Hoford        creatOpacityAllocation(state);
885b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.invoke_setup_vectors();
895b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
905b539461dcc159bd89297443780d635ccc5e3564John Hoford
915b539461dcc159bd89297443780d635ccc5e3564John Hoford    @Override
925b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void raycast(VrState state) {
935b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mCancel){
945b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
955b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
965b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_volume(state.mVolume.mVolumeAllocation);
975b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_bricks(state.mRsMask.mBrick_allocation);
985b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_brick_dimx(state.mRsMask.m_bricks_dimx);
995b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_brick_dimy(state.mRsMask.m_bricks_dimy);
1005b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mCancel){
1015b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
1025b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1035b539461dcc159bd89297443780d635ccc5e3564John Hoford        scriptC_vr.set_zbuff(state.mzRangeFullAllocation);
1045b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mCancel){
1055b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
1065b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1075b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (state.mImgWidth*state.mImgHeight < 512*512) {
1085b539461dcc159bd89297443780d635ccc5e3564John Hoford            scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation);
1095b539461dcc159bd89297443780d635ccc5e3564John Hoford        } else {
1105b539461dcc159bd89297443780d635ccc5e3564John Hoford            int blocks = state.mImgWidth*state.mImgHeight/(256*256);
1115b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int i = 0; i < blocks; i++) {
1125b539461dcc159bd89297443780d635ccc5e3564John Hoford                options.setX(0,state.mImgWidth);
1135b539461dcc159bd89297443780d635ccc5e3564John Hoford                options.setY(i*state.mImgHeight/blocks, (i+1)*state.mImgHeight/blocks);
1145b539461dcc159bd89297443780d635ccc5e3564John Hoford                scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation, options);
1155b539461dcc159bd89297443780d635ccc5e3564John Hoford                state.mRs.finish();
1165b539461dcc159bd89297443780d635ccc5e3564John Hoford                if (mCancel){
1175b539461dcc159bd89297443780d635ccc5e3564John Hoford                    Log.v(LOGTAG, "cancel");
1185b539461dcc159bd89297443780d635ccc5e3564John Hoford                    return;
1195b539461dcc159bd89297443780d635ccc5e3564John Hoford                }
1205b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
1215b539461dcc159bd89297443780d635ccc5e3564John Hoford
1225b539461dcc159bd89297443780d635ccc5e3564John Hoford
1235b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1245b539461dcc159bd89297443780d635ccc5e3564John Hoford
1255b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1265b539461dcc159bd89297443780d635ccc5e3564John Hoford
1275b539461dcc159bd89297443780d635ccc5e3564John Hoford}
128