package org.sunflow.core.modifiers; import org.sunflow.SunflowAPI; import org.sunflow.core.Modifier; import org.sunflow.core.ParameterList; import org.sunflow.core.ShadingState; import org.sunflow.core.Texture; import org.sunflow.core.TextureCache; import org.sunflow.math.OrthoNormalBasis; public class NormalMapModifier implements Modifier { private Texture normalMap; public NormalMapModifier() { normalMap = null; } public boolean update(ParameterList pl, SunflowAPI api) { String filename = pl.getString("texture", null); if (filename != null) normalMap = TextureCache.getTexture(api.resolveTextureFilename(filename), true); return normalMap != null; } public void modify(ShadingState state) { // apply normal map state.getNormal().set(normalMap.getNormal(state.getUV().x, state.getUV().y, state.getBasis())); state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal())); } }