Revision 4c42bc15
Added by Leszek Koltunski about 4 years ago
src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java | ||
---|---|---|
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. |
Also available in: Unified diff
Some cleanups in MonaLisa, Bean & Sink.