Point Sprites

Everything related to 3D programming
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Point Sprites

Post by IdeasVacuum »

Thanks to the excellent work of applePi : mandelbrot set 3D my problem of displaying thousands of points is solved.........

......but I'd like to do a little bit more and use point sprites (OpenGL sub system), as a standard point is represented by a 2D square. Most CAD apps for example have a range of 2D graphics to represent points: + * x are common. Ogre Point Sprites

So, has anyone done this before?
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

Re: Point Sprites

Post by applePi »

IdeasVacuum, when i have asked about thicker points in the mandelbrot 3D post ,Comtois answered to use point_size inside a material script, so point_sprite will be the same. and asking our uncle google he provide the answer
the main idea is in the material script:
point_sprites on
point_size 20
...
texture texture.png

then in the code
MeshVertexPosition(x, y, z)
and don't use MeshVertexColor "i think"
http://ogre3d.org/forums/viewtopic.php?f=2&t=62735

just copy the material in that page and change the texture to your prefered picture:
PointsSprites.material

Code: Select all

material PointsSprites
{
   technique
   {
      pass
      {
         cull_hardware none
         cull_software none
         scene_blend alpha_blend
         lighting off
         
         diffuse 1 1 1 1
         ambient 1 1 1 1
         specular 1 1 1 1
         emissive 1 1 1 1
         
         point_sprites on
         point_size 20
         //point_size_min 2.0
         //point_size_max 256.0
         
         depth_write off
         depth_check on
         
         depth_func less_equal
         
         //point_size_attenuation on 1.0 0.0 3.5
         
         texture_unit
         {
            filtering anisotropic
            max_anisotropy 16
            texture flare.png
         }
      }
   }
}
save it to Data/Scripts
i can't provide a concise code now , but use the mandel 3D program to see the points sprites, use any texture, i want to use a texture like a star with alpha channel most likely will be very good display such as a stary points rotating around sun.
Image
there are also points sprites in the MP3D examples
save the code to Examples\3D. and save the material script above to Data\Scripts

Code: Select all

Enumeration
   #MESH
   #LIGHT
   #CAMERA_ONE
   #BUTTON
   #mainwin
 EndEnumeration
 ;constants for the biomorph function
 #constreal = 0.5 
  #constimag = 0 
  #screenheight = 500
  #screenwidth = 500
  
Global.f dx, dy, x, y, z
Global wd, ht, i, count, n, iter
Global.f w, leng, tx, ty, tz, tem
Global.f cr, ci, cj, ck, wk, inc, distance
Global mand, zval
Global.f angle
Define.f red, green, blue
;zval = 1 shows entire set
;zval = 0 cuts set in half
;zval = 0 is an interesting effect
wd = 500
ht = 500
;defines the shape of the Julia Set
cr = -0.200
ci = 0.800
cj = 0.000
ck = 0.000
wk = 0.000
;mand = 0 is Julia Set
;mand = 1 is Mandelbrot 3D
mand = 1
;zval = 1 shows entire set
;zval = 0 cuts set in half
;zval = 0 is an interesting effect
zval = 1
iter = 5
inc = 5 
;#quat = 1
zval = 1
iter = 5
inc = 5 
Procedure.f RandF(Min.f, Max.f, Resolution.i = 10000)
  ProcedureReturn (Min + (Max - Min) * Random(Resolution) / Resolution)
EndProcedure

Quit.b = #False
rot.l=1 :stopFlag = 1
xs.f = 0.3:ys.f = 0.3:zs.f = 0.3
x.f: y.f :z.f: x0.f: y0.f=1 :z0.f
rotx.f:roty.f=1:rotz.f :rotx0.f: roty0.f: rotz0.f
up.f = 2.2: depth.f=0

ExamineDesktops()
If OpenWindow(#mainwin, 0, 0, DesktopWidth(0), DesktopHeight(0), "PgUp PgD scale mesh..Arrows for rotation, space: stop/rotate,  QA Up/Down, WS far/near", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(#BUTTON, 0, DesktopHeight(0)-60, 60, 30, "rotate/stop") 

;Initialize environment
InitEngine3D()
InitSprite()
OpenWindowedScreen(WindowID(#mainwin), 0, 0, DesktopWidth(0), DesktopHeight(0)-70, 0, 0, 0)
WorldShadows(#PB_Shadow_Additive)

InitKeyboard()
SetFrameRate(60)

Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Scripts", #PB_3DArchive_FileSystem)
Parse3DScripts()

CreateLight(0,RGB(255,255,255),-100,40,30)
AmbientColor(RGB(100,100,100))

;CreateCamera(#CAMERA_ONE, 0, 0, 300, 400)
CreateCamera(#CAMERA_ONE, 0, 0, 400, 400)
MoveCamera(#CAMERA_ONE, 0, 2, 9)
CameraLookAt(#CAMERA_ONE, 0, 1, 0)

RotateCamera(#CAMERA_ONE, -15, 0, 0)
EndIf

SetActiveGadget(#BUTTON)
;SkyDome("clouds.jpg", 100) ;for blue color background

;- Mesh Stars

;PointsSize = GetScriptMaterial(#PB_Any, "def_Points_04")
CreateMesh(1, #PB_Mesh_PointList, #PB_Mesh_Dynamic )
;CreateMesh(1, #PB_Mesh_PointList, #False)

GetScriptMaterial(0, "PointsSprites")
SetMeshMaterial(1, MaterialID(0))
DisableMaterialLighting(0, #True)

Global Stars = CreateNode(#PB_Any)
AttachNodeObject(Stars, MeshID(1))


Procedure.f calcleng( x.f,  y.f,  z.f)
    w.f: kr.f: ki.f: kj.f: kk.f
    w = wk
    n = 0
    If mand = 1  ;full Mandelbrot set
        kr = x
        ki = y
        kj = z
        kk = 0
    Else                ;else draw Julia Set
        kr = cr
        ki = ci
        kj = cj
        kk = ck
    EndIf
    
    While n < iter
        tem = x+x
        x = x*x-y*y-z*z-w*w+kr
        y = tem*y + ki
        z = tem*z + kj
        w = tem*w + kk
        
        n+1
        distance = x*x+y*y+z*z+w*w
        
        If distance > 4 
          n = iter
        EndIf
        
    Wend
        
    ;Return distance
    ProcedureReturn distance
  
EndProcedure

  

Procedure calcit()
    zz.f
    foo.l
    iterations = 10000
    count = 0
    
    If zval = 0
        zz = 2.0
    Else
        zz = 4.0
    EndIf
      
      For foo = 0 To iterations
          ;x.f = RandF(0, 1)
          ;y.f = RandF(0, 1)
          x.f = RandF(-2, 2)
          y.f = RandF(-2, 2)
          
          z.f = zz*RandF(0, 1) -2.0
          
          ;calls the quaternion calculation
          leng.f = calcleng(x,y,z)
          
          If leng < 4 
            ;MeshVertexPosition(x, y, z)
            
              red = (x+Cos(15*leng))*255
              green = (y+Sin(1-leng)*Cos(5*leng))*255
              blue = (z+Sin(0.75*leng))*255
              If red < 0 : red = 0 : EndIf
              If green < 0 : green = 0 : EndIf
              If blue < 0 : blue = 0 : EndIf
              ;If red > 255 : red = red-255 : EndIf
              ;If green > 255 : green = green-255 : EndIf
              ;If blue > 255 : blue = blue-255 : EndIf
              
              ;MeshVertexColor(RGBA(red,green,blue,0))
              MeshVertexPosition(x, y, z)
              ;;;;MeshVertexColor(RGB(red,green,blue))
              ;Debug x*2
              ;Debug y*2
              ;Debug z*2
                           
          EndIf
          
        Next 
        FinishMesh(#False)
        NormalizeMesh(1)
      
EndProcedure


calcit()  ; calling the mandel 3D or julia generator function
;MeshVertexPosition(-0.67, -0.17, 0.1)
;MeshVertexColor(RGB(255,255,0))
;MeshVertexPosition(0.0, 0.0, 0.0)
;MeshVertexColor(RGB(255,0,0))
;;MeshVertexColor(RGB(0,255,0))
;FinishMesh(#False)
;NormalizeMesh(1)

;Main loop
Repeat
  Event = WindowEvent()
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case #BUTTON
        If rot = 0
          rot = 1
          rotx= rotx0:roty=roty0:rotz=rotz0 ; restore rotation status
          stopFlag = 1
          
        Else
          rot = 0
          rotx0= rotx:roty0=roty:rotz0=rotz ;back up rotation status
          rotx=0:roty=0:rotz=0
          stopFlag = 0
          
        EndIf
                    
    EndSelect
  EndIf 
  If stopFlag=1
    x + rotx
    y + roty
    z + rotz
  EndIf
  
   RotateNode(Stars, x, y, z)
   
   RenderWorld()
   FlipBuffers()

  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Up)  ; rotate left
    rotx=1:roty=0:rotz=0
    rotx0 = rotx: roty0 = roty :rotz0 = rotz
    x + rotx
    y + roty
    z + rotz
    stopFlag=0
    rot = 0
  ElseIf KeyboardPushed(#PB_Key_Down) ; rotate right
    rotx=-1:roty=0:rotz=0
    rotx0 = rotx: roty0 = roty :rotz0 = rotz
    x + rotx
    y + roty
    z + rotz
    stopFlag=0
    rot = 0
  ElseIf KeyboardPushed(#PB_Key_Right)   ; rotate up
    rotx=0:roty=1:rotz=0
    rotx0 = rotx: roty0 = roty :rotz0 = rotz
    x + rotx
    y + roty
    z + rotz
    stopFlag=0
    rot = 0
  ElseIf KeyboardPushed(#PB_Key_Left) ; rotate down
    rotx=0:roty=-1:rotz=0 
    rotx0 = rotx: roty0 = roty :rotz0 = rotz
    x + rotx
    y + roty
    z + rotz
    stopFlag=0
    rot = 0
  EndIf 
  
  If KeyboardPushed(#PB_Key_PageUp) ; scale up model
    xs.f = 1.1:ys.f = 1.1:zs.f = 1.1
    ScaleNode(Stars,xs,ys,zs)
    
  ElseIf KeyboardPushed(#PB_Key_PageDown) ; scale down model
    xs = 0.9:ys = 0.9:zs= 0.9
    ScaleNode(Stars,xs,ys,zs)
    
  EndIf
  If KeyboardPushed(#PB_Key_Q) ; up move
    up + 0.1
    MoveNode(Stars,0,up,depth,#PB_Absolute)
   ElseIf KeyboardPushed(#PB_Key_A) ; down move
    up - 0.1
    MoveNode(Stars,0,up,depth,#PB_Absolute)
    ElseIf KeyboardPushed(#PB_Key_W) ; forward move
    depth - 0.1
    MoveNode(Stars,0,up,depth,#PB_Absolute)
    ElseIf KeyboardPushed(#PB_Key_S) ; inward move
    depth + 0.1
    MoveNode(Stars,0,up,depth,#PB_Absolute)

  EndIf
   If KeyboardPushed(#PB_Key_Escape)
      Quit = #True
    EndIf
    
    
Until Quit = #True Or Event = #PB_Event_CloseWindow
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Point Sprites

Post by IdeasVacuum »

Thanks for that ApplePi - it's simpler than I had imagined. 8)
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Point Sprites

Post by IdeasVacuum »

......minimal script using a 32bit png with transparency:

Code: Select all

material Pt_16x
{
   receive_shadows off
   technique
   {
      pass
      {        
         scene_blend alpha_blend
         point_sprites on
         point_size 16
         lighting off

         texture_unit
         {
            texture Pt_Red_16x.png
         }
      }
   }
}
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
Post Reply