package rajawali.materials; import com.monyetmabuk.livewallpapers.photosdof.R; import rajawali.lights.ALight; import android.opengl.GLES20; public class SphereMapMaterial extends AAdvancedMaterial { private int muSphereMapStrengthHandle; private float mSphereMapStrength = .4f; public SphereMapMaterial() { super(R.raw.sphere_material_vertex, R.raw.sphere_material_fragment); } @Override public void useProgram() { super.useProgram(); GLES20.glUniform1f(muSphereMapStrengthHandle, mSphereMapStrength); } public void setShaders(String vertexShader, String fragmentShader) { StringBuffer sb = new StringBuffer(); StringBuffer vc = new StringBuffer(); sb.append("vec3 L = vec3(0.0);\n"); for(int i=0; i<mLights.size(); ++i) { ALight light = mLights.get(i); if(light.getLightType() == ALight.POINT_LIGHT) { sb.append("L = normalize(uLightPosition").append(i).append(" - V.xyz);\n"); vc.append("dist = distance(V.xyz, uLightPosition").append(i).append(");\n"); vc.append("vAttenuation").append(i).append(" = 1.0 / (uLightAttenuation").append(i).append("[1] + uLightAttenuation").append(i).append("[2] * dist + uLightAttenuation").append(i).append("[3] * dist * dist);\n"); } else if(light.getLightType() == ALight.DIRECTIONAL_LIGHT) { vc.append("vAttenuation").append(i).append(" = 1.0;\n"); sb.append("L = -normalize(uLightDirection").append(i).append(");"); } sb.append("intensity += uLightPower").append(i).append(" * max(dot(N, L), 0.1) * vAttenuation").append(i).append(";\n"); } super.setShaders(vertexShader.replace("%LIGHT_CODE%", vc.toString()), fragmentShader.replace("%LIGHT_CODE%", sb.toString())); muSphereMapStrengthHandle = getUniformLocation("uSphereMapStrength"); } public float getSphereMapStrength() { return mSphereMapStrength; } public void setSphereMapStrength(float sphereMapStrength) { this.mSphereMapStrength = sphereMapStrength; } }