1 package org.simantics.g3d.shape;
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
6 import javax.vecmath.Quat4d;
\r
7 import javax.vecmath.Vector3d;
\r
9 import org.simantics.g3d.math.MathTools;
\r
12 private List<Vector3d> vertices;
\r
13 private List<Vector3d> normals;
\r
14 private List<Color4d> colors;
\r
15 private List<Integer> indices;
\r
18 public Mesh(List<Vector3d> vertices, List<Vector3d> normals,
\r
19 List<Color4d> colors, List<Integer> indices) {
\r
20 this.vertices = vertices;
\r
21 this.normals = normals;
\r
22 this.colors = colors;
\r
23 this.indices = indices;
\r
26 public Mesh(List<Vector3d> vertices, List<Vector3d> normals, List<Integer> indices) {
\r
27 this.vertices = vertices;
\r
28 this.normals = normals;
\r
29 this.indices = indices;
\r
32 public Mesh(List<Vector3d> vertices, List<Integer> indices) {
\r
33 this.vertices = vertices;
\r
34 this.indices = indices;
\r
37 public List<Vector3d> getVertices() {
\r
41 public List<Vector3d> getNormals() {
\r
45 public List<Integer> getIndices() {
\r
49 public List<Color4d> getColors() {
\r
53 public void createNormals() {
\r
54 normals = new ArrayList<Vector3d>(vertices.size());
\r
55 for (int i = 0; i < vertices.size(); i++) {
\r
56 normals.add(new Vector3d());
\r
58 Vector3d v1 = new Vector3d();
\r
59 Vector3d v2 = new Vector3d();
\r
60 Vector3d v3 = new Vector3d();
\r
61 Vector3d t1 = new Vector3d();
\r
62 Vector3d t2 = new Vector3d();
\r
63 Vector3d n = new Vector3d();
\r
64 for (int i = 0; i < indices.size(); i+=3) {
\r
65 v1.set(vertices.get(i));
\r
66 v2.set(vertices.get(i+1));
\r
67 v3.set(vertices.get(i+2));
\r
71 normals.get(i).add(n);
\r
72 normals.get(i+1).add(n);
\r
73 normals.get(i+2).add(n);
\r
75 for (int i = 0; i < normals.size(); i++) {
\r
76 normals.get(i).normalize();
\r
80 public void translate(Vector3d v) {
\r
81 for (int i = 0; i < vertices.size(); i++) {
\r
82 vertices.get(i).add(v);
\r
86 public void rotate(Quat4d q) {
\r
87 Vector3d t = new Vector3d();
\r
88 for (int i = 0; i < vertices.size(); i++) {
\r
89 MathTools.rotate(q, vertices.get(i), t);
\r
90 vertices.get(i).set(t);
\r
93 if (normals != null) {
\r
94 for (int i = 0; i < normals.size(); i++) {
\r
95 MathTools.rotate(q, normals.get(i), t);
\r
97 normals.get(i).set(t);
\r
102 public void setColor(Color4d color) {
\r
103 colors = new ArrayList<Color4d>(vertices.size());
\r
104 for (int i = 0; i < vertices.size(); i++) {
\r
109 public void add(Mesh mesh) {
\r
110 int vindex = vertices.size();
\r
111 int triIndex = indices.size();
\r
112 vertices.addAll(mesh.getVertices());
\r
113 indices.addAll(mesh.indices);
\r
114 for (int i = triIndex; i < indices.size(); i++) {
\r
115 indices.set(i, indices.get(i)+vindex);
\r
117 if (normals != null) {
\r
118 boolean hasNormals = true;
\r
119 if (mesh.getNormals() == null) {
\r
120 mesh.createNormals();
\r
121 hasNormals = false;
\r
123 normals.addAll(mesh.getNormals());
\r
125 mesh.normals = null;
\r
127 if (colors != null) {
\r
128 if (mesh.getColors() != null) {
\r
129 colors.addAll(mesh.getColors());
\r
131 for (int i = 0; i < mesh.getVertices().size(); i++) {
\r
132 colors.add(new Color4d(1,1,1,0));
\r