/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package com.badlogic.gdx.graphics.glutils; import java.nio.FloatBuffer; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.TextureData; import com.badlogic.gdx.utils.BufferUtils; import com.badlogic.gdx.utils.GdxRuntimeException; /** * A {@link TextureData} implementation which should be used to create float textures. * */ public class FloatTextureData implements TextureData { int width = 0; int height = 0; boolean isPrepared = false; FloatBuffer buffer; public FloatTextureData(int w, int h) { this.width = w; this.height = h; } public String getFileName() { return null; } @Override public TextureDataType getType() { return TextureDataType.Float; } @Override public boolean isPrepared() { return isPrepared; } @Override public void prepare() { if (isPrepared) throw new GdxRuntimeException("Already prepared"); this.buffer = BufferUtils.newFloatBuffer(width * height * 4); isPrepared = true; } @Override public void consumeCompressedData() { if (!Gdx.graphics.supportsExtension("texture_float")) throw new GdxRuntimeException("Extension OES_TEXTURE_FLOAT not supported!"); //this is a const from GL 3.0, used only on desktops final int GL_RGBA32F = 34836; //GLES and WebGL defines texture format by 3rd and 8th argument, //so to get a float texture one needs to supply GL_RGBA and GL_FLOAT there. if (Gdx.app.getType() == ApplicationType.Android || Gdx.app.getType() == ApplicationType.iOS || Gdx.app.getType() == ApplicationType.WebGL) { Gdx.gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, width, height, 0, GL10.GL_RGBA, GL10.GL_FLOAT, buffer); } else { //in desktop OpenGL the texture format is defined only by the third argument, //hence we need to use GL_RGBA32F there (this constant is unavailable in GLES/WebGL) Gdx.gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL10.GL_RGBA, GL10.GL_FLOAT, buffer); } } @Override public Pixmap consumePixmap() { throw new GdxRuntimeException("This TextureData implementation does not return a Pixmap"); } @Override public boolean disposePixmap() { throw new GdxRuntimeException("This TextureData implementation does not return a Pixmap"); } @Override public int getWidth() { return width; } @Override public int getHeight() { return height; } @Override public Format getFormat() { return Format.RGBA8888; //it's not true, but FloatTextureData.getFormat() isn't used anywhere } @Override public boolean useMipMaps() { return false; } @Override public boolean isManaged() { return true; } }