November 28, 2020, 01:54:15 PM

Author Topic: [bb] Discworld by Krischan [ 1+ years ago ]  (Read 615 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Discworld by Krischan [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : Discworld
Author : Krischan
Posted : 1+ years ago

Description : This is just a nice effect I made last christmas when I was bored. It is completely useless unless you're interested in procedural programming. It shows a snow globe with swirling snowflakes, a disc shaped random terrain (based on sswifts perlin noise) with texture and normal map, wood textures and a simple glass sphere effect - everything generated in runtime.

You can steer the cam with Arrows/Mouse, SPACE is wireframe and RETURN creates a new scene. Don't add too many snowflakes or it will slow down.

 Have fun!



Code :
Code: BlitzBasic
  1. AppTitle "Discworld"
  2.  
  3. Graphics3D 800,600,32,2
  4.  
  5. Global camx#,camy#,camz#,camp#,camw#,camr#,keepcam%=False,tx%
  6.  
  7. SeedRnd 6
  8.  
  9. Type snow
  10.        
  11.         Field entity%
  12.         Field size#
  13.         Field distance#
  14.         Field pivot%
  15.         Field speed_p#
  16.         Field speed_y#
  17.         Field speed_r#
  18.        
  19. End Type
  20.  
  21.  
  22. ; Constants
  23. Const HEIGHTMAP_SIZE%=256
  24. Const MAXCOLS%=2^16
  25. Const DIV3#=1.0/3
  26. Const PATCHSIZE%=64
  27. Const DETAIL%=64
  28. Const SNOWFLAKES%=1000
  29.  
  30. ; Globals
  31. Global Minh#=2^16
  32. Global Maxh#=0
  33.  
  34.  
  35. ; Blitzarrays
  36. Global RT%[MAXCOLS],GT%[MAXCOLS],BT%[MAXCOLS]
  37. Global RW%[MAXCOLS],GW%[MAXCOLS],BW%[MAXCOLS]
  38.  
  39.  
  40. ; Arrays
  41. Dim Red%(0),Green%(0),Blue%(0),Percent#(0)
  42.  
  43. Dim VertexBuffer(128,128)
  44.  
  45.  
  46. ; Frametween stuff
  47. Global GameSpeed%=60
  48. Global Screenwidth%=GraphicsWidth()
  49. Global Screenheight%=GraphicsHeight()
  50. Global FramePeriod%=1000/GameSpeed
  51. Global FrameTime%=MilliSecs()-FramePeriod
  52. Global DeltaTimeOld%
  53.  
  54. ; Scene Objects
  55. Global pivot%,dummy%,patch%,cam%,cyl%,light%,glow%,ground%,ring%,ring2%
  56.  
  57.  
  58. Restore Temperate : CreateGradient(11,MAXCOLS,True,RT,GT,BT)
  59. Restore Wood : CreateGradient(32,MAXCOLS,True,RW,GW,BW)
  60. InitScene()
  61.  
  62.  
  63. Dim HeightMap#(HEIGHTMAP_SIZE,HEIGHTMAP_SIZE)
  64. Dim NoiseMap#(HEIGHTMAP_SIZE+1,HEIGHTMAP_SIZE+1)
  65.  
  66. Generate_Heightmap(1.5,3,True,False)
  67.  
  68. tx1=CreateTexture(HEIGHTMAP_SIZE,HEIGHTMAP_SIZE)
  69. tx2=CreateTexture(HEIGHTMAP_SIZE,HEIGHTMAP_SIZE)
  70. buffer1=TextureBuffer(tx1)
  71. buffer2=TextureBuffer(tx2)
  72. LockBuffer buffer1
  73. LockBuffer buffer2
  74. For x=0 To HEIGHTMAP_SIZE-1
  75.         For y=0 To HEIGHTMAP_SIZE-1
  76.                
  77.                 h=Int(Norm(HeightMap(x,HEIGHTMAP_SIZE-y),Minh,Maxh,0,MAXCOLS))
  78.                 WritePixelFast x,y,RW[h]*$10000+GW[h]*$100+BW[h],buffer1
  79.                 WritePixelFast x,y,RW[h]*$10000+GW[h]*$100+BW[h],buffer2
  80.                
  81.         Next
  82. Next
  83. UnlockBuffer buffer2
  84. UnlockBuffer buffer1
  85.  
  86. EntityTexture cyl,tx1,0,2
  87. EntityTexture ground,tx2,0,2
  88. EntityTexture ring,tx2,0,2
  89. EntityTexture ring2,tx2,0,2
  90. ScaleTexture tx1,1,4
  91. ScaleTexture tx2,1,1
  92.  
  93. TextureBlend tx1,2
  94. TextureBlend tx2,2
  95.  
  96. ntex1=CreateNormalTexture(0,128,64,True)
  97. EntityTexture cyl,ntex1,0,1
  98. TextureBlend ntex1,4
  99. ScaleTexture ntex1,1,4
  100.  
  101. ntex2=CreateNormalTexture(0,128,64,True)
  102. EntityTexture ground,ntex2,0,1
  103. EntityTexture ring,ntex2,0,1
  104. EntityTexture ring2,ntex2,0,1
  105. TextureBlend ntex2,4
  106. ScaleTexture ntex2,1,1
  107.  
  108. mx=195 : my=198 : mz=190
  109. EntityColor cyl,mx,my,mz
  110. EntityColor ground,mx,my,mz
  111. EntityColor ring,mx,my,mz
  112. EntityColor ring2,mx,my,mz
  113.  
  114.  
  115. mesh=CreateMesh()
  116. EntityFX mesh,1+2+16+32
  117.  
  118. stex=CreateSnowTexture()
  119. EntityTexture mesh,stex
  120. TextureBlend stex,5
  121.  
  122. For i=1 To SNOWFLAKES
  123.        
  124.         s.snow = New snow
  125.         sentity=CreatePivot()
  126.         ssize=Rnd(0.005,0.01)
  127.        
  128.         If Rnd(1)<0.25 Then sdistance=Rnd(Rnd(0.1,0.8),Rnd(0.8,1.0)) Else sdistance=Rnd(0.8,0.99)
  129.         sspeed_p=Rnd(-0.01,0.01)
  130.         sspeed_y=Rnd(-0.01,0.01)
  131.         sspeed_r=Rnd(-0.01,0.01)
  132.        
  133.         RotateEntity sentity,Rnd(-Rnd(0,90),Rnd(0,90)),Rnd(0,360),Rnd(0,360)
  134.        
  135. Next
  136.  
  137. .start
  138.  
  139. Minh#=2^16
  140. Maxh#=0
  141.  
  142. Generate_Heightmap(1.5,Rnd(2.5,3),False,True)
  143. InitDiscWorld()
  144.  
  145. MoveMouse Screenwidth/2,Screenheight/2
  146.  
  147. quad=CreateQuad()
  148. HideEntity quad
  149.  
  150. Collisions 1,2,2,3
  151.  
  152. While Not KeyHit(1)
  153.        
  154.         ; Frametween calculation
  155.         Local FrameElapsed%,FrameTicks%,FrameTween#,t%
  156.         Repeat FrameElapsed=MilliSecs()-FrameTime Until FrameElapsed
  157.         FrameTicks=FrameElapsed/FramePeriod
  158.         FrameTween=Float(FrameElapsed Mod FramePeriod)/Float(FramePeriod)
  159.        
  160.         ; Frametween loop
  161.         For t=1 To FrameTicks
  162.                
  163.                 ; Frametween Captureworld
  164.                 FrameTime=FrameTime+FramePeriod : If t=FrameTicks Then CaptureWorld
  165.                
  166.                 ; SPACE = Wireframe / ENTER = New Discworld
  167.                 If KeyHit(57) Then wf=1-wf : WireFrame wf
  168.                
  169.                
  170.                 If KeyHit(28)  Then
  171.                         keepcam=True
  172.                         camx=EntityX(cam)
  173.                         camy=EntityY(cam)
  174.                         camz=EntityZ(cam)
  175.                         camp=EntityPitch(cam)
  176.                         camw=EntityYaw(cam)
  177.                         camr=EntityRoll(cam)
  178.                         FreeEntity patch
  179.                         Goto start
  180.                 EndIf
  181.                
  182.                 ;Movement()
  183.                 FreeCam(cam,85,0.01)
  184.                
  185.                 FreeEntity mesh
  186.                 mesh=CreateMesh()
  187.                 EntityFX mesh,1+2+16+32
  188.                 EntityTexture mesh,stex
  189.                 EntityBlend mesh,3
  190.                
  191.                 For s.snow = Each snow
  192.                        
  193.                         sspeed_p=sspeed_p+Rnd(-0.01,0.01)
  194.                         sspeed_y=sspeed_y+Rnd(-0.01,0.01)
  195.                         sspeed_r=sspeed_r+Rnd(-0.01,0.01)
  196.                        
  197.                         PositionEntity sentity,0,0,0
  198.                        
  199.                         TurnEntity sentity,sspeed_p,sspeed_y,sspeed_r
  200.                         MoveEntity sentity,0,0,sdistance
  201.                        
  202.                         PositionEntity quad,EntityX(sentity),EntityY(sentity),EntityZ(sentity)
  203.                         ScaleEntity quad,ssize,ssize,ssize
  204.                         PointEntity quad,cam
  205.                        
  206.                         If EntityInView(quad,cam) Then AddToMesh(quad,mesh)
  207.                        
  208.                 Next
  209.                
  210.                 UpdateWorld
  211.                
  212.         Next
  213.        
  214.         RenderWorld FrameTween
  215.        
  216.         AppTitle "Discworld | Tris: "+TrisRendered()
  217.        
  218.         Flip 0
  219.        
  220. Wend
  221.  
  222. End
  223.  
  224. Function CreateSnowTexture()
  225.        
  226.         Local tex%=CreateTexture(512,512)
  227.         Local tb%=TextureBuffer(tex)
  228.        
  229.         Local i#,j%,col%,rgb%
  230.        
  231.         SetBuffer tb
  232.        
  233.         LockBuffer tb
  234.        
  235.         ; Intensity steps
  236.         For j=0 To 255
  237.                
  238.                 col=255-(1.0/Exp(j*0.00001)*j)
  239.                 If col>255 Then col=255
  240.                
  241.                 rgb=col*$10000+col*$100+col
  242.                
  243.                 ; Draw circles
  244.                 For i=0 To 360 Step 0.1
  245.                         WritePixelFast 256+(Sin(i)*j),256+(Cos(i)*j),rgb,tb
  246.                 Next
  247.                
  248.         Next
  249.        
  250.         UnlockBuffer tb
  251.         SetBuffer BackBuffer()
  252.        
  253.         Return tex
  254.        
  255. End Function
  256.  
  257. Function CreateQuad(r%=255,g%=255,b%=255,alpha#=1.0,fx%=0,centered%=False)
  258.        
  259.         Local mesh%,surface%,v1%,v2%,v3%,v4%,s#
  260.        
  261.         If centered Then s#=0.5 Else s#=1.0
  262.        
  263.         mesh=CreateMesh()
  264.         surface=CreateSurface(mesh)
  265.        
  266.         v1=AddVertex (surface,-s, s,0,1,0)
  267.         v2=AddVertex (surface, s, s,0,0,0)
  268.         v3=AddVertex (surface,-s,-s,0,1,1)
  269.         v4=AddVertex (surface, s,-s,0,0,1)
  270.        
  271.         VertexColor surface,v1,r,g,b,alpha
  272.         VertexColor surface,v3,r,g,b,alpha
  273.         VertexColor surface,v2,r,g,b,alpha
  274.         VertexColor surface,v4,r,g,b,alpha
  275.        
  276.         AddTriangle(surface,0,1,2)
  277.         AddTriangle(surface,3,2,1)
  278.        
  279.         EntityFX mesh,fx
  280.        
  281.         FlipMesh mesh
  282.        
  283.         Return mesh
  284.        
  285. End Function
  286.  
  287. Function AddToMesh(source%,target%)
  288.        
  289.         Local vert%[2]
  290.         Local oldvert%,i1%,i2%,v1%,v2%
  291.         Local surf%,surf1%=GetSurface(source,1),surf2%
  292.         Local r%,g%,b%,a#
  293.        
  294.         v1=CountVertices(surf1)
  295.         For v2=1 To CountSurfaces(target)
  296.                
  297.                 surf=GetSurface(target,v2)
  298.                 If CountVertices(surf)+v1<64000 Then surf2=surf : Goto skip
  299.                
  300.         Next
  301.        
  302.         surf2=CreateSurface(target)
  303.        
  304.         .skip
  305.        
  306.         For i1=0 To CountTriangles(surf1)-1
  307.                
  308.                 For i2=0 To 2
  309.                        
  310.                         oldvert = TriangleVertex(surf1,i1,i2)
  311.                        
  312.                         r=VertexRed(surf1,oldvert)
  313.                         g=VertexGreen(surf1,oldvert)
  314.                         b=VertexBlue(surf1,oldvert)
  315.                         a=VertexAlpha(surf1,oldvert)
  316.                        
  317.                         TFormPoint VertexX(surf1,oldvert),VertexY(surf1,oldvert),VertexZ(surf1,oldvert),source,target
  318.                         vert[i2]=AddVertex(surf2,TFormedX(),TFormedY(),TFormedZ(),VertexU(surf1,oldvert),VertexV(surf1,oldvert))
  319.                         VertexColor surf2,vert[i2],r,g,b,a
  320.                         VertexNormal surf2,vert[i2],VertexNX(surf1,oldvert),VertexNY(surf1,oldvert),VertexNZ(surf1,oldvert)
  321.                        
  322.                 Next
  323.                
  324.                 AddTriangle(surf2,vert[0],vert[1],vert[2])
  325.                
  326.         Next
  327.        
  328. End Function
  329.  
  330. Function CreateNormalTexture(flag%=0,height#=128.0,factor#=256.0,inverse%=False,wrap%=False)
  331.        
  332.         Local x%,y%
  333.         Local xm1%,xp1%,ym1%,yp1%
  334.         Local tl%,tm%,tr%,ml%,mm%,mr%,bl%,bm%,br%
  335.         Local vx#,vy#,vz#
  336.         Local isq2#,sum#
  337.         Local al#,ar#,at#,ab#
  338.         Local m#,r%,g%,b%
  339.        
  340.         Local w%=HEIGHTMAP_SIZE
  341.         Local h%=HEIGHTMAP_SIZE
  342.        
  343.         Local texture%=CreateTexture(w,h,flag)
  344.         Local buffer%=TextureBuffer(texture)
  345.        
  346.         SetBuffer buffer
  347.         LockBuffer buffer
  348.        
  349.         For y = 0 To h-1
  350.                
  351.                 ; wrap vertical
  352.                 If wrap Then
  353.                        
  354.                         ym1=y-1 : If ym1<0 Then ym1=h-1
  355.                         yp1=y+1 : If yp1>h-1 Then yp1=0
  356.                        
  357.                 Else
  358.                        
  359.                         ym1=y-1 : If ym1<0 Then ym1=0
  360.                         yp1=y+1 : If yp1>h-1 Then yp1=h-1
  361.                        
  362.                 EndIf
  363.                
  364.                 For x = 0 To w-1
  365.                        
  366.                         ; wrap horizontal
  367.                         If wrap Then
  368.                                
  369.                                 xm1=x-1 : If xm1<0 Then xm1=w-1
  370.                                 xp1=x+1 : If xp1>w-1 Then xp1=0
  371.                                
  372.                         Else
  373.                                
  374.                                 xm1=x-1 : If xm1<0 Then xm1=0
  375.                                 xp1=x+1 : If xp1>w-1 Then xp1=w-1
  376.                                
  377.                         EndIf
  378.                        
  379.                         ; get central and surrounding pixels
  380.                         tl=HeightMap(xm1,ym1)
  381.                         tm=HeightMap(x  ,ym1)
  382.                         tr=HeightMap(xp1,ym1)
  383.                         ml=HeightMap(xm1,y  )
  384.                         mm=HeightMap(x  ,y  )
  385.                         mr=HeightMap(xp1,y  )
  386.                         bl=HeightMap(xm1,yp1)
  387.                         bm=HeightMap(x  ,yp1)
  388.                         br=HeightMap(xp1,yp1)
  389.                        
  390.                         isq2=1.0/Sqr(2.0)
  391.                         sum=1.0+isq2+isq2
  392.                        
  393.                         al=(tl*isq2+ml+bl*isq2)/sum
  394.                         ar=(tr*isq2+mr+br*isq2)/sum
  395.                         at=(tl*isq2+tm+tr*isq2)/sum
  396.                         ab=(bl*isq2+bm+br*isq2)/sum                    
  397.                        
  398.                         ; inverse normalmap
  399.                         If inverse Then
  400.                                 vx=(al-ar)/((255.0*factor))
  401.                                 vy=(at-ab)/((255.0*factor))
  402.                         Else
  403.                                 vx=(ar-al)/((255.0*factor))
  404.                                 vy=(ab-at)/((255.0*factor))
  405.                         EndIf
  406.                        
  407.                         m=Max(0,vx*vx+vy*vy)
  408.                         m=Min(m,1.0)
  409.                        
  410.                         vz=Sqr(1.0-m)
  411.                        
  412.                         If height<>0.0
  413.                                
  414.                                 vz=vz/height
  415.                                 m#=Sqr(vx*vx+vy*vy+vz*vz)
  416.                                 vx=vx/m
  417.                                 vy=vy/m
  418.                                 vz=vz/m
  419.                                
  420.                         EndIf
  421.                        
  422.                         ; calculate colors
  423.                         r=Int(Floor(vx*127.5+127.5+0.5))
  424.                         g=Int(Floor(vy*127.5+127.5+0.5))
  425.                         b=Int(Floor(vz*127.5+127.5+0.5))
  426.                        
  427.                         ; write map
  428.                         WritePixelFast(x,y,(r Shl 16)+(g Shl 8)+b)
  429.                        
  430.                 Next
  431.                
  432.         Next
  433.        
  434.         UnlockBuffer buffer
  435.         SetBuffer BackBuffer()
  436.        
  437.         Return texture
  438.        
  439. End Function
  440.  
  441. Function Min#(v1#,v2#)
  442.        
  443.         If v1<v2 Then Return v1 Else Return v2
  444.        
  445. End Function
  446.  
  447.  
  448. ; returns the max value of two values
  449. Function Max#(v1#,v2#)
  450.        
  451.         If v1>v2 Then Return v1 Else Return v2
  452.        
  453. End Function
  454.  
  455. Function FreeCam(camera%,maxpitch#=85.0,movespeed#,rotspeed#=16.666,rotfloat#=8.0)
  456.        
  457.         Local movex#,movez#,dx#,dy#,dk#,dt%,t%
  458.         Local pitch#
  459.        
  460.         ; Arrows = Move
  461.         movex=KeyDown(205)-KeyDown(203)
  462.         movez=KeyDown(200)-KeyDown(208)
  463.        
  464.         ; smooth movement
  465.         t=MilliSecs() : dt=t-DeltaTimeOld : DeltaTimeOld=t : dk=Float(dt)/rotspeed
  466.         dx=(Screenwidth/2-MouseX())*0.01*dk : dy=(Screenheight/2-MouseY())*0.01*dk
  467.         TurnEntity camera,-dy,dx*0.1*dk*rotfloat,0
  468.        
  469.         ; limit pitch
  470.         pitch=EntityPitch(camera,1) : If pitch>maxpitch Then pitch=maxpitch Else If pitch<-maxpitch Then pitch=-maxpitch
  471.        
  472.         ; rotate and move
  473.         RotateEntity camera,pitch,EntityYaw(camera,1),0,1      
  474.         MoveEntity camera,movex*movespeed,0,movez*movespeed
  475.        
  476. End Function
  477.  
  478. Function InitScene()
  479.        
  480.         ; Pivots
  481.         pivot=CreatePivot() : MoveEntity pivot,0,-0.15,0
  482.         dummy=CreatePivot()
  483.        
  484.         glow=InitGlow(0.25,0.95)
  485.         EntityParent glow,dummy
  486.        
  487.         cyl=CreateCylinder(DETAIL,0,dummy)
  488.         EntityFX cyl,2+16
  489.         ScaleEntity cyl,0.9,0.25,0.9
  490.         PositionEntity cyl,0,-0.69,0
  491.         EntityType cyl,2
  492.        
  493.         ring=CreateTorus(0.875,0.025,DETAIL,16)
  494.         RotateMesh ring,90,0,0
  495.         PositionEntity ring,0,-0.45,0
  496.        
  497.         ring2=CreateTorus(0.9,0.025,DETAIL,16)
  498.         RotateMesh ring2,90,0,0
  499.         PositionEntity ring2,0,-0.95,0
  500.         ScaleMesh ring2,1,2,1
  501.        
  502.         ground=CreateCylinder(DETAIL,1,dummy)
  503.         ScaleEntity ground,0.92,0.01,0.92
  504.         PositionEntity ground,0,-0.95,0
  505.         EntityFX ground,2+16
  506.         EntityType ground,2
  507.        
  508.         light=CreateLight(2,glow)
  509.         PositionEntity light,-100,150,50
  510.         LightRange light,200
  511.         AmbientLight 64,64,64
  512.        
  513.         cam=CreateCamera()
  514.         CameraRange cam,0.01,1000
  515.         CameraClsColor cam,75,100,128
  516.         EntityType cam,1
  517.         EntityRadius cam,0.05
  518.        
  519.         If keepcam Then
  520.                 PositionEntity cam,camx,camy,camz
  521.                 RotateEntity cam,camp,camw,camr
  522.         Else
  523.                 MoveEntity cam,0,0.5,2
  524.                 PointEntity cam,pivot
  525.         EndIf
  526.        
  527.        
  528.        
  529. End Function
  530.  
  531. Function InitDiscWorld()
  532.        
  533.         patch=CreatePatch(PATCHSIZE-1,1.0/((PATCHSIZE-1)/2),0,0,0,128,128,128,1,1)
  534.         RotateEntity patch,90,0,0
  535.         EntityParent patch,dummy
  536.        
  537.         surf=GetSurface(patch,1)
  538.        
  539.         tx=CreateTexture(HEIGHTMAP_SIZE,HEIGHTMAP_SIZE)
  540.         buffer=TextureBuffer(tx)
  541.         LockBuffer buffer
  542.         For x=0 To HEIGHTMAP_SIZE-1
  543.                 For y=0 To HEIGHTMAP_SIZE-1
  544.                        
  545.                         h=Int(Norm(HeightMap(x,HEIGHTMAP_SIZE-y),Minh,Maxh,0,MAXCOLS))
  546.                         WritePixelFast x,y,RT[h]*$10000+GT[h]*$100+BT[h],buffer
  547.                        
  548.                 Next
  549.         Next
  550.         UnlockBuffer buffer
  551.        
  552.         EntityTexture patch,tx,0,2
  553.         TextureBlend tx,5
  554.        
  555.         ntex=CreateNormalTexture(0,128,64)
  556.         EntityTexture patch,ntex,0,1
  557.         TextureBlend ntex,4
  558.        
  559.         mx=195 : my=198 : mz=190
  560.         EntityColor patch,mx,my,mz
  561.        
  562.         For v=0 To CountVertices(surf)-1
  563.                
  564.                 y=Int(Floor(v*1.0/PATCHSIZE))
  565.                 x=v-(y*PATCHSIZE)
  566.                
  567.                 vx#=VertexX(surf,v)
  568.                 vy#=VertexY(surf,v)
  569.                 vz#=Norm(HeightMap(x*(HEIGHTMAP_SIZE/PATCHSIZE),y*(HEIGHTMAP_SIZE/PATCHSIZE)),Minh,Maxh,0,0.5)
  570.                 If vz<0.25 Then vz=0.25
  571.                
  572.                 c=Int(Norm(HeightMap(x*(HEIGHTMAP_SIZE/PATCHSIZE),y*(HEIGHTMAP_SIZE/PATCHSIZE)),Minh,Maxh,128,255))
  573.                
  574.                 VertexColor surf,v,c,c,c
  575.                
  576.                 VertexCoords surf,v,Cube2SphereX(vx,vy,vz),Cube2SphereY(vx,vy,vz),(Cube2SphereZ(vx,vy,vz)*-1)+0.7
  577.                
  578.         Next
  579.        
  580.         ScaleMesh patch,0.88,0.88,0.88
  581.        
  582.         UpdateNormals patch
  583.        
  584. End Function
  585.  
  586. Function CreateTorus(torrad#,torwidth#,segments,sides,parent=0)
  587.        
  588.         torusmesh=CreateMesh(parent)
  589.         surf=CreateSurface(torusmesh)
  590.        
  591.         FATSTEP#=360.0/sides
  592.         DEGSTEP#=360.0/segments
  593.        
  594.         radius#=0
  595.         x#=0
  596.         y#=0
  597.         z#=0
  598.        
  599.         fat#=0
  600.         Repeat
  601.                 radius = torrad + (torwidth)*Sin(fat)
  602.                 deg#=0
  603.                 z=torwidth*Cos(fat)
  604.                 Repeat
  605.                         x=radius*Cos(deg)
  606.                         y=radius*Sin(deg)
  607.                         AddVertex surf,x,y,z,x,y,z                     
  608.                         deg=deg+DEGSTEP
  609.                 Until deg>=360
  610.                 fat=fat+FATSTEP
  611.         Until fat>=360
  612.        
  613.         For vert=0 To segments*sides-1
  614.                 v0=vert
  615.                 v1=vert+segments
  616.                 v2=vert+1
  617.                 v3=vert+1+segments
  618.                
  619.                 If v1>=(segments*sides) Then v1=v1-(segments*sides)
  620.                 If v2>=(segments*sides) Then v2=v2-(segments*sides)
  621.                 If v3>=(segments*sides) Then v3=v3-(segments*sides)
  622.                
  623.                 AddTriangle surf,v0,v1,v2
  624.                 AddTriangle surf,v1,v3,v2      
  625.         Next
  626.        
  627.         UpdateNormals torusmesh
  628.        
  629.         Return torusmesh
  630. End Function
  631.  
  632.  
  633. Function CreateGlowTexture(size%=128)
  634.        
  635.         Local tex%=CreateTexture(size,size,64)
  636.         Local tb%=TextureBuffer(tex)
  637.        
  638.         Local i#,j%,col%,rgb%,px%,py%
  639.        
  640.         SetBuffer tb
  641.        
  642.         Color 255,255,255
  643.         Rect 0,0,size,size,1
  644.        
  645.         LockBuffer tb
  646.        
  647.         ; Intensity steps
  648.         For j=0 To (size/2)-1
  649.                
  650.                 col=(1.5-(1.5/Exp(j*1.0/(size/2-1))))*j*(512.0/size)
  651.                 If col>255 Then col=255
  652.                 If col<0 Then col=0
  653.                 rgb=col*$1000000+col*$10000+col*$100+col
  654.                
  655.                 ; Draw circles
  656.                 For i=0 To 359.95 Step 0.05
  657.                         px=(size/2.0)-1+(Sin(i)*(j+0.5))+0.5
  658.                         py=(size/2.0)-1+(Cos(i)*(j+0.5))+0.5
  659.                        
  660.                         WritePixelFast px,py,rgb,tb
  661.                 Next
  662.                
  663.         Next
  664.        
  665.         UnlockBuffer tb
  666.         SetBuffer BackBuffer()
  667.        
  668.         Return tex
  669.        
  670. End Function
  671.  
  672. Function InitGlow(shininess#,glowalpha#)
  673.        
  674.         Local mesh%=CreateSphere(DETAIL)
  675.        
  676.         tex=CreateGlowTexture()
  677.        
  678.         EntityBlend mesh,3
  679.        
  680.         EntityTexture mesh,tex,0,1
  681.        
  682.         EntityFX mesh,2+32
  683.         EntityShininess mesh,shininess
  684.         EntityType mesh,2
  685.        
  686.         UpdateMesh(mesh,100,150,255,glowalpha)
  687.         ScaleMesh mesh,0.999,0.999,0.999
  688.        
  689.         FreeTexture tex
  690.        
  691.         Return mesh
  692.        
  693. End Function
  694.  
  695. Function UpdateMesh(mesh%,r%=255,g%=255,b%=255,a#=1.0)
  696.        
  697.         Local v%,a1#
  698.         Local surf%=GetSurface(mesh,1)
  699.        
  700.         For v=0 To CountVertices(surf)-1
  701.                
  702.                 If VertexY(surf,v)<=-0.5 Then a1=0 Else a1=a
  703.                
  704.                 VertexColor surf,v,r,g,b,a1
  705.         Next
  706.        
  707. End Function
  708.  
  709. Function Generate_Heightmap(Scale#,Multiplier#,wrap%=False,island%=False)
  710.        
  711.         Local Max_Height#,NoiseMapSize%,ScaleDifference#,StepSize#
  712.         Local N1#,N2#,N3#,N4#,HX#,HY#,IX#,IY#,ICX#,ICY#,NA#,NB#,NC#,ND#
  713.         Local i%,x%,y%,xx%,yy%
  714.         Local v#
  715.        
  716.         Max_Height=Scale
  717.        
  718.         For y=0 To HEIGHTMAP_SIZE Step 1
  719.                
  720.                 For x=0 To HEIGHTMAP_SIZE Step 1
  721.                        
  722.                         HeightMap(x,y)=0
  723.                        
  724.                 Next
  725.                
  726.         Next
  727.        
  728.         NoiseMapSize=HEIGHTMAP_SIZE/2
  729.         Max_Height=Max_Height*Multiplier
  730.        
  731.         Repeat
  732.                
  733.                 For y=0 To NoiseMapSize
  734.                        
  735.                         For x=0 To NoiseMapSize
  736.                                
  737.                                 NoiseMap(x,y)=Rnd(0,Max_Height#)
  738.                                
  739.                                 If island Then If x=0 Or x=NoiseMapSize Or y=0 Or y=NoiseMapSize Then NoiseMap(x,y)=0
  740.                                
  741.                         Next
  742.                        
  743.                 Next
  744.                
  745.                 If wrap Then
  746.                        
  747.                         For i=0 To NoiseMapSize : NoiseMap(i,0)=NoiseMap(i,NoiseMapSize) : Next
  748.                         For i=0 To NoiseMapSize : NoiseMap(0,i)=NoiseMap(NoiseMapSize,i) : Next
  749.                        
  750.                 EndIf
  751.                
  752.                 ScaleDifference=HEIGHTMAP_SIZE*1.0/NoiseMapSize
  753.                 StepSize=1.0/Float(ScaleDifference)
  754.                
  755.                 For y=0 To NoiseMapSize-1
  756.                        
  757.                         For x=0 To NoiseMapSize-1
  758.                                
  759.                                 N1=NoiseMap(x,  y  )
  760.                                 N2=NoiseMap(x+1,y  )
  761.                                 N3=NoiseMap(x,  y+1)
  762.                                 N4=NoiseMap(x+1,y+1)
  763.                                
  764.                                 HX=x*ScaleDifference
  765.                                 HY=y*ScaleDifference
  766.                                
  767.                                 IY=0
  768.                                
  769.                                 For yy=0 To ScaleDifference-1
  770.                                        
  771.                                         ICY=1.0-((Cos(IY*180.0)+1.0)/2.0)
  772.                                        
  773.                                         IX=0   
  774.                                        
  775.                                         For xx=0 To ScaleDifference-1
  776.                                                
  777.                                                 ICX=1.0-((Cos(IX*180.0)+1.0)/2.0)
  778.                                                
  779.                                                 NA=N1*(1.0-ICX)
  780.                                                 NB=N2*ICX
  781.                                                 NC=N3*(1.0-ICX)
  782.                                                 ND=N4*ICX
  783.                                                
  784.                                                 v=HeightMap(HX+xx,HY+yy)+(NA+NB)*(1.0-ICY)+(NC+ND)*ICY
  785.                                                
  786.                                                 If v>Maxh Then Maxh=v
  787.                                                 If v<Minh Then Minh=v
  788.                                                
  789.                                                 HeightMap(HX+xx,HY+yy)=v
  790.                                                
  791.                                                 IX=IX+StepSize
  792.                                                
  793.                                         Next
  794.                                        
  795.                                         IY=IY+StepSize 
  796.                                        
  797.                                 Next
  798.                                
  799.                         Next
  800.                        
  801.                 Next
  802.                
  803.                 NoiseMapSize=NoiseMapSize/2
  804.                
  805.                 Max_Height=Max_Height*Multiplier
  806.                
  807.         Until NoiseMapSize<=2
  808.        
  809. End Function
  810.  
  811.  
  812.  
  813. Function Cube2SphereX#(x#,y#,z#)
  814.        
  815.         Return x*Sqr(1.0-y*y*0.5-z*z*0.5+y*y*z*z*DIV3)
  816.        
  817. End Function
  818.  
  819. Function Cube2SphereY#(x#,y#,z#)
  820.  
  821.         Return y*Sqr(1.0-z*z*0.5-x*x*0.5+z*z*x*x*DIV3)
  822.  
  823. End Function
  824.  
  825. Function Cube2SphereZ#(x#,y#,z#)
  826.        
  827.         Return z*Sqr(1.0-x*x*0.5-y*y*0.5+x*x*y*y*DIV3)
  828.        
  829. End Function
  830.  
  831. Function CreatePatch(size%,scale#,px#,py#,pz#,r%,g%,b%,a#,fx%)
  832.        
  833.         Local x%,z%,v#,u#,v0%,v1%,v2%,v3%
  834.        
  835.         ; create mesh and surface
  836.         Local mesh%=CreateMesh()
  837.         Local surf%=CreateSurface(mesh)
  838.        
  839.         For z=0 To size
  840.                
  841.                 For x=0 To size
  842.                        
  843.                         ; calculate uv coordinates that the texture fits to the tile
  844.                         u=x*1.0/size
  845.                         v=z*1.0/size*-1
  846.                        
  847.                         ; set vertexposition
  848.                         VertexBuffer(x,z)=AddVertex (surf,-((size)/2.0)+x,-((size)/2.0)+z,size/2,u,v)
  849.                         VertexColor surf,VertexBuffer(x,z),r,g,b,a#
  850.                        
  851.                 Next
  852.                
  853.         Next
  854.        
  855.         ; set triangles
  856.         For z=0 To size-1
  857.                
  858.                 For x=0 To size-1
  859.                        
  860.                         v0=VertexBuffer(x,z)
  861.                         v1=VertexBuffer(x+1,z)
  862.                         v2=VertexBuffer(x+1,z+1)
  863.                         v3=VertexBuffer(x,z+1)
  864.                        
  865.                         AddTriangle (surf,v0,v2,v1)
  866.                         AddTriangle (surf,v0,v3,v2)
  867.                        
  868.                 Next
  869.                
  870.         Next
  871.        
  872.         ; position, scale and fx
  873.         PositionEntity mesh,px,py,pz
  874.         ScaleMesh mesh,scale,scale,scale
  875.         EntityFX mesh,fx
  876.        
  877.         Return mesh
  878.        
  879. End Function
  880.  
  881. Function CreateGradient(colors%,steps%,inverse=False,R%[MAXCOLS],G%[MAXCOLS],B%[MAXCOLS])
  882.        
  883.         Dim Percent#(colors),Red%(colors),Green%(colors),Blue%(colors)
  884.        
  885.         Local i%,pos1%,pos2%,pdiff%
  886.         Local rdiff%,gdiff%,bdiff%
  887.         Local rstep#,gstep#,bstep#
  888.         Local counter%=0
  889.        
  890.         If inverse Then
  891.                
  892.                 For i=colors To 1 Step -1
  893.                        
  894.                         Read Percent(i),Red(i),Green(i),Blue(i)
  895.                         Percent(i)=100.0-Percent(i)
  896.                        
  897.                 Next
  898.                
  899.         Else
  900.                
  901.                 For i=0 To colors-1 : Read Percent(i),Red(i),Green(i),Blue(i) : Next
  902.                
  903.         EndIf
  904.        
  905.     While counter<colors
  906.                
  907.         pos1=Percent(counter)*steps*1.0/100
  908.                 pos2=Percent(counter+1)*steps*1.0/100
  909.                
  910.         pdiff=pos2-pos1
  911.                
  912.         rdiff%=Red(counter)-Red(counter+1)
  913.                 gdiff%=Green(counter)-Green(counter+1)
  914.                 bdiff%=Blue(counter)-Blue(counter+1)
  915.                
  916.         rstep#=rdiff*1.0/pdiff
  917.                 gstep#=gdiff*1.0/pdiff
  918.                 bstep#=bdiff*1.0/pdiff
  919.                
  920.                 For i=0 To pdiff
  921.                        
  922.                         R[pos1+i]=Int(Red(counter)-(rstep*i))
  923.                         G[pos1+i]=Int(Green(counter)-(gstep*i))
  924.                         B[pos1+i]=Int(Blue(counter)-(bstep*i))
  925.                        
  926.                 Next
  927.                
  928.         counter=counter+1
  929.                
  930.         Wend
  931.        
  932. End Function
  933.  
  934. Function Norm#(v#=128.0,vmin#=0.0,vmax#=255.0,nmin#=0.0,nmax#=1.0)
  935.        
  936.         Return ((v-vmin)/(vmax-vmin))*(nmax-nmin)+nmin
  937.        
  938. End Function
  939.  
  940.  
  941. .Temperate
  942. Data   0.0,255,255,255  ; icy mountains
  943. Data   5.0,179,179,179  ; transition
  944. Data  10.0,153,143, 92  ; tundra
  945. Data  25.0,115,128, 77  ; high grasslands
  946. Data  45.0, 42,102, 41  ; low grasslands
  947. Data  48.0, 42,102, 41  ; low grasslands
  948. Data  50.0,200,200,118  ; coast / should be a 0 height
  949. Data  53.0, 17, 82,112  ; shallow ocean
  950. Data  65.0, 17, 82,112  ; shallow ocean
  951. Data  75.0,  9, 62, 92  ; ocean
  952. Data 100.0,  9, 62, 92  ; deep ocean
  953.  
  954. .Wood
  955. Data 0.0,127,79,39
  956. Data 3.22581,129,77,37
  957. Data 6.45161,134,86,46
  958. Data 9.67742,155,105,64
  959. Data 12.9032,126,77,34
  960. Data 16.129,145,95,55
  961. Data 19.3548,110,65,29
  962. Data 22.5806,135,83,43
  963. Data 25.8065,117,69,29
  964. Data 29.0323,128,84,49
  965. Data 32.2581,121,71,29
  966. Data 35.4839,145,93,50
  967. Data 38.7097,164,112,66
  968. Data 41.9355,97,57,23
  969. Data 45.1613,130,76,30
  970. Data 48.3871,129,81,44
  971. Data 51.6129,135,81,37
  972. Data 54.8387,131,79,37
  973. Data 58.0645,140,93,51
  974. Data 61.2903,155,105,64
  975. Data 64.5161,129,75,34
  976. Data 67.7419,145,95,55
  977. Data 70.9677,107,63,28
  978. Data 74.1936,134,86,46
  979. Data 77.4194,135,83,43
  980. Data 80.6452,126,80,46
  981. Data 83.871,107,57,15
  982. Data 87.0968,133,81,41
  983. Data 90.3226,114,66,30
  984. Data 93.5484,114,66,26
  985. Data 96.7742,128,77,27
  986. Data 100.0,126,78,42


Comments :


Blitzplotter(Posted 1+ years ago)

 Can't find TrisRendered function... looks good though.


BlitzSupport(Posted 1+ years ago)

 That is SO cool!Blitzplotter -- check you have the <a href="../Account/produpdates.html" target="_blank">latest[/url] Blitz3D installed! TrisRendered has been there for a long time.


Blitzplotter(Posted 1+ years ago)

 Thanks BlitzSupport, what I maybe did wrong was simply opted for the 164 full Blitz3D install onto my new comp without and of the updates - possibly my bad.I do most of my Blitz3D work on my older codist puta - its a not too shabby 1.5Ghz thingy.


BlitzSupport(Posted 1+ years ago)

 Remember you only have to install the latest update to get everything.


Blitzplotter(Posted 1+ years ago)

 Thanks,  I just installed the latest update and discworld is seriously impressive - my daughter asked if I made it, I'd to fess up and say no.Very good!


MErren(Posted 1+ years ago)

 Very Nice ! Well done Cool Work !!The little Land, A+


_PJ_(Posted 1+ years ago)

 One of the 'Special Things' (Leaguer Of Gentlemen reference)That's really pretty!


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal