Code archives/3D Graphics - Misc/NextChild(entity) function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Deceptively simple and very useful non-recursive function that allows you to access all sub-entities of a model as though they were all on the same level of the hierarchy. Very useful for applying an effect to a model in its entirety. [EDIT: This was a hard one to name, I did consider calling it NextEntity(). It basically returns the next entity - either the next sibling, first child or whatever until you have "seen" all entities in the model tree structure. ] Example of use - show names of all entities alien = LoadAnimMesh("alien.b3d") ent = alien While ent DebugLog EntityName(ent) ent = NextChild(ent) Wend Example 2 - change alpha of all entites alien = LoadAnimMesh("alien.b3d") ent = alien While ent EntityAlpha ent,0.3 ent = NextChild(ent) Wend Example 3 - count all tris in entity alien = LoadAnimMesh("alien.b3d") tris=0 ent = alien While ent For i = 1 To CountSurfaces(ent) tris = tris + CountTriangles(GetSurface(ent, i)) Next ent = NextChild(ent) Wend Debuglog tris Function: | |||||
Function NextChild(ent) Local siblingcnt If CountChildren(ent)>0 Return GetChild(ent,1) EndIf Local foundunused=False Local foundent = 0, parent,sibling While foundunused=False And ent<>0 parent = GetParent(ent) If parent<>0 If CountChildren(parent)>1 If GetChild(parent,CountChildren(parent))<>ent For siblingcnt = 1 To CountChildren(parent) sibling = GetChild(parent,siblingcnt) If sibling=ent foundunused = True foundent = GetChild(parent,siblingcnt+1) EndIf Next EndIf EndIf EndIf ent = parent Wend Return foundent End Function |
Comments
| ||
I've fixed an undeclared variable in NextChild(). Also, some more related functions: Function NextSibling(ent) Local childcnt,child Local par = GetParent(ent) If CountChildren(par)=1 Then Return False For childcnt = 1 To CountChildren(par)-1 child = GetChild(par,childcnt) If child = ent Then Return GetChild(par,childcnt+1) Next Return False End Function Function PrevSibling(ent) Local childcnt,child Local par = GetParent(ent) If CountChildren(par)=1 Then Return False For childcnt = CountChildren(par) To 2 Step -1 child = GetChild(par,childcnt) If child = ent Then Return GetChild(par,childcnt-1) Next Return False End Function ;examples alien = LoadAnimMesh("alien.b3d") ent = GetChild(alien,CountChildren(alien)) While ent DebugLog EntityName(ent) ent = PrevSibling(ent) Wend ent = GetChild(alien,1) While ent DebugLog EntityName(ent) ent = NextSibling(ent) Wend |
| ||
Very helpful! |
| ||
NextChild doesn't seem to work on 1.99! Can anyone confirm this? |
Code Archives Forum