/*******************************************************************************
* 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.tests.g3d.shadows.system.classical;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g3d.Attributes;
import com.badlogic.gdx.graphics.g3d.Renderable;
import com.badlogic.gdx.graphics.g3d.shaders.BaseShader;
import com.badlogic.gdx.graphics.g3d.shaders.DefaultShader;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
/** This shader is used by the classical shadow system. This shader supports normal mapping and specular mapping
* @author realitix */
public class MainShader extends DefaultShader {
public static class Config extends DefaultShader.Config {
public ClassicalShadowSystem shadowSystem;
public Config (ClassicalShadowSystem shadowSystem) {
super();
numBones = 12;
numPointLights = 2;
numSpotLights = 5;
numDirectionalLights = 2;
this.shadowSystem = shadowSystem;
}
}
public static class Inputs extends DefaultShader.Inputs {
public final static Uniform shadowTexture = new Uniform("u_shadowTexture");
public final static Uniform resolution = new Uniform("u_resolution");
}
public static class Setters extends DefaultShader.Setters {
public final static Setter shadowTexture = new GlobalSetter() {
@Override
public void set (BaseShader shader, int inputID, Renderable renderable, Attributes combinedAttributes) {
shader.set(inputID, shadowSystem.getMainTexture());
}
};
public final static Setter resolution = new GlobalSetter() {
@Override
public void set (BaseShader shader, int inputID, Renderable renderable, Attributes combinedAttributes) {
// Value must be float type to work !
shader.set(inputID, (float)Gdx.graphics.getBackBufferWidth(), (float)Gdx.graphics.getBackBufferHeight());
}
};
}
protected static ClassicalShadowSystem shadowSystem;
private static String defaultVertexShader = null;
public static String getDefaultVertexShader () {
if (defaultVertexShader == null)
defaultVertexShader = Gdx.files.classpath("com/badlogic/gdx/tests/g3d/shadows/system/classical/main.vertex.glsl")
.readString();
return defaultVertexShader;
}
private static String defaultFragmentShader = null;
public static String getDefaultFragmentShader () {
if (defaultFragmentShader == null)
defaultFragmentShader = Gdx.files.classpath("com/badlogic/gdx/tests/g3d/shadows/system/classical/main.fragment.glsl")
.readString();
return defaultFragmentShader;
}
public static String createPrefix (final Renderable renderable, final Config config) {
return DefaultShader.createPrefix(renderable, config);
}
public MainShader (final Renderable renderable, final Config config) {
this(renderable, config, createPrefix(renderable, config));
}
public MainShader (final Renderable renderable, final Config config, final String prefix) {
this(renderable, config, prefix, getDefaultVertexShader(), getDefaultFragmentShader());
}
public MainShader (final Renderable renderable, final Config config, final String prefix, final String vertexShader,
final String fragmentShader) {
this(renderable, config, new ShaderProgram(prefix + vertexShader, prefix + fragmentShader));
}
public MainShader (final Renderable renderable, final Config config, final ShaderProgram shaderProgram) {
super(renderable, config, shaderProgram);
shadowSystem = config.shadowSystem;
register(Inputs.shadowTexture, Setters.shadowTexture);
register(Inputs.resolution, Setters.resolution);
}
}