Changeset 714 for cpp/frams/model/modelparts.cpp
- Timestamp:
- 11/05/17 21:45:20 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/model/modelparts.cpp
r640 r714 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-201 5Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2017 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 30 30 31 31 template<> 32 char ModelUserTags::reg[5] ={0};32 char ModelUserTags::reg[5] = { 0 }; 33 33 34 34 ///////////////////////// 35 35 36 36 PartBase::~PartBase() 37 {if (mapped) delete mapped;} 37 { 38 if (mapped) delete mapped; 39 } 38 40 39 41 void PartBase::notifyMappingChange() 40 42 { 41 if (owner) owner->partmappingchanged=1;43 if (owner) owner->partmappingchanged = 1; 42 44 } 43 45 44 46 void PartBase::setMapping(const IRange &r) 45 47 { 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(); 49 51 } 50 52 51 53 void PartBase::clearMapping() 52 54 { 53 if (mapped) {delete mapped; mapped=0;}55 if (mapped) { delete mapped; mapped = 0; } 54 56 } 55 57 56 58 void PartBase::addMapping(const IRange &r) 57 59 { 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(); 61 63 } 62 64 63 65 void PartBase::setMapping(const MultiRange &mr) 64 66 { 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(); 68 70 } 69 71 70 72 void PartBase::addMapping(const MultiRange &mr) 71 73 { 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 79 void PartBase::setInfo(const SString& name, const SString& value) 80 { 81 strSetField(info, name, value); 82 } 83 84 void PartBase::setInfo(const SString& name, int value) 85 { 86 setInfo(name, SString::valueOf(value)); 87 } 88 89 void PartBase::setInfo(const SString& name, double value) 90 { 91 setInfo(name, SString::valueOf(value)); 90 92 } 91 93 92 94 SString PartBase::getInfo(const SString& name) 93 95 { 94 return strGetField(info,name);96 return strGetField(info, name); 95 97 } 96 98 97 99 ///////////////////////// 98 100 99 NeuroClass::NeuroClass(ParamEntry *_props, SString _description,100 int _prefinputs,int _prefoutput,int _preflocation,101 int *_vectordata,bool own_vd,int vhints)101 NeuroClass::NeuroClass(ParamEntry *_props, SString _description, 102 int _prefinputs, int _prefoutput, int _preflocation, 103 int *_vectordata, bool own_vd, int vhints) 102 104 :ownedvectordata(own_vd), 103 name(_props->name),longname(_props->id),description(_description),104 props(_props),ownedprops(false),105 106 107 108 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) 110 112 {} 111 113 112 114 NeuroClass::~NeuroClass() 113 115 { 114 setSymbolGlyph(0,0);115 if (props && ownedprops)116 ParamObject::freeParamTab(props);116 setSymbolGlyph(0, 0); 117 if (props && ownedprops) 118 ParamObject::freeParamTab(props); 117 119 } 118 120 119 121 NeuroClass::NeuroClass() 120 122 :ownedvectordata(0), 121 122 props(empty_paramtab),ownedprops(false),123 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) 126 128 {} 127 129 130 void 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 139 void 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 128 148 SString NeuroClass::getSummary() 129 149 { 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 193 Neuro::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 208 Neuro::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 227 Neuro::~Neuro() 228 { 229 #ifdef MODEL_V1_COMPATIBLE 230 if (olditems) delete olditems; 231 #endif 157 232 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 240 SString** Neuro::inputInfo(int i) 241 { 242 if (i >= getInputCount()) return 0; 243 return &inputs(i).info; 244 } 245 246 void 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 254 void Neuro::setInputInfo(int i, const SString& name, int value) 255 { 256 setInputInfo(i, name, SString::valueOf(value)); 257 } 258 259 void Neuro::setInputInfo(int i, const SString& name, double value) 260 { 261 setInputInfo(i, name, SString::valueOf(value)); 262 } 263 264 SString 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 272 SString 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 280 void Neuro::operator=(const Neuro& src) 281 { 282 refno = src.refno; 175 283 #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; 177 291 #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; 283 303 } 284 304 285 305 void Neuro::attachToPart(int i) 286 {attachToPart((i>=0)?owner->getPart(i):0);} 306 { 307 attachToPart((i >= 0) ? owner->getPart(i) : 0); 308 } 287 309 288 310 void Neuro::attachToJoint(int i) 289 {attachToJoint((i>=0)?owner->getJoint(i):0);} 311 { 312 attachToJoint((i >= 0) ? owner->getJoint(i) : 0); 313 } 290 314 291 315 int Neuro::getClassCount() 292 {return NeuroLibrary::staticlibrary.getClassCount();} 316 { 317 return NeuroLibrary::staticlibrary.getClassCount(); 318 } 293 319 294 320 NeuroClass* Neuro::getClass(int classindex) 295 {return NeuroLibrary::staticlibrary.getClass(classindex);} 321 { 322 return NeuroLibrary::staticlibrary.getClass(classindex); 323 } 296 324 297 325 NeuroClass* Neuro::getClass(const SString& classname) 298 {return NeuroLibrary::staticlibrary.findClass(classname);} 326 { 327 return NeuroLibrary::staticlibrary.findClass(classname); 328 } 299 329 300 330 int Neuro::getClassIndex(const NeuroClass*nc) 301 {return NeuroLibrary::staticlibrary.classes.find((void*)nc);} 331 { 332 return NeuroLibrary::staticlibrary.classes.find((void*)nc); 333 } 302 334 303 335 NeuroClass* Neuro::getClass() 304 336 { 305 checkClass();306 return myclass;337 checkClass(); 338 return myclass; 307 339 } 308 340 309 341 void Neuro::setClass(NeuroClass* cl) 310 342 { 311 myclass=cl;312 myclassname=cl->getName();313 knownclass=1;343 myclass = cl; 344 myclassname = cl->getName(); 345 knownclass = 1; 314 346 } 315 347 316 348 SString Neuro::getClassName(int classindex) 317 349 { 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(); 320 352 } 321 353 322 354 void Neuro::setDetails(const SString& details) 323 355 { 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; 328 360 } 329 361 330 362 SString Neuro::getDetails() 331 363 { 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; 335 367 } 336 368 337 369 void Neuro::checkClass() 338 370 { 339 if (knownclass) return;340 myclass=getClass(myclassname);341 knownclass=1;371 if (knownclass) return; 372 myclass = getClass(myclassname); 373 knownclass = 1; 342 374 } 343 375 344 376 SyntParam Neuro::classProperties(bool handle_defaults_when_saving) 345 377 { 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); 349 381 } 350 382 351 383 SString Neuro::getClassName() 352 384 { 353 return myclassname;385 return myclassname; 354 386 } 355 387 356 388 void Neuro::setClassName(const SString& clazz) 357 389 { 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 394 int 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; 368 400 } 369 401 370 402 int Neuro::findInput(Neuro* child) const 371 403 { 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) const378 { 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 409 Neuro* 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; 383 415 } 384 416 385 417 double Neuro::getInputWeight(int i) const 386 418 { 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 422 void Neuro::setInputWeight(int i, double w) 423 { 424 inputs(i).weight = w; 425 } 426 427 void Neuro::setInput(int i, Neuro* n) 428 { 429 NInput &inp = inputs(i); 430 inp.n = n; 431 } 432 433 void Neuro::setInput(int i, Neuro* n, double w) 434 { 435 NInput &inp = inputs(i); 436 inp.n = n; 437 inp.weight = w; 406 438 } 407 439 408 440 void Neuro::removeInput(int refno) 409 441 { 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); 416 448 } 417 449 418 450 int Neuro::removeInput(Neuro* child) 419 451 { 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; 423 455 } 424 456 425 457 int Neuro::getOutputsCount() const 426 458 { 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 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; 431 463 } 432 464 433 465 int Neuro::isOldEffector() 434 466 { 435 static SString bend("|"),rot("@");436 return ((getClassName()==bend)||(getClassName()==rot));467 static SString bend("|"), rot("@"); 468 return ((getClassName() == bend) || (getClassName() == rot)); 437 469 } 438 470 439 471 int Neuro::isOldReceptor() 440 472 { 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)); 443 475 } 444 476 445 477 int Neuro::isOldNeuron() 446 478 { 447 static SString n("N");448 return (getClassName()==n);479 static SString n("N"); 480 return (getClassName() == n); 449 481 } 450 482 451 483 int Neuro::isNNConnection() 452 484 { 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) const458 { 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) const485 static SString conn("-"); 486 return (getClassName() == conn); 487 } 488 489 int 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 507 int Neuro::findOutputs(SList& result, const char* classname, const Part* part, const Joint* joint) const 476 508 { // 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) 491 523 { 492 result +=(void*)nu;524 result += (void*)nu; 493 525 break; 494 526 } 495 527 } 496 return result.size()-n0;528 return result.size() - n0; 497 529 } 498 530 499 531 void 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 536 void 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 545 void 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 554 void 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); 527 561 } 528 562 … … 530 564 { 531 565 #ifndef SDK_WITHOUT_FRAMS 532 NeuroClassExt::makeStaticObject(ret,getClass());566 NeuroClassExt::makeStaticObject(ret, getClass()); 533 567 #endif 534 568 } … … 538 572 void OldItems::buildlist() 539 573 { // guaranteed to work only for old NN layouts 540 541 if (listok) return;542 543 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()) 549 583 { 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; 557 591 } 558 else592 else 559 593 { 560 items+=n;561 n->weight=w;594 items+=n; 595 n->weight=w; 562 596 } 563 597 } 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; 573 607 } 574 608 575 609 void OldItems::freelist() 576 610 { 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; 582 616 } 583 617 584 618 int OldItems::getItemCount() 585 619 { 586 buildlist();587 return items.size();620 buildlist(); 621 return items.size(); 588 622 } 589 623 590 624 NeuroItem *OldItems::getNeuroItem(int i) 591 625 { 592 buildlist();593 return (NeuroItem*)items(i);626 buildlist(); 627 return (NeuroItem*)items(i); 594 628 } 595 629 596 630 NeuroItem *OldItems::addNewNeuroItem() 597 631 { 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; 603 637 } 604 638 605 639 int OldItems::findNeuroItem(NeuroItem *ni) 606 640 { 607 buildlist();608 return items.find((void*)ni);641 buildlist(); 642 return items.find((void*)ni); 609 643 } 610 644 #endif … … 613 647 614 648 SString Part::getDefaultStyle() 615 {return SString("part");} 649 { 650 return SString("part"); 651 } 616 652 SString Joint::getDefaultStyle() 617 {return SString("joint");} 653 { 654 return SString("joint"); 655 } 618 656 /* 619 657 const SString& Neuro::getDefaultStyle() … … 623 661 */ 624 662 SString 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 667 Part::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; 636 676 } 637 677 638 678 void Part::operator=(const Part& src) 639 679 { 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; 655 695 } 656 696 657 697 void Part::setOrient(const Orient &_o) 658 698 { 659 o=_o;660 rot.getAngles(o.x,o.z);699 o = _o; 700 rot.getAngles(o.x, o.z); 661 701 } 662 702 663 703 void Part::setRot(const Pt3D &r) 664 704 { 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 710 void 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); 676 716 } 677 717 678 718 Param& Part::getStaticParam() 679 719 { 680 static Param p(f0_part_paramtab,0,"Part");681 return p;720 static Param p(f0_part_paramtab, 0, "Part"); 721 return p; 682 722 } 683 723 … … 685 725 /////////////////////////// 686 726 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;727 Joint::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; 697 737 } 698 738 699 739 void Joint::operator=(const Joint& src) 700 740 { 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 754 void Joint::attachToParts(Part* p1, Part* p2) 755 { 756 part1 = p1; 757 part2 = p2; 758 if (p1 && p2) 759 { 760 o = rot; 761 if (usedelta) 722 762 { 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; 726 766 } 727 767 } 728 768 } 729 769 730 void Joint::attachToParts(int p1, int p2)731 { 732 attachToParts((p1>=0)?owner->getPart(p1):0,(p2>=0)?owner->getPart(p2):0);770 void Joint::attachToParts(int p1, int p2) 771 { 772 attachToParts((p1 >= 0) ? owner->getPart(p1) : 0, (p2 >= 0) ? owner->getPart(p2) : 0); 733 773 } 734 774 735 775 void Joint::resetDelta() 736 776 { 737 d=Pt3D(JOINT_DELTA_MARKER,JOINT_DELTA_MARKER,JOINT_DELTA_MARKER);777 d = Pt3D(JOINT_DELTA_MARKER, JOINT_DELTA_MARKER, JOINT_DELTA_MARKER); 738 778 } 739 779 740 780 void Joint::resetDeltaMarkers() 741 781 { 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; 745 785 } 746 786 747 787 void Joint::useDelta(bool use) 748 788 { 749 usedelta=use;789 usedelta = use; 750 790 } 751 791 752 792 bool Joint::isDelta() 753 793 { 754 return usedelta;794 return usedelta; 755 795 } 756 796 757 797 Param& Joint::getStaticParam() 758 798 { 759 static Param p(f0_joint_paramtab,0,"Joint");760 return p;799 static Param p(f0_joint_paramtab, 0, "Joint"); 800 return p; 761 801 } 762 802 … … 772 812 ParamEntry f0_old_neuro_tab[]= 773 813 { 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,}, 783 823 }; 784 824 #undef FIELDSTRUCT … … 787 827 ParamEntry f0_neuroitem_paramtab[]= 788 828 { 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,}, 805 845 }; 806 846 #undef FIELDSTRUCT … … 809 849 //////////////////////////////////////// 810 850 811 ParamEntry Neuro::emptyParamTab[] =812 { 813 {"Undefined Neuro",1,0,"?",},814 {0,0,0,},851 ParamEntry Neuro::emptyParamTab[] = 852 { 853 { "Undefined Neuro", 1, 0, "?", }, 854 { 0, 0, 0, }, 815 855 }; 816 856 817 857 Param Part::extraProperties() 818 858 { 819 return Param(f0_part_xtra_paramtab,this);859 return Param(f0_part_xtra_paramtab, this); 820 860 } 821 861 822 862 Param Joint::extraProperties() 823 863 { 824 return Param(f0_joint_xtra_paramtab,this);864 return Param(f0_joint_xtra_paramtab, this); 825 865 } 826 866 827 867 Param Neuro::extraProperties() 828 868 { 829 return Param(f0_neuro_xtra_paramtab,this);869 return Param(f0_neuro_xtra_paramtab, this); 830 870 } 831 871 832 872 Param Part::properties() 833 873 { 834 return Param(f0_part_paramtab,this);874 return Param(f0_part_paramtab, this); 835 875 } 836 876 837 877 Param Joint::properties() 838 878 { 839 return Param(usedelta?f0_joint_paramtab:f0_nodeltajoint_paramtab,this);879 return Param(usedelta ? f0_joint_paramtab : f0_nodeltajoint_paramtab, this); 840 880 } 841 881 842 882 Param Neuro::properties() 843 883 { 844 return Param(f0_neuro_paramtab,this);845 } 846 847 class NeuroExtParamTab : public ParamTab848 { 849 850 NeuroExtParamTab():ParamTab(f0_neuro_paramtab)884 return Param(f0_neuro_paramtab, this); 885 } 886 887 class NeuroExtParamTab : public ParamTab 888 { 889 public: 890 NeuroExtParamTab() :ParamTab(f0_neuro_paramtab) 851 891 { 852 892 #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) }; 854 894 #undef FIELDSTRUCT 855 add(&entry);895 add(&entry); 856 896 857 897 #define FIELDSTRUCT Neuro 858 ParamEntry entry2={"state",2,0,"state","f",FIELD(state)};898 ParamEntry entry2 = { "state", 2, 0, "state", "f", FIELD(state) }; 859 899 #undef FIELDSTRUCT 860 add(&entry2);900 add(&entry2); 861 901 } 862 902 }; … … 864 904 Param& Neuro::getStaticParam() 865 905 { 866 static Param p(f0_neuro_paramtab,0,"NeuroDef");867 return p;906 static Param p(f0_neuro_paramtab, 0, "NeuroDef"); 907 return p; 868 908 } 869 909 … … 872 912 NeuroConn::NeuroConn() 873 913 { 874 defassign();914 defassign(); 875 915 } 876 916 … … 879 919 ParamEntry *NeuroExt::getParamTab() 880 920 { 881 static NeuroExtParamTab tab;882 return tab.getParamTab();921 static NeuroExtParamTab tab; 922 return tab.getParamTab(); 883 923 } 884 924 885 925 void NeuroExt::get_neuroclass(PARAMGETARGS) 886 {ret->setString(getClassName());} 926 { 927 ret->setString(getClassName()); 928 } 887 929 888 930 int 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.