/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.rs.vr.engine; import android.renderscript.Matrix3f; import android.renderscript.Matrix4f; import android.renderscript.Script; import android.renderscript.ScriptIntrinsicResize; import android.util.Log; import java.text.DecimalFormat; public class VrPipline1 extends BasicPipeline { private static final String LOGTAG = "VrPipline1"; float[] mMatrixBuffer = new float[16]; ScriptC_vr scriptC_vr; ScriptIntrinsicResize script_resize; Script.LaunchOptions options = new Script.LaunchOptions(); @Override public void initBuffers(VrState state) { super.initBuffers(state); } static DecimalFormat df = new DecimalFormat(" ##0.000"); private static String trim(double d) { String s = df.format(d); return s.substring(s.length() - 6); } private static String trim(float[] d) { String ret = ""; for (int i = 0; i < d.length; i++) { ret += ((i == 0) ? "[ " : " , ") + trim(d[i]); } return ret + ("]"); } private void creatOpacityAllocation(VrState state) { scriptC_vr.set_opacity(state.mMaterial.getOpacityAllocation(state.mRs)); } private void creatColorMapAllocation(VrState state) { scriptC_vr.set_color_map(state.mMaterial.getColorMapAllocation(state.mRs)); } @Override public void setupTriangles(VrState state) { super.setupTriangles(state); if (mCancel){ return; } Matrix m = state.mTransform.getMatrix(Transform.SCREEN_SPACE, Transform.VOLUME_SPACE); m.getAsFloats(mMatrixBuffer); Matrix4f matrix4f = new Matrix4f(mMatrixBuffer); if (scriptC_vr == null) { scriptC_vr = new ScriptC_vr(state.mRs); } if (script_resize == null) { script_resize = ScriptIntrinsicResize.create(state.mRs); } scriptC_vr.set_matrix4(matrix4f); for (int i = 0; i < 9; i++) { int x = i % 3; int y = i / 3; mMatrixBuffer[i] = mMatrixBuffer[x + y * 4]; } Matrix3f matrix3f = new Matrix3f(mMatrixBuffer); scriptC_vr.set_matrix3(matrix3f); creatColorMapAllocation(state); creatOpacityAllocation(state); scriptC_vr.invoke_setup_vectors(); } @Override public void raycast(VrState state) { if (mCancel){ return; } scriptC_vr.set_volume(state.mVolume.mVolumeAllocation); scriptC_vr.set_bricks(state.mRsMask.mBrick_allocation); scriptC_vr.set_brick_dimx(state.mRsMask.m_bricks_dimx); scriptC_vr.set_brick_dimy(state.mRsMask.m_bricks_dimy); if (mCancel){ return; } scriptC_vr.set_zbuff(state.mzRangeFullAllocation); if (mCancel){ return; } if (state.mImgWidth*state.mImgHeight < 512*512) { scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation); } else { int blocks = state.mImgWidth*state.mImgHeight/(256*256); for (int i = 0; i < blocks; i++) { options.setX(0,state.mImgWidth); options.setY(i*state.mImgHeight/blocks, (i+1)*state.mImgHeight/blocks); scriptC_vr.forEach_draw_z_buffer(state.mzRangeFullAllocation, state.mScrAllocation, options); state.mRs.finish(); if (mCancel){ Log.v(LOGTAG, "cancel"); return; } } } } }