summaryrefslogtreecommitdiffstats
path: root/logo/src/xlogo/kernel/perspective/ElementPolygon.java
diff options
context:
space:
mode:
authorMarko Živković <[email protected]>2014-06-11 10:10:33 +0000
committerMarko Živković <[email protected]>2014-06-11 10:10:33 +0000
commit1107aa0763e3d7554408c401d2a1dbed11a94c51 (patch)
tree7074264bc7b63f2ee5ee14a39458380fcce1904b /logo/src/xlogo/kernel/perspective/ElementPolygon.java
Add initial directories and files
git-svn-id: https://svn.code.sf.net/p/xlogo4schools/svn/trunk@1 3b0d7934-f7ef-4143-9606-b51f2e2281fd
Diffstat (limited to 'logo/src/xlogo/kernel/perspective/ElementPolygon.java')
-rw-r--r--logo/src/xlogo/kernel/perspective/ElementPolygon.java179
1 files changed, 179 insertions, 0 deletions
diff --git a/logo/src/xlogo/kernel/perspective/ElementPolygon.java b/logo/src/xlogo/kernel/perspective/ElementPolygon.java
new file mode 100644
index 0000000..d0aa85b
--- /dev/null
+++ b/logo/src/xlogo/kernel/perspective/ElementPolygon.java
@@ -0,0 +1,179 @@
+/* XLogo4Schools - A Logo Interpreter specialized for use in schools, based on XLogo by Lo�c Le Coq
+ * Copyright (C) 2013 Marko Zivkovic
+ *
+ * Contact Information: marko88zivkovic at gmail dot com
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details. You should have received a copy of the
+ * GNU General Public License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ *
+ * This Java source code belongs to XLogo4Schools, written by Marko Zivkovic
+ * during his Bachelor thesis at the computer science department of ETH Z�rich,
+ * in the year 2013 and/or during future work.
+ *
+ * It is a reengineered version of XLogo written by Lo�c Le Coq, published
+ * under the GPL License at http://xlogo.tuxfamily.org/
+ *
+ * Contents of this file were initially written by Lo�c Le Coq,
+ * modifications, extensions, refactorings might have been applied by Marko Zivkovic
+ */
+
+/**
+ * Title : XLogo
+ * Description : XLogo is an interpreter for the Logo
+ * programming language
+ *
+ * @author Loïc Le Coq
+ */
+package xlogo.kernel.perspective;
+
+import javax.media.j3d.Appearance;
+import javax.media.j3d.Material;
+import javax.media.j3d.PolygonAttributes;
+import javax.media.j3d.TriangleFanArray;
+import javax.vecmath.Point3d;
+import javax.media.j3d.Shape3D;
+import javax.vecmath.Vector3f;
+import javax.vecmath.Color3f;
+
+import xlogo.Logo;
+import xlogo.kernel.LogoError;
+
+/**
+ * This class represent A polygon surface in 3D mode
+ *
+ * @author loic
+ *
+ * @author Marko Zivkovic - I decoupled this from Application
+ */
+public class ElementPolygon extends Element3D
+{
+ public ElementPolygon(Viewer3D v3d)
+ {
+ super(v3d);
+ }
+
+ /**
+ * This method calculates all attributes for polygon and add it to the
+ * Polygon's list
+ */
+ public void addToScene() throws LogoError
+ {
+
+ if (vertex.size() < 3)
+ throw new LogoError(Logo.messages.getString("error.3d.3vertex"));
+
+ // Create normal vector
+
+ Point3d origine = vertex.get(0);
+ // System.out.println(" origine "+origine.x+" "+origine.y+" "+origine.z);
+
+ Point3d point1;
+ Vector3f vec1 = null;
+ Vector3f vec2 = null;
+ for (int i = 1; i < vertex.size(); i++)
+ {
+ point1 = vertex.get(i);
+ if (!point1.equals(origine))
+ {
+ // System.out.println(" point1 "+point1.x+" "+point1.y+" "+point1.z);
+ vec1 = new Vector3f((float) (point1.x - origine.x), (float) (point1.y - origine.y),
+ (float) (point1.z - origine.z));
+ break;
+ }
+ }
+ if (null == vec1)
+ throw new LogoError(Logo.messages.getString("error.3d.emptypolygon"));
+ for (int i = 2; i < vertex.size(); i++)
+ {
+ point1 = vertex.get(i);
+ // System.out.println(" point1 "+point1.x+" "+point1.y+" "+point1.z);
+ vec2 = new Vector3f((float) (point1.x - origine.x), (float) (point1.y - origine.y),
+ (float) (point1.z - origine.z));
+ if (vec1.dot(vec2) == 0)
+ vec2 = null;
+ else
+ {
+ // System.out.println(" vec1 "+vec1.x+" "+vec1.y+" "+vec1.z);
+ // System.out.println(" vec2 "+vec2.x+" "+vec2.y+" "+vec2.z);
+ vec2.cross(vec1, vec2);
+ vec2.normalize();
+ vec1 = new Vector3f(vec2);
+ vec1.negate();
+ // System.out.println("Après"+" vec1 "+vec1.x+" "+vec1.y+" "+vec1.z);
+ // System.out.println("Après"+" vec2 "+vec2.x+" "+vec2.y+" "+vec2.z);
+ // if (vec1.x!=0&& vec1.y!=0&& vec1.z!=0)
+ // System.out.println("coucou"+" vec1 "+vec1.x+" "+vec1.y+" "+vec1.z);
+ break;
+ }
+ if (null == vec2)
+ throw new LogoError(Logo.messages.getString("error.3d.emptypolygon"));
+ }
+
+ // Create Geometry
+
+ int[] tab = new int[1];
+ tab[0] = vertex.size();
+ TriangleFanArray tfa = new TriangleFanArray(vertex.size(), TriangleFanArray.COORDINATES
+ | TriangleFanArray.COLOR_3 | TriangleFanArray.NORMALS, tab);
+ // TriangleFanArray tfa2=new
+ // TriangleFanArray(vertex.size(),TriangleFanArray.COORDINATES|TriangleFanArray.COLOR_3|TriangleFanArray.NORMALS,tab);
+ for (int i = 0; i < vertex.size(); i++)
+ {
+
+ tfa.setCoordinate(i, vertex.get(i));
+ // tfa2.setCoordinate(i, vertex.get(vertex.size()-1-i));
+
+ tfa.setColor(i, new Color3f(color.get(i)));
+ // tfa2.setColor(i, new Color3f(color.get(color.size()-i-1)));
+
+ tfa.setNormal(i, vec2);
+ // tfa2.setNormal(i, vec1);
+
+ }
+
+ Shape3D s = new Shape3D(tfa);
+ Appearance appear = new Appearance();
+ Material mat = new Material(new Color3f(1.0f, 1.0f, 1.0f), new Color3f(0.0f, 0f, 0f), new Color3f(1f, 1.0f,
+ 1.0f), new Color3f(1f, 1f, 1f), 64);
+ appear.setMaterial(mat);
+ PolygonAttributes pa = new PolygonAttributes();
+ pa.setCullFace(PolygonAttributes.CULL_NONE);
+ pa.setBackFaceNormalFlip(true);
+ appear.setPolygonAttributes(pa);
+
+ s.setAppearance(appear);
+ v3d.add3DObject(s);
+ // DrawPanel.listPoly.add(s);
+ // DrawPanel.listPoly.add(new Shape3D(tfa2));
+ // System.out.println(DrawPanel.listPoly.size()+" "+vertex.get(i).x+" "+vertex.get(i).y+" "+vertex.get(i).z);
+ }
+
+ public boolean isPoint()
+ {
+ return false;
+ }
+
+ public boolean isPolygon()
+ {
+ return true;
+ }
+
+ public boolean isLine()
+ {
+ return false;
+ }
+
+ public boolean isText()
+ {
+ return false;
+ }
+}