// StereoAnimRender // by Etienne Monneret // This script can't run out of the AnaBuilder's context // See http://anabuilder.free.fr for more info import java.awt.image.*; setAccessibility(true); //Search for camera 1 and camera 2 aScene = window.getScene(); aFound = false; ObjectInfo aCamera1 = null,aCamera2 = null; for(i = 0;i < aScene.getNumObjects() && !aFound;i++) { if(aScene.getObject(i).object instanceof SceneCamera) { if(aScene.getObject(i).name.equals("Camera 1")) { aCamera1 = aScene.getObject(i); } if(aScene.getObject(i).name.equals("Camera 2")) { aCamera2 = aScene.getObject(i); } if(aCamera1 != null && aCamera2 != null) { aFound = true; } } } if(aFound == false) { return; } //localShift = aCamera1.coords.toLocal().timesDirection(aCamera2.coords.getOrigin()); //Ask for time datas nbViewsField = new ValueField(50, ValueField.POSITIVE+ValueField.INTEGER); endTimeField = new ValueField(1.0, ValueField.POSITIVE); dlg = new ComponentsDialog(window, "Select parameters for rendered animation", new Component [] {nbViewsField, endTimeField}, new String [] {"Nb views", "End time"}); if (!dlg.clickedOk()) return; nbViews = (int) nbViewsField.getValue(); endTime = (double) endTimeField.getValue(); // Prompt the user to select options for the output image. rendererChoice = new Choice(); renderers = ModellingApp.getRenderers(); for (i = 0; i < renderers.length; i++) rendererChoice.add(renderers[i].getName()); stereoChoice = new Choice(); stereoChoice.add("Anaglyph"); stereoChoice.add("Parallel"); stereoChoice.add("Crossed"); widthField = new ValueField(400, ValueField.POSITIVE+ValueField.INTEGER); heightField = new ValueField(300, ValueField.POSITIVE+ValueField.INTEGER); qualitySlider = new ValueSlider(0, 100, 100, 80); dlg = new ComponentsDialog(window, "Select Parameters for rendered images", new Component [] {rendererChoice, widthField, heightField, qualitySlider,stereoChoice}, new String [] {"Renderer", "Width", "Height", "Quality","Stereo"}); if (!dlg.clickedOk()) return; rend = renderers[rendererChoice.getSelectedIndex()]; width = (int) widthField.getValue(); height = (int) heightField.getValue(); quality = (int) qualitySlider.getValue(); sc1 = (SceneCamera) aCamera1.object; sc2 = (SceneCamera) aCamera2.object; // Display the main configuration panel for the renderer. dlg = new PanelDialog(window, "Select rendering options", rend.getConfigPanel()); if (!dlg.clickedOk()) return; rend.recordConfiguration(); //Build a first blank image in order to know the final size aBI1= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); aBI2= new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); switch(stereoChoice.getSelectedIndex()) { case 0: aBI = AnaBuilder.ABBuildAnaglyph(aBI1,aBI2); break; case 1: aBI = AnaBuilder.ABBuildParallel(aBI1,aBI2); break; case 2: aBI = AnaBuilder.ABBuildCrossed(aBI1,aBI2); break; default: break; } finalWidth = aBI.getWidth(null); finalHeight = aBI.getHeight(null); aImageSaver = new ImageSaver(window,finalWidth,finalHeight,(int)(nbViews / endTime)); //Calc all images for(i = 0;i < nbViews;i++) { window.setTime(endTime * i / nbViews ); // aCoords = aCamera1.coords.duplicate(); // aCoords.setOrigin(aCoords.getOrigin().plus(localShift)); // aCamera2.coords = aCoords; window.theView[0].updateImage(); window.theView[0].update(window.theView[0].getGraphics()); window.theView[1].updateImage(); window.theView[1].update(window.theView[1].getGraphics()); aImage1 = sc1.renderScene(aScene,width,height,rend,aCamera1.coords).getImage(); aBI1.getGraphics().drawImage(aImage1,0,0,null); aImage2 = sc2.renderScene(aScene,width,height,rend,aCamera2.coords).getImage(); aBI2.getGraphics().drawImage(aImage2,0,0,null); switch(stereoChoice.getSelectedIndex()) { case 0: aBI = AnaBuilder.ABBuildAnaglyph(aBI1,aBI2); break; case 1: aBI = AnaBuilder.ABBuildParallel(aBI1,aBI2); break; case 2: aBI = AnaBuilder.ABBuildCrossed(aBI1,aBI2); break; default: break; } aImageSaver.saveImage(aBI); } aImageSaver.lastMovieImage();