11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javafx.scene.shape;
27
28 import com.sun.javafx.geom.BaseBounds;
29 import com.sun.javafx.geom.BoxBounds;
30 import com.sun.javafx.geom.transform.BaseTransform;
31 import com.sun.javafx.jmx.MXNodeAlgorithm;
32 import com.sun.javafx.jmx.MXNodeAlgorithmContext;
33 import com.sun.javafx.scene.DirtyBits;
34 import com.sun.javafx.scene.NodeHelper;
35 import com.sun.javafx.scene.paint.MaterialHelper;
36 import com.sun.javafx.scene.shape.Shape3DHelper;
37 import com.sun.javafx.sg.prism.NGShape3D;
38 import javafx.application.ConditionalFeature;
39 import javafx.application.Platform;
40 import javafx.beans.property.ObjectProperty;
41 import javafx.beans.property.SimpleObjectProperty;
42 import javafx.beans.value.ChangeListener;
43 import javafx.beans.value.ObservableValue;
44 import javafx.beans.value.WeakChangeListener;
45 import javafx.scene.Node;
46 import javafx.scene.paint.Material;
47 import javafx.scene.paint.PhongMaterial;
48 import sun.util.logging.PlatformLogger;
49
50
51 /**
52 * The {@code Shape3D} base class provides definitions of common properties for
73 public abstract class Shape3D extends Node {
74 static {
75 // This is used by classes in different packages to get access to
76 // private and package private methods.
77 Shape3DHelper.setShape3DAccessor(new Shape3DHelper.Shape3DAccessor() {
78 @Override
79 public void doUpdatePeer(Node node) {
80 ((Shape3D) node).doUpdatePeer();
81 }
82
83 @Override
84 public BaseBounds doComputeGeomBounds(Node node,
85 BaseBounds bounds, BaseTransform tx) {
86 return ((Shape3D) node).doComputeGeomBounds(bounds, tx);
87 }
88
89 @Override
90 public boolean doComputeContains(Node node, double localX, double localY) {
91 return ((Shape3D) node).doComputeContains(localX, localY);
92 }
93
94 @Override
95 public Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
96 return ((Shape3D) node).doProcessMXNode(alg, ctx);
97 }
98 });
99 }
100
101 // NOTE: Need a way to specify shape tessellation resolution, may use metric relate to window resolution
102 // Will not support dynamic refinement in FX8
103
104 // TODO: 3D - May provide user convenient utility to compose images in a single image for shapes such as Box or Cylinder
105
106 private static final PhongMaterial DEFAULT_MATERIAL = new PhongMaterial();
107
108 protected Shape3D() {
109 if (!Platform.isSupported(ConditionalFeature.SCENE3D)) {
110 String logname = Shape3D.class.getName();
111 PlatformLogger.getLogger(logname).warning("System can't support "
112 + "ConditionalFeature.SCENE3D");
113 }
114 }
115
116 PredefinedMeshManager manager = PredefinedMeshManager.getInstance();
117 int key = 0;
240 private boolean doComputeContains(double localX, double localY) {
241 return false;
242 }
243
244 /*
245 * Note: This method MUST only be called via its accessor method.
246 */
247 private void doUpdatePeer() {
248 final NGShape3D peer = NodeHelper.getPeer(this);
249 if (NodeHelper.isDirty(this, DirtyBits.MATERIAL)) {
250 Material mat = getMaterial() == null ? DEFAULT_MATERIAL : getMaterial();
251 MaterialHelper.updatePG(mat); // new material should be updated
252 peer.setMaterial(MaterialHelper.getNGMaterial(mat));
253 }
254 if (NodeHelper.isDirty(this, DirtyBits.NODE_DRAWMODE)) {
255 peer.setDrawMode(getDrawMode() == null ? DrawMode.FILL : getDrawMode());
256 }
257 if (NodeHelper.isDirty(this, DirtyBits.NODE_CULLFACE)) {
258 peer.setCullFace(getCullFace() == null ? CullFace.BACK : getCullFace());
259 }
260 }
261
262 /*
263 * Note: This method MUST only be called via its accessor method.
264 */
265 private Object doProcessMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
266 throw new UnsupportedOperationException("Not supported yet.");
267 }
268
269 }
|
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javafx.scene.shape;
27
28 import com.sun.javafx.geom.BaseBounds;
29 import com.sun.javafx.geom.BoxBounds;
30 import com.sun.javafx.geom.transform.BaseTransform;
31 import com.sun.javafx.scene.DirtyBits;
32 import com.sun.javafx.scene.NodeHelper;
33 import com.sun.javafx.scene.paint.MaterialHelper;
34 import com.sun.javafx.scene.shape.Shape3DHelper;
35 import com.sun.javafx.sg.prism.NGShape3D;
36 import javafx.application.ConditionalFeature;
37 import javafx.application.Platform;
38 import javafx.beans.property.ObjectProperty;
39 import javafx.beans.property.SimpleObjectProperty;
40 import javafx.beans.value.ChangeListener;
41 import javafx.beans.value.ObservableValue;
42 import javafx.beans.value.WeakChangeListener;
43 import javafx.scene.Node;
44 import javafx.scene.paint.Material;
45 import javafx.scene.paint.PhongMaterial;
46 import sun.util.logging.PlatformLogger;
47
48
49 /**
50 * The {@code Shape3D} base class provides definitions of common properties for
71 public abstract class Shape3D extends Node {
72 static {
73 // This is used by classes in different packages to get access to
74 // private and package private methods.
75 Shape3DHelper.setShape3DAccessor(new Shape3DHelper.Shape3DAccessor() {
76 @Override
77 public void doUpdatePeer(Node node) {
78 ((Shape3D) node).doUpdatePeer();
79 }
80
81 @Override
82 public BaseBounds doComputeGeomBounds(Node node,
83 BaseBounds bounds, BaseTransform tx) {
84 return ((Shape3D) node).doComputeGeomBounds(bounds, tx);
85 }
86
87 @Override
88 public boolean doComputeContains(Node node, double localX, double localY) {
89 return ((Shape3D) node).doComputeContains(localX, localY);
90 }
91 });
92 }
93
94 // NOTE: Need a way to specify shape tessellation resolution, may use metric relate to window resolution
95 // Will not support dynamic refinement in FX8
96
97 // TODO: 3D - May provide user convenient utility to compose images in a single image for shapes such as Box or Cylinder
98
99 private static final PhongMaterial DEFAULT_MATERIAL = new PhongMaterial();
100
101 protected Shape3D() {
102 if (!Platform.isSupported(ConditionalFeature.SCENE3D)) {
103 String logname = Shape3D.class.getName();
104 PlatformLogger.getLogger(logname).warning("System can't support "
105 + "ConditionalFeature.SCENE3D");
106 }
107 }
108
109 PredefinedMeshManager manager = PredefinedMeshManager.getInstance();
110 int key = 0;
233 private boolean doComputeContains(double localX, double localY) {
234 return false;
235 }
236
237 /*
238 * Note: This method MUST only be called via its accessor method.
239 */
240 private void doUpdatePeer() {
241 final NGShape3D peer = NodeHelper.getPeer(this);
242 if (NodeHelper.isDirty(this, DirtyBits.MATERIAL)) {
243 Material mat = getMaterial() == null ? DEFAULT_MATERIAL : getMaterial();
244 MaterialHelper.updatePG(mat); // new material should be updated
245 peer.setMaterial(MaterialHelper.getNGMaterial(mat));
246 }
247 if (NodeHelper.isDirty(this, DirtyBits.NODE_DRAWMODE)) {
248 peer.setDrawMode(getDrawMode() == null ? DrawMode.FILL : getDrawMode());
249 }
250 if (NodeHelper.isDirty(this, DirtyBits.NODE_CULLFACE)) {
251 peer.setCullFace(getCullFace() == null ? CullFace.BACK : getCullFace());
252 }
253 }
254
255 }
|