Freeing Surfaces ?

Blitz3D Forums/Blitz3D Programming/Freeing Surfaces ?

Stickman(Posted 2004) [#1]
Is there a way to free a surface to a mesh with out having to free the entire entity then rebuild it?

As fare as I can tell No.

My trouble with this ( if any one can help......)is in doing things this way , if the mesh you want to reduce the surface count with is in a parent/child hierarchy structure you lose the index order of that child to its parent.

Meaning if a Parent entity has 5 children and the child you want to remove the surface from is the 3rd child to the parent,when you free the entity then rebuild it,it now becomes the last child of the Hierarchy to the parent.

Here is an example if this helps or if you know of a way I can keep the childs Index order to the parent with out having to rebuild the whole hierarchy structure again.


;Remove Surface from a mesh. 
;Demo V 1.00
;Stickman

Graphics3D 640,480,16,2
SetBuffer BackBuffer()

;Create A Parent Entity......
Parent=CreatePivot()
NameEntity Parent,"Parent"

;Create 5 Children Meshes Grouped to the Parent Entity....
For C=1 To 5

 Child=CreateMesh(Parent)
 NameEntity Child,"Child_"+C

 ;Create 3 surfaces for Each Mesh
 For S=1 To 3
 surface=CreateSurface(Child)
 Next 

; Normally you would Create your Vertices and Triangles somewhere
;here but for this Demo Im only concerned with the Meshes
;handels and Index order to the parent.

Next

;Lets print out a list of all the meshes and there order to the parent.
Color 255,255,0
Print ""
Print " Entity Index to Parent Before removing Surface "
Print ""
Print " (Index)  (Surfaces) "
Color 0,0,255
Print "-------------------------------------------------------"
Color 255,255,0
For a=1 To CountChildren(Parent)
 Print " " +( EntityName ( GetChild(Parent,a) ) ) +"     "+( CountSurfaces( GetChild(Parent,a) ) )
Next
Color 0,0,255
Print "-------------------------------------------------------"
Print ""

;Now lets attempt to find and Remove all the surfaces from Child #(3) 
;then rebuild the mesh with only 1 surface but keep its Index to the 
;Parent entity the same with out having to rebuild all the meshes grouped
;to Parent entity.

;the selected child.....
Child3=GetChild(parent,3)

;Select Surface Removal method.
Color 255,0,255
Restore Text1
Read Line1$
Print Line1$
Read Line2$
Print Line2$
RemoveBy=Input( " Method # :" )
If Removeby>3 Removeby=3
RemoveSurfaceMethod=RemoveBy


;Lets count throught the childern and find the one we want
;to change or reduce its surface count.

For b=1 To CountChildren(Parent)
 If GetChild(parent,3)=Child3
  Origanalname$=EntityName(Child3)

   ;Remove the surface by.....
   Select RemoveSurfaceMethod

   Case 1 ;Freeing entity

   Method$="Freeing Entity"
   FreeEntity Child3
   ;ReCreate the entity....
   Child3=CreateMesh(Parent)
   NameEntity Child3,Origanalname$
   ;then add only one serface...
   surface=CreateSurface(Child3)

   Case 2 ;Clearing its surfaces

   Method$="Clearing surfaces"
   ;Lets clear all the surfaces.....
   For S=1 To CountSurfaces(Child3)
    ClearSurface GetSurface(Child3,S) , True , True 
   Next
   ;then rebuild a new one ( witch only adds one more to the surface count
   ;making the total surfaces for Child3 (4) No Good.
   surface=CreateSurface(Child3)


   Case 3 ;Blank....

   Method$="Your Idea..."
   ;Add Your Own Ideas here.......

   End Select 

   ;Now exit the loop as for we have found our entity and perfomed 
   ;all the changes we needed.
   Exit
 End If
Next
  
Color 0,255,0
Print ""
Print " Removed surfaces by..."+Method$

Color 255,255,0
;Print out the new order of the entites to the Parent.
Print ""
Print " Entity Index to Parent after removing Child3 surfaces " 
Print ""
Print " (Index)  (Surfaces) "
Color 0,0,255
Print "-------------------------------------------------------"
Color 255,255,0
For a=1 To CountChildren(Parent)
 Print " " +( EntityName ( GetChild(Parent,a) ) ) +"     "+( CountSurfaces( GetChild(Parent,a) ) )
Next
Color 0,0,255
Print "-------------------------------------------------------"
Color 255,0,0
Print ""
Print " Press any key to Quit...... "
WaitKey()
ClearWorld 
End


.Text1
Data " Select Removal Method : "
Data " (1)=FreeEntity  (2)=ClearSurface  (3)=Your Idea : "



Thanks for any Ideas you may have.


skidracer(Posted 2004) [#2]
You may be able to insert the new entity in the correct order by reordering the list after adding it by resetting the other children's order using the EntityParent command.

If EntityParent does move the entity to end of the child list (pretty sure it would) the list after you add the new version of child 3 would be 12453 so calling entityparent twice on the third child may be able to reorder the list, (first call should reorder to 12534 then next call will reorder to 12345).


Stickman(Posted 2004) [#3]
Thanks SkidRacer,
Your idea had crossed my mind,I was hoping that there might have been a command in Blitz for doing this that I was unaware of.

The only other way is to free all the entites grouped to the
parent then rebuild them all in the proper order.......(Not a good Idea),would proboly be faster attemting to just rebuild the hierarchy structure like you said.

Ill just have to play around with it and see how things work out

Thanks


Jeppe Nielsen(Posted 2004) [#4]
Is there a way to free a surface to a mesh with out having to free the entire entity then rebuild it?


ClearSurface surface,[clear_verts][,clear_triangles]


might do the job here.


Stickman(Posted 2004) [#5]
No that dose not remove the surface from the Mesh only clears the Tries and Verts for that surface. Take a look at my code posted above.

Thanks anyway.


Jeppe Nielsen(Posted 2004) [#6]
Oh ok, sorry, I just read your post very quickly.