|
@@ -51,7 +51,6 @@ import com.jme3.asset.BlenderKey.FeaturesToLoad;
|
|
import com.jme3.asset.GeneratedTextureKey;
|
|
import com.jme3.asset.GeneratedTextureKey;
|
|
import com.jme3.asset.TextureKey;
|
|
import com.jme3.asset.TextureKey;
|
|
import com.jme3.math.ColorRGBA;
|
|
import com.jme3.math.ColorRGBA;
|
|
-import com.jme3.math.FastMath;
|
|
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.scene.plugins.blender.AbstractBlenderHelper;
|
|
import com.jme3.scene.plugins.blender.AbstractBlenderHelper;
|
|
import com.jme3.scene.plugins.blender.BlenderContext;
|
|
import com.jme3.scene.plugins.blender.BlenderContext;
|
|
@@ -61,7 +60,6 @@ import com.jme3.scene.plugins.blender.file.FileBlockHeader;
|
|
import com.jme3.scene.plugins.blender.file.Pointer;
|
|
import com.jme3.scene.plugins.blender.file.Pointer;
|
|
import com.jme3.scene.plugins.blender.file.Structure;
|
|
import com.jme3.scene.plugins.blender.file.Structure;
|
|
import com.jme3.scene.plugins.blender.materials.MaterialContext;
|
|
import com.jme3.scene.plugins.blender.materials.MaterialContext;
|
|
-import com.jme3.scene.plugins.blender.materials.MaterialHelper;
|
|
|
|
import com.jme3.texture.Image;
|
|
import com.jme3.texture.Image;
|
|
import com.jme3.texture.Image.Format;
|
|
import com.jme3.texture.Image.Format;
|
|
import com.jme3.texture.Texture;
|
|
import com.jme3.texture.Texture;
|
|
@@ -115,23 +113,6 @@ public class TextureHelper extends AbstractBlenderHelper {
|
|
public static final int MAP_WARP = 8192;
|
|
public static final int MAP_WARP = 8192;
|
|
public static final int MAP_LAYER = 16384;
|
|
public static final int MAP_LAYER = 16384;
|
|
|
|
|
|
- // blendtypes
|
|
|
|
- public static final int MTEX_BLEND = 0;
|
|
|
|
- public static final int MTEX_MUL = 1;
|
|
|
|
- public static final int MTEX_ADD = 2;
|
|
|
|
- public static final int MTEX_SUB = 3;
|
|
|
|
- public static final int MTEX_DIV = 4;
|
|
|
|
- public static final int MTEX_DARK = 5;
|
|
|
|
- public static final int MTEX_DIFF = 6;
|
|
|
|
- public static final int MTEX_LIGHT = 7;
|
|
|
|
- public static final int MTEX_SCREEN = 8;
|
|
|
|
- public static final int MTEX_OVERLAY = 9;
|
|
|
|
- public static final int MTEX_BLEND_HUE = 10;
|
|
|
|
- public static final int MTEX_BLEND_SAT = 11;
|
|
|
|
- public static final int MTEX_BLEND_VAL = 12;
|
|
|
|
- public static final int MTEX_BLEND_COLOR = 13;
|
|
|
|
- public static final int MTEX_NUM_BLENDTYPES = 14;
|
|
|
|
-
|
|
|
|
protected NoiseGenerator noiseGenerator;
|
|
protected NoiseGenerator noiseGenerator;
|
|
private Map<Integer, TextureGenerator> textureGenerators = new HashMap<Integer, TextureGenerator>();
|
|
private Map<Integer, TextureGenerator> textureGenerators = new HashMap<Integer, TextureGenerator>();
|
|
|
|
|
|
@@ -229,60 +210,6 @@ public class TextureHelper extends AbstractBlenderHelper {
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * This method blends the given texture with material color and the defined color in 'map to' panel. As a result of this method a new
|
|
|
|
- * texture is created. The input texture is NOT.
|
|
|
|
- *
|
|
|
|
- * @param materialColor
|
|
|
|
- * the material diffuse color
|
|
|
|
- * @param texture
|
|
|
|
- * the texture we use in blending
|
|
|
|
- * @param color
|
|
|
|
- * the color defined for the texture
|
|
|
|
- * @param affectFactor
|
|
|
|
- * the factor that the color affects the texture (value form 0.0 to 1.0)
|
|
|
|
- * @param blendType
|
|
|
|
- * the blending type
|
|
|
|
- * @param blenderContext
|
|
|
|
- * the blender context
|
|
|
|
- * @return new texture that was created after the blending
|
|
|
|
- */
|
|
|
|
- public Texture blendTexture(float[] materialColor, Texture texture, float[] color, float affectFactor, int blendType, boolean neg, BlenderContext blenderContext) {
|
|
|
|
- float[] materialColorClone = materialColor.clone();//this array may change, so we copy it
|
|
|
|
- Format format = texture.getImage().getFormat();
|
|
|
|
- ByteBuffer data = texture.getImage().getData(0);
|
|
|
|
-
|
|
|
|
- Image decompressedImage = TextureDecompressor.decompress(texture.getImage());
|
|
|
|
- data = decompressedImage.getData(0);
|
|
|
|
- format = decompressedImage.getFormat();
|
|
|
|
-
|
|
|
|
- int width = texture.getImage().getWidth();
|
|
|
|
- int height = texture.getImage().getHeight();
|
|
|
|
- int depth = texture.getImage().getDepth();
|
|
|
|
- if(depth==0) {
|
|
|
|
- depth = 1;
|
|
|
|
- }
|
|
|
|
- ByteBuffer newData = BufferUtils.createByteBuffer(width * height * depth * 4);
|
|
|
|
-
|
|
|
|
- float[] resultPixel = new float[4];
|
|
|
|
- int dataIndex = 0;
|
|
|
|
- while (data.hasRemaining()) {
|
|
|
|
- float tin = this.setupMaterialColor(data, format, neg, materialColorClone);
|
|
|
|
- this.blendPixel(resultPixel, materialColorClone, color, tin, affectFactor, blendType, blenderContext);
|
|
|
|
- newData.put(dataIndex++, (byte) (resultPixel[0] * 255.0f));
|
|
|
|
- newData.put(dataIndex++, (byte) (resultPixel[1] * 255.0f));
|
|
|
|
- newData.put(dataIndex++, (byte) (resultPixel[2] * 255.0f));
|
|
|
|
- newData.put(dataIndex++, (byte) (materialColorClone[3] * 255.0f));
|
|
|
|
- }
|
|
|
|
- if(texture.getType()==Texture.Type.TwoDimensional) {
|
|
|
|
- return new Texture2D(new Image(Format.RGBA8, width, height, newData));
|
|
|
|
- } else {
|
|
|
|
- ArrayList<ByteBuffer> dataArray = new ArrayList<ByteBuffer>(1);
|
|
|
|
- dataArray.add(newData);
|
|
|
|
- return new Texture3D(new Image(Format.RGBA8, width, height, depth, dataArray));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* This method merges the given textures. The result texture has no alpha
|
|
* This method merges the given textures. The result texture has no alpha
|
|
* factor (is always opaque).
|
|
* factor (is always opaque).
|
|
@@ -296,6 +223,9 @@ public class TextureHelper extends AbstractBlenderHelper {
|
|
public Texture mergeTextures(List<Texture> sources, MaterialContext materialContext) {
|
|
public Texture mergeTextures(List<Texture> sources, MaterialContext materialContext) {
|
|
Texture result = null;
|
|
Texture result = null;
|
|
if(sources!=null && sources.size()>0) {
|
|
if(sources!=null && sources.size()>0) {
|
|
|
|
+ if(sources.size() == 1) {
|
|
|
|
+ return sources.get(0);//just return the texture
|
|
|
|
+ }
|
|
//checking the sizes of the textures (tehy should perfectly match)
|
|
//checking the sizes of the textures (tehy should perfectly match)
|
|
int lastTextureWithoutAlphaIndex = 0;
|
|
int lastTextureWithoutAlphaIndex = 0;
|
|
int width = sources.get(0).getImage().getWidth();
|
|
int width = sources.get(0).getImage().getWidth();
|
|
@@ -360,314 +290,6 @@ public class TextureHelper extends AbstractBlenderHelper {
|
|
}
|
|
}
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
-
|
|
|
|
- /**
|
|
|
|
- * This method alters the material color in a way dependent on the type of the image.
|
|
|
|
- * For example the color remains untouched if the texture is of Luminance type.
|
|
|
|
- * The luminance defines the interaction between the material color and color defined
|
|
|
|
- * for texture blending.
|
|
|
|
- * If the type has 3 or more color channels then the material color is replaced with the texture's
|
|
|
|
- * color and later blended with the defined blend color.
|
|
|
|
- * All alpha values (if present) are ignored and not used during blending.
|
|
|
|
- * @param data
|
|
|
|
- * the image data
|
|
|
|
- * @param imageFormat
|
|
|
|
- * the format of the image
|
|
|
|
- * @param neg
|
|
|
|
- * defines it the result color should be nagated
|
|
|
|
- * @param materialColor
|
|
|
|
- * the material's color (value may be changed)
|
|
|
|
- * @return texture intensity for the current pixel
|
|
|
|
- */
|
|
|
|
- protected float setupMaterialColor(ByteBuffer data, Format imageFormat, boolean neg, float[] materialColor) {
|
|
|
|
- float tin = 0.0f;
|
|
|
|
- byte pixelValue = data.get();// at least one byte is always taken :)
|
|
|
|
- float firstPixelValue = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- switch (imageFormat) {
|
|
|
|
- case Luminance8:
|
|
|
|
- tin = neg ? 1.0f - firstPixelValue : firstPixelValue;
|
|
|
|
- materialColor[3] = tin;
|
|
|
|
- neg = false;//do not negate the materialColor, it must be unchanged
|
|
|
|
- break;
|
|
|
|
- case RGBA8:
|
|
|
|
- materialColor[0] = firstPixelValue;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[1] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[2] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[3] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- break;
|
|
|
|
- case ABGR8:
|
|
|
|
- materialColor[3] = firstPixelValue;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[2] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[1] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[0] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- break;
|
|
|
|
- case BGR8:
|
|
|
|
- materialColor[2] = firstPixelValue;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[1] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[0] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- materialColor[3] = 1.0f;
|
|
|
|
- break;
|
|
|
|
- case RGB8:
|
|
|
|
- materialColor[0] = firstPixelValue;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[1] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- pixelValue = data.get();
|
|
|
|
- materialColor[2] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- materialColor[3] = 1.0f;
|
|
|
|
- break;
|
|
|
|
- case Luminance8Alpha8:
|
|
|
|
- tin = neg ? 1.0f - firstPixelValue : firstPixelValue;
|
|
|
|
- neg = false;//do not negate the materialColor, it must be unchanged
|
|
|
|
- pixelValue = data.get(); // ignore alpha
|
|
|
|
- materialColor[3] = pixelValue >= 0 ? pixelValue / 255.0f : 1.0f - (~pixelValue) / 255.0f;
|
|
|
|
- break;
|
|
|
|
- case DXT1:
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
- case DXT1A:
|
|
|
|
- case DXT3:
|
|
|
|
- case DXT5:
|
|
|
|
- break;
|
|
|
|
- case Luminance16:
|
|
|
|
- case Luminance16Alpha16:
|
|
|
|
- case Alpha16:
|
|
|
|
- case Alpha8:
|
|
|
|
- case ARGB4444:
|
|
|
|
- case Depth:
|
|
|
|
- case Depth16:
|
|
|
|
- case Depth24:
|
|
|
|
- case Depth32:
|
|
|
|
- case Depth32F:
|
|
|
|
- case Intensity16:
|
|
|
|
- case Intensity8:
|
|
|
|
- case LATC:
|
|
|
|
- case LTC:
|
|
|
|
- case Luminance16F:
|
|
|
|
- case Luminance16FAlpha16F:
|
|
|
|
- case Luminance32F:
|
|
|
|
- case RGB10:
|
|
|
|
- case RGB111110F:
|
|
|
|
- case RGB16:
|
|
|
|
- case RGB16F:
|
|
|
|
- case RGB16F_to_RGB111110F:
|
|
|
|
- case RGB16F_to_RGB9E5:
|
|
|
|
- case RGB32F:
|
|
|
|
- case RGB565:
|
|
|
|
- case RGB5A1:
|
|
|
|
- case RGB9E5:
|
|
|
|
- case RGBA16:
|
|
|
|
- case RGBA16F:
|
|
|
|
- case RGBA32F:
|
|
|
|
- LOGGER.log(Level.WARNING, "Image type not yet supported for blending: {0}", imageFormat);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- throw new IllegalStateException("Unknown image format type: " + imageFormat);
|
|
|
|
- }
|
|
|
|
- if (neg) {
|
|
|
|
- materialColor[0] = 1.0f - materialColor[0];
|
|
|
|
- materialColor[1] = 1.0f - materialColor[1];
|
|
|
|
- materialColor[2] = 1.0f - materialColor[2];
|
|
|
|
- }
|
|
|
|
- return tin;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * This method blends the texture with an appropriate color.
|
|
|
|
- *
|
|
|
|
- * @param result
|
|
|
|
- * the result color (variable 'in' in blender source code)
|
|
|
|
- * @param materialColor
|
|
|
|
- * the texture color (variable 'out' in blender source coude)
|
|
|
|
- * @param color
|
|
|
|
- * the previous color (variable 'tex' in blender source code)
|
|
|
|
- * @param textureIntensity
|
|
|
|
- * texture intensity (variable 'fact' in blender source code)
|
|
|
|
- * @param textureFactor
|
|
|
|
- * texture affection factor (variable 'facg' in blender source code)
|
|
|
|
- * @param blendtype
|
|
|
|
- * the blend type
|
|
|
|
- * @param blenderContext
|
|
|
|
- * the blender context
|
|
|
|
- */
|
|
|
|
- protected void blendPixel(float[] result, float[] materialColor, float[] color, float textureIntensity, float textureFactor, int blendtype, BlenderContext blenderContext) {
|
|
|
|
- float oneMinusFactor, col;
|
|
|
|
- textureIntensity *= textureFactor;
|
|
|
|
-
|
|
|
|
- switch (blendtype) {
|
|
|
|
- case MTEX_BLEND:
|
|
|
|
- oneMinusFactor = 1.0f - textureIntensity;
|
|
|
|
- result[0] = textureIntensity * color[0] + oneMinusFactor * materialColor[0];
|
|
|
|
- result[1] = textureIntensity * color[1] + oneMinusFactor * materialColor[1];
|
|
|
|
- result[2] = textureIntensity * color[2] + oneMinusFactor * materialColor[2];
|
|
|
|
- break;
|
|
|
|
- case MTEX_MUL:
|
|
|
|
- oneMinusFactor = 1.0f - textureFactor;
|
|
|
|
- result[0] = (oneMinusFactor + textureIntensity * materialColor[0]) * color[0];
|
|
|
|
- result[1] = (oneMinusFactor + textureIntensity * materialColor[1]) * color[1];
|
|
|
|
- result[2] = (oneMinusFactor + textureIntensity * materialColor[2]) * color[2];
|
|
|
|
- break;
|
|
|
|
- case MTEX_DIV:
|
|
|
|
- oneMinusFactor = 1.0f - textureIntensity;
|
|
|
|
- if (color[0] != 0.0) {
|
|
|
|
- result[0] = (oneMinusFactor * materialColor[0] + textureIntensity * materialColor[0] / color[0]) * 0.5f;
|
|
|
|
- }
|
|
|
|
- if (color[1] != 0.0) {
|
|
|
|
- result[1] = (oneMinusFactor * materialColor[1] + textureIntensity * materialColor[1] / color[1]) * 0.5f;
|
|
|
|
- }
|
|
|
|
- if (color[2] != 0.0) {
|
|
|
|
- result[2] = (oneMinusFactor * materialColor[2] + textureIntensity * materialColor[2] / color[2]) * 0.5f;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case MTEX_SCREEN:
|
|
|
|
- oneMinusFactor = 1.0f - textureFactor;
|
|
|
|
- result[0] = 1.0f - (oneMinusFactor + textureIntensity * (1.0f - materialColor[0])) * (1.0f - color[0]);
|
|
|
|
- result[1] = 1.0f - (oneMinusFactor + textureIntensity * (1.0f - materialColor[1])) * (1.0f - color[1]);
|
|
|
|
- result[2] = 1.0f - (oneMinusFactor + textureIntensity * (1.0f - materialColor[2])) * (1.0f - color[2]);
|
|
|
|
- break;
|
|
|
|
- case MTEX_OVERLAY:
|
|
|
|
- oneMinusFactor = 1.0f - textureFactor;
|
|
|
|
- if (materialColor[0] < 0.5f) {
|
|
|
|
- result[0] = color[0] * (oneMinusFactor + 2.0f * textureIntensity * materialColor[0]);
|
|
|
|
- } else {
|
|
|
|
- result[0] = 1.0f - (oneMinusFactor + 2.0f * textureIntensity * (1.0f - materialColor[0])) * (1.0f - color[0]);
|
|
|
|
- }
|
|
|
|
- if (materialColor[1] < 0.5f) {
|
|
|
|
- result[1] = color[1] * (oneMinusFactor + 2.0f * textureIntensity * materialColor[1]);
|
|
|
|
- } else {
|
|
|
|
- result[1] = 1.0f - (oneMinusFactor + 2.0f * textureIntensity * (1.0f - materialColor[1])) * (1.0f - color[1]);
|
|
|
|
- }
|
|
|
|
- if (materialColor[2] < 0.5f) {
|
|
|
|
- result[2] = color[2] * (oneMinusFactor + 2.0f * textureIntensity * materialColor[2]);
|
|
|
|
- } else {
|
|
|
|
- result[2] = 1.0f - (oneMinusFactor + 2.0f * textureIntensity * (1.0f - materialColor[2])) * (1.0f - color[2]);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case MTEX_SUB:
|
|
|
|
- result[0] = materialColor[0] - textureIntensity * color[0];
|
|
|
|
- result[1] = materialColor[1] - textureIntensity * color[1];
|
|
|
|
- result[2] = materialColor[2] - textureIntensity * color[2];
|
|
|
|
- result[0] = FastMath.clamp(result[0], 0.0f, 1.0f);
|
|
|
|
- result[1] = FastMath.clamp(result[1], 0.0f, 1.0f);
|
|
|
|
- result[2] = FastMath.clamp(result[2], 0.0f, 1.0f);
|
|
|
|
- break;
|
|
|
|
- case MTEX_ADD:
|
|
|
|
- result[0] = (textureIntensity * color[0] + materialColor[0]) * 0.5f;
|
|
|
|
- result[1] = (textureIntensity * color[1] + materialColor[1]) * 0.5f;
|
|
|
|
- result[2] = (textureIntensity * color[2] + materialColor[2]) * 0.5f;
|
|
|
|
- break;
|
|
|
|
- case MTEX_DIFF:
|
|
|
|
- oneMinusFactor = 1.0f - textureIntensity;
|
|
|
|
- result[0] = oneMinusFactor * materialColor[0] + textureIntensity * Math.abs(materialColor[0] - color[0]);
|
|
|
|
- result[1] = oneMinusFactor * materialColor[1] + textureIntensity * Math.abs(materialColor[1] - color[1]);
|
|
|
|
- result[2] = oneMinusFactor * materialColor[2] + textureIntensity * Math.abs(materialColor[2] - color[2]);
|
|
|
|
- break;
|
|
|
|
- case MTEX_DARK:
|
|
|
|
- col = textureIntensity * color[0];
|
|
|
|
- result[0] = col < materialColor[0] ? col : materialColor[0];
|
|
|
|
- col = textureIntensity * color[1];
|
|
|
|
- result[1] = col < materialColor[1] ? col : materialColor[1];
|
|
|
|
- col = textureIntensity * color[2];
|
|
|
|
- result[2] = col < materialColor[2] ? col : materialColor[2];
|
|
|
|
- break;
|
|
|
|
- case MTEX_LIGHT:
|
|
|
|
- col = textureIntensity * color[0];
|
|
|
|
- result[0] = col > materialColor[0] ? col : materialColor[0];
|
|
|
|
- col = textureIntensity * color[1];
|
|
|
|
- result[1] = col > materialColor[1] ? col : materialColor[1];
|
|
|
|
- col = textureIntensity * color[2];
|
|
|
|
- result[2] = col > materialColor[2] ? col : materialColor[2];
|
|
|
|
- break;
|
|
|
|
- case MTEX_BLEND_HUE:
|
|
|
|
- case MTEX_BLEND_SAT:
|
|
|
|
- case MTEX_BLEND_VAL:
|
|
|
|
- case MTEX_BLEND_COLOR:
|
|
|
|
- System.arraycopy(materialColor, 0, result, 0, 3);
|
|
|
|
- this.rampBlend(blendtype, result, textureIntensity, color, blenderContext);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- throw new IllegalStateException("Unknown blend type: " + blendtype);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * The method that performs the ramp blending.
|
|
|
|
- *
|
|
|
|
- * @param type
|
|
|
|
- * the blend type
|
|
|
|
- * @param rgb
|
|
|
|
- * the rgb value where the result is stored
|
|
|
|
- * @param fac
|
|
|
|
- * color affection factor
|
|
|
|
- * @param col
|
|
|
|
- * the texture color
|
|
|
|
- * @param blenderContext
|
|
|
|
- * the blender context
|
|
|
|
- */
|
|
|
|
- protected void rampBlend(int type, float[] rgb, float fac, float[] col, BlenderContext blenderContext) {
|
|
|
|
- float oneMinusFactor = 1.0f - fac;
|
|
|
|
- MaterialHelper materialHelper = blenderContext.getHelper(MaterialHelper.class);
|
|
|
|
-
|
|
|
|
- if (rgb.length >= 3) {
|
|
|
|
- switch (type) {
|
|
|
|
- case MTEX_BLEND_HUE: {
|
|
|
|
- float[] colorTransformResult = new float[3];
|
|
|
|
- materialHelper.rgbToHsv(col[0], col[1], col[2], colorTransformResult);
|
|
|
|
- if (colorTransformResult[1] != 0.0f) {
|
|
|
|
- float colH = colorTransformResult[0];
|
|
|
|
- materialHelper.rgbToHsv(rgb[0], rgb[1], rgb[2], colorTransformResult);
|
|
|
|
- materialHelper.hsvToRgb(colH, colorTransformResult[1], colorTransformResult[2], colorTransformResult);
|
|
|
|
- rgb[0] = oneMinusFactor * rgb[0] + fac * colorTransformResult[0];
|
|
|
|
- rgb[1] = oneMinusFactor * rgb[1] + fac * colorTransformResult[1];
|
|
|
|
- rgb[2] = oneMinusFactor * rgb[2] + fac * colorTransformResult[2];
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case MTEX_BLEND_SAT: {
|
|
|
|
- float[] colorTransformResult = new float[3];
|
|
|
|
- materialHelper.rgbToHsv(rgb[0], rgb[1], rgb[2], colorTransformResult);
|
|
|
|
- float h = colorTransformResult[0];
|
|
|
|
- float s = colorTransformResult[1];
|
|
|
|
- float v = colorTransformResult[2];
|
|
|
|
- if (s != 0.0f) {
|
|
|
|
- materialHelper.rgbToHsv(col[0], col[1], col[2], colorTransformResult);
|
|
|
|
- materialHelper.hsvToRgb(h, (oneMinusFactor * s + fac * colorTransformResult[1]), v, rgb);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case MTEX_BLEND_VAL: {
|
|
|
|
- float[] rgbToHsv = new float[3];
|
|
|
|
- float[] colToHsv = new float[3];
|
|
|
|
- materialHelper.rgbToHsv(rgb[0], rgb[1], rgb[2], rgbToHsv);
|
|
|
|
- materialHelper.rgbToHsv(col[0], col[1], col[2], colToHsv);
|
|
|
|
- materialHelper.hsvToRgb(rgbToHsv[0], rgbToHsv[1], (oneMinusFactor * rgbToHsv[2] + fac * colToHsv[2]), rgb);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- case MTEX_BLEND_COLOR: {
|
|
|
|
- float[] rgbToHsv = new float[3];
|
|
|
|
- float[] colToHsv = new float[3];
|
|
|
|
- materialHelper.rgbToHsv(col[0], col[1], col[2], colToHsv);
|
|
|
|
- if (colToHsv[2] != 0) {
|
|
|
|
- materialHelper.rgbToHsv(rgb[0], rgb[1], rgb[2], rgbToHsv);
|
|
|
|
- materialHelper.hsvToRgb(colToHsv[0], colToHsv[1], rgbToHsv[2], rgbToHsv);
|
|
|
|
- rgb[0] = oneMinusFactor * rgb[0] + fac * rgbToHsv[0];
|
|
|
|
- rgb[1] = oneMinusFactor * rgb[1] + fac * rgbToHsv[1];
|
|
|
|
- rgb[2] = oneMinusFactor * rgb[2] + fac * rgbToHsv[2];
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
- throw new IllegalStateException("Unknown ramp type: " + type);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* This method converts the given texture into normal-map texture.
|
|
* This method converts the given texture into normal-map texture.
|