Index: /cpp/gdk/Makefile
===================================================================
--- /cpp/gdk/Makefile	(revision 68)
+++ /cpp/gdk/Makefile	(revision 69)
@@ -2,4 +2,15 @@
 # Framsticks GDK makefile
 #
+#
+#  frams->GDK differences:
+# -------------------------
+#  #define GDK_WITHOUT_FRAMS
+#  f0.def (removed some neurons)
+#  gen-config.h (only f1->f0 is supported)
+#  neuroimpl-body-gdk.h (dummy implementations)
+#
+#  autogenerated files can differ:
+#   defassign-f0_joint.h defassign-f0_part.h defassign-f0_neuro.h f0classes.h
+#   defassign-f0_neuroconn.h f0def.xml neurocls-library.h neurocls-factory.h model.def
 
 TARGETS=convtest gdktest genotest neurotest loadertest f0def.xml model.def
@@ -7,5 +18,5 @@
 all: $(TARGETS)
 
-CXXOPTS= -DNOCREATUREOBJECT -DEASYMAPDEBUG -g -Wno-parentheses -Wno-overloaded-virtual -Wno-format
+CXXOPTS= -DGDK_WITHOUT_FRAMS -DEASYMAPDEBUG -g -Wno-parentheses -Wno-overloaded-virtual -Wno-format
 # -DEASYMAPDEBUG is required for convtest
 
@@ -86,8 +97,4 @@
 fullclean:	clean
 	rm -f $(TARGETS) $(AUTOGENERATED)
-
-prepare: $(AUTOGENERATED) depend
-	rm -f Makefile.bak
-	~/bin/addhead ../gdk-head.txt *.h *.cpp
 
 depend:
Index: p/gdk/collectionobj.cpp
===================================================================
--- /cpp/gdk/collectionobj.cpp	(revision 68)
+++ 	(revision )
@@ -1,302 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#include "collectionobj.h"
-#include <math.h> //sqrt in borland
-#include "stderrors.h"
-
-#define FIELDSTRUCT VectorObject
-ParamEntry vector_paramtab[]=
-{
-{"Vector",1,11,"Vector","Vector is 1-dimensional array, indexed by integer value (starting from 0). "
- "Multidimensional arrays can be simulated by putting other Vector objects into the Vector.\n"
- "Example:\nvar v=Vector.new();\nv.add(123); v.add(\"string\");",},
-{"clear",0,PARAM_NOSTATIC,"clear data","p()",PROCEDURE(p_clear),},
-{"size",0,PARAM_READONLY+PARAM_NOSTATIC,"element count","d",GETONLY(size),},
-{"remove",0,PARAM_NOSTATIC,"remove at position","p(d position)",PROCEDURE(p_remove),},
-{"get",0,PARAM_NOSTATIC,"get value at position","p x(d position)",PROCEDURE(p_get),},
-{"set",0,PARAM_NOSTATIC,"set value at position","p(d position,x value)",PROCEDURE(p_set),},
-{"add",0,PARAM_NOSTATIC,"append at the end","p(x value)",PROCEDURE(p_add),},
-{"find",0,PARAM_NOSTATIC,"find","p d(x value)",PROCEDURE(p_find),"returns the element index or -1 if not found"},
-{"avg",0,PARAM_READONLY+PARAM_NOSTATIC,"average","f",GETONLY(avg)},
-{"stdev",0,PARAM_READONLY+PARAM_NOSTATIC,"standard deviation","f",GETONLY(stdev),"=sqrt(sum((element[i]-avg)^2)/(size-1)) which is estimated population std.dev. from sample std.dev."},
-{"toString",0,PARAM_READONLY+PARAM_NOSTATIC,"textual form","s",GETONLY(toString),},
-{"new",0,0,"create new Vector","p oVector()",STATICPROCEDURE(p_new),},
-{0,0,0,},
-};
-#undef FIELDSTRUCT
-
-#define FIELDSTRUCT DictionaryObject
-ParamEntry dictionary_paramtab[]=
-{
-{"Dictionary",1,9,"Dictionary","Dictionary associates stored values with string keys "
- "(\"key\" is the first argument in get/set/remove functions). Integer \"key\" can be "
- "used to enumerate all elements. The sequence of elements is not preserved.\n"
- "Example: var d=Dictionary.new(); d.set(\"name\",\"John\"); d.set(\"age\",44);\n"
- "var i,element; for(i=0;i<d.size;i++) CLI.println(d.getKey(i)+\" is \"+d.get(i));",},
-{"clear",0,PARAM_NOSTATIC,"clear data","p()",PROCEDURE(p_clear),},
-{"size",0,PARAM_NOSTATIC,"element count","d",GETONLY(size),},
-{"remove",0,PARAM_NOSTATIC,"remove named or indexed element","p(x key)",PROCEDURE(p_remove),},
-{"get",0,PARAM_NOSTATIC,"get named or indexed element","p x(x key)",PROCEDURE(p_get),},
-{"getKey",0,PARAM_NOSTATIC,"get a key of the indexed element","p s(d index)",PROCEDURE(p_getKey),},
-{"set",0,PARAM_NOSTATIC,"set named or indexed element","p(x key,x value)",PROCEDURE(p_set),},
-{"find",0,PARAM_NOSTATIC,"find","p s(x value)",PROCEDURE(p_find),"returns the element key or null if not found"},
-{"new",0,0,"create new Dictionary","p oDictionary()",STATICPROCEDURE(p_new),},
-{"toString",0,PARAM_READONLY+PARAM_NOSTATIC,"textual form","s",GETONLY(toString),},
-{0,0,0,},
-};
-#undef FIELDSTRUCT
-
-Param VectorObject::par(vector_paramtab);
-Param DictionaryObject::par(dictionary_paramtab);
-
-/////////////////////////////////////////
-
-VectorObject::VectorObject(Pt3D &pt)
-	:readonly(0),owndata(1)
-{
-set(0,ExtValue(pt.x));
-set(1,ExtValue(pt.y));
-set(2,ExtValue(pt.z));
-}
-
-void VectorObject::clear()
-{
-if (owndata)
-for(int i=data.size()-1;i>=0;i--)
-	{
-	ExtValue *v=(ExtValue*)data.get(i);
-	if (v) delete v;
-	}
-//nie tak spektakularny jak rasowe bugi roku ale tez idiotyczny :>
-//wszystko przez to ze poczatkowo bylo tylko uzywane w destruktorze...
-data.clear();
-}
-
-void VectorObject::p_remove(PARAMPROCARGS)
-{
-if (readonly) return;
-int i=args->getInt();
-if ((i<0)||(i>=data.size())) return;
-ExtValue *v=(ExtValue*)data.get(i);
-if (v) delete v;
-data-=i;
-}
-
-void VectorObject::set(int i,const ExtValue& val)
-{
-int oldsize=data.size();
-if (i<0) return;
-ExtValue *v=(ExtValue*)data.get(i);
-if (v) delete v;
-data.set(i,new ExtValue(val));
-i--;
-while(i>=oldsize)
-	{
-	data.set(i,0);
-	i--;
-	}
-}
-
-void VectorObject::p_get(PARAMPROCARGS)
-{
-int i=args->getInt();
-if (listIndexCheck(&data,i,"VectorObject","get",""))
-	{
-	ExtValue *v=get(i);
-	if (v)
-		{
-		*ret=*v;
-		return;
-		}
-	}
-*ret=ExtValue();
-}
-
-void VectorObject::get_avg(ExtValue* ret)
-{
-if (!data.size()) {ret->setEmpty(); return;}
-double s=0.0;
-for(int i=data.size()-1;i>=0;i--)
-	s+=((ExtValue*)data.get(i))->getDouble();
-s/=data.size();
-ret->setDouble(s);
-}
-
-void VectorObject::get_toString(ExtValue* ret)
-{
-SString out="[";
-static SListTempl<VectorObject*> trace;
-if (trace.find(this)>=0)
-	out+="...";
-else
-	{
-	trace+=this;
-	for(int i=0;i<data.size();i++)
-		{
-		ExtValue* v=(ExtValue*)data.get(i);
-		if (i) out+=",";
-		if (v)
-			out+=v->getString();
-		else
-			out+="null";
-		}
-	trace-=this;
-	}
-out+="]";
-ret->setString(out);
-}
-
-void VectorObject::get_stdev(ExtValue* ret)
-{
-if (!data.size()) {ret->setEmpty(); return;}
-get_avg(ret);
-double a=ret->getDouble();
-double s=0.0;
-for(int i=data.size()-1;i>=0;i--)
-	{
-	double d=a-((ExtValue*)data.get(i))->getDouble();
-	s+=d*d;
-	}
-ret->setDouble(sqrt(s/max(1,data.size()-1)));
-}
-
-void VectorObject::p_find(PARAMPROCARGS)
-{
-short i;
-for(i=0;i<data.size();i++)
-	{
-	if ((*args)==(*get(i)))
-		{ret->setInt(i);return;}
-	}
-ret->setInt(-1);
-}
-
-/////////////////////////////
-
-void DictionaryObject::clear()
-{
-for(HashEntryIterator it(hash);it.isValid();)
-	{
-        ExtValue *v=(ExtValue*)hash.remove(it);
-	if (v) delete v;
-	}
-hash.clear();
-hash.init();
-}
-
-void DictionaryObject::p_find(PARAMPROCARGS)
-{
-for(HashEntryIterator it(hash);it.isValid();it++)
-	{
-	if ((*args)==(*((ExtValue*)it->value)))
-		{
-		ret->setString(it->key);
-		return;
-		}
-	}
-ret->setEmpty();
-}
-
-HashEntryIterator* DictionaryObject::getIndexIterator(int i)
-{
-if (i<0) return 0;
-if (i>=hash.getSize()) return 0;
-
-if ((!it.isValid())||(it_index>i))
-	{
-	it=HashEntryIterator(hash);
-	it_index=0;
-	}
-while(it.isValid())
-	{
-	if (it_index==i)
-		return &it;
-	it_index++;
-	it++;
-	}
-return 0;
-}
-
-void DictionaryObject::p_remove(PARAMPROCARGS)
-{
-if ((args->type==TInt)||(args->type==TDouble))
-	{
-	HashEntryIterator* iter=getIndexIterator(args->getInt());
-	if (iter)
-		{
-		ExtValue *oldval=(ExtValue*)hash.remove(*iter);
-		if (oldval) {*ret=*oldval; delete oldval;} else *ret=ExtValue();
-		}
-	}
-else
-	{
-	ExtValue *oldval=(ExtValue*)hash.remove(args[0].getString());
-	if (oldval) {*ret=*oldval; delete oldval;} else *ret=ExtValue();
-	}
-}
-
-void DictionaryObject::p_get(PARAMPROCARGS)
-{
-if ((args->type==TInt)||(args->type==TDouble))
-	{
-	HashEntryIterator* iter=getIndexIterator(args->getInt());
-	if (iter && (*iter)->value)
-		{
-		*ret=*((ExtValue*)(*iter)->value);
-		return;
-		}
-	}
-else
-	{
-	ExtValue *val=(ExtValue*)hash.get(args[0].getString());
-	if (val)
-		{
-		*ret=*val;
-		return;
-		}
-	}
-*ret=ExtValue();
-}
-
-void DictionaryObject::p_getKey(PARAMPROCARGS)
-{
-HashEntryIterator* iter=getIndexIterator(args->getInt());
-if (iter)
-	{
-	*ret=(*iter)->key;
-	return;
-	}
-*ret=ExtValue();
-}
-
-void DictionaryObject::p_set(PARAMPROCARGS)
-{
-ExtValue *newval=(args[0].getType()==TUnknown)?0:new ExtValue(args[0]);
-ExtValue *oldval=(ExtValue*)hash.put(args[1].getString(),newval);
-if (oldval) {*ret=*oldval; delete oldval;} else *ret=ExtValue();
-}
-
-void DictionaryObject::get_toString(ExtValue* ret)
-{
-SString out="[";
-static SListTempl<DictionaryObject*> trace;
-if (trace.find(this)>=0)
-	out+="...";
-else
-	{
-	trace+=this;
-	for(HashEntryIterator it(hash);it.isValid();)
-		{
-		out+=it->key;
-		out+="=";
-		out+=((ExtValue*)it->value)->getString();
-		it++;
-		if (it.isValid()) out+=",";
-		}
-	trace-=this;
-	}
-out+="]";
-ret->setString(out);
-}
Index: p/gdk/collectionobj.h
===================================================================
--- /cpp/gdk/collectionobj.h	(revision 68)
+++ 	(revision )
@@ -1,74 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#ifndef _COLLECTIONOBJ_H_
-#define _COLLECTIONOBJ_H_
-
-#include "param.h"
-#include "extvalue.h"
-#include "hashtable.h"
-#include "3d.h"
-
-/** object collection, indexed by int */
-class VectorObject: public DestrBase
-{
-  public:
-SList data;
-int readonly:1, owndata:1;
-void clear();
-ExtValue *get(int i) {return (ExtValue*)data.get(i);}
-void set(int i,const ExtValue& val);
-
-static Param par;
-VectorObject(Pt3D& pt);
-VectorObject():readonly(0),owndata(1) {}
-~VectorObject() {clear();}
-#define STATRICKCLASS VectorObject
-PARAMPROCDEF(p_clear) {if (readonly) return; clear();}
-PARAMGETDEF(size) {arg1->setInt(data.size());}
-PARAMGETDEF(avg);
-PARAMGETDEF(stdev);
-PARAMPROCDEF(p_remove);
-PARAMPROCDEF(p_get);
-PARAMPROCDEF(p_find);
-PARAMPROCDEF(p_set) {if (!readonly) set(arg1[1].getInt(),arg1[0]);}
-PARAMPROCDEF(p_add) {if (readonly) return; data+=new ExtValue(arg1[0]);arg2->setInt(data.size()-1);}
-PARAMGETDEF(toString);
-#undef STATRICKCLASS
-static void p_new(void*,ExtValue*args,ExtValue*ret)
-	{ret->setObject(ExtObject(&par,new VectorObject));}
-
-ExtObject makeObject()
-	{return ExtObject(&par,this);}
-};
-
-/** object collection, indexed by name */
-class DictionaryObject: public DestrBase
-{
-  public:
-HashTable hash;
-HashEntryIterator it;
-int it_index;
-
-void clear();
-HashEntryIterator* getIndexIterator(int i);
-
-static Param par;
-DictionaryObject():it_index(-1),it(hash) {}
-~DictionaryObject() {clear();}
-#define STATRICKCLASS DictionaryObject
-PARAMPROCDEF(p_clear) {clear();}
-PARAMGETDEF(size) {arg1->setInt(hash.getSize());}
-PARAMPROCDEF(p_remove);
-PARAMPROCDEF(p_get);
-PARAMPROCDEF(p_getKey);
-PARAMPROCDEF(p_set);
-PARAMPROCDEF(p_find);
-PARAMGETDEF(toString);
-#undef STATRICKCLASS
-static void p_new(void*,ExtValue*args,ExtValue*ret)
-	{ret->setObject(ExtObject(&par,new DictionaryObject));} //NOWY KANDYDAT NA BUGA ROKU!!!
-};
-
-#endif
Index: /cpp/gdk/defassign-f0_joint.h
===================================================================
--- /cpp/gdk/defassign-f0_joint.h	(revision 68)
+++ /cpp/gdk/defassign-f0_joint.h	(revision 69)
@@ -1,6 +1,2 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
 
 
Index: /cpp/gdk/defassign-f0_neuro.h
===================================================================
--- /cpp/gdk/defassign-f0_neuro.h	(revision 68)
+++ /cpp/gdk/defassign-f0_neuro.h	(revision 69)
@@ -1,6 +1,2 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
 
 
Index: /cpp/gdk/defassign-f0_neuroconn.h
===================================================================
--- /cpp/gdk/defassign-f0_neuroconn.h	(revision 68)
+++ /cpp/gdk/defassign-f0_neuroconn.h	(revision 69)
@@ -1,6 +1,2 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
 
 
Index: /cpp/gdk/defassign-f0_part.h
===================================================================
--- /cpp/gdk/defassign-f0_part.h	(revision 68)
+++ /cpp/gdk/defassign-f0_part.h	(revision 69)
@@ -1,6 +1,2 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
 
 // default assignments for Part : 
Index: /cpp/gdk/f0.def
===================================================================
--- /cpp/gdk/f0.def	(revision 68)
+++ /cpp/gdk/f0.def	(revision 69)
@@ -139,23 +139,4 @@
 ENDNEUROCLASS
 
-NEUROCLASS(VectorEye,VEye,Vector Eye [EXPERIMENTAL!],Refer to publications to learn more about this neuron.,1,1,1)
-SYMBOL(`11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24')
-NEUROPROP(tx,0,0,target.x,f,,,,target.x)
-NEUROPROP(ty,0,0,target.y,f,,,,target.y)
-NEUROPROP(tz,0,0,target.z,f,,,,target.z)
-NEUROPROP(ts,0,0,target shape,s,0,-1,0,targetShape)
-NEUROPROP(p,0,0,perspective,f,0.1,10.0,1.0,perspz)
-NEUROPROP(s,0,0,scale,f,0.1,100.0,1.0,perspscale)
-NEUROPROP(h,0,0,show hidden lines,d,0,1,0,showhidden)
-NEUROPROP(o,0,0,`output lines count (each line needs four channels)',d,0,99,0,outputcount)
-NEUROPROP(d,0,0,debug,d,0,1,0,showdebug)
-ENDNEUROCLASS
-
-NEUROCLASS(VisualMotorNeuron,VMotor,Visual-Motor Cortex [EXPERIMENTAL!],`Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.',-1,1,0)
-NEUROPROP(noIF,0,0,number of basic features,d,,,,noIF)
-NEUROPROP(noDim,0,0,number of degrees of freedom,d,,,,noDim)
-NEUROPROP(params,0,0,parameters,s,,,,params)
-ENDNEUROCLASS 
-
 NEUROCLASS(Sticky,Sti,Sticky [EXPERIMENTAL!],,1,0,1)
 VISUALHINTS(EffectorClass)
@@ -196,3 +177,2 @@
 NEUROPROP(t,0,0,time,f,0,6.283185307,0,t)
 ENDNEUROCLASS
-
Index: /cpp/gdk/f0classes.h
===================================================================
--- /cpp/gdk/f0classes.h	(revision 68)
+++ /cpp/gdk/f0classes.h	(revision 69)
@@ -156,5 +156,2 @@
 
 
-
-
-
Index: /cpp/gdk/f0def.xml
===================================================================
--- /cpp/gdk/f0def.xml	(revision 68)
+++ /cpp/gdk/f0def.xml	(revision 69)
@@ -130,23 +130,4 @@
  </NEUROCLASS>
 
- <NEUROCLASS ID="VEye" NAME="Vector Eye [EXPERIMENTAL!]" DESCRIPTION="Refer to publications to learn more about this neuron." INPUTS="1" OUTPUT="1" LOCATION="1"  SYMBOL="11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24"  >
-
-  <NEUROPROP ID="tx" NAME="target.x" TYPE="f" MIN="" MAX="" DEF="" />
-  <NEUROPROP ID="ty" NAME="target.y" TYPE="f" MIN="" MAX="" DEF="" />
-  <NEUROPROP ID="tz" NAME="target.z" TYPE="f" MIN="" MAX="" DEF="" />
-  <NEUROPROP ID="ts" NAME="target shape" TYPE="s" MIN="0" MAX="-1" DEF="0" />
-  <NEUROPROP ID="p" NAME="perspective" TYPE="f" MIN="0.1" MAX="10.0" DEF="1.0" />
-  <NEUROPROP ID="s" NAME="scale" TYPE="f" MIN="0.1" MAX="100.0" DEF="1.0" />
-  <NEUROPROP ID="h" NAME="show hidden lines" TYPE="d" MIN="0" MAX="1" DEF="0" />
-  <NEUROPROP ID="o" NAME="output lines count (each line needs four channels)" TYPE="d" MIN="0" MAX="99" DEF="0" />
-  <NEUROPROP ID="d" NAME="debug" TYPE="d" MIN="0" MAX="1" DEF="0" />
- </NEUROCLASS>
-
- <NEUROCLASS ID="VMotor" NAME="Visual-Motor Cortex [EXPERIMENTAL!]" DESCRIPTION="Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron." INPUTS="-1" OUTPUT="1" LOCATION="0"  >
-  <NEUROPROP ID="noIF" NAME="number of basic features" TYPE="d" MIN="" MAX="" DEF="" />
-  <NEUROPROP ID="noDim" NAME="number of degrees of freedom" TYPE="d" MIN="" MAX="" DEF="" />
-  <NEUROPROP ID="params" NAME="parameters" TYPE="s" MIN="" MAX="" DEF="" />
- </NEUROCLASS> 
-
  <NEUROCLASS ID="Sti" NAME="Sticky [EXPERIMENTAL!]" DESCRIPTION="" INPUTS="1" OUTPUT="0" LOCATION="1"  VISUALHINTS="16"  >
 
@@ -188,4 +169,3 @@
  </NEUROCLASS>
 
-
 </F0CLASSES>
Index: p/gdk/hashtable.cpp
===================================================================
--- /cpp/gdk/hashtable.cpp	(revision 68)
+++ 	(revision )
@@ -1,195 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#include "hashtable.h"
-
-int HashTable::hash(const char *s)
-{
-int h=0;
-char c;
-while(c=*(s++))
-    h=31*h+c;
-return h&0x7fffffff;
-}
-
-void HashTable::init(int initsize,float lo)
-{
-size=initsize;
-load=lo;
-threshold=(int)(load*size);
-tab=(HashEntry**)calloc(size,sizeof(HashEntry*));
-count=0;
-sync=0;
-}
-
-void HashTable::rehash(int newsize)
-{
-if (newsize==size) return;
-HashEntry **newtab=(HashEntry**)calloc(newsize,sizeof(HashEntry*));
-HashEntry **te=tab,*e,*ne;
-int i;
-for (int s=size;s>0;s--,te++)
-    for (e=*te;e;)
-	{
-	    ne=e; e=e->next;
-	    i=ne->hash%newsize;
-	    ne->next=newtab[i];
-	    newtab[i]=ne;
-	}
-free(tab);
-tab=newtab;
-size=newsize;
-threshold=int(load*size);
-sync++;
-}
-
-void HashTable::clear()
-{
-HashEntry *e,**te,*next;
-int n;
-for (n=size,te=tab;n>0;n--,te++)
-	for (e=*te;e;e=next)
-		{
-		next=e->next;
-		delete e;
-		}
-if (tab) free(tab);
-tab=0; size=0;
-sync++;
-}
-
-HashTable::~HashTable()
-{
-clear();
-}
-
-void* HashTable::put(const SString& key,void *value)
-{
-int h=hash(key);
-int i=h%size;
-for (HashEntry *e=tab[i];e;e=e->next)
-    {
-    if (e->key==key)
-	{
-	void *v=e->value;
-	e->value=value;
-	return v;
-	}
-    }
-if (count>=threshold) { rehash(2*size+1); i=h%size; }
-HashEntry *e=new HashEntry(h,key,value);
-e->next=tab[i];
-tab[i]=e;
-count++;
-sync++;
-return 0;
-}
-
-void* HashTable::remove(const SString& key)
-{
-int i=hash(key)%size;
-HashEntry **ptr=tab+i,*e;
-for (;e=*ptr;ptr=&e->next)
-    {
-    if (e->key==key)
-	{
-	*ptr=e->next;
-	void *v=e->value;
-	delete e;
-	count--;
-	sync++;
-	return v;
-	}
-    }
-return 0;
-}
-
-void* HashTable::remove(HashEntryIterator& it)
-{
-if (!it.entry) return 0;
-HashEntry **ptr=tab+it.hashindex,*e;
-for (;e=*ptr;ptr=&e->next)
-    {
-    if (e == it.entry)
-	{
-	it++;
-	*ptr=e->next;
-	void *v=e->value;
-	delete e;
-	count--;
-	sync++;
-	it.sync++;
-	return v;
-	}
-    }
-   return NULL; 
-}
-
-void* HashTable::get(const SString& key,int *reallygot)
-{
-int i=hash(key)%size;
-for (HashEntry *e=tab[i];e;e=e->next)
-	if (e->key==key) {if (reallygot) *reallygot=1; return e->value;}
-return 0;
-}
-
-/////////
-
-void HashEntryIterator::findNext()
-{
-while (hashindex < (ht->size-1))
-	{
-	hashindex++;
-	if (entry=ht->tab[hashindex]) return;
-	}
-}
-
-
-void HashEntryIterator::operator++()
-{
-if (entry) entry=entry->next;
-if (!entry) findNext();
-}
-
-//////////////////////////
-
-void HashTable::debugprint()
-{
-printf("HashTable: %d/%d (max %d)\n",count,size,threshold);
-HashEntry *e,**te;
-int n;
-for (n=0,te=tab;n<size;n++,te++)
-	if (e=*te)
-	{
-	printf(" %d:",n);
-	for (;e;e=e->next)
-		printf(" (%x)%s=%p",e->hash,(const char*)e->key,e->value);
-	printf("\n");
-	}
-}
-
-/**
-stats[0]=buckets used
-stats[1]=min keys in bucket
-stats[2]=avg keys in bucket
-stats[3]=max keys in bucket
- */
-void HashTable::getstats(float *stats)
-{
-HashEntry *e,**te;
-int used=0, ma=0, mi=count;
-int c,n;
-for (n=size,te=tab;n>0;n--,te++)
-	{
-	c=0;
-	for (e=*te;e;e=e->next) c++;
-	if (c>ma) ma=c;
-	if ((c<mi)&&(c>0)) mi=c;
-	if (c>0) used++;
-	}
-stats[0]=used;
-stats[1]=(mi==count)?0:mi;
-stats[2]=(float)count/(float)used;
-stats[3]=ma;
-}
Index: p/gdk/hashtable.h
===================================================================
--- /cpp/gdk/hashtable.h	(revision 68)
+++ 	(revision )
@@ -1,84 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#ifndef _HASHTABLE_H_
-#define _HASHTABLE_H_
-
-#include "sstring.h"
-
-class HashEntry
-{
-public:
-int hash;
-SString key;
-void *value;
-HashEntry *next;
-
-HashEntry(int h,const SString& k,void *v):hash(h),key(k),value(v),next(0){}
-};
-
-class HashEntryIterator;
-
-class HashTable
-{
-friend class HashEntryIterator;
-HashEntry **tab;
-int size;
-int count;
-int threshold;
-float load;
-long sync;
-
-int hash(const char *s);
-void rehash(int newsize);
-public:
-
-HashTable(int initsize,float lo) {init(initsize,lo);}
-HashTable(int initsize) {init(initsize,0.75);}
-HashTable() {init();}
-~HashTable();
-
-/** always use init() after clear() ! */
-void clear();
-void init(int initsize=11,float lo=0.75);
-
-int getSize() {return count;}
-void* put(const SString& key,void *value);
-void* get(const SString& key, int *reallygot=0);
-void* remove(const SString& key);
-/** can be used inside iteration loop:
-    for(HashEntryIterator it(hashtable);it;) hashtable.remove(it);
-    \note iterator is "iterated" to the next entry when the current one is removed (no "it++"!)
- */
-void* remove(HashEntryIterator& it);
-
-void debugprint();
-void getstats(float *);
-};
-
-/** for(HashEntryIterator it(hashtable);it;it++)
-      {
-      ... it->value
-      ... it->key
-      }
- */
-class HashEntryIterator
-{
-void findNext();
-  public:
-HashTable *ht;
-int hashindex;
-HashEntry *entry;
-int sync;
-  HashEntryIterator(HashTable&t):ht(&t),hashindex(0),entry(t.tab[0]),sync(ht->sync)
-	{if (!entry) findNext();}
-  HashEntryIterator() {}
-void operator++();
-void operator++(int) {operator++();}
-HashEntry* operator->() {return entry;}
-bool isValid() {return (entry&&(sync==ht->sync))?1:0;}
-};
-
-
-#endif
Index: /cpp/gdk/model.def
===================================================================
--- /cpp/gdk/model.def	(revision 68)
+++ /cpp/gdk/model.def	(revision 69)
@@ -59,4 +59,5 @@
 prop:id=getInputNeuroIndex,name="get input neuron index",group="Connections",flags=1+2,type="p d(d)   "
 prop:id=getInputWeight,name="get input weight",group="Connections",flags=1+2,type="p f(d)   "
+prop:id=classObject,name="neuron class",group="Connections",flags=1+2,type="o NeuroClass   "
 
 
@@ -101,5 +102,5 @@
 
 
-neuro: id=*,name="Constant",info="Constant value",inputs=0,output=1,location=0  ,vhints=1  ,symbol="3,6,100,50,90,50,90,40,70,40,70,60,90,60,90,50,1,85,50,75,50,1,80,45,80,55" 
+neuro: id=*,name="Constant",info="Constant value",inputs=0,output=1,location=0  ,vhints=1  ,symbol="4,4,26,27,26,73,73,73,73,27,26,27,1,73,50,100,50,1,56,68,46,68,2,41,47,51,32,51,68" 
 
 
@@ -119,8 +120,9 @@
 
 
-neuro: id=D,name="Differentiate",info="Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights",inputs=-1,output=1,location=0 
+neuro: id=D,name="Differentiate",info="Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights",inputs=-1,output=1,location=0  ,symbol="3,3,25,0,25,100,75,50,25,0,1,75,50,100,50,3,44,42,51,57,36,57,44,42" 
 
 
-neuro: id=Fuzzy,name="Fuzzy system [EXPERIMENTAL!]",info="Refer to publications to learn about this neuron",inputs=-1,output=1,location=0  ,symbol="5,2,30,65,37,37,44,65,3,37,65,44,37,51,37,58,65,2,51,65,58,37,65,65,6,100,50,70,50,70,25,25,10,25,90,70,75,70,50,1,70,65,25,65" 
+
+neuro: id=Fuzzy,name="Fuzzy system [EXPERIMENTAL!]",info="Refer to publications to learn more about this neuron.",inputs=-1,output=1,location=0  ,symbol="5,2,30,65,37,37,44,65,3,37,65,44,37,51,37,58,65,2,51,65,58,37,65,65,6,100,50,70,50,70,25,25,10,25,90,70,75,70,50,1,70,65,25,65" 
 
 prop:id=ns,name="number of fuzzy sets",type="d 1  "
@@ -130,28 +132,9 @@
 
 
-neuro: id=VEye,name="Vector Eye [EXPERIMENTAL!]",info="",inputs=1,output=1,location=1  ,symbol="11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24" 
-
-prop:id=tx,name="target.x",type="f   "
-prop:id=ty,name="target.y",type="f   "
-prop:id=tz,name="target.z",type="f   "
-prop:id=ts,name="target shape",type="s 0 -1 0"
-prop:id=p,name="perspective",type="f 0.1 10.0 1.0"
-prop:id=s,name="scale",type="f 0.1 100.0 1.0"
-prop:id=h,name="show hidden lines",type="d 0 1 0"
-prop:id=o,name="output lines count (each line needs four channels)",type="d 0 99 0"
-prop:id=d,name="debug",type="d 0 1 0"
-
-
-neuro: id=VMotor,name="Visual-Motor Cortex [EXPERIMENTAL!]",info="Must be connected to the VEye and properly set up.",inputs=-1,output=1,location=0 
-prop:id=noIF,name="number of basic features",type="d   "
-prop:id=noDim,name="number of degrees of freedom",type="d   "
-prop:id=params,name="parameters",type="s   "
- 
-
-neuro: id=Sti,name="Sticky [EXPERIMENTAL!]",info="",inputs=1,output=0,location=1  ,vhints=32 
+neuro: id=Sti,name="Sticky [EXPERIMENTAL!]",info="",inputs=1,output=0,location=1  ,vhints=16 
 
 
 
-neuro: id=LMu,name="Length muscle [EXPERIMENTAL!]",info="",inputs=1,output=0,location=2  ,vhints=16 
+neuro: id=LMu,name="Linear muscle [EXPERIMENTAL!]",info="",inputs=1,output=0,location=2  ,vhints=16 
 
 prop:id=p,name="power",type="f 0.01 1.0 1.0"
@@ -166,11 +149,14 @@
 
 
-neuro: id=Ch,name="Channelize",info="Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.",inputs=-1,output=1,location=0 
+neuro: id=Ch,name="Channelize",info="Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.",inputs=-1,output=1,location=0  ,symbol="10,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,1,30,80,55,50,1,30,20,55,50,1,30,35,55,50,1,30,45,55,50,1,30,55,55,50,1,61,53,65,47,1,30,65,55,50" 
 
 
-neuro: id=ChMux,name="Channel multiplexer",info="Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)",inputs=2,output=1,location=0 
+
+neuro: id=ChMux,name="Channel multiplexer",info="Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)",inputs=2,output=1,location=0  ,symbol="7,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,3,50,55,55,50,50,45,50,55,3,30,67,45,67,45,50,50,50,1,35,70,39,64,2,30,33,53,33,53,48" 
 
 
-neuro: id=ChSel,name="Channel selector",info="Outputs a single channel (selected by the \"ch\" parameter) from multichannel input",inputs=1,output=1,location=0 
+
+neuro: id=ChSel,name="Channel selector",info="Outputs a single channel (selected by the \"ch\" parameter) from multichannel input",inputs=1,output=1,location=0  ,symbol="6,4,25,0,25,100,75,70,75,30,25,0,1,75,50,100,50,1,70,50,55,50,3,50,55,55,50,50,45,50,55,1,30,50,50,50,1,35,53,39,47" 
+
 prop:id=ch,name="channel",type="d   "
 
Index: /cpp/gdk/modelparts.cpp
===================================================================
--- /cpp/gdk/modelparts.cpp	(revision 68)
+++ /cpp/gdk/modelparts.cpp	(revision 69)
@@ -22,5 +22,7 @@
 #include "extvalue.h"
 
+#ifndef GDK_WITHOUT_FRAMS
 #include "neuroclsobject.h"
+#endif
 
 template<>
@@ -528,5 +530,7 @@
 void Neuro::get_classObject(PARAMGETARGS)
 {
+#ifndef GDK_WITHOUT_FRAMS
 NeuroClassExt::makeStaticObject(ret,getClass());
+#endif
 }
 
Index: /cpp/gdk/neurocls-factory.h
===================================================================
--- /cpp/gdk/neurocls-factory.h	(revision 68)
+++ /cpp/gdk/neurocls-factory.h	(revision 69)
@@ -83,28 +83,4 @@
 #undef FIELDSTRUCT
 
-#define FIELDSTRUCT NI_VectorEye 
-ParamEntry NI_VectorEye_tab []={
-{"Vector Eye [EXPERIMENTAL!]",1, 9 ,"VEye",},
-{"tx",0,0,"target.x","f   ",FIELD(target.x),},
-{"ty",0,0,"target.y","f   ",FIELD(target.y),},
-{"tz",0,0,"target.z","f   ",FIELD(target.z),},
-{"ts",0,0,"target shape","s 0 -1 0",FIELD(targetShape),},
-{"p",0,0,"perspective","f 0.1 10.0 1.0",FIELD(perspz),},
-{"s",0,0,"scale","f 0.1 100.0 1.0",FIELD(perspscale),},
-{"h",0,0,"show hidden lines","d 0 1 0",FIELD(showhidden),},
-{"o",0,0,"output lines count (each line needs four channels)","d 0 99 0",FIELD(outputcount),},
-{"d",0,0,"debug","d 0 1 0",FIELD(showdebug),},
- {0,0,0,},};
-#undef FIELDSTRUCT
-
-#define FIELDSTRUCT NI_VisualMotorNeuron 
-ParamEntry NI_VisualMotorNeuron_tab []={
-{"Visual-Motor Cortex [EXPERIMENTAL!]",1, 3 ,"VMotor",},
-{"noIF",0,0,"number of basic features","d   ",FIELD(noIF),},
-{"noDim",0,0,"number of degrees of freedom","d   ",FIELD(noDim),},
-{"params",0,0,"parameters","s   ",FIELD(params),},
- {0,0,0,},};
-#undef FIELDSTRUCT 
-
 #define FIELDSTRUCT NI_Sticky 
 ParamEntry NI_Sticky_tab []={
@@ -165,5 +141,4 @@
 #undef FIELDSTRUCT
 
-
 #define SETIMPLEMENTATION \
 setImplementation("N",new NI_StdNeuron); \
@@ -177,6 +152,4 @@
 setImplementation("D",new NI_Diff); \
 setImplementation("Fuzzy",new NI_FuzzyNeuro); \
-setImplementation("VEye",new NI_VectorEye); \
-setImplementation("VMotor",new NI_VisualMotorNeuron); \
 setImplementation("Sti",new NI_Sticky); \
 setImplementation("LMu",new NI_LinearMuscle); \
Index: /cpp/gdk/neurocls-library.h
===================================================================
--- /cpp/gdk/neurocls-library.h	(revision 68)
+++ /cpp/gdk/neurocls-library.h	(revision 69)
@@ -108,31 +108,4 @@
 addClass(new NeuroClass(NI_FuzzyNeuro_tab,"Refer to publications to learn more about this neuron.",-1,1,0, FuzzyNeuro_xy,0,0));
 
-     static int VectorEye_xy[]={122,11,7,100,50,90,50,90,40,70,40,80,50,70,60,90,60,90,50,14,70,50,65,40,60,35,45,30,30,30,15,35,10,40,5,50,10,60,15,65,30,70,45,70,60,65,65,60,70,50,8,38,67,28,62,23,52,28,42,38,37,48,42,53,52,48,62,38,67,4,33,52,38,47,43,52,38,57,33,52,5,70,50,60,40,45,35,30,35,15,40,5,50,1,53,33,58,22,1,62,36,68,26,1,45,30,47,19,1,35,30,35,19,1,27,31,24,20,1,18,34,12,24};   
-static ParamEntry NI_VectorEye_tab[]={
-{"Vector Eye [EXPERIMENTAL!]",1, 9 ,"VEye",},
-
-{"tx",0,0,"target.x","f   ",},
-{"ty",0,0,"target.y","f   ",},
-{"tz",0,0,"target.z","f   ",},
-{"ts",0,0,"target shape","s 0 -1 0",},
-{"p",0,0,"perspective","f 0.1 10.0 1.0",},
-{"s",0,0,"scale","f 0.1 100.0 1.0",},
-{"h",0,0,"show hidden lines","d 0 1 0",},
-{"o",0,0,"output lines count (each line needs four channels)","d 0 99 0",},
-{"d",0,0,"debug","d 0 1 0",},
- 
-{0,0,0,},};
-addClass(new NeuroClass(NI_VectorEye_tab,"Refer to publications to learn more about this neuron.",1,1,1, VectorEye_xy,0,0));
-
-     
-static ParamEntry NI_VisualMotorNeuron_tab[]={
-{"Visual-Motor Cortex [EXPERIMENTAL!]",1, 3 ,"VMotor",},
-{"noIF",0,0,"number of basic features","d   ",},
-{"noDim",0,0,"number of degrees of freedom","d   ",},
-{"params",0,0,"parameters","s   ",},
- 
-{0,0,0,},};
-addClass(new NeuroClass(NI_VisualMotorNeuron_tab,"Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.",-1,1,0, 0,0)); 
-
      
 static ParamEntry NI_Sticky_tab[]={
@@ -209,3 +182,2 @@
 {0,0,0,},};
 addClass(new NeuroClass(NI_Sinus_tab,"Output frequency = f0+input",1,1,0, Sinus_xy,0,0));
-
Index: p/gdk/neuroclsobject.cpp
===================================================================
--- /cpp/gdk/neuroclsobject.cpp	(revision 68)
+++ 	(revision )
@@ -1,129 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#include "neuroclsobject.h"
-#include "neurolibrary.h"
-#include "paramvmobj.h"
-
-#define FIELDSTRUCT NeuroClassExt
-ParamEntry neuroclass_paramtab[]=
-{
-{"NeuroClass",1,10,"NeuroClass","The static NeuroClass object refers to class selected in the NeuroClassLibrary."},
-{"name",0,0,"Class name","s",FIELD(name),},
-{"longname",0,0,"Long, human readable name","s",FIELD(longname),},
-{"description",0,0,"Long description","s",FIELD(description),},
-{"prefinputs",0,0,"Preferred number of inputs","d",FIELD(prefinputs),},
-{"prefoutput",0,0,"Provides output","d 0 1",FIELD(prefoutput),},
-{"preflocation",0,0,"Preferred body location","d 0 2 ~None~Part~Joint",FIELD(preflocation),},
-{"visualhints",0,0,"Visual hints","d",FIELD(visualhints),},
-{"glyph",0,0,"Glyph vector data","s",GETSET(glyph),},
-{"properties",0,0,"Interface object connected with neuron class properties","o Interface",GETONLY(props),},
-{"summary",0,0,"Summary","s",GETONLY(summary),"Textual summary of all features",},
-{0,0,0,},
-}; 
-#undef FIELDSTRUCT
-
-static Param static_neuroclassparam(neuroclass_paramtab);
-
-void NeuroClassExt::makeStaticObject(ExtValue *ret,NeuroClass *cl)
-{
-if (cl)
-	*ret=ExtObject(&static_neuroclassparam,cl);
-else
-	ret->setEmpty();
-}
-
-#define FIELDSTRUCT NeuroClassLibObject
-ParamEntry neuroclasslib_paramtab[]=
-{
-{"NeuroClassLibrary",1,4,"NeuroClassLibrary","Set of Neuron classes. You can access the selected class in the static NeuroClass object.",},
-{"count",0,0,"class count","d",GETONLY(count),},
-{"class",0,0,"current class","d",SETFIELD(current),"0 ... count-1"},
-{"findClass",0,0,"select class by name","p(s class name)",PROCEDURE(p_findclass),},
-{"getClass",0,0,"get class object by name","p NeuroClass(s class name)",PROCEDURE(p_getclass),},
-{0,0,0,},
-}; 
-#undef FIELDSTRUCT
-
-/////////////////////
-
-NeuroClassLibObject::NeuroClassLibObject():
-	param(neuroclasslib_paramtab,this),
-	classparam(neuroclass_paramtab),
-	current(0)
-{
-selectClass(-1);
-}
-
-void NeuroClassLibObject::selectClass(int i)
-{
-if (i >= lib().getClassCount()) i=-1;
-if (current!=i)
-	{
-	current=i;
-	classparam.select((i>=0)?lib().getClass(i):&invalid);
-	}
-}
-
-int NeuroClassLibObject::set_current(PARAMSETARGS)
-{
-selectClass(arg->getInt());
-return PSET_CHANGED;
-}
-
-void NeuroClassLibObject::p_findclass(PARAMPROCARGS)
-{
-selectClass(lib().findClassIndex(args->getString()));
-}
-
-void NeuroClassLibObject::p_getclass(PARAMPROCARGS)
-{
-int i=lib().findClassIndex(args->getString());
-NeuroClassExt::makeStaticObject(ret,(i>=0)?lib().getClass(i):0);
-}
-
-int* NeuroClassLibObject::convertVectorData(const SString& s)
-{
-SList t;
-int pos=0;
-SString n;
-while(s.getNextToken(pos,n,','))
-	t+=(void*)atol((const char*)n);
-int *ret;
-if (!t.size()) return 0;
-ret=new int[t.size()];
-for (int i=0;i<t.size();i++)
-	ret[i]=(long)t(i);
-return ret;
-}
-
-int NeuroClassExt::set_glyph(PARAMSETARGS)
-{
-setSymbolGlyph(NeuroClassLibObject::convertVectorData(arg->getString()));
-return PSET_CHANGED;
-}
-
-void NeuroClassExt::get_glyph(PARAMGETARGS)
-{
-SString txt;
-if (vectordata)
-	{
-	int *d=vectordata;
-	int len=*(d++);
-	txt+=SString::valueOf(len);
-	for (;len>0;len--)
-		{
-		txt+=',';
-		txt+=SString::valueOf(*(d++));
-		}
-	}
-ret->setString(txt);
-}
-
-void NeuroClassExt::get_props(PARAMGETARGS)
-{
-static Param par;
-par=getProperties();
-ret->setObject(ParamVMObj::makeObject(&par));
-}
Index: p/gdk/neuroclsobject.h
===================================================================
--- /cpp/gdk/neuroclsobject.h	(revision 68)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#ifndef _NEUROCLSOBJECT_H_
-#define _NEUROCLSOBJECT_H_
-
-#include "modelparts.h"
-#include "neurolibrary.h"
-#include "extvalue.h"
-
-extern ParamEntry neuroclass_paramtab[];
-
-class NeuroClassLibObject
-{
-NeuroLibrary& lib() {return NeuroLibrary::staticlibrary;}
-  public:
-Param param,classparam;
-NeuroClass invalid;
-NeuroClass *cls;
-long current;
-NeuroClassLibObject();
-void selectClass(int i);
-static int* convertVectorData(const SString& s);
-#define STATRICKCLASS NeuroClassLibObject
-PARAMSETDEF(current);
-PARAMGETDEF(count) {arg1->setInt(lib().getClassCount());}
-PARAMPROCDEF(p_findclass);
-PARAMPROCDEF(p_getclass);
-#undef STATRICKCLASS
-};
-
-class NeuroClassExt: public NeuroClass
-{
-  public:
-#define STATRICKCLASS NeuroClassExt
-PARAMSETDEF(glyph);
-PARAMGETDEF(glyph);
-PARAMGETDEF(props);
-PARAMGETDEF(summary) {arg1->setString(getSummary());}
-#undef STATRICKCLASS
-static void makeStaticObject(ExtValue *ret,NeuroClass *cl);
-};
-
-#endif
-
-
-
-
-
-
-
Index: /cpp/gdk/neuroimpl-body-gdk.h
===================================================================
--- /cpp/gdk/neuroimpl-body-gdk.h	(revision 68)
+++ /cpp/gdk/neuroimpl-body-gdk.h	(revision 69)
@@ -16,10 +16,13 @@
 };
 
+extern ParamEntry NI_Touch_tab[];
 class NI_Touch: public NeuroImpl
 {
 public:
+double range;
 NeuroImpl* makeNew(){return new NI_Touch();} // for NeuroFactory
 int lateinit() {if (!neuro->part) return 0; simorder=0; return 1;}
 void go() {setState(0);}
+NI_Touch():range(1) {paramentries=NI_Touch_tab;}
 };
 
Index: /cpp/gdk/neuroimpl.cpp
===================================================================
--- /cpp/gdk/neuroimpl.cpp	(revision 68)
+++ /cpp/gdk/neuroimpl.cpp	(revision 69)
@@ -5,7 +5,5 @@
 #include "neuroimpl.h"
 #include "neurofactory.h"
-#ifdef NOCREATUREOBJECT
-#include "neuroclsobject.h"
-#else
+#ifndef GDK_WITHOUT_FRAMS
 #include "creature.h"
 #include "creatmechobj.h"
@@ -446,5 +444,5 @@
 Creature* NeuroImpl::getCreature()
 {
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 CreatMechObject *cmo=(CreatMechObject *)neuro->owner->userdata[CreatMechObject::modeltags_id];
 return cmo->creature;
@@ -456,5 +454,5 @@
 void NeuroImpl::get_creature(ExtValue *ret)
 {
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 ret->setObject(ExtObject(&creature_param,getCreature()));
 #endif
@@ -463,5 +461,5 @@
 void NeuroImpl::get_part(ExtValue *ret)
 {
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 Part *pa;
 if (pa=neuro->getPart())
@@ -474,5 +472,5 @@
 void NeuroImpl::get_joint(ExtValue *ret)
 {
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 Joint *jo;
 if (jo=neuro->getJoint())
@@ -485,5 +483,5 @@
 bool NeuroImpl::getPosition(Pt3D &pos)
 {
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 Part *pa; Joint *jo;
 if (pa=neuro->getPart())
@@ -531,5 +529,7 @@
 void NeuroImpl::get_classObject(ExtValue *ret)
 {
+#ifndef GDK_WITHOUT_FRAMS
 NeuroClassExt::makeStaticObject(ret,neuroclass);
+#endif
 }
 
Index: /cpp/gdk/neuroimplfiles.h
===================================================================
--- /cpp/gdk/neuroimplfiles.h	(revision 68)
+++ /cpp/gdk/neuroimplfiles.h	(revision 69)
@@ -6,3 +6,11 @@
 #include "neuroimpl-channels.h"
 #include "neuroimpl-fuzzy.h"
+#ifdef GDK_WITHOUT_FRAMS
 #include "neuroimpl-body-gdk.h"
+#else
+#include "neuroimpl-test.h"
+#include "neuroimpl-body.h"
+#include "neuroimpl-vectoreye.h"
+#include "neuroimpl-vmot.hpp"
+#endif
+
Index: /cpp/gdk/neurotest.cpp
===================================================================
--- /cpp/gdk/neurotest.cpp	(revision 68)
+++ /cpp/gdk/neurotest.cpp	(revision 69)
@@ -19,5 +19,5 @@
 DefaultGenoConvManager gcm; //without this object the application would only handle "format 0" genotypes
 
-#ifndef NOCREATUREOBJECT
+#ifndef GDK_WITHOUT_FRAMS
 #include "creatmechobj.h"
 int CreatMechObject::modeltags_id=0;
Index: /cpp/gdk/nonstd.h
===================================================================
--- /cpp/gdk/nonstd.h	(revision 68)
+++ /cpp/gdk/nonstd.h	(revision 69)
@@ -49,4 +49,7 @@
 	#define PATHSEPARATORCHAR '/'
 	#define PATHSEPARATORSTRING "/" 
+	#define FOPEN_READ "r"
+	#define FOPEN_WRITE "w"
+	#define FOPEN_APPEND "a"
 #endif
 
Index: p/gdk/paramvmobj.cpp
===================================================================
--- /cpp/gdk/paramvmobj.cpp	(revision 68)
+++ 	(revision )
@@ -1,116 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#include "paramvmobj.h"
-#include "collectionobj.h"
-
-#define FIELDSTRUCT ParamVMObj
-static ParamEntry paramvmobj_paramtab[]=
-{
-{"Interface",1,19,"Interface","Used to query for object member descriptions. Example:\nvar iface=Interface.makeFrom(someobject); var description=\"this object has \"+iface.properties+\" properties, first property is \"+iface.getId(0);"},
-{"name",0,2+PARAM_NOSTATIC,"object name","s",GETONLY(name),},
-{"properties",0,2+PARAM_NOSTATIC,"property count","d",GETONLY(props),},
-{"groups",0,2+PARAM_NOSTATIC,"group count","d",GETONLY(groups),},
-{"get",0,PARAM_NOSTATIC,"value of item #","p x(d index)",PROCEDURE(p_get),},
-{"getId",0,PARAM_NOSTATIC,"id for item #","p s(d index)",PROCEDURE(p_getid),},
-{"getName",0,PARAM_NOSTATIC,"name for item #","p s(d index)",PROCEDURE(p_getname),},
-{"getGroup",0,PARAM_NOSTATIC,"group # for item #","p d(d index)",PROCEDURE(p_getgroup),},
-{"getGroupName",0,PARAM_NOSTATIC,"group name for group #","p s(d index)",PROCEDURE(p_getgrname),},
-{"getType",0,PARAM_NOSTATIC,"type for item #","p s(d index)",PROCEDURE(p_gettype),},
-{"getFlags",0,PARAM_NOSTATIC,"flags for item #","p d(d index)",PROCEDURE(p_getflags),},
-{"getHelp",0,PARAM_NOSTATIC,"help for item #","p s(d index)",PROCEDURE(p_gethelp),},
-{"findId",0,PARAM_NOSTATIC,"item # for id","p d(s name)",PROCEDURE(p_findid),},
-{"findGroupId",0,PARAM_NOSTATIC,"group # for group name","p d(s name)",PROCEDURE(p_findgroupid),},
-{"findIdInGroup",0,PARAM_NOSTATIC,"item # for id in group","p d(s name,x group name or index)",PROCEDURE(p_findidingroup),},
-{"makeFrom",0,2,"get interface object","p oInterface(o)",PROCEDURE(p_make),},
-{"set",0,PARAM_NOSTATIC,"set value of item #","p(d index,x value)",PROCEDURE(p_set),},
-{"setDefault",0,PARAM_NOSTATIC,"set default value for item #","p(d index)",PROCEDURE(p_setDef),},
-{"setAllDefault",0,PARAM_NOSTATIC,"set default values for all items","p()",PROCEDURE(p_setAllDef),},
-{"invoke",0,PARAM_NOSTATIC,"invoke action","p(x function name or index,oVector arguments)",PROCEDURE(p_call)},
-{0,0,0,},
-};
-
-#undef FIELDSTRUCT
-
-ParamVMObj::ParamVMObj(ParamInterface *pi):iface(pi),par(paramvmobj_paramtab,this)
-{}
-
-ExtObject ParamVMObj::makeObject(ParamInterface *pi)
-{
-ParamVMObj *o=new ParamVMObj(pi);
-return ExtObject(&o->par,o);
-}
-
-void ParamVMObj::p_make(ExtValue *args,ExtValue *ret)
-{
-ParamInterface *pi=args->getObject().getParamInterface();
-if (pi)
-	ret->setObject(makeObject(pi));
-else
-	ret->setEmpty();
-}
-
-int ParamVMObj::findGroupId(const char* name)
-{
-for(int i=0;i<iface->getGroupCount();i++)
-	if (!strcmp(iface->grname(i),name))
-		return i;
-return -1;
-}
-
-void ParamVMObj::p_findgroupid(ExtValue *args,ExtValue *ret)
-{
-const SString &s=args[0].getString();
-ret->setInt(findGroupId((const char*)s));
-}
-
-void ParamVMObj::p_findidingroup(ExtValue *args,ExtValue *ret)
-{
-ExtValue& v=args[0];
-const SString& s=args[1].getString();
-int g;
-if (v.type==TInt)
-	g=v.getInt();
-else
-	g=findGroupId((const char*)v.getString());
-if (g<0)
-	{ret->setInt(-1);return;}
-for(int i=0;i<iface->getPropCount();i++)
-	if (iface->group(i)==g)
-		if (!strcmp(iface->id(i),s))
-			{ret->setInt(i);return;}
-ret->setInt(-1);
-}
-
-void ParamVMObj::p_call(ExtValue *args,ExtValue *ret)
-{
-if (!iface) return;
-ExtValue& prop=args[1];
-int p;
-if (prop.type==TInt) p=prop.getInt(); else p=iface->findId(prop.getString());
-if (p<0) return;
-const ExtValue& a=args[0];
-const ExtObject& o=a.getObject();
-ParamInterface *argstype=o.getParamInterface();
-ExtValue *useargs=0;
-VectorObject* v;
-ExtValue *tmpmem=0;
-int n=0;
-if (argstype && (argstype==&VectorObject::par))
-	{
-	v=(VectorObject*)o.getTarget();
-	n=v->data.size();
-	}
-if (n)
-	{
-	tmpmem=new ExtValue[n];
-	useargs=tmpmem;
-	for(int i=0;i<n;i++)
-		tmpmem[i]=*(v->get(i));
-	}
-iface->call(p,useargs,ret);
-if (n)
-	delete[] useargs;
-}
-
Index: p/gdk/paramvmobj.h
===================================================================
--- /cpp/gdk/paramvmobj.h	(revision 68)
+++ 	(revision )
@@ -1,42 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#ifndef _PARAMVMOBJ_H_
-#define _PARAMVMOBJ_H_
-
-#include "param.h"
-#include "extvalue.h"
-
-class ParamVMObj: public DestrBase
-{
-ParamInterface *iface;
-  public:
-Param par;
-ParamVMObj(ParamInterface *pi=0);
-static ExtObject makeObject(ParamInterface *pi);
-int findGroupId(const char* name);
-#define STATRICKCLASS ParamVMObj
-PARAMGETDEF(name) {arg1->setString(iface->getName());}
-PARAMGETDEF(props) {arg1->setInt(iface->getPropCount());}
-PARAMGETDEF(groups) {arg1->setInt(iface->getGroupCount());}
-PARAMPROCDEF(p_make);
-PARAMPROCDEF(p_get) {iface->get(arg1->getInt(),*arg2);}
-PARAMPROCDEF(p_set) {arg2->setInt(iface->set(arg1[1].getInt(),arg1[0]));}
-PARAMPROCDEF(p_getid) {arg2->setString(iface->id(arg1->getInt()));}
-PARAMPROCDEF(p_getname) {arg2->setString(iface->name(arg1->getInt()));}
-PARAMPROCDEF(p_getgroup)  {arg2->setInt(iface->group(arg1->getInt()));}
-PARAMPROCDEF(p_getgrname)  {arg2->setString(iface->grname(arg1->getInt()));}
-PARAMPROCDEF(p_gettype) {arg2->setString(iface->type(arg1->getInt()));}
-PARAMPROCDEF(p_getflags) {arg2->setInt(iface->flags(arg1->getInt()));}
-PARAMPROCDEF(p_gethelp) {arg2->setString(iface->help(arg1->getInt()));}
-PARAMPROCDEF(p_findid) {arg2->setInt(iface->findId(arg1->getString()));}
-PARAMPROCDEF(p_findgroupid);
-PARAMPROCDEF(p_findidingroup);
-PARAMPROCDEF(p_setDef) {iface->setDefault((int)arg1->getInt());}
-PARAMPROCDEF(p_setAllDef) {iface->setDefault();}
-PARAMPROCDEF(p_call);
-#undef STATRICKCLASS
-};
-
-#endif
Index: p/gdk/stderrors.cpp
===================================================================
--- /cpp/gdk/stderrors.cpp	(revision 68)
+++ 	(revision )
@@ -1,34 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#include "stderrors.h"
-#include "sstringutils.h"
-#include "framsg.h"
-
-bool listIndexCheck(SList* list,int index,char* msgobj,char* msgfun,char* msg)
-{
-	int size=list->size();
-if ((index<0)||(index>=size))
-	{
-	if (size>0) 
-		FMprintf(msgobj,msgfun,FMLV_ERROR,"Invalid index %d (allowed range is 0..%d) %s",index,size-1,msg);
-	else
-		FMprintf(msgobj,msgfun,FMLV_ERROR,"Invalid index %d (this list is empty) %s",index,msg);
-	return 0;
-	}
-return 1;
-}
-
-SString stringCheck(SString& in,char* msgobj,char* msgfun,char* msg,SString (*checker)(SString& in))
-{
-if (!checker)
-	checker=trim;
-SString corrected=checker(in);
-if (corrected!=in)
-	{
-	SString msg2=SString(msg)+": \"%s\" (adjusted to \"%s\")";
-	FMprintf(msgobj,msgfun,FMLV_WARN,(const char*)msg2,(const char*)in,(const char*)corrected);
-	}
-return corrected;
-}
Index: p/gdk/stderrors.h
===================================================================
--- /cpp/gdk/stderrors.h	(revision 68)
+++ 	(revision )
@@ -1,14 +1,0 @@
-// This file is a part of the Framsticks GDK library.
-// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
-// Refer to http://www.framsticks.com/ for further information.
-
-#ifndef _STDERRORS_H_
-#define _STDERRORS_H_
-
-#include "list.h"
-#include "sstring.h"
-
-bool listIndexCheck(SList* list,int index,char* msgobj,char* msgfun,char* msg);
-SString stringCheck(SString& in,char* msgobj,char* msgfun,char* msg,SString (*checker)(SString& in)=0);
-
-#endif
