59 |
59 |
{
|
60 |
60 |
mView = v;
|
61 |
61 |
|
|
62 |
// Centers of the Effects.
|
|
63 |
// center = (0,0,0) would be the midpoint of the Bitmap.
|
62 |
64 |
// MonaLisa bitmap is 320x366, this is thus (90,108) pixels from the lower-left corner
|
63 |
65 |
Static3D centerLeft = new Static3D( ( 90-320*0.5f)/320.0f, (108-366*0.5f)/366.0f, 0);
|
64 |
66 |
// (176,111) from the lower left
|
65 |
67 |
Static3D centerRight = new Static3D( (176-320*0.5f)/320.0f, (111-366*0.5f)/366.0f, 0);
|
66 |
68 |
|
67 |
|
// two regions defining the areas affected by the Distort effect
|
68 |
|
Static4D rLeft = new Static4D( -10/320.0f, 10/366.0f, 0, 25/320.0f);
|
69 |
|
Static4D rRight = new Static4D( 10/320.0f, 5/366.0f, 0, 25/320.0f);
|
|
69 |
// two Regions defining the areas affected by the Distort effect
|
|
70 |
// a Region is like a mask that specifies which area around the Center is affected by
|
|
71 |
// the Distort. Here (-10,10,0) pixels from the left center, with radius 25 pixels
|
|
72 |
Static4D regionLeft = new Static4D( -10/320.0f, 10/366.0f, 0, 25/320.0f);
|
|
73 |
// and likewise (10,5,0) pixels from the right Center, radius 25 pixels.
|
|
74 |
Static4D regionRight = new Static4D( 10/320.0f, 5/366.0f, 0, 25/320.0f);
|
70 |
75 |
|
71 |
76 |
// two dynamics for interpolating through vectors of distortion. Interpolate
|
72 |
77 |
// every 1000 milliseconds, indefinitely ('0.0f').
|
73 |
|
Dynamic3D dLeft = new Dynamic3D(1000,0.0f);
|
74 |
|
Dynamic3D dRight= new Dynamic3D(1000,0.0f);
|
|
78 |
Dynamic3D degLeft = new Dynamic3D(1000,0.0f);
|
|
79 |
Dynamic3D degRight= new Dynamic3D(1000,0.0f);
|
75 |
80 |
|
76 |
81 |
// two vectors of distortion the left tip of the mouth gets distorted with -
|
77 |
|
// interpolated from (0,0,0) - i.e. no distortion - to (-20 pixels, 20 pixels, 0), i.e.
|
78 |
|
// slightly to the top left.
|
79 |
|
dLeft.add ( new Static3D( 0, 0, 0) );
|
80 |
|
dLeft.add ( new Static3D(-20/320.0f, 20/366.0f, 0) );
|
|
82 |
// interpolated from (0,0,0) - i.e. no distortion - to (-20 pixels, 20 pixels, 0),
|
|
83 |
// i.e. slightly to the top left.
|
|
84 |
degLeft.add ( new Static3D( 0, 0, 0) );
|
|
85 |
degLeft.add ( new Static3D(-20/320.0f, 20/366.0f, 0) );
|
81 |
86 |
|
82 |
87 |
// likewise two vectors the right tip is distorted with.
|
83 |
|
dRight.add( new Static3D( 0, 0, 0) );
|
84 |
|
dRight.add( new Static3D( 20/320.0f, 10/366.0f, 0) );
|
|
88 |
degRight.add( new Static3D( 0, 0, 0) );
|
|
89 |
degRight.add( new Static3D( 20/320.0f, 10/366.0f, 0) );
|
85 |
90 |
|
86 |
91 |
// Equip MonaLisa with the Effects we want to draw her with - i.e. two Distorts of the mouth
|
87 |
92 |
mEffects = new DistortedEffects();
|
88 |
|
mEffects.apply( new VertexEffectDistort(dLeft , centerLeft , rLeft ) );
|
89 |
|
mEffects.apply( new VertexEffectDistort(dRight, centerRight, rRight) );
|
|
93 |
mEffects.apply( new VertexEffectDistort( degLeft , centerLeft , regionLeft ) );
|
|
94 |
mEffects.apply( new VertexEffectDistort( degRight, centerRight, regionRight) );
|
90 |
95 |
|
91 |
96 |
// ... and a Scale - so far by (1,1,1), i.e. no scale. The mScale point will be computed
|
92 |
|
// later, in onSurfaceChanged, when we actually know the size of the screen and know how
|
|
97 |
// later, in onSurfaceChanged, when we actually know the size of the screen and thus how
|
93 |
98 |
// much to scale the initial Mesh (which is 1x1x0 in size)
|
94 |
99 |
mScale= new Static3D(1,1,1);
|
95 |
100 |
mEffects.apply(new MatrixEffectScale(mScale));
|
96 |
101 |
|
97 |
|
mScreen = new DistortedScreen();
|
|
102 |
mTexture = new DistortedTexture();
|
|
103 |
mScreen = new DistortedScreen();
|
98 |
104 |
}
|
99 |
105 |
|
100 |
106 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
136 |
142 |
|
137 |
143 |
mBmpRatio = (float)bitmap.getHeight()/bitmap.getWidth();
|
138 |
144 |
|
139 |
|
// We could have gotten here after the activity went to the background
|
140 |
|
// for a brief amount of time; in this case mTexture is already created.
|
141 |
|
// Do not create it the second time around then.
|
142 |
|
if( mTexture==null ) mTexture = new DistortedTexture();
|
143 |
|
|
144 |
|
// likewise the Mesh
|
145 |
145 |
// Create an underlying Mesh of 9x10 vertices - this is for the Distort
|
146 |
146 |
// effect to have vertices to distort. We multiply by mBmpRatio here so
|
147 |
147 |
// that the Mesh's cells are as close to squares as possible (when they
|
148 |
148 |
// finally be rendered with a Scale - see mScale)
|
149 |
149 |
if( mMesh==null ) mMesh = new MeshRectangles(9, (int)(9*mBmpRatio) );
|
150 |
150 |
|
151 |
|
// even if mTexture wasn't null, we still need to call setTexture() on it
|
152 |
|
// because every time activity goes to background, its OpenGL resources
|
153 |
|
// - including Textures - get deleted. We always need to call setTexture()
|
154 |
|
// to recreate the internal OpenGL textures.
|
|
151 |
// Every time activity goes to background, its OpenGL resources - including
|
|
152 |
// Textures - get deleted. We always need to call setTexture() here to
|
|
153 |
// recreate the internal OpenGL textures.
|
155 |
154 |
mTexture.setTexture(bitmap);
|
156 |
155 |
|
157 |
156 |
// Build the Scene Graph - attach all Objects we want to be rendered to the Screen.
|
Some cleanups in MonaLisa, Bean & Sink.