Project

General

Profile

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

examples / src / main / java / org / distorted / examples / meshfile / MeshFileRenderer.java @ dc10a48d

1 42aa970f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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.meshfile;
21
22 dc10a48d Leszek Koltunski
import android.app.ActivityManager;
23 1af8e143 Leszek Koltunski
import android.content.Context;
24 dc10a48d Leszek Koltunski
import android.content.pm.ConfigurationInfo;
25 1af8e143 Leszek Koltunski
import android.content.res.Resources;
26 42aa970f Leszek Koltunski
import android.graphics.Bitmap;
27
import android.graphics.Canvas;
28
import android.graphics.Paint;
29
import android.opengl.GLSurfaceView;
30
31 8ac4c0bc Leszek Koltunski
import org.distorted.examples.R;
32 a65604a7 Leszek Koltunski
import org.distorted.library.effect.Effect;
33 6991ece5 Leszek Koltunski
import org.distorted.library.effect.EffectType;
34 42aa970f Leszek Koltunski
import org.distorted.library.effect.MatrixEffectQuaternion;
35
import org.distorted.library.effect.MatrixEffectScale;
36 39b925d5 Leszek Koltunski
import org.distorted.library.effect.VertexEffectDisappear;
37 42aa970f Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
38
import org.distorted.library.main.DistortedLibrary;
39
import org.distorted.library.main.DistortedScreen;
40
import org.distorted.library.main.DistortedTexture;
41 6991ece5 Leszek Koltunski
import org.distorted.library.mesh.MeshBase;
42 1af8e143 Leszek Koltunski
import org.distorted.library.mesh.MeshFile;
43 1bb5d3b7 Leszek Koltunski
import org.distorted.library.mesh.MeshPolygon;
44 42aa970f Leszek Koltunski
import org.distorted.library.type.DynamicQuat;
45
import org.distorted.library.type.Static3D;
46
import org.distorted.library.type.Static4D;
47
48 1bb5d3b7 Leszek Koltunski
import org.distorted.objectlib.helpers.FactoryCubit;
49 0dee575b Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
50
import org.distorted.objectlib.helpers.ObjectShape;
51 acb2aaae Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectVertexEffects;
52 2f250195 Leszek Koltunski
import org.distorted.objectlib.main.InitData;
53 d32fe3d9 Leszek Koltunski
import org.distorted.objectlib.main.TwistyObject;
54 cfbd047c Leszek Koltunski
import org.distorted.objectlib.objects.*;
55 1bb5d3b7 Leszek Koltunski
56 1af8e143 Leszek Koltunski
import java.io.DataInputStream;
57
import java.io.IOException;
58
import java.io.InputStream;
59
60 42aa970f Leszek Koltunski
import javax.microedition.khronos.egl.EGLConfig;
61
import javax.microedition.khronos.opengles.GL10;
62
63 1bb5d3b7 Leszek Koltunski
import static org.distorted.examples.meshfile.MeshFileActivity.POLYGON;
64 6991ece5 Leszek Koltunski
import static org.distorted.examples.meshfile.MeshFileActivity.PROCEDURAL;
65 baace8e9 Leszek Koltunski
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
66 3e129d0b Leszek Koltunski
import static org.distorted.objectlib.main.TwistyObject.MODE_NORM;
67 6991ece5 Leszek Koltunski
68 42aa970f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
69
70 dc10a48d Leszek Koltunski
class MeshFileRenderer implements GLSurfaceView.Renderer, DistortedLibrary.LibraryUser
71 42aa970f Leszek Koltunski
{
72 7edab735 Leszek Koltunski
    private static final float SQ3 = (float)Math.sqrt(3);
73 16b336db Leszek Koltunski
    private final float DEFAULT_SCALE = 0.3f;
74
75 140f2c4e Leszek Koltunski
    private final GLSurfaceView mView;
76 dc10a48d Leszek Koltunski
    private final Resources mResources;
77 140f2c4e Leszek Koltunski
    private final DistortedScreen mScreen;
78
    private final DistortedEffects mEffects;
79
    private final Static3D mScale;
80 dc10a48d Leszek Koltunski
81
    private DistortedTexture mTexture;
82
    private MeshBase mMesh;
83 48c88f57 Leszek Koltunski
    private long mTime;
84 16b336db Leszek Koltunski
    private float mCurrentScale;
85 42aa970f Leszek Koltunski
86
    Static4D mQuat1, mQuat2;
87
    int mScreenMin;
88
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90
91
    MeshFileRenderer(GLSurfaceView v)
92
      {
93
      mView = v;
94 dc10a48d Leszek Koltunski
      mResources = v.getResources();
95
96 42aa970f Leszek Koltunski
      mScreen = new DistortedScreen();
97
      mScale= new Static3D(1,1,1);
98
      Static3D center=new Static3D(0,0,0);
99
100 16b336db Leszek Koltunski
      mCurrentScale = DEFAULT_SCALE;
101
102 42aa970f Leszek Koltunski
      mQuat1 = new Static4D(0,0,0,1);
103 fe032f52 Leszek Koltunski
      mQuat2 = new Static4D(0,0,0,1);
104 42aa970f Leszek Koltunski
105
      DynamicQuat quatInt1 = new DynamicQuat(0,0.5f);
106
      DynamicQuat quatInt2 = new DynamicQuat(0,0.5f);
107
108
      quatInt1.add(mQuat1);
109
      quatInt2.add(mQuat2);
110
111 39b925d5 Leszek Koltunski
      VertexEffectDisappear disappear = new VertexEffectDisappear();
112
      disappear.setMeshAssociation(1,-1);
113
114 42aa970f Leszek Koltunski
      mEffects = new DistortedEffects();
115
      mEffects.apply( new MatrixEffectQuaternion(quatInt2, center) );
116
      mEffects.apply( new MatrixEffectQuaternion(quatInt1, center) );
117
      mEffects.apply( new MatrixEffectScale(mScale));
118
119 39b925d5 Leszek Koltunski
      mEffects.apply( disappear );
120
121 42aa970f Leszek Koltunski
      mScreen.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
122 48c88f57 Leszek Koltunski
      mScreen.showFPS();
123 42aa970f Leszek Koltunski
      }
124
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126
   
127
    public void onDrawFrame(GL10 glUnused) 
128
      {
129
      mScreen.render( System.currentTimeMillis() );
130
      }
131
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133
    
134
    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
135
      {
136
      mScreenMin = Math.min(width, height);
137 16b336db Leszek Koltunski
      float factor = mCurrentScale*mScreenMin;
138 42aa970f Leszek Koltunski
      mScale.set(factor,factor,factor);
139
      mScreen.resize(width, height);
140
      }
141
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143
    
144
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
145
      {
146
      if( mTexture==null ) mTexture = new DistortedTexture();
147
148 a65604a7 Leszek Koltunski
      Effect.enableEffects(EffectType.VERTEX);
149 04a21ed6 Leszek Koltunski
      DistortedLibrary.setMax(EffectType.VERTEX, 20);
150 ef02f5e0 Leszek Koltunski
      DistortedLibrary.needTransformFeedback();
151 dc10a48d Leszek Koltunski
      DistortedLibrary.onSurfaceCreated(this);
152 42aa970f Leszek Koltunski
      }
153
154 16b336db Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
155
//   0 ---> 0
156
//  50 ---> DEFAULT_SCALE
157
// 100 ---> 4*DEFAULT_SCALE
158
159
    void setScale(int scale)
160
      {
161
      if( scale<= 50 )
162
        {
163
        mCurrentScale = DEFAULT_SCALE * scale / 50.0f;
164
        }
165
      else
166
        {
167
        mCurrentScale = DEFAULT_SCALE * ( 3*(scale/50.0f) - 2.0f);
168
        }
169
170
      float factor = mCurrentScale*mScreenMin;
171
      mScale.set(factor,factor,factor);
172
      }
173
174 42aa970f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
175
176 1af8e143 Leszek Koltunski
    void open(int resourceID)
177 42aa970f Leszek Koltunski
      {
178 099d8f8b Leszek Koltunski
      if( mTexture==null ) mTexture = new DistortedTexture();
179 8ac4c0bc Leszek Koltunski
      mTexture.setTexture( createTexture(resourceID) );
180
181 acad428e Leszek Koltunski
      long t1 = System.currentTimeMillis();
182 6991ece5 Leszek Koltunski
183 1bb5d3b7 Leszek Koltunski
      if( resourceID==PROCEDURAL )
184 6991ece5 Leszek Koltunski
        {
185 1bb5d3b7 Leszek Koltunski
        createMesh();
186
        }
187
      else if( resourceID==POLYGON )
188
        {
189
        createPolygon();
190 6991ece5 Leszek Koltunski
        }
191
      else
192
        {
193 1bb5d3b7 Leszek Koltunski
        openMesh(resourceID);
194 6991ece5 Leszek Koltunski
        }
195
196 acad428e Leszek Koltunski
      long t2 = System.currentTimeMillis();
197
198 48c88f57 Leszek Koltunski
      mTime = t2-t1;
199 42aa970f Leszek Koltunski
200 71c7624f Leszek Koltunski
      mScreen.detachAll();
201 7198e5c9 Leszek Koltunski
      mScreen.attach(mTexture,mEffects,mMesh);
202 42aa970f Leszek Koltunski
      }
203
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205
206 1af8e143 Leszek Koltunski
    private Bitmap createTexture(int resourceID)
207 42aa970f Leszek Koltunski
      {
208 7edab735 Leszek Koltunski
      TextureFactory factory = TextureFactory.getInstance();
209
210
      float[] vertices;
211
      int[] colors;
212
      float F = 0.5f;
213
      float E = SQ3/2;
214
215 8ac4c0bc Leszek Koltunski
      switch(resourceID)
216
          {
217
          case  R.raw.deferredjob:
218 7edab735 Leszek Koltunski
          case  R.raw.meshjoin   :
219 1beffb69 Leszek Koltunski
          case  PROCEDURAL       :
220 1bb5d3b7 Leszek Koltunski
          case  POLYGON          :
221 7edab735 Leszek Koltunski
          case  R.raw.predeform  : return createWhiteTexture();
222
223 8ac4c0bc Leszek Koltunski
          case  R.raw.cube2      :
224
          case  R.raw.cube3      :
225
          case  R.raw.cube4      :
226 7edab735 Leszek Koltunski
          case  R.raw.cube5      : colors = new int[] { 0xffffff00, 0xffffffff, 0xff0000ff, 0xff00ff00, 0xffff0000, 0xffb5651d };
227
                                   vertices = new float[] { -F,-F, +F,-F, +F,+F, -F,+F};
228
                                   return factory.createTexture(vertices,colors,0.10f, 0.10f, true);
229 8ac4c0bc Leszek Koltunski
          case  R.raw.pyra3      :
230
          case  R.raw.pyra4      :
231 7edab735 Leszek Koltunski
          case  R.raw.pyra5      : colors = new int[] { 0xffffff00, 0xff00ff00, 0xff0000ff, 0xffff0000 };
232
                                   vertices = new float[] { -F,-E/3, +F,-E/3, 0.0f,2*E/3};
233
                                   return factory.createTexture(vertices,colors,0.05f, 0.05f, true);
234 8ac4c0bc Leszek Koltunski
235 7edab735 Leszek Koltunski
          case  R.raw.dino       : colors = new int[] { 0xffffff00, 0xffffffff, 0xff0000ff, 0xff00ff00, 0xffff0000, 0xffb5651d };
236
                                   vertices = new float[] { -F,F/3, 0,-2*F/3, +F,F/3 };
237
                                   return factory.createTexture(vertices,colors,0.05f, 0.03f, true);
238 8ac4c0bc Leszek Koltunski
239 7edab735 Leszek Koltunski
          case R.raw.skewb       : colors = new int[] { 0xffffff00, 0xffffffff, 0xff0000ff, 0xff00ff00, 0xffff0000, 0xffb5651d };
240
                                   //vertices = new float[] { -G,-G, +G,-G, +G,+G, -G,+G };
241 8ac4c0bc Leszek Koltunski
242 7edab735 Leszek Koltunski
                                   vertices = new float[] { -F+F/4,F/4, F/4,-F+F/4, F/4,F/4};
243
                                   return factory.createTexture(vertices,colors,0.05f, 0.08f, true);
244
          }
245 8ac4c0bc Leszek Koltunski
246 7edab735 Leszek Koltunski
      return null;
247 8ac4c0bc Leszek Koltunski
      }
248
249
///////////////////////////////////////////////////////////////////////////////////////////////////
250
251 7edab735 Leszek Koltunski
    private Bitmap createWhiteTexture()
252 8ac4c0bc Leszek Koltunski
      {
253 7edab735 Leszek Koltunski
      int SIZE = 1;
254 8ac4c0bc Leszek Koltunski
      Bitmap bitmap = Bitmap.createBitmap(SIZE,SIZE, Bitmap.Config.ARGB_8888);
255
      Canvas canvas = new Canvas(bitmap);
256
257
      Paint paint = new Paint();
258 36793c52 Leszek Koltunski
      paint.setColor(0xffffff55);
259 1beffb69 Leszek Koltunski
      paint.setStyle(Paint.Style.FILL);
260 7edab735 Leszek Koltunski
      canvas.drawRect(0, 0, SIZE, SIZE, paint);
261 6991ece5 Leszek Koltunski
262 72059460 Leszek Koltunski
      return bitmap;
263 6991ece5 Leszek Koltunski
      }
264
265 1bb5d3b7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
266
267
    private void createPolygon()
268
      {
269
      float A = 0.5f;
270
      float B = 0.1f;
271
272 65dd40aa Leszek Koltunski
      int extraIndex    = 2;
273 1bb5d3b7 Leszek Koltunski
      int extraVertices = 2;
274 65dd40aa Leszek Koltunski
      int numBands      = 2;
275 1bb5d3b7 Leszek Koltunski
276
      float[] vertices = new float[] { -A,-A, A,-A, A,A, -A,A };
277
      float[] bands = new float[2*numBands];
278
279
      for(int i=0; i<numBands; i++)
280
        {
281
        bands[2*i  ] = 1 + i/(1.0f-numBands);
282
        bands[2*i+1] = B/(numBands-1)*i;
283
        }
284
285
      mMesh = new MeshPolygon(vertices,bands,extraIndex,extraVertices);
286
      mMesh.setEffectAssociation(0,0,0);
287
      mMesh.setShowNormals(true);
288
      }
289
290 6991ece5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
291
292
    private void createMesh()
293
      {
294 d32fe3d9 Leszek Koltunski
      Static4D quat = new Static4D(0,0,0,1);
295
      Static3D move = new Static3D(0,0,0);
296
      float scale   = 1.0f;
297 cfbd047c Leszek Koltunski
      int variant   = 1;
298 6983badf Leszek Koltunski
299 2f250195 Leszek Koltunski
      InitData data = new InitData(new int[] {2,3,2});
300 82f297f2 Leszek Koltunski
      TwistyObject puzzle = new TwistyCuboid(MESH_NICE,MODE_NORM,quat,move,scale,data,null);
301 3083fab8 Leszek Koltunski
302 acb2aaae Leszek Koltunski
      ObjectShape shape           = puzzle.getObjectShape(variant);
303
      ObjectFaceShape face        = puzzle.getObjectFaceShape(variant);
304
      ObjectVertexEffects effects = puzzle.getVertexEffects(variant);
305 6983badf Leszek Koltunski
306 d32fe3d9 Leszek Koltunski
      int[][] indices = shape.getVertIndices();
307
      int numComponents = indices.length;
308
      int[] outer = new int[numComponents];
309 db9903e8 Leszek Koltunski
310 33647db9 Leszek Koltunski
      FactoryCubit factory = FactoryCubit.getInstance();
311 6983badf Leszek Koltunski
      factory.clear();
312 fa96775c Leszek Koltunski
      factory.createNewFaceTransform(shape,outer);
313 acb2aaae Leszek Koltunski
      mMesh = factory.createRoundedSolid(shape,face,effects,MESH_NICE,numComponents);
314 6983badf Leszek Koltunski
315
      int numEff = mMesh.getNumEffComponents();
316 6991ece5 Leszek Koltunski
317 d32fe3d9 Leszek Koltunski
      for(int i=0; i<numEff; i++) mMesh.setEffectAssociation(i, 0, i);
318 6991ece5 Leszek Koltunski
      }
319 42aa970f Leszek Koltunski
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322 6991ece5 Leszek Koltunski
    private void openMesh(int resourceID)
323 42aa970f Leszek Koltunski
      {
324 1af8e143 Leszek Koltunski
      Context con = mView.getContext();
325
      Resources res = con.getResources();
326
      InputStream is = res.openRawResource(resourceID);
327
      DataInputStream dos = new DataInputStream(is);
328 7198e5c9 Leszek Koltunski
      mMesh = new MeshFile(dos);
329 1af8e143 Leszek Koltunski
330 6983badf Leszek Koltunski
      int numEff = mMesh.getNumEffComponents();
331 39b925d5 Leszek Koltunski
332
      for(int i=0; i<numEff; i++)
333
        {
334
        mMesh.setEffectAssociation(i, 0, i);
335
        }
336
337 1af8e143 Leszek Koltunski
      try
338
        {
339
        is.close();
340
        }
341
      catch(IOException e)
342
        {
343 48c88f57 Leszek Koltunski
        android.util.Log.e("MeshFile", "Error closing InputStream: "+e.toString());
344 1af8e143 Leszek Koltunski
        }
345 42aa970f Leszek Koltunski
      }
346 48c88f57 Leszek Koltunski
347 39b925d5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
348
349 6991ece5 Leszek Koltunski
    MeshBase getMesh()
350 39b925d5 Leszek Koltunski
      {
351
      return mMesh;
352
      }
353
354 48c88f57 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
355
356
    long getTime()
357
      {
358
      return mTime;
359
      }
360
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362
363
    int getBytes()
364
      {
365 6991ece5 Leszek Koltunski
      if( mMesh instanceof MeshFile )
366
        {
367
        return ((MeshFile)mMesh).getNumBytes();
368
        }
369
370
      return 0;
371 48c88f57 Leszek Koltunski
      }
372
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374
375
    int getVertices()
376
      {
377 7198e5c9 Leszek Koltunski
      return mMesh.getNumVertices();
378
      }
379
380
///////////////////////////////////////////////////////////////////////////////////////////////////
381
382
    int getEndEffIndex(int component)
383
      {
384
      return mMesh.getLastVertexEff(component);
385
      }
386
387
///////////////////////////////////////////////////////////////////////////////////////////////////
388
389
    int getEndTexIndex(int component)
390
      {
391
      return mMesh.getLastVertexTex(component);
392
      }
393
394
///////////////////////////////////////////////////////////////////////////////////////////////////
395
396
    int getEffComponentNum()
397
      {
398 6983badf Leszek Koltunski
      return mMesh.getNumEffComponents();
399 7198e5c9 Leszek Koltunski
      }
400
401
///////////////////////////////////////////////////////////////////////////////////////////////////
402
403
    int getTexComponentNum()
404
      {
405 6983badf Leszek Koltunski
      return mMesh.getNumTexComponents();
406 48c88f57 Leszek Koltunski
      }
407 dc10a48d Leszek Koltunski
408
///////////////////////////////////////////////////////////////////////////////////////////////////
409
410
    public void distortedException(Exception ex)
411
      {
412
      android.util.Log.e("MeshFile", ex.getMessage() );
413
      }
414
415
///////////////////////////////////////////////////////////////////////////////////////////////////
416
417
    public int openGlVersion()
418
      {
419
      Context context = mView.getContext();
420
      final ActivityManager activityManager     = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
421
      final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
422
      int glESversion = configurationInfo.reqGlEsVersion;
423
      int major = glESversion >> 16;
424
      int minor = glESversion & 0xff;
425
426
      return 100*major + 10*minor;
427
      }
428
429
///////////////////////////////////////////////////////////////////////////////////////////////////
430
431
    public InputStream localFile(int fileID)
432
      {
433
      return mResources.openRawResource(fileID);
434
      }
435
436
///////////////////////////////////////////////////////////////////////////////////////////////////
437
438
    public void logMessage(String message)
439
      {
440
      android.util.Log.e("MeshFile", message );
441
      }
442 42aa970f Leszek Koltunski
}