Project

General

Profile

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

examples / src / main / java / org / distorted / examples / rubik / RubikRenderer.java @ 6e18bd32

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