/** * this demo shows how to use the shadow extension. */ import gestalt.Gestalt; import gestalt.candidates.shadow.JoglShadowMap; import gestalt.candidates.shadow.JoglShadowMapDisplay; import gestalt.impl.jogl.shape.JoglSphere; import gestalt.p5.GestaltPlugIn; import gestalt.shape.Plane; import gestalt.util.CameraMover; import processing.opengl.*; GestaltPlugIn gestalt; JoglShadowMap _myShadowMapExtension; JoglSphere mySphereA; JoglSphere mySphereB; JoglSphere mySphereC; float _myCounter = 0; void setup() { /* setup p5 */ size(640, 480, OPENGL); /* create gestalt */ gestalt = new GestaltPlugIn(this); /* setup shadow map */ final int myShadowMapWidth = width; final int myShadowMapHeight = height; _myShadowMapExtension = new JoglShadowMap(gestalt.light(), myShadowMapWidth, myShadowMapHeight, true, false); gestalt.bin(Gestalt.BIN_FRAME_SETUP).add(_myShadowMapExtension); /* this is a workaround for a state issue between openl, processing and gestalt */ GestaltPlugIn.SKIP_FIRST_FRAME = true; /* create shapes and a floor */ mySphereA = new JoglSphere(); mySphereA.position().set(100, 50, -100); mySphereA.scale().set(100, 100, 100); mySphereA.material().lit = true; mySphereA.material().getColor().set(0.5f, 0.5f, 0, 1); mySphereB = new JoglSphere(); mySphereB.position().set(0, 100, 0); mySphereB.scale().set(100, 100, 100); mySphereB.material().lit = true; mySphereB.material().getColor().set(1, 0, 0, 1); mySphereC = new JoglSphere(); mySphereC.position().set(100, 350, 0); mySphereC.scale().set(100, 100, 100); mySphereC.material().lit = true; mySphereC.material().getColor().set(1, 0.5f, 0, 1); Plane myPlane = gestalt.drawablefactory().plane(); myPlane.scale().set(1000, 1000, 1); myPlane.rotation().x = -Gestalt.PI_HALF; myPlane.material().lit = true; myPlane.material().getColor().set(1, 1); /* add shapes to bins */ gestalt.bin(Gestalt.BIN_3D).add(mySphereA); gestalt.bin(Gestalt.BIN_3D).add(mySphereB); gestalt.bin(Gestalt.BIN_3D).add(mySphereC); gestalt.bin(Gestalt.BIN_3D).add(myPlane); /* add shapes to shadow extension */ _myShadowMapExtension.addShape(mySphereA); _myShadowMapExtension.addShape(mySphereB); _myShadowMapExtension.addShape(mySphereC); _myShadowMapExtension.lightcamera.nearclipping = 100; _myShadowMapExtension.lightcamera.farclipping = 5000; /* light */ gestalt.light().enable = true; gestalt.light().position.set(450, 720, 23); gestalt.light().diffuse.set(1, 1, 1, 1); gestalt.light().ambient.set(0, 0, 0, 1); /* camera() */ gestalt.camera().position().set( -400, 1000, 1000); gestalt.camera().setMode(Gestalt.CAMERA_MODE_LOOK_AT); /* create a display for the shadowmap */ createShadowmapDisplay(); } void createShadowmapDisplay() { JoglShadowMapDisplay myDisplay = new JoglShadowMapDisplay(_myShadowMapExtension, width, height); myDisplay.scale().scale(0.25f); myDisplay.position().x = myDisplay.scale().x / 2; myDisplay.position().y = myDisplay.scale().y / 2; myDisplay.material().getColor().a = 0.75f; myDisplay.material().depthtest = false; gestalt.bin(Gestalt.BIN_2D_FOREGROUND).add(myDisplay); } void draw() { /* clear screen */ background(255, 255, 0); /* move camera */ CameraMover.handleKeyEvent(gestalt.camera(), gestalt.event(), 1 / 60f); /* bounce spheres */ _myCounter += 1 / 60f; mySphereA.position().y += sin(_myCounter * 1.5f) * 2; mySphereB.position().y += sin(_myCounter * 2.3f) * 4; mySphereC.position().y += sin(_myCounter * 2.5f) * 3; }