Home | History | Annotate | Download | only in tests
      1 /*******************************************************************************
      2  * Copyright 2011 See AUTHORS file.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *   http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  ******************************************************************************/
     16 
     17 package com.badlogic.gdx.tests;
     18 
     19 import com.badlogic.gdx.Gdx;
     20 import com.badlogic.gdx.InputMultiplexer;
     21 import com.badlogic.gdx.graphics.Color;
     22 import com.badlogic.gdx.graphics.Cubemap;
     23 import com.badlogic.gdx.graphics.GL20;
     24 import com.badlogic.gdx.graphics.OrthographicCamera;
     25 import com.badlogic.gdx.graphics.PerspectiveCamera;
     26 import com.badlogic.gdx.graphics.Texture;
     27 import com.badlogic.gdx.graphics.Texture.TextureFilter;
     28 import com.badlogic.gdx.graphics.VertexAttributes.Usage;
     29 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
     30 import com.badlogic.gdx.graphics.g3d.Environment;
     31 import com.badlogic.gdx.graphics.g3d.Material;
     32 import com.badlogic.gdx.graphics.g3d.Model;
     33 import com.badlogic.gdx.graphics.g3d.ModelBatch;
     34 import com.badlogic.gdx.graphics.g3d.ModelInstance;
     35 import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
     36 import com.badlogic.gdx.graphics.g3d.attributes.CubemapAttribute;
     37 import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
     38 import com.badlogic.gdx.graphics.g3d.shaders.DefaultShader.Config;
     39 import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
     40 import com.badlogic.gdx.graphics.g3d.utils.DefaultShaderProvider;
     41 import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
     42 import com.badlogic.gdx.graphics.glutils.KTXTextureData;
     43 import com.badlogic.gdx.graphics.glutils.ShaderProgram;
     44 import com.badlogic.gdx.math.MathUtils;
     45 import com.badlogic.gdx.tests.utils.GdxTest;
     46 
     47 /** Simple test and example for the KTX/ZKTX file format
     48  * @author Vincent Bousquet */
     49 public class KTXTest extends GdxTest {
     50 
     51 	// 3D texture cubemap example
     52 	private PerspectiveCamera perspectiveCamera;
     53 	private CameraInputController inputController;
     54 	private ModelBatch modelBatch;
     55 	private Model model;
     56 	private ModelInstance instance;
     57 	private Environment environment;
     58 	private Cubemap cubemap;
     59 
     60 	// 2D texture alpha ETC1 example
     61 	private OrthographicCamera orthoCamera;
     62 	private Texture image;
     63 	private SpriteBatch batch;
     64 	private ShaderProgram etc1aShader;
     65 
     66 	// animation
     67 	private float time;
     68 
     69 	@Override
     70 	public void create () {
     71 
     72 		// Cubemap test
     73 
     74 		String cubemapVS = "" //
     75 			+ "attribute vec3 a_position;\n"//
     76 			+ "uniform mat4 u_projViewTrans;\n"//
     77 			+ "uniform mat4 u_worldTrans;\n"//
     78 			+ "\n"//
     79 			+ "varying vec3 v_cubeMapUV;\n"//
     80 			+ "\n"//
     81 			+ "void main() {\n"//
     82 			+ "   vec4 g_position = vec4(a_position, 1.0);\n"//
     83 			+ "   g_position = u_worldTrans * g_position;\n"//
     84 			+ "   v_cubeMapUV = normalize(g_position.xyz);\n"//
     85 			+ "   gl_Position = u_projViewTrans * g_position;\n"//
     86 			+ "}";
     87 		String cubemapFS = ""//
     88 			+ "#ifdef GL_ES\n"//
     89 			+ "precision mediump float;\n"//
     90 			+ "#endif\n"//
     91 			+ "uniform samplerCube u_environmentCubemap;\n"//
     92 			+ "varying vec3 v_cubeMapUV;\n"//
     93 			+ "void main() {\n" //
     94 			+ "	gl_FragColor = vec4(textureCube(u_environmentCubemap, v_cubeMapUV).rgb, 1.0);\n" //
     95 			+ "}\n";
     96 		modelBatch = new ModelBatch(new DefaultShaderProvider(new Config(cubemapVS, cubemapFS)));
     97 
     98 		cubemap = new Cubemap(new KTXTextureData(Gdx.files.internal("data/cubemap.zktx"), true));
     99 		cubemap.setFilter(TextureFilter.MipMapLinearLinear, TextureFilter.Linear);
    100 
    101 		environment = new Environment();
    102 		environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.1f, 0.1f, 0.1f, 1.f));
    103 		environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -0.5f, -1.0f, -0.8f));
    104 		environment.set(new CubemapAttribute(CubemapAttribute.EnvironmentMap, cubemap));
    105 
    106 		perspectiveCamera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    107 		perspectiveCamera.position.set(10f, 10f, 10f);
    108 		perspectiveCamera.lookAt(0, 0, 0);
    109 		perspectiveCamera.near = 0.1f;
    110 		perspectiveCamera.far = 300f;
    111 		perspectiveCamera.update();
    112 
    113 		ModelBuilder modelBuilder = new ModelBuilder();
    114 		model = modelBuilder.createBox(5f, 5f, 5f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), Usage.Position
    115 			| Usage.Normal);
    116 		instance = new ModelInstance(model);
    117 
    118 		Gdx.input.setInputProcessor(new InputMultiplexer(this, inputController = new CameraInputController(perspectiveCamera)));
    119 
    120 		// 2D texture test
    121 		String etc1aVS = "" //
    122 			+ "uniform mat4 u_projTrans;\n"//
    123 			+ "\n"//
    124 			+ "attribute vec4 a_position;\n"//
    125 			+ "attribute vec2 a_texCoord0;\n"//
    126 			+ "attribute vec4 a_color;\n"//
    127 			+ "\n"//
    128 			+ "varying vec4 v_color;\n"//
    129 			+ "varying vec2 v_texCoord;\n"//
    130 			+ "\n"//
    131 			+ "void main() {\n"//
    132 			+ "   gl_Position = u_projTrans * a_position;\n"//
    133 			+ "   v_texCoord = a_texCoord0;\n"//
    134 			+ "   v_color = a_color;\n"//
    135 			+ "}\n";//
    136 		String etc1aFS = ""//
    137 			+ "#ifdef GL_ES\n"//
    138 			+ "precision mediump float;\n"//
    139 			+ "#endif\n"//
    140 			+ "uniform sampler2D u_texture;\n"//
    141 			+ "\n"//
    142 			+ "varying vec4 v_color;\n"//
    143 			+ "varying vec2 v_texCoord;\n"//
    144 			+ "\n"//
    145 			+ "void main() {\n"//
    146 			+ "   vec3 col = texture2D(u_texture, v_texCoord.st).rgb;\n"//
    147 			+ "   float alpha = texture2D(u_texture, v_texCoord.st + vec2(0.0, 0.5)).r;\n"//
    148 			+ "   gl_FragColor = vec4(col, alpha) * v_color;\n"//
    149 			+ "}\n";//
    150 		etc1aShader = new ShaderProgram(etc1aVS, etc1aFS);
    151 		orthoCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    152 		image = new Texture("data/egg.zktx");
    153 		batch = new SpriteBatch(100, etc1aShader);
    154 
    155 	}
    156 
    157 	@Override
    158 	public void render () {
    159 		time += Gdx.graphics.getDeltaTime();
    160 		inputController.update();
    161 		int gw = Gdx.graphics.getWidth(), gh = Gdx.graphics.getHeight();
    162 		int pw = gw > gh ? gw / 2 : gw, ph = gw > gh ? gh : gh / 2;
    163 
    164 		Gdx.gl.glClearColor(0, 0, 0, 1);
    165 		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
    166 
    167 		// cubemap
    168 		Gdx.gl.glViewport(gw - pw, gh - ph, pw, ph);
    169 		perspectiveCamera.viewportWidth = pw;
    170 		perspectiveCamera.viewportHeight = ph;
    171 		perspectiveCamera.update();
    172 		modelBatch.begin(perspectiveCamera);
    173 		modelBatch.render(instance, environment);
    174 		modelBatch.end();
    175 
    176 		// 2D texture with alpha & ETC1
    177 		Gdx.gl.glViewport(0, 0, pw, ph);
    178 		orthoCamera.viewportWidth = pw;
    179 		orthoCamera.viewportHeight = ph;
    180 		orthoCamera.update();
    181 		batch.setProjectionMatrix(orthoCamera.combined);
    182 		batch.begin();
    183 		float s = 0.1f + 0.5f * (1 + MathUtils.sinDeg(time * 90.0f));
    184 		float w = s * image.getWidth(), h = s * image.getHeight() / 2, x = -w / 2, y = -h / 2;
    185 		batch.setShader(null);
    186 		batch.disableBlending();
    187 		batch.draw(image, -pw / 2, -ph / 2, pw, ph, 0, 1, 1, 0);
    188 		batch.setShader(etc1aShader);
    189 		batch.enableBlending();
    190 		batch.draw(image, x, y, w, h, 0, 0.5f, 1, 0);
    191 		batch.end();
    192 	}
    193 
    194 	@Override
    195 	public void dispose () {
    196 		modelBatch.dispose();
    197 		model.dispose();
    198 		cubemap.dispose();
    199 		image.dispose();
    200 		batch.dispose();
    201 		etc1aShader.dispose();
    202 	}
    203 
    204 	public boolean needsGL20 () {
    205 		return true;
    206 	}
    207 
    208 	public void resume () {
    209 	}
    210 
    211 	public void resize (int width, int height) {
    212 	}
    213 
    214 	public void pause () {
    215 	}
    216 
    217 }
    218