December 03, 2020, 08:04:57 PM

Author Topic: [bb] Import OBJ by jfk EO-11110 [ 1+ years ago ]  (Read 754 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Import OBJ by jfk EO-11110 [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : Import OBJ
Author : jfk EO-11110
Posted : 1+ years ago

Description : Load an .OBJ Mesh in Blitz3D. Written by Terabit, only copied by me. The Texture Loading may not work and should be skiped, or edited.

Code :
Code: BlitzBasic
  1. ; By Terabit
  2.  
  3. Function LoadObj(file$)
  4.         Local infile, intex$, cmd$, themesh, blanksurf, ek, its
  5.         Local P1$, P2$, P3$, P4$, vtx1#, vtx2#, vtx3#, vtx4#
  6.         Local tx1#, tx2#, tx3#, tx4#, retmesh, v, uvo  
  7.         If FileType(file$)=0 Then Return -1
  8.         infile = ReadFile(file$)
  9.        
  10.         themesh = CreateMesh()
  11.         tempvert = CreateMesh()
  12.  
  13.         retmesh = CreateMesh()
  14.        
  15.         TempVertSurf = CreateSurface(tempvert)
  16.         blanksurf = CreateSurface(themesh)
  17.        
  18.         While Not Eof(infile)
  19.         intex$ = ReadLine$(infile)
  20.         cmd$ = ParseEntry(intex$,0)
  21.         its = CountIt(intex$," ")
  22.        
  23.         If its>1 Then P1$ = ParseEntry(Intex$,1) Else p1$=""
  24.  
  25.         If its>2 Then P2$ = ParseEntry(Intex$,2) Else p2$=""
  26.  
  27.         If its>3 Then P3$ = ParseEntry(Intex$,3) Else p3$=""
  28.  
  29.         If its>4 Then P4$ = ParseEntry(Intex$,4) Else p4$=""
  30.        
  31.         ;DebugLog "Command: "+cmd$+" P1: "+p1$+" P2: "+p2$+" P3: "+p3$+" P4: "+p4$
  32.        
  33.         Select cmd$
  34.         Case "V"
  35.         AddVertex blanksurf,Float(P1$),Float(P2$),Float(P3$)*-1
  36.         Case "VT"
  37.         AddVertex TempVertSurf,Rand(10),Rand(10),Rand(10)
  38.         VertexTexCoords TempVertSurf,vtx,Float(P1$),1-Float(P2$)
  39.         ;DebugLog "P1$="+p1$+" P2$= "+p2$
  40.  
  41.         ;DebugLog "U = "+P1$+" V = "+P2$
  42.         vtx = vtx + 1
  43.         Case "USEMTL"
  44.         DebugLog "Hoot "+P1$
  45.         currentsurf = CreateSurface(retmesh)
  46.         If Trim$(P1$)<>"" Then
  47.                 If Instr(p1$,".")<>0 And FileType(modelpath$+p1$)<>0 Then sometex = LoadTexture(modelpath$+p1$,1+VRAM) : Goto passway
  48.                 If FileType(modelpath$+p1$+".PNG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM) : Goto passway
  49.                 If FileType(modelpath$+p1$+".BMP")<>0 Then sometex = LoadTexture(modelpath$+p1$+".BMP",1+VRAM) : Goto passway
  50.                 If FileType(modelpath$+p1$+".TGA")<>0 Then sometex = LoadTexture(modelpath$+p1$+".TGA",1+VRAM) : Goto passway
  51.                 If FileType(modelpath$+p1$+".JPG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".JPG",1+VRAM) : Goto passway
  52.  
  53.                 sometex = CreateTexture(512,512,1+VRAM)
  54.                 SetBuffer TextureBuffer(sometex)
  55.                 ClsColor 128,128,128
  56.                 Cls
  57.                 SetBuffer BackBuffer()
  58.                 savetex(p1$+".PNG",sometex)
  59.                 FreeTexture sometex
  60.                 sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM)
  61. .passway
  62.                         If sometex<>0 Then
  63.                                 somebrush = CreateBrush(255,255,255)
  64.                                 BrushTexture somebrush,sometex
  65.                                 PaintSurface currentsurf,somebrush
  66.                         EndIf
  67.                 EndIf
  68.         Case "F"
  69.         If currentsurf = 0 Then
  70.                 currentsurf = CreateSurface(retmesh)
  71.                 sometex = CreateTexture(512,512,1+VRAM)
  72.                 SetBuffer TextureBuffer(sometex)
  73.                 ClsColor 128,128,128
  74.                 Cls
  75.                 SetBuffer BackBuffer()
  76.                 somebrush = CreateBrush(255,255,255)
  77.                 BrushTexture somebrush,sometex
  78.                 PaintSurface currentsurf,somebrush
  79.         EndIf
  80.        
  81.                 Vtx1# = -65535 : TX1# = -65535
  82.                 Vtx2# = -65535 : TX2# = -65535
  83.                 Vtx3# = -65535 : TX3# = -65535
  84.                 Vtx4# = -65535 : TX4# = -65535
  85.                        
  86.                 If its>1 Then
  87.                         ug = CountIT(P1$,"/")
  88.                         If ug>0 Then
  89.                         Vtx1#=Float(ParseEntry(p1$,0,"/"))-1
  90.                         EndIf
  91.        
  92.                         If ug>1 Then
  93.                         tx1# = Float(ParseEntry(p1$,1,"/"))-1
  94.                         EndIf
  95.                 EndIf
  96.  
  97.                 If its>2 Then
  98.                         ug = CountIT(P2$,"/")
  99.                         If ug>0 Then
  100.                         Vtx2#=Float(ParseEntry(p2$,0,"/"))-1
  101.                         EndIf
  102.        
  103.                         If ug>1 Then
  104.                         tx2# = Float(ParseEntry(p2$,1,"/"))-1
  105.                         EndIf
  106.                 EndIf
  107.  
  108.                 If its>3 Then
  109.                         ug = CountIT(P3$,"/")
  110.                         If ug>0 Then
  111.                         Vtx3#=Float(ParseEntry(p3$,0,"/"))-1
  112.                         EndIf
  113.        
  114.                         If ug>1 Then
  115.                         tx3# = Float(ParseEntry(p3$,1,"/"))-1
  116.                         EndIf
  117.                 EndIf
  118.                
  119.                
  120.                 If its>4 Then
  121.                         ug = CountIT(P4$,"/")
  122.                         If ug>0 Then
  123.                         Vtx4#=Float(ParseEntry(p4$,0,"/"))-1
  124.                         EndIf
  125.        
  126.                         If ug>1 Then
  127.                         tx4# = Float(ParseEntry(p4$,1,"/"))-1
  128.                         EndIf
  129.                 EndIf
  130.  
  131.                 If vtx1<0 Then vtx1 = 0
  132.                 If vtx2<0 Then vtx2 = 0
  133.                 If vtx3<0 Then vtx3 = 0
  134.                 If vtx4<0 Then vtx4 = 0
  135.                
  136.                 If vtx1>CountVertices(blanksurf)-1 Then vtx1 = CountVertices(blanksurf)-1
  137.                 If vtx2>CountVertices(blanksurf)-1 Then vtx2 = CountVertices(blanksurf)-1
  138.                 If vtx3>CountVertices(blanksurf)-1 Then vtx3 = CountVertices(blanksurf)-1
  139.                 If vtx4>CountVertices(blanksurf)-1 Then vtx4 = CountVertices(blanksurf)-1
  140.                
  141.                 If tx1>CountVertices(tempvertsurf)-1 Then tx1 = CountVertices(tempvertsurf)-1
  142.                 If tx2>CountVertices(tempvertsurf)-1 Then tx2 = CountVertices(tempvertsurf)-1
  143.                 If tx3>CountVertices(tempvertsurf)-1 Then tx3 = CountVertices(tempvertsurf)-1
  144.                 If tx4>CountVertices(tempvertsurf)-1 Then tx4 = CountVertices(tempvertsurf)-1
  145.                
  146.                 v = CountVertices(currentsurf)
  147.                
  148.                 If its>1 Then
  149.                        
  150.                         If tx1<0 Then tx1 = tx1 + vtx+1
  151.                        
  152.                         UVO = TX1
  153.                         If CountVertices(TempVertSurf)=0 Then
  154.                                 AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1)
  155.                         Else
  156.                                 AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
  157.                         EndIf
  158.                 EndIf
  159.                 If its>2 Then
  160.                         If tx2<0 Then tx2 = tx2 + vtx+1                
  161.                         UVO = TX2
  162.                         ;DebugLog "TX2= "+tx2
  163.                         If CountVertices(TempVertSurf)=0 Then
  164.                                 AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2)
  165.                         Else
  166.                                 AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
  167.                         EndIf
  168.                 EndIf
  169.                 If its>3 Then
  170.                         If tx3<0 Then tx3 = tx3 + vtx+1
  171.                         UVO = TX3
  172.                         ;DebugLog "TX3= "+tx3
  173.                         If CountVertices(TempVertSurf)=0 Then
  174.                         AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3)
  175.                         Else
  176.                         AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
  177.                         EndIf
  178.                 EndIf
  179.                 If its>4 Then
  180.                         If tx4<0 Then tx4 = tx4 + vtx+1                
  181.                         UVO = TX4
  182.                         If CountVertices(TempVertSurf)=0 Then
  183.                         AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4)
  184.                         Else
  185.                         AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
  186.                         EndIf
  187.                 EndIf
  188.                
  189.                 AddTriangle currentsurf,v,v+1,v+2
  190.                
  191.                 If its>4 Then
  192.                         AddTriangle currentsurf,v+2,v+3,v
  193.                 EndIf
  194.                                
  195.         End Select
  196.        
  197.         Wend
  198.         CloseFile infile
  199.         FitMesh retmesh,0,0,0,1,1,1,True
  200.         FlipMesh retmesh
  201.         centermesh (retmesh)
  202.         UpdateNormals retmesh
  203.         FreeEntity tempvert
  204.         FreeEntity themesh
  205.        
  206.         Return retmesh
  207. End Function
  208.  
  209. Function ParseEntry$( Message$, Item, Sep$ = " ")
  210.         Local fas, count, spos, epos, num#, epon#,pos
  211.        
  212.         Repeat
  213.                 fas = Instr(message$,sep$,fas+1)
  214.                 count = count + 1
  215.         Until fas = 0 Or count = item
  216.        
  217.         spos = fas+1
  218.         epos = Instr(message$+sep$,sep$,fas+1)
  219.         grub$ = Upper$(Trim$(Mid$(message$,spos,(epos-spos))))
  220.         If Instr(grub$,"E-") Then
  221.                 pos = Instr(grub$,"E-")
  222.                 ;1.41e-02 = 1.41 * (10 ^ -2)
  223.                 num# = Left$(grub$,pos-1)
  224.                 epon# = Mid$(grub$,pos+1,Len(grub$)-(pos))
  225.                 ;'DebugLog "Total: "+grub$
  226.                 ;'DebugLog "Num: "+num#
  227.                 ;'DebugLog "etex: "+Mid$(grub$,pos+1,Len(grub$)-(pos))
  228.                 ;'DebugLog "Exp: "+epon#
  229.                 num# = num# * (10 ^ epon#)
  230.                 Return num#
  231.                 Return "0.0"
  232.         Else
  233.                 Return grub$
  234.         EndIf
  235. End Function
  236.  
  237. Function CountIt( Message$, Sep$=" ")
  238.         message$=Trim$(message$)
  239.         Local fas, count
  240.         Repeat
  241.         fas = Instr(message$,sep$,fas+1)
  242.                 If fas<>0 Then count = count + 1
  243.         Until fas = 0
  244.        
  245.         Return count+1
  246. End Function
  247. Function CenterMesh (entity)
  248.     FitMesh entity, -(MeshWidth (entity) / 2), -(MeshHeight (entity) / 2), -(MeshDepth (entity) / 2), MeshWidth (entity), MeshHeight (entity), MeshDepth (entity)
  249. End Function


Comments :


Junkprogger(Posted 1+ years ago)

 Good work. If you allow me, I will use it in my programm.


TeraBit(Posted 1+ years ago)

 Use away.


JoshK(Posted 1+ years ago)

 This function is pretty buggy.  It won't even compile.


markcw(Posted 1+ years ago)

 its not buggy. it's just got a function called SaveTex in it which isn't there because it's "tattoo specific", this post explains it.<a href="../Community/posts7927.html?topic=44535" target="_blank">http://www.blitzbasic.com/Community/posts.php?topic=44535[/url]so you comment that line out and then it's ok. also here is a working example.
Code: [Select]
Graphics3D 640,480,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
light=CreateLight()
RotateEntity light,90,0,0

filename$="yourname.obj"

obj=LoadObj(filename$)
PositionEntity obj,0,0,5

While Not KeyHit(1)
 RenderWorld
 
 TurnEntity obj,0.4,0.3,0.2

 Text 0,0,"filename$="+filename$

 Flip
Wend

; By Terabit

Function LoadObj(file$)
 Local infile, intex$, cmd$, themesh, blanksurf, ek, its
 Local P1$, P2$, P3$, P4$, vtx1#, vtx2#, vtx3#, vtx4#
 Local tx1#, tx2#, tx3#, tx4#, retmesh, v, uvo
 If FileType(file$)=0 Then Return -1
 infile = ReadFile(file$)
 
 themesh = CreateMesh()
 tempvert = CreateMesh()
 retmesh = CreateMesh()
 
 TempVertSurf = CreateSurface(tempvert)
 blanksurf = CreateSurface(themesh)
 
 While Not Eof(infile)
 intex$ = ReadLine$(infile)
 cmd$ = ParseEntry(intex$,0)
 its = CountIt(intex$," ")
 
 If its>1 Then P1$ = ParseEntry(Intex$,1) Else p1$=""
 If its>2 Then P2$ = ParseEntry(Intex$,2) Else p2$=""
 If its>3 Then P3$ = ParseEntry(Intex$,3) Else p3$=""
 If its>4 Then P4$ = ParseEntry(Intex$,4) Else p4$=""
 
 ;DebugLog "Command: "+cmd$+" P1: "+p1$+" P2: "+p2$+" P3: "+p3$+" P4: "+p4$
 
 Select cmd$
 Case "V"
 AddVertex blanksurf,Float(P1$),Float(P2$),Float(P3$)*-1
 Case "VT"
 AddVertex TempVertSurf,Rand(10),Rand(10),Rand(10)
 VertexTexCoords TempVertSurf,vtx,Float(P1$),1-Float(P2$)
 ;DebugLog "P1$="+p1$+" P2$= "+p2$
 ;DebugLog "U = "+P1$+" V = "+P2$
 vtx = vtx + 1
 Case "USEMTL"
 DebugLog "Hoot "+P1$
 currentsurf = CreateSurface(retmesh)
 If Trim$(P1$)<>"" Then
  If Instr(p1$,".")<>0 And FileType(modelpath$+p1$)<>0 Then sometex = LoadTexture(modelpath$+p1$,1+VRAM) : Goto passway
  If FileType(modelpath$+p1$+".PNG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM) : Goto passway
  If FileType(modelpath$+p1$+".BMP")<>0 Then sometex = LoadTexture(modelpath$+p1$+".BMP",1+VRAM) : Goto passway
  If FileType(modelpath$+p1$+".TGA")<>0 Then sometex = LoadTexture(modelpath$+p1$+".TGA",1+VRAM) : Goto passway
  If FileType(modelpath$+p1$+".JPG")<>0 Then sometex = LoadTexture(modelpath$+p1$+".JPG",1+VRAM) : Goto passway

  sometex = CreateTexture(512,512,1+VRAM)
  SetBuffer TextureBuffer(sometex)
  ClsColor 128,128,128
  Cls
  SetBuffer BackBuffer()
  ;savetex(p1$+".PNG",sometex)
  FreeTexture sometex
  sometex = LoadTexture(modelpath$+p1$+".PNG",1+VRAM)

.passway
   If sometex<>0 Then
    somebrush = CreateBrush(255,255,255)
    BrushTexture somebrush,sometex
    PaintSurface currentsurf,somebrush
   EndIf
  EndIf
 Case "F"
 If currentsurf = 0 Then
  currentsurf = CreateSurface(retmesh)
  sometex = CreateTexture(512,512,1+VRAM)
  SetBuffer TextureBuffer(sometex)
  ClsColor 128,128,128
  Cls
  SetBuffer BackBuffer()
  somebrush = CreateBrush(255,255,255)
  BrushTexture somebrush,sometex
  PaintSurface currentsurf,somebrush
 EndIf
 
  Vtx1# = -65535 : TX1# = -65535
  Vtx2# = -65535 : TX2# = -65535
  Vtx3# = -65535 : TX3# = -65535
  Vtx4# = -65535 : TX4# = -65535
   
  If its>1 Then
   ug = CountIT(P1$,"/")
   If ug>0 Then
   Vtx1#=Float(ParseEntry(p1$,0,"/"))-1
   EndIf
 
   If ug>1 Then
   tx1# = Float(ParseEntry(p1$,1,"/"))-1
   EndIf
  EndIf

  If its>2 Then
   ug = CountIT(P2$,"/")
   If ug>0 Then
   Vtx2#=Float(ParseEntry(p2$,0,"/"))-1
   EndIf
 
   If ug>1 Then
   tx2# = Float(ParseEntry(p2$,1,"/"))-1
   EndIf
  EndIf

  If its>3 Then
   ug = CountIT(P3$,"/")
   If ug>0 Then
   Vtx3#=Float(ParseEntry(p3$,0,"/"))-1
   EndIf
 
   If ug>1 Then
   tx3# = Float(ParseEntry(p3$,1,"/"))-1
   EndIf
  EndIf
 
 
  If its>4 Then
   ug = CountIT(P4$,"/")
   If ug>0 Then
   Vtx4#=Float(ParseEntry(p4$,0,"/"))-1
   EndIf
 
   If ug>1 Then
   tx4# = Float(ParseEntry(p4$,1,"/"))-1
   EndIf
  EndIf

  If vtx1<0 Then vtx1 = 0
  If vtx2<0 Then vtx2 = 0
  If vtx3<0 Then vtx3 = 0
  If vtx4<0 Then vtx4 = 0
 
  If vtx1>CountVertices(blanksurf)-1 Then vtx1 = CountVertices(blanksurf)-1
  If vtx2>CountVertices(blanksurf)-1 Then vtx2 = CountVertices(blanksurf)-1
  If vtx3>CountVertices(blanksurf)-1 Then vtx3 = CountVertices(blanksurf)-1
  If vtx4>CountVertices(blanksurf)-1 Then vtx4 = CountVertices(blanksurf)-1
 
  If tx1>CountVertices(tempvertsurf)-1 Then tx1 = CountVertices(tempvertsurf)-1
  If tx2>CountVertices(tempvertsurf)-1 Then tx2 = CountVertices(tempvertsurf)-1
  If tx3>CountVertices(tempvertsurf)-1 Then tx3 = CountVertices(tempvertsurf)-1
  If tx4>CountVertices(tempvertsurf)-1 Then tx4 = CountVertices(tempvertsurf)-1
 
  v = CountVertices(currentsurf)
 
  If its>1 Then
   If tx1<0 Then tx1 = tx1 + vtx+1
   UVO = TX1
   If CountVertices(TempVertSurf)=0 Then
    AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1)
   Else
    AddVertex currentsurf,VertexX(blanksurf,vtx1),VertexY(blanksurf,vtx1),VertexZ(blanksurf,vtx1),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
   EndIf
  EndIf
  If its>2 Then
   If tx2<0 Then tx2 = tx2 + vtx+1    
   UVO = TX2
   ;DebugLog "TX2= "+tx2
   If CountVertices(TempVertSurf)=0 Then
    AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2)
   Else
    AddVertex currentsurf,VertexX(blanksurf,vtx2),VertexY(blanksurf,vtx2),VertexZ(blanksurf,vtx2),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
   EndIf
  EndIf
  If its>3 Then
   If tx3<0 Then tx3 = tx3 + vtx+1
   UVO = TX3
   ;DebugLog "TX3= "+tx3
   If CountVertices(TempVertSurf)=0 Then
   AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3)
   Else
   AddVertex currentsurf,VertexX(blanksurf,vtx3),VertexY(blanksurf,vtx3),VertexZ(blanksurf,vtx3),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
   EndIf
  EndIf
  If its>4 Then
   If tx4<0 Then tx4 = tx4 + vtx+1    
   UVO = TX4
   If CountVertices(TempVertSurf)=0 Then
   AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4)
   Else
   AddVertex currentsurf,VertexX(blanksurf,vtx4),VertexY(blanksurf,vtx4),VertexZ(blanksurf,vtx4),VertexU(TempVertSurf,UVO),VertexV(TempVertSurf,UVO)
   EndIf
  EndIf
 
  AddTriangle currentsurf,v,v+1,v+2
 
  If its>4 Then
   AddTriangle currentsurf,v+2,v+3,v
  EndIf
   
 End Select
 
 Wend
 CloseFile infile
 FitMesh retmesh,0,0,0,1,1,1,True
 FlipMesh retmesh
 centermesh (retmesh)
 UpdateNormals retmesh
 FreeEntity tempvert
 FreeEntity themesh
 
 Return retmesh
End Function

Function ParseEntry$( Message$, Item, Sep$ = " ")
 Local fas, count, spos, epos, num#, epon#,pos
 
 Repeat
  fas = Instr(message$,sep$,fas+1)
  count = count + 1
 Until fas = 0 Or count = item
 
 spos = fas+1
 epos = Instr(message$+sep$,sep$,fas+1)
 grub$ = Upper$(Trim$(Mid$(message$,spos,(epos-spos))))
 If Instr(grub$,"E-") Then
  pos = Instr(grub$,"E-")
  ;1.41e-02 = 1.41 * (10 ^ -2)
  num# = Left$(grub$,pos-1)
  epon# = Mid$(grub$,pos+1,Len(grub$)-(pos))
  ;'DebugLog "Total: "+grub$
  ;'DebugLog "Num: "+num#
  ;'DebugLog "etex: "+Mid$(grub$,pos+1,Len(grub$)-(pos))
  ;'DebugLog "Exp: "+epon#
  num# = num# * (10 ^ epon#)
  Return num#
  Return "0.0"
 Else
  Return grub$
 EndIf
End Function

Function CountIt( Message$, Sep$=" ")
 message$=Trim$(message$)
 Local fas, count
 Repeat
 fas = Instr(message$,sep$,fas+1)
  If fas<>0 Then count = count + 1
 Until fas = 0
 
 Return count+1
End Function

Function CenterMesh (entity)
    FitMesh entity, -(MeshWidth (entity) / 2), -(MeshHeight (entity) / 2), -(MeshDepth (entity) / 2), MeshWidth (entity), MeshHeight (entity), MeshDepth (entity)
End Function


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal