Project

General

Profile

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

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

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 1af8e143 Leszek Koltunski
import android.content.Context;
23
import android.content.res.Resources;
24 42aa970f Leszek Koltunski
import android.graphics.Bitmap;
25
import android.graphics.Canvas;
26
import android.graphics.Paint;
27
import android.opengl.GLSurfaceView;
28
29
import org.distorted.library.effect.MatrixEffectQuaternion;
30
import org.distorted.library.effect.MatrixEffectScale;
31
import org.distorted.library.main.DistortedEffects;
32
import org.distorted.library.main.DistortedLibrary;
33
import org.distorted.library.main.DistortedScreen;
34
import org.distorted.library.main.DistortedTexture;
35
import org.distorted.library.mesh.MeshBase;
36 1af8e143 Leszek Koltunski
import org.distorted.library.mesh.MeshFile;
37 42aa970f Leszek Koltunski
import org.distorted.library.type.DynamicQuat;
38
import org.distorted.library.type.Static3D;
39
import org.distorted.library.type.Static4D;
40
41 1af8e143 Leszek Koltunski
import java.io.DataInputStream;
42
import java.io.IOException;
43
import java.io.InputStream;
44
45 42aa970f Leszek Koltunski
import javax.microedition.khronos.egl.EGLConfig;
46
import javax.microedition.khronos.opengles.GL10;
47
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49
50
class MeshFileRenderer implements GLSurfaceView.Renderer
51
{
52
    private GLSurfaceView mView;
53
    private DistortedTexture mTexture;
54
    private DistortedScreen mScreen;
55
    private DistortedEffects mEffects;
56
    private Static3D mScale;
57
    private MeshBase mMesh;
58
59
    Static4D mQuat1, mQuat2;
60
    int mScreenMin;
61
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63
64
    MeshFileRenderer(GLSurfaceView v)
65
      {
66
      mView = v;
67
      mScreen = new DistortedScreen();
68
      mScale= new Static3D(1,1,1);
69
      Static3D center=new Static3D(0,0,0);
70
71
      mQuat1 = new Static4D(0,0,0,1);
72
      mQuat2 = new Static4D(-0.25189602f,0.3546389f,0.009657208f,0.90038127f);
73
74
      DynamicQuat quatInt1 = new DynamicQuat(0,0.5f);
75
      DynamicQuat quatInt2 = new DynamicQuat(0,0.5f);
76
77
      quatInt1.add(mQuat1);
78
      quatInt2.add(mQuat2);
79
80
      mEffects = new DistortedEffects();
81
      mEffects.apply( new MatrixEffectQuaternion(quatInt2, center) );
82
      mEffects.apply( new MatrixEffectQuaternion(quatInt1, center) );
83
      mEffects.apply( new MatrixEffectScale(mScale));
84
85
      mScreen.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
86
      }
87
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89
   
90
    public void onDrawFrame(GL10 glUnused) 
91
      {
92
      mScreen.render( System.currentTimeMillis() );
93
      }
94
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96
    
97
    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
98
      {
99
      final float SCALE = 0.3f;
100
      mScreenMin = Math.min(width, height);
101
      float factor = SCALE*mScreenMin;
102
      mScale.set(factor,factor,factor);
103
      mScreen.resize(width, height);
104
      }
105
106
///////////////////////////////////////////////////////////////////////////////////////////////////
107
    
108
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
109
      {
110
      if( mTexture==null ) mTexture = new DistortedTexture();
111 1af8e143 Leszek Koltunski
      mTexture.setTexture( createTexture(0) );
112 42aa970f Leszek Koltunski
113
      try
114
        {
115
        DistortedLibrary.onCreate(mView.getContext());
116
        }
117
      catch(Exception ex)
118
        {
119 71c7624f Leszek Koltunski
        android.util.Log.e("MeshFile", ex.getMessage() );
120 42aa970f Leszek Koltunski
        }
121
      }
122
123
///////////////////////////////////////////////////////////////////////////////////////////////////
124
125 1af8e143 Leszek Koltunski
    void open(int resourceID)
126 42aa970f Leszek Koltunski
      {
127 acad428e Leszek Koltunski
      long t1 = System.currentTimeMillis();
128 1af8e143 Leszek Koltunski
      mMesh = createMesh(resourceID);
129 acad428e Leszek Koltunski
      long t2 = System.currentTimeMillis();
130
131
      android.util.Log.e("file", "time: "+(t2-t1));
132 42aa970f Leszek Koltunski
133 71c7624f Leszek Koltunski
      mScreen.detachAll();
134
      mScreen.attach(mTexture,mEffects,mMesh);
135 42aa970f Leszek Koltunski
      }
136
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
139 1af8e143 Leszek Koltunski
    private Bitmap createTexture(int resourceID)
140 42aa970f Leszek Koltunski
      {
141 1af8e143 Leszek Koltunski
      final int[] FACE_COLORS = new int[] { 0xffffff00, 0xff00ff00, 0xff0000ff, 0xffff0000 };
142
      final int FACES=FACE_COLORS.length;
143
      int SIZE = 200;
144
      float STROKE = 0.05f*SIZE;
145
      float OFF = STROKE/2 -1;
146
      float OFF2 = 0.5f*SIZE + OFF;
147
      float HEIGHT = SIZE - OFF;
148
      float RADIUS = SIZE/12;
149
      float ARC1_H = 0.2f*SIZE;
150
      float ARC1_W = SIZE*0.5f;
151
      float ARC2_W = 0.153f*SIZE;
152
      float ARC2_H = 0.905f*SIZE;
153
      float ARC3_W = SIZE-ARC2_W;
154
155
      Bitmap result = Bitmap.createBitmap(FACES*SIZE,SIZE, Bitmap.Config.ARGB_8888);
156
      Canvas canvas = new Canvas(result);
157
      Paint paint = new Paint();
158
      paint.setAntiAlias(true);
159
      paint.setStrokeWidth(STROKE);
160
161
      for(int i=0; i<FACES; i++)
162
        {
163
        paint.setColor(FACE_COLORS[i]);
164
        paint.setStyle(Paint.Style.FILL);
165
166
        canvas.drawRect(i*SIZE,0,(i+1)*SIZE,SIZE,paint);
167
168
        paint.setColor(0xff000000);
169
        paint.setStyle(Paint.Style.STROKE);
170
171
        canvas.drawLine(           i*SIZE, HEIGHT,  SIZE       +i*SIZE, HEIGHT, paint);
172
        canvas.drawLine(      OFF +i*SIZE,   SIZE,       OFF2  +i*SIZE,      0, paint);
173
        canvas.drawLine((SIZE-OFF)+i*SIZE,   SIZE, (SIZE-OFF2) +i*SIZE,      0, paint);
174
175
        canvas.drawArc( ARC1_W-RADIUS+i*SIZE, ARC1_H-RADIUS, ARC1_W+RADIUS+i*SIZE, ARC1_H+RADIUS, 225, 90, false, paint);
176
        canvas.drawArc( ARC2_W-RADIUS+i*SIZE, ARC2_H-RADIUS, ARC2_W+RADIUS+i*SIZE, ARC2_H+RADIUS, 105, 90, false, paint);
177
        canvas.drawArc( ARC3_W-RADIUS+i*SIZE, ARC2_H-RADIUS, ARC3_W+RADIUS+i*SIZE, ARC2_H+RADIUS, 345, 90, false, paint);
178
        }
179 42aa970f Leszek Koltunski
180 1af8e143 Leszek Koltunski
      return result;
181 42aa970f Leszek Koltunski
      }
182
183
///////////////////////////////////////////////////////////////////////////////////////////////////
184
185 1af8e143 Leszek Koltunski
    private MeshBase createMesh(int resourceID)
186 42aa970f Leszek Koltunski
      {
187 1af8e143 Leszek Koltunski
      Context con = mView.getContext();
188
      Resources res = con.getResources();
189
      InputStream is = res.openRawResource(resourceID);
190
      DataInputStream dos = new DataInputStream(is);
191
      MeshBase mesh = new MeshFile(dos);
192
193
      try
194
        {
195
        is.close();
196
        }
197
      catch(IOException e)
198
        {
199
        android.util.Log.e("meshFile", "Error closing InputStream: "+e.toString());
200
        }
201 42aa970f Leszek Koltunski
202 1af8e143 Leszek Koltunski
      return mesh;
203 42aa970f Leszek Koltunski
      }
204
}