1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.rs.vr.engine; 18 19 import android.renderscript.Matrix3f; 20 import android.renderscript.Matrix4f; 21 import android.renderscript.Script; 22 import android.renderscript.ScriptIntrinsicResize; 23 import android.util.Log; 24 25 import java.text.DecimalFormat; 26 27 public class VrPipline1 extends BasicPipeline { 28 private static final String LOGTAG = "VrPipline1"; 29 30 float[] mMatrixBuffer = new float[16]; 31 ScriptC_vr scriptC_vr; 32 ScriptIntrinsicResize script_resize; 33 Script.LaunchOptions options = new Script.LaunchOptions(); 34 35 @Override initBuffers(VrState state)36 public void initBuffers(VrState state) { 37 super.initBuffers(state); 38 } 39 40 static DecimalFormat df = new DecimalFormat(" ##0.000"); 41 trim(double d)42 private static String trim(double d) { 43 String s = df.format(d); 44 return s.substring(s.length() - 6); 45 } 46 trim(float[] d)47 private static String trim(float[] d) { 48 String ret = ""; 49 for (int i = 0; i < d.length; i++) { 50 ret += ((i == 0) ? "[ " : " , ") + trim(d[i]); 51 } 52 return ret + ("]"); 53 } 54 creatOpacityAllocation(VrState state)55 private void creatOpacityAllocation(VrState state) { 56 scriptC_vr.set_opacity(state.mMaterial.getOpacityAllocation(state.mRs)); 57 } 58 creatColorMapAllocation(VrState state)59 private void creatColorMapAllocation(VrState state) { 60 scriptC_vr.set_color_map(state.mMaterial.getColorMapAllocation(state.mRs)); 61 } 62 63 @Override setupTriangles(VrState state)64 public void setupTriangles(VrState state) { 65 super.setupTriangles(state); 66 if (mCancel){ 67 return; 68 } 69 Matrix m = state.mTransform.getMatrix(Transform.SCREEN_SPACE, Transform.VOLUME_SPACE); 70 m.getAsFloats(mMatrixBuffer); 71 Matrix4f matrix4f = new Matrix4f(mMatrixBuffer); 72 if (scriptC_vr == null) { 73 scriptC_vr = new ScriptC_vr(state.mRs); 74 } 75 if (script_resize == null) { 76 script_resize = ScriptIntrinsicResize.create(state.mRs); 77 } 78 scriptC_vr.set_matrix4(matrix4f); 79 for (int i = 0; i < 9; i++) { 80 int x = i % 3; 81 int y = i / 3; 82 mMatrixBuffer[i] = mMatrixBuffer[x + y * 4]; 83 } 84 Matrix3f matrix3f = new Matrix3f(mMatrixBuffer); 85 scriptC_vr.set_matrix3(matrix3f); 86 creatColorMapAllocation(state); 87 creatOpacityAllocation(state); 88 scriptC_vr.invoke_setup_vectors(); 89 } 90 91 @Override raycast(VrState state)92 public void raycast(VrState state) { 93 if (mCancel){ 94 return; 95 } 96 scriptC_vr.set_volume(state.mVolume.mVolumeAllocation); 97 scriptC_vr.set_bricks(state.mRsMask.mBrick_allocation); 98 scriptC_vr.set_brick_dimx(state.mRsMask.m_bricks_dimx); 99 scriptC_vr.set_brick_dimy(state.mRsMask.m_bricks_dimy); 100 if (mCancel){ 101 return; 102 } 103 scriptC_vr.set_zbuff(state.mzRangeFullAllocation); 104 if (mCancel){ 105 return; 106 } 107 if (state.mImgWidth*state.mImgHeight < 512*512) { 108 scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation); 109 } else { 110 int blocks = state.mImgWidth*state.mImgHeight/(256*256); 111 for (int i = 0; i < blocks; i++) { 112 options.setX(0,state.mImgWidth); 113 options.setY(i*state.mImgHeight/blocks, (i+1)*state.mImgHeight/blocks); 114 scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation, options); 115 state.mRs.finish(); 116 if (mCancel){ 117 Log.v(LOGTAG, "cancel"); 118 return; 119 } 120 } 121 122 123 } 124 125 } 126 127 } 128