Laborator 6

Laborator 6

import javax.microedition.khronos.opengles.GL10;

import javax.microedition.khronos.opengles.GL11;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.nio.FloatBuffer;

import android.content.Context;

import android.graphics.*;

import android.opengl.*;

public class Square {

private FloatBuffer mFVertexBuffer;

private FloatBuffer mColorBuffer;

private FloatBuffer mTextureCoords0;

private FloatBuffer mTextureCoords1;

private ByteBuffer mIndexBuffer;

private int mTexture0;

private int mTexture1;

public Square(float colors[])

{

float vertices[] =

{

-1.0f, -1.0f,

1.0f, -1.0f,

-1.0f, 1.0f,

1.0f, 1.0f

};

float textureCoords[] =

{

0.0f, 1.0f,

1.0f, 1.0f,

0.0f, 0.0f,

1.0f, 0.0f

};

byte indices[] =

{

0, 3, 1,

0, 2, 3

};

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);

vbb.order(ByteOrder.nativeOrder());

mFVertexBuffer = vbb.asFloatBuffer();

mFVertexBuffer.put(vertices);

mFVertexBuffer.position(0);

vbb = ByteBuffer.allocateDirect(colors.length * 4);

vbb.order(ByteOrder.nativeOrder());

mColorBuffer = vbb.asFloatBuffer();

mColorBuffer.put(colors);

mColorBuffer.position(0);

mIndexBuffer = ByteBuffer.allocateDirect(indices.length);

mIndexBuffer.put(indices);

mIndexBuffer.position(0);

vbb = ByteBuffer.allocateDirect(textureCoords.length * 4);

vbb.order(ByteOrder.nativeOrder());

mTextureCoords0 = vbb.asFloatBuffer();

mTextureCoords0.put(textureCoords);

mTextureCoords0.position(0);

vbb = ByteBuffer.allocateDirect(textureCoords.length * 4);

vbb.order(ByteOrder.nativeOrder());

mTextureCoords1 = vbb.asFloatBuffer();

mTextureCoords1.put(textureCoords);

mTextureCoords1.position(0);

}

public void draw(GL10 gl)

{

gl.glEnable(GL10.GL_TEXTURE_2D);

gl.glBindTexture(GL10.GL_TEXTURE_2D,mTexture0);

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glFrontFace(GL11.GL_CW);

gl.glVertexPointer(2, GL11.GL_FLOAT, 0, mFVertexBuffer);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glColorPointer(4, GL11.GL_FLOAT, 0, mColorBuffer);

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

gl.glClientActiveTexture(GL10.GL_TEXTURE0);

gl.glTexCoordPointer(2, GL10.GL_FLOAT,0,mTextureCoords0);

gl.glClientActiveTexture(GL10.GL_TEXTURE1);

gl.glTexCoordPointer(2, GL10.GL_FLOAT,0,mTextureCoords1);

// multiTexture(gl,mTexture0,mTexture1);

gl.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_BYTE, mIndexBuffer);

gl.glFrontFace(GL11.GL_CCW);

}

public void setTextures(GL10 gl,Context context,int resourceID0, int resourceID1)

{

mTexture0=createTexture(gl,context,resourceID0);

mTexture1=createTexture(gl,context,resourceID1);

}

public int createTexture(GL10 gl, Context contextRegf, int resource)

{

int[] textures = new int[1];

Bitmap tempImage = BitmapFactory.decodeResource(contextRegf.getResources(), resource); // 1

gl.glGenTextures(1, textures, 0); // 2

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); // 3

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, tempImage, 0); // 4

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); // 5a

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); // 5b

tempImage.recycle();//6

return textures[0];

}

public void multiTexture(GL10 gl, int tex0, int tex1)

{

float combineParameter= GL10.GL_DECAL; //1

// float combineParameter = GL10.GL_MODULATE;

// Set up the First Texture.

gl.glActiveTexture(GL10.GL_TEXTURE0); //2

gl.glBindTexture(GL10.GL_TEXTURE_2D, tex0); //3

// Set up the Second Texture.

gl.glActiveTexture(GL10.GL_TEXTURE1);

gl.glBindTexture(GL10.GL_TEXTURE_2D, tex1);

// Set the texture environment mode for this texture to combine.

gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, combineParameter); //4

}

}

import javax.microedition.khronos.opengles.GL10;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL11;

import android.opengl.GLSurfaceView;

import java.lang.Math;

import android.content.Context;

public class SquareRenderer implements GLSurfaceView.Renderer {

private Square mSquare1;

private Square mSquare2;

private Context mContext;

private float mTransY;

private float mAngle;

public SquareRenderer(Context context)

{

float squareColorsYMCA[] =

{

1.0f, 1.0f, 0.0f, 1.0f,

0.0f, 1.0f, 1.0f, 1.0f,

0.0f, 0.0f, 0.0f, 1.0f,

1.0f, 0.0f, 1.0f, 1.0f

};

float squareColorsRGBA[] =

{

1.0f, 0.0f, 0.0f, 1.0f,

0.0f, 1.0f, 0.0f, 1.0f,

0.0f, 0.0f, 1.0f, 1.0f,

1.0f, 1.0f, 1.0f, 1.0f

};

mContext = context;

mSquare1 = new Square(squareColorsYMCA);

mSquare2 = new Square(squareColorsRGBA);

}

public void onDrawFrame(GL10 gl)

{

gl.glClearColor(0.0f,0.0f,0.0f,1.0f);

gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

gl.glMatrixMode(GL11.GL_MODELVIEW);

gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);

gl.glColor4f(1.0f,1.0f,1.0f,1.0f);

gl.glLoadIdentity();

gl.glTranslatef(0.0f,(float)Math.sin(mTransY), -3.0f);

mSquare1.draw(gl); mSquare2.draw(gl);

gl.glLoadIdentity();

gl.glTranslatef((float)(Math.sin(mTransY)/2.0f),0.0f, -2.9f);

gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);

mSquare1.draw(gl);mSquare2.draw(gl);

mTransY += .075f;

}

public void onSurfaceChanged(GL10 gl, int width, int height)

{

gl.glViewport(0, 0, width, height);

float ratio = (float) width / height;

gl.glMatrixMode(GL11.GL_PROJECTION);

gl.glLoadIdentity();

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);

}

public void onSurfaceCreated(GL10 gl, EGLConfig config)

{

gl.glDisable(GL11.GL_DITHER);

gl.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT,

GL11.GL_FASTEST);

gl.glClearColor(.0f,.5f,.5f,1.0f);

gl.glEnable(GL11.GL_CULL_FACE);

gl.glShadeModel(GL11.GL_SMOOTH);

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glDisable(GL11.GL_DEPTH_TEST);

gl.glEnable(GL11.GL_BLEND);

mSquare1.setTextures(gl,mContext,R.drawable.goldengate,R.drawable.splash);

mSquare2.setTextures(gl,mContext,R.drawable.splash,R.drawable.goldengate);

// mSquare2.setTextures(gl,mContext,R.drawable.goldengate,R.drawable.splash);

}

}

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.opengl.GLSurfaceView;

import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

GLSurfaceView view = new GLSurfaceView(this);

view.setRenderer(new SquareRenderer(this.getApplicationContext()));

setContentView(view);

}

}