Merge branch 'master' of github.com:jMonkeyEngine/jmonkeyengine
This commit is contained in:
commit
f5c5d161d0
@ -1,6 +1,7 @@
|
|||||||
package com.jme3.scene.plugins.blender.materials;
|
package com.jme3.scene.plugins.blender.materials;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@ -157,14 +158,14 @@ public final class MaterialContext implements Savable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// applying textures
|
// applying textures
|
||||||
|
int textureIndex = 0;
|
||||||
if (loadedTextures != null && loadedTextures.size() > 0) {
|
if (loadedTextures != null && loadedTextures.size() > 0) {
|
||||||
int textureIndex = 0;
|
|
||||||
if (loadedTextures.size() > TextureHelper.TEXCOORD_TYPES.length) {
|
if (loadedTextures.size() > TextureHelper.TEXCOORD_TYPES.length) {
|
||||||
LOGGER.log(Level.WARNING, "The blender file has defined more than {0} different textures. JME supports only {0} UV mappings.", TextureHelper.TEXCOORD_TYPES.length);
|
LOGGER.log(Level.WARNING, "The blender file has defined more than {0} different textures. JME supports only {0} UV mappings.", TextureHelper.TEXCOORD_TYPES.length);
|
||||||
}
|
}
|
||||||
for (CombinedTexture combinedTexture : loadedTextures) {
|
for (CombinedTexture combinedTexture : loadedTextures) {
|
||||||
if (textureIndex < TextureHelper.TEXCOORD_TYPES.length) {
|
if (textureIndex < TextureHelper.TEXCOORD_TYPES.length) {
|
||||||
combinedTexture.flatten(geometry, geometriesOMA, userDefinedUVCoordinates, blenderContext);
|
String usedUserUVSet = combinedTexture.flatten(geometry, geometriesOMA, userDefinedUVCoordinates, blenderContext);
|
||||||
|
|
||||||
this.setTexture(material, combinedTexture.getMappingType(), combinedTexture.getResultTexture());
|
this.setTexture(material, combinedTexture.getMappingType(), combinedTexture.getResultTexture());
|
||||||
List<Vector2f> uvs = combinedTexture.getResultUVS();
|
List<Vector2f> uvs = combinedTexture.getResultUVS();
|
||||||
@ -173,13 +174,19 @@ public final class MaterialContext implements Savable {
|
|||||||
uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()])));
|
uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()])));
|
||||||
geometry.getMesh().setBuffer(uvCoordsBuffer);
|
geometry.getMesh().setBuffer(uvCoordsBuffer);
|
||||||
}//uvs might be null if the user assigned non existing UV coordinates group name to the mesh (this should be fixed in blender file)
|
}//uvs might be null if the user assigned non existing UV coordinates group name to the mesh (this should be fixed in blender file)
|
||||||
|
|
||||||
|
if(usedUserUVSet != null) {
|
||||||
|
userDefinedUVCoordinates = new HashMap<>(userDefinedUVCoordinates);
|
||||||
|
userDefinedUVCoordinates.remove(usedUserUVSet);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOGGER.log(Level.WARNING, "The texture could not be applied because JME only supports up to {0} different UV's.", TextureHelper.TEXCOORD_TYPES.length);
|
LOGGER.log(Level.WARNING, "The texture could not be applied because JME only supports up to {0} different UV's.", TextureHelper.TEXCOORD_TYPES.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (userDefinedUVCoordinates != null && userDefinedUVCoordinates.size() > 0) {
|
}
|
||||||
LOGGER.fine("No textures found for the mesh, but UV coordinates are applied.");
|
|
||||||
int textureIndex = 0;
|
if (userDefinedUVCoordinates != null && userDefinedUVCoordinates.size() > 0) {
|
||||||
|
LOGGER.fine("Storing unused, user defined UV coordinates sets.");
|
||||||
if (userDefinedUVCoordinates.size() > TextureHelper.TEXCOORD_TYPES.length) {
|
if (userDefinedUVCoordinates.size() > TextureHelper.TEXCOORD_TYPES.length) {
|
||||||
LOGGER.log(Level.WARNING, "The blender file has defined more than {0} different UV coordinates for the mesh. JME supports only {0} UV coordinates buffers.", TextureHelper.TEXCOORD_TYPES.length);
|
LOGGER.log(Level.WARNING, "The blender file has defined more than {0} different UV coordinates for the mesh. JME supports only {0} UV coordinates buffers.", TextureHelper.TEXCOORD_TYPES.length);
|
||||||
}
|
}
|
||||||
@ -190,7 +197,9 @@ public final class MaterialContext implements Savable {
|
|||||||
uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()])));
|
uvCoordsBuffer.setupData(Usage.Static, 2, Format.Float, BufferUtils.createFloatBuffer(uvs.toArray(new Vector2f[uvs.size()])));
|
||||||
geometry.getMesh().setBuffer(uvCoordsBuffer);
|
geometry.getMesh().setBuffer(uvCoordsBuffer);
|
||||||
} else {
|
} else {
|
||||||
LOGGER.log(Level.WARNING, "The texture could not be applied because JME only supports up to {0} different UV's.", TextureHelper.TEXCOORD_TYPES.length);
|
LOGGER.log(Level.WARNING, "The user's UV set named: '{0}' could not be stored because JME only supports up to {1} different UV's.", new Object[] {
|
||||||
|
entry.getKey(), TextureHelper.TEXCOORD_TYPES.length
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,22 +119,24 @@ public class CombinedTexture {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method flattens the texture and creates a single result of Texture2D
|
* This method flattens the texture and creates a single result of Texture2D
|
||||||
* type.
|
* type.
|
||||||
*
|
*
|
||||||
* @param geometry
|
* @param geometry
|
||||||
* the geometry the texture is created for
|
* the geometry the texture is created for
|
||||||
* @param geometriesOMA
|
* @param geometriesOMA
|
||||||
* the old memory address of the geometries list that the given
|
* the old memory address of the geometries list that the given
|
||||||
* geometry belongs to (needed for bounding box creation)
|
* geometry belongs to (needed for bounding box creation)
|
||||||
* @param userDefinedUVCoordinates
|
* @param userDefinedUVCoordinates
|
||||||
* the UV's defined by user (null or zero length table if none
|
* the UV's defined by user (null or zero length table if none
|
||||||
* were defined)
|
* were defined)
|
||||||
* @param blenderContext
|
* @param blenderContext
|
||||||
* the blender context
|
* the blender context
|
||||||
*/
|
* @return the name of the user UV coordinates used (null if the UV's were
|
||||||
public void flatten(Geometry geometry, Long geometriesOMA, Map<String, List<Vector2f>> userDefinedUVCoordinates, BlenderContext blenderContext) {
|
* generated)
|
||||||
|
*/
|
||||||
|
public String flatten(Geometry geometry, Long geometriesOMA, Map<String, List<Vector2f>> userDefinedUVCoordinates, BlenderContext blenderContext) {
|
||||||
Mesh mesh = geometry.getMesh();
|
Mesh mesh = geometry.getMesh();
|
||||||
Texture previousTexture = null;
|
Texture previousTexture = null;
|
||||||
UVCoordinatesType masterUVCoordinatesType = null;
|
UVCoordinatesType masterUVCoordinatesType = null;
|
||||||
@ -226,6 +228,7 @@ public class CombinedTexture {
|
|||||||
}
|
}
|
||||||
resultUVS = ((TriangulatedTexture) resultTexture).getResultUVS();
|
resultUVS = ((TriangulatedTexture) resultTexture).getResultUVS();
|
||||||
resultTexture = ((TriangulatedTexture) resultTexture).getResultTexture();
|
resultTexture = ((TriangulatedTexture) resultTexture).getResultTexture();
|
||||||
|
masterUserUVSetName = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setting additional data
|
// setting additional data
|
||||||
@ -234,6 +237,8 @@ public class CombinedTexture {
|
|||||||
// otherwise ugly lines appear between the mesh faces
|
// otherwise ugly lines appear between the mesh faces
|
||||||
resultTexture.setMagFilter(MagFilter.Nearest);
|
resultTexture.setMagFilter(MagFilter.Nearest);
|
||||||
resultTexture.setMinFilter(MinFilter.NearestNoMipMaps);
|
resultTexture.setMinFilter(MinFilter.NearestNoMipMaps);
|
||||||
|
|
||||||
|
return masterUserUVSetName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -409,7 +409,23 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl
|
|||||||
// Not automatic set cloning yet
|
// Not automatic set cloning yet
|
||||||
Set<Material> newMaterials = new HashSet<Material>();
|
Set<Material> newMaterials = new HashSet<Material>();
|
||||||
for( Material m : this.materials ) {
|
for( Material m : this.materials ) {
|
||||||
newMaterials.add(cloner.clone(m));
|
Material mClone = cloner.clone(m);
|
||||||
|
newMaterials.add(mClone);
|
||||||
|
if( mClone != m ) {
|
||||||
|
// Material was really cloned so clear the bone matrices in case
|
||||||
|
// this is hardware skinned. This allows a local version to be
|
||||||
|
// used and will be reset on the material. Really this just avoids
|
||||||
|
// the 'safety' check in controlRenderHardware(). Right now material
|
||||||
|
// doesn't clone itself with the cloner (and doesn't clone its parameters)
|
||||||
|
// else this would be unnecessary.
|
||||||
|
MatParam boneMatrices = mClone.getParam("BoneMatrices");
|
||||||
|
|
||||||
|
// ...because for some strange reason you can't clear a non-existant
|
||||||
|
// parameter.
|
||||||
|
if( boneMatrices != null ) {
|
||||||
|
mClone.clearParam("BoneMatrices");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.materials = newMaterials;
|
this.materials = newMaterials;
|
||||||
}
|
}
|
||||||
|
@ -207,10 +207,10 @@ public class Cloner {
|
|||||||
|
|
||||||
// Check the index to see if we already have it
|
// Check the index to see if we already have it
|
||||||
Object clone = index.get(object);
|
Object clone = index.get(object);
|
||||||
if( clone != null ) {
|
if( clone != null || index.containsKey(object) ) {
|
||||||
if( log.isLoggable(Level.FINER) ) {
|
if( log.isLoggable(Level.FINER) ) {
|
||||||
log.finer("cloned:" + object.getClass() + "@" + System.identityHashCode(object)
|
log.finer("cloned:" + object.getClass() + "@" + System.identityHashCode(object)
|
||||||
+ " as cached:" + clone.getClass() + "@" + System.identityHashCode(clone));
|
+ " as cached:" + (clone == null ? "null" : (clone.getClass() + "@" + System.identityHashCode(clone))));
|
||||||
}
|
}
|
||||||
return type.cast(clone);
|
return type.cast(clone);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user