Revision 5ceea148
Added by Leszek Koltunski almost 7 years ago
| src/main/AndroidManifest.xml | ||
|---|---|---|
| 29 | 29 | <activity android:name=".differentbitmaps.DifferentBitmapsActivity" /> | 
| 30 | 30 | <activity android:name=".effectqueue.EffectQueueActivity" /> | 
| 31 | 31 | <activity android:name=".check.CheckActivity" /> | 
| 32 |         <activity android:name=".bitmaptree.BitmapTreeActivity" />
 | |
| 32 |         <activity android:name=".objecttree.ObjectTreeActivity" />
 | |
| 33 | 33 | <activity android:name=".starwars.StarWarsActivity" /> | 
| 34 | 34 | <activity android:name=".olimpic.OlimpicActivity" /> | 
| 35 | 35 | <activity android:name=".cubes.CubesActivity" /> | 
| src/main/java/org/distorted/examples/TableOfContents.java | ||
|---|---|---|
| 49 | 49 | import org.distorted.examples.effectqueue.EffectQueueActivity; | 
| 50 | 50 | import org.distorted.examples.check.CheckActivity; | 
| 51 | 51 | import org.distorted.examples.bean.BeanActivity; | 
| 52 | import org.distorted.examples.bitmaptree.BitmapTreeActivity;
 | |
| 52 | import org.distorted.examples.objecttree.ObjectTreeActivity;
 | |
| 53 | 53 | import org.distorted.examples.starwars.StarWarsActivity; | 
| 54 | 54 | import org.distorted.examples.cubes.CubesActivity; | 
| 55 | 55 | import org.distorted.examples.quaternion.QuaternionActivity; | 
| ... | ... | |
| 220 | 220 |    {
 | 
| 221 | 221 | final Map<String, Object> item = new HashMap<>(); | 
| 222 | 222 | item.put(ITEM_IMAGE, R.drawable.icon_example_fbo); | 
| 223 |       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_bitmaptree));
 | |
| 224 |       item.put(ITEM_SUBTITLE, getText(R.string.example_bitmaptree_subtitle));
 | |
| 223 |       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_objecttree));
 | |
| 224 |       item.put(ITEM_SUBTITLE, getText(R.string.example_objecttree_subtitle));
 | |
| 225 | 225 | data.add(item); | 
| 226 |       activityMapping.put(i++, BitmapTreeActivity.class);
 | |
| 226 |       activityMapping.put(i++, ObjectTreeActivity.class);
 | |
| 227 | 227 | } | 
| 228 | 228 |  | 
| 229 | 229 |    {
 | 
| ... | ... | |
| 381 | 381 |  | 
| 382 | 382 |    {
 | 
| 383 | 383 | final Map<String, Object> item = new HashMap<>(); | 
| 384 |       item.put(ITEM_IMAGE, R.drawable.icon_example_wip);
 | |
| 384 |       item.put(ITEM_IMAGE, R.drawable.icon_example_glow);
 | |
| 385 | 385 | item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_glow)); | 
| 386 | 386 | item.put(ITEM_SUBTITLE, getText(R.string.example_glow_subtitle)); | 
| 387 | 387 | data.add(item); | 
| src/main/java/org/distorted/examples/bitmaptree/BitmapTreeActivity.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.bitmaptree; | |
| 21 |  | |
| 22 | import org.distorted.examples.R; | |
| 23 | import org.distorted.library.main.Distorted; | |
| 24 |  | |
| 25 | import android.app.Activity; | |
| 26 | import android.os.Bundle; | |
| 27 | import android.view.View; | |
| 28 |  | |
| 29 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 30 |  | |
| 31 | public class BitmapTreeActivity extends Activity | |
| 32 | {
 | |
| 33 | private boolean mDepth; | |
| 34 |  | |
| 35 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 36 |  | |
| 37 | @Override | |
| 38 | protected void onCreate(Bundle savedState) | |
| 39 |       {
 | |
| 40 | super.onCreate(savedState); | |
| 41 | setContentView(R.layout.bitmaptreelayout); | |
| 42 |  | |
| 43 | if( savedState==null ) | |
| 44 |         {
 | |
| 45 | mDepth = true; | |
| 46 | } | |
| 47 | } | |
| 48 |  | |
| 49 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 50 |  | |
| 51 | @Override | |
| 52 | protected void onPause() | |
| 53 |       {
 | |
| 54 | BitmapTreeSurfaceView view = (BitmapTreeSurfaceView) this.findViewById(R.id.bitmaptreeSurfaceView); | |
| 55 |  | |
| 56 | view.onPause(); | |
| 57 | Distorted.onPause(); | |
| 58 | super.onPause(); | |
| 59 | } | |
| 60 |  | |
| 61 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 62 |  | |
| 63 | @Override | |
| 64 | protected void onResume() | |
| 65 |       {
 | |
| 66 | BitmapTreeSurfaceView view = (BitmapTreeSurfaceView) this.findViewById(R.id.bitmaptreeSurfaceView); | |
| 67 |  | |
| 68 | super.onResume(); | |
| 69 | view.onResume(); | |
| 70 | } | |
| 71 |  | |
| 72 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 73 |  | |
| 74 | @Override | |
| 75 | protected void onDestroy() | |
| 76 |       {
 | |
| 77 | Distorted.onDestroy(); | |
| 78 | super.onDestroy(); | |
| 79 | } | |
| 80 |  | |
| 81 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 82 |  | |
| 83 | public void DepthYes(View v) | |
| 84 |       {
 | |
| 85 | BitmapTreeSurfaceView view = (BitmapTreeSurfaceView) this.findViewById(R.id.bitmaptreeSurfaceView); | |
| 86 | BitmapTreeRenderer renderer = view.getRenderer(); | |
| 87 |  | |
| 88 | renderer.setDepth(true); | |
| 89 | mDepth = true; | |
| 90 | } | |
| 91 |  | |
| 92 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 93 |  | |
| 94 | public void DepthNo(View v) | |
| 95 |       {
 | |
| 96 | BitmapTreeSurfaceView view = (BitmapTreeSurfaceView) this.findViewById(R.id.bitmaptreeSurfaceView); | |
| 97 | BitmapTreeRenderer renderer = view.getRenderer(); | |
| 98 |  | |
| 99 | renderer.setDepth(false); | |
| 100 | mDepth = false; | |
| 101 | } | |
| 102 |  | |
| 103 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 104 |  | |
| 105 | @Override | |
| 106 | public void onSaveInstanceState(Bundle savedInstanceState) | |
| 107 |       {
 | |
| 108 | super.onSaveInstanceState(savedInstanceState); | |
| 109 |       savedInstanceState.putBoolean("depth", mDepth);
 | |
| 110 | } | |
| 111 |  | |
| 112 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 113 |  | |
| 114 | @Override | |
| 115 | public void onRestoreInstanceState(Bundle savedInstanceState) | |
| 116 |       {
 | |
| 117 | super.onRestoreInstanceState(savedInstanceState); | |
| 118 |  | |
| 119 |       mDepth = savedInstanceState.getBoolean("depth");
 | |
| 120 |  | |
| 121 | if(mDepth) DepthYes(null); | |
| 122 | else DepthNo(null); | |
| 123 | } | |
| 124 |  | |
| 125 | } | |
| src/main/java/org/distorted/examples/bitmaptree/BitmapTreeRenderer.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.bitmaptree; | |
| 21 |  | |
| 22 | import java.io.IOException; | |
| 23 | import java.io.InputStream; | |
| 24 |  | |
| 25 | import javax.microedition.khronos.egl.EGLConfig; | |
| 26 | import javax.microedition.khronos.opengles.GL10; | |
| 27 |  | |
| 28 | import org.distorted.examples.R; | |
| 29 |  | |
| 30 | import org.distorted.library.effect.FragmentEffectChroma; | |
| 31 | import org.distorted.library.effect.MatrixEffectMove; | |
| 32 | import org.distorted.library.effect.MatrixEffectRotate; | |
| 33 | import org.distorted.library.effect.MatrixEffectScale; | |
| 34 | import org.distorted.library.effect.VertexEffectSink; | |
| 35 | import org.distorted.library.main.DistortedEffects; | |
| 36 | import org.distorted.library.main.DistortedFramebuffer; | |
| 37 | import org.distorted.library.main.DistortedNode; | |
| 38 | import org.distorted.library.main.DistortedScreen; | |
| 39 | import org.distorted.library.main.Distorted; | |
| 40 | import org.distorted.library.mesh.MeshCubes; | |
| 41 | import org.distorted.library.mesh.MeshFlat; | |
| 42 | import org.distorted.library.main.DistortedTexture; | |
| 43 | import org.distorted.library.type.Dynamic; | |
| 44 | import org.distorted.library.type.Dynamic1D; | |
| 45 | import org.distorted.library.type.Static1D; | |
| 46 | import org.distorted.library.type.Static3D; | |
| 47 |  | |
| 48 | import android.graphics.Bitmap; | |
| 49 | import android.graphics.BitmapFactory; | |
| 50 | import android.opengl.GLES31; | |
| 51 | import android.opengl.GLSurfaceView; | |
| 52 |  | |
| 53 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 54 |  | |
| 55 | class BitmapTreeRenderer implements GLSurfaceView.Renderer | |
| 56 | {
 | |
| 57 | private GLSurfaceView mView; | |
| 58 | private DistortedEffects mEffects; | |
| 59 | private DistortedTexture mLisaTexture, mGridTexture; | |
| 60 | private DistortedScreen mScreen; | |
| 61 | private DistortedNode mRoot; | |
| 62 | private MeshFlat mMeshFlat; | |
| 63 | private MeshCubes mMeshCubes; | |
| 64 | private int lisaHeight, lisaWidth; | |
| 65 | private boolean mDepth; | |
| 66 | private Static3D mScale, mMove; | |
| 67 |  | |
| 68 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 69 |  | |
| 70 | BitmapTreeRenderer(GLSurfaceView v) | |
| 71 |       {
 | |
| 72 | mView = v; | |
| 73 | mDepth = true; | |
| 74 | mScale = new Static3D(1,1,1); | |
| 75 | mMove = new Static3D(0,0,0); | |
| 76 | Dynamic1D chromaDyn = new Dynamic1D(5000,0.0f); | |
| 77 | chromaDyn.add(new Static1D(0.0f)); | |
| 78 | chromaDyn.add(new Static1D(0.8f)); | |
| 79 |  | |
| 80 | mEffects= new DistortedEffects(); | |
| 81 | mEffects.apply(new MatrixEffectMove(mMove)); | |
| 82 | mEffects.apply(new MatrixEffectScale(mScale)); | |
| 83 | mEffects.apply(new FragmentEffectChroma(chromaDyn, new Static3D(0,0,1))); | |
| 84 |  | |
| 85 | mScreen = new DistortedScreen(); | |
| 86 | } | |
| 87 |  | |
| 88 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 89 |  | |
| 90 | private void setDepthPriv() | |
| 91 |      {
 | |
| 92 | if( mDepth ) mRoot.glEnable (GLES31.GL_DEPTH_TEST); | |
| 93 | else mRoot.glDisable(GLES31.GL_DEPTH_TEST); | |
| 94 |  | |
| 95 | mRoot.glDepthMask(mDepth); | |
| 96 |  | |
| 97 | // we can also, to save memory, delete/recreate | |
| 98 | // the depth buffer each time. This is optional. | |
| 99 | mRoot.enableDepthStencil(mDepth ? DistortedFramebuffer.DEPTH_NO_STENCIL:DistortedFramebuffer.NO_DEPTH_NO_STENCIL); | |
| 100 | } | |
| 101 |  | |
| 102 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 103 |  | |
| 104 | void setDepth(boolean depth) | |
| 105 |       {
 | |
| 106 | mDepth = depth; | |
| 107 | if( mRoot!=null ) setDepthPriv(); | |
| 108 | } | |
| 109 |  | |
| 110 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 111 |  | |
| 112 | public void onDrawFrame(GL10 glUnused) | |
| 113 |       {
 | |
| 114 | mScreen.render(System.currentTimeMillis()); | |
| 115 | } | |
| 116 |  | |
| 117 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 118 |  | |
| 119 | public void onSurfaceChanged(GL10 glUnused, int width, int height) | |
| 120 |       { 
 | |
| 121 | if( (float)lisaHeight/lisaWidth > (float)height/width ) | |
| 122 |         {
 | |
| 123 | int w = (height*lisaWidth)/lisaHeight; | |
| 124 | float factor = (float)height/lisaHeight; | |
| 125 |  | |
| 126 | mMove.set((width-w)/2,0,0); | |
| 127 | mScale.set(factor,factor,factor); | |
| 128 | } | |
| 129 | else | |
| 130 |         {
 | |
| 131 | int h = (width*lisaHeight)/lisaWidth; | |
| 132 | float factor = (float)width/lisaWidth; | |
| 133 |  | |
| 134 | mMove.set(0,(height-h)/2,0); | |
| 135 | mScale.set(factor,factor,factor); | |
| 136 | } | |
| 137 |  | |
| 138 | mScreen.resize(width, height); | |
| 139 | } | |
| 140 |  | |
| 141 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 142 |  | |
| 143 | public void onSurfaceCreated(GL10 glUnused, EGLConfig config) | |
| 144 |       {
 | |
| 145 | // TODO | |
| 146 | // This appears to be needed in case we create the app anew with NO DEPTH | |
| 147 | // (i.e. we set 'no depth' and then rotate screen). Investigate. | |
| 148 | GLES31.glEnable(GLES31.GL_CULL_FACE); | |
| 149 | GLES31.glCullFace(GLES31.GL_BACK); | |
| 150 | GLES31.glFrontFace(GLES31.GL_CW); | |
| 151 |  | |
| 152 | InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.monalisa); | |
| 153 | InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.grid); | |
| 154 |  | |
| 155 | Bitmap bitmap1, bitmap2; | |
| 156 |  | |
| 157 | try | |
| 158 |         {
 | |
| 159 | bitmap1 = BitmapFactory.decodeStream(is1); | |
| 160 | bitmap2 = BitmapFactory.decodeStream(is2); | |
| 161 | } | |
| 162 | finally | |
| 163 |         {
 | |
| 164 | try | |
| 165 |           {
 | |
| 166 | is1.close(); | |
| 167 | is2.close(); | |
| 168 | } | |
| 169 |         catch(IOException e) { }
 | |
| 170 | } | |
| 171 |  | |
| 172 | lisaWidth = bitmap1.getWidth(); | |
| 173 | lisaHeight = bitmap1.getHeight(); | |
| 174 | int gridWidth = bitmap2.getWidth(); | |
| 175 | int gridHeight= bitmap2.getHeight(); | |
| 176 |  | |
| 177 | if( mLisaTexture==null ) mLisaTexture = new DistortedTexture(lisaWidth,lisaHeight); | |
| 178 | if( mGridTexture==null ) mGridTexture = new DistortedTexture(gridWidth,gridHeight); | |
| 179 | mLisaTexture.setTexture(bitmap1); | |
| 180 | mGridTexture.setTexture(bitmap2); | |
| 181 | DistortedEffects gridEffects = new DistortedEffects(); | |
| 182 |  | |
| 183 | final int GRID = 10; | |
| 184 |  | |
| 185 | if( mMeshFlat==null ) mMeshFlat = new MeshFlat(1,1); | |
| 186 | if( mMeshCubes==null) mMeshCubes= new MeshCubes(GRID,GRID,1); | |
| 187 |  | |
| 188 | mRoot = new DistortedNode(mLisaTexture, mEffects, mMeshFlat); | |
| 189 | mRoot.attach(mGridTexture,gridEffects,mMeshCubes); | |
| 190 |  | |
| 191 | setDepthPriv(); | |
| 192 |  | |
| 193 | mScreen.detachAll(); | |
| 194 | mScreen.attach(mRoot); | |
| 195 |  | |
| 196 | float factor = lisaWidth/(2.0f*gridWidth); | |
| 197 | MatrixEffectMove move = new MatrixEffectMove( new Static3D((lisaWidth-factor*gridWidth)/2,(lisaHeight-factor*gridHeight)/2, gridWidth/(2.0f*GRID))); | |
| 198 | MatrixEffectScale scale = new MatrixEffectScale( new Static3D(factor,factor,factor) ); | |
| 199 | gridEffects.apply(move); | |
| 200 | gridEffects.apply(scale); | |
| 201 |  | |
| 202 | Dynamic1D rotDyn = new Dynamic1D(12000,0.0f); | |
| 203 | rotDyn.add(new Static1D( 0)); | |
| 204 | rotDyn.add(new Static1D(360)); | |
| 205 | rotDyn.setMode(Dynamic.MODE_JUMP); | |
| 206 | MatrixEffectRotate rotate = new MatrixEffectRotate(rotDyn, new Static3D(1,0,0), new Static3D(gridWidth/2,gridHeight/2,gridWidth/(2*GRID))); | |
| 207 | gridEffects.apply(rotate); | |
| 208 |  | |
| 209 | Dynamic1D sinkDyn = new Dynamic1D(3000,0.0f); | |
| 210 | sinkDyn.add(new Static1D(1.0f)); | |
| 211 | sinkDyn.add(new Static1D(0.3f)); | |
| 212 | VertexEffectSink sink = new VertexEffectSink(sinkDyn, new Static3D(gridWidth/2,gridHeight/2, 0)); | |
| 213 | gridEffects.apply(sink); | |
| 214 |  | |
| 215 | VertexEffectSink.enable(); | |
| 216 | FragmentEffectChroma.enable(); | |
| 217 |  | |
| 218 | try | |
| 219 |         {
 | |
| 220 | Distorted.onCreate(mView.getContext()); | |
| 221 | } | |
| 222 | catch(Exception ex) | |
| 223 |         {
 | |
| 224 |         android.util.Log.e("BitmapTree", ex.getMessage() );
 | |
| 225 | } | |
| 226 | } | |
| 227 | } | |
| src/main/java/org/distorted/examples/bitmaptree/BitmapTreeSurfaceView.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.bitmaptree; | |
| 21 |  | |
| 22 | import android.app.ActivityManager; | |
| 23 | import android.content.Context; | |
| 24 | import android.content.pm.ConfigurationInfo; | |
| 25 | import android.opengl.GLSurfaceView; | |
| 26 | import android.util.AttributeSet; | |
| 27 |  | |
| 28 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 29 |  | |
| 30 | class BitmapTreeSurfaceView extends GLSurfaceView | |
| 31 | {
 | |
| 32 | private BitmapTreeRenderer mRenderer; | |
| 33 |  | |
| 34 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 35 |  | |
| 36 | public BitmapTreeSurfaceView(Context context, AttributeSet attrs) | |
| 37 |       {
 | |
| 38 | super(context, attrs); | |
| 39 |  | |
| 40 | if(!isInEditMode()) | |
| 41 |         {
 | |
| 42 | mRenderer = new BitmapTreeRenderer(this); | |
| 43 | final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); | |
| 44 | final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); | |
| 45 | setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 ); | |
| 46 | setRenderer(mRenderer); | |
| 47 | } | |
| 48 | } | |
| 49 |  | |
| 50 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 51 |  | |
| 52 | public BitmapTreeRenderer getRenderer() | |
| 53 |       {
 | |
| 54 | return mRenderer; | |
| 55 | } | |
| 56 | } | |
| 57 |  | |
| src/main/java/org/distorted/examples/objecttree/ObjectTreeActivity.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.objecttree; | |
| 21 |  | |
| 22 | import org.distorted.examples.R; | |
| 23 | import org.distorted.library.main.Distorted; | |
| 24 |  | |
| 25 | import android.app.Activity; | |
| 26 | import android.os.Bundle; | |
| 27 | import android.view.View; | |
| 28 |  | |
| 29 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 30 |  | |
| 31 | public class ObjectTreeActivity extends Activity | |
| 32 | {
 | |
| 33 | private boolean mDepth; | |
| 34 |  | |
| 35 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 36 |  | |
| 37 | @Override | |
| 38 | protected void onCreate(Bundle savedState) | |
| 39 |       {
 | |
| 40 | super.onCreate(savedState); | |
| 41 | setContentView(R.layout.objecttreelayout); | |
| 42 |  | |
| 43 | if( savedState==null ) | |
| 44 |         {
 | |
| 45 | mDepth = true; | |
| 46 | } | |
| 47 | } | |
| 48 |  | |
| 49 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 50 |  | |
| 51 | @Override | |
| 52 | protected void onPause() | |
| 53 |       {
 | |
| 54 | ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView); | |
| 55 |  | |
| 56 | view.onPause(); | |
| 57 | Distorted.onPause(); | |
| 58 | super.onPause(); | |
| 59 | } | |
| 60 |  | |
| 61 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 62 |  | |
| 63 | @Override | |
| 64 | protected void onResume() | |
| 65 |       {
 | |
| 66 | ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView); | |
| 67 |  | |
| 68 | super.onResume(); | |
| 69 | view.onResume(); | |
| 70 | } | |
| 71 |  | |
| 72 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 73 |  | |
| 74 | @Override | |
| 75 | protected void onDestroy() | |
| 76 |       {
 | |
| 77 | Distorted.onDestroy(); | |
| 78 | super.onDestroy(); | |
| 79 | } | |
| 80 |  | |
| 81 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 82 |  | |
| 83 | public void DepthYes(View v) | |
| 84 |       {
 | |
| 85 | ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView); | |
| 86 | ObjectTreeRenderer renderer = view.getRenderer(); | |
| 87 |  | |
| 88 | renderer.setDepth(true); | |
| 89 | mDepth = true; | |
| 90 | } | |
| 91 |  | |
| 92 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 93 |  | |
| 94 | public void DepthNo(View v) | |
| 95 |       {
 | |
| 96 | ObjectTreeSurfaceView view = (ObjectTreeSurfaceView) this.findViewById(R.id.objecttreeSurfaceView); | |
| 97 | ObjectTreeRenderer renderer = view.getRenderer(); | |
| 98 |  | |
| 99 | renderer.setDepth(false); | |
| 100 | mDepth = false; | |
| 101 | } | |
| 102 |  | |
| 103 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 104 |  | |
| 105 | @Override | |
| 106 | public void onSaveInstanceState(Bundle savedInstanceState) | |
| 107 |       {
 | |
| 108 | super.onSaveInstanceState(savedInstanceState); | |
| 109 |       savedInstanceState.putBoolean("depth", mDepth);
 | |
| 110 | } | |
| 111 |  | |
| 112 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 113 |  | |
| 114 | @Override | |
| 115 | public void onRestoreInstanceState(Bundle savedInstanceState) | |
| 116 |       {
 | |
| 117 | super.onRestoreInstanceState(savedInstanceState); | |
| 118 |  | |
| 119 |       mDepth = savedInstanceState.getBoolean("depth");
 | |
| 120 |  | |
| 121 | if(mDepth) DepthYes(null); | |
| 122 | else DepthNo(null); | |
| 123 | } | |
| 124 |  | |
| 125 | } | |
| src/main/java/org/distorted/examples/objecttree/ObjectTreeRenderer.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.objecttree; | |
| 21 |  | |
| 22 | import java.io.IOException; | |
| 23 | import java.io.InputStream; | |
| 24 |  | |
| 25 | import javax.microedition.khronos.egl.EGLConfig; | |
| 26 | import javax.microedition.khronos.opengles.GL10; | |
| 27 |  | |
| 28 | import org.distorted.examples.R; | |
| 29 |  | |
| 30 | import org.distorted.library.effect.FragmentEffectChroma; | |
| 31 | import org.distorted.library.effect.MatrixEffectMove; | |
| 32 | import org.distorted.library.effect.MatrixEffectRotate; | |
| 33 | import org.distorted.library.effect.MatrixEffectScale; | |
| 34 | import org.distorted.library.effect.VertexEffectSink; | |
| 35 | import org.distorted.library.main.DistortedEffects; | |
| 36 | import org.distorted.library.main.DistortedFramebuffer; | |
| 37 | import org.distorted.library.main.DistortedNode; | |
| 38 | import org.distorted.library.main.DistortedScreen; | |
| 39 | import org.distorted.library.main.Distorted; | |
| 40 | import org.distorted.library.mesh.MeshCubes; | |
| 41 | import org.distorted.library.mesh.MeshFlat; | |
| 42 | import org.distorted.library.main.DistortedTexture; | |
| 43 | import org.distorted.library.type.Dynamic; | |
| 44 | import org.distorted.library.type.Dynamic1D; | |
| 45 | import org.distorted.library.type.Static1D; | |
| 46 | import org.distorted.library.type.Static3D; | |
| 47 |  | |
| 48 | import android.graphics.Bitmap; | |
| 49 | import android.graphics.BitmapFactory; | |
| 50 | import android.opengl.GLES31; | |
| 51 | import android.opengl.GLSurfaceView; | |
| 52 |  | |
| 53 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 54 |  | |
| 55 | class ObjectTreeRenderer implements GLSurfaceView.Renderer | |
| 56 | {
 | |
| 57 | private GLSurfaceView mView; | |
| 58 | private DistortedEffects mEffects; | |
| 59 | private DistortedTexture mLisaTexture, mGridTexture; | |
| 60 | private DistortedScreen mScreen; | |
| 61 | private DistortedNode mRoot; | |
| 62 | private MeshFlat mMeshFlat; | |
| 63 | private MeshCubes mMeshCubes; | |
| 64 | private int lisaHeight, lisaWidth; | |
| 65 | private boolean mDepth; | |
| 66 | private Static3D mScale, mMove; | |
| 67 |  | |
| 68 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 69 |  | |
| 70 | ObjectTreeRenderer(GLSurfaceView v) | |
| 71 |       {
 | |
| 72 | mView = v; | |
| 73 | mDepth = true; | |
| 74 | mScale = new Static3D(1,1,1); | |
| 75 | mMove = new Static3D(0,0,0); | |
| 76 | Dynamic1D chromaDyn = new Dynamic1D(5000,0.0f); | |
| 77 | chromaDyn.add(new Static1D(0.0f)); | |
| 78 | chromaDyn.add(new Static1D(0.8f)); | |
| 79 |  | |
| 80 | mEffects= new DistortedEffects(); | |
| 81 | mEffects.apply(new MatrixEffectMove(mMove)); | |
| 82 | mEffects.apply(new MatrixEffectScale(mScale)); | |
| 83 | mEffects.apply(new FragmentEffectChroma(chromaDyn, new Static3D(0,0,1))); | |
| 84 |  | |
| 85 | mScreen = new DistortedScreen(); | |
| 86 | } | |
| 87 |  | |
| 88 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 89 |  | |
| 90 | private void setDepthPriv() | |
| 91 |      {
 | |
| 92 | if( mDepth ) mRoot.glEnable (GLES31.GL_DEPTH_TEST); | |
| 93 | else mRoot.glDisable(GLES31.GL_DEPTH_TEST); | |
| 94 |  | |
| 95 | mRoot.glDepthMask(mDepth); | |
| 96 |  | |
| 97 | // we can also, to save memory, delete/recreate | |
| 98 | // the depth buffer each time. This is optional. | |
| 99 | mRoot.enableDepthStencil(mDepth ? DistortedFramebuffer.DEPTH_NO_STENCIL:DistortedFramebuffer.NO_DEPTH_NO_STENCIL); | |
| 100 | } | |
| 101 |  | |
| 102 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 103 |  | |
| 104 | void setDepth(boolean depth) | |
| 105 |       {
 | |
| 106 | mDepth = depth; | |
| 107 | if( mRoot!=null ) setDepthPriv(); | |
| 108 | } | |
| 109 |  | |
| 110 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 111 |  | |
| 112 | public void onDrawFrame(GL10 glUnused) | |
| 113 |       {
 | |
| 114 | mScreen.render(System.currentTimeMillis()); | |
| 115 | } | |
| 116 |  | |
| 117 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 118 |  | |
| 119 | public void onSurfaceChanged(GL10 glUnused, int width, int height) | |
| 120 |       { 
 | |
| 121 | if( (float)lisaHeight/lisaWidth > (float)height/width ) | |
| 122 |         {
 | |
| 123 | int w = (height*lisaWidth)/lisaHeight; | |
| 124 | float factor = (float)height/lisaHeight; | |
| 125 |  | |
| 126 | mMove.set((width-w)/2,0,0); | |
| 127 | mScale.set(factor,factor,factor); | |
| 128 | } | |
| 129 | else | |
| 130 |         {
 | |
| 131 | int h = (width*lisaHeight)/lisaWidth; | |
| 132 | float factor = (float)width/lisaWidth; | |
| 133 |  | |
| 134 | mMove.set(0,(height-h)/2,0); | |
| 135 | mScale.set(factor,factor,factor); | |
| 136 | } | |
| 137 |  | |
| 138 | mScreen.resize(width, height); | |
| 139 | } | |
| 140 |  | |
| 141 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 142 |  | |
| 143 | public void onSurfaceCreated(GL10 glUnused, EGLConfig config) | |
| 144 |       {
 | |
| 145 | // TODO | |
| 146 | // This appears to be needed in case we create the app anew with NO DEPTH | |
| 147 | // (i.e. we set 'no depth' and then rotate screen). Investigate. | |
| 148 | GLES31.glEnable(GLES31.GL_CULL_FACE); | |
| 149 | GLES31.glCullFace(GLES31.GL_BACK); | |
| 150 | GLES31.glFrontFace(GLES31.GL_CW); | |
| 151 |  | |
| 152 | InputStream is1 = mView.getContext().getResources().openRawResource(R.raw.monalisa); | |
| 153 | InputStream is2 = mView.getContext().getResources().openRawResource(R.raw.grid); | |
| 154 |  | |
| 155 | Bitmap bitmap1, bitmap2; | |
| 156 |  | |
| 157 | try | |
| 158 |         {
 | |
| 159 | bitmap1 = BitmapFactory.decodeStream(is1); | |
| 160 | bitmap2 = BitmapFactory.decodeStream(is2); | |
| 161 | } | |
| 162 | finally | |
| 163 |         {
 | |
| 164 | try | |
| 165 |           {
 | |
| 166 | is1.close(); | |
| 167 | is2.close(); | |
| 168 | } | |
| 169 |         catch(IOException e) { }
 | |
| 170 | } | |
| 171 |  | |
| 172 | lisaWidth = bitmap1.getWidth(); | |
| 173 | lisaHeight = bitmap1.getHeight(); | |
| 174 | int gridWidth = bitmap2.getWidth(); | |
| 175 | int gridHeight= bitmap2.getHeight(); | |
| 176 |  | |
| 177 | if( mLisaTexture==null ) mLisaTexture = new DistortedTexture(lisaWidth,lisaHeight); | |
| 178 | if( mGridTexture==null ) mGridTexture = new DistortedTexture(gridWidth,gridHeight); | |
| 179 | mLisaTexture.setTexture(bitmap1); | |
| 180 | mGridTexture.setTexture(bitmap2); | |
| 181 | DistortedEffects gridEffects = new DistortedEffects(); | |
| 182 |  | |
| 183 | final int GRID = 10; | |
| 184 |  | |
| 185 | if( mMeshFlat==null ) mMeshFlat = new MeshFlat(1,1); | |
| 186 | if( mMeshCubes==null) mMeshCubes= new MeshCubes(GRID,GRID,1); | |
| 187 |  | |
| 188 | mRoot = new DistortedNode(mLisaTexture, mEffects, mMeshFlat); | |
| 189 | mRoot.attach(mGridTexture,gridEffects,mMeshCubes); | |
| 190 |  | |
| 191 | setDepthPriv(); | |
| 192 |  | |
| 193 | mScreen.detachAll(); | |
| 194 | mScreen.attach(mRoot); | |
| 195 |  | |
| 196 | float factor = lisaWidth/(2.0f*gridWidth); | |
| 197 | MatrixEffectMove move = new MatrixEffectMove( new Static3D((lisaWidth-factor*gridWidth)/2,(lisaHeight-factor*gridHeight)/2, gridWidth/(2.0f*GRID))); | |
| 198 | MatrixEffectScale scale = new MatrixEffectScale( new Static3D(factor,factor,factor) ); | |
| 199 | gridEffects.apply(move); | |
| 200 | gridEffects.apply(scale); | |
| 201 |  | |
| 202 | Dynamic1D rotDyn = new Dynamic1D(12000,0.0f); | |
| 203 | rotDyn.add(new Static1D( 0)); | |
| 204 | rotDyn.add(new Static1D(360)); | |
| 205 | rotDyn.setMode(Dynamic.MODE_JUMP); | |
| 206 | MatrixEffectRotate rotate = new MatrixEffectRotate(rotDyn, new Static3D(1,0,0), new Static3D(gridWidth/2,gridHeight/2,gridWidth/(2*GRID))); | |
| 207 | gridEffects.apply(rotate); | |
| 208 |  | |
| 209 | Dynamic1D sinkDyn = new Dynamic1D(3000,0.0f); | |
| 210 | sinkDyn.add(new Static1D(1.0f)); | |
| 211 | sinkDyn.add(new Static1D(0.3f)); | |
| 212 | VertexEffectSink sink = new VertexEffectSink(sinkDyn, new Static3D(gridWidth/2,gridHeight/2, 0)); | |
| 213 | gridEffects.apply(sink); | |
| 214 |  | |
| 215 | VertexEffectSink.enable(); | |
| 216 | FragmentEffectChroma.enable(); | |
| 217 |  | |
| 218 | try | |
| 219 |         {
 | |
| 220 | Distorted.onCreate(mView.getContext()); | |
| 221 | } | |
| 222 | catch(Exception ex) | |
| 223 |         {
 | |
| 224 |         android.util.Log.e("ObjectTree", ex.getMessage() );
 | |
| 225 | } | |
| 226 | } | |
| 227 | } | |
| src/main/java/org/distorted/examples/objecttree/ObjectTreeSurfaceView.java | ||
|---|---|---|
| 1 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 2 | // Copyright 2016 Leszek Koltunski // | |
| 3 | // // | |
| 4 | // This file is part of Distorted. // | |
| 5 | // // | |
| 6 | // Distorted is free software: you can redistribute it and/or modify // | |
| 7 | // it under the terms of the GNU General Public License as published by // | |
| 8 | // the Free Software Foundation, either version 2 of the License, or // | |
| 9 | // (at your option) any later version. // | |
| 10 | // // | |
| 11 | // Distorted is distributed in the hope that it will be useful, // | |
| 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of // | |
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // | |
| 14 | // GNU General Public License for more details. // | |
| 15 | // // | |
| 16 | // You should have received a copy of the GNU General Public License // | |
| 17 | // along with Distorted. If not, see <http://www.gnu.org/licenses/>. // | |
| 18 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 19 |  | |
| 20 | package org.distorted.examples.objecttree; | |
| 21 |  | |
| 22 | import android.app.ActivityManager; | |
| 23 | import android.content.Context; | |
| 24 | import android.content.pm.ConfigurationInfo; | |
| 25 | import android.opengl.GLSurfaceView; | |
| 26 | import android.util.AttributeSet; | |
| 27 |  | |
| 28 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 29 |  | |
| 30 | class ObjectTreeSurfaceView extends GLSurfaceView | |
| 31 | {
 | |
| 32 | private ObjectTreeRenderer mRenderer; | |
| 33 |  | |
| 34 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 35 |  | |
| 36 | public ObjectTreeSurfaceView(Context context, AttributeSet attrs) | |
| 37 |       {
 | |
| 38 | super(context, attrs); | |
| 39 |  | |
| 40 | if(!isInEditMode()) | |
| 41 |         {
 | |
| 42 | mRenderer = new ObjectTreeRenderer(this); | |
| 43 | final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); | |
| 44 | final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); | |
| 45 | setEGLContextClientVersion( (configurationInfo.reqGlEsVersion>>16) >= 3 ? 3:2 ); | |
| 46 | setRenderer(mRenderer); | |
| 47 | } | |
| 48 | } | |
| 49 |  | |
| 50 | /////////////////////////////////////////////////////////////////////////////////////////////////// | |
| 51 |  | |
| 52 | public ObjectTreeRenderer getRenderer() | |
| 53 |       {
 | |
| 54 | return mRenderer; | |
| 55 | } | |
| 56 | } | |
| 57 |  | |
| src/main/res/layout/bitmaptreelayout.xml | ||
|---|---|---|
| 1 | <?xml version="1.0" encoding="utf-8"?> | |
| 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | android:layout_width="fill_parent" | |
| 4 | android:layout_height="fill_parent" | |
| 5 | android:orientation="vertical" > | |
| 6 |  | |
| 7 | <org.distorted.examples.bitmaptree.BitmapTreeSurfaceView | |
| 8 | android:id="@+id/bitmaptreeSurfaceView" | |
| 9 | android:layout_width="fill_parent" | |
| 10 | android:layout_height="0dp" | |
| 11 | android:layout_weight="1" /> | |
| 12 |  | |
| 13 | <LinearLayout | |
| 14 | android:id="@+id/linearLayout1" | |
| 15 | android:layout_width="fill_parent" | |
| 16 | android:layout_height="wrap_content" | |
| 17 | android:gravity="center|fill_horizontal" | |
| 18 | android:orientation="vertical"> | |
| 19 |  | |
| 20 | <RadioGroup | |
| 21 | android:id="@+id/radioGroup1" | |
| 22 | android:layout_width="match_parent" | |
| 23 | android:layout_height="wrap_content" | |
| 24 | android:orientation="horizontal"> | |
| 25 |  | |
| 26 | <RadioButton | |
| 27 | android:id="@+id/depthYesButton" | |
| 28 | android:layout_width="wrap_content" | |
| 29 | android:layout_height="wrap_content" | |
| 30 | android:checked="true" | |
| 31 | android:onClick="DepthYes" | |
| 32 | android:text="@string/DepthYes"/> | |
| 33 |  | |
| 34 | <RadioButton | |
| 35 | android:id="@+id/depthNoButton" | |
| 36 | android:layout_width="wrap_content" | |
| 37 | android:layout_height="wrap_content" | |
| 38 | android:onClick="DepthNo" | |
| 39 | android:text="@string/DepthNo"/> | |
| 40 |  | |
| 41 | </RadioGroup> | |
| 42 |  | |
| 43 | </LinearLayout> | |
| 44 |  | |
| 45 | </LinearLayout> | |
| src/main/res/layout/objecttreelayout.xml | ||
|---|---|---|
| 1 | <?xml version="1.0" encoding="utf-8"?> | |
| 2 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
| 3 | android:layout_width="fill_parent" | |
| 4 | android:layout_height="fill_parent" | |
| 5 | android:orientation="vertical" > | |
| 6 |  | |
| 7 | <org.distorted.examples.objecttree.ObjectTreeSurfaceView | |
| 8 | android:id="@+id/objecttreeSurfaceView" | |
| 9 | android:layout_width="fill_parent" | |
| 10 | android:layout_height="0dp" | |
| 11 | android:layout_weight="1" /> | |
| 12 |  | |
| 13 | <LinearLayout | |
| 14 | android:id="@+id/linearLayout1" | |
| 15 | android:layout_width="fill_parent" | |
| 16 | android:layout_height="wrap_content" | |
| 17 | android:gravity="center|fill_horizontal" | |
| 18 | android:orientation="vertical"> | |
| 19 |  | |
| 20 | <RadioGroup | |
| 21 | android:id="@+id/radioGroup1" | |
| 22 | android:layout_width="match_parent" | |
| 23 | android:layout_height="wrap_content" | |
| 24 | android:orientation="horizontal"> | |
| 25 |  | |
| 26 | <RadioButton | |
| 27 | android:id="@+id/depthYesButton" | |
| 28 | android:layout_width="wrap_content" | |
| 29 | android:layout_height="wrap_content" | |
| 30 | android:checked="true" | |
| 31 | android:onClick="DepthYes" | |
| 32 | android:text="@string/DepthYes"/> | |
| 33 |  | |
| 34 | <RadioButton | |
| 35 | android:id="@+id/depthNoButton" | |
| 36 | android:layout_width="wrap_content" | |
| 37 | android:layout_height="wrap_content" | |
| 38 | android:onClick="DepthNo" | |
| 39 | android:text="@string/DepthNo"/> | |
| 40 |  | |
| 41 | </RadioGroup> | |
| 42 |  | |
| 43 | </LinearLayout> | |
| 44 |  | |
| 45 | </LinearLayout> | |
| src/main/res/values/strings.xml | ||
|---|---|---|
| 137 | 137 | <string name="example_effectqueue_subtitle">Add, remove and list all effects currently acting on a Bitmap.</string> | 
| 138 | 138 | <string name="example_check">Check</string> | 
| 139 | 139 | <string name="example_check_subtitle">Check the maximum number of effects (separately for vertex and fragment shaders) we can apply to a single bitmap.</string> | 
| 140 |     <string name="example_bitmaptree">Bitmap Tree</string>
 | |
| 141 |     <string name="example_bitmaptree_subtitle">Render one bitmap on top of another.</string>
 | |
| 140 |     <string name="example_objecttree">Object Tree</string>
 | |
| 141 |     <string name="example_objecttree_subtitle">Render one object on top of another.</string>
 | |
| 142 | 142 | <string name="example_starwars">Star Wars</string> | 
| 143 | 143 | <string name="example_starwars_subtitle">Shows how to create the opening crawl from Star Wars Episode IV.</string> | 
| 144 | 144 | <string name="example_olimpic">Olimpic Rings</string> | 
Also available in: Unified diff
- new icon for the GLOW app
- rename the BitmapTree app to ObjectTree