?? serverdaemon.java
字號:
//===========================================================================//= A 3D Search Engine based on Vitral SDK toolkit platform =//=-------------------------------------------------------------------------=//= Oscar Chavarro, May 23 2007 =//=-------------------------------------------------------------------------=//= References: =//= [FUNK2003], Funkhouser, Thomas. Min, Patrick. Kazhdan, Michael. Chen, =//= Joyce. Halderman, Alex. Dobkin, David. Jacobs, David. "A Search =//= Engine for 3D Models", ACM Transactions on Graphics, Vol 22. No1. =//= January 2003. Pp. 83-105 =//===========================================================================// Java basic classesimport java.io.File;import java.io.FileOutputStream;import java.io.BufferedOutputStream;import java.io.PrintWriter;import java.util.ArrayList;import java.util.HashMap;import java.util.Collections;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketTimeoutException;// Awt / swing classesimport java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.JFrame;// JOGL classesimport javax.media.opengl.GL;import javax.media.opengl.GLCanvas;import javax.media.opengl.GLEventListener;import javax.media.opengl.GLAutoDrawable;// VSDK Classesimport vsdk.toolkit.media.GeometryMetadata;import vsdk.framework.shapeMatching.JoglShapeMatchingOfflineRenderer;import vsdk.framework.shapeMatching.JoglShapeMatchingOfflineRenderable;import vsdk.framework.shapeMatching.JoglProjectedViewRenderer;/**Current application provides a server (TCP based) oriented management controlfor the testing of the VitralSDK implementation of a search engine for3d models, as the one defined in [FUNK2003].The application provides basic operations, useful for testing and benchmarking.Current class is responsible of handling user requests, and managing graphicscontexts for OpenGL. This console application has two graphics operationmodes: - A true 100% offline renderer that enables hardware accelerated rendering using pbuffers. - A software renderer that lies upon a valid and visible window.*/public class ServerDaemon extends JoglShapeMatchingOfflineRenderable implements GLEventListener{ // Graphical contexts for indexing private GLCanvas canvas; private JoglShapeMatchingOfflineRenderer offlineRenderer = null; private JoglProjectedViewRenderer projectedViewRenderer = null; private int renderPreviewXSize = 640; private int renderPreviewYSize = 480; // Search engine and its configuration private SearchEngine searchEngine; private ShapeDatabaseFile shapeDatabase; public String command[]; private int distanceFieldSide = 64; // Exporter for html file generation & socket control private FileOutputStream fos; private BufferedOutputStream writer; public boolean terminate = false; private ServerDaemon() { projectedViewRenderer = new JoglProjectedViewRenderer(distanceFieldSide, distanceFieldSide, false); offlineRenderer = new JoglShapeMatchingOfflineRenderer(renderPreviewXSize, renderPreviewYSize, this); searchEngine = new SearchEngine(); canvas = null; shapeDatabase = new ShapeDatabaseFile("etc/metadata.bin"); searchEngine.readDatabase(shapeDatabase); } private void startWriter() { try { File fd = new File("output.html"); fos = new FileOutputStream(fd); writer = new BufferedOutputStream(fos); } catch ( Exception e ) { ; } } private void stopWriter() { try { writer.close(); fos.close(); } catch ( Exception e ) { ; } } private void exportResults(ArrayList <Result> similarModels, ShapeDatabase shapeDatabase) { int i; //- Sort report --------------------------------------------------- Collections.sort(similarModels); //- Print report -------------------------------------------------- System.out.println("= SIMILAR MODELS REPORT ==================================================="); System.out.println("Founded " + similarModels.size() + " similar objects:"); for ( i = 0; i < similarModels.size(); i++ ) { System.out.println(" - " + similarModels.get(i)); } startWriter(); searchEngine.writeResultsAsHtml(new PrintWriter(writer), similarModels, shapeDatabase, "./output", 0, 0, similarModels.size()); stopWriter(); } public void executeRendering(GL gl) { //- Set black screen. Shown in non offline rendering. ------------- gl.glClearColor(0, 0, 0, 1); gl.glClear(gl.GL_COLOR_BUFFER_BIT); if ( canvas != null ) { canvas.swapBuffers(); } //- Listen for requirements --------------------------------------- ServerSocket socket = null; Socket clientSocket; command = null; do { try { if ( socket == null ) { socket = new ServerSocket(1234); socket.setSoTimeout(1000); System.out.println("Waiting for client connections at port 1234!"); } clientSocket = socket.accept(); NetworkAttendingThread sonThread; sonThread = new NetworkAttendingThread(clientSocket, this); Thread t = new Thread(sonThread); t.start(); } catch ( SocketTimeoutException e ) { System.out.print("."); if ( command != null ) { ArrayList <Result> similarModels; similarModels = searchEngine.runCommand(gl, offlineRenderer, canvas, projectedViewRenderer, command, shapeDatabase, distanceFieldSide); if ( similarModels != null ) { exportResults(similarModels, shapeDatabase); } } command = null; } catch( Exception e ) { System.err.println("Network error: " + e); e.printStackTrace(); System.exit(1); } } while ( !terminate ); //- Free unused references for garbage collection ----------------- shapeDatabase = null; } /** Not used method, but needed to instanciate GLEventListener */ public void init(GLAutoDrawable drawable) { ; } /** Not used method, but needed to instanciate GLEventListener */ public void displayChanged(GLAutoDrawable drawable, boolean a, boolean b) { ; } /** Called to indicate the drawing surface has been moved and/or resized */ public void reshape (GLAutoDrawable drawable, int x, int y, int width, int height) { GL gl = drawable.getGL(); gl.glViewport(0, 0, width, height); } /** Called by drawable to initiate drawing */ public void display(GLAutoDrawable drawable) { GL gl = drawable.getGL(); executeRendering(gl); System.exit(1); } public static void main(String args[]) { ServerDaemon instance = new ServerDaemon(); if ( instance.offlineRenderer.isPbufferSupported() ) { // Create offline rendering based application instance.offlineRenderer.execute(); instance.offlineRenderer.waitForMe(); } else { // Create application based GUI JFrame frame; Dimension size; instance.canvas = new GLCanvas(); instance.canvas.addGLEventListener(instance); frame = new JFrame("VITRAL offline renderer window - do not hide"); frame.add(instance.canvas, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); size = new Dimension(instance.renderPreviewXSize+40, instance.renderPreviewYSize+60); frame.setMinimumSize(size); frame.setSize(size); frame.setVisible(true); } }}//===========================================================================//= EOF =//===========================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -