Project

General

Profile

Download (6.65 KB) Statistics
| Branch: | Revision:

examples / src / main / java / org / distorted / examples / rubik / RubikRenderer.java @ e3900503

1 5b4a2d76 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 8647eae2 Leszek Koltunski
// Copyright 2019 Leszek Koltunski                                                               //
3 5b4a2d76 Leszek Koltunski
//                                                                                               //
4 e3900503 Leszek Koltunski
// This file is part of DistortedLibrary.                                                               //
5 5b4a2d76 Leszek Koltunski
//                                                                                               //
6 e3900503 Leszek Koltunski
// DistortedLibrary is free software: you can redistribute it and/or modify                             //
7 5b4a2d76 Leszek Koltunski
// 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 e3900503 Leszek Koltunski
// DistortedLibrary is distributed in the hope that it will be useful,                                  //
12 5b4a2d76 Leszek Koltunski
// 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 e3900503 Leszek Koltunski
// along with DistortedLibrary.  If not, see <http://www.gnu.org/licenses/>.                            //
18 5b4a2d76 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.examples.rubik;
21
22
import android.opengl.GLSurfaceView;
23
24 94cc96ff Leszek Koltunski
import org.distorted.library.effect.VertexEffectSink;
25 e3900503 Leszek Koltunski
import org.distorted.library.main.DistortedLibrary;
26 5b4a2d76 Leszek Koltunski
import org.distorted.library.main.DistortedScreen;
27 b62eb334 Leszek Koltunski
import org.distorted.library.message.EffectListener;
28
import org.distorted.library.message.EffectMessage;
29 5b4a2d76 Leszek Koltunski
import org.distorted.library.type.Static3D;
30
31
import javax.microedition.khronos.egl.EGLConfig;
32
import javax.microedition.khronos.opengles.GL10;
33
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 b62eb334 Leszek Koltunski
class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
37 5b4a2d76 Leszek Koltunski
{
38 e4c0057e Leszek Koltunski
    private static final float CUBE_SCREEN_RATIO = 0.5f;
39 8a40abf4 Leszek Koltunski
    private static final float CAMERA_DISTANCE   = 0.6f;  // 0.6 of the length of max(scrHeight,scrWidth)
40 6e18bd32 Leszek Koltunski
    private static final int MIN_CUBE_SIZE = 1;
41
    private static final int MAX_CUBE_SIZE = 6;
42 e4c0057e Leszek Koltunski
43 18709ae0 Leszek Koltunski
    private RubikSurfaceView mView;
44 5b4a2d76 Leszek Koltunski
    private DistortedScreen mScreen;
45 8647eae2 Leszek Koltunski
    private Static3D mMove, mScale;
46 e3a72781 Leszek Koltunski
    private int mNextCubeSize;
47 6e18bd32 Leszek Koltunski
    private boolean mChangeCubeSizeNow;
48
    private int mNumCube;
49 8647eae2 Leszek Koltunski
    private RubikCube mCube;
50 5b4a2d76 Leszek Koltunski
51 af8b42cc Leszek Koltunski
    private int mScreenWidth, mScreenHeight;
52
53 5b4a2d76 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
54
55 18709ae0 Leszek Koltunski
    RubikRenderer(RubikSurfaceView v)
56 5b4a2d76 Leszek Koltunski
      {
57
      mView = v;
58
59
      mScreen = new DistortedScreen();
60
61 af8b42cc Leszek Koltunski
      mScreenWidth = mScreenHeight = 0;
62
63 5b4a2d76 Leszek Koltunski
      mMove  = new Static3D(0,0,0);
64
      mScale = new Static3D(1,1,1);
65 8647eae2 Leszek Koltunski
66 6e18bd32 Leszek Koltunski
      mNextCubeSize= MIN_CUBE_SIZE;
67
      mChangeCubeSizeNow = false;
68 e3a72781 Leszek Koltunski
69 6e18bd32 Leszek Koltunski
      mNumCube = 0;
70 5b4a2d76 Leszek Koltunski
      }
71
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73 6e18bd32 Leszek Koltunski
// change the cube size here, 'after the next render' as not to cause artifacts.
74 b62eb334 Leszek Koltunski
75 5b4a2d76 Leszek Koltunski
    public void onDrawFrame(GL10 glUnused) 
76
      {
77
      mScreen.render( System.currentTimeMillis() );
78 94cc96ff Leszek Koltunski
79 6e18bd32 Leszek Koltunski
      if( mChangeCubeSizeNow )
80 8647eae2 Leszek Koltunski
        {
81 6e18bd32 Leszek Koltunski
        mChangeCubeSizeNow = false;
82
        createNextCube();
83 e3a72781 Leszek Koltunski
        }
84 5b4a2d76 Leszek Koltunski
      }
85
86 b62eb334 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
87 da231553 Leszek Koltunski
// EffectListener. The library sends a message to us when it's time to create a new cube.
88 b62eb334 Leszek Koltunski
89
   public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
90
     {
91
     switch(em)
92
        {
93 6e18bd32 Leszek Koltunski
        case EFFECT_FINISHED: mNextCubeSize++;
94
                              if( mNextCubeSize> MAX_CUBE_SIZE ) mNextCubeSize = MIN_CUBE_SIZE;
95
                              mChangeCubeSizeNow = true;
96
                              break;
97 b62eb334 Leszek Koltunski
        }
98
     }
99
100 5b4a2d76 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
101
    
102 da231553 Leszek Koltunski
   public void onSurfaceChanged(GL10 glUnused, int width, int height)
103
     {
104
     float cameraDistance = CAMERA_DISTANCE*(width>height ? width:height);
105
     float fovInDegrees   = computeFOV(cameraDistance,height);
106 7f986357 Leszek Koltunski
107 da231553 Leszek Koltunski
     mScreen.setProjection( fovInDegrees, 0.1f);
108
     mScreen.resize(width, height);
109 5b4a2d76 Leszek Koltunski
110 da231553 Leszek Koltunski
     recomputeScaleFactor(width,height);
111 5b4a2d76 Leszek Koltunski
112 da231553 Leszek Koltunski
     mScreenHeight = height;
113
     mScreenWidth  = width;
114
     }
115 5b4a2d76 Leszek Koltunski
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117
    
118 da231553 Leszek Koltunski
   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
119
     {
120
     createNextCube();
121
122
     VertexEffectSink.enable();
123
124
     try
125
       {
126 e3900503 Leszek Koltunski
       DistortedLibrary.onCreate(mView.getContext());
127 da231553 Leszek Koltunski
       }
128
     catch(Exception ex)
129
       {
130
       android.util.Log.e("Rubik", ex.getMessage() );
131
       }
132
     }
133 e4c0057e Leszek Koltunski
134 483ae94e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
135
136 6e18bd32 Leszek Koltunski
   private void createNextCube()
137 af8b42cc Leszek Koltunski
     {
138 6e18bd32 Leszek Koltunski
     if( mCube!=null ) mCube.releaseResources();
139
     mCube = new RubikCube(mNextCubeSize, mMove, mScale);
140
     mCube.createTexture();
141 8647eae2 Leszek Koltunski
142 6e18bd32 Leszek Koltunski
     if( mScreenWidth!=0 ) recomputeScaleFactor(mScreenWidth,mScreenHeight);
143 e4c0057e Leszek Koltunski
144 6e18bd32 Leszek Koltunski
     mScreen.detachAll();
145
     mCube.attachToScreen(mScreen);
146
     mCube.addRotation(this);
147
     RubikActivity act = mView.getRubikActivity();
148
     act.setText(++mNumCube);
149 e3a72781 Leszek Koltunski
     }
150
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
153 6e18bd32 Leszek Koltunski
   private float computeFOV(float cameraDistance, int screenHeight)
154 af8b42cc Leszek Koltunski
     {
155 6e18bd32 Leszek Koltunski
     double halfFOVInRadians = Math.atan( screenHeight/(2*cameraDistance) );
156
     return (float)(2*halfFOVInRadians*(180/Math.PI));
157 af8b42cc Leszek Koltunski
     }
158 e4c0057e Leszek Koltunski
159 d4374cd3 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
160
161 e3a72781 Leszek Koltunski
   private void recomputeScaleFactor(int screenWidth, int screenHeight)
162 af8b42cc Leszek Koltunski
     {
163 6e18bd32 Leszek Koltunski
     float cubeSizeInScreenSpace = CUBE_SCREEN_RATIO*(screenWidth>screenHeight ? screenHeight:screenWidth);
164 af8b42cc Leszek Koltunski
     float texSize = mCube.getTextureSize();
165 6e18bd32 Leszek Koltunski
     float scaleFactor = cubeSizeInScreenSpace/(texSize*mCube.getSize());
166 af8b42cc Leszek Koltunski
167
     mMove.set( (screenWidth-scaleFactor*texSize)/2 , (screenHeight-scaleFactor*texSize)/2 , -scaleFactor*texSize/2 );
168
     mScale.set(scaleFactor,scaleFactor,scaleFactor);
169
     }
170 5b4a2d76 Leszek Koltunski
}