/*******************************************************************************
* Copyright (c) 2013 Philip Collin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Philip Collin - initial API and implementation
******************************************************************************/
package com.lyeeedar.Roguelike3D.Graphics.Materials;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.Texture.TextureWrap;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.utils.Pool;
import com.lyeeedar.Roguelike3D.Game.GameData;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager;
import com.lyeeedar.Roguelike3D.Graphics.Lights.LightManager.LightQuality;
import com.lyeeedar.Utils.FileUtils;
public class TextureAttribute extends MaterialAttribute {
private static final long serialVersionUID = 3095829882861332616L;
public final static int MAX_TEXTURE_UNITS = 16;
static final public String diffuseTexture = "u_diffuse_texture";
static final public String normalmapTexture = "u_normalmap_texture";
public transient Texture texture;
public int unit;
public TextureFilter minFilter;
public TextureFilter magFilter;
public TextureWrap uWrap;
public TextureWrap vWrap;
public String textureName;
@Override
public int hashCode()
{
return texture.hashCode();
}
public TextureAttribute (String textureName, int unit, TextureFilter minFilter, TextureFilter magFilter, TextureWrap uWrap, TextureWrap vWrap, String textureType) {
this.textureName = textureName;
if (unit+3 > MAX_TEXTURE_UNITS) throw new RuntimeException(MAX_TEXTURE_UNITS + " is max texture units supported");
this.unit = unit;
this.uWrap = uWrap;
this.vWrap = vWrap;
this.minFilter = minFilter;
this.magFilter = magFilter;
name = textureType;
}
private void loadTextures() {
texture = FileUtils.loadTexture(textureName, false);
if (texture != null) {
texture.setWrap( uWrap, vWrap );
texture.setFilter( minFilter, magFilter );
}
}
public TextureAttribute (String textureName, int unit, String textureType) {
this(textureName, unit, TextureFilter.MipMapLinearLinear, TextureFilter.MipMapLinearLinear, TextureWrap.Repeat, TextureWrap.Repeat, textureType);
}
public TextureAttribute() {
}
@Override
public void bind (ShaderProgram program, LightManager lights) {
if (texture == null) return;
texture.bind(unit);
program.setUniformi(diffuseTexture, unit);
}
@Override
public MaterialAttribute copy () {
return new TextureAttribute(textureName, unit, minFilter, magFilter, uWrap, vWrap, name);
}
@Override
public void set (MaterialAttribute attr) {
TextureAttribute texAttr = (TextureAttribute)attr;
name = texAttr.name;
texture = texAttr.texture;
unit = texAttr.unit;
magFilter = texAttr.magFilter;
minFilter = texAttr.minFilter;
uWrap = texAttr.uWrap;
vWrap = texAttr.vWrap;
}
private final static Pool<TextureAttribute> pool = new Pool<TextureAttribute>() {
@Override
protected TextureAttribute newObject () {
return new TextureAttribute();
}
};
@Override
public MaterialAttribute pooledCopy () {
TextureAttribute attr = pool.obtain();
attr.set(this);
return attr;
}
@Override
public void free () {
if (isPooled) pool.free(this);
}
@Override
public void dispose() {
}
@Override
public void create() {
loadTextures();
}
}