From efe141b74d98662b3395fb563a3ef23f00196387 Mon Sep 17 00:00:00 2001
From: Matej Lukes <456316@mail.muni.cz>
Date: Tue, 8 Oct 2019 21:58:17 +0200
Subject: [PATCH] Mesh core implemented

---
 MeshModel/MeshModel.iml                       | 16 +++++++
 MeshModel/pom.xml                             |  5 +++
 .../analyst/mesh/core/MeshComponent.java      | 24 ++++++++++
 .../analyst/mesh/core/MeshComposite.java      | 23 ++++++++++
 .../fidentis/analyst/mesh/core/MeshEdge.java  | 25 +++++++++++
 .../fidentis/analyst/mesh/core/MeshFace.java  | 11 +++++
 .../fidentis/analyst/mesh/core/MeshFacet.java | 35 +++++++++++++++
 .../fidentis/analyst/mesh/core/MeshLeaf.java  | 16 +++++++
 .../fidentis/analyst/mesh/core/MeshModel.java | 23 ++++++++++
 .../fidentis/analyst/mesh/core/MeshPoint.java | 44 +++++++++++++++++++
 10 files changed, 222 insertions(+)
 create mode 100644 MeshModel/MeshModel.iml
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComponent.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComposite.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshEdge.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFace.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFacet.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshLeaf.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshModel.java
 create mode 100644 MeshModel/src/cz/fidentis/analyst/mesh/core/MeshPoint.java

diff --git a/MeshModel/MeshModel.iml b/MeshModel/MeshModel.iml
new file mode 100644
index 00000000..48fef1a2
--- /dev/null
+++ b/MeshModel/MeshModel.iml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: org.netbeans.api:org-netbeans-api-annotations-common:RELEASE82" level="project" />
+    <orderEntry type="library" name="Maven: javax.vecmath:vecmath:1.5.2" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/MeshModel/pom.xml b/MeshModel/pom.xml
index d33c523b..3b8f6136 100644
--- a/MeshModel/pom.xml
+++ b/MeshModel/pom.xml
@@ -33,6 +33,11 @@
             <artifactId>org-netbeans-api-annotations-common</artifactId>
             <version>${netbeans.version}</version>
         </dependency>
+        <dependency>
+            <groupId>javax.vecmath</groupId>
+            <artifactId>vecmath</artifactId>
+            <version>1.5.2</version>
+        </dependency>
     </dependencies>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComponent.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComponent.java
new file mode 100644
index 00000000..4085b5d3
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComponent.java
@@ -0,0 +1,24 @@
+package cz.fidentis.analyst.mesh.core;
+
+import java.util.List;
+
+public abstract class MeshComponent {
+    private List<MeshComponent> parents;
+
+
+    public List<MeshComponent> getParents(){
+        return parents;
+    }
+
+    public abstract List<MeshComponent> getChildren();
+
+    public boolean addParent(MeshComponent newParent){
+        if (parents.contains(newParent))
+            return false;
+        parents.add(newParent);
+        return true;
+    }
+
+    public abstract boolean addChild(MeshComponent newChild);
+
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComposite.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComposite.java
new file mode 100644
index 00000000..45905516
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshComposite.java
@@ -0,0 +1,23 @@
+package cz.fidentis.analyst.mesh.core;
+
+import java.util.List;
+
+public class MeshComposite extends MeshComponent {
+    private List<MeshComponent> children;
+
+
+    @Override
+    public List<MeshComponent> getChildren() {
+        return children;
+    }
+
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        if (children.contains(newChild))
+            return false;
+
+        children.add(newChild);
+        newChild.addParent(this);
+        return true;
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshEdge.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshEdge.java
new file mode 100644
index 00000000..ca33096e
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshEdge.java
@@ -0,0 +1,25 @@
+package cz.fidentis.analyst.mesh.core;
+
+public class MeshEdge extends MeshComposite {
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        if (!(newChild instanceof MeshPoint))
+            return false;
+
+        return super.addChild(newChild);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof MeshEdge))
+            return false;
+
+        for (MeshComponent component:
+                this.getChildren()) {
+            if(!((MeshEdge) obj).getChildren().contains(component))
+                return false;
+        }
+
+        return true;
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFace.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFace.java
new file mode 100644
index 00000000..fbe10474
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFace.java
@@ -0,0 +1,11 @@
+package cz.fidentis.analyst.mesh.core;
+
+public class MeshFace extends MeshComposite {
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        if (!(newChild instanceof MeshEdge))
+            return false;
+
+        return super.addChild(newChild);
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFacet.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFacet.java
new file mode 100644
index 00000000..4cd6c238
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshFacet.java
@@ -0,0 +1,35 @@
+package cz.fidentis.analyst.mesh.core;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MeshFacet extends MeshComposite {
+
+    Map<MeshPoint, MeshPoint> pointPool = new HashMap<>();
+    Map<MeshEdge, MeshEdge> edgePool = new HashMap<>();
+
+    public MeshPoint getPoint(MeshPoint point) {
+        MeshPoint result = pointPool.get(point);
+        if (result == null) {
+            pointPool.put(point, point);
+        }
+        return result;
+    }
+
+    public MeshEdge getEdge(MeshEdge edge) {
+        MeshEdge result = edgePool.get(edge);
+        if (result == null) {
+            edgePool.put(edge, edge);
+        }
+        return result;
+    }
+
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        if (!(newChild instanceof MeshFace))
+            return false;
+
+        return super.addChild(newChild);
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshLeaf.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshLeaf.java
new file mode 100644
index 00000000..d080acb9
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshLeaf.java
@@ -0,0 +1,16 @@
+package cz.fidentis.analyst.mesh.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MeshLeaf extends MeshComponent {
+    @Override
+    public List<MeshComponent> getChildren() {
+        return null;
+    }
+
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        return false;
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshModel.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshModel.java
new file mode 100644
index 00000000..4dcb9dbd
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshModel.java
@@ -0,0 +1,23 @@
+package cz.fidentis.analyst.mesh.core;
+
+import java.util.List;
+
+public class MeshModel extends MeshComposite {
+    @Override
+    public List<MeshComponent> getParents() {
+        return null;
+    }
+
+    @Override
+    public boolean addParent(MeshComponent newParent) {
+        return false;
+    }
+
+    @Override
+    public boolean addChild(MeshComponent newChild) {
+        if (!(newChild instanceof MeshFacet))
+            return false;
+
+        return super.addChild(newChild);
+    }
+}
diff --git a/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshPoint.java b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshPoint.java
new file mode 100644
index 00000000..41d62ea3
--- /dev/null
+++ b/MeshModel/src/cz/fidentis/analyst/mesh/core/MeshPoint.java
@@ -0,0 +1,44 @@
+package cz.fidentis.analyst.mesh.core;
+
+import javax.vecmath.Vector3d;
+import java.util.List;
+
+public class MeshPoint extends MeshLeaf {
+    private Vector3d position, normal, texCoord;
+
+    public Vector3d getNormal() {
+        return normal;
+    }
+
+    public Vector3d getPosition() {
+        return position;
+    }
+
+    public Vector3d getTexCoord() {
+        return texCoord;
+    }
+
+    public void setNormal(Vector3d normal) {
+        this.normal = normal;
+    }
+
+    public void setPosition(Vector3d position) {
+        this.position = position;
+        position.normalize();
+    }
+
+    public void setTexCoord(Vector3d texCoord) {
+        this.texCoord = texCoord;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof MeshPoint))
+            return false;
+
+        MeshPoint meshPointObj = (MeshPoint) obj;
+        return this.position == meshPointObj.position
+                && this.normal == meshPointObj.normal
+                && this.texCoord == meshPointObj.texCoord;
+    }
+}
-- 
GitLab