import java.awt.Color;
import org.sunflow.SunflowAPI;
import org.sunflow.core.Display;
import org.sunflow.core.ParameterList.FloatParameter;
import org.sunflow.core.display.FileDisplay;
import org.sunflow.math.Matrix4;
import org.sunflow.math.Point3;
import org.sunflow.math.Vector3;
public class SunflowAPIAPI {
private String currShader;
private String currModifier;
private String currCamera;
private String currBucketOrder;
private String currFilter;
private String cameraType;
private String modifierType;
private SunflowAPI sunflow;
private Display windowDisplay;
private FileDisplay fileDisplay;
public final String SHADER_AMBIENT_OCCLUSION = "ambient_occlusion";
public final String SHADER_TEXTURED_AMBIENT_OCCLUSION = "textured_ambient_occlusion";
public final String SHADER_CONSTANT = "constant";
public final String SHADER_DIFFUSE = "diffuse";
public final String SHADER_TEXTURED_DIFFUSE = "textured_diffuse";
public final String SHADER_GLASS = "glass";
public final String SHADER_MIRROR = "mirror";
public final String SHADER_PHONG = "phong";
public final String SHADER_TEXTURED_PHONG = "textured_phong";
public final String SHADER_SHINY_DIFFUSE = "shiny_diffuse";
public final String SHADER_TEXTURED_SHINY_DIFFUSE = "textured_shiny_diffuse";
public final String SHADER_UBER = "uber";
public final String SHADER_WARD = "ward";
public final String SHADER_TEXTURED_WARD = "textured_ward";
public final String SHADER_WIREFRAME = "wireframe";
public final String COLORSPACE_SRGB_NONLINEAR = "sRGB nonlinear";
public final String COLORSPACE_SRGB_LINEAR = "sRGB linear";
public final String COLORSPACE_XYZ = "XYZ";
private String colorSpace = COLORSPACE_SRGB_NONLINEAR;
public final String CAMERA_PINHOLE = "pinhole";
public final String CAMERA_THINLENS = "thinlens";
public final String CAMERA_FISHEYE = "fisheye";
public final String CAMERA_SPHERICAL = "spherical";
public final String GI_AMBIENT_OCCLUSION = "ambocc";
public final String GI_FAKE = "fake";
public final String GI_INSTANT_GI = "igi";
public final String GI_IRRADIANCE_CACHE = "irr-cache";
public final String GI_PATH = "path";
public final String LIGHT_DIRECTIONAL = "directional";
public final String LIGHT_IMAGEBASED = "ibl";
public final String LIGHT_POINT = "point";
public final String LIGHT_SPHERE = "sphere";
public final String LIGHT_SUNSKY = "sunsky";
public final String LIGHT_MESH = "triangle_mesh";
public final String BUCKET_ORDER_COLUMN = "column";
public final String BUCKET_ORDER_DIAGONAL = "diagonal";
public final String BUCKET_ORDER_HILBERT = "hilbert";
public final String BUCKET_ORDER_RANDOM = "random";
public final String BUCKET_ORDER_ROW = "row";
public final String BUCKET_ORDER_SPIRAL = "spiral";
public final String FILTER_BLACKMAN_HARRIS = "blackman-harris";
public final String FILTER_BOX = "box";
public final String FILTER_CATMULL_ROM = "catmull-rom";
public final String FILTER_GAUSSIAN = "gaussian";
public final String FILTER_LANCZOS = "lanczos";
public final String FILTER_MITCHELL = "mitchell";
public final String FILTER_SINC = "sinc";
public final String FILTER_TRIANGLE = "triangle";
public final String FILTER_BSPLINE = "bspline";
public final String MODIFIER_BUMP_MAP = "bump_map";
public final String MODIFIER_NORMAL_MAP = "normal_map";
public final String MODIFIER_PERLIN_MAP = "perlin";
private Point3 eye;
private Point3 target;
private Vector3 up;
private int sides;
private float fov;
private float aspect;
private float shiftX;
private float shiftY;
private float focusDistance;
private float lensRadius;
private float lensRotation;
private int tileX;
private int tileY;
// modifier parameters
private int modifiercount = 0;
private boolean isModifiers = false;
private boolean useJitter = true;
private int aaMin = 1;
private int aaMax = 2;
private int previewAaMin = 0;
private int previewAaMax = 1;
private int width = 640;
private int height = 480;
public SunflowAPIAPI() {
sunflow = new SunflowAPI();
// set default values
// camera position
eye = new Point3(0, 10, 15);
target = new Point3(0, 0, 0);
up = new Vector3(0, 1, 0);
// camera default values
fov = 50;
aspect = width/height;
currCamera = "internal_defaultcamera";
focusDistance = 1;
lensRadius = 0;
fov = 90;
aspect = 1;
sides = 0;
lensRotation = 0;
// set camera
this.setThinlensCamera("internal_defaultcamera", fov, aspect);
// shader
this.setAmbientOcclusionShader("internal_defaultshader", new Color(1f,1f,1f), new Color(0f,0f,0f), 16, 5);
// bucket order
currBucketOrder = BUCKET_ORDER_SPIRAL;
// filter
currFilter = FILTER_MITCHELL;
}
/*
* --------------------------------------------------------------------------------------
* LIGHTS
*/
/**
* sets directional light
* @param name Individual name
* @param source light position
* @param direction light direction
* @param radius light radius
* @param color light color
*/
public void setDirectionalLight(String name, Point3 source, Vector3 direction, float radius, Color color) {
sunflow.parameter("source", source);
sunflow.parameter("dir", direction);
sunflow.parameter("radius", radius);
sunflow.parameter("radiance", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.light( name, LIGHT_DIRECTIONAL );
}
/**
* Sets Image based light
* @param name Individual name
* @param center Light position
* @param up ?
* @param samples Detail, the higher the slower and smoother
* @param lowSamples ?
* @param texture Path to texture file
*/
public void setImageBasedLight(String name, Vector3 center, Vector3 up, int samples, int lowSamples, String texture) {
sunflow.parameter("center", center);
sunflow.parameter("up", up);
sunflow.parameter("samples", samples);
sunflow.parameter("lowsamples",lowSamples);
sunflow.parameter("texture", texture);
sunflow.light( name, this.LIGHT_IMAGEBASED );
}
/**
* Sets point light
* @param name Individual name
* @param center Light position
* @param color light color
*/
public void setPointLight(String name, Point3 center, Color color) {
sunflow.parameter("center", center);
sunflow.parameter("power", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.light( name, this.LIGHT_POINT );
}
/**
* Sets sphere light
* @param name individual name
* @param center light position
* @param color light color
* @param samples Detail, the highe the smoother and slower
* @param radius light size
*/
public void setSphereLight(String name, Point3 center, Color color, int samples, float radius) {
sunflow.parameter("center", center);
sunflow.parameter("radiance", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("samples", samples);
sunflow.parameter("radius", radius);
sunflow.light( name, LIGHT_SPHERE );
}
/**
* sets sunsky light
* @param name Individual name
*/
public void setSunSkyLight(String name) {
sunflow.parameter( "up", new Vector3( 0, 0, 1 ) );
sunflow.parameter( "east", new Vector3( 0, 1, 0 ) );
sunflow.parameter( "sundir", new Vector3( 1, -1, 0.31f ) );
sunflow.parameter( "turbidity", 2f );
sunflow.parameter( "samples", 16 );
sunflow.light( name, this.LIGHT_SUNSKY );
}
/**
* sets sunsky light
* @param name Individual name
* @param up ? direction
* @param east ? direction
* @param direction light direction
* @param color light color
* @param samples Detail
* @param turbidity ?
* @param groundExtendSky ?
*/
public void setSunSkyLight(String name, Vector3 up, Vector3 east, Vector3 direction, Color color, int samples, float turbidity, boolean groundExtendSky) {
sunflow.parameter("up", up);
sunflow.parameter("east", east);
sunflow.parameter("sundir", direction);
sunflow.parameter("ground.color", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("samples", samples);
sunflow.parameter("turbidity", turbidity);
sunflow.parameter("ground.extendsky", groundExtendSky);
sunflow.light( name, this.LIGHT_SUNSKY );
}
/**
* sets mesh light
* @param name Individual name
* @param color light color
* @param samples Detail
* @param vertices Float array with coordinates (like [x0,y0,z0,x1,y1,z1,x2,y2,z2])
* @param triangles int array connecting the vertices (like [0,1,2])
*/
public void drawMeshLight(String name, Color color, int samples, float[] vertices, int[] triangles) {
sunflow.parameter("points", "point", "vertex", vertices);
sunflow.parameter("triangles", triangles);
sunflow.parameter("radiance", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("samples", samples);
sunflow.light( name, this.LIGHT_MESH);
}
/*
* END OF LIGHTS
* --------------------------------------------------------------------------------------
*/
/*
* --------------------------------------------------------------------------------------
* SHADER
*/
/**
* Sets Ambient Occlusion Shader
* @param name Individual Name
* @param bright Highlight Color
* @param dark Dark Color
* @param samples Detail, the higher the slower and smoother
* @param maxDist ?
*/
public void setAmbientOcclusionShader(String name, Color bright, Color dark, int samples, float maxDist) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("bright", colorSpace, bright.getRed()/(float)255, bright.getGreen()/(float)255, bright.getBlue()/(float)255);
sunflow.parameter("dark", colorSpace, dark.getRed()/(float)255, dark.getGreen()/(float)255, dark.getBlue()/(float)255);
sunflow.parameter("samples", samples);
sunflow.parameter("maxdist", maxDist);
// set shader
sunflow.shader(currShader, SHADER_AMBIENT_OCCLUSION);
}
/**
* Sets Ambient Occlusion Shader
* @param name Individual Name
* @param bright Highlight Color
* @param dark Dark Color
* @param samples Detail, the higher the slower and smoother
* @param maxDist ?
* @param texture Path to texture file
*/
public void setAmbientOcclusionShader(String name, Color bright, Color dark, int samples, float maxDist, String texture) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("bright", colorSpace, bright.getRed()/(float)255, bright.getGreen()/(float)255, bright.getBlue()/(float)255);
sunflow.parameter("dark", colorSpace, dark.getRed()/(float)255, dark.getGreen()/(float)255, dark.getBlue()/(float)255);
sunflow.parameter("samples", samples);
sunflow.parameter("maxdist", maxDist);
sunflow.parameter("texture", texture);
// set shader
sunflow.shader(currShader, SHADER_TEXTURED_AMBIENT_OCCLUSION);
}
/**
* Sets constant shader
* @param name Individual Name
* @param color Color
*/
public void setConstantShader(String name, Color color) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("color", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
// set shader
sunflow.shader(currShader, SHADER_CONSTANT);
}
/**
* Sets Diffuse Shader
* @param name Individial Name
* @param color Color
*/
public void setDiffuseShader(String name, Color color) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
// set shader
sunflow.shader(currShader, SHADER_DIFFUSE);
}
/**
* Sets Diffuse Shader
* @param name Individial Name
* @param color Color
* @param texture Path to texture file
*/
public void setDiffuseShader(String name, Color color, String texture) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("texture", texture);
// set shader
sunflow.shader(currShader, SHADER_TEXTURED_DIFFUSE);
}
/**
* Sets Glass Shader
* @param name Individual Name
* @param color Color
* @param eta ?
* @param absorptionDistance ?
* @param absorptionColor Color
*/
public void setGlassShader(String name, Color color, float eta, float absorptionDistance, Color absorptionColor) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("color", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("eta", eta);
sunflow.parameter("absorption.distance", absorptionDistance);
sunflow.parameter("absorption.color", colorSpace, absorptionColor.getRed()/(float)255, absorptionColor.getGreen()/(float)255, absorptionColor.getBlue()/(float)255);
// set shader
sunflow.shader(currShader, SHADER_GLASS);
}
/**
* Sets Mirror Shader
* @param name Individial Name
* @param color Color
*/
public void setMirrorShader(String name, Color color) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("color", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
// set shader
sunflow.shader(currShader, SHADER_MIRROR);
}
/**
* Sets Phong Shader
* @param name Individual Name
* @param diffuse Diffuse Color
* @param specular Specular Color
* @param power ?
* @param samples Detail, the higher the slower and smoother
*/
public void setPhongShader(String name, Color diffuse, Color specular, float power, int samples) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, diffuse.getRed()/(float)255, diffuse.getGreen()/(float)255, diffuse.getBlue()/(float)255);
sunflow.parameter("specular", colorSpace, specular.getRed()/(float)255, specular.getGreen()/(float)255, specular.getBlue()/(float)255);
sunflow.parameter("power", power);
sunflow.parameter("samples", samples);
// set shader
sunflow.shader(currShader, SHADER_PHONG);
}
/**
* Sets Phong Shader
* @param name Individual Name
* @param diffuse Diffuse Color
* @param specular Specular Color
* @param power ?
* @param samples Detail, the higher the slower and smoother
* @param texture Path to texture file
*/
public void setPhongShader(String name, Color diffuse, Color specular, float power, int samples, String texture) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, diffuse.getRed()/(float)255, diffuse.getGreen()/(float)255, diffuse.getBlue()/(float)255);
sunflow.parameter("specular", colorSpace, specular.getRed()/(float)255, specular.getGreen()/(float)255, specular.getBlue()/(float)255);
sunflow.parameter("power", power);
sunflow.parameter("samples", samples);
sunflow.parameter("texture", texture);
// set shader
sunflow.shader(currShader, SHADER_TEXTURED_PHONG);
}
/**
* Sets Shiny Diffuse Shader
* @param name Individual Name
* @param color Color
* @param shiny shinyness, the bigger the more
*/
public void setShinyDiffuseShader(String name, Color color, float shiny) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("shiny", shiny);
// set shader
sunflow.shader(currShader, SHADER_SHINY_DIFFUSE);
}
/**
* Sets Shiny Diffuse Shader
* @param name Individual Name
* @param color Color
* @param shiny shinyness, the bigger the more
* @param texture Path to texture file
*/
public void setShinyDiffuseShader(String name, Color color, float shiny, String texture) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, color.getRed()/(float)255, color.getGreen()/(float)255, color.getBlue()/(float)255);
sunflow.parameter("shiny", shiny);
sunflow.parameter("texture", texture);
// set shader
sunflow.shader(currShader, SHADER_TEXTURED_SHINY_DIFFUSE);
}
/**
* Sets Uber Shader
* @param name Individual Name
* @param diffuse Diffuse Color
* @param specular Specular Color
* @param diffuseTexture Diffuse Texture
* @param specularTexture Specular Texture
* @param diffuseBlend Diffuse Blendamount
* @param specularBlend Specular Blendamount
* @param glossyness glossyness
* @param samples samples
*/
public void setUberShader(String name, Color diffuse, Color specular, String diffuseTexture, String specularTexture, float diffuseBlend, float specularBlend, float glossyness, int samples) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, diffuse.getRed()/(float)255, diffuse.getGreen()/(float)255, diffuse.getBlue()/(float)255);
sunflow.parameter("specular", colorSpace, specular.getRed()/(float)255, specular.getGreen()/(float)255, specular.getBlue()/(float)255);
sunflow.parameter("diffuse.texture", diffuseTexture);
sunflow.parameter("specular.texture", specularTexture);
sunflow.parameter("diffuse.blend", diffuseBlend);
sunflow.parameter("specular.blend", specularBlend);
sunflow.parameter("glossyness", glossyness);
sunflow.parameter("samples", samples);
// set shader
sunflow.shader(currShader, SHADER_UBER);
}
/**
* Sets Anisotropic Ward Shader
* @param name Individual Name
* @param diffuse Diffuse Color
* @param specular Specular Color
* @param roughnessX Roughness in x axis
* @param roughnessY Roughness in y axis
* @param samples Detail, the more the slower and smoother
*/
public void setWardShader(String name, Color diffuse, Color specular, float roughnessX, float roughnessY, int samples) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, diffuse.getRed()/(float)255, diffuse.getGreen()/(float)255, diffuse.getBlue()/(float)255);
sunflow.parameter("specular", colorSpace, specular.getRed()/(float)255, specular.getGreen()/(float)255, specular.getBlue()/(float)255);
sunflow.parameter("roughnessX", roughnessX);
sunflow.parameter("roughnessY", roughnessY);
sunflow.parameter("samples", samples);
// set shader
sunflow.shader(currShader, SHADER_WARD);
}
/**
* Sets Anisotropic Ward Shader
* @param name Individual Name
* @param diffuse Diffuse Color
* @param specular Specular Color
* @param roughnessX Roughness in x axis
* @param roughnessY Roughness in y axis
* @param samples Detail, the more the slower and smoother
* @param texture Path to texture file
*/
public void setWardShader(String name, Color diffuse, Color specular, float roughnessX, float roughnessY, int samples, String texture) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("diffuse", colorSpace, diffuse.getRed()/(float)255, diffuse.getGreen()/(float)255, diffuse.getBlue()/(float)255);
sunflow.parameter("specular", colorSpace, specular.getRed()/(float)255, specular.getGreen()/(float)255, specular.getBlue()/(float)255);
sunflow.parameter("roughnessX", roughnessX);
sunflow.parameter("roughnessY", roughnessY);
sunflow.parameter("samples", samples);
sunflow.parameter("texture", texture);
// set shader
sunflow.shader(currShader, SHADER_TEXTURED_WARD);
}
/**
* Sets Wireframe Shader
* @param name Individual Name
* @param lineColor line color
* @param fillColor fill color
* @param width stroke width ?
*/
public void setWireframeShader(String name, Color lineColor, Color fillColor, float width) {
// save name for use with primitives
currShader = name;
// set parameter
sunflow.parameter("line", colorSpace, lineColor.getRed()/(float)255, lineColor.getGreen()/(float)255, lineColor.getBlue()/(float)255);
sunflow.parameter("fill", colorSpace, fillColor.getRed()/(float)255, fillColor.getGreen()/(float)255, fillColor.getBlue()/(float)255);
sunflow.parameter("width", width);
// set shader
sunflow.shader(currShader, SHADER_WIREFRAME);
}
/*
* END OF SHADER
* --------------------------------------------------------------------------------------
*/
/*
* --------------------------------------------------------------------------------------
* MODIFIERS
*/
public void setPerlinModifier(String name, int function, float size, float scale) {
currModifier = name + modifiercount;
modifierType = MODIFIER_PERLIN_MAP;
sunflow.parameter("function", function);
sunflow.parameter("size", size);
sunflow.parameter("scale", scale);
sunflow.modifier(currModifier, modifierType);
modifiercount++;
isModifiers = true;
}
/*
* END OF MODIFIERS
* --------------------------------------------------------------------------------------
*/
/*
* --------------------------------------------------------------------------------------
* PRIMITIVES
*/
/**
* draws a mesh primitive
* @param name individual name of primitive
* @param vertices Float array with coordinates (like [x0,y0,z0,x1,y1,z1,x2,y2,z2])
* @param triangles int array connecting the vertices (like [0,1,2])
*/
public void drawMesh(String name, float[] vertices, int[] triangles) {
sunflow.parameter("points", "point", "vertex", vertices);
sunflow.parameter("triangles", triangles);
sunflow.geometry( name, "triangle_mesh" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* draws a mesh primitive which can be rotated and scaled
* @param name individual name of primitive
* @param vertices Float array with coordinates (like [x0,y0,z0,x1,y1,z1,x2,y2,z2])
* @param triangles int array connecting the vertices (like [0,1,2])
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawMesh(String name, float[] vertices, int[] triangles, float size, float xRotation, float yRotation, float zRotation) {
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
sunflow.parameter("points", "point", "vertex", vertices);
sunflow.parameter("triangles", triangles);
sunflow.geometry( name, "triangle_mesh" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* draws a bezier patch
* @param name individual name of primitive
* @param subdivs int value of how much subdivisions
* @param smooth boolean is bezier patch set to smooth
* @param quads boolean if patch uses quads
* @param nu number of points in vertical direction
* @param nv number of points in horizontal direction
* @param uwrap boolean ? best is to use false
* @param vwrap boolean ? best is to use false
* @param points Float array with coordinates (like [x0,y0,z0,x1,y1,z1,x2,y2,z2])
*/
public void drawBezierMesh(String name, int subdivs, boolean smooth, boolean quads, int nu, int nv, boolean uwrap, boolean vwrap, float[] points) {
sunflow.parameter("subdivs", subdivs);
sunflow.parameter("smooth", smooth);
sunflow.parameter("quads", quads);
sunflow.parameter("nu", nu);
sunflow.parameter("nv", nv);
sunflow.parameter("uwrap", uwrap);
sunflow.parameter("vwrap", vwrap);
sunflow.parameter("points", "point", "vertex", points);
sunflow.geometry( name, "bezier_mesh" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* draws a sphere
* @param name Individual name
*/
public void drawSphere(String name) {
sunflow.geometry( name, "sphere" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* draws a sphere
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
*/
public void drawSphere(String name, float x, float y, float z, float size) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "sphere" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a box
* @param name Individual name
*/
public void drawBox(String name) {
sunflow.geometry( name, "box" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draws a box
* @param name
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
*/
public void drawBox(String name, float x, float y, float z, float size) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "box" );
sunflow.parameter( "shaders", currShader);
sunflow.parameter( "transform", m );
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draws a box
* @param name
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawBox(String name, float size, float x, float y, float z, float xRotation, float yRotation, float zRotation) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "box" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a box
* @param name
* @param name Individual name
* @param xSize size on x axis
* @param ySize size on y axis
* @param zSize size on z axis
* @param x x position
* @param y y position
* @param z z position
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawBox(String name, float xSize, float ySize, float zSize, float x, float y, float z, float xRotation, float yRotation, float zRotation) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(xSize, ySize, zSize) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "box" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a cylinder
* @param name Individual name
*/
public void drawCylinder(String name) {
sunflow.geometry( name, "cylinder" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draws a cylinder
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
*/
public void drawCylinder(String name, float x, float y, float z, float size) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "cylinder" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a cylinder
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawCylinder(String name, float x, float y, float z, float size, float xRotation, float yRotation, float zRotation) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "cylinder" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a Cylinder
* @param name
* @param name Individual name
* @param xSize size on x axis
* @param ySize size on y axis
* @param zSize size on z axis
* @param x x position
* @param y y position
* @param z z position
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawCylinder(String name, float xSize, float ySize, float zSize, float x, float y, float z, float xRotation, float yRotation, float zRotation) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(xSize, ySize, zSize) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "cylinder" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a Banchoff Surface
* @param name Individual name
*/
public void drawBanchoffSurface(String name) {
sunflow.geometry( name, "banchoff" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draws a Banchoff Surface
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
*/
public void drawBanchoffSurface(String name, float x, float y, float z, float size) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "banchoff" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a Banchoff Surface
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
*/
public void drawBanchoffSurface(String name, float x, float y, float z, float size, float xRotation, float yRotation, float zRotation) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.geometry( name, "banchoff" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a Julia
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
* @param float[] q = four quaternization variables
* @param int iterations = level of detail
* @param float epsilon = level of accuracy
*/
public void drawJulia(String name, float x, float y, float z, float size, float xRotation, float yRotation, float zRotation, float[] q, int iterations, float epsilon) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.parameter("iterations", iterations);
sunflow.parameter("epsilon", epsilon);
sunflow.parameter("cw", q[0]);
sunflow.parameter("cx", q[1]);
sunflow.parameter("cy", q[2]);
sunflow.parameter("cz", q[3]);
sunflow.geometry( name, "julia" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* Draws a SphereFlake (note: requires Sunflow version 0.07.3)
* @param level = numbers of iterative levels ranging from 0 to 20
* @param axis = axis orientation
* @param radius = radius for the inititial sphere
*/
public void drawSphereFlake(String name, int level, Vector3 axis, float radius) {
sunflow.parameter("level", level);
sunflow.parameter("axis", axis);
sunflow.parameter("radius", radius);
sunflow.geometry( name, "sphereflake" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draws a SphereFlake (note: requires Sunflow version 0.07.3)
* @param name Individual name
* @param x x position
* @param y y position
* @param z z position
* @param size size
* @param xRotation x rotation
* @param yRotation y rotation
* @param zRotation z rotation
* @param level = numbers of iterative levels ranging from 0 to 20
* @param axis = axis orientation
* @param radius = radius for the inititial sphere
*/
public void drawSphereFlake(String name, float x, float y, float z, float size, float xRotation, float yRotation, float zRotation,
int level, Vector3 axis, float radius) {
Matrix4 translate = Matrix4.IDENTITY.multiply( Matrix4.translation(x, y, z ));
Matrix4 scale = Matrix4.IDENTITY.multiply( Matrix4.scale(size, size, size) );
Matrix4 rotate = Matrix4.IDENTITY
.multiply( Matrix4.rotateZ(zRotation) )
.multiply( Matrix4.rotateX(xRotation) )
.multiply( Matrix4.rotateY(yRotation) );
Matrix4 m = Matrix4.IDENTITY;
m = scale.multiply(m);
m = rotate.multiply(m);
m = translate.multiply(m);
sunflow.parameter("level", level);
sunflow.parameter("axis", axis);
sunflow.parameter("radius", radius);
sunflow.geometry( name, "sphereflake" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.parameter( "transform", m );
sunflow.instance( name + ".instance", name );
}
/**
* set background
* @param name Individual name
*/
public void setBackground(String name) {
sunflow.geometry( name, "background" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* draw hair object
* @param name Individual Name
* @param segments ?
* @param points start of hair ?
* @param widths hairwidth ?
*/
public void drawHair(String name, int segments, float[] points, float[] widths) {
sunflow.parameter("segments", segments);
sunflow.parameter("widths", "float", "none", widths);
sunflow.parameter("points", "point", "vertex", points);
sunflow.geometry( name, "hair" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* draw a particle surface object
* @param name Individual name
* @param particles float array with particle positions
* @param radius object radius ?
* @param num Number of Particles
*/
public void drawParticleSurface(String name, float[] particles, float radius, int num) {
sunflow.parameter("particles", "point", "vertex", particles);
sunflow.parameter("num", num);
sunflow.parameter("radius", radius);
sunflow.geometry( name, "particles" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/**
* Draw a plane
* @param name Individual name
* @param center center of plane
* @param normal normal of plane
*/
public void drawPlane(String name, Point3 center, Vector3 normal) {
sunflow.parameter("center", center);
sunflow.parameter("normal", normal);
sunflow.geometry( name, "plane" );
sunflow.parameter( "shaders", currShader);
if(isModifiers) sunflow.parameter("modifiers", currModifier);
sunflow.instance( name + ".instance", name );
}
/*
* END OF PRIMITIVES
* --------------------------------------------------------------------------------------
*/
/*
* --------------------------------------------------------------------------------------
* MY OWN SHAPES
*/
/**
* takes points, uses first point as center and connects the rest to it using triangles
* one can draw circles or weird other types of shapes
*
* @param name Individual name
* @param points a float array of Point3s.
*/
public void drawCircularShape(String name, Point3[] points) {
// vertex amount
int verticesLength = points.length*3;
int trianglesLength = points.length-1;
float[] vertices = new float[verticesLength];
int[] triangles = new int[trianglesLength];
// create vertices array
int verticesIndex = 0;
for(int i=0;i