/******************************************************************************* * Copyright (c) 2007- VTT Technical Research Centre of Finland. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.proconf.g3d.shapeeditor.actions; import java.io.File; import java.io.FilenameFilter; import java.util.Stack; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.DirectoryDialog; import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase; import org.simantics.proconf.g3d.occ.geometry.OccTriangulator; import com.jme.bounding.BoundingBox; import com.jme.renderer.ColorRGBA; import com.jme.scene.Geometry; import com.jme.scene.state.MaterialState; public class LoadFolderAction extends Action { private ThreeDimensionalEditorBase editor; public LoadFolderAction(ThreeDimensionalEditorBase editor) { super("Load folder"); this.editor = editor; } public void run() { DirectoryDialog loadDialog = new DirectoryDialog(editor.getRenderingComposite().getShell(), SWT.OPEN); loadDialog.setText("Select directory"); String directory = loadDialog.open(); if (directory != null) { File file = new File(directory); if (!file.isDirectory()) return; Stack directories = new Stack(); directories.push(file); boolean recursive = true; while (!directories.empty()) { File dir = directories.pop(); String[] files = dir.list(new PLYFilter()); for (String filename : files) { Geometry g = OccTriangulator.getGeometryFromFile(dir.getAbsolutePath() + "/" + filename)[0]; MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState(); ms.setAmbient(new ColorRGBA(0.f,0.f,0.f,0.f)); ms.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.f)); ms.setShininess(128.f); ms.setDiffuse(new ColorRGBA(0.8f,0.8f,0.8f,0.f)); ms.setSpecular(new ColorRGBA(1.f,1.f,1.f,0.f)); ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK); if (g.getColorBuffer(0) != null) { ms.setColorMaterial(MaterialState.CM_DIFFUSE); } g.setModelBound(new BoundingBox()); g.updateModelBound(); g.setRenderState(ms); editor.getRenderingComponent().getShadowRoot().attachChild(g); g.updateWorldBound(); g.lock(); } if (recursive) { File[] newDirs = dir.listFiles(new DirectoryFilter()); for (File d : newDirs) directories.push(d); } } } } protected class DirectoryFilter implements FilenameFilter { public boolean accept(File dir, String name) { File file = new File(dir.getAbsolutePath() + "/" + name); return file.isDirectory(); } } protected class PLYFilter implements FilenameFilter { public boolean accept(File dir, String name) { return (name.endsWith("ply")); } } }