From 3fc86ec3d03bb4a0ae61e41d0cfba43595ecc23d Mon Sep 17 00:00:00 2001 From: Alex Sakhartchouk Date: Fri, 9 Dec 2011 12:38:26 -0800 Subject: Renaming some classes to clarify what is what. Change-Id: Iaee63ffd96bc269e46bc052d333ba1a5e848bd13 --- .../SceneGraph/AndroidManifest.xml | 2 +- .../src/com/android/scenegraph/ColladaScene.java | 4 +- .../src/com/android/scenegraph/SceneGraph.java | 115 ---- .../src/com/android/scenegraph/SceneGraphRS.java | 629 --------------------- .../src/com/android/scenegraph/SceneGraphView.java | 152 ----- .../src/com/android/scenegraph/TestApp.java | 115 ++++ .../src/com/android/scenegraph/TestAppRS.java | 629 +++++++++++++++++++++ .../src/com/android/scenegraph/TestAppView.java | 152 +++++ 8 files changed, 899 insertions(+), 899 deletions(-) delete mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraph.java delete mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphRS.java delete mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphView.java create mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestApp.java create mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java create mode 100644 tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppView.java (limited to 'tests/RenderScriptTests') diff --git a/tests/RenderScriptTests/SceneGraph/AndroidManifest.xml b/tests/RenderScriptTests/SceneGraph/AndroidManifest.xml index 4de8c2999e6a..7017d5a7b46d 100644 --- a/tests/RenderScriptTests/SceneGraph/AndroidManifest.xml +++ b/tests/RenderScriptTests/SceneGraph/AndroidManifest.xml @@ -4,7 +4,7 @@ - diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ColladaScene.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ColladaScene.java index 9394b66fc14a..3b4efa67e2ec 100644 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ColladaScene.java +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ColladaScene.java @@ -49,10 +49,10 @@ public class ColladaScene { private final boolean mLoadFromSD = true; private static String mSDCardPath = "sdcard/scenegraph/"; - SceneGraphRS mRenderer; + TestAppRS mRenderer; SceneLoadedCallback mCallback; - public ColladaScene(String name, SceneGraphRS renderer) { + public ColladaScene(String name, TestAppRS renderer) { modelName = name; mRenderer = renderer; } diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraph.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraph.java deleted file mode 100644 index cfb91f4eba88..000000000000 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraph.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2011 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.android.scenegraph; - -import android.renderscript.RSSurfaceView; -import android.renderscript.RenderScript; - -import android.app.Activity; -import android.content.res.Configuration; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.provider.Settings.System; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.ListView; -import android.view.MenuInflater; -import android.view.Window; -import android.net.Uri; - -import java.lang.Runtime; - -public class SceneGraph extends Activity { - - private SceneGraphView mView; - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - // Create our Preview view and set it as the content of our - // Activity - mView = new SceneGraphView(this); - setContentView(mView); - } - - @Override - protected void onResume() { - // Ideally a game should implement onResume() and onPause() - // to take appropriate action when the activity looses focus - super.onResume(); - mView.resume(); - } - - @Override - protected void onPause() { - // Ideally a game should implement onResume() and onPause() - // to take appropriate action when the activity looses focus - super.onPause(); - mView.pause(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.loader_menu, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle item selection - switch (item.getItemId()) { - case R.id.load_model: - loadModel(); - return true; - case R.id.use_blur: - mView.mRender.toggleBlur(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private static final int FIND_DAE_MODEL = 10; - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - if (requestCode == FIND_DAE_MODEL) { - Uri selectedImageUri = data.getData(); - Log.e("Selected Path: ", selectedImageUri.getPath()); - mView.mRender.loadModel(selectedImageUri.getPath()); - } - } - } - - public void loadModel() { - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_PICK); - intent.setClassName("com.android.scenegraph", - "com.android.scenegraph.FileSelector"); - startActivityForResult(intent, FIND_DAE_MODEL); - } - -} - diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphRS.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphRS.java deleted file mode 100644 index 04b4cd894a5a..000000000000 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphRS.java +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright (C) 2011 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.android.scenegraph; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.BufferedInputStream; -import java.io.Writer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Vector; - -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.AsyncTask; -import android.renderscript.*; -import android.renderscript.Allocation.MipmapControl; -import android.renderscript.Element.Builder; -import android.renderscript.Font.Style; -import android.renderscript.Program.TextureType; -import android.renderscript.ProgramStore.DepthFunc; -import android.util.Log; - -import com.android.scenegraph.SceneManager.SceneLoadedCallback; - -public class SceneGraphRS { - - private static String modelName = "orientation_test"; - private static String TAG = "SceneGraphRS"; - private final int STATE_LAST_FOCUS = 1; - private final boolean mLoadFromSD = true; - private static String mSDCardPath = "sdcard/scenegraph/"; - - int mWidth; - int mHeight; - int mRotation; - - boolean mUseBlur; - - SceneLoadedCallback mLoadedCallback = new SceneLoadedCallback() { - public void run() { - prepareToRender(mLoadedScene); - } - }; - - SceneManager mSceneManager; - - TouchHandler mTouchHandler; - - public SceneGraphRS() { - mUseBlur = false; - } - - void toggleBlur() { - mUseBlur = !mUseBlur; - - mActiveScene.clearRenderPasses(); - initRenderPasses(); - mActiveScene.initRenderPassRS(mRS, mSceneManager); - Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1"); - if (plane != null) { - plane.setVisible(mRS, !mUseBlur); - } - } - - public void init(RenderScriptGL rs, Resources res, int width, int height) { - mRS = rs; - mRes = res; - mWidth = width; - mHeight = height; - mRotation = 0; - - mTouchHandler = new TouchHandler(); - - mSceneManager = new SceneManager(); - mSceneManager.initRS(mRS, mRes, mWidth, mHeight); - - renderLoading(); - - new LoadingScreenLoaderTask().execute(); - - initRS(); - - mSceneManager.loadModel(modelName, mLoadedCallback); - } - - void loadModel(String path) { - String shortName = path.substring(path.lastIndexOf('/') + 1); - shortName = shortName.substring(0, shortName.lastIndexOf('.')); - mScript.set_gInitialized(false); - mActiveScene.destroyRS(mSceneManager); - mSceneManager.loadModel(shortName, mLoadedCallback); - } - - private Resources mRes; - private RenderScriptGL mRS; - private Sampler mSampler; - private ProgramStore mPSBackground; - private ProgramFragment mPFBackground; - private ProgramVertex mPVBackground; - private ProgramVertexFixedFunction.Constants mPVA; - - private ProgramFragment mPF_Paint; - private ProgramFragment mPF_Aluminum; - private ProgramFragment mPF_Plastic; - private ProgramFragment mPF_Diffuse; - private ProgramFragment mPF_BlurH; - private ProgramFragment mPF_BlurV; - private ProgramFragment mPF_SelectColor; - private ProgramFragment mPF_Texture; - ScriptField_FShaderParams_s mFsConst; - ScriptField_FBlurOffsets_s mFsBlurHConst; - ScriptField_FBlurOffsets_s mFsBlurVConst; - private ProgramVertex mPV_Paint; - ScriptField_VShaderParams_s mVsConst; - private ProgramVertex mPV_Blur; - - private Allocation mDefaultCube; - private Allocation mAllocPV; - private Allocation mEnvCube; - private Allocation mDiffCube; - - private Allocation mRenderTargetBlur0Color; - private Allocation mRenderTargetBlur0Depth; - private Allocation mRenderTargetBlur1Color; - private Allocation mRenderTargetBlur1Depth; - private Allocation mRenderTargetBlur2Color; - private Allocation mRenderTargetBlur2Depth; - - Scene mActiveScene; - - private ScriptC_scenegraph mScript; - - private class LoadingScreenLoaderTask extends AsyncTask { - Allocation robotTex; - Mesh robotMesh; - protected Boolean doInBackground(String... names) { - long start = System.currentTimeMillis(); - robotTex = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot, - MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, - Allocation.USAGE_GRAPHICS_TEXTURE); - - FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot); - FileA3D.IndexEntry entry = model.getIndexEntry(0); - if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) { - robotMesh = entry.getMesh(); - } - - initPFS(); - initPF(); - initPV(); - - long end = System.currentTimeMillis(); - Log.v("TIMER", "Loading load time: " + (end - start)); - return new Boolean(true); - } - - protected void onPostExecute(Boolean result) { - mScript.set_gRobotTex(robotTex); - mScript.set_gRobotMesh(robotMesh); - } - } - - - private class ImageLoaderTask extends AsyncTask { - Allocation tempEnv; - Allocation tempDiff; - - InputStream openStream(String name) { - InputStream is = null; - try { - if (!mLoadFromSD) { - is = mRes.getAssets().open(name); - } else { - File f = new File(mSDCardPath + name); - is = new BufferedInputStream(new FileInputStream(f)); - } - } catch (IOException e) { - Log.e("PAINTSHADERS", " Message: " + e.getMessage()); - } - return is; - } - - protected Boolean doInBackground(String... names) { - long start = System.currentTimeMillis(); - InputStream is = openStream("cube_env.png"); - if (is == null) { - return new Boolean(false); - } - - Bitmap b = BitmapFactory.decodeStream(is); - tempEnv = Allocation.createCubemapFromBitmap(mRS, - b, - MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, - Allocation.USAGE_GRAPHICS_TEXTURE); - - is = openStream("cube_spec.png"); - if (is == null) { - return new Boolean(false); - } - - b = BitmapFactory.decodeStream(is); - tempDiff = Allocation.createCubemapFromBitmap(mRS, - b, - MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, - Allocation.USAGE_GRAPHICS_TEXTURE); - long end = System.currentTimeMillis(); - Log.v("TIMER", "Image load time: " + (end - start)); - return new Boolean(true); - } - - protected void onPostExecute(Boolean result) { - mEnvCube = tempEnv; - mDiffCube = tempDiff; - - mPF_Paint.bindTexture(mEnvCube, 1); - mPF_Aluminum.bindTexture(mDiffCube, 1); - } - } - - public void onActionDown(float x, float y) { - mTouchHandler.onActionDown(x, y); - - //mSceneManager.getRenderLoop().invoke_pick((int)x, (int)y); - } - - public void onActionScale(float scale) { - mTouchHandler.onActionScale(scale); - } - - public void onActionMove(float x, float y) { - mTouchHandler.onActionMove(x, y); - } - - private void initPaintShaders() { - ProgramVertex.Builder vb = new ProgramVertex.Builder(mRS); - mVsConst = new ScriptField_VShaderParams_s(mRS, 1); - vb.addConstant(mVsConst.getAllocation().getType()); - vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); - vb.setShader(mRes, R.raw.shader2v); - mPV_Paint = vb.create(); - mPV_Paint.bindConstants(mVsConst.getAllocation(), 0); - - vb = new ProgramVertex.Builder(mRS); - vb.addConstant(mVsConst.getAllocation().getType()); - vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); - vb.setShader(mRes, R.raw.blur_vertex); - mPV_Blur = vb.create(); - mPV_Blur.bindConstants(mVsConst.getAllocation(), 0); - - ProgramFragment.Builder fb = new ProgramFragment.Builder(mRS); - mFsConst = new ScriptField_FShaderParams_s(mRS, 1); - fb.addConstant(mFsConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.paintf); - fb.addTexture(TextureType.TEXTURE_2D); - fb.addTexture(TextureType.TEXTURE_CUBE); - mPF_Paint = fb.create(); - - mPF_Paint.bindConstants(mFsConst.getAllocation(), 0); - mPF_Paint.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); - mPF_Paint.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.metal); - fb.addTexture(TextureType.TEXTURE_2D); - fb.addTexture(TextureType.TEXTURE_CUBE); - mPF_Aluminum = fb.create(); - - mPF_Aluminum.bindConstants(mFsConst.getAllocation(), 0); - mPF_Aluminum.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); - mPF_Aluminum.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.plastic); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_Plastic = fb.create(); - mPF_Plastic.bindConstants(mFsConst.getAllocation(), 0); - mPF_Plastic.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.diffuse); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_Diffuse = fb.create(); - mPF_Diffuse.bindConstants(mFsConst.getAllocation(), 0); - mPF_Diffuse.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.texture); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_Texture = fb.create(); - mPF_Texture.bindConstants(mFsConst.getAllocation(), 0); - mPF_Texture.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); - - mFsBlurHConst = new ScriptField_FBlurOffsets_s(mRS, 1); - float xAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getX(); - ScriptField_FBlurOffsets_s.Item item = new ScriptField_FBlurOffsets_s.Item(); - item.blurOffset0 = - xAdvance * 2.5f; - item.blurOffset1 = - xAdvance * 0.5f; - item.blurOffset2 = xAdvance * 1.5f; - item.blurOffset3 = xAdvance * 3.5f; - mFsBlurHConst.set(item, 0, true); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsBlurHConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.blur_h); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_BlurH = fb.create(); - mPF_BlurH.bindConstants(mFsBlurHConst.getAllocation(), 0); - mPF_BlurH.bindTexture(mRenderTargetBlur0Color, 0); - mPF_BlurH.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); - - mFsBlurVConst = new ScriptField_FBlurOffsets_s(mRS, 1); - float yAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getY(); - item.blurOffset0 = - yAdvance * 2.5f; - item.blurOffset1 = - yAdvance * 0.5f; - item.blurOffset2 = yAdvance * 1.5f; - item.blurOffset3 = yAdvance * 3.5f; - mFsBlurVConst.set(item, 0, true); - - fb = new ProgramFragment.Builder(mRS); - fb.addConstant(mFsBlurVConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.blur_v); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_BlurV = fb.create(); - mPF_BlurV.bindConstants(mFsBlurVConst.getAllocation(), 0); - mPF_BlurV.bindTexture(mRenderTargetBlur1Color, 0); - mPF_BlurV.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); - - fb = new ProgramFragment.Builder(mRS); - //fb.addConstant(mFsBlurVConst.getAllocation().getType()); - fb.setShader(mRes, R.raw.select_color); - fb.addTexture(TextureType.TEXTURE_2D); - mPF_SelectColor = fb.create(); - //mPF_SelectColor.bindConstants(mFsBlurVConst.getAllocation(), 0); - //mPF_SelectColor.bindTexture(mRenderTargetBlur1Color, 0); - mPF_SelectColor.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); - } - - private void initPFS() { - ProgramStore.Builder b = new ProgramStore.Builder(mRS); - - b.setDepthFunc(ProgramStore.DepthFunc.LESS); - b.setDitherEnabled(false); - b.setDepthMaskEnabled(true); - mPSBackground = b.create(); - - mScript.set_gPFSBackground(mPSBackground); - } - - private void initPF() { - Sampler.Builder bs = new Sampler.Builder(mRS); - bs.setMinification(Sampler.Value.LINEAR); - bs.setMagnification(Sampler.Value.LINEAR); - bs.setWrapS(Sampler.Value.CLAMP); - bs.setWrapT(Sampler.Value.CLAMP); - mSampler = bs.create(); - - ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS); - b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, - ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); - mPFBackground = b.create(); - mPFBackground.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); - - mScript.set_gPFBackground(mPFBackground); - } - - private void initPV() { - ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); - mPVBackground = pvb.create(); - - mPVA = new ProgramVertexFixedFunction.Constants(mRS); - ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA); - - mScript.set_gPVBackground(mPVBackground); - } - - void renderLoading() { - mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph); - mRS.bindRootScript(mScript); - } - - void initSceneRS() { - - } - - void createRenderTargets() { - Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS)); - b.setX(mWidth/8).setY(mHeight/8); - Type renderType = b.create(); - mRenderTargetBlur0Color = Allocation.createTyped(mRS, renderType, - Allocation.USAGE_GRAPHICS_TEXTURE | - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - mRenderTargetBlur1Color = Allocation.createTyped(mRS, renderType, - Allocation.USAGE_GRAPHICS_TEXTURE | - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - mRenderTargetBlur2Color = Allocation.createTyped(mRS, renderType, - Allocation.USAGE_GRAPHICS_TEXTURE | - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - - b = new Type.Builder(mRS, - Element.createPixel(mRS, Element.DataType.UNSIGNED_16, - Element.DataKind.PIXEL_DEPTH)); - b.setX(mWidth/8).setY(mHeight/8); - mRenderTargetBlur0Depth = Allocation.createTyped(mRS, - b.create(), - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - - mRenderTargetBlur1Depth = Allocation.createTyped(mRS, - b.create(), - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - mRenderTargetBlur2Depth = Allocation.createTyped(mRS, - b.create(), - Allocation.USAGE_GRAPHICS_RENDER_TARGET); - } - - ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) { - ProgramStore.Builder builder = new ProgramStore.Builder(rs); - builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); - builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE); - builder.setDitherEnabled(false); - builder.setDepthMaskEnabled(false); - return builder.create(); - } - - Drawable getDrawableQuad(String name, RenderState state) { - Drawable quad = new Drawable(); - quad.setTransform(new MatrixTransform()); - quad.setMesh(mSceneManager.getScreenAlignedQuad()); - quad.setName(name); - quad.setRenderState(state); - quad.setCullType(1); - return quad; - } - - void addBlurPasses() { - ArrayList allDraw = mActiveScene.getDrawables(); - int numDraw = allDraw.size(); - - RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, - BLEND_ADD_DEPTH_NONE(mRS), - ProgramRaster.CULL_NONE(mRS)); - - RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, - ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), - ProgramRaster.CULL_NONE(mRS)); - - RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, - ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), - ProgramRaster.CULL_NONE(mRS)); - - RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, - ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), - ProgramRaster.CULL_NONE(mRS)); - - RenderPass blurSourcePass = new RenderPass(); - blurSourcePass.setColorTarget(mRenderTargetBlur0Color); - blurSourcePass.setDepthTarget(mRenderTargetBlur0Depth); - blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); - blurSourcePass.setShouldClearColor(true); - blurSourcePass.setClearDepth(1.0f); - blurSourcePass.setShouldClearDepth(true); - blurSourcePass.setCamera(mActiveScene.getCameras().get(1)); - for (int i = 0; i < numDraw; i ++) { - blurSourcePass.appendDrawable((Drawable)allDraw.get(i)); - } - mActiveScene.appendRenderPass(blurSourcePass); - - RenderPass selectColorPass = new RenderPass(); - selectColorPass.setColorTarget(mRenderTargetBlur2Color); - selectColorPass.setDepthTarget(mRenderTargetBlur2Depth); - selectColorPass.setShouldClearColor(false); - selectColorPass.setShouldClearDepth(false); - selectColorPass.setCamera(mActiveScene.getCameras().get(1)); - // Make blur shape - Drawable quad = getDrawableQuad("ScreenAlignedQuadS", selectCol); - quad.updateTextures(mRS, mRenderTargetBlur0Color, 0); - selectColorPass.appendDrawable(quad); - mActiveScene.appendRenderPass(selectColorPass); - - RenderPass horizontalBlurPass = new RenderPass(); - horizontalBlurPass.setColorTarget(mRenderTargetBlur1Color); - horizontalBlurPass.setDepthTarget(mRenderTargetBlur1Depth); - horizontalBlurPass.setShouldClearColor(false); - horizontalBlurPass.setShouldClearDepth(false); - horizontalBlurPass.setCamera(mActiveScene.getCameras().get(1)); - // Make blur shape - quad = getDrawableQuad("ScreenAlignedQuadH", hBlur); - quad.updateTextures(mRS, mRenderTargetBlur2Color, 0); - horizontalBlurPass.appendDrawable(quad); - mActiveScene.appendRenderPass(horizontalBlurPass); - - RenderPass verticalBlurPass = new RenderPass(); - verticalBlurPass.setColorTarget(mRenderTargetBlur2Color); - verticalBlurPass.setDepthTarget(mRenderTargetBlur2Depth); - verticalBlurPass.setShouldClearColor(false); - verticalBlurPass.setShouldClearDepth(false); - verticalBlurPass.setCamera(mActiveScene.getCameras().get(1)); - // Make blur shape - quad = getDrawableQuad("ScreenAlignedQuadV", vBlur); - quad.updateTextures(mRS, mRenderTargetBlur1Color, 0); - verticalBlurPass.appendDrawable(quad); - mActiveScene.appendRenderPass(verticalBlurPass); - - } - - void initRenderPasses() { - ArrayList allDraw = mActiveScene.getDrawables(); - int numDraw = allDraw.size(); - - if (mUseBlur) { - addBlurPasses(); - } - - RenderPass mainPass = new RenderPass(); - mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); - mainPass.setShouldClearColor(true); - mainPass.setClearDepth(1.0f); - mainPass.setShouldClearDepth(true); - mainPass.setCamera(mActiveScene.getCameras().get(1)); - for (int i = 0; i < numDraw; i ++) { - mainPass.appendDrawable((Drawable)allDraw.get(i)); - } - mActiveScene.appendRenderPass(mainPass); - - if (mUseBlur) { - RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, - BLEND_ADD_DEPTH_NONE(mRS), - ProgramRaster.CULL_NONE(mRS)); - - RenderPass compositePass = new RenderPass(); - compositePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 0.0f)); - compositePass.setShouldClearColor(false); - compositePass.setClearDepth(1.0f); - compositePass.setShouldClearDepth(false); - compositePass.setCamera(mActiveScene.getCameras().get(1)); - Drawable quad = getDrawableQuad("ScreenAlignedQuad", drawTex); - quad.updateTextures(mRS, mRenderTargetBlur2Color, 0); - compositePass.appendDrawable(quad); - - mActiveScene.appendRenderPass(compositePass); - } - } - - public void prepareToRender(Scene s) { - mActiveScene = s; - RenderState plastic = new RenderState(mPV_Paint, mPF_Plastic, null, null); - RenderState diffuse = new RenderState(mPV_Paint, mPF_Diffuse, null, null); - RenderState paint = new RenderState(mPV_Paint, mPF_Paint, null, null); - RenderState aluminum = new RenderState(mPV_Paint, mPF_Aluminum, null, null); - RenderState glassTransp = new RenderState(mPV_Paint, - mPF_Paint, - ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS), - null); - - initRenderPasses(); - - mActiveScene.assignRenderState(plastic); - - mActiveScene.assignRenderStateToMaterial(diffuse, "lambert2$"); - - mActiveScene.assignRenderStateToMaterial(paint, "^#Paint"); - mActiveScene.assignRenderStateToMaterial(paint, "^#Carbon"); - mActiveScene.assignRenderStateToMaterial(paint, "^#Glass"); - mActiveScene.assignRenderStateToMaterial(paint, "^#MainGlass"); - - mActiveScene.assignRenderStateToMaterial(aluminum, "^#Metal"); - mActiveScene.assignRenderStateToMaterial(aluminum, "^#Brake"); - - mActiveScene.assignRenderStateToMaterial(glassTransp, "^#GlassLight"); - - Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1"); - if (plane != null) { - RenderState texState = new RenderState(mPV_Paint, mPF_Texture, null, null); - plane.setRenderState(texState); - plane.setVisible(mRS, !mUseBlur); - } - - mTouchHandler.init(mActiveScene); - - long start = System.currentTimeMillis(); - mActiveScene.initRS(mRS, mRes, mSceneManager); - long end = System.currentTimeMillis(); - Log.v("TIMER", "Scene init time: " + (end - start)); - - mScript.set_gInitialized(true); - } - - private void initRS() { - - createRenderTargets(); - initPaintShaders(); - new ImageLoaderTask().execute(); - - Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.defaultcube); - mDefaultCube = Allocation.createCubemapFromBitmap(mRS, b); - mPF_Paint.bindTexture(mDefaultCube, 1); - mPF_Aluminum.bindTexture(mDefaultCube, 1); - - ScriptC_render renderLoop = mSceneManager.getRenderLoop(); - renderLoop.bind_vConst(mVsConst); - renderLoop.bind_fConst(mFsConst); - - mScript.set_gRenderLoop(renderLoop); - Allocation dummyAlloc = Allocation.createSized(mRS, Element.I32(mRS), 1); - mScript.set_gDummyAlloc(dummyAlloc); - } -} diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphView.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphView.java deleted file mode 100644 index 0f2850176f88..000000000000 --- a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneGraphView.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2011 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.android.scenegraph; - -import java.io.Writer; -import java.util.ArrayList; -import java.util.concurrent.Semaphore; - -import android.renderscript.RSSurfaceView; -import android.renderscript.RenderScript; -import android.renderscript.RenderScriptGL; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Message; -import android.util.AttributeSet; -import android.util.Log; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; - -public class SceneGraphView extends RSSurfaceView { - - public SceneGraphView(Context context) { - super(context); - mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); - } - - private RenderScriptGL mRS; - SceneGraphRS mRender; - - private ScaleGestureDetector mScaleDetector; - private static final int INVALID_POINTER_ID = -1; - private int mActivePointerId = INVALID_POINTER_ID; - - public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - super.surfaceChanged(holder, format, w, h); - if (mRS == null) { - RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); - sc.setDepth(16, 24); - mRS = createRenderScriptGL(sc); - mRS.setSurface(holder, w, h); - mRender = new SceneGraphRS(); - mRender.init(mRS, getResources(), w, h); - } - } - - @Override - protected void onDetachedFromWindow() { - if (mRS != null) { - mRender = null; - mRS = null; - destroyRenderScriptGL(); - } - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) - { - // break point at here - // this method doesn't work when 'extends View' include 'extends ScrollView'. - return super.onKeyDown(keyCode, event); - } - - - @Override - public boolean onTouchEvent(MotionEvent ev) { - mScaleDetector.onTouchEvent(ev); - - boolean ret = false; - float x = ev.getX(); - float y = ev.getY(); - - final int action = ev.getAction(); - - switch (action & MotionEvent.ACTION_MASK) { - case MotionEvent.ACTION_DOWN: { - mRender.onActionDown(x, y); - mActivePointerId = ev.getPointerId(0); - ret = true; - break; - } - case MotionEvent.ACTION_MOVE: { - if (!mScaleDetector.isInProgress()) { - mRender.onActionMove(x, y); - } - mRender.onActionDown(x, y); - ret = true; - break; - } - - case MotionEvent.ACTION_UP: { - mActivePointerId = INVALID_POINTER_ID; - break; - } - - case MotionEvent.ACTION_CANCEL: { - mActivePointerId = INVALID_POINTER_ID; - break; - } - - case MotionEvent.ACTION_POINTER_UP: { - final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) - >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - final int pointerId = ev.getPointerId(pointerIndex); - if (pointerId == mActivePointerId) { - // This was our active pointer going up. Choose a new - // active pointer and adjust accordingly. - final int newPointerIndex = pointerIndex == 0 ? 1 : 0; - x = ev.getX(newPointerIndex); - y = ev.getY(newPointerIndex); - mRender.onActionDown(x, y); - mActivePointerId = ev.getPointerId(newPointerIndex); - } - break; - } - } - - return ret; - } - - private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { - @Override - public boolean onScale(ScaleGestureDetector detector) { - mRender.onActionScale(detector.getScaleFactor()); - return true; - } - } -} - - diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestApp.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestApp.java new file mode 100644 index 000000000000..ccdd2aa40ef6 --- /dev/null +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestApp.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2011 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.android.scenegraph; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScript; + +import android.app.Activity; +import android.content.res.Configuration; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.provider.Settings.System; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ListView; +import android.view.MenuInflater; +import android.view.Window; +import android.net.Uri; + +import java.lang.Runtime; + +public class TestApp extends Activity { + + private TestAppView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Create our Preview view and set it as the content of our + // Activity + mView = new TestAppView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mView.pause(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.loader_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle item selection + switch (item.getItemId()) { + case R.id.load_model: + loadModel(); + return true; + case R.id.use_blur: + mView.mRender.toggleBlur(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private static final int FIND_DAE_MODEL = 10; + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK) { + if (requestCode == FIND_DAE_MODEL) { + Uri selectedImageUri = data.getData(); + Log.e("Selected Path: ", selectedImageUri.getPath()); + mView.mRender.loadModel(selectedImageUri.getPath()); + } + } + } + + public void loadModel() { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_PICK); + intent.setClassName("com.android.scenegraph", + "com.android.scenegraph.FileSelector"); + startActivityForResult(intent, FIND_DAE_MODEL); + } + +} + diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java new file mode 100644 index 000000000000..c0a3b75cff40 --- /dev/null +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppRS.java @@ -0,0 +1,629 @@ +/* + * Copyright (C) 2011 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.android.scenegraph; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.AsyncTask; +import android.renderscript.*; +import android.renderscript.Allocation.MipmapControl; +import android.renderscript.Element.Builder; +import android.renderscript.Font.Style; +import android.renderscript.Program.TextureType; +import android.renderscript.ProgramStore.DepthFunc; +import android.util.Log; + +import com.android.scenegraph.SceneManager.SceneLoadedCallback; + +public class TestAppRS { + + private static String modelName = "orientation_test"; + private static String TAG = "TestAppRS"; + private final int STATE_LAST_FOCUS = 1; + private final boolean mLoadFromSD = true; + private static String mSDCardPath = "sdcard/scenegraph/"; + + int mWidth; + int mHeight; + int mRotation; + + boolean mUseBlur; + + SceneLoadedCallback mLoadedCallback = new SceneLoadedCallback() { + public void run() { + prepareToRender(mLoadedScene); + } + }; + + SceneManager mSceneManager; + + TouchHandler mTouchHandler; + + public TestAppRS() { + mUseBlur = false; + } + + void toggleBlur() { + mUseBlur = !mUseBlur; + + mActiveScene.clearRenderPasses(); + initRenderPasses(); + mActiveScene.initRenderPassRS(mRS, mSceneManager); + Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1"); + if (plane != null) { + plane.setVisible(mRS, !mUseBlur); + } + } + + public void init(RenderScriptGL rs, Resources res, int width, int height) { + mRS = rs; + mRes = res; + mWidth = width; + mHeight = height; + mRotation = 0; + + mTouchHandler = new TouchHandler(); + + mSceneManager = new SceneManager(); + mSceneManager.initRS(mRS, mRes, mWidth, mHeight); + + renderLoading(); + + new LoadingScreenLoaderTask().execute(); + + initRS(); + + mSceneManager.loadModel(modelName, mLoadedCallback); + } + + void loadModel(String path) { + String shortName = path.substring(path.lastIndexOf('/') + 1); + shortName = shortName.substring(0, shortName.lastIndexOf('.')); + mScript.set_gInitialized(false); + mActiveScene.destroyRS(mSceneManager); + mSceneManager.loadModel(shortName, mLoadedCallback); + } + + private Resources mRes; + private RenderScriptGL mRS; + private Sampler mSampler; + private ProgramStore mPSBackground; + private ProgramFragment mPFBackground; + private ProgramVertex mPVBackground; + private ProgramVertexFixedFunction.Constants mPVA; + + private ProgramFragment mPF_Paint; + private ProgramFragment mPF_Aluminum; + private ProgramFragment mPF_Plastic; + private ProgramFragment mPF_Diffuse; + private ProgramFragment mPF_BlurH; + private ProgramFragment mPF_BlurV; + private ProgramFragment mPF_SelectColor; + private ProgramFragment mPF_Texture; + ScriptField_FShaderParams_s mFsConst; + ScriptField_FBlurOffsets_s mFsBlurHConst; + ScriptField_FBlurOffsets_s mFsBlurVConst; + private ProgramVertex mPV_Paint; + ScriptField_VShaderParams_s mVsConst; + private ProgramVertex mPV_Blur; + + private Allocation mDefaultCube; + private Allocation mAllocPV; + private Allocation mEnvCube; + private Allocation mDiffCube; + + private Allocation mRenderTargetBlur0Color; + private Allocation mRenderTargetBlur0Depth; + private Allocation mRenderTargetBlur1Color; + private Allocation mRenderTargetBlur1Depth; + private Allocation mRenderTargetBlur2Color; + private Allocation mRenderTargetBlur2Depth; + + Scene mActiveScene; + + private ScriptC_scenegraph mScript; + + private class LoadingScreenLoaderTask extends AsyncTask { + Allocation robotTex; + Mesh robotMesh; + protected Boolean doInBackground(String... names) { + long start = System.currentTimeMillis(); + robotTex = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot, + MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, + Allocation.USAGE_GRAPHICS_TEXTURE); + + FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot); + FileA3D.IndexEntry entry = model.getIndexEntry(0); + if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) { + robotMesh = entry.getMesh(); + } + + initPFS(); + initPF(); + initPV(); + + long end = System.currentTimeMillis(); + Log.v("TIMER", "Loading load time: " + (end - start)); + return new Boolean(true); + } + + protected void onPostExecute(Boolean result) { + mScript.set_gRobotTex(robotTex); + mScript.set_gRobotMesh(robotMesh); + } + } + + + private class ImageLoaderTask extends AsyncTask { + Allocation tempEnv; + Allocation tempDiff; + + InputStream openStream(String name) { + InputStream is = null; + try { + if (!mLoadFromSD) { + is = mRes.getAssets().open(name); + } else { + File f = new File(mSDCardPath + name); + is = new BufferedInputStream(new FileInputStream(f)); + } + } catch (IOException e) { + Log.e("PAINTSHADERS", " Message: " + e.getMessage()); + } + return is; + } + + protected Boolean doInBackground(String... names) { + long start = System.currentTimeMillis(); + InputStream is = openStream("cube_env.png"); + if (is == null) { + return new Boolean(false); + } + + Bitmap b = BitmapFactory.decodeStream(is); + tempEnv = Allocation.createCubemapFromBitmap(mRS, + b, + MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, + Allocation.USAGE_GRAPHICS_TEXTURE); + + is = openStream("cube_spec.png"); + if (is == null) { + return new Boolean(false); + } + + b = BitmapFactory.decodeStream(is); + tempDiff = Allocation.createCubemapFromBitmap(mRS, + b, + MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, + Allocation.USAGE_GRAPHICS_TEXTURE); + long end = System.currentTimeMillis(); + Log.v("TIMER", "Image load time: " + (end - start)); + return new Boolean(true); + } + + protected void onPostExecute(Boolean result) { + mEnvCube = tempEnv; + mDiffCube = tempDiff; + + mPF_Paint.bindTexture(mEnvCube, 1); + mPF_Aluminum.bindTexture(mDiffCube, 1); + } + } + + public void onActionDown(float x, float y) { + mTouchHandler.onActionDown(x, y); + + //mSceneManager.getRenderLoop().invoke_pick((int)x, (int)y); + } + + public void onActionScale(float scale) { + mTouchHandler.onActionScale(scale); + } + + public void onActionMove(float x, float y) { + mTouchHandler.onActionMove(x, y); + } + + private void initPaintShaders() { + ProgramVertex.Builder vb = new ProgramVertex.Builder(mRS); + mVsConst = new ScriptField_VShaderParams_s(mRS, 1); + vb.addConstant(mVsConst.getAllocation().getType()); + vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); + vb.setShader(mRes, R.raw.shader2v); + mPV_Paint = vb.create(); + mPV_Paint.bindConstants(mVsConst.getAllocation(), 0); + + vb = new ProgramVertex.Builder(mRS); + vb.addConstant(mVsConst.getAllocation().getType()); + vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); + vb.setShader(mRes, R.raw.blur_vertex); + mPV_Blur = vb.create(); + mPV_Blur.bindConstants(mVsConst.getAllocation(), 0); + + ProgramFragment.Builder fb = new ProgramFragment.Builder(mRS); + mFsConst = new ScriptField_FShaderParams_s(mRS, 1); + fb.addConstant(mFsConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.paintf); + fb.addTexture(TextureType.TEXTURE_2D); + fb.addTexture(TextureType.TEXTURE_CUBE); + mPF_Paint = fb.create(); + + mPF_Paint.bindConstants(mFsConst.getAllocation(), 0); + mPF_Paint.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); + mPF_Paint.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.metal); + fb.addTexture(TextureType.TEXTURE_2D); + fb.addTexture(TextureType.TEXTURE_CUBE); + mPF_Aluminum = fb.create(); + + mPF_Aluminum.bindConstants(mFsConst.getAllocation(), 0); + mPF_Aluminum.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); + mPF_Aluminum.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.plastic); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_Plastic = fb.create(); + mPF_Plastic.bindConstants(mFsConst.getAllocation(), 0); + mPF_Plastic.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.diffuse); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_Diffuse = fb.create(); + mPF_Diffuse.bindConstants(mFsConst.getAllocation(), 0); + mPF_Diffuse.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.texture); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_Texture = fb.create(); + mPF_Texture.bindConstants(mFsConst.getAllocation(), 0); + mPF_Texture.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0); + + mFsBlurHConst = new ScriptField_FBlurOffsets_s(mRS, 1); + float xAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getX(); + ScriptField_FBlurOffsets_s.Item item = new ScriptField_FBlurOffsets_s.Item(); + item.blurOffset0 = - xAdvance * 2.5f; + item.blurOffset1 = - xAdvance * 0.5f; + item.blurOffset2 = xAdvance * 1.5f; + item.blurOffset3 = xAdvance * 3.5f; + mFsBlurHConst.set(item, 0, true); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsBlurHConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.blur_h); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_BlurH = fb.create(); + mPF_BlurH.bindConstants(mFsBlurHConst.getAllocation(), 0); + mPF_BlurH.bindTexture(mRenderTargetBlur0Color, 0); + mPF_BlurH.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); + + mFsBlurVConst = new ScriptField_FBlurOffsets_s(mRS, 1); + float yAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getY(); + item.blurOffset0 = - yAdvance * 2.5f; + item.blurOffset1 = - yAdvance * 0.5f; + item.blurOffset2 = yAdvance * 1.5f; + item.blurOffset3 = yAdvance * 3.5f; + mFsBlurVConst.set(item, 0, true); + + fb = new ProgramFragment.Builder(mRS); + fb.addConstant(mFsBlurVConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.blur_v); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_BlurV = fb.create(); + mPF_BlurV.bindConstants(mFsBlurVConst.getAllocation(), 0); + mPF_BlurV.bindTexture(mRenderTargetBlur1Color, 0); + mPF_BlurV.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); + + fb = new ProgramFragment.Builder(mRS); + //fb.addConstant(mFsBlurVConst.getAllocation().getType()); + fb.setShader(mRes, R.raw.select_color); + fb.addTexture(TextureType.TEXTURE_2D); + mPF_SelectColor = fb.create(); + //mPF_SelectColor.bindConstants(mFsBlurVConst.getAllocation(), 0); + //mPF_SelectColor.bindTexture(mRenderTargetBlur1Color, 0); + mPF_SelectColor.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); + } + + private void initPFS() { + ProgramStore.Builder b = new ProgramStore.Builder(mRS); + + b.setDepthFunc(ProgramStore.DepthFunc.LESS); + b.setDitherEnabled(false); + b.setDepthMaskEnabled(true); + mPSBackground = b.create(); + + mScript.set_gPFSBackground(mPSBackground); + } + + private void initPF() { + Sampler.Builder bs = new Sampler.Builder(mRS); + bs.setMinification(Sampler.Value.LINEAR); + bs.setMagnification(Sampler.Value.LINEAR); + bs.setWrapS(Sampler.Value.CLAMP); + bs.setWrapT(Sampler.Value.CLAMP); + mSampler = bs.create(); + + ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS); + b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, + ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); + mPFBackground = b.create(); + mPFBackground.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); + + mScript.set_gPFBackground(mPFBackground); + } + + private void initPV() { + ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); + mPVBackground = pvb.create(); + + mPVA = new ProgramVertexFixedFunction.Constants(mRS); + ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA); + + mScript.set_gPVBackground(mPVBackground); + } + + void renderLoading() { + mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph); + mRS.bindRootScript(mScript); + } + + void initSceneRS() { + + } + + void createRenderTargets() { + Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS)); + b.setX(mWidth/8).setY(mHeight/8); + Type renderType = b.create(); + mRenderTargetBlur0Color = Allocation.createTyped(mRS, renderType, + Allocation.USAGE_GRAPHICS_TEXTURE | + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + mRenderTargetBlur1Color = Allocation.createTyped(mRS, renderType, + Allocation.USAGE_GRAPHICS_TEXTURE | + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + mRenderTargetBlur2Color = Allocation.createTyped(mRS, renderType, + Allocation.USAGE_GRAPHICS_TEXTURE | + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + + b = new Type.Builder(mRS, + Element.createPixel(mRS, Element.DataType.UNSIGNED_16, + Element.DataKind.PIXEL_DEPTH)); + b.setX(mWidth/8).setY(mHeight/8); + mRenderTargetBlur0Depth = Allocation.createTyped(mRS, + b.create(), + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + + mRenderTargetBlur1Depth = Allocation.createTyped(mRS, + b.create(), + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + mRenderTargetBlur2Depth = Allocation.createTyped(mRS, + b.create(), + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + } + + ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) { + ProgramStore.Builder builder = new ProgramStore.Builder(rs); + builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); + builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE); + builder.setDitherEnabled(false); + builder.setDepthMaskEnabled(false); + return builder.create(); + } + + Drawable getDrawableQuad(String name, RenderState state) { + Drawable quad = new Drawable(); + quad.setTransform(new MatrixTransform()); + quad.setMesh(mSceneManager.getScreenAlignedQuad()); + quad.setName(name); + quad.setRenderState(state); + quad.setCullType(1); + return quad; + } + + void addBlurPasses() { + ArrayList allDraw = mActiveScene.getDrawables(); + int numDraw = allDraw.size(); + + RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, + BLEND_ADD_DEPTH_NONE(mRS), + ProgramRaster.CULL_NONE(mRS)); + + RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, + ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), + ProgramRaster.CULL_NONE(mRS)); + + RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, + ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), + ProgramRaster.CULL_NONE(mRS)); + + RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, + ProgramStore.BLEND_NONE_DEPTH_NONE(mRS), + ProgramRaster.CULL_NONE(mRS)); + + RenderPass blurSourcePass = new RenderPass(); + blurSourcePass.setColorTarget(mRenderTargetBlur0Color); + blurSourcePass.setDepthTarget(mRenderTargetBlur0Depth); + blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); + blurSourcePass.setShouldClearColor(true); + blurSourcePass.setClearDepth(1.0f); + blurSourcePass.setShouldClearDepth(true); + blurSourcePass.setCamera(mActiveScene.getCameras().get(1)); + for (int i = 0; i < numDraw; i ++) { + blurSourcePass.appendDrawable((Drawable)allDraw.get(i)); + } + mActiveScene.appendRenderPass(blurSourcePass); + + RenderPass selectColorPass = new RenderPass(); + selectColorPass.setColorTarget(mRenderTargetBlur2Color); + selectColorPass.setDepthTarget(mRenderTargetBlur2Depth); + selectColorPass.setShouldClearColor(false); + selectColorPass.setShouldClearDepth(false); + selectColorPass.setCamera(mActiveScene.getCameras().get(1)); + // Make blur shape + Drawable quad = getDrawableQuad("ScreenAlignedQuadS", selectCol); + quad.updateTextures(mRS, mRenderTargetBlur0Color, 0); + selectColorPass.appendDrawable(quad); + mActiveScene.appendRenderPass(selectColorPass); + + RenderPass horizontalBlurPass = new RenderPass(); + horizontalBlurPass.setColorTarget(mRenderTargetBlur1Color); + horizontalBlurPass.setDepthTarget(mRenderTargetBlur1Depth); + horizontalBlurPass.setShouldClearColor(false); + horizontalBlurPass.setShouldClearDepth(false); + horizontalBlurPass.setCamera(mActiveScene.getCameras().get(1)); + // Make blur shape + quad = getDrawableQuad("ScreenAlignedQuadH", hBlur); + quad.updateTextures(mRS, mRenderTargetBlur2Color, 0); + horizontalBlurPass.appendDrawable(quad); + mActiveScene.appendRenderPass(horizontalBlurPass); + + RenderPass verticalBlurPass = new RenderPass(); + verticalBlurPass.setColorTarget(mRenderTargetBlur2Color); + verticalBlurPass.setDepthTarget(mRenderTargetBlur2Depth); + verticalBlurPass.setShouldClearColor(false); + verticalBlurPass.setShouldClearDepth(false); + verticalBlurPass.setCamera(mActiveScene.getCameras().get(1)); + // Make blur shape + quad = getDrawableQuad("ScreenAlignedQuadV", vBlur); + quad.updateTextures(mRS, mRenderTargetBlur1Color, 0); + verticalBlurPass.appendDrawable(quad); + mActiveScene.appendRenderPass(verticalBlurPass); + + } + + void initRenderPasses() { + ArrayList allDraw = mActiveScene.getDrawables(); + int numDraw = allDraw.size(); + + if (mUseBlur) { + addBlurPasses(); + } + + RenderPass mainPass = new RenderPass(); + mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); + mainPass.setShouldClearColor(true); + mainPass.setClearDepth(1.0f); + mainPass.setShouldClearDepth(true); + mainPass.setCamera(mActiveScene.getCameras().get(1)); + for (int i = 0; i < numDraw; i ++) { + mainPass.appendDrawable((Drawable)allDraw.get(i)); + } + mActiveScene.appendRenderPass(mainPass); + + if (mUseBlur) { + RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, + BLEND_ADD_DEPTH_NONE(mRS), + ProgramRaster.CULL_NONE(mRS)); + + RenderPass compositePass = new RenderPass(); + compositePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 0.0f)); + compositePass.setShouldClearColor(false); + compositePass.setClearDepth(1.0f); + compositePass.setShouldClearDepth(false); + compositePass.setCamera(mActiveScene.getCameras().get(1)); + Drawable quad = getDrawableQuad("ScreenAlignedQuad", drawTex); + quad.updateTextures(mRS, mRenderTargetBlur2Color, 0); + compositePass.appendDrawable(quad); + + mActiveScene.appendRenderPass(compositePass); + } + } + + public void prepareToRender(Scene s) { + mActiveScene = s; + RenderState plastic = new RenderState(mPV_Paint, mPF_Plastic, null, null); + RenderState diffuse = new RenderState(mPV_Paint, mPF_Diffuse, null, null); + RenderState paint = new RenderState(mPV_Paint, mPF_Paint, null, null); + RenderState aluminum = new RenderState(mPV_Paint, mPF_Aluminum, null, null); + RenderState glassTransp = new RenderState(mPV_Paint, + mPF_Paint, + ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS), + null); + + initRenderPasses(); + + mActiveScene.assignRenderState(plastic); + + mActiveScene.assignRenderStateToMaterial(diffuse, "lambert2$"); + + mActiveScene.assignRenderStateToMaterial(paint, "^#Paint"); + mActiveScene.assignRenderStateToMaterial(paint, "^#Carbon"); + mActiveScene.assignRenderStateToMaterial(paint, "^#Glass"); + mActiveScene.assignRenderStateToMaterial(paint, "^#MainGlass"); + + mActiveScene.assignRenderStateToMaterial(aluminum, "^#Metal"); + mActiveScene.assignRenderStateToMaterial(aluminum, "^#Brake"); + + mActiveScene.assignRenderStateToMaterial(glassTransp, "^#GlassLight"); + + Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1"); + if (plane != null) { + RenderState texState = new RenderState(mPV_Paint, mPF_Texture, null, null); + plane.setRenderState(texState); + plane.setVisible(mRS, !mUseBlur); + } + + mTouchHandler.init(mActiveScene); + + long start = System.currentTimeMillis(); + mActiveScene.initRS(mRS, mRes, mSceneManager); + long end = System.currentTimeMillis(); + Log.v("TIMER", "Scene init time: " + (end - start)); + + mScript.set_gInitialized(true); + } + + private void initRS() { + + createRenderTargets(); + initPaintShaders(); + new ImageLoaderTask().execute(); + + Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.defaultcube); + mDefaultCube = Allocation.createCubemapFromBitmap(mRS, b); + mPF_Paint.bindTexture(mDefaultCube, 1); + mPF_Aluminum.bindTexture(mDefaultCube, 1); + + ScriptC_render renderLoop = mSceneManager.getRenderLoop(); + renderLoop.bind_vConst(mVsConst); + renderLoop.bind_fConst(mFsConst); + + mScript.set_gRenderLoop(renderLoop); + Allocation dummyAlloc = Allocation.createSized(mRS, Element.I32(mRS), 1); + mScript.set_gDummyAlloc(dummyAlloc); + } +} diff --git a/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppView.java b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppView.java new file mode 100644 index 000000000000..cefa3e651860 --- /dev/null +++ b/tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/TestAppView.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2011 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.android.scenegraph; + +import java.io.Writer; +import java.util.ArrayList; +import java.util.concurrent.Semaphore; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScript; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; + +public class TestAppView extends RSSurfaceView { + + public TestAppView(Context context) { + super(context); + mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); + } + + private RenderScriptGL mRS; + TestAppRS mRender; + + private ScaleGestureDetector mScaleDetector; + private static final int INVALID_POINTER_ID = -1; + private int mActivePointerId = INVALID_POINTER_ID; + + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + super.surfaceChanged(holder, format, w, h); + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + sc.setDepth(16, 24); + mRS = createRenderScriptGL(sc); + mRS.setSurface(holder, w, h); + mRender = new TestAppRS(); + mRender.init(mRS, getResources(), w, h); + } + } + + @Override + protected void onDetachedFromWindow() { + if (mRS != null) { + mRender = null; + mRS = null; + destroyRenderScriptGL(); + } + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) + { + // break point at here + // this method doesn't work when 'extends View' include 'extends ScrollView'. + return super.onKeyDown(keyCode, event); + } + + + @Override + public boolean onTouchEvent(MotionEvent ev) { + mScaleDetector.onTouchEvent(ev); + + boolean ret = false; + float x = ev.getX(); + float y = ev.getY(); + + final int action = ev.getAction(); + + switch (action & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: { + mRender.onActionDown(x, y); + mActivePointerId = ev.getPointerId(0); + ret = true; + break; + } + case MotionEvent.ACTION_MOVE: { + if (!mScaleDetector.isInProgress()) { + mRender.onActionMove(x, y); + } + mRender.onActionDown(x, y); + ret = true; + break; + } + + case MotionEvent.ACTION_UP: { + mActivePointerId = INVALID_POINTER_ID; + break; + } + + case MotionEvent.ACTION_CANCEL: { + mActivePointerId = INVALID_POINTER_ID; + break; + } + + case MotionEvent.ACTION_POINTER_UP: { + final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) + >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; + final int pointerId = ev.getPointerId(pointerIndex); + if (pointerId == mActivePointerId) { + // This was our active pointer going up. Choose a new + // active pointer and adjust accordingly. + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + x = ev.getX(newPointerIndex); + y = ev.getY(newPointerIndex); + mRender.onActionDown(x, y); + mActivePointerId = ev.getPointerId(newPointerIndex); + } + break; + } + } + + return ret; + } + + private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + @Override + public boolean onScale(ScaleGestureDetector detector) { + mRender.onActionScale(detector.getScaleFactor()); + return true; + } + } +} + + -- cgit v1.2.3-59-g8ed1b