diff --git a/jme3-core/src/main/java/com/jme3/material/MatParamTexture.java b/jme3-core/src/main/java/com/jme3/material/MatParamTexture.java index 8bce967fc..83db2ab6b 100644 --- a/jme3-core/src/main/java/com/jme3/material/MatParamTexture.java +++ b/jme3-core/src/main/java/com/jme3/material/MatParamTexture.java @@ -38,18 +38,27 @@ import com.jme3.export.OutputCapsule; import com.jme3.renderer.Renderer; import com.jme3.shader.VarType; import com.jme3.texture.Texture; +import com.jme3.texture.image.ColorSpace; import java.io.IOException; public class MatParamTexture extends MatParam { private Texture texture; private int unit; + private ColorSpace colorSpace; public MatParamTexture(VarType type, String name, Texture texture, int unit) { super(type, name, texture, null); this.texture = texture; this.unit = unit; } + + public MatParamTexture(VarType type, String name, Texture texture, int unit, ColorSpace colorSpace) { + super(type, name, texture, null); + this.texture = texture; + this.unit = unit; + this.colorSpace = colorSpace; + } public MatParamTexture() { } @@ -72,6 +81,23 @@ public class MatParamTexture extends MatParam { this.texture = (Texture) value; } + /** + * + * @return the color space required by this texture param + */ + public ColorSpace getColorSpace() { + return colorSpace; + } + + /** + * Set to {@link ColorSpace#Linear} if the texture color space has to be forced to linear + * instead of sRGB + * @param colorSpace @see ColorSpace + */ + public void setColorSpace(ColorSpace colorSpace) { + this.colorSpace = colorSpace; + } + public void setUnit(int unit) { this.unit = unit; } diff --git a/jme3-core/src/main/java/com/jme3/material/Material.java b/jme3-core/src/main/java/com/jme3/material/Material.java index 827512b6f..9faae039b 100644 --- a/jme3-core/src/main/java/com/jme3/material/Material.java +++ b/jme3-core/src/main/java/com/jme3/material/Material.java @@ -52,6 +52,7 @@ import com.jme3.shader.Uniform; import com.jme3.shader.UniformBindingManager; import com.jme3.shader.VarType; import com.jme3.texture.Texture; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.ListMap; import com.jme3.util.TempVars; import java.io.IOException; @@ -536,6 +537,13 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { checkSetParam(type, name); MatParamTexture val = getTextureParam(name); if (val == null) { + MatParamTexture paramDef = (MatParamTexture)def.getMaterialParam(name); + if(paramDef.getColorSpace() != null && paramDef.getColorSpace() != value.getImage().getColorSpace()){ + value.getImage().setColorSpace(paramDef.getColorSpace()); + logger.log(Level.FINE, "Material parameter {0} needs a {1} texture, texture {2} was switched to {3} color space.", new Object[]{name, paramDef.getColorSpace().toString(), value.getName(), value.getImage().getColorSpace().name()}); + }else if(paramDef.getColorSpace() == null && value.getName() != null && value.getImage().getColorSpace() == ColorSpace.Linear){ + logger.log(Level.WARNING, "texture {0} has a {1} color space, but material parameter {2} has no color space requirement, this may lead to unexpected behavior.\n Cheack wether the image was not set to another material parameter with a linear color space, or that you did not set the ColorSpace to Linear using texture.getImage.setColorSpace().", new Object[]{value.getName(), value.getImage().getColorSpace().name(),name}); + } paramValues.put(name, new MatParamTexture(type, name, value, nextTexUnit++)); } else { val.setTextureValue(value); diff --git a/jme3-core/src/main/java/com/jme3/material/MaterialDef.java b/jme3-core/src/main/java/com/jme3/material/MaterialDef.java index 374e257de..8a85eacd0 100644 --- a/jme3-core/src/main/java/com/jme3/material/MaterialDef.java +++ b/jme3-core/src/main/java/com/jme3/material/MaterialDef.java @@ -33,6 +33,7 @@ package com.jme3.material; import com.jme3.asset.AssetManager; import com.jme3.shader.VarType; +import com.jme3.texture.image.ColorSpace; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -124,6 +125,20 @@ public class MaterialDef { matParams.put(name, new MatParam(type, name, value, ffBinding)); } + /** + * Adds a new material parameter. + * + * @param type Type of the parameter + * @param name Name of the parameter + * @param value Default value of the parameter + * @param ffBinding Fixed function binding for the parameter + * @param colorSpace the color space of the texture required by thiis texture param + * @see ColorSpace + */ + public void addMaterialParamTexture(VarType type, String name, ColorSpace colorSpace) { + matParams.put(name, new MatParamTexture(type, name, null , 0, colorSpace)); + } + /** * Returns the material parameter with the given name. * diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index 63f25ffb3..3bbeccca9 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -34,6 +34,7 @@ package com.jme3.texture; import com.jme3.export.*; import com.jme3.renderer.Caps; import com.jme3.renderer.Renderer; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import com.jme3.util.NativeObject; import java.io.IOException; @@ -334,7 +335,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { protected ArrayList data; protected transient Object efficientData; protected int multiSamples = 1; - protected boolean srgb; + protected ColorSpace colorSpace = null; // protected int mipOffset = 0; // attributes relating to GL object @@ -448,12 +449,11 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * the image data. * @param mipMapSizes * the array of mipmap sizes, or null for no mipmaps. - * @param isSrgb - * true if the image in is sRGB color space false for linear - *color space + * @param colorSpace + * @see ColorSpace the colorSpace of the image */ public Image(Format format, int width, int height, int depth, ArrayList data, - int[] mipMapSizes, boolean isSrgb) { + int[] mipMapSizes, ColorSpace colorSpace) { this(); @@ -470,7 +470,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { this.data = data; this.depth = depth; this.mipMapSizes = mipMapSizes; - this.srgb = isSrgb; + this.colorSpace = colorSpace; } /** @@ -486,7 +486,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { @Deprecated public Image(Format format, int width, int height, int depth, ArrayList data, int[] mipMapSizes) { - this(format, width, height, depth, data, mipMapSizes, false); + this(format, width, height, depth, data, mipMapSizes, ColorSpace.Linear); } /** @@ -503,12 +503,11 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * the image data. * @param mipMapSizes * the array of mipmap sizes, or null for no mipmaps. - * @param isSrgb - * true if the image in is sRGB color space false for linear - * color space + * @param colorSpace + * @see ColorSpace the colorSpace of the image */ public Image(Format format, int width, int height, ByteBuffer data, - int[] mipMapSizes, boolean isSrgb) { + int[] mipMapSizes, ColorSpace colorSpace) { this(); @@ -527,7 +526,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { this.data.add(data); } this.mipMapSizes = mipMapSizes; - this.srgb = isSrgb; + this.colorSpace = colorSpace; } /** @@ -542,7 +541,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { @Deprecated public Image(Format format, int width, int height, ByteBuffer data, int[] mipMapSizes) { - this(format, width, height, data, mipMapSizes, false); + this(format, width, height, data, mipMapSizes, ColorSpace.Linear); } /** @@ -557,12 +556,11 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * the height of the image. * @param data * the image data. - * @param isSrgb - * true if the image in is sRGB color space false for linear - * color space + * @param colorSpace + * @see ColorSpace the colorSpace of the image */ - public Image(Format format, int width, int height, int depth, ArrayList data, boolean isSrgb) { - this(format, width, height, depth, data, null, isSrgb); + public Image(Format format, int width, int height, int depth, ArrayList data, ColorSpace colorSpace) { + this(format, width, height, depth, data, null, colorSpace); } /** @@ -576,7 +574,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { */ @Deprecated public Image(Format format, int width, int height, int depth, ArrayList data) { - this(format, width, height, depth, data, false); + this(format, width, height, depth, data, ColorSpace.Linear); } /** @@ -591,12 +589,11 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * the height of the image. * @param data * the image data. - * @param isSrgb - * true if the image in is sRGB color space false for linear - * color space + * @param colorSpace + * @see ColorSpace the colorSpace of the image */ - public Image(Format format, int width, int height, ByteBuffer data, boolean isSrgb) { - this(format, width, height, data, null, isSrgb); + public Image(Format format, int width, int height, ByteBuffer data, ColorSpace colorSpace) { + this(format, width, height, data, null, colorSpace); } @@ -610,7 +607,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { */ @Deprecated public Image(Format format, int width, int height, ByteBuffer data) { - this(format, width, height, data, null, false); + this(format, width, height, data, null, ColorSpace.Linear); } @@ -865,24 +862,24 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { } /** - * image loader is responsible for setting this flag based on the color + * image loader is responsible for setting this attribute based on the color * space in which the image has been encoded with. In the majority of cases, - * this flag will be on by default since many image formats do not contain - * any color space information. + * this flag will be set to sRGB by default since many image formats do not + * contain any color space information and the most frequently used colors + * space is sRGB * - * The material loader may override this flag to false if it determines that + * The material loader may override this attribute to Lineat if it determines that * such conversion must not be performed, for example, when loading normal * maps. * - * @param srgb True to enable SRGB -> linear conversion, false otherwise. + * @param colorSpace @see ColorSpace. Set to sRGB to enable srgb -> linear + * conversion, Linear otherwise. * * @seealso Renderer#setLinearizeSrgbImages(boolean) * - * @throws InvalidStateException If the image format does not support SRGB - * -> linear conversion. */ - public void setSrgb(boolean srgb) { - this.srgb = srgb; + public void setColorSpace(ColorSpace colorSpace) { + this.colorSpace = colorSpace; } /** @@ -898,8 +895,8 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ { * * @seealso Renderer#setLinearizeSrgbImages(boolean) */ - public boolean isSrgb() { - return srgb; + public ColorSpace getColorSpace() { + return colorSpace; } @Override diff --git a/jme3-core/src/main/java/com/jme3/texture/Texture2D.java b/jme3-core/src/main/java/com/jme3/texture/Texture2D.java index 55be82277..7eba44adc 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Texture2D.java +++ b/jme3-core/src/main/java/com/jme3/texture/Texture2D.java @@ -35,6 +35,7 @@ import com.jme3.export.InputCapsule; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; import com.jme3.export.OutputCapsule; +import com.jme3.texture.image.ColorSpace; import java.io.IOException; /** @@ -76,7 +77,7 @@ public class Texture2D extends Texture { * @param format */ public Texture2D(int width, int height, Image.Format format){ - this(new Image(format, width, height, null, false)); + this(new Image(format, width, height, null, ColorSpace.Linear)); } /** @@ -91,7 +92,7 @@ public class Texture2D extends Texture { * @param numSamples */ public Texture2D(int width, int height, int numSamples, Image.Format format){ - this(new Image(format, width, height, null, false)); + this(new Image(format, width, height, null, ColorSpace.Linear)); getImage().setMultiSamples(numSamples); } diff --git a/jme3-core/src/main/java/com/jme3/texture/Texture3D.java b/jme3-core/src/main/java/com/jme3/texture/Texture3D.java index 583e546ee..c94d7c3ad 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Texture3D.java +++ b/jme3-core/src/main/java/com/jme3/texture/Texture3D.java @@ -35,6 +35,7 @@ import com.jme3.export.InputCapsule; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; import com.jme3.export.OutputCapsule; +import com.jme3.texture.image.ColorSpace; import java.io.IOException; /** @@ -78,7 +79,7 @@ public class Texture3D extends Texture { * @param format */ public Texture3D(int width, int height, int depth, Image.Format format) { - this(new Image(format, width, height, depth, null, false)); + this(new Image(format, width, height, depth, null, ColorSpace.Linear)); } /** @@ -93,7 +94,7 @@ public class Texture3D extends Texture { * @param numSamples */ public Texture3D(int width, int height, int depth, int numSamples, Image.Format format) { - this(new Image(format, width, height, depth, null, false)); + this(new Image(format, width, height, depth, null, ColorSpace.Linear)); getImage().setMultiSamples(numSamples); } diff --git a/jme3-core/src/main/java/com/jme3/texture/TextureArray.java b/jme3-core/src/main/java/com/jme3/texture/TextureArray.java index b1251eb42..20ff1b2fa 100644 --- a/jme3-core/src/main/java/com/jme3/texture/TextureArray.java +++ b/jme3-core/src/main/java/com/jme3/texture/TextureArray.java @@ -32,6 +32,7 @@ package com.jme3.texture; import com.jme3.texture.Image.Format; +import com.jme3.texture.image.ColorSpace; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -70,8 +71,8 @@ public class TextureArray extends Texture { int width = images.get(0).getWidth(); int height = images.get(0).getHeight(); Format format = images.get(0).getFormat(); - boolean isSRGB = images.get(0).isSrgb(); - Image arrayImage = new Image(format, width, height, null, isSRGB); + ColorSpace colorSpace = images.get(0).getColorSpace(); + Image arrayImage = new Image(format, width, height, null, colorSpace); for (Image img : images) { if (img.getHeight() != height || img.getWidth() != width) { diff --git a/jme3-core/src/main/java/com/jme3/texture/TextureCubeMap.java b/jme3-core/src/main/java/com/jme3/texture/TextureCubeMap.java index e1cc52b73..e2447fac2 100644 --- a/jme3-core/src/main/java/com/jme3/texture/TextureCubeMap.java +++ b/jme3-core/src/main/java/com/jme3/texture/TextureCubeMap.java @@ -35,6 +35,7 @@ import com.jme3.export.InputCapsule; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; import com.jme3.export.OutputCapsule; +import com.jme3.texture.image.ColorSpace; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -88,7 +89,7 @@ public class TextureCubeMap extends Texture { for(int i = 0; i < layerCount; i++) { layers.add(null); } - Image image = new Image(format, width, height, 0, layers, false); + Image image = new Image(format, width, height, 0, layers, ColorSpace.Linear); return image; } diff --git a/jme3-core/src/main/java/com/jme3/texture/image/ColorSpace.java b/jme3-core/src/main/java/com/jme3/texture/image/ColorSpace.java new file mode 100644 index 000000000..d53fea07d --- /dev/null +++ b/jme3-core/src/main/java/com/jme3/texture/image/ColorSpace.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2009-2012 jMonkeyEngine + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'jMonkeyEngine' nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jme3.texture.image; + + +public enum ColorSpace{ + + sRGB, + Linear + +} diff --git a/jme3-core/src/main/java/com/jme3/util/PlaceholderAssets.java b/jme3-core/src/main/java/com/jme3/util/PlaceholderAssets.java index f34bb1ff0..c485b00ba 100644 --- a/jme3-core/src/main/java/com/jme3/util/PlaceholderAssets.java +++ b/jme3-core/src/main/java/com/jme3/util/PlaceholderAssets.java @@ -41,6 +41,7 @@ import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; +import com.jme3.texture.image.ColorSpace; import java.nio.ByteBuffer; public class PlaceholderAssets { @@ -73,7 +74,7 @@ public class PlaceholderAssets { public static Image getPlaceholderImage(){ ByteBuffer tempData = BufferUtils.createByteBuffer(3 * 4 * 4); tempData.put(imageData).flip(); - return new Image(Format.RGB8, 4, 4, tempData, null, false); + return new Image(Format.RGB8, 4, 4, tempData, null, ColorSpace.Linear); } public static Material getPlaceholderMaterial(AssetManager assetManager){ diff --git a/jme3-core/src/main/java/com/jme3/util/SkyFactory.java b/jme3-core/src/main/java/com/jme3/util/SkyFactory.java index 20d9fc39f..082f199f4 100644 --- a/jme3-core/src/main/java/com/jme3/util/SkyFactory.java +++ b/jme3-core/src/main/java/com/jme3/util/SkyFactory.java @@ -243,7 +243,7 @@ public class SkyFactory { checkImagesForCubeMap(westImg, eastImg, northImg, southImg, upImg, downImg); - Image cubeImage = new Image(westImg.getFormat(), westImg.getWidth(), westImg.getHeight(), null, westImg.isSrgb()); + Image cubeImage = new Image(westImg.getFormat(), westImg.getWidth(), westImg.getHeight(), null, westImg.getColorSpace()); cubeImage.addData(westImg.getData(0)); cubeImage.addData(eastImg.getData(0)); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md index 625aa9fde..d27adb9f4 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/Lighting.j3md @@ -1,353 +1,353 @@ -MaterialDef Phong Lighting { - - MaterialParameters { - - // Compute vertex lighting in the shader - // For better performance - Boolean VertexLighting - - // Use more efficent algorithms to improve performance - Boolean LowQuality - - // Improve quality at the cost of performance - Boolean HighQuality - - // Output alpha from the diffuse map - Boolean UseAlpha - - // Alpha threshold for fragment discarding - Float AlphaDiscardThreshold (AlphaTestFallOff) - - // Normal map is in BC5/ATI2n/LATC/3Dc compression format - Boolean LATC - - // Use the provided ambient, diffuse, and specular colors - Boolean UseMaterialColors - - // Activate shading along the tangent, instead of the normal - // Requires tangent data to be available on the model. - Boolean VTangent - - // Use minnaert diffuse instead of lambert - Boolean Minnaert - - // Use ward specular instead of phong - Boolean WardIso - - // Use vertex color as an additional diffuse color. - Boolean UseVertexColor - - // Ambient color - Color Ambient (MaterialAmbient) - - // Diffuse color - Color Diffuse (MaterialDiffuse) - - // Specular color - Color Specular (MaterialSpecular) - - // Specular power/shininess - Float Shininess (MaterialShininess) : 1 - - // Diffuse map - Texture2D DiffuseMap - - // Normal map - Texture2D NormalMap - - // Specular/gloss map - Texture2D SpecularMap - - // Parallax/height map - Texture2D ParallaxMap - - //Set to true is parallax map is stored in the alpha channel of the normal map - Boolean PackedNormalParallax - - //Sets the relief height for parallax mapping - Float ParallaxHeight : 0.05 - - //Set to true to activate Steep Parallax mapping - Boolean SteepParallax - - // Texture that specifies alpha values - Texture2D AlphaMap - - // Color ramp, will map diffuse and specular values through it. - Texture2D ColorRamp - - // Texture of the glowing parts of the material - Texture2D GlowMap - - // Set to Use Lightmap - Texture2D LightMap - - // Set to use TexCoord2 for the lightmap sampling - Boolean SeparateTexCoord - - // The glow color of the object - Color GlowColor - - // Parameters for fresnel - // X = bias - // Y = scale - // Z = power - Vector3 FresnelParams - - // Env Map for reflection - TextureCubeMap EnvMap - - // the env map is a spheremap and not a cube map - Boolean EnvMapAsSphereMap - - //shadows - Int FilterMode - Boolean HardwareShadows - - Texture2D ShadowMap0 - Texture2D ShadowMap1 - Texture2D ShadowMap2 - Texture2D ShadowMap3 - //pointLights - Texture2D ShadowMap4 - Texture2D ShadowMap5 - - Float ShadowIntensity - Vector4 Splits - Vector2 FadeInfo - - Matrix4 LightViewProjectionMatrix0 - Matrix4 LightViewProjectionMatrix1 - Matrix4 LightViewProjectionMatrix2 - Matrix4 LightViewProjectionMatrix3 - //pointLight - Matrix4 LightViewProjectionMatrix4 - Matrix4 LightViewProjectionMatrix5 - Vector3 LightPos - Vector3 LightDir - - Float PCFEdge - Float ShadowMapSize - - // For hardware skinning - Int NumberOfBones - Matrix4Array BoneMatrices - } - - Technique { - - LightMode MultiPass - - VertexShader GLSL100: Common/MatDefs/Light/Lighting.vert - FragmentShader GLSL100: Common/MatDefs/Light/Lighting.frag - - WorldParameters { - WorldViewProjectionMatrix - NormalMatrix - WorldViewMatrix - ViewMatrix - CameraPosition - WorldMatrix - } - - Defines { - LATC : LATC - VERTEX_COLOR : UseVertexColor - VERTEX_LIGHTING : VertexLighting - ATTENUATION : Attenuation - MATERIAL_COLORS : UseMaterialColors - V_TANGENT : VTangent - MINNAERT : Minnaert - WARDISO : WardIso - LOW_QUALITY : LowQuality - HQ_ATTENUATION : HighQuality - - DIFFUSEMAP : DiffuseMap - NORMALMAP : NormalMap - SPECULARMAP : SpecularMap - PARALLAXMAP : ParallaxMap - NORMALMAP_PARALLAX : PackedNormalParallax - STEEP_PARALLAX : SteepParallax - ALPHAMAP : AlphaMap - COLORRAMP : ColorRamp - LIGHTMAP : LightMap - SEPARATE_TEXCOORD : SeparateTexCoord - - USE_REFLECTION : EnvMap - SPHERE_MAP : SphereMap - - NUM_BONES : NumberOfBones - } - } - - Technique PreShadow { - - VertexShader GLSL100 : Common/MatDefs/Shadow/PreShadow.vert - FragmentShader GLSL100 : Common/MatDefs/Shadow/PreShadow.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldViewMatrix - } - - Defines { - COLOR_MAP : ColorMap - DISCARD_ALPHA : AlphaDiscardThreshold - NUM_BONES : NumberOfBones - } - - ForcedRenderState { - FaceCull Off - DepthTest On - DepthWrite On - PolyOffset 5 3 - ColorWrite Off - } - - } - - - Technique PostShadow15{ - VertexShader GLSL150: Common/MatDefs/Shadow/PostShadow15.vert - FragmentShader GLSL150: Common/MatDefs/Shadow/PostShadow15.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldMatrix - } - - Defines { - HARDWARE_SHADOWS : HardwareShadows - FILTER_MODE : FilterMode - PCFEDGE : PCFEdge - DISCARD_ALPHA : AlphaDiscardThreshold - COLOR_MAP : ColorMap - SHADOWMAP_SIZE : ShadowMapSize - FADE : FadeInfo - PSSM : Splits - POINTLIGHT : LightViewProjectionMatrix5 - NUM_BONES : NumberOfBones - } - - ForcedRenderState { - Blend Modulate - DepthWrite Off - PolyOffset -0.1 0 - } - } - - Technique PostShadow{ - VertexShader GLSL100: Common/MatDefs/Shadow/PostShadow.vert - FragmentShader GLSL100: Common/MatDefs/Shadow/PostShadow.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldMatrix - } - - Defines { - HARDWARE_SHADOWS : HardwareShadows - FILTER_MODE : FilterMode - PCFEDGE : PCFEdge - DISCARD_ALPHA : AlphaDiscardThreshold - COLOR_MAP : ColorMap - SHADOWMAP_SIZE : ShadowMapSize - FADE : FadeInfo - PSSM : Splits - POINTLIGHT : LightViewProjectionMatrix5 - NUM_BONES : NumberOfBones - } - - ForcedRenderState { - Blend Modulate - DepthWrite Off - PolyOffset -0.1 0 - } - } - - Technique PreNormalPass { - - VertexShader GLSL100 : Common/MatDefs/SSAO/normal.vert - FragmentShader GLSL100 : Common/MatDefs/SSAO/normal.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldViewMatrix - NormalMatrix - } - - Defines { - DIFFUSEMAP_ALPHA : DiffuseMap - NUM_BONES : NumberOfBones - } - - } - - - Technique PreNormalPassDerivative { - - VertexShader GLSL100 : Common/MatDefs/MSSAO/normal.vert - FragmentShader GLSL100 : Common/MatDefs/MSSAO/normal.frag - - WorldParameters { - WorldViewProjectionMatrix - WorldViewMatrix - NormalMatrix - } - - Defines { - DIFFUSEMAP_ALPHA : DiffuseMap - NUM_BONES : NumberOfBones - } - - } - - Technique GBuf { - - VertexShader GLSL100: Common/MatDefs/Light/GBuf.vert - FragmentShader GLSL100: Common/MatDefs/Light/GBuf.frag - - WorldParameters { - WorldViewProjectionMatrix - NormalMatrix - WorldViewMatrix - WorldMatrix - } - - Defines { - VERTEX_COLOR : UseVertexColor - MATERIAL_COLORS : UseMaterialColors - V_TANGENT : VTangent - MINNAERT : Minnaert - WARDISO : WardIso - - DIFFUSEMAP : DiffuseMap - NORMALMAP : NormalMap - SPECULARMAP : SpecularMap - PARALLAXMAP : ParallaxMap - } - } - - Technique { - LightMode FixedPipeline - } - - Technique Glow { - - VertexShader GLSL100: Common/MatDefs/Misc/Unshaded.vert - FragmentShader GLSL100: Common/MatDefs/Light/Glow.frag - - WorldParameters { - WorldViewProjectionMatrix - } - - Defines { - NEED_TEXCOORD1 - HAS_GLOWMAP : GlowMap - HAS_GLOWCOLOR : GlowColor - - NUM_BONES : NumberOfBones - } - } - +MaterialDef Phong Lighting { + + MaterialParameters { + + // Compute vertex lighting in the shader + // For better performance + Boolean VertexLighting + + // Use more efficent algorithms to improve performance + Boolean LowQuality + + // Improve quality at the cost of performance + Boolean HighQuality + + // Output alpha from the diffuse map + Boolean UseAlpha + + // Alpha threshold for fragment discarding + Float AlphaDiscardThreshold (AlphaTestFallOff) + + // Normal map is in BC5/ATI2n/LATC/3Dc compression format + Boolean LATC + + // Use the provided ambient, diffuse, and specular colors + Boolean UseMaterialColors + + // Activate shading along the tangent, instead of the normal + // Requires tangent data to be available on the model. + Boolean VTangent + + // Use minnaert diffuse instead of lambert + Boolean Minnaert + + // Use ward specular instead of phong + Boolean WardIso + + // Use vertex color as an additional diffuse color. + Boolean UseVertexColor + + // Ambient color + Color Ambient (MaterialAmbient) + + // Diffuse color + Color Diffuse (MaterialDiffuse) + + // Specular color + Color Specular (MaterialSpecular) + + // Specular power/shininess + Float Shininess (MaterialShininess) : 1 + + // Diffuse map + Texture2D DiffuseMap + + // Normal map + Texture2D NormalMap -LINEAR + + // Specular/gloss map + Texture2D SpecularMap + + // Parallax/height map + Texture2D ParallaxMap -LINEAR + + //Set to true is parallax map is stored in the alpha channel of the normal map + Boolean PackedNormalParallax + + //Sets the relief height for parallax mapping + Float ParallaxHeight : 0.05 + + //Set to true to activate Steep Parallax mapping + Boolean SteepParallax + + // Texture that specifies alpha values + Texture2D AlphaMap -LINEAR + + // Color ramp, will map diffuse and specular values through it. + Texture2D ColorRamp + + // Texture of the glowing parts of the material + Texture2D GlowMap + + // Set to Use Lightmap + Texture2D LightMap + + // Set to use TexCoord2 for the lightmap sampling + Boolean SeparateTexCoord + + // The glow color of the object + Color GlowColor + + // Parameters for fresnel + // X = bias + // Y = scale + // Z = power + Vector3 FresnelParams + + // Env Map for reflection + TextureCubeMap EnvMap + + // the env map is a spheremap and not a cube map + Boolean EnvMapAsSphereMap + + //shadows + Int FilterMode + Boolean HardwareShadows + + Texture2D ShadowMap0 + Texture2D ShadowMap1 + Texture2D ShadowMap2 + Texture2D ShadowMap3 + //pointLights + Texture2D ShadowMap4 + Texture2D ShadowMap5 + + Float ShadowIntensity + Vector4 Splits + Vector2 FadeInfo + + Matrix4 LightViewProjectionMatrix0 + Matrix4 LightViewProjectionMatrix1 + Matrix4 LightViewProjectionMatrix2 + Matrix4 LightViewProjectionMatrix3 + //pointLight + Matrix4 LightViewProjectionMatrix4 + Matrix4 LightViewProjectionMatrix5 + Vector3 LightPos + Vector3 LightDir + + Float PCFEdge + Float ShadowMapSize + + // For hardware skinning + Int NumberOfBones + Matrix4Array BoneMatrices + } + + Technique { + + LightMode MultiPass + + VertexShader GLSL100: Common/MatDefs/Light/Lighting.vert + FragmentShader GLSL100: Common/MatDefs/Light/Lighting.frag + + WorldParameters { + WorldViewProjectionMatrix + NormalMatrix + WorldViewMatrix + ViewMatrix + CameraPosition + WorldMatrix + } + + Defines { + LATC : LATC + VERTEX_COLOR : UseVertexColor + VERTEX_LIGHTING : VertexLighting + ATTENUATION : Attenuation + MATERIAL_COLORS : UseMaterialColors + V_TANGENT : VTangent + MINNAERT : Minnaert + WARDISO : WardIso + LOW_QUALITY : LowQuality + HQ_ATTENUATION : HighQuality + + DIFFUSEMAP : DiffuseMap + NORMALMAP : NormalMap + SPECULARMAP : SpecularMap + PARALLAXMAP : ParallaxMap + NORMALMAP_PARALLAX : PackedNormalParallax + STEEP_PARALLAX : SteepParallax + ALPHAMAP : AlphaMap + COLORRAMP : ColorRamp + LIGHTMAP : LightMap + SEPARATE_TEXCOORD : SeparateTexCoord + + USE_REFLECTION : EnvMap + SPHERE_MAP : SphereMap + + NUM_BONES : NumberOfBones + } + } + + Technique PreShadow { + + VertexShader GLSL100 : Common/MatDefs/Shadow/PreShadow.vert + FragmentShader GLSL100 : Common/MatDefs/Shadow/PreShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + } + + Defines { + COLOR_MAP : ColorMap + DISCARD_ALPHA : AlphaDiscardThreshold + NUM_BONES : NumberOfBones + } + + ForcedRenderState { + FaceCull Off + DepthTest On + DepthWrite On + PolyOffset 5 3 + ColorWrite Off + } + + } + + + Technique PostShadow15{ + VertexShader GLSL150: Common/MatDefs/Shadow/PostShadow15.vert + FragmentShader GLSL150: Common/MatDefs/Shadow/PostShadow15.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + } + + Defines { + HARDWARE_SHADOWS : HardwareShadows + FILTER_MODE : FilterMode + PCFEDGE : PCFEdge + DISCARD_ALPHA : AlphaDiscardThreshold + COLOR_MAP : ColorMap + SHADOWMAP_SIZE : ShadowMapSize + FADE : FadeInfo + PSSM : Splits + POINTLIGHT : LightViewProjectionMatrix5 + NUM_BONES : NumberOfBones + } + + ForcedRenderState { + Blend Modulate + DepthWrite Off + PolyOffset -0.1 0 + } + } + + Technique PostShadow{ + VertexShader GLSL100: Common/MatDefs/Shadow/PostShadow.vert + FragmentShader GLSL100: Common/MatDefs/Shadow/PostShadow.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldMatrix + } + + Defines { + HARDWARE_SHADOWS : HardwareShadows + FILTER_MODE : FilterMode + PCFEDGE : PCFEdge + DISCARD_ALPHA : AlphaDiscardThreshold + COLOR_MAP : ColorMap + SHADOWMAP_SIZE : ShadowMapSize + FADE : FadeInfo + PSSM : Splits + POINTLIGHT : LightViewProjectionMatrix5 + NUM_BONES : NumberOfBones + } + + ForcedRenderState { + Blend Modulate + DepthWrite Off + PolyOffset -0.1 0 + } + } + + Technique PreNormalPass { + + VertexShader GLSL100 : Common/MatDefs/SSAO/normal.vert + FragmentShader GLSL100 : Common/MatDefs/SSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + } + + Defines { + DIFFUSEMAP_ALPHA : DiffuseMap + NUM_BONES : NumberOfBones + } + + } + + + Technique PreNormalPassDerivative { + + VertexShader GLSL100 : Common/MatDefs/MSSAO/normal.vert + FragmentShader GLSL100 : Common/MatDefs/MSSAO/normal.frag + + WorldParameters { + WorldViewProjectionMatrix + WorldViewMatrix + NormalMatrix + } + + Defines { + DIFFUSEMAP_ALPHA : DiffuseMap + NUM_BONES : NumberOfBones + } + + } + + Technique GBuf { + + VertexShader GLSL100: Common/MatDefs/Light/GBuf.vert + FragmentShader GLSL100: Common/MatDefs/Light/GBuf.frag + + WorldParameters { + WorldViewProjectionMatrix + NormalMatrix + WorldViewMatrix + WorldMatrix + } + + Defines { + VERTEX_COLOR : UseVertexColor + MATERIAL_COLORS : UseMaterialColors + V_TANGENT : VTangent + MINNAERT : Minnaert + WARDISO : WardIso + + DIFFUSEMAP : DiffuseMap + NORMALMAP : NormalMap + SPECULARMAP : SpecularMap + PARALLAXMAP : ParallaxMap + } + } + + Technique { + LightMode FixedPipeline + } + + Technique Glow { + + VertexShader GLSL100: Common/MatDefs/Misc/Unshaded.vert + FragmentShader GLSL100: Common/MatDefs/Light/Glow.frag + + WorldParameters { + WorldViewProjectionMatrix + } + + Defines { + NEED_TEXCOORD1 + HAS_GLOWMAP : GlowMap + HAS_GLOWCOLOR : GlowColor + + NUM_BONES : NumberOfBones + } + } + } \ No newline at end of file diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java index 46e26ac51..df33eab80 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java @@ -44,6 +44,7 @@ import com.jme3.shader.VarType; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; import com.jme3.texture.Texture2D; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.PlaceholderAssets; import com.jme3.util.blockparser.BlockLanguageParser; import com.jme3.util.blockparser.Statement; @@ -206,13 +207,22 @@ public class J3MLoader implements AssetLoader { } } - // [ "(" ")" ] [ ":" ] + // [ "(" ")" ] [ ":" ] [-LINEAR] private void readParam(String statement) throws IOException{ String name; String defaultVal = null; FixedFuncBinding ffBinding = null; + ColorSpace colorSpace = null; - String[] split = statement.split(":"); + String[] split = statement.split("-"); + if(split.length>1){ + if(split[1].equalsIgnoreCase("LINEAR")){ + colorSpace = ColorSpace.Linear; + } + statement = split[0].trim(); + } + + split = statement.split(":"); // Parse default val if (split.length == 1){ @@ -259,8 +269,12 @@ public class J3MLoader implements AssetLoader { if (defaultVal != null){ defaultValObj = readValue(type, defaultVal); } + if(type.isTextureType()){ + materialDef.addMaterialParamTexture(type, name, colorSpace); + }else{ + materialDef.addMaterialParam(type, name, defaultValObj, ffBinding); + } - materialDef.addMaterialParam(type, name, defaultValObj, ffBinding); } private void readValueParam(String statement) throws IOException{ diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/DDSLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/DDSLoader.java index 1bae738ae..00a89ee72 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/DDSLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/DDSLoader.java @@ -37,6 +37,7 @@ import com.jme3.asset.TextureKey; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture.Type; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import com.jme3.util.LittleEndien; import java.io.DataInput; @@ -132,7 +133,7 @@ public class DDSLoader implements AssetLoader { ((TextureKey) info.getKey()).setTextureTypeHint(Type.CubeMap); } ArrayList data = readData(((TextureKey) info.getKey()).isFlipY()); - return new Image(pixelFormat, width, height, depth, data, sizes, true); + return new Image(pixelFormat, width, height, depth, data, sizes, ColorSpace.sRGB); } finally { if (stream != null){ stream.close(); @@ -144,7 +145,7 @@ public class DDSLoader implements AssetLoader { in = new LittleEndien(stream); loadHeader(); ArrayList data = readData(false); - return new Image(pixelFormat, width, height, depth, data, sizes, true); + return new Image(pixelFormat, width, height, depth, data, sizes, ColorSpace.sRGB); } private void loadDX10Header() throws IOException { diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java index ae2205e29..611e208d4 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/HDRLoader.java @@ -37,6 +37,7 @@ import com.jme3.asset.TextureKey; import com.jme3.math.FastMath; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import java.io.IOException; import java.io.InputStream; @@ -309,7 +310,7 @@ public class HDRLoader implements AssetLoader { dataStore.rewind(); //TODO, HDR color space? considered linear here - return new Image(pixelFormat, width, height, dataStore, false); + return new Image(pixelFormat, width, height, dataStore, ColorSpace.Linear); } public Object load(AssetInfo info) throws IOException { diff --git a/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java b/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java index d641a5bc4..e37e4f6bc 100644 --- a/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/texture/plugins/PFMLoader.java @@ -36,6 +36,7 @@ import com.jme3.asset.AssetLoader; import com.jme3.asset.TextureKey; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import java.io.IOException; import java.io.InputStream; @@ -129,7 +130,7 @@ public class PFMLoader implements AssetLoader { } imageData.rewind(); - return new Image(format, width, height, imageData, null, false); + return new Image(format, width, height, imageData, null, ColorSpace.Linear); } public Object load(AssetInfo info) throws IOException { diff --git a/jme3-core/src/tools/java/jme3tools/optimize/TextureAtlas.java b/jme3-core/src/tools/java/jme3tools/optimize/TextureAtlas.java index 55000eefc..60399319e 100644 --- a/jme3-core/src/tools/java/jme3tools/optimize/TextureAtlas.java +++ b/jme3-core/src/tools/java/jme3tools/optimize/TextureAtlas.java @@ -45,6 +45,7 @@ import com.jme3.texture.Image; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture; import com.jme3.texture.Texture2D; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import java.lang.reflect.InvocationTargetException; import java.nio.ByteBuffer; @@ -354,7 +355,7 @@ public class TextureAtlas { if (clazz == null) { return null; } - Image newImage = new Image(format, source.getWidth(), source.getHeight(), BufferUtils.createByteBuffer(source.getWidth() * source.getHeight() * 4), null, false); + Image newImage = new Image(format, source.getWidth(), source.getHeight(), BufferUtils.createByteBuffer(source.getWidth() * source.getHeight() * 4), null, ColorSpace.Linear); clazz.getMethod("convert", Image.class, Image.class).invoke(clazz.newInstance(), source, newImage); return newImage; } catch (InstantiationException ex) { @@ -401,7 +402,8 @@ public class TextureAtlas { } byte[] image = images.get(mapName); if (image != null) { - Texture2D tex = new Texture2D(new Image(format, atlasWidth, atlasHeight, BufferUtils.createByteBuffer(image), null, true)); + //TODO check if color space shouldn't be sRGB + Texture2D tex = new Texture2D(new Image(format, atlasWidth, atlasHeight, BufferUtils.createByteBuffer(image), null, ColorSpace.Linear)); tex.setMagFilter(Texture.MagFilter.Bilinear); tex.setMinFilter(Texture.MinFilter.BilinearNearestMipMap); tex.setWrap(Texture.WrapMode.Clamp); diff --git a/jme3-desktop/src/main/java/com/jme3/texture/plugins/AWTLoader.java b/jme3-desktop/src/main/java/com/jme3/texture/plugins/AWTLoader.java index d0d598875..c586752e5 100644 --- a/jme3-desktop/src/main/java/com/jme3/texture/plugins/AWTLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/texture/plugins/AWTLoader.java @@ -112,7 +112,7 @@ public class AWTLoader implements AssetLoader { ByteBuffer data1 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*4); data1.put(dataBuf1); - return new Image(Format.ABGR8, width, height, data1, null, true); + return new Image(Format.ABGR8, width, height, data1, null, com.jme3.texture.image.ColorSpace.sRGB); case BufferedImage.TYPE_3BYTE_BGR: // most common in JPEG images byte[] dataBuf2 = (byte[]) extractImageData(img); if (flipY) @@ -120,14 +120,14 @@ public class AWTLoader implements AssetLoader { ByteBuffer data2 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*3); data2.put(dataBuf2); - return new Image(Format.BGR8, width, height, data2, null, true); + return new Image(Format.BGR8, width, height, data2, null, com.jme3.texture.image.ColorSpace.sRGB); case BufferedImage.TYPE_BYTE_GRAY: // grayscale fonts byte[] dataBuf3 = (byte[]) extractImageData(img); if (flipY) flipImage(dataBuf3, width, height, 8); ByteBuffer data3 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()); data3.put(dataBuf3); - return new Image(Format.Luminance8, width, height, data3, null, true); + return new Image(Format.Luminance8, width, height, data3, null, com.jme3.texture.image.ColorSpace.sRGB); case BufferedImage.TYPE_USHORT_GRAY: // grayscale heightmap short[] dataBuf4 = (short[]) extractImageData(img); if (flipY) @@ -135,7 +135,7 @@ public class AWTLoader implements AssetLoader { ByteBuffer data4 = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*2); data4.asShortBuffer().put(dataBuf4); - return new Image(Format.Luminance16, width, height, data4, null, true); + return new Image(Format.Luminance16, width, height, data4, null, com.jme3.texture.image.ColorSpace.sRGB); default: break; } @@ -158,7 +158,7 @@ public class AWTLoader implements AssetLoader { } } data.flip(); - return new Image(Format.RGB8, width, height, data, null, true); + return new Image(Format.RGB8, width, height, data, null, com.jme3.texture.image.ColorSpace.sRGB); }else{ ByteBuffer data = BufferUtils.createByteBuffer(img.getWidth()*img.getHeight()*4); // alpha @@ -178,7 +178,7 @@ public class AWTLoader implements AssetLoader { } } data.flip(); - return new Image(Format.RGBA8, width, height, data, null, true); + return new Image(Format.RGBA8, width, height, data, null, com.jme3.texture.image.ColorSpace.sRGB); } } diff --git a/jme3-effects/src/main/resources/Common/MatDefs/SSAO/ssao.j3md b/jme3-effects/src/main/resources/Common/MatDefs/SSAO/ssao.j3md index ccca25337..d19d98a3b 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/SSAO/ssao.j3md +++ b/jme3-effects/src/main/resources/Common/MatDefs/SSAO/ssao.j3md @@ -4,7 +4,7 @@ MaterialDef SSAO { Int NumSamples Int NumSamplesDepth Texture2D Texture - Texture2D RandomMap + Texture2D RandomMap -LINEAR Texture2D Normals Texture2D DepthTexture Vector3 FrustumCorner diff --git a/jme3-effects/src/main/resources/Common/MatDefs/Water/SimpleWater.j3md b/jme3-effects/src/main/resources/Common/MatDefs/Water/SimpleWater.j3md index dd07648ab..73942f1b1 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/Water/SimpleWater.j3md +++ b/jme3-effects/src/main/resources/Common/MatDefs/Water/SimpleWater.j3md @@ -4,8 +4,8 @@ MaterialDef Simple Water { Texture2D water_reflection Texture2D water_refraction Texture2D water_depthmap - Texture2D water_normalmap - Texture2D water_dudvmap + Texture2D water_normalmap -LINEAR + Texture2D water_dudvmap -LINEAR Vector4 waterColor Vector3 lightPos Float time diff --git a/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md b/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md index b6a7525f5..2f4b2b39c 100644 --- a/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md +++ b/jme3-effects/src/main/resources/Common/MatDefs/Water/Water.j3md @@ -5,9 +5,9 @@ MaterialDef Advanced Water { Int NumSamplesDepth Texture2D FoamMap Texture2D CausticsMap - Texture2D NormalMap + Texture2D NormalMap -LINEAR Texture2D ReflectionMap - Texture2D HeightMap + Texture2D HeightMap -LINEAR Texture2D Texture Texture2D DepthTexture Vector3 CameraPosition diff --git a/jme3-examples/src/main/java/jme3test/texture/TestImageRaster.java b/jme3-examples/src/main/java/jme3test/texture/TestImageRaster.java index cc6de2153..1cbcbe993 100644 --- a/jme3-examples/src/main/java/jme3test/texture/TestImageRaster.java +++ b/jme3-examples/src/main/java/jme3test/texture/TestImageRaster.java @@ -17,6 +17,7 @@ import com.jme3.texture.Texture; import com.jme3.texture.Texture.MagFilter; import com.jme3.texture.Texture.MinFilter; import com.jme3.texture.Texture2D; +import com.jme3.texture.image.ColorSpace; import com.jme3.texture.image.ImageRaster; import com.jme3.util.BufferUtils; import java.nio.ByteBuffer; @@ -27,7 +28,7 @@ public class TestImageRaster extends SimpleApplication { int width = image.getWidth(); int height = image.getHeight(); ByteBuffer data = BufferUtils.createByteBuffer( (int)Math.ceil(newFormat.getBitsPerPixel() / 8.0) * width * height); - Image convertedImage = new Image(newFormat, width, height, data,null, image.isSrgb()); + Image convertedImage = new Image(newFormat, width, height, data,null, image.getColorSpace()); ImageRaster sourceReader = ImageRaster.create(image); ImageRaster targetWriter = ImageRaster.create(convertedImage); @@ -66,7 +67,7 @@ public class TestImageRaster extends SimpleApplication { } private Image createTestImage() { - Image testImage = new Image(Format.BGR8, 4, 3, BufferUtils.createByteBuffer(4 * 4 * 3), null, false); + Image testImage = new Image(Format.BGR8, 4, 3, BufferUtils.createByteBuffer(4 * 4 * 3), null, ColorSpace.Linear); ImageRaster io = ImageRaster.create(testImage); io.setPixel(0, 0, ColorRGBA.Black); diff --git a/jme3-examples/src/main/java/jme3test/texture/TestTexture3D.java b/jme3-examples/src/main/java/jme3test/texture/TestTexture3D.java index 9d874de48..a7e553a9a 100644 --- a/jme3-examples/src/main/java/jme3test/texture/TestTexture3D.java +++ b/jme3-examples/src/main/java/jme3test/texture/TestTexture3D.java @@ -46,6 +46,7 @@ import com.jme3.texture.Image; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture; import com.jme3.texture.Texture3D; +import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; import java.io.IOException; import java.nio.ByteBuffer; @@ -125,6 +126,6 @@ public class TestTexture3D extends SimpleApplication { } bb.rewind(); data.add(bb); - return new Texture3D(new Image(Format.RGB8, 10, 10, 10, data, null, false)); + return new Texture3D(new Image(Format.RGB8, 10, 10, 10, data, null, ColorSpace.Linear)); } } \ No newline at end of file diff --git a/jme3-examples/src/main/java/jme3test/water/TestPostWater.java b/jme3-examples/src/main/java/jme3test/water/TestPostWater.java index bdd6a717f..bd7c0a8e9 100644 --- a/jme3-examples/src/main/java/jme3test/water/TestPostWater.java +++ b/jme3-examples/src/main/java/jme3test/water/TestPostWater.java @@ -82,11 +82,14 @@ public class TestPostWater extends SimpleApplication { //cam.setLocation(new Vector3f(-700, 100, 300)); //cam.setRotation(new Quaternion().fromAngleAxis(0.5f, Vector3f.UNIT_Z)); - cam.setLocation(new Vector3f(-327.21957f, 61.6459f, 126.884346f)); - cam.setRotation(new Quaternion(0.052168474f, 0.9443102f, -0.18395276f, 0.2678024f)); +// cam.setLocation(new Vector3f(-327.21957f, 61.6459f, 126.884346f)); +// cam.setRotation(new Quaternion(0.052168474f, 0.9443102f, -0.18395276f, 0.2678024f)); + + + cam.setLocation(new Vector3f(-370.31592f, 182.04016f, 196.81192f)); + cam.setRotation(new Quaternion(0.015302252f, 0.9304095f, -0.039101653f, 0.3641086f)); - cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0})); Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false); @@ -293,21 +296,21 @@ public class TestPostWater extends SimpleApplication { @Override public void simpleUpdate(float tpf) { super.simpleUpdate(tpf); - // box.updateGeometricState(); - time += tpf; - waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f; - water.setWaterHeight(initialWaterHeight + waterHeight); - if (water.isUnderWater() && !uw) { - - waves.setDryFilter(new LowPassFilter(0.5f, 0.1f)); - uw = true; - } - if (!water.isUnderWater() && uw) { - uw = false; - //waves.setReverbEnabled(false); - waves.setDryFilter(new LowPassFilter(1, 1f)); - //waves.setDryFilter(new LowPassFilter(1,1f)); - - } +// // box.updateGeometricState(); +// time += tpf; +// waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f; +// water.setWaterHeight(initialWaterHeight + waterHeight); +// if (water.isUnderWater() && !uw) { +// +// waves.setDryFilter(new LowPassFilter(0.5f, 0.1f)); +// uw = true; +// } +// if (!water.isUnderWater() && uw) { +// uw = false; +// //waves.setReverbEnabled(false); +// waves.setDryFilter(new LowPassFilter(1, 1f)); +// //waves.setDryFilter(new LowPassFilter(1,1f)); +// +// } } } diff --git a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java index 7774c79fb..df248d956 100644 --- a/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java +++ b/jme3-jogl/src/main/java/com/jme3/renderer/jogl/TextureUtil.java @@ -35,6 +35,7 @@ package com.jme3.renderer.jogl; import com.jme3.renderer.RendererException; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; +import com.jme3.texture.image.ColorSpace; import java.nio.ByteBuffer; import java.util.logging.Level; import java.util.logging.Logger; @@ -291,7 +292,7 @@ public class TextureUtil { boolean linearizeSrgb){ GL gl = GLContext.getCurrentGL(); Image.Format fmt = image.getFormat(); - GLImageFormat glFmt = getImageFormatWithError(fmt, image.isSrgb() && linearizeSrgb); + GLImageFormat glFmt = getImageFormatWithError(fmt, image.getColorSpace() == ColorSpace.sRGB && linearizeSrgb); ByteBuffer data; if (index >= 0 && image.getData() != null && image.getData().size() > 0){ @@ -474,7 +475,7 @@ public class TextureUtil { boolean linearizeSrgb) { GL gl = GLContext.getCurrentGL(); Image.Format fmt = image.getFormat(); - GLImageFormat glFmt = getImageFormatWithError(fmt, image.isSrgb() && linearizeSrgb); + GLImageFormat glFmt = getImageFormatWithError(fmt, image.getColorSpace() == ColorSpace.sRGB && linearizeSrgb); ByteBuffer data = null; if (index >= 0 && image.getData() != null && image.getData().size() > 0) { diff --git a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/TextureUtil.java b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/TextureUtil.java index 18fe3fbe8..0563a7f75 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/TextureUtil.java +++ b/jme3-lwjgl/src/main/java/com/jme3/renderer/lwjgl/TextureUtil.java @@ -56,6 +56,7 @@ import com.jme3.renderer.RendererException; import com.jme3.texture.Image; import com.jme3.texture.Image.Format; import static com.jme3.texture.Image.Format.RGB8; +import com.jme3.texture.image.ColorSpace; import java.util.logging.Level; import java.util.logging.Logger; import org.lwjgl.opengl.EXTTextureSRGB; @@ -268,7 +269,7 @@ class TextureUtil { boolean linearizeSrgb){ Image.Format fmt = image.getFormat(); - GLImageFormat glFmt = getImageFormatWithError(fmt, image.isSrgb() && linearizeSrgb); + GLImageFormat glFmt = getImageFormatWithError(fmt, image.getColorSpace() == ColorSpace.sRGB && linearizeSrgb); ByteBuffer data; if (index >= 0 && image.getData() != null && image.getData().size() > 0){ @@ -425,7 +426,7 @@ class TextureUtil { int y, boolean linearizeSrgb) { Image.Format fmt = image.getFormat(); - GLImageFormat glFmt = getImageFormatWithError(fmt, image.isSrgb() && linearizeSrgb); + GLImageFormat glFmt = getImageFormatWithError(fmt, image.getColorSpace() == ColorSpace.sRGB && linearizeSrgb); ByteBuffer data = null; if (index >= 0 && image.getData() != null && image.getData().size() > 0) { diff --git a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/Terrain.j3md b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/Terrain.j3md index 9702d6594..0f12dac70 100644 --- a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/Terrain.j3md +++ b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/Terrain.j3md @@ -5,7 +5,7 @@ MaterialDef Terrain { // use tri-planar mapping Boolean useTriPlanarMapping - Texture2D Alpha + Texture2D Alpha -LINEAR Texture2D Tex1 Texture2D Tex2 Texture2D Tex3 diff --git a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/TerrainLighting.j3md b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/TerrainLighting.j3md index bfdbf5b42..04470ca26 100644 --- a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/TerrainLighting.j3md +++ b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/TerrainLighting.j3md @@ -27,62 +27,62 @@ MaterialDef Terrain Lighting { // Texture map #0 Texture2D DiffuseMap Float DiffuseMap_0_scale - Texture2D NormalMap + Texture2D NormalMap -LINEAR // Texture map #1 Texture2D DiffuseMap_1 Float DiffuseMap_1_scale - Texture2D NormalMap_1 + Texture2D NormalMap_1 -LINEAR // Texture map #2 Texture2D DiffuseMap_2 Float DiffuseMap_2_scale - Texture2D NormalMap_2 + Texture2D NormalMap_2 -LINEAR // Texture map #3 Texture2D DiffuseMap_3 Float DiffuseMap_3_scale - Texture2D NormalMap_3 + Texture2D NormalMap_3 -LINEAR // Texture map #4 Texture2D DiffuseMap_4 Float DiffuseMap_4_scale - Texture2D NormalMap_4 + Texture2D NormalMap_4 -LINEAR // Texture map #5 Texture2D DiffuseMap_5 Float DiffuseMap_5_scale - Texture2D NormalMap_5 + Texture2D NormalMap_5 -LINEAR // Texture map #6 Texture2D DiffuseMap_6 Float DiffuseMap_6_scale - Texture2D NormalMap_6 + Texture2D NormalMap_6 -LINEAR // Texture map #7 Texture2D DiffuseMap_7 Float DiffuseMap_7_scale - Texture2D NormalMap_7 + Texture2D NormalMap_7 -LINEAR // Texture map #8 Texture2D DiffuseMap_8 Float DiffuseMap_8_scale - Texture2D NormalMap_8 + Texture2D NormalMap_8 -LINEAR // Texture map #9 Texture2D DiffuseMap_9 Float DiffuseMap_9_scale - Texture2D NormalMap_9 + Texture2D NormalMap_9 -LINEAR // Texture map #10 Texture2D DiffuseMap_10 Float DiffuseMap_10_scale - Texture2D NormalMap_10 + Texture2D NormalMap_10 -LINEAR // Texture map #11 Texture2D DiffuseMap_11 Float DiffuseMap_11_scale - Texture2D NormalMap_11 + Texture2D NormalMap_11 -LINEAR // Specular/gloss map @@ -90,9 +90,9 @@ MaterialDef Terrain Lighting { // Texture that specifies alpha values - Texture2D AlphaMap - Texture2D AlphaMap_1 - Texture2D AlphaMap_2 + Texture2D AlphaMap -LINEAR + Texture2D AlphaMap_1 -LINEAR + Texture2D AlphaMap_2 -LINEAR // Texture of the glowing parts of the material Texture2D GlowMap