|
|
|
@ -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(); |
|
|
|
|