2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2012 - Scilab Enterprises - Calixte Denizet
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12 package org.scilab.forge.scirenderer.implementation.g2d.motor;
14 import java.awt.Graphics2D;
15 import java.util.ArrayList;
16 import java.util.Comparator;
17 import java.util.HashSet;
18 import java.util.List;
20 import java.util.Stack;
21 import java.util.TreeSet;
23 import org.scilab.forge.scirenderer.clipping.ClippingPlane;
27 private static Set<Scene> faces2d = new TreeSet<Scene>(new Comparator<Scene>() {
28 public int compare(Scene o1, Scene o2) {
29 if (o1.object.vertices[0].getZ() == o2.object.vertices[0].getZ()) {
30 return o1.object.getPrecedence() - o2.object.getPrecedence();
33 return (int) Math.signum(o2.object.vertices[0].getZ() - o1.object.vertices[0].getZ());
36 public boolean equals(Object obj) {
41 private static List<Scene> faces = new ArrayList<Scene>();
42 private static List<Scene> disabledFaces = new ArrayList<Scene>();
43 private static List<ClippingPlane> clippingPlanes;
44 private static Stack<Scene> stack = new Stack<Scene>();;
46 private List<Scene> behind;
47 private List<Scene> onfront;
48 private ConvexObject object;
49 private boolean drawn;
51 private Scene(final ConvexObject object) {
55 public static final void setClippingPlanes(final List<ClippingPlane> clippingPlanes) {
56 Scene.clippingPlanes = clippingPlanes;
59 private static final List<ConvexObject> breakOnClippingPlane(ConvexObject o) {
60 List<ConvexObject> list = new ArrayList<ConvexObject>();
61 List<ConvexObject> tmp = new ArrayList<ConvexObject>();
63 if (clippingPlanes != null) {
64 for (ClippingPlane clip : clippingPlanes) {
65 if (clip.isEnable()) {
67 for (ConvexObject co : list) {
68 List<ConvexObject> l = co.breakObject(clip.getEquation());
84 static final void addToRoot(final boolean is2D, final ConvexObject co) {
85 List<ConvexObject> broken = breakOnClippingPlane(co);
86 for (ConvexObject object : broken) {
91 private static final void add(final boolean is2D, final ConvexObject object) {
92 synchronized (faces) {
93 Scene st = new Scene(object);
97 Set<Scene> toRemove = new HashSet<Scene>();
98 List<ConvexObject> toAdd = null;
100 for (Scene face : faces) {
101 if (face.object instanceof Triangle && object instanceof Segment) {
102 if (((Triangle) face.object).addSegment((Segment) object)) {
108 } else if (object instanceof Triangle && face.object instanceof Segment) {
109 if (((Triangle) object).addSegment((Segment) face.object)) {
115 int r = face.object.isBehind(st.object);
118 // object is behind face.object
120 addOnFront(st, face);
121 } else if (r == -1) {
122 // face.object is behind object
124 addOnFront(face, st);
127 toAdd = face.object.breakObject(st.object);
128 if (toAdd != null && !toAdd.isEmpty()) {
142 for (Scene s : toRemove) {
144 if (s.onfront != null) {
145 for (Scene ss : s.onfront) {
151 for (ConvexObject co : toAdd) {
160 static final void clearDepth() {
161 disabledFaces.addAll(faces);
162 disabledFaces.addAll(faces2d);
167 static final void drawRoot(final Graphics2D g2d) {
168 synchronized (faces) {
169 for (Scene face : disabledFaces) {
173 for (Scene face : disabledFaces) {
177 for (Scene face : faces) {
181 for (Scene face : faces2d) {
185 // code to help debug
186 /*for (Scene face : faces) {
190 for (Scene face : faces) {
191 if (face.object.marked) {
192 face.object.draw(g2d);
198 static final void clear() {
199 disabledFaces.clear();
205 static final void clearAll() {
207 clippingPlanes.clear();
210 private final void draw(final Graphics2D g2d) {
211 if (stack.contains(this)) {
212 this.object.addArea(stack.peek().object);
218 if (behind != null && !behind.isEmpty()) {
219 for (Scene face : behind) {
228 private static final void addBehind(Scene face, Scene s) {
229 if (face.behind == null) {
230 face.behind = new ArrayList<Scene>();
235 private static final void addOnFront(Scene face, Scene s) {
236 if (face.onfront == null) {
237 face.onfront = new ArrayList<Scene>();