/**
* ControlFactory.java
*
* Copyright (c) 2013-2016, F(X)yz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of F(X)yz, any associated website, nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL F(X)yz BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.fxyz3d.controls.factory;
import java.util.Arrays;
import java.util.Collection;
import java.util.function.Function;
import javafx.beans.property.Property;
import javafx.beans.property.StringProperty;
import javafx.geometry.Point2D;
import javafx.scene.paint.Color;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.text.Font;
import org.fxyz3d.controls.CheckBoxControl;
import org.fxyz3d.controls.ColorPickControl;
import org.fxyz3d.controls.ColorSliderControl;
import org.fxyz3d.controls.ComboBoxControl;
import org.fxyz3d.controls.ControlCategory;
import org.fxyz3d.controls.ControlPanel;
import org.fxyz3d.controls.ImagePreviewControl;
import org.fxyz3d.controls.LightingControls;
import org.fxyz3d.controls.NumberSliderControl;
import org.fxyz3d.controls.ScriptFunction1DControl;
import org.fxyz3d.controls.ScriptFunction2DControl;
import org.fxyz3d.controls.ScriptFunction3DControl;
import org.fxyz3d.controls.SectionLabel;
import org.fxyz3d.controls.TextFieldControl;
import org.fxyz3d.controls.TextureImage;
import org.fxyz3d.controls.TextureTypeControl;
import org.fxyz3d.geometry.Point3D;
import org.fxyz3d.scene.paint.Patterns;
import org.fxyz3d.scene.paint.Patterns.CarbonPatterns;
import org.fxyz3d.shapes.primitives.helper.TriangleMeshHelper.SectionType;
import org.fxyz3d.shapes.primitives.helper.TriangleMeshHelper.TextureType;
/**
*
* @author Jason Pollastrini aka jdub1581
*/
public final class ControlFactory {
public static final ControlPanel buildSingleListControlPanel(){
return new ControlPanel();
}
public static final ControlPanel buildControlPanel(final ControlCategory titlePane) {
return new ControlPanel(titlePane);
}
public static final ControlPanel buildControlPanel(final ControlCategory... titlePane) {
ControlPanel panel = new ControlPanel(titlePane[0]);
for (int i = 1; i < titlePane.length; i++) {
panel.getPanes().add(titlePane[i]);
}
return panel;
}
public static final ControlCategory buildCategory(final String title) {
return new ControlCategory(title);
}
/*==========================================================================
Standard Control Types
==========================================================================*/
public static final TextFieldControl buildTextFieldControl(final String title, final StringProperty p) {
return new TextFieldControl(title, p);
}
public static final CheckBoxControl buildCheckBoxControl(final Property<Boolean> p) {
return new CheckBoxControl(p);
}
public static final NumberSliderControl buildNumberSlider(final Property<Number> p, final Number lb, final Number ub) {
return new NumberSliderControl(p, lb, ub);
}
public static final ColorSliderControl buildColorSliderControl(final Property<Number> p, final Number lb, final Number ub) {
return new ColorSliderControl(p, lb, ub);
}
public static final ColorPickControl buildColorControl(final Property<Color> p, String name) {
return new ColorPickControl(p, name);
}
public static final ImagePreviewControl buildImageViewToggle(final Property<TextureImage> img, String name, final Collection<TextureImage> imgs) {
return new ImagePreviewControl(img, name, imgs);
}
/*==========================================================================
List like Items
==========================================================================*/
public static final ComboBoxControl buildCullFaceControl(final Property<CullFace> p) {
return new ComboBoxControl("Cull Face: ", p, Arrays.asList(CullFace.values()), false);
}
public static final ComboBoxControl<DrawMode> buildDrawModeControl(final Property<DrawMode> dmp) {
return new ComboBoxControl<>("Draw Mode: ", dmp, Arrays.asList(DrawMode.values()), false);
}
public static final ComboBoxControl<String> buildFontControl(final Property<String> font) {
return new ComboBoxControl<>("Font Family: ", font, Font.getFontNames(), false);
}
public static final TextureTypeControl buildTextureTypeControl(
final Property<TextureType> p,
final Property<Number> clrs,
final Property<TextureImage> imgP,
final Property<Boolean> bmpMap,
final Property<Number> bmpScale,
final Property<Number> bmpFineScale,
final Property<Boolean> invBmp,
final Property<CarbonPatterns> patt, final Property<Number> pScale,
final Property<Number> spColor,
final Property<Number> specP,
final Property<Function<Point3D, Number>> densFunc,
final Property<Function<Number, Number>> funcFunc) {
return new TextureTypeControl("Texture Type:",
p,
Arrays.asList(TextureType.values()),
clrs,
imgP,
bmpMap,
bmpScale,
bmpFineScale,
invBmp,
patt,
pScale,
spColor,
specP,
densFunc,
funcFunc);
}
public static final ComboBoxControl buildPatternChooser(final Property<CarbonPatterns> p) {
return new ComboBoxControl("Carbon Patterns: ", p, Arrays.asList(CarbonPatterns.values()), false);
}
public static final ComboBoxControl<SectionType> buildSectionTypeControl(final Property<SectionType> p) {
return new ComboBoxControl<>("Section Type", p, Arrays.asList(SectionType.values()), false);
}
public static final ScriptFunction3DControl buildScriptFunction3DControl(final Property<Function<Point3D,Number>> p) {
return new ScriptFunction3DControl(p, Arrays.asList("Math.sin(p.x)", "p.y", "p.z", "p.x + p.y", "p.x + p.z", "p.f", "p.magnitude()"), false);
}
public static final ScriptFunction2DControl buildScriptFunction2DControl(final Property<Function<Point2D,Number>> p) {
return new ScriptFunction2DControl(p, Arrays.asList("Math.sin(p.magnitude())/p.magnitude()", "p.x", "p.y", "p.x*3+p.y*p.y", "p.magnitude()"), false);
}
public static final ScriptFunction1DControl buildScriptFunction1DControl(final Property<Function<Number,Number>> p) {
return new ScriptFunction1DControl(p, Arrays.asList("Math.sin(x)", "x*x", "x+3", "Math.pow(Math.abs(x),1/2.5)"), false);
}
/*==========================================================================
Standard Controls for MeshView
==========================================================================*/
/*
builds the complete ControlCategory, shared by all MeshViews
DrawMode, CullFace, DiffuseColor, SpecularColor
*/
public static ControlCategory buildMeshViewCategory(final Property<DrawMode> dmp, final Property<CullFace> cfp
) {
ControlCategory mvc = new ControlCategory("Standard MeshView Properties");
mvc.addControls(
new SectionLabel("MeshView Properties"),
buildDrawModeControl(dmp),
buildCullFaceControl(cfp)
);
return mvc;
}
/*
*/
public static ControlCategory buildTextureMeshCategory(
final Property<TextureType> ttp,
final Property<Number> cp,
final Property<SectionType> stp,
final Property<TextureImage> imgP,
final Property<Boolean> bmpMap,
final Property<Number> bmpScale,
final Property<Number> bmpFineScale,
final Property<Boolean> invBmp,
final Property<Patterns.CarbonPatterns> patt,
final Property<Number> pScale,
final Property<Number> spColor,
final Property<Number> specP,
final Property<Function<Point3D, Number>> densFunc,
final Property<Function<Number, Number>> funcFunc
) {
final TextureTypeControl texType = buildTextureTypeControl(
ttp, cp, imgP, bmpMap, bmpScale, bmpFineScale, invBmp, patt, pScale, spColor, specP, densFunc, funcFunc);
final ControlCategory mvc = new ControlCategory("TexturedMesh Properties");
mvc.addControls(
new SectionLabel("Textured Mesh Properties"),
texType
);
if (stp != null) {
mvc.addControls(buildSectionTypeControl(stp));
}
return mvc;
}
public static ControlCategory buildSceneAndLightCategory(
final Property<Boolean> show,
final Property<Boolean> lt1On, final Property<Boolean> lt2On,
final Property<Color> c1, final Property<Color> c2,
final Property<Number> d1, final Property<Number> d2,
final Property<Number> r1, final Property<Number> r2,
final Property<javafx.geometry.Point3D> ra1, final Property<javafx.geometry.Point3D> ra2
) {
final LightingControls lighting1 = new LightingControls(
show,
lt1On,
c1,
d1,
r1,
ra1
);
final LightingControls lighting2= new LightingControls(
show,
lt2On,
c2,
d2,
r2,
ra2
);
final ControlCategory mvc = new ControlCategory("Scene Lighting");
mvc.addControls(new SectionLabel("Light 1"),
lighting1,
new SectionLabel("Light 2"),
lighting2,
new CheckBoxControl(show));
return mvc;
}
/*
Build a Category for the four Image maps available to PhongMaterial
*/
static class PropertyParser{
static void parseProperties(Property ... props){
//Arrays.stream(props);
}
}
}