Making of copy of a entity
Blitz3D Forums/Blitz3D Programming/Making of copy of a entity
| ||
Does any one have ideas on how to make a complete copy of a mesh entity? CopyEntity is more like CloneEntity in that the mesh info is shared. CopyMesh does not copy info like textures, surface colors, etc. I wonder if any of the 'hacked Blitz info' could help ;? |
| ||
Why not simply rebuild the surface by surface, vert by vert, etc? |
| ||
You could use CopyMesh() and then take a look at all the brush info of the original using the new GetSurfaceBrush() etc commands to re-paint the new mesh. |
| ||
I have tried copymesh but have not got GetSurfaceBrush() to work yet. I am doing it copying vert by vert, as copymesh is not predictable. It seems to get confused with cylinders graphics3d 400,300,0,2 cyl1=createcylinder(5,1) print " surfaces in cylinder "+countsurfaces(cyl1) cyl2=copymesh(cyl1) print " surfaces after copymesh " +countsurfaces(cyl2) This prints; surfaces in cylinder 2 surfaces after copymesh 1 If you do the same thing with a loaded mesh it keeps multiple surfaces correctly. Does anyone have, or think they can write a function to create a exact copy of any type of mesh entity? I thought this would be easy!!! |
| ||
This is as close as I have got with creating a true mesh entity copy. Textures must applied via brushes for them to copy. Function CopyMeshEntity(mesh,parent=0) local surf,scount,count,tricount local sbrush,newsurf,crner,vcrner,vert NewMesh = createmesh(parent) ; NewMesh = copymesh(mesh) if parent = 0 then entityparent NewMesh,getparent(mesh) EntBrush=GetEntityBrush(Mesh) paintentity NewMesh,EntBrush For scount = 1 To countsurfaces(Mesh) surf=GetSurface(Mesh,scount) NewBrush=GetSurfaceBrush(surf) ;NewSurf = GetSurface(NewMesh,scount); If copymesh is used NewSurf = createsurface(NewMesh,NewBrush) ;CopyMesh Replacement for count = 0 to counttriangles(surf)-1 for crner = 0 to 2 vcrner = TriangleVertex(surf,count,crner) vert=addvertex(NewSurf,vertexx(surf,vcrner),vertexy(surf,vcrner),vertexz(surf,vcrner),vertexu(surf,vcrner),vertexv(surf,vcrner)) vertexcolor NewSurf,vert,vertexred(surf,vcrner),vertexgreen(surf,vcrner),vertexblue(surf,vcrner) next AddTriangle (NewSurf,vert-2,vert-1,vert) next freebrush Newbrush ; if EntBrush>1 then freebrush Entbrush next return NewMesh end function Not perfect but it does what I need for now! |
| ||
Why aren't you freeing EntBrush? |
| ||
The Entity Brush "EntBrush" contains the same brush handle as the Surface brush "NewBrush". So Freeing the Entity Brush came up with a error as the Surface brush had already been freed! I do not understand the logic of this ! The handles from many of the new commands do not seem right. Both of these commands are reported to create a new brush, but it does not seem to be the case. |