SyntaxBomb - Indie Coders

Languages & Coding => Blitz Code Archives => 3D Graphics - Effects => Topic started by: BlitzBot on June 29, 2017, 12:28:39 AM

Title: [bb] Stencil Shadow Volume by bytecode77 [ 1+ years ago ]
Post by: BlitzBot on June 29, 2017, 12:28:39 AM
Title : Stencil Shadow Volume
Author : bytecode77
Posted : 1+ years ago

Description : A code which creates a shadow volume on the fly(with little demo)

Code :
Code: BlitzBasic
  1. hi there!
  2.  
  3. i know that there is a giant discusion about stencil shadows and shadow volumes... so i decidet to show you my shadow volume creation code!
  4.  
  5. it is a mod of the version of this thread: www.blitzbasic.com/Community/posts.php?topic=58767
  6.  
  7. and i have modifyed it up to this(it is VERY MUCH OPTIMIZED!!!):
  8.  
  9. [code]
  10. Graphics3D 1024, 768, 32, 2
  11. SetBuffer BackBuffer()
  12.  
  13. ;Globs
  14. Dim Edge#(65000, 7)
  15.  
  16. ;Camera
  17. Cam = CreateCamera()
  18.  
  19. ;Caster
  20. Cube = CreateSphere()
  21. PositionEntity Cube, 0, 0, 7
  22.  
  23. ;Light
  24. Light = CreateLight()
  25. PositionEntity Light, 3, 3, 7
  26. PointEntity Light, Cube
  27.  
  28. While Not KeyHit(1)
  29.         TurnEntity Cube, 1, .5, 1.5
  30.         vol = CreateVolume(Cube, Light)
  31.         RenderWorld
  32.         FreeEntity vol
  33.         Flip
  34. Wend
  35. End
  36.  
  37. Function CreateVolume(model, light, volume_lenght = 1000000)
  38. VolumeMesh = CreateMesh()
  39. VolumeSurface = CreateSurface(VolumeMesh)
  40. EntityAlpha VolumeMesh, .5
  41. EntityColor VolumeMesh, 255, 0, 0
  42. EntityFX VolumeMesh, 1
  43. light_x# = EntityX(light)
  44. light_y# = EntityY(light)
  45. light_z# = EntityZ(light)
  46. For n = 1 To CountSurfaces(model)
  47.         surf = GetSurface(model, n)
  48.         dwNumFaces = CountTriangles(surf) - 1
  49.         For v = 0 To dwNumFaces
  50.                 vert0 = TriangleVertex(surf, v, 0)
  51.                 vert1 = TriangleVertex(surf, v, 1)
  52.                 vert2 = TriangleVertex(surf, v, 2)
  53.                 TFormPoint VertexX(surf, vert0), VertexY(surf, vert0), VertexZ(surf, vert0), model, 0
  54.                 v1_x# = TFormedX()
  55.                 v1_y# = TFormedY()
  56.                 v1_z# = TFormedZ()
  57.                 TFormPoint VertexX(surf, vert1), VertexY(surf, vert1), VertexZ(surf, vert1), model, 0
  58.                 v2_x# = TFormedX()
  59.                 v2_y# = TFormedY()
  60.                 v2_z# = TFormedZ()
  61.                 TFormPoint VertexX(surf, vert2), VertexY(surf, vert2), VertexZ(surf, vert2), model, 0
  62.                 v3_x# = TFormedX()
  63.                 v3_y# = TFormedY()
  64.                 v3_z# = TFormedZ()
  65.                 aa_x# = v3_x# - v2_x#
  66.                 aa_y# = v3_y# - v2_y#
  67.                 aa_z# = v3_z# - v2_z#
  68.                 bb_x# = v2_x# - v1_x#
  69.                 bb_y# = v2_y# - v1_y#
  70.                 bb_z# = v2_z# - v1_z#
  71.                 norm_x# = aa_y# * bb_z# - aa_z# * bb_y#
  72.                 norm_y# = aa_z# * bb_x# - aa_x# * bb_z#
  73.                 norm_z# = aa_x# * bb_y# - aa_y# * bb_x#
  74.                 normlight_x# = (v1_x# + v2_x# + v3_x#) / 3 - light_x#
  75.                 normlight_y# = (v1_y# + v2_y# + v3_y#) / 3 - light_y#
  76.                 normlight_z# = (v1_z# + v2_z# + v3_z#) / 3 - light_z#
  77.                 If (norm_x# * normlight_x# + norm_y# * normlight_y# + norm_z# * normlight_z#) * (1.0 / Float(Sqr(norm_x# * norm_x# + norm_y# * norm_y# + norm_z# * norm_z#))) * (1.0 / Float(Sqr(normlight_x# * normlight_x# + normlight_y# * normlight_y# + normlight_z# * normlight_z#))) => 0 Then
  78.                         Edge(CNTFront, 0) = surf
  79.                         Edge(CNTFront, 1) = tri
  80.                         Edge(CNTFront, 2) = v1_x#
  81.                         Edge(CNTFront, 3) = v1_y#
  82.                         Edge(CNTFront, 4) = v1_z#
  83.                         Edge(CNTFront, 5) = v2_x#
  84.                         Edge(CNTFront, 6) = v2_y#
  85.                         Edge(CNTFront, 7) = v2_z#
  86.                         CNTFront = CNTFront + 1
  87.                         Edge(CNTFront, 0) = surf
  88.                         Edge(CNTFront, 1) = tri
  89.                         Edge(CNTFront, 2) = v2_x#
  90.                         Edge(CNTFront, 3) = v2_y#
  91.                         Edge(CNTFront, 4) = v2_z#
  92.                         Edge(CNTFront, 5) = v3_x#
  93.                         Edge(CNTFront, 6) = v3_y#
  94.                         Edge(CNTFront, 7) = v3_z#
  95.                         CNTFront = CNTFront + 1
  96.                         Edge(CNTFront, 0) = surf
  97.                         Edge(CNTFront, 1) = tri
  98.                         Edge(CNTFront, 2) = v3_x#
  99.                         Edge(CNTFront, 3) = v3_y#
  100.                         Edge(CNTFront, 4) = v3_z#
  101.                         Edge(CNTFront, 5) = v1_x#
  102.                         Edge(CNTFront, 6) = v1_y#
  103.                         Edge(CNTFront, 7) = v1_z#
  104.                         CNTFront = CNTFront + 1
  105.                 EndIf
  106.         Next
  107. Next
  108. For a = 0 To CNTFront
  109.         If Edge(a, 0) > 0 Then
  110.                 Diverso = True
  111.                 p0_x# = Edge(a, 2)
  112.                 p0_y# = Edge(a, 3)
  113.                 p0_z# = Edge(a, 4)
  114.                 p1_x# = Edge(a, 5)
  115.                 p1_y# = Edge(a, 6)
  116.                 p1_z# = Edge(a, 7)
  117.                 For b = a + 1 To CNTFront
  118.                         p0_2_x# = Edge(b, 2)
  119.                         p0_2_y# = Edge(b, 3)
  120.                         p0_2_z# = Edge(b, 4)
  121.                         p1_2_x# = Edge(b, 5)
  122.                         p1_2_y# = Edge(b, 6)
  123.                         p1_2_z# = Edge(b, 7)
  124.                         If Edge(b, 0) > 0 Then
  125.                                 If (p0_x# = p0_2_x# And p0_y# = p0_2_y# And p0_z# = p0_2_z# And p1_x# = p1_2_x# And p1_y# = p1_2_y# And p1_z# = p1_2_z#) = False Then
  126.                                         If p0_x# = p1_2_x# And p0_y# = p1_2_y# And p0_z# = p1_2_z# And p1_x# = p0_2_x# And p1_y# = p0_2_y# And p1_z# = p0_2_z# Then
  127.                                                 Edge(a, 0) = surf = 0
  128.                                                 Edge(b, 0) = surf = 0
  129.                                                 Diverso = False
  130.                                                 Exit
  131.                                         EndIf
  132.                                 EndIf
  133.                         EndIf
  134.                 Next
  135.                 If Diverso Then
  136.                         pe0_x# = p0_x# - light_x#
  137.                         pe0_y# = p0_y# - light_y#
  138.                         pe0_z# = p0_z# - light_z#
  139.                         do# = 1.0 / Float(Sqr(pe0_x# * pe0_x# + pe0_y# * pe0_y# + pe0_z# * pe0_z#))
  140.                         pe0_x# = pe0_x# * do# * volume_lenght + p0_x#
  141.                         pe0_y# = pe0_y# * do# * volume_lenght + p0_y#
  142.                         pe0_z# = pe0_z# * do# * volume_lenght + p0_z#
  143.                         pe1_x# = (p1_x# - light_x#) * volume_lenght + p1_x#
  144.                         pe1_y# = (p1_y# - light_y#) * volume_lenght + p1_y#
  145.                         pe1_z# = (p1_z# - light_z#) * volume_lenght + p1_z#
  146.                         va = AddVertex(VolumeSurface, p0_x#, p0_y#, p0_z#)
  147.                         vb = AddVertex(VolumeSurface, pe1_x#, pe1_y#, pe1_z#)
  148.                         AddTriangle(VolumeSurface, va, AddVertex(VolumeSurface, pe0_x#, pe0_y#, pe0_z#), vb)
  149.                         AddTriangle(VolumeSurface, va, vb, AddVertex(VolumeSurface, p1_x#, p1_y#, p1_z#))
  150.                         Edge(a, 0) = 0
  151.                 EndIf
  152.         EndIf
  153. Next
  154. Return VolumeMesh
  155. End Function
  156.  

 


the stencil shadow system demo is here:
http://patrick-sch.de/bleibdafuerimmer/StencilShadowSystem.zip[/code]

Comments :


thelizardking(Posted 1+ years ago)

 nice!


Ben(t)(Posted 1+ years ago)

 cool but if the sphere is at 32 vertexes the program lags horribly

SimplePortal 2.3.6 © 2008-2014, SimplePortal