/*
* 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.graphics.SurfaceTexture;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.Type;
import android.util.Log;
import android.view.Surface;
public class VrState {
private static final String LOGTAG = "VrState";
public RenderScript mRs;
public Volume mVolume;
public RsBrickedBitMask mRsMask;
public Material mMaterial = new Material();
public Cube mCubeVolume;
public TriData mCubeScreen;
public int mImgWidth;
public int mImgHeight;
Allocation mzRangeFullAllocation;
public Allocation mScrAllocation; // the RGB data out
public Transform mTransform = new Transform();
public void clone(VrState src) {
mRs = src.mRs;
mVolume = src.mVolume;
mRsMask = src.mRsMask;
mMaterial = src.mMaterial;
if (mCubeVolume == null) {
mCubeVolume = new Cube();
}
mCubeVolume.clone(src.mCubeVolume);
mCubeScreen = new TriData(src.mCubeScreen);
mImgWidth = src.mImgWidth;
mImgHeight = src.mImgHeight;
mzRangeFullAllocation = src.mzRangeFullAllocation;
mScrAllocation = src.mScrAllocation;
mTransform.clone(src.mTransform);
}
public void createOutputAllocation(Surface surface, int w, int h) {
if (mRs == null) {
return;
}
if (mScrAllocation == null
|| mScrAllocation.getType().getX() != w
|| mScrAllocation.getType().getY() != h) {
if (mScrAllocation != null) {
mScrAllocation.destroy();
mScrAllocation = null;
Log.v(LOGTAG, " destroy mScrAllocation");
}
Type.Builder b = new Type.Builder(mRs, Element.RGBA_8888(mRs));
b.setX(w);
b.setY(h);
mScrAllocation = Allocation.createTyped(mRs, b.create(),
Allocation.USAGE_IO_OUTPUT | Allocation.USAGE_SCRIPT);
}
mScrAllocation.setSurface(surface);
if (mzRangeFullAllocation == null
|| mzRangeFullAllocation.getType().getX() != w
|| mzRangeFullAllocation.getType().getY() != h) {
if (mzRangeFullAllocation != null) {
mzRangeFullAllocation.destroy();
mzRangeFullAllocation = null;
Log.v(LOGTAG, " destroy mzRangeFullAllocation");
}
Type.Builder b = new Type.Builder(mRs, Element.F32_2(mRs));
b.setX(w);
b.setY(h);
mzRangeFullAllocation = Allocation.createTyped(mRs, b.create());
}
mImgWidth = w;
mImgHeight = h;
mTransform.setScreenDim(w, h);
}
public void copyData(VrState src) {
mRs = src.mRs;
mVolume = src.mVolume;
mRsMask = src.mRsMask;
mMaterial = src.mMaterial;
if (mCubeVolume == null) {
mCubeVolume = new Cube();
}
mCubeVolume.clone(src.mCubeVolume);
mCubeScreen = new TriData(src.mCubeScreen); // TODO I should not have to do new each time
mImgWidth = src.mImgWidth;
mImgHeight = src.mImgHeight;
mTransform.clone(src.mTransform);
}
public void destroyScreenAllocation() {
Log.v(LOGTAG, "destroyScreenAllocation");
if (mScrAllocation != null) {
mScrAllocation.destroy();
mScrAllocation = null;
}
}
}