]> Creatis software - CreaPhase.git/blobdiff - octave_packages/vrml-1.0.13/vrml_TimeSensor.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / vrml-1.0.13 / vrml_TimeSensor.m
diff --git a/octave_packages/vrml-1.0.13/vrml_TimeSensor.m b/octave_packages/vrml-1.0.13/vrml_TimeSensor.m
new file mode 100644 (file)
index 0000000..1acdb2f
--- /dev/null
@@ -0,0 +1,162 @@
+## Copyright (C) 2005-2012 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/>.
+
+##  s = vrml_TimeSensor (...)   - Low-level vrml TimeSensor node
+##  
+##  s is a vrml node with possible fields :
+##  ------------------------------------------------------------------
+## TimeSensor { 
+##   exposedField SFTime   cycleInterval 1       # (0,inf)
+##   exposedField SFBool   enabled       TRUE
+##   exposedField SFBool   loop          FALSE
+##   exposedField SFTime   startTime     0       # (-inf,inf)
+##   exposedField SFTime   stopTime      0       # (-inf,inf)
+##   eventOut     SFTime   cycleTime
+##   eventOut     SFFloat  fraction_changed      # [0, 1]
+##   eventOut     SFBool   isActive
+##   eventOut     SFTime   time
+## }
+##  ------------------------------------------------------------------
+##
+## Options :
+## Beyond all the fields of the node, it is also possible to use the option
+##
+## "DEF", name : The created node will be preceded by 'DEF name ', so that
+##               it is further possible to refer to it.
+##
+## See also : 
+
+function s = vrml_TimeSensor (varargin)
+
+verbose = 0;
+
+tpl = struct ("cycleInterval", "SFTime",\
+"startTime",     "SFTime",\
+"stopTime",      "SFTime",\
+"enabled",       "SFBool",\
+"loop",          "SFBool"
+);
+
+headpar = {};
+dnode = struct ();
+
+                               # Transform varargin into key-value pairs
+i = j = k = 1;                 # i:pos in new varargin, j:pos in headpar,
+                               # k:pos is old varargin.
+while i <= length (varargin) && \
+      ! (ischar (varargin{i}) && isfield (tpl, varargin{i}))
+  
+  if j <= length (headpar)
+
+    if verbose
+      printf ("vrml_TimeSensor : Assume arg %i is '%s'\n",k,headpar{j});
+    end
+
+    ##varargin = splice (varargin, i, 0, headpar(j));
+    varargin = {varargin{1:i-1}, headpar(j), varargin{i:end}};
+    j ++; 
+    i += 2;
+    k++;
+  else
+    error ("vrml_TimeSensor : Argument %i should be string, not '%s'",\
+          k,typeinfo (varargin{i}));
+  end
+end
+
+DEF = 0;
+
+if rem (length (varargin), 2), error ("vrml_TimeSensor : Odd n. of arguments"); end
+
+l = {"TimeSensor {\n"};
+i = 1;
+while i < length (varargin)
+
+  k = varargin{i++};   # Read key
+
+  if ! ischar (k)
+    error ("vrml_TimeSensor : Arg n. %i should be a string, not a %s.",\
+          i-1, typeinfo (k));
+  end
+  if ! isfield (tpl, k) && ! strcmp (k,"DEF")
+    error ("vrml_TimeSensor : Unknown field '%s'. Should be one of :\n%s",\
+           k, sprintf ("   '%s'\n",fieldnames (tpl)'{:}));
+  end
+
+  v = varargin{i++};   # Read value
+                               # Add DEF
+  if strcmp (k,"DEF")
+
+    if verbose, printf ("vrml_TimeSensor : Defining node '%s'\n",v); end
+
+    if DEF, error ("vrml_TimeSensor : Multiple DEFs found"); end
+    l = {sprintf("DEF %s ", v), l{:}};
+    DEF = 1;
+
+  else                         # Add data field
+
+    if verbose
+      printf ("vrml_TimeSensor : Adding '%s' of type %s, with arg of type %s\n",\
+             k,getfield(tpl,k),typeinfo (v));
+    end
+    tmp = getfield(tpl,k);
+    if strcmp (tmp(2:end), "FNode")
+
+      if verbose, printf ("vrml_TimeSensor : Trying to learn type of node\n"); end
+
+      if iscell (v)            # v is list of arguments
+
+                               # Check whether 1st arg is node type's name.
+        n = v{1};
+
+       if all (exist (["vrml_",tn]) != [2,3,5])
+                               # If it isn't type's name, use default type.
+         if isfield (dnode, k)
+           if verbose
+             printf ("vrml_TimeSensor : Using default type : %s\n",getfield(dnode,k));
+           end
+           v = {getfield(dnode,k), v{:}};
+         else
+           error ("vrml_TimeSensor : Can't determine type of node '%s'",k);
+         end
+       else
+         if verbose
+            printf ("vrml_TimeSensor : 1st list element is type : %s\n",tn);
+         end
+       end
+                               # If v is not a list, maybe it has a default
+                               # node type type (otherwise, it's be sent
+                               # plain.
+      elseif isfield (dnode, k)
+       if verbose
+         printf ("vrml_TimeSensor : Using default type : %s\n",dnode.(k));
+       end
+       v = {getfield(dnode,k), v{:}};
+      end
+    end
+    l = {l{:}, k, " ", data2vrml(getfield(tpl,k),v),"\n"};
+  end
+  
+end
+
+l{end+1} = "}\n";
+
+s = "";
+for i=1:numel(l)
+  s = [s, sprintf(l{i})];
+endfor
+### Stupid strcat removes trailing spaces in l's elements
+### s = strcat (l{:});
+endfunction
+