/** * this sketch illustrates how we created realtime shadows. * note that this demo requires a 'newer' nvidia graphics card to run properly. */ import java.io.InputStream; import gestalt.Gestalt; import gestalt.candidates.shadow.JoglMaterialPluginShadowCombiner; import gestalt.candidates.shadow.JoglShadowMap; import gestalt.model.Model; import gestalt.model.ModelData; import gestalt.model.ModelLoaderOBJ; import gestalt.model.ModelPlayer; import gestalt.p5.GestaltPlugIn; import gestalt.shape.Mesh; import gestalt.shape.Plane; import gestalt.util.CameraMover; import processing.opengl.*; public class Shadow extends PApplet { private GestaltPlugIn gestalt; private ModelPlayer _myModelPlayer; private Model _myModel; public void setup() { /* setup p5 */ size(640, 480, OPENGL); framerate(50); rectMode(CENTER); noStroke(); gestalt = new GestaltPlugIn(this); /* setup shadow map */ JoglShadowMap myShadowMapExtension = new JoglShadowMap(gestalt.light(), width, height, true, false); myShadowMapExtension.shadowcolor.set(0, 0, 0, 0.25f); myShadowMapExtension.lightcamera.fovy *= 0.75f; gestalt.bin(Gestalt.BIN_FRAME_SETUP).add(myShadowMapExtension); /* model */ InputStream myModelStream = openStream("gulphog.obj"); ModelData myModelData = ModelLoaderOBJ.getModelData(myModelStream); Mesh myModelMesh = gestalt.drawablefactory().mesh(true, myModelData.vertices, 3, myModelData.vertexColors, 4, myModelData.texCoordinates, 2, myModelData.normals, Gestalt.MESH_TRIANGLES); myModelMesh.material().lit = true; _myModel = gestalt.drawablefactory().model(myModelData, myModelMesh); _myModel.getView().scale().set(2, 2, 2); _myModelPlayer = new ModelPlayer(_myModel); _myModelPlayer.play(1.0f); gestalt.bin(Gestalt.BIN_3D).add(_myModel); /* create plane */ Plane myPlane = gestalt.drawablefactory().plane(); myPlane.scale().set(500, 500, 1); myPlane.rotation().x = -Gestalt.PI_HALF; myPlane.material().lit = true; myPlane.material().getColor().set(1, 1); myPlane.material().normalizenormals = true; gestalt.bin(Gestalt.BIN_3D).add(myPlane); /* add shapes to shadow bin */ myShadowMapExtension.addShape(_myModel); myShadowMapExtension.addShape(myPlane); /* camera */ gestalt.camera().position().set(350, 450, -500); gestalt.camera().setMode(Gestalt.CAMERA_MODE_LOOK_AT); gestalt.camera().culling = Gestalt.CAMERA_CULLING_NONE; /* light */ gestalt.light().enable = true; gestalt.light().position.set(160, 800, 380); } public void draw() { /* clear screen */ background(50); float myDeltaTime = 1 / 50f; CameraMover.handleKeyEvent(gestalt.camera(), gestalt.event(), myDeltaTime); /* model */ _myModel.calculateBoundingBox(); _myModel.getView().rotation().y += myDeltaTime * 0.25f; _myModelPlayer.loop(myDeltaTime); } public static void main(String[] args) { PApplet.main(new String[] { "Shadow" } ); } }