Fix to setting the normal texture if vertex coloring is enabled.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7612 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
Kae..pl 14 years ago
parent 2073f58cf8
commit 5dc1a29f6e
  1. 56
      engine/src/blender/com/jme3/scene/plugins/blender/helpers/v249/MaterialHelper.java
  2. 21
      engine/src/blender/com/jme3/scene/plugins/blender/helpers/v249/MeshHelper.java
  3. 3
      engine/src/blender/com/jme3/scene/plugins/blender/helpers/v249/TextureHelper.java

@ -62,26 +62,26 @@ import com.jme3.texture.Texture.WrapMode;
import com.jme3.util.BufferUtils; import com.jme3.util.BufferUtils;
public class MaterialHelper extends AbstractBlenderHelper { public class MaterialHelper extends AbstractBlenderHelper {
private static final Logger LOGGER = Logger.getLogger(MaterialHelper.class.getName()); private static final Logger LOGGER = Logger.getLogger(MaterialHelper.class.getName());
protected static final float DEFAULT_SHININESS = 20.0f; protected static final float DEFAULT_SHININESS = 20.0f;
public static final String TEXTURE_TYPE_COLOR = "ColorMap"; public static final String TEXTURE_TYPE_COLOR = "ColorMap";
public static final String TEXTURE_TYPE_DIFFUSE = "DiffuseMap"; public static final String TEXTURE_TYPE_DIFFUSE = "DiffuseMap";
public static final String TEXTURE_TYPE_NORMAL = "NormalMap"; public static final String TEXTURE_TYPE_NORMAL = "NormalMap";
public static final String TEXTURE_TYPE_SPECULAR = "SpecularMap"; public static final String TEXTURE_TYPE_SPECULAR = "SpecularMap";
public static final String TEXTURE_TYPE_GLOW = "GlowMap"; public static final String TEXTURE_TYPE_GLOW = "GlowMap";
public static final String TEXTURE_TYPE_ALPHA = "AlphaMap"; public static final String TEXTURE_TYPE_ALPHA = "AlphaMap";
public static final Integer ALPHA_MASK_NONE = Integer.valueOf(0); public static final Integer ALPHA_MASK_NONE = Integer.valueOf(0);
public static final Integer ALPHA_MASK_CIRCLE = Integer.valueOf(1); public static final Integer ALPHA_MASK_CIRCLE = Integer.valueOf(1);
public static final Integer ALPHA_MASK_CONE = Integer.valueOf(2); public static final Integer ALPHA_MASK_CONE = Integer.valueOf(2);
public static final Integer ALPHA_MASK_HYPERBOLE = Integer.valueOf(3); public static final Integer ALPHA_MASK_HYPERBOLE = Integer.valueOf(3);
protected final Map<Integer, AlphaMask> alphaMasks = new HashMap<Integer, AlphaMask>(); protected final Map<Integer, IAlphaMask> alphaMasks = new HashMap<Integer, IAlphaMask>();
/** /**
* The type of the material's diffuse shader. * The type of the material's diffuse shader.
*/ */
public static enum DiffuseShader { public static enum DiffuseShader {
LAMBERT, ORENNAYAR, TOON, MINNAERT, FRESNEL LAMBERT, ORENNAYAR, TOON, MINNAERT, FRESNEL
} }
@ -89,9 +89,9 @@ public class MaterialHelper extends AbstractBlenderHelper {
* The type of the material's specular shader. * The type of the material's specular shader.
*/ */
public static enum SpecularShader { public static enum SpecularShader {
COOKTORRENCE, PHONG, BLINN, TOON, WARDISO COOKTORRENCE, PHONG, BLINN, TOON, WARDISO
} }
/** Face cull mode. Should be excplicitly set before this helper is used. */ /** Face cull mode. Should be excplicitly set before this helper is used. */
protected FaceCullMode faceCullMode; protected FaceCullMode faceCullMode;
@ -105,26 +105,23 @@ public class MaterialHelper extends AbstractBlenderHelper {
public MaterialHelper(String blenderVersion) { public MaterialHelper(String blenderVersion) {
super(blenderVersion); super(blenderVersion);
// setting alpha masks // setting alpha masks
alphaMasks.put(ALPHA_MASK_NONE, new AlphaMask() { alphaMasks.put(ALPHA_MASK_NONE, new IAlphaMask() {
@Override @Override
public void setImageSize(int width, int height) { public void setImageSize(int width, int height) {}
}
@Override @Override
public byte getAlpha(float x, float y) { public byte getAlpha(float x, float y) {
return (byte) 255; return (byte) 255;
} }
}); });
alphaMasks.put(ALPHA_MASK_CIRCLE, new AlphaMask() { alphaMasks.put(ALPHA_MASK_CIRCLE, new IAlphaMask() {
private float r; private float r;
private float[] center; private float[] center;
@Override @Override
public void setImageSize(int width, int height) { public void setImageSize(int width, int height) {
r = Math.min(width, height) * 0.5f; r = Math.min(width, height) * 0.5f;
center = new float[]{width * 0.5f, height * 0.5f}; center = new float[] { width * 0.5f, height * 0.5f };
} }
@Override @Override
@ -133,15 +130,14 @@ public class MaterialHelper extends AbstractBlenderHelper {
return (byte) (d >= r ? 0 : 255); return (byte) (d >= r ? 0 : 255);
} }
}); });
alphaMasks.put(ALPHA_MASK_CONE, new AlphaMask() { alphaMasks.put(ALPHA_MASK_CONE, new IAlphaMask() {
private float r; private float r;
private float[] center; private float[] center;
@Override @Override
public void setImageSize(int width, int height) { public void setImageSize(int width, int height) {
r = Math.min(width, height) * 0.5f; r = Math.min(width, height) * 0.5f;
center = new float[]{width * 0.5f, height * 0.5f}; center = new float[] { width * 0.5f, height * 0.5f };
} }
@Override @Override
@ -150,15 +146,14 @@ public class MaterialHelper extends AbstractBlenderHelper {
return (byte) (d >= r ? 0 : -255.0f * d / r + 255.0f); return (byte) (d >= r ? 0 : -255.0f * d / r + 255.0f);
} }
}); });
alphaMasks.put(ALPHA_MASK_HYPERBOLE, new AlphaMask() { alphaMasks.put(ALPHA_MASK_HYPERBOLE, new IAlphaMask() {
private float r; private float r;
private float[] center; private float[] center;
@Override @Override
public void setImageSize(int width, int height) { public void setImageSize(int width, int height) {
r = Math.min(width, height) * 0.5f; r = Math.min(width, height) * 0.5f;
center = new float[]{width * 0.5f, height * 0.5f}; center = new float[] { width * 0.5f, height * 0.5f };
} }
@Override @Override
@ -210,11 +205,7 @@ public class MaterialHelper extends AbstractBlenderHelper {
String name = structure.getName(); String name = structure.getName();
LOGGER.log(Level.INFO, "Material's name: {0}", name); LOGGER.log(Level.INFO, "Material's name: {0}", name);
if (vertexColor) { if (vertexColor) {
if (shadeless) { result.setBoolean(shadeless ? "VertexColor" : "UseVertexColor", true);
result.setBoolean("VertexColor", true);
} else {
result.setBoolean("UseVertexColor", true);
}
} }
MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class); MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class);
@ -222,7 +213,7 @@ public class MaterialHelper extends AbstractBlenderHelper {
if (shadeless) { if (shadeless) {
// color of shadeless? doesn't seem to work in blender .. // color of shadeless? doesn't seem to work in blender ..
} else { } else {
result.setBoolean("UseMaterialColors", true); result.setBoolean("UseMaterialColors", Boolean.TRUE);
// setting the colors // setting the colors
DiffuseShader diffuseShader = materialHelper.getDiffuseShader(structure); DiffuseShader diffuseShader = materialHelper.getDiffuseShader(structure);
@ -260,13 +251,10 @@ public class MaterialHelper extends AbstractBlenderHelper {
Texture texture = textureHelper.getTexture(tex, dataRepository); Texture texture = textureHelper.getTexture(tex, dataRepository);
if (texture != null) { if (texture != null) {
if ((mapto & 0x01) != 0) {// Col if ((mapto & 0x01) != 0) {// Col
if (!shadeless){ result.setBoolean("UseMaterialColors", Boolean.FALSE);
result.setBoolean("UseMaterialColors", false);
}
// blending the texture with material color and texture's defined color // blending the texture with material color and texture's defined color
int blendType = ((Number) textureLink.getFieldValue("blendtype")).intValue(); int blendType = ((Number) textureLink.getFieldValue("blendtype")).intValue();
float[] color = new float[]{((Number) textureLink.getFieldValue("r")).floatValue(), ((Number) textureLink.getFieldValue("g")).floatValue(), ((Number) textureLink.getFieldValue("b")).floatValue()}; float[] color = new float[] { ((Number) textureLink.getFieldValue("r")).floatValue(), ((Number) textureLink.getFieldValue("g")).floatValue(), ((Number) textureLink.getFieldValue("b")).floatValue() };
float colfac = ((Number) textureLink.getFieldValue("colfac")).floatValue(); float colfac = ((Number) textureLink.getFieldValue("colfac")).floatValue();
texture = textureHelper.blendTexture(diffuseColor.getColorArray(), texture, color, colfac, blendType, negateTexture, dataRepository); texture = textureHelper.blendTexture(diffuseColor.getColorArray(), texture, color, colfac, blendType, negateTexture, dataRepository);
texture.setWrap(WrapMode.Repeat); texture.setWrap(WrapMode.Repeat);
@ -278,8 +266,11 @@ public class MaterialHelper extends AbstractBlenderHelper {
} }
if ((mapto & 0x02) != 0) {// Nor if ((mapto & 0x02) != 0) {// Nor
result.setTexture(TEXTURE_TYPE_NORMAL, texture); result.setTexture(TEXTURE_TYPE_NORMAL, texture);
if (vertexColor) {
result.setBoolean(shadeless ? "VertexColor" : "UseVertexColor", false);
} }
if ((mapto & 0x20) != 0) {// Spec }
if ((mapto & 0x04) != 0) {// Spec
result.setTexture(TEXTURE_TYPE_SPECULAR, texture); result.setTexture(TEXTURE_TYPE_SPECULAR, texture);
} }
if ((mapto & 0x40) != 0) {// Emit if ((mapto & 0x40) != 0) {// Emit
@ -319,7 +310,7 @@ public class MaterialHelper extends AbstractBlenderHelper {
* @return material without textures of a specified type * @return material without textures of a specified type
*/ */
public Material getNonTexturedMaterial(Material material, int imageType) { public Material getNonTexturedMaterial(Material material, int imageType) {
String[] textureParamNames = new String[]{TEXTURE_TYPE_DIFFUSE, TEXTURE_TYPE_NORMAL, TEXTURE_TYPE_GLOW, TEXTURE_TYPE_SPECULAR, TEXTURE_TYPE_ALPHA}; String[] textureParamNames = new String[] { TEXTURE_TYPE_DIFFUSE, TEXTURE_TYPE_NORMAL, TEXTURE_TYPE_GLOW, TEXTURE_TYPE_SPECULAR, TEXTURE_TYPE_ALPHA };
Map<String, Texture> textures = new HashMap<String, Texture>(textureParamNames.length); Map<String, Texture> textures = new HashMap<String, Texture>(textureParamNames.length);
for (String textureParamName : textureParamNames) { for (String textureParamName : textureParamNames) {
MatParamTexture matParamTexture = material.getTextureParam(textureParamName); MatParamTexture matParamTexture = material.getTextureParam(textureParamName);
@ -376,7 +367,7 @@ public class MaterialHelper extends AbstractBlenderHelper {
int w = image.getWidth(); int w = image.getWidth();
int h = image.getHeight(); int h = image.getHeight();
ByteBuffer bb = BufferUtils.createByteBuffer(w * h * 4); ByteBuffer bb = BufferUtils.createByteBuffer(w * h * 4);
AlphaMask iAlphaMask = alphaMasks.get(alphaMaskIndex); IAlphaMask iAlphaMask = alphaMasks.get(alphaMaskIndex);
iAlphaMask.setImageSize(w, h); iAlphaMask.setImageSize(w, h);
for (int x = 0; x < w; ++x) { for (int x = 0; x < w; ++x) {
@ -686,8 +677,7 @@ public class MaterialHelper extends AbstractBlenderHelper {
* An interface used in calculating alpha mask during particles' texture calculations. * An interface used in calculating alpha mask during particles' texture calculations.
* @author Marcin Roguski (Kaelthas) * @author Marcin Roguski (Kaelthas)
*/ */
protected static interface AlphaMask { protected static interface IAlphaMask {
/** /**
* This method sets the size of the texture's image. * This method sets the size of the texture's image.
* @param width * @param width

@ -53,9 +53,9 @@ import com.jme3.scene.VertexBuffer.Type;
import com.jme3.scene.VertexBuffer.Usage; import com.jme3.scene.VertexBuffer.Usage;
import com.jme3.scene.plugins.blender.data.Structure; import com.jme3.scene.plugins.blender.data.Structure;
import com.jme3.scene.plugins.blender.exception.BlenderFileException; import com.jme3.scene.plugins.blender.exception.BlenderFileException;
import com.jme3.scene.plugins.blender.utils.AbstractBlenderHelper;
import com.jme3.scene.plugins.blender.utils.DataRepository; import com.jme3.scene.plugins.blender.utils.DataRepository;
import com.jme3.scene.plugins.blender.utils.DataRepository.LoadedFeatureDataType; import com.jme3.scene.plugins.blender.utils.DataRepository.LoadedFeatureDataType;
import com.jme3.scene.plugins.blender.utils.AbstractBlenderHelper;
import com.jme3.scene.plugins.blender.utils.DynamicArray; import com.jme3.scene.plugins.blender.utils.DynamicArray;
import com.jme3.scene.plugins.blender.utils.Pointer; import com.jme3.scene.plugins.blender.utils.Pointer;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
@ -67,7 +67,6 @@ import com.jme3.util.BufferUtils;
* @author Marcin Roguski (Kaelthas) * @author Marcin Roguski (Kaelthas)
*/ */
public class MeshHelper extends AbstractBlenderHelper { public class MeshHelper extends AbstractBlenderHelper {
protected static final int MAXIMUM_WEIGHTS_PER_VERTEX = 4; // have no idea why 4, could someone please explain ? protected static final int MAXIMUM_WEIGHTS_PER_VERTEX = 4; // have no idea why 4, could someone please explain ?
/** /**
@ -138,8 +137,8 @@ public class MeshHelper extends AbstractBlenderHelper {
List<Vector3f> normalList = new ArrayList<Vector3f>(); List<Vector3f> normalList = new ArrayList<Vector3f>();
List<Vector3f> vertexList = new ArrayList<Vector3f>(); List<Vector3f> vertexList = new ArrayList<Vector3f>();
Map<Integer, Texture> materialNumberToTexture = new HashMap<Integer, Texture>();// indicates if the material with the specified // indicates if the material with the specified number should have a texture attached
// number should have a texture attached Map<Integer, Texture> materialNumberToTexture = new HashMap<Integer, Texture>();
// this map's key is the vertex index from 'vertices 'table and the value are indices from 'vertexList' // this map's key is the vertex index from 'vertices 'table and the value are indices from 'vertexList'
// positions (it simply tells which vertex is referenced where in the result list) // positions (it simply tells which vertex is referenced where in the result list)
Map<Integer, List<Integer>> vertexReferenceMap = new HashMap<Integer, List<Integer>>(verticesAmount); Map<Integer, List<Integer>> vertexReferenceMap = new HashMap<Integer, List<Integer>>(verticesAmount);
@ -167,11 +166,9 @@ public class MeshHelper extends AbstractBlenderHelper {
indexList = new ArrayList<Integer>(); indexList = new ArrayList<Integer>();
meshesMap.put(materialNumber, indexList); meshesMap.put(materialNumber, indexList);
} }
if (pImage != null && !pImage.isNull() && !materialNumberToTexture.containsKey(materialNumber)) {// attaching image to texture
// (face can have UV's and // attaching image to texture (face can have UV's and image whlie its material may have no texture attached)
// image whlie its material if (pImage != null && !pImage.isNull() && !materialNumberToTexture.containsKey(materialNumber)) {
// may have no texture
// attached)
Texture texture = textureHelper.getTextureFromImage(pImage.fetchData(dataRepository.getInputStream()).get(0), Texture texture = textureHelper.getTextureFromImage(pImage.fetchData(dataRepository.getInputStream()).get(0),
dataRepository); dataRepository);
if (texture != null) { if (texture != null) {
@ -255,7 +252,7 @@ public class MeshHelper extends AbstractBlenderHelper {
Map<Integer, Integer> groupToBoneIndexMap = armatureHelper.getGroupToBoneIndexMap(defBase, dataRepository); Map<Integer, Integer> groupToBoneIndexMap = armatureHelper.getGroupToBoneIndexMap(defBase, dataRepository);
VertexBuffer verticesWeights = null, verticesWeightsIndices = null; VertexBuffer verticesWeights = null, verticesWeightsIndices = null;
int[] bonesGroups = new int[]{0}; int[] bonesGroups = new int[] { 0 };
VertexBuffer[] boneWeightsAndIndex = this.getBoneWeightAndIndexBuffer(structure, vertexList.size(), bonesGroups, VertexBuffer[] boneWeightsAndIndex = this.getBoneWeightAndIndexBuffer(structure, vertexList.size(), bonesGroups,
vertexReferenceMap, groupToBoneIndexMap, dataRepository); vertexReferenceMap, groupToBoneIndexMap, dataRepository);
verticesWeights = boneWeightsAndIndex[0]; verticesWeights = boneWeightsAndIndex[0];
@ -440,7 +437,7 @@ public class MeshHelper extends AbstractBlenderHelper {
float g = ((Number) color.getFieldValue("g")).byteValue() / 256.0f; float g = ((Number) color.getFieldValue("g")).byteValue() / 256.0f;
float b = ((Number) color.getFieldValue("b")).byteValue() / 256.0f; float b = ((Number) color.getFieldValue("b")).byteValue() / 256.0f;
float a = ((Number) color.getFieldValue("a")).byteValue() / 256.0f; float a = ((Number) color.getFieldValue("a")).byteValue() / 256.0f;
verticesColors.add(new float[]{b, g, r, a}); verticesColors.add(new float[] { b, g, r, a });
} }
} }
return verticesColors; return verticesColors;
@ -559,7 +556,7 @@ public class MeshHelper extends AbstractBlenderHelper {
VertexBuffer verticesWeightsIndices = new VertexBuffer(Type.BoneIndex); VertexBuffer verticesWeightsIndices = new VertexBuffer(Type.BoneIndex);
verticesWeightsIndices.setupData(Usage.CpuOnly, bonesGroups[0], Format.UnsignedByte, indicesData); verticesWeightsIndices.setupData(Usage.CpuOnly, bonesGroups[0], Format.UnsignedByte, indicesData);
return new VertexBuffer[]{verticesWeights, verticesWeightsIndices}; return new VertexBuffer[] { verticesWeights, verticesWeightsIndices };
} }
/** /**

@ -217,7 +217,7 @@ public class TextureHelper extends AbstractBlenderHelper {
throw new BlenderFileException("Unknown texture type: " + type + " for texture: " + tex.getName()); throw new BlenderFileException("Unknown texture type: " + type + " for texture: " + tex.getName());
} }
if (result != null) { if (result != null) {
result.setName(String.valueOf(type)); result.setName(tex.getName());
result.setWrap(WrapMode.Repeat); result.setWrap(WrapMode.Repeat);
} }
return result; return result;
@ -1579,7 +1579,6 @@ public class TextureHelper extends AbstractBlenderHelper {
} }
} }
if (result != null) { if (result != null) {
result.setName(String.valueOf(8));// 8 = TEX_IMAGE
result.setWrap(Texture.WrapMode.Repeat); result.setWrap(Texture.WrapMode.Repeat);
dataRepository.addLoadedFeatures(image.getOldMemoryAddress(), image.getName(), image, result); dataRepository.addLoadedFeatures(image.getOldMemoryAddress(), image.getName(), image, result);
} }

Loading…
Cancel
Save