Added parallel processing mode to tangent generator

experimental
abies 11 years ago
parent 7df6235dcd
commit 93b3b744f3
  1. 44
      jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java

@ -40,7 +40,9 @@ import com.jme3.scene.VertexBuffer.Format;
import com.jme3.scene.VertexBuffer.Type;
import com.jme3.scene.VertexBuffer.Usage;
import com.jme3.scene.mesh.IndexBuffer;
import static com.jme3.util.BufferUtils.*;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
@ -49,8 +51,12 @@ import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -147,6 +153,44 @@ public class TangentBinormalGenerator {
generate(scene, false);
}
public static void generateParallel(Spatial scene, ExecutorService executor) {
final Set<Mesh> meshes = new HashSet<Mesh>();
scene.breadthFirstTraversal(new SceneGraphVisitor(){
@Override
public void visit(Spatial spatial) {
if ( spatial instanceof Geometry ) {
Geometry geom = (Geometry) spatial;
Mesh mesh = geom.getMesh();
// Check to ensure mesh has texcoords and normals before generating
if (mesh.getBuffer(Type.TexCoord) != null
&& mesh.getBuffer(Type.Normal) != null){
meshes.add(mesh);
}
}
}
});
List<Future<?>> futures = new ArrayList<Future<?>>();
for ( final Mesh m : meshes ) {
futures.add(executor.submit(new Runnable() {
@Override
public void run() {
generate(m,true,false);
}
}));
}
for ( Future<?> f : futures ) {
try {
f.get();
} catch (Exception exc) {
log.log(Level.WARNING,"Error while computing tangents",exc);
}
}
}
public static void generate(Mesh mesh, boolean approxTangents, boolean splitMirrored) {
int[] index = new int[3];
Vector3f[] v = new Vector3f[3];

Loading…
Cancel
Save