Used library for reading obj files instead for compatibility

pull/35/head
James Ball 2020-02-12 16:02:13 +00:00
rodzic c5dbd2b3d0
commit b7712d3e36
4 zmienionych plików z 37 dodań i 54 usunięć

Wyświetl plik

@ -4,16 +4,15 @@ import engine.Camera;
import engine.Vector3; import engine.Vector3;
import engine.WorldObject; import engine.WorldObject;
import shapes.Shapes; import shapes.Shapes;
import shapes.Vector2;
public class AudioClient { public class AudioClient {
private static final int SAMPLE_RATE = 192000; private static final int SAMPLE_RATE = 192000;
private static final double FRAMERATE = 120; private static final double FRAMERATE = 30;
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
AudioPlayer player = new AudioPlayer(SAMPLE_RATE, 440); AudioPlayer player = new AudioPlayer(SAMPLE_RATE, 440);
Camera camera = new Camera(0.6, new Vector3(0, 0, -2)); Camera camera = new Camera(0.6, new Vector3(0, 0, -3));
WorldObject cube = new WorldObject(args[0], new Vector3(0, 0, 0), new Vector3()); WorldObject cube = new WorldObject(args[0], new Vector3(0, 0, 0), new Vector3());
Vector3 rotation = new Vector3(0,Math.PI / 100,Math.PI / 100); Vector3 rotation = new Vector3(0,Math.PI / 100,Math.PI / 100);

Wyświetl plik

@ -21,7 +21,7 @@ public class AudioPlayer extends Thread {
private static double TRANSLATE_SPEED = 0; private static double TRANSLATE_SPEED = 0;
private static Vector2 TRANSLATE_VECTOR; private static Vector2 TRANSLATE_VECTOR;
private static final int TRANSLATE_PHASE_INDEX = 0; private static final int TRANSLATE_PHASE_INDEX = 0;
private static double ROTATE_SPEED = 0.4; private static double ROTATE_SPEED = 0;
private static final int ROTATE_PHASE_INDEX = 1; private static final int ROTATE_PHASE_INDEX = 1;
private static double SCALE = 1; private static double SCALE = 1;

Wyświetl plik

@ -1,6 +1,7 @@
package engine; package engine;
import shapes.Line; import shapes.Line;
import shapes.Shape;
import shapes.Vector2; import shapes.Vector2;
import java.util.ArrayList; import java.util.ArrayList;
@ -40,9 +41,9 @@ public class Camera {
public List<Line> getFrame(List<Vector2> vertices, List<Integer> connections) { public List<Line> getFrame(List<Vector2> vertices, List<Integer> connections) {
List<Line> lines = new ArrayList<>(); List<Line> lines = new ArrayList<>();
for (int i = 0; i < connections.size(); i+=2) { for (int i = 0; i < connections.size(); i += 2) {
Vector2 start = vertices.get(connections.get(i)); Vector2 start = vertices.get(Math.abs(connections.get(i)));
Vector2 end = vertices.get(connections.get(i+1)); Vector2 end = vertices.get(Math.abs(connections.get(i + 1)));
double x1 = start.getX(); double x1 = start.getX();
double y1 = start.getY(); double y1 = start.getY();
double x2 = end.getX(); double x2 = end.getX();

Wyświetl plik

@ -1,16 +1,14 @@
package engine; package engine;
import java.io.File; import com.mokiat.data.front.parser.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.stream.Collectors;
public class Mesh { public class Mesh {
private static final String VERTEX_PATTERN = "(?m)^v .*";
private static final String FACE_PATTERN = "(?m)^f .*";
private List<Vector3> vertices; private List<Vector3> vertices;
private List<Integer> edgeData; private List<Integer> edgeData;
@ -32,52 +30,37 @@ public class Mesh {
} }
public static Mesh loadFromFile(String filename) { public static Mesh loadFromFile(String filename) {
Scanner sc; List<Vector3> vertices = new ArrayList<>();
try {
sc = new Scanner(new File(filename));
} catch (Exception e) {
System.err.println("Cannot load mesh data from: " + filename);
return new Mesh();
}
// load vertices
List<Vector3> vertices =
sc.findAll(VERTEX_PATTERN)
.map(s -> parseVertex(s.group(0)))
.collect(Collectors.toList());
// load edge data
List<Integer> edgeData = new ArrayList<>(); List<Integer> edgeData = new ArrayList<>();
for(MatchResult result : sc.findAll(FACE_PATTERN).collect(Collectors.toList())) { // Open a stream to your OBJ resource
List<Integer> indices = parseFace(result.group(0)); try (InputStream in = new FileInputStream(filename)) {
// Create an OBJParser and parse the resource
final IOBJParser parser = new OBJParser();
final OBJModel model = parser.parse(in);
for(int i = 0; i < indices.size(); i++ ) { for (OBJVertex vertex : model.getVertices()) {
edgeData.add(indices.get(i)); vertices.add(new Vector3(vertex.x, vertex.y, vertex.z));
edgeData.add(indices.get((i + 1) % indices.size()));
} }
for (OBJObject object : model.getObjects()) {
for (OBJMesh mesh : object.getMeshes()) {
for (OBJFace face : mesh.getFaces()) {
List<OBJDataReference> references = face.getReferences();
for (int i = 0; i < references.size(); i++) {
edgeData.add(references.get(i).vertexIndex);
edgeData.add(references.get((i + 1) % references.size()).vertexIndex);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
System.err.println("Cannot load mesh data from: " + filename);
return new Mesh();
} }
return new Mesh(vertices, edgeData); return new Mesh(vertices, edgeData);
} }
private static Vector3 parseVertex(String data) {
String[] coords = data.split(" ");
double x = Double.parseDouble(coords[1]);
double y = Double.parseDouble(coords[2]);
double z = Double.parseDouble(coords[3]);
return new Vector3(x, y, z);
}
private static List<Integer> parseFace(String data) {
List<Integer> indices = new ArrayList<>();
String[] datas = data.split(" ");
for(int i = 1; i < datas.length; i++) {
indices.add(Integer.parseInt(datas[i].split("/")[0]) - 1);
}
return indices;
}
} }