Ignore:
Timestamp:
11/05/17 21:45:20 (6 years ago)
Author:
Maciej Komosinski
Message:
  • Setting default NeuroClass? active/genactive in preconfigured genetics
  • genactive becomes bool (was int)
  • Code formatting
File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/model/modelparts.cpp

    r640 r714  
    11// This file is a part of Framsticks SDK.  http://www.framsticks.com/
    2 // Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
     2// Copyright (C) 1999-2017  Maciej Komosinski and Szymon Ulatowski.
    33// See LICENSE.txt for details.
    44
     
    3030
    3131template<>
    32 char ModelUserTags::reg[5]={0};
     32char ModelUserTags::reg[5] = { 0 };
    3333
    3434/////////////////////////
    3535
    3636PartBase::~PartBase()
    37 {if (mapped) delete mapped;}
     37{
     38        if (mapped) delete mapped;
     39}
    3840
    3941void PartBase::notifyMappingChange()
    4042{
    41 if (owner) owner->partmappingchanged=1;
     43        if (owner) owner->partmappingchanged = 1;
    4244}
    4345
    4446void PartBase::setMapping(const IRange &r)
    4547{
    46 if (mapped) (*mapped)=r;
    47 else mapped=new MultiRange(r);
    48 notifyMappingChange();
     48        if (mapped) (*mapped) = r;
     49        else mapped = new MultiRange(r);
     50        notifyMappingChange();
    4951}
    5052
    5153void PartBase::clearMapping()
    5254{
    53 if (mapped) {delete mapped; mapped=0;}
     55        if (mapped) { delete mapped; mapped = 0; }
    5456}
    5557
    5658void PartBase::addMapping(const IRange &r)
    5759{
    58 if (mapped) mapped->add(r);
    59 else mapped=new MultiRange(r);
    60 notifyMappingChange();
     60        if (mapped) mapped->add(r);
     61        else mapped = new MultiRange(r);
     62        notifyMappingChange();
    6163}
    6264
    6365void PartBase::setMapping(const MultiRange &mr)
    6466{
    65 if (mapped) (*mapped)=mr;
    66 else mapped=new MultiRange(mr);
    67 notifyMappingChange();
     67        if (mapped) (*mapped) = mr;
     68        else mapped = new MultiRange(mr);
     69        notifyMappingChange();
    6870}
    6971
    7072void PartBase::addMapping(const MultiRange &mr)
    7173{
    72 if (mapped) mapped->add(mr);
    73 else mapped=new MultiRange(mr);
    74 notifyMappingChange();
    75 }
    76 
    77 void PartBase::setInfo(const SString& name,const SString& value)
    78 {
    79 strSetField(info,name,value);
    80 }
    81 
    82 void PartBase::setInfo(const SString& name,int value)
    83 {
    84 setInfo(name,SString::valueOf(value));
    85 }
    86 
    87 void PartBase::setInfo(const SString& name,double value)
    88 {
    89 setInfo(name,SString::valueOf(value));
     74        if (mapped) mapped->add(mr);
     75        else mapped = new MultiRange(mr);
     76        notifyMappingChange();
     77}
     78
     79void PartBase::setInfo(const SString& name, const SString& value)
     80{
     81        strSetField(info, name, value);
     82}
     83
     84void PartBase::setInfo(const SString& name, int value)
     85{
     86        setInfo(name, SString::valueOf(value));
     87}
     88
     89void PartBase::setInfo(const SString& name, double value)
     90{
     91        setInfo(name, SString::valueOf(value));
    9092}
    9193
    9294SString PartBase::getInfo(const SString& name)
    9395{
    94 return strGetField(info,name);
     96        return strGetField(info, name);
    9597}
    9698
    9799/////////////////////////
    98100
    99 NeuroClass::NeuroClass(ParamEntry *_props,SString _description,
    100                        int _prefinputs,int _prefoutput,int _preflocation,
    101                        int *_vectordata,bool own_vd,int vhints)
     101NeuroClass::NeuroClass(ParamEntry *_props, SString _description,
     102        int _prefinputs, int _prefoutput, int _preflocation,
     103        int *_vectordata, bool own_vd, int vhints)
    102104        :ownedvectordata(own_vd),
    103          name(_props->name),longname(_props->id),description(_description),
    104          props(_props),ownedprops(false),
    105          prefinputs(_prefinputs),
    106          prefoutput(_prefoutput),
    107          preflocation(_preflocation),
    108          vectordata(_vectordata),
    109          visualhints(vhints),impl_count(0),/*impl(0),*/active(1),genactive(0)
     105        name(_props->name), longname(_props->id), description(_description),
     106        props(_props), ownedprops(false),
     107        prefinputs(_prefinputs),
     108        prefoutput(_prefoutput),
     109        preflocation(_preflocation),
     110        vectordata(_vectordata),
     111        visualhints(vhints), impl_count(0),/*impl(0),*/active(1), genactive(0)
    110112{}
    111113
    112114NeuroClass::~NeuroClass()
    113115{
    114 setSymbolGlyph(0,0);
    115 if (props && ownedprops)
    116         ParamObject::freeParamTab(props);
     116        setSymbolGlyph(0, 0);
     117        if (props && ownedprops)
     118                ParamObject::freeParamTab(props);
    117119}
    118120
    119121NeuroClass::NeuroClass()
    120122        :ownedvectordata(0),
    121          name("Invalid"),
    122          props(empty_paramtab),ownedprops(false),
    123          prefinputs(0), prefoutput(0),
    124          preflocation(0), vectordata(0),
    125          visualhints(0),impl_count(0), /*impl(0),*/ active(1), genactive(0)
     123        name("Invalid"),
     124        props(empty_paramtab), ownedprops(false),
     125        prefinputs(0), prefoutput(0),
     126        preflocation(0), vectordata(0),
     127        visualhints(0), impl_count(0), /*impl(0),*/ active(1), genactive(0)
    126128{}
    127129
     130void NeuroClass::resetActive()
     131{
     132        for (int i = 0; i < Neuro::getClassCount(); i++)
     133        {
     134                Neuro::getClass(i)->genactive = 0;
     135                Neuro::getClass(i)->active = 1;
     136        }
     137}
     138
     139void NeuroClass::setGenActive(const char* genactive_classes[])
     140{
     141        for (const char** n = genactive_classes; *n; n++)
     142        {
     143                NeuroClass* cls = Neuro::getClass(*n);
     144                if (cls) cls->genactive = 1;
     145        }
     146}
     147
    128148SString NeuroClass::getSummary()
    129149{
    130 SString t;
    131 t=getDescription();
    132 if (t.len()) t+="\n\n";
    133 t+="Characteristics:\n";
    134 if(getPreferredInputs())
    135         {
    136         if (getPreferredInputs()<0) t+="   supports any number of inputs\n";
    137         else if (getPreferredInputs()==1) t+="   uses single input\n";
    138         else t+=SString::sprintf("   uses %d inputs\n",getPreferredInputs());
    139         }
    140 else t+="   does not use inputs\n";
    141 if(getPreferredOutput())
    142         t+="   provides output value\n";
    143 else
    144         t+="   does not provide output value\n";
    145 switch(getPreferredLocation())
    146         {
    147         case 0: t+="   does not require location in body\n"; break;
    148         case 1: t+="   should be located on a Part\n"; break;
    149         case 2: t+="   should be located on a Joint\n"; break;
    150         }
    151 Param p=getProperties();
    152 if (p.getPropCount())
    153         {
    154         if (t.len()) t+="\n\n";
    155         t+="Properties:\n";
    156         const char *h;
     150        SString t;
     151        t = getDescription();
     152        if (t.len()) t += "\n\n";
     153        t += "Characteristics:\n";
     154        if (getPreferredInputs())
     155        {
     156                if (getPreferredInputs() < 0) t += "   supports any number of inputs\n";
     157                else if (getPreferredInputs() == 1) t += "   uses single input\n";
     158                else t += SString::sprintf("   uses %d inputs\n", getPreferredInputs());
     159        }
     160        else t += "   does not use inputs\n";
     161        if (getPreferredOutput())
     162                t += "   provides output value\n";
     163        else
     164                t += "   does not provide output value\n";
     165        switch (getPreferredLocation())
     166        {
     167        case 0: t += "   does not require location in body\n"; break;
     168        case 1: t += "   should be located on a Part\n"; break;
     169        case 2: t += "   should be located on a Joint\n"; break;
     170        }
     171        Param p = getProperties();
     172        if (p.getPropCount())
     173        {
     174                if (t.len()) t += "\n\n";
     175                t += "Properties:\n";
     176                const char *h;
     177                int i;
     178                for (i = 0; i < p.getPropCount(); i++)
     179                {
     180                        if (i) t += "\n";
     181                        t += "   "; t += p.name(i); t += " ("; t += p.id(i); t += ") ";
     182                        t += p.describeType(i);
     183                        if (h = p.help(i)) if (*h) { t += " - "; t += h; }
     184                }
     185        }
     186        return t;
     187}
     188
     189/////////////////////////
     190
     191/////////////////////////////////////
     192
     193Neuro::Neuro(double _state, double _inertia, double _force, double _sigmo)
     194        :PartBase(getDefaultStyle()), state(_state)
     195#ifdef MODEL_V1_COMPATIBLE
     196        ,inertia(_inertia),force(_force),sigmo(_sigmo)
     197#endif
     198{
     199#ifdef MODEL_V1_COMPATIBLE
     200        olditems=0;
     201#endif
     202        flags = 0;
     203        myclass = 0;
     204        knownclass = 1;
     205        part_refno = -1; joint_refno = -1;
     206}
     207
     208Neuro::Neuro(void) :PartBase(getDefaultStyle())
     209{
     210        defassign();
     211        state = 0.0;
     212        myclass = NULL;
     213        myclassname = "N";//default d="N" but f0.def is unable to set this (d is GETSET, not a regular FIELD)
     214        knownclass = 0;
     215        refno = 0;
     216        pos = Pt3D_0; rot = Pt3D_0;
     217        parent = 0; part = 0; joint = 0;
     218        parentcount = 0;
     219#ifdef MODEL_V1_COMPATIBLE
     220        olditems=0;
     221#endif
     222        flags = 0;
     223        part_refno = -1; joint_refno = -1;
     224}
     225
     226
     227Neuro::~Neuro()
     228{
     229#ifdef MODEL_V1_COMPATIBLE
     230        if (olditems) delete olditems;
     231#endif
    157232        int i;
    158         for(i=0;i<p.getPropCount();i++)
    159                 {
    160                 if (i) t+="\n";
    161                 t+="   "; t+=p.name(i); t+=" ("; t+=p.id(i); t+=") ";
    162                 t+=p.describeType(i);
    163                 if (h=p.help(i)) if (*h) {t+=" - "; t+=h;}
    164                 }
    165         }
    166 return t;
    167 }
    168 
    169 /////////////////////////
    170 
    171 /////////////////////////////////////
    172 
    173 Neuro::Neuro(double _state,double _inertia,double _force,double _sigmo)
    174         :PartBase(getDefaultStyle()),state(_state)
     233        for (i = 0; i < inputs.size(); i++)
     234        {
     235                NInput &ni = inputs(i);
     236                if (ni.info) delete ni.info;
     237        }
     238}
     239
     240SString** Neuro::inputInfo(int i)
     241{
     242        if (i >= getInputCount()) return 0;
     243        return &inputs(i).info;
     244}
     245
     246void Neuro::setInputInfo(int i, const SString& name, const SString &value)
     247{
     248        SString **s = inputInfo(i);
     249        if (!s) return;
     250        if (!*s) *s = new SString();
     251        strSetField(**s, name, value);
     252}
     253
     254void Neuro::setInputInfo(int i, const SString& name, int value)
     255{
     256        setInputInfo(i, name, SString::valueOf(value));
     257}
     258
     259void Neuro::setInputInfo(int i, const SString& name, double value)
     260{
     261        setInputInfo(i, name, SString::valueOf(value));
     262}
     263
     264SString Neuro::getInputInfo(int i)
     265{
     266        SString **s = inputInfo(i);
     267        if (!s) return SString();
     268        if (!*s) return SString();
     269        return **s;
     270}
     271
     272SString Neuro::getInputInfo(int i, const SString& name)
     273{
     274        SString **s = inputInfo(i);
     275        if (!s) return SString();
     276        if (!*s) return SString();
     277        return strGetField(**s, name);
     278}
     279
     280void Neuro::operator=(const Neuro& src)
     281{
     282        refno = src.refno;
    175283#ifdef MODEL_V1_COMPATIBLE
    176 ,inertia(_inertia),force(_force),sigmo(_sigmo)
     284        neuro_refno=-1;
     285        conn_refno=-1;
     286        force=src.force;
     287        sigmo=src.sigmo;
     288        inertia=src.inertia;
     289        weight=src.weight;
     290        olditems=0;
    177291#endif
    178 {
    179 #ifdef MODEL_V1_COMPATIBLE
    180 olditems=0;
    181 #endif
    182 flags=0;
    183 myclass=0;
    184 knownclass=1;
    185 part_refno=-1; joint_refno=-1;
    186 }
    187 
    188 Neuro::Neuro(void):PartBase(getDefaultStyle())
    189 {
    190 defassign();
    191 state=0.0;
    192 myclass=NULL;
    193 myclassname="N";//default d="N" but f0.def is unable to set this (d is GETSET, not a regular FIELD)
    194 knownclass=0;
    195 refno=0;
    196 pos=Pt3D_0; rot=Pt3D_0;
    197 parent=0; part=0; joint=0;
    198 parentcount=0;
    199 #ifdef MODEL_V1_COMPATIBLE
    200 olditems=0;
    201 #endif
    202 flags=0;
    203 part_refno=-1; joint_refno=-1;
    204 }
    205 
    206 
    207 Neuro::~Neuro()
    208 {
    209 #ifdef MODEL_V1_COMPATIBLE
    210 if (olditems) delete olditems;
    211 #endif
    212 int i;
    213 for(i=0;i<inputs.size();i++)
    214         {
    215         NInput &ni=inputs(i);
    216         if (ni.info) delete ni.info;
    217         }
    218 }
    219 
    220 SString** Neuro::inputInfo(int i)
    221 {
    222 if (i>=getInputCount()) return 0;
    223 return &inputs(i).info;
    224 }
    225 
    226 void Neuro::setInputInfo(int i,const SString& name,const SString &value)
    227 {
    228 SString **s=inputInfo(i);
    229 if (!s) return;
    230 if (!*s) *s=new SString();
    231 strSetField(**s,name,value);
    232 }
    233 
    234 void Neuro::setInputInfo(int i,const SString& name,int value)
    235 {
    236 setInputInfo(i,name,SString::valueOf(value));
    237 }
    238 
    239 void Neuro::setInputInfo(int i,const SString& name,double value)
    240 {
    241 setInputInfo(i,name,SString::valueOf(value));
    242 }
    243 
    244 SString Neuro::getInputInfo(int i)
    245 {
    246 SString **s=inputInfo(i);
    247 if (!s) return SString();
    248 if (!*s) return SString();
    249 return **s;
    250 }
    251 
    252 SString Neuro::getInputInfo(int i,const SString& name)
    253 {
    254 SString **s=inputInfo(i);
    255 if (!s) return SString();
    256 if (!*s) return SString();
    257 return strGetField(**s,name);
    258 }
    259 
    260 void Neuro::operator=(const Neuro& src)
    261 {
    262 refno=src.refno;
    263 #ifdef MODEL_V1_COMPATIBLE
    264 neuro_refno=-1;
    265 conn_refno=-1;
    266 force=src.force;
    267 sigmo=src.sigmo;
    268 inertia=src.inertia;
    269 weight=src.weight;
    270 olditems=0;
    271 #endif
    272 state=src.state;
    273 part_refno=-1;
    274 joint_refno=-1;
    275 pos=src.pos; rot=src.rot;
    276 parent=0; part=0; joint=0;
    277 parentcount=0;
    278 flags=0;
    279 myclass=src.myclass;
    280 knownclass=src.knownclass;
    281 myclassname=src.myclassname;
    282 myclassparams=src.myclassparams;
     292        state = src.state;
     293        part_refno = -1;
     294        joint_refno = -1;
     295        pos = src.pos; rot = src.rot;
     296        parent = 0; part = 0; joint = 0;
     297        parentcount = 0;
     298        flags = 0;
     299        myclass = src.myclass;
     300        knownclass = src.knownclass;
     301        myclassname = src.myclassname;
     302        myclassparams = src.myclassparams;
    283303}
    284304
    285305void Neuro::attachToPart(int i)
    286 {attachToPart((i>=0)?owner->getPart(i):0);}
     306{
     307        attachToPart((i >= 0) ? owner->getPart(i) : 0);
     308}
    287309
    288310void Neuro::attachToJoint(int i)
    289 {attachToJoint((i>=0)?owner->getJoint(i):0);}
     311{
     312        attachToJoint((i >= 0) ? owner->getJoint(i) : 0);
     313}
    290314
    291315int Neuro::getClassCount()
    292 {return NeuroLibrary::staticlibrary.getClassCount();}
     316{
     317        return NeuroLibrary::staticlibrary.getClassCount();
     318}
    293319
    294320NeuroClass* Neuro::getClass(int classindex)
    295 {return NeuroLibrary::staticlibrary.getClass(classindex);}
     321{
     322        return NeuroLibrary::staticlibrary.getClass(classindex);
     323}
    296324
    297325NeuroClass* Neuro::getClass(const SString& classname)
    298 {return NeuroLibrary::staticlibrary.findClass(classname);}
     326{
     327        return NeuroLibrary::staticlibrary.findClass(classname);
     328}
    299329
    300330int Neuro::getClassIndex(const NeuroClass*nc)
    301 {return NeuroLibrary::staticlibrary.classes.find((void*)nc);}
     331{
     332        return NeuroLibrary::staticlibrary.classes.find((void*)nc);
     333}
    302334
    303335NeuroClass* Neuro::getClass()
    304336{
    305 checkClass();
    306 return myclass;
     337        checkClass();
     338        return myclass;
    307339}
    308340
    309341void Neuro::setClass(NeuroClass* cl)
    310342{
    311 myclass=cl;
    312 myclassname=cl->getName();
    313 knownclass=1;
     343        myclass = cl;
     344        myclassname = cl->getName();
     345        knownclass = 1;
    314346}
    315347
    316348SString Neuro::getClassName(int classindex)
    317349{
    318 NeuroClass *cl=NeuroLibrary::staticlibrary.getClass(classindex);
    319 return cl? cl->getName() : SString();
     350        NeuroClass *cl = NeuroLibrary::staticlibrary.getClass(classindex);
     351        return cl ? cl->getName() : SString();
    320352}
    321353
    322354void Neuro::setDetails(const SString& details)
    323355{
    324 int colon=details.indexOf(':');
    325 if (colon>=0) {myclassname=details.substr(0,colon); myclassparams=details.substr(colon+1);}
    326 else {myclassname=details; myclassparams=0;}
    327 knownclass=0;
     356        int colon = details.indexOf(':');
     357        if (colon >= 0) { myclassname = details.substr(0, colon); myclassparams = details.substr(colon + 1); }
     358        else { myclassname = details; myclassparams = 0; }
     359        knownclass = 0;
    328360}
    329361
    330362SString Neuro::getDetails()
    331363{
    332 SString ret=getClassName();
    333 if (myclassparams.len()) {if (!ret.len()) ret="N"; ret+=":"; ret+=myclassparams;}
    334 return ret;
     364        SString ret = getClassName();
     365        if (myclassparams.len()) { if (!ret.len()) ret = "N"; ret += ":"; ret += myclassparams; }
     366        return ret;
    335367}
    336368
    337369void Neuro::checkClass()
    338370{
    339 if (knownclass) return;
    340 myclass=getClass(myclassname);
    341 knownclass=1;
     371        if (knownclass) return;
     372        myclass = getClass(myclassname);
     373        knownclass = 1;
    342374}
    343375
    344376SyntParam Neuro::classProperties(bool handle_defaults_when_saving)
    345377{
    346 NeuroClass *cl=getClass();
    347 ParamEntry *pe = cl ? cl->getParamTab() : emptyParamTab;
    348 return SyntParam(pe,&myclassparams,handle_defaults_when_saving);
     378        NeuroClass *cl = getClass();
     379        ParamEntry *pe = cl ? cl->getParamTab() : emptyParamTab;
     380        return SyntParam(pe, &myclassparams, handle_defaults_when_saving);
    349381}
    350382
    351383SString Neuro::getClassName()
    352384{
    353 return myclassname;
     385        return myclassname;
    354386}
    355387
    356388void Neuro::setClassName(const SString& clazz)
    357389{
    358 myclassname=clazz;
    359 knownclass=0;
    360 }
    361 
    362 int Neuro::addInput(Neuro* child,double weight,const SString *info)
    363 {
    364 inputs+=NInput(child,weight,(info&&(info->len()))?new SString(*info):0);
    365 child->parentcount++;
    366 if (child->parentcount==1) {child->parent=this;}
    367 return inputs.size()-1;
     390        myclassname = clazz;
     391        knownclass = 0;
     392}
     393
     394int Neuro::addInput(Neuro* child, double weight, const SString *info)
     395{
     396        inputs += NInput(child, weight, (info && (info->len())) ? new SString(*info) : 0);
     397        child->parentcount++;
     398        if (child->parentcount == 1) { child->parent = this; }
     399        return inputs.size() - 1;
    368400}
    369401
    370402int Neuro::findInput(Neuro* child) const
    371403{
    372 for(int i=0;i<inputs.size();i++)
    373         if (inputs(i).n==child) return i;
    374 return -1;
    375 }
    376 
    377 Neuro* Neuro::getInput(int i,double &weight) const
    378 {
    379 if (i>=getInputCount()) return 0;
    380 NInput &inp=inputs(i);
    381 weight=inp.weight;
    382 return inp.n;
     404        for (int i = 0; i < inputs.size(); i++)
     405                if (inputs(i).n == child) return i;
     406        return -1;
     407}
     408
     409Neuro* Neuro::getInput(int i, double &weight) const
     410{
     411        if (i >= getInputCount()) return 0;
     412        NInput &inp = inputs(i);
     413        weight = inp.weight;
     414        return inp.n;
    383415}
    384416
    385417double Neuro::getInputWeight(int i) const
    386418{
    387 return inputs(i).weight;
    388 }
    389 
    390 void Neuro::setInputWeight(int i,double w)
    391 {
    392 inputs(i).weight=w;
    393 }
    394 
    395 void Neuro::setInput(int i,Neuro* n)
    396 {
    397 NInput &inp=inputs(i);
    398 inp.n=n;
    399 }
    400 
    401 void Neuro::setInput(int i,Neuro* n,double w)
    402 {
    403 NInput &inp=inputs(i);
    404 inp.n=n;
    405 inp.weight=w;
     419        return inputs(i).weight;
     420}
     421
     422void Neuro::setInputWeight(int i, double w)
     423{
     424        inputs(i).weight = w;
     425}
     426
     427void Neuro::setInput(int i, Neuro* n)
     428{
     429        NInput &inp = inputs(i);
     430        inp.n = n;
     431}
     432
     433void Neuro::setInput(int i, Neuro* n, double w)
     434{
     435        NInput &inp = inputs(i);
     436        inp.n = n;
     437        inp.weight = w;
    406438}
    407439
    408440void Neuro::removeInput(int refno)
    409441{
    410 Neuro *child=getInput(refno);
    411 child->parentcount--;
    412 if (child->parent==this) child->parent=0;
    413 SString *s=inputs(refno).info;
    414 if (s) delete s;
    415 inputs.remove(refno);
     442        Neuro *child = getInput(refno);
     443        child->parentcount--;
     444        if (child->parent == this) child->parent = 0;
     445        SString *s = inputs(refno).info;
     446        if (s) delete s;
     447        inputs.remove(refno);
    416448}
    417449
    418450int Neuro::removeInput(Neuro* child)
    419451{
    420 int i=findInput(child);
    421 if (i>=0) removeInput(i);
    422 return i;
     452        int i = findInput(child);
     453        if (i >= 0) removeInput(i);
     454        return i;
    423455}
    424456
    425457int Neuro::getOutputsCount() const
    426458{
    427    int c=0;
    428    for(int i=0;i<owner->getNeuroCount();i++)
    429      for(int j=0;j<owner->getNeuro(i)->getInputCount();j++) c+=owner->getNeuro(i)->getInput(j)==this;
    430    return c;
     459        int c = 0;
     460        for (int i = 0; i < owner->getNeuroCount(); i++)
     461                for (int j = 0; j < owner->getNeuro(i)->getInputCount(); j++) c += owner->getNeuro(i)->getInput(j) == this;
     462        return c;
    431463}
    432464
    433465int Neuro::isOldEffector()
    434466{
    435 static SString bend("|"),rot("@");
    436 return ((getClassName()==bend)||(getClassName()==rot));
     467        static SString bend("|"), rot("@");
     468        return ((getClassName() == bend) || (getClassName() == rot));
    437469}
    438470
    439471int Neuro::isOldReceptor()
    440472{
    441 static SString g("G"),t("T"),s("S");
    442 return ((getClassName()==g)||(getClassName()==t)||(getClassName()==s));
     473        static SString g("G"), t("T"), s("S");
     474        return ((getClassName() == g) || (getClassName() == t) || (getClassName() == s));
    443475}
    444476
    445477int Neuro::isOldNeuron()
    446478{
    447 static SString n("N");
    448 return (getClassName()==n);
     479        static SString n("N");
     480        return (getClassName() == n);
    449481}
    450482
    451483int Neuro::isNNConnection()
    452484{
    453 static SString conn("-");
    454 return (getClassName()==conn);
    455 }
    456 
    457 int Neuro::findInputs(SList& result,const char* classname,const Part* part,const Joint* joint) const
    458 {
    459 Neuro *nu;
    460 SString cn(classname);
    461 int n0=result.size();
    462 for(int i=0;nu=getInput(i);i++)
    463         {
    464         if (part)
    465                 if (nu->part != part) continue;
    466         if (joint)
    467                 if (nu->joint != joint) continue;
    468         if (classname)
    469                 if (nu->getClassName() != cn) continue;
    470         result+=(void*)nu;
    471         }
    472 return result.size()-n0;
    473 }
    474 
    475 int Neuro::findOutputs(SList& result,const char* classname,const Part* part,const Joint* joint) const
     485        static SString conn("-");
     486        return (getClassName() == conn);
     487}
     488
     489int Neuro::findInputs(SList& result, const char* classname, const Part* part, const Joint* joint) const
     490{
     491        Neuro *nu;
     492        SString cn(classname);
     493        int n0 = result.size();
     494        for (int i = 0; nu = getInput(i); i++)
     495        {
     496                if (part)
     497                        if (nu->part != part) continue;
     498                if (joint)
     499                        if (nu->joint != joint) continue;
     500                if (classname)
     501                        if (nu->getClassName() != cn) continue;
     502                result += (void*)nu;
     503        }
     504        return result.size() - n0;
     505}
     506
     507int Neuro::findOutputs(SList& result, const char* classname, const Part* part, const Joint* joint) const
    476508{ // not very efficient...
    477 Neuro *nu,*inp;
    478 SString cn(classname);
    479 SList found;
    480 int n0=result.size();
    481 for(int i=0;nu=getModel().getNeuro(i);i++)
    482         {
    483         if (part)
    484                 if (nu->part != part) continue;
    485         if (joint)
    486                 if (nu->joint != joint) continue;
    487         if (classname)
    488                 if (inp->getClassName() != cn) continue;
    489         for (int j=0;inp=nu->getInput(j);j++)
    490                 if (inp==this)
     509        Neuro *nu, *inp;
     510        SString cn(classname);
     511        SList found;
     512        int n0 = result.size();
     513        for (int i = 0; nu = getModel().getNeuro(i); i++)
     514        {
     515                if (part)
     516                        if (nu->part != part) continue;
     517                if (joint)
     518                        if (nu->joint != joint) continue;
     519                if (classname)
     520                        if (inp->getClassName() != cn) continue;
     521                for (int j = 0; inp = nu->getInput(j); j++)
     522                        if (inp == this)
    491523                        {
    492                         result+=(void*)nu;
     524                        result += (void*)nu;
    493525                        break;
    494526                        }
    495527        }
    496 return result.size()-n0;
     528        return result.size() - n0;
    497529}
    498530
    499531void Neuro::get_inputCount(PARAMGETARGS)
    500 {ret->setInt(inputs.size());}
    501 
    502 void Neuro::p_getInputNeuroDef(ExtValue *args,ExtValue *ret)
    503 {
    504 int i=args->getInt();
    505 if ((i<0)||(i>=inputs.size()))
    506         ret->setEmpty();
    507 else
    508         ret->setObject(ExtObject(&Neuro::getStaticParam(),inputs(i).n));
    509 }
    510 
    511 void Neuro::p_getInputWeight(ExtValue *args,ExtValue *ret)
    512 {
    513 int i=args->getInt();
    514 if ((i<0)||(i>=inputs.size()))
    515         ret->setEmpty();
    516 else
    517         ret->setDouble(inputs(i).weight);
    518 }
    519 
    520 void Neuro::p_getInputNeuroIndex(ExtValue *args,ExtValue *ret)
    521 {
    522 int i=args->getInt();
    523 if ((i<0)||(i>=inputs.size()))
    524         ret->setInt(-1);
    525 else
    526         ret->setInt(inputs(i).n->refno);
     532{
     533        ret->setInt(inputs.size());
     534}
     535
     536void Neuro::p_getInputNeuroDef(ExtValue *args, ExtValue *ret)
     537{
     538        int i = args->getInt();
     539        if ((i < 0) || (i >= inputs.size()))
     540                ret->setEmpty();
     541        else
     542                ret->setObject(ExtObject(&Neuro::getStaticParam(), inputs(i).n));
     543}
     544
     545void Neuro::p_getInputWeight(ExtValue *args, ExtValue *ret)
     546{
     547        int i = args->getInt();
     548        if ((i < 0) || (i >= inputs.size()))
     549                ret->setEmpty();
     550        else
     551                ret->setDouble(inputs(i).weight);
     552}
     553
     554void Neuro::p_getInputNeuroIndex(ExtValue *args, ExtValue *ret)
     555{
     556        int i = args->getInt();
     557        if ((i < 0) || (i >= inputs.size()))
     558                ret->setInt(-1);
     559        else
     560                ret->setInt(inputs(i).n->refno);
    527561}
    528562
     
    530564{
    531565#ifndef SDK_WITHOUT_FRAMS
    532 NeuroClassExt::makeStaticObject(ret,getClass());
     566        NeuroClassExt::makeStaticObject(ret, getClass());
    533567#endif
    534568}
     
    538572void OldItems::buildlist()
    539573{ // guaranteed to work only for old NN layouts
    540  // (neurons,neuro connections, old receptors and effectors)
    541 if (listok) return;
    542  // inputs can contain both neuroitem connections (details="") and direct neuron references (details="N")
    543  // in OldItems we create neuroitems freom direct references
    544 for(int i=0;i<neuro.getInputCount();i++)
    545         {
    546         float w;
    547         Neuro *n=neuro.getInput(i,w);
    548         if (n->isOldNeuron())
     574        // (neurons,neuro connections, old receptors and effectors)
     575        if (listok) return;
     576        // inputs can contain both neuroitem connections (details="") and direct neuron references (details="N")
     577        // in OldItems we create neuroitems freom direct references
     578        for(int i=0;i<neuro.getInputCount();i++)
     579        {
     580                float w;
     581                Neuro *n=neuro.getInput(i,w);
     582                if (n->isOldNeuron())
    549583                {
    550                 Neuro *ni=new Neuro();
    551                 ni->setClassName("-");
    552                 ni->weight=w;
    553                 ni->neuro_refno=neuro.refno;
    554                 ni->conn_refno=n->refno;
    555                 items+=ni;
    556                 syntitems+=ni;
     584                        Neuro *ni=new Neuro();
     585                        ni->setClassName("-");
     586                        ni->weight=w;
     587                        ni->neuro_refno=neuro.refno;
     588                        ni->conn_refno=n->refno;
     589                        items+=ni;
     590                        syntitems+=ni;
    557591                }
    558         else
     592                else
    559593                {
    560                 items+=n;
    561                 n->weight=w;
     594                        items+=n;
     595                        n->weight=w;
    562596                }
    563597        }
    564 SList outputs;
    565 neuro.findOutputs(outputs);
    566 FOREACH(Neuro*,n,outputs)
    567         {
    568         if (n->isNNConnection() || n->isOldNeuron())
    569                 outputs-=n;
    570         }
    571 items+=outputs;
    572 listok=1;
     598        SList outputs;
     599        neuro.findOutputs(outputs);
     600        FOREACH(Neuro*,n,outputs)
     601        {
     602                if (n->isNNConnection() || n->isOldNeuron())
     603                        outputs-=n;
     604        }
     605        items+=outputs;
     606        listok=1;
    573607}
    574608
    575609void OldItems::freelist()
    576610{
    577 FOREACH(Neuro*,n,syntitems)
    578         delete n;
    579 syntitems.clear();
    580 items.clear();
    581 listok=0;
     611        FOREACH(Neuro*,n,syntitems)
     612                delete n;
     613        syntitems.clear();
     614        items.clear();
     615        listok=0;
    582616}
    583617
    584618int OldItems::getItemCount()
    585619{
    586 buildlist();
    587 return items.size();
     620        buildlist();
     621        return items.size();
    588622}
    589623
    590624NeuroItem *OldItems::getNeuroItem(int i)
    591625{
    592 buildlist();
    593 return (NeuroItem*)items(i);
     626        buildlist();
     627        return (NeuroItem*)items(i);
    594628}
    595629
    596630NeuroItem *OldItems::addNewNeuroItem()
    597631{
    598 Neuro *nu=neuro.getModel().addNewNeuro();
    599 nu->setClassName("-");
    600 if (listok) items+=nu;
    601 neuro.addInput(nu);
    602 return (NeuroItem*)nu;
     632        Neuro *nu=neuro.getModel().addNewNeuro();
     633        nu->setClassName("-");
     634        if (listok) items+=nu;
     635        neuro.addInput(nu);
     636        return (NeuroItem*)nu;
    603637}
    604638
    605639int OldItems::findNeuroItem(NeuroItem *ni)
    606640{
    607 buildlist();
    608 return items.find((void*)ni);
     641        buildlist();
     642        return items.find((void*)ni);
    609643}
    610644#endif
     
    613647
    614648SString Part::getDefaultStyle()
    615 {return SString("part");}
     649{
     650        return SString("part");
     651}
    616652SString Joint::getDefaultStyle()
    617 {return SString("joint");}
     653{
     654        return SString("joint");
     655}
    618656/*
    619657const SString& Neuro::getDefaultStyle()
     
    623661*/
    624662SString Neuro::getDefaultStyle()
    625 {return SString("neuro");}
    626 
    627 Part::Part(enum Shape s):PartBase(getDefaultStyle())
    628 {
    629 o=Orient_1;
    630 p=Pt3D_0;
    631 rot=Pt3D_0;
    632 flags=0;
    633 defassign();
    634 shape=s;
    635 mass=1;
     663{
     664        return SString("neuro");
     665}
     666
     667Part::Part(enum Shape s) :PartBase(getDefaultStyle())
     668{
     669        o = Orient_1;
     670        p = Pt3D_0;
     671        rot = Pt3D_0;
     672        flags = 0;
     673        defassign();
     674        shape = s;
     675        mass = 1;
    636676}
    637677
    638678void Part::operator=(const Part& src)
    639679{
    640 p=src.p; o=src.o;
    641 flags=src.flags;
    642 mass=src.mass; density=src.density;
    643 friction=src.friction;
    644 ingest=src.ingest;
    645 assim=src.assim;
    646 size=src.size;
    647 rot=src.rot;
    648 refno=src.refno;
    649 vcolor=src.vcolor;
    650 vsize=src.vsize;
    651 vis_style=src.vis_style;
    652 shape=src.shape;
    653 scale=src.scale;
    654 hollow=src.hollow;
     680        p = src.p; o = src.o;
     681        flags = src.flags;
     682        mass = src.mass; density = src.density;
     683        friction = src.friction;
     684        ingest = src.ingest;
     685        assim = src.assim;
     686        size = src.size;
     687        rot = src.rot;
     688        refno = src.refno;
     689        vcolor = src.vcolor;
     690        vsize = src.vsize;
     691        vis_style = src.vis_style;
     692        shape = src.shape;
     693        scale = src.scale;
     694        hollow = src.hollow;
    655695}
    656696
    657697void Part::setOrient(const Orient &_o)
    658698{
    659 o=_o;
    660 rot.getAngles(o.x,o.z);
     699        o = _o;
     700        rot.getAngles(o.x, o.z);
    661701}
    662702
    663703void Part::setRot(const Pt3D &r)
    664704{
    665 rot=r;
    666 o=Orient_1;
    667 o.rotate(rot);
    668 }
    669 
    670 void Part::setPositionAndRotationFromAxis(const Pt3D &p1,const Pt3D &p2)
    671 {
    672 Pt3D x=p2-p1;
    673 Pt3D dir(x.y,x.z,x.x);
    674 p=p1+x*0.5;
    675 rot.getAngles(x,dir);
     705        rot = r;
     706        o = Orient_1;
     707        o.rotate(rot);
     708}
     709
     710void Part::setPositionAndRotationFromAxis(const Pt3D &p1, const Pt3D &p2)
     711{
     712        Pt3D x = p2 - p1;
     713        Pt3D dir(x.y, x.z, x.x);
     714        p = p1 + x*0.5;
     715        rot.getAngles(x, dir);
    676716}
    677717
    678718Param& Part::getStaticParam()
    679719{
    680 static Param p(f0_part_paramtab,0,"Part");
    681 return p;
     720        static Param p(f0_part_paramtab, 0, "Part");
     721        return p;
    682722}
    683723
     
    685725///////////////////////////
    686726
    687 Joint::Joint():PartBase(getDefaultStyle())
    688 {
    689 rot=Pt3D_0;
    690 defassign();
    691 d.x=JOINT_DELTA_MARKER;
    692 d.y=JOINT_DELTA_MARKER;
    693 d.z=JOINT_DELTA_MARKER;
    694 part1=0; part2=0;
    695 flags=0;
    696 usedelta=0;
     727Joint::Joint() :PartBase(getDefaultStyle())
     728{
     729        rot = Pt3D_0;
     730        defassign();
     731        d.x = JOINT_DELTA_MARKER;
     732        d.y = JOINT_DELTA_MARKER;
     733        d.z = JOINT_DELTA_MARKER;
     734        part1 = 0; part2 = 0;
     735        flags = 0;
     736        usedelta = 0;
    697737}
    698738
    699739void Joint::operator=(const Joint& src)
    700740{
    701 rot=src.rot;
    702 d=src.d;
    703 shape=src.shape;
    704 stamina=src.stamina;
    705 stif=src.stif; rotstif=src.rotstif;
    706 vis_style=src.vis_style;
    707 vcolor=src.vcolor;
    708 part1=0; part2=0;
    709 flags=src.flags;
    710 usedelta=src.usedelta;
    711 refno=src.refno;
    712 }
    713 
    714 void Joint::attachToParts(Part* p1,Part* p2)
    715 {
    716 part1=p1;
    717 part2=p2;
    718 if (p1 && p2)
    719         {
    720         o=rot;
    721         if (usedelta)
     741        rot = src.rot;
     742        d = src.d;
     743        shape = src.shape;
     744        stamina = src.stamina;
     745        stif = src.stif; rotstif = src.rotstif;
     746        vis_style = src.vis_style;
     747        vcolor = src.vcolor;
     748        part1 = 0; part2 = 0;
     749        flags = src.flags;
     750        usedelta = src.usedelta;
     751        refno = src.refno;
     752}
     753
     754void Joint::attachToParts(Part* p1, Part* p2)
     755{
     756        part1 = p1;
     757        part2 = p2;
     758        if (p1 && p2)
     759        {
     760                o = rot;
     761                if (usedelta)
    722762                {
    723                 p1->o.transform(p2->o,o);
    724 //              p2->o.x=p1->o/o.x; p2->o.y=p1->o/o.y; p2->o.z=p1->o/o.z;
    725                 p2->p=p2->o.transform(d)+p1->p;
     763                        p1->o.transform(p2->o, o);
     764                        //              p2->o.x=p1->o/o.x; p2->o.y=p1->o/o.y; p2->o.z=p1->o/o.z;
     765                        p2->p = p2->o.transform(d) + p1->p;
    726766                }
    727767        }
    728768}
    729769
    730 void Joint::attachToParts(int p1,int p2)
    731 {
    732 attachToParts((p1>=0)?owner->getPart(p1):0,(p2>=0)?owner->getPart(p2):0);
     770void Joint::attachToParts(int p1, int p2)
     771{
     772        attachToParts((p1 >= 0) ? owner->getPart(p1) : 0, (p2 >= 0) ? owner->getPart(p2) : 0);
    733773}
    734774
    735775void Joint::resetDelta()
    736776{
    737 d=Pt3D(JOINT_DELTA_MARKER,JOINT_DELTA_MARKER,JOINT_DELTA_MARKER);
     777        d = Pt3D(JOINT_DELTA_MARKER, JOINT_DELTA_MARKER, JOINT_DELTA_MARKER);
    738778}
    739779
    740780void Joint::resetDeltaMarkers()
    741781{
    742 if (d.x==JOINT_DELTA_MARKER) d.x=0;
    743 if (d.y==JOINT_DELTA_MARKER) d.y=0;
    744 if (d.z==JOINT_DELTA_MARKER) d.z=0;
     782        if (d.x == JOINT_DELTA_MARKER) d.x = 0;
     783        if (d.y == JOINT_DELTA_MARKER) d.y = 0;
     784        if (d.z == JOINT_DELTA_MARKER) d.z = 0;
    745785}
    746786
    747787void Joint::useDelta(bool use)
    748788{
    749 usedelta=use;
     789        usedelta = use;
    750790}
    751791
    752792bool Joint::isDelta()
    753793{
    754 return usedelta;
     794        return usedelta;
    755795}
    756796
    757797Param& Joint::getStaticParam()
    758798{
    759 static Param p(f0_joint_paramtab,0,"Joint");
    760 return p;
     799        static Param p(f0_joint_paramtab, 0, "Joint");
     800        return p;
    761801}
    762802
     
    772812ParamEntry f0_old_neuro_tab[]=
    773813{
    774 {"Connections",2,6,"n",},
    775 {"Other properties",},
    776 {"p",0,0,"part ref#","d",FIELD(part_refno),},
    777 {"j",0,0,"joint ref#","d",FIELD(joint_refno),},
    778 {"s",1,0,"state","f",FIELD(state),},
    779 {"in",1,0,"Inertia","f",FIELD(inertia),},
    780 {"fo",1,0,"Force","f",FIELD(force),},
    781 {"si",1,0,"Sigmoid","f",FIELD(sigmo),},
    782 {0,0,0,},
     814        {"Connections",2,6,"n",},
     815        {"Other properties",},
     816        {"p",0,0,"part ref#","d",FIELD(part_refno),},
     817        {"j",0,0,"joint ref#","d",FIELD(joint_refno),},
     818        {"s",1,0,"state","f",FIELD(state),},
     819        {"in",1,0,"Inertia","f",FIELD(inertia),},
     820        {"fo",1,0,"Force","f",FIELD(force),},
     821        {"si",1,0,"Sigmoid","f",FIELD(sigmo),},
     822        {0,0,0,},
    783823};
    784824#undef FIELDSTRUCT
     
    787827ParamEntry f0_neuroitem_paramtab[]=
    788828{
    789 {"Connections",3,12,"ni",},
    790 {"Geometry",},
    791 {"Other",},
    792 {"n",0,0,"neuron ref#","d",FIELD(neuro_refno),},
    793 {"c",2,0,"connection ref#","d",FIELD(conn_refno),},
    794 {"w",2,0,"connection weight","f",FIELD(weight),},
    795 {"p",0,0,"part ref#","d",FIELD(part_refno),},
    796 {"j",0,0,"joint ref#","d",FIELD(joint_refno),},
    797 {"px",1,0,"position.x","f",FIELD(pos.x),},
    798 {"py",1,0,"position.y","f",FIELD(pos.y),},
    799 {"pz",1,0,"position.z","f",FIELD(pos.z),},
    800 {"rx",1,0,"rotation.x","f",FIELD(rot.x),},
    801 {"ry",1,0,"rotation.y","f",FIELD(rot.y),},
    802 {"rz",1,0,"rotation.z","f",FIELD(rot.z),},
    803 {"d",2,0,"item details","s",GETSET(details),},
    804 {0,0,0,},
     829        {"Connections",3,12,"ni",},
     830        {"Geometry",},
     831        {"Other",},
     832        {"n",0,0,"neuron ref#","d",FIELD(neuro_refno),},
     833        {"c",2,0,"connection ref#","d",FIELD(conn_refno),},
     834        {"w",2,0,"connection weight","f",FIELD(weight),},
     835        {"p",0,0,"part ref#","d",FIELD(part_refno),},
     836        {"j",0,0,"joint ref#","d",FIELD(joint_refno),},
     837        {"px",1,0,"position.x","f",FIELD(pos.x),},
     838        {"py",1,0,"position.y","f",FIELD(pos.y),},
     839        {"pz",1,0,"position.z","f",FIELD(pos.z),},
     840        {"rx",1,0,"rotation.x","f",FIELD(rot.x),},
     841        {"ry",1,0,"rotation.y","f",FIELD(rot.y),},
     842        {"rz",1,0,"rotation.z","f",FIELD(rot.z),},
     843        {"d",2,0,"item details","s",GETSET(details),},
     844        {0,0,0,},
    805845};
    806846#undef FIELDSTRUCT
     
    809849////////////////////////////////////////
    810850
    811 ParamEntry Neuro::emptyParamTab[]=
    812 {
    813 {"Undefined Neuro",1,0,"?",},
    814 {0,0,0,},
     851ParamEntry Neuro::emptyParamTab[] =
     852{
     853        { "Undefined Neuro", 1, 0, "?", },
     854        { 0, 0, 0, },
    815855};
    816856
    817857Param Part::extraProperties()
    818858{
    819 return Param(f0_part_xtra_paramtab,this);
     859        return Param(f0_part_xtra_paramtab, this);
    820860}
    821861
    822862Param Joint::extraProperties()
    823863{
    824 return Param(f0_joint_xtra_paramtab,this);
     864        return Param(f0_joint_xtra_paramtab, this);
    825865}
    826866
    827867Param Neuro::extraProperties()
    828868{
    829 return Param(f0_neuro_xtra_paramtab,this);
     869        return Param(f0_neuro_xtra_paramtab, this);
    830870}
    831871
    832872Param Part::properties()
    833873{
    834 return Param(f0_part_paramtab,this);
     874        return Param(f0_part_paramtab, this);
    835875}
    836876
    837877Param Joint::properties()
    838878{
    839 return Param(usedelta?f0_joint_paramtab:f0_nodeltajoint_paramtab,this);
     879        return Param(usedelta ? f0_joint_paramtab : f0_nodeltajoint_paramtab, this);
    840880}
    841881
    842882Param Neuro::properties()
    843883{
    844 return Param(f0_neuro_paramtab,this);
    845 }
    846 
    847 class NeuroExtParamTab: public ParamTab
    848 {
    849   public:
    850 NeuroExtParamTab():ParamTab(f0_neuro_paramtab)
     884        return Param(f0_neuro_paramtab, this);
     885}
     886
     887class NeuroExtParamTab : public ParamTab
     888{
     889public:
     890        NeuroExtParamTab() :ParamTab(f0_neuro_paramtab)
    851891        {
    852892#define FIELDSTRUCT NeuroExt
    853         ParamEntry entry={"class",2,0,"neuro class","s",GETSET(neuroclass)};
     893                ParamEntry entry = { "class", 2, 0, "neuro class", "s", GETSET(neuroclass) };
    854894#undef FIELDSTRUCT
    855         add(&entry);
     895                add(&entry);
    856896
    857897#define FIELDSTRUCT Neuro
    858         ParamEntry entry2={"state",2,0,"state","f",FIELD(state)};
     898                ParamEntry entry2 = { "state", 2, 0, "state", "f", FIELD(state) };
    859899#undef FIELDSTRUCT
    860         add(&entry2);
     900                add(&entry2);
    861901        }
    862902};
     
    864904Param& Neuro::getStaticParam()
    865905{
    866 static Param p(f0_neuro_paramtab,0,"NeuroDef");
    867 return p;
     906        static Param p(f0_neuro_paramtab, 0, "NeuroDef");
     907        return p;
    868908}
    869909
     
    872912NeuroConn::NeuroConn()
    873913{
    874 defassign();
     914        defassign();
    875915}
    876916
     
    879919ParamEntry *NeuroExt::getParamTab()
    880920{
    881 static NeuroExtParamTab tab;
    882 return tab.getParamTab();
     921        static NeuroExtParamTab tab;
     922        return tab.getParamTab();
    883923}
    884924
    885925void NeuroExt::get_neuroclass(PARAMGETARGS)
    886 {ret->setString(getClassName());}
     926{
     927        ret->setString(getClassName());
     928}
    887929
    888930int NeuroExt::set_neuroclass(PARAMSETARGS)
    889 {setClassName(arg->getString());return PSET_CHANGED;}
    890 
    891 
     931{
     932        setClassName(arg->getString()); return PSET_CHANGED;
     933}
Note: See TracChangeset for help on using the changeset viewer.