/** * this demo shows how to the GLSL shadermanager. */ import gestalt.Gestalt; import gestalt.candidates.glsl.ShaderManager; import gestalt.candidates.glsl.ShaderProgram; import gestalt.p5.GestaltPlugIn; import processing.opengl.PGraphicsOpenGL; GestaltPlugIn gestalt; ShaderManager _myShaderManager; ShaderProgram _myShaderProgram; float[][] _mySpherePosition; float _myRotation; void setup() { /* setup p5 */ size(640, 480, OPENGL); sphereDetail(4); noStroke(); gestalt = new GestaltPlugIn(this); /* setup shader */ _myShaderManager = gestalt.drawablefactory().extensions().shadermanager(); _myShaderManager.init( ( (PGraphicsOpenGL) g).gl, ( (PGraphicsOpenGL) g).glu); _myShaderProgram = _myShaderManager.createShaderProgram(); _myShaderManager.attachVertexShader(_myShaderProgram, loadStrings("toon.vsh")); _myShaderManager.attachFragmentShader(_myShaderProgram, loadStrings("toon.fsh")); gestalt.bin(Gestalt.BIN_FRAME_SETUP).add(_myShaderManager); _myShaderManager.enable(_myShaderProgram); _myShaderManager.setUniform(_myShaderProgram, "thresholds", new float[] { 0.1f, 0.2f, 0.5f, 0.95f } ); /* create sphere positions */ _mySpherePosition = new float[1000][4]; for (int i = 0; i < _mySpherePosition.length; i++) { _mySpherePosition[i][0] = random(width); _mySpherePosition[i][1] = random(height); _mySpherePosition[i][2] = random( -10, 10); _mySpherePosition[i][3] = random(10, 20); } } void draw() { background(64, 64, 64); float myX = (mouseX / (float) width - 0.5f) * 2.0f; float myY = (mouseY / (float) height - 0.5f) * 2.0f; directionalLight(255, 255, 255, myX, myY, 1); translate(width / 2, height / 2); _myRotation += 0.03f; rotateX(sin(_myRotation) * 0.1f); rotateY(cos(_myRotation * 0.65f) * 0.1f); translate(width / -2, height / -2); for (int i = 0; i < _mySpherePosition.length; i++) { pushMatrix(); translate(_mySpherePosition[i][0], _mySpherePosition[i][1], _mySpherePosition[i][2]); sphere(_mySpherePosition[i][3]); popMatrix(); } }