/*******************************************************************************
* 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.g3d.materials;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.utils.Pool;
public class ColorAttribute extends MaterialAttribute {
static final public String diffuse = "diffuseColor";
static final public String specular = "specularColor";
static final public String emissive = "emissiveColor";
static final public String rim = "rimColor";
static final public String fog = "fogColor";
public final Color color = new Color();
protected ColorAttribute() {
}
/**
* Creates a {@link MaterialAttribute} that is a pure {@link Color}.
*
* @param color
* The {@link Color} that you wish the attribute to represent.
* @param name
* The name of the uniform in the {@link ShaderProgram} that will have its value set to this color. (A
* 'name' does not matter for a game that uses {@link GL10}).
*/
public ColorAttribute(Color color, String name) {
super(name);
this.color.set(color);
}
@Override
public void bind() {
if (Gdx.gl10 == null)
throw new RuntimeException("Can't call ColorAttribute.bind() in a GL20 context");
// todo how about emissive or specular?
// TODO replace string equals with something more performant
if (diffuse.equals(diffuse))
Gdx.gl10.glColor4f(color.r, color.g, color.b, color.a);
}
@Override
public void bind(ShaderProgram program) {
program.setUniformf(name, color.r, color.g, color.b, color.a);
}
@Override
public MaterialAttribute copy() {
return new ColorAttribute(color, name);
}
@Override
public void set(MaterialAttribute attr) {
ColorAttribute colAttr = (ColorAttribute) attr;
name = colAttr.name;
final Color c = colAttr.color;
color.r = c.r;
color.g = c.g;
color.b = c.b;
color.a = c.a;
}
private final static Pool<ColorAttribute> pool = new Pool<ColorAttribute>() {
@Override
protected ColorAttribute newObject() {
return new ColorAttribute();
}
};
@Override
public MaterialAttribute pooledCopy() {
ColorAttribute attr = pool.obtain();
attr.set(this);
return attr;
}
@Override
public void free() {
if (isPooled)
pool.free(this);
}
}