diff --git a/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java b/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java index fe6c36d0e..a5f001009 100644 --- a/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java +++ b/engine/src/blender/com/jme3/scene/plugins/blender/textures/UVCoordinatesGenerator.java @@ -101,44 +101,11 @@ public class UVCoordinatesGenerator { VertexBuffer result = new VertexBuffer(VertexBuffer.Type.TexCoord); Mesh mesh = geometries.get(0).getMesh(); BoundingBox bb = UVCoordinatesGenerator.getBoundingBox(geometries); + float[] inputData = null;//positions, normals, reflection vectors, etc. switch (texco) { case TEXCO_ORCO: - float[] uvCoordinates = null; - if (textureDimension == 2) { - switch (projection) { - case PROJECTION_FLAT: - uvCoordinates = UVProjectionGenerator.flatProjection(mesh, bb); - break; - case PROJECTION_CUBE: - uvCoordinates = UVProjectionGenerator.cubeProjection(mesh, bb); - break; - case PROJECTION_TUBE: - BoundingTube bt = UVCoordinatesGenerator.getBoundingTube(mesh); - uvCoordinates = UVProjectionGenerator.tubeProjection(mesh, bt); - break; - case PROJECTION_SPHERE: - BoundingSphere bs = UVCoordinatesGenerator.getBoundingSphere(geometries); - uvCoordinates = UVProjectionGenerator.sphereProjection(mesh, bs); - break; - default: - throw new IllegalStateException("Unknown projection type: " + projection); - } - } else { - FloatBuffer positions = mesh.getFloatBuffer(VertexBuffer.Type.Position); - uvCoordinates = BufferUtils.getFloatArray(positions); - Vector3f min = bb.getMin(null); - float[] ext = new float[] { bb.getXExtent() * 2, bb.getYExtent() * 2, bb.getZExtent() * 2 }; - - // now transform the coordinates so that they are in the range of <0; 1> - for (int i = 0; i < uvCoordinates.length; i += 3) { - uvCoordinates[i] = (uvCoordinates[i] - min.x) / ext[0]; - uvCoordinates[i + 1] = (uvCoordinates[i + 1] - min.y) / ext[1]; - uvCoordinates[i + 2] = (uvCoordinates[i + 2] - min.z) / ext[2]; - } - result.setupData(Usage.Static, textureDimension, Format.Float, BufferUtils.createFloatBuffer(uvCoordinates)); - } - result.setupData(Usage.Static, textureDimension, Format.Float, BufferUtils.createFloatBuffer(uvCoordinates)); + inputData = BufferUtils.getFloatArray(mesh.getFloatBuffer(VertexBuffer.Type.Position)); break; case TEXCO_UV: if (textureDimension == 2) { @@ -151,9 +118,12 @@ public class UVCoordinatesGenerator { } result.setupData(Usage.Static, textureDimension, Format.Float, uvCoordinatesBuffer); } else { - + } break; + case TEXCO_NORM: + inputData = BufferUtils.getFloatArray(mesh.getFloatBuffer(VertexBuffer.Type.Normal)); + break; case TEXCO_GLOB: break; @@ -162,9 +132,6 @@ public class UVCoordinatesGenerator { break; case TEXCO_STRESS: - break; - case TEXCO_NORM: - break; case TEXCO_LAVECTOR: case TEXCO_OBJECT: @@ -181,6 +148,41 @@ public class UVCoordinatesGenerator { throw new IllegalStateException("Unknown texture coordinates value: " + texco); } + if(inputData!=null) {//make calculations + if (textureDimension == 2) { + switch (projection) { + case PROJECTION_FLAT: + inputData = UVProjectionGenerator.flatProjection(mesh, bb); + break; + case PROJECTION_CUBE: + inputData = UVProjectionGenerator.cubeProjection(mesh, bb); + break; + case PROJECTION_TUBE: + BoundingTube bt = UVCoordinatesGenerator.getBoundingTube(mesh); + inputData = UVProjectionGenerator.tubeProjection(mesh, bt); + break; + case PROJECTION_SPHERE: + BoundingSphere bs = UVCoordinatesGenerator.getBoundingSphere(geometries); + inputData = UVProjectionGenerator.sphereProjection(mesh, bs); + break; + default: + throw new IllegalStateException("Unknown projection type: " + projection); + } + } else { + Vector3f min = bb.getMin(null); + float[] ext = new float[] { bb.getXExtent() * 2, bb.getYExtent() * 2, bb.getZExtent() * 2 }; + + // now transform the coordinates so that they are in the range of <0; 1> + for (int i = 0; i < inputData.length; i += 3) { + inputData[i] = (inputData[i] - min.x) / ext[0]; + inputData[i + 1] = (inputData[i + 1] - min.y) / ext[1]; + inputData[i + 2] = (inputData[i + 2] - min.z) / ext[2]; + } + result.setupData(Usage.Static, textureDimension, Format.Float, BufferUtils.createFloatBuffer(inputData)); + } + result.setupData(Usage.Static, textureDimension, Format.Float, BufferUtils.createFloatBuffer(inputData)); + } + // each mesh will have the same coordinates for (Geometry geometry : geometries) { mesh = geometry.getMesh();