From 93b3b744f3640209c2b283ef484fbee6ba7920f9 Mon Sep 17 00:00:00 2001 From: abies Date: Sun, 15 Jun 2014 19:20:32 +0200 Subject: [PATCH] Added parallel processing mode to tangent generator --- .../jme3/util/TangentBinormalGenerator.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java b/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java index e982e9665..521c1bcff 100644 --- a/jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java +++ b/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 meshes = new HashSet(); + 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> futures = new ArrayList>(); + 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];