Project

General

Profile

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

library / src / main / java / org / distorted / library / DistortedTexture.java @ a09ada4c

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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.library;
21

    
22
import android.graphics.Bitmap;
23
import android.graphics.Matrix;
24
import android.opengl.GLES30;
25
import android.opengl.GLUtils;
26

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28
/**
29
 * Class which represents a OpenGL Texture object.
30
 * <p>
31
 * Create a Texture of arbitrary size and feed some pixels to it via the setTexture() method.
32
 */
33
public class DistortedTexture extends DistortedSurface implements DistortedInputSurface
34
  {
35
  private Bitmap mBmp= null;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38
// We have to flip vertically every single Bitmap that we get fed with.
39
//
40
// Reason: textures read from files are the only objects in OpenGL which have their origins at the
41
// upper-left corner. Everywhere else the origin is in the lower-left corner. Thus we have to flip.
42
// The alternative solution, namely inverting the y-coordinate of the TexCoord does not really work-
43
// i.e. it works only in case of rendering directly to the screen, but if we render to an FBO and
44
// then take the FBO and render to screen, (DistortedNode does so!) things get inverted as textures
45
// created from FBO have their origins in the lower-left... Mindfuck!
46

    
47
  private static Bitmap flipBitmap(Bitmap src)
48
    {
49
    Matrix matrix = new Matrix();
50
    matrix.preScale(1.0f,-1.0f);
51

    
52
    return Bitmap.createBitmap(src,0,0,src.getWidth(),src.getHeight(), matrix,true);
53
    }
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56
// must be called from a thread holding OpenGL Context
57

    
58
  public void create()
59
    {
60
    if( mBmp!=null && mColorH !=null )
61
      {
62
      if( mColorH[0]==NOT_CREATED_YET )
63
        {
64
        GLES30.glGenTextures(1, mColorH, 0);
65
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mColorH[0]);
66
        GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR );
67
        GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR );
68
        GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE );
69
        GLES30.glTexParameteri ( GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE );
70
        GLUtils.texImage2D(GLES30.GL_TEXTURE_2D, 0, flipBitmap(mBmp), 0);
71
        }
72
      else
73
        {
74
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mColorH[0]);
75
        GLUtils.texSubImage2D(GLES30.GL_TEXTURE_2D, 0,0,0,flipBitmap(mBmp));
76
        }
77

    
78
      mBmp = null;
79
      }
80
    }
81

    
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83
// must be called from a thread holding OpenGL Context
84

    
85
  void delete()
86
    {
87
    if( mColorH !=null && mColorH[0]>=0 )
88
      {
89
      GLES30.glDeleteTextures(1, mColorH, 0);
90
      mColorH[0] = NOT_CREATED_YET;
91
      }
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95
// called from onDestroy(); mark OpenGL assets as 'not created'
96

    
97
  void destroy()
98
    {
99
    if( mColorH[0]!=DONT_CREATE ) mColorH[0] = NOT_CREATED_YET;
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103

    
104
  static void getUniforms(int mProgramH)
105
    {
106
    int textureH= GLES30.glGetUniformLocation( mProgramH, "u_Texture");
107

    
108
    GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
109
    GLES30.glUniform1i(textureH, 0);
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113
// PUBLIC API
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115
/**
116
 * Create empty texture of given dimensions.
117
 */
118
  public DistortedTexture(int width, int height)
119
    {
120
    super(width,height,NOT_CREATED_YET);
121
    mBmp= null;
122
    }
123

    
124
///////////////////////////////////////////////////////////////////////////////////////////////////
125
/**
126
 * Bind the underlying rectangle of pixels as a OpenGL Texture.
127
 */
128
  public boolean setAsInput()
129
    {
130
    if( mColorH[0]>0 )
131
      {
132
      GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, mColorH[0]);
133
      return true;
134
      }
135

    
136
    return false;
137
    }
138

    
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140
/**
141
 * Sets the underlying android.graphics.Bitmap object.
142
 * <p>
143
 * You can only recycle() the passed Bitmap once the OpenGL context gets created (i.e. after call
144
 * to GLSurfaceView.onSurfaceCreated) because only after this point can the Library upload it to the GPU!
145
 *
146
 * @param bmp The android.graphics.Bitmap object to apply effects to and display.
147
 */
148
  public void setTexture(Bitmap bmp)
149
    {
150
    mBmp= bmp;
151
    }
152
  }
(9-9/20)