|
|
@@ -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];
|