| /* |
| * 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; |
| } |
| } |
| |
| |
| } |
| |
| } |
| |
| } |