]> Creatis software - CreaPhase.git/blobdiff - octave_packages/vrml-1.0.13/vrml_browse.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / vrml-1.0.13 / vrml_browse.m
diff --git a/octave_packages/vrml-1.0.13/vrml_browse.m b/octave_packages/vrml-1.0.13/vrml_browse.m
new file mode 100644 (file)
index 0000000..72b5756
--- /dev/null
@@ -0,0 +1,234 @@
+## Copyright (C) 2002 Etienne Grossmann <etienne@egdn.net>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+##  p = vrml_browse ([s])       - View vrml code s with FreeWRL
+##      vrml_browse ("-kill")   - Kill the browser
+##
+## s : string : VRML code, as returned by the vrml_XYZ functions. 
+##              If  s  is not specified, a sombrero is showed
+##
+## p : int    : pid of the current browser. If freewrl has not been started
+##              or has died, a new one is started. p is zero or negative in
+##              case of failure to start freewrl.
+##
+## Some keystrokes for FreeWRL (more in the freewrl manpage) :
+##
+## 'e'   : Examine : mouse 1 and drag rotates the scene
+##                   mouse 3 and drag moves closer/farther          
+## 'w'   : Walk    : mouse 1 and drag moves for/backward, turns
+##                   mouse 3 and drag translates parallel to the screen
+## 's'   : Save a snapshot in files 'octave.snapshot.NNNN.ppm'
+## 'q'   : Quit
+## 
+## WARNING : FreeWRL >0.25 (http://www.crc.ca/FreeWRL/) must be installed.
+##
+## BUG     : The vrml browser is not killed when octave exits. Sometimes the
+##           vrml browser does not get raised or gets raised improperly
+##           (shows the contents of the topmost window above it). Use
+##           "-kill".
+
+function p = vrml_browse (varargin)
+
+verbose = 0;
+
+best_option = " ";
+                               # Allow scripting and specify where
+                               # browser's output goes 
+##out_option = "--ps --psout /tmp/octave_browser_out.txt " ;
+out_option = " " ;
+geo_option = " " ;
+global vrml_b_pid = 0;
+global vrml_b_name = [];
+
+p = vrml_b_pid ;
+bop = "";
+go_to_bg = 0;
+
+if nargin<1
+  s = "";
+else
+  i = 1;
+  while i <= length (varargin)
+    o = varargin{i++};
+    if strcmp (o, "-kill")
+      vrml_kill(); return;
+    elseif strcmp (o, "-bop")  # Browser options
+      bop = [bop," ",varargin{i++}," "];
+    elseif strcmp (o, "-bg")   # Browser options
+      go_to_bg = 1;
+    elseif strcmp (o, "-geometry") # Browser options
+      geo_option = varargin{i++};
+      if !ischar (geo_option)
+       assert (length (geo_option) == 2)
+       geo_option = sprintf ("--geometry %ix%i",geo_option);
+      else
+       geo_option = sprintf ("--geometry %s",geo_option);
+      end
+    end
+  end
+  s = varargin{length (varargin)};
+end
+
+if ! index (s, "Background") 
+  s = [s, vrml_Background("skyColor",[.7 .7 .9])];
+end
+
+
+vrml_b_name = "whitedune" ;
+##vrml_b_name = "/home/etienne/bin/my_freewrl.sh";
+
+##b_opt = [out_option," ",bop," ",best_option," --server --snapb octave.snap "]
+##;
+##b_opt = [out_option," ",bop," ",best_option," --server  "] ;
+##b_opt = [out_option," ",bop," ",best_option," --snapb octave_freewrl_snapshots "] ;
+b_opt = [out_option," ",bop," ",best_option, " ",geo_option] ;
+
+
+b_temp = "/tmp/octave_vrml_output.wrl" ;
+b_log  = " &> /tmp/octave_vrml_browser.log";
+
+new_browser = 0 ;
+                               # ####################################
+if vrml_b_pid > 0              # There's already a browser ##########
+
+                               # Check that browser is really alive
+
+  [status, dum] = system (sprintf ("kill -CONT %d &> /dev/null",vrml_b_pid));
+  
+  if ! status
+    if verbose
+      printf ( "vrml_browse : browser pid=%d is still alive\n",vrml_b_pid);
+    end
+  else 
+    if verbose
+      printf ( ["vrml_browse : ",\
+               "browser pid=%d died. I'll spawn another\n"], vrml_b_pid);
+    end
+    vrml_b_pid = -1 ;
+  end
+end                            # End of check if old browser's alive 
+                               # ####################################
+
+                               # ####################################
+                               # Check that temp file exists ########
+[status, dum] = system (["test -e ",b_temp]);
+if !length (s)
+
+  if verbose
+    printf( "vrml_browse : Trying to create temp file\n");
+  end
+                               # Do a sombrero
+  n = 30 ;
+  x = y = linspace (-8, 8, n)';
+  [xx, yy] = meshgrid (x, y);
+  r = sqrt (xx .^ 2 + yy .^ 2) + eps;
+  z = 3*sin (r) ./ (2*r);
+  x /= 4 ; y /= 4 ;
+
+  ##  pix = ones (n) ;
+  ##    tmp = [1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 ;\
+  ##    0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 ;\
+  ##    0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0 ;\
+  ##    0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 ;\
+  ##    1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 ];
+
+  ##    rtmp = rows(tmp)+2;
+  ##    for i=1:rtmp:n-rtmp,
+  ##      pix(i+[1:rows(tmp)],1:columns(tmp)) = tmp ;
+  ##    end
+  ##    pix = flipud (pix);
+  ##    col = [1;1;1]*pix(:)' ;
+  ## keyboard
+  rmat = [0.90000  -0.38730   0.20000;
+         0.38730   0.50000  -0.77460;
+         0.20000   0.77460   0.60000];
+  ## s = vrml_points ([x(:),y(:),z(:)],"balls");
+  ## s =  vrml_transfo (vrml_thick_surf (x,y,z, "col",col), [0.25,0,0],rmat);
+  s =  vrml_transfo (vrml_thick_surf (x,y,z), [0.25,0,0],rmat );
+end
+
+
+save_vrml (b_temp, s); # "nobg", s) ;
+                               # End of preparing temp file #########
+                               # ####################################
+
+                               # ####################################
+                               # Eventually start browser ###########
+if vrml_b_pid <= 0
+  new_browser = 1 ;
+  if verbose, 
+    printf( "vrml_browse : spawning browser ...\n");
+  end
+  ## keyboard
+                               # Starting a background browser : 
+                               # 
+                               # popen2 seems broken.
+                               # popen  had some problem, can't recall what
+                               # system "async" does not give me pid of
+                               #        browser, but pid of shell
+                               # system "sync" only returns when child
+                               #        process has exited
+                               # 
+                               # So my solution is : "system" a process that
+                               # forks. Its child is a browser. The parent
+                               # prints the child's pid (given by fork())
+                               # and exits. Octave reads the output of the
+                               # system call, which is the browser's pid.
+                               # Phew!  
+  if 1
+    cmd = [vrml_b_name," ",b_opt," ",b_temp," "]
+##  [status, out] = system (cmd = [vrml_b_name," ",b_opt," \"file:",b_temp,"\""], 1);
+    [status, out] = system (cmd = [vrml_b_name," ",b_opt," ",b_temp], 1);
+    ##  cmd
+    if status,
+    
+      printf("vrml_browse : Can't start browser '%s'. Is it installed?\n",\
+            vrml_b_name);
+      p = vrml_b_pid ;
+      return ;
+    else
+
+      vrml_b_pid = -1;
+      server_works = 0;
+    end
+    if server_works
+      vrml_b_pid = str2num (out);
+    end
+
+    if verbose, printf( "vrml_browse : OK\n"); end
+  end
+
+end                            # End of starting new browser ########
+                               # ####################################
+
+if (!new_browser) && (vrml_b_pid > 1)
+                               # ####################################
+                               # Send USR1 signal to browser to tell it to
+                               # raise itself.
+  [status, dum] = system (sprintf ("kill -USR1 %d &> /dev/null",vrml_b_pid));
+
+  if status,  
+    printf ("vrml_browse : browser pid=%d can't be signaled\n",vrml_b_pid);
+  else 
+    if verbose, 
+      printf( ["vrml_browse : USR1 sent to browser pid=%d\n"], vrml_b_pid);
+    end
+  end
+end                            # End of signaling  browser ##########
+                               # ####################################
+
+p = vrml_b_pid ;
+endfunction
+