Page 1 of 1

2d Metaballs

Posted: Fri Jan 23, 2004 4:42 am
by Shopro
Hello, I've made a simple Metaball demo.

It Currently draws Texture.w(, ) into Screen_Buffer(, ), renders that to the DirectX buffer, and then FlipBuffers(). This was the only simple way I could think of, but seem very optimized(drawing into a buffer, and drawing that into another).

Is there any way to make this demo better :)?

Thanks

Code: Select all

Declare Generate_Texture()
Declare Init_Palette()
Declare Render_Blob(Blob_Pos_X, Blob_Pos_Y)
Declare Render_Screen_Buffer()
Declare Render_Screen_Clear()

; Constants
#General_Title$ = "2d metaballs demo"
#General_Version$ = "v0.5"
#General_Author$ = "Kenji Gunn"
#General_Date$ = "2004/01/23"

#Window_Size_X.w = 639
#Window_Size_Y.w = 479

#Blob_Size_X.w = 255
#Blob_Size_Y.w = 255

; Variables
Global Event_ID.l

Global Render_Line_X.w

; Dimensions
Dim Texture.w(255, 255)
Dim Pal_Blob.l(255)
Dim Screen_Buffer(#Window_Size_X, #Window_Size_Y)

InitSprite()
InitKeyboard()
InitMouse()

OpenWindow(0, 0, 0, #Window_Size_X + 1, #Window_Size_Y + 1, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, #General_Title$ + " " + #General_Version$)
OpenWindowedScreen(WindowID(), 0, 0, #Window_Size_X + 1, #Window_Size_Y + 1, 1, 0, 0)

Init_Palette()
Generate_Texture()

Repeat
  Event_ID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  
  Render_Blob(320, 240)
  Render_Blob(MouseX(), MouseY())
  Render_Screen_Buffer()
 
  FlipBuffers()
  
  Render_Screen_Clear()
Until KeyboardPushed(#PB_Key_Escape) Or Event_ID = #PB_EventCloseWindow

Procedure Generate_Texture()
  Protected x, y
  Protected d.f, c.l
  
  For x = -128 To 127 Step 1
    For y = -128 To 127 Step 1
      d = Sqr(x * x + y * y)
      If d <= 128
        c = 160 * Cos(d * 3.14159 / 128) + 160
        If c > 255
          c = 255
        EndIf
        Texture(x + 128, y + 128) = c
      EndIf
    Next
  Next
EndProcedure

Procedure Init_Palette()
  Protected Init_Palette
  
  For Init_Palette = 0 To 63
    Pal_Blob(Init_Palette) = RGB(0, 0, 0) 
  Next 
  For Init_Palette = 0 To 63
    Pal_Blob(Init_Palette + 64) = RGB(0, 0, Int(255 / 64 * Init_Palette)) 
  Next
  For Init_Palette = 0 To 127
    Pal_Blob(Init_Palette + 64 + 64) = RGB(Int(255 / 127 * Init_Palette), Int(255 / 127 * Init_Palette), 250) 
  Next
  
  Pal_Blob(255) = RGB(255,255,255) 
EndProcedure

Procedure Render_Blob(Blob_Pos_X, Blob_Pos_Y)
  Protected Render_Blob_X.w, Render_Blob_Y.w
  Protected Render_Blob_Start_X.w, Render_Blob_Start_Y.w
  Protected Render_Blob_End_X.w, Render_Blob_End_Y.w
  Protected Render_Blob_Color.w
  
  If Blob_Pos_X < 0
    Render_Blob_Start_X = -Blob_Pos_X
  ElseIf Blob_Pos_X + #Blob_Size_X > #Window_Size_X
    Render_Blob_End_X = #Window_Size_X - Blob_Pos_X
  Else
    Render_Blob_End_X = 255
  EndIf
  If Blob_Pos_Y < 0
    Render_Blob_Start_Y = -Blob_Pos_Y
  ElseIf Blob_Pos_Y + #Blob_Size_Y > #Window_Size_Y
    Render_Blob_End_Y = #Window_Size_Y - Blob_Pos_Y
  Else
    Render_Blob_End_Y = 255
  EndIf
  
  For Render_Blob_Y = Render_Blob_Start_Y To Render_Blob_End_Y
    For Render_Blob_X = Render_Blob_Start_X To Render_Blob_End_X
      Render_Blob_Color = Screen_Buffer(Blob_Pos_X + Render_Blob_X, Blob_Pos_Y + Render_Blob_Y) + Texture(Render_Blob_X, Render_Blob_Y)
      If Render_Blob_Color > 255
        Render_Blob_Color = 255
      EndIf
      Screen_Buffer(Blob_Pos_X + Render_Blob_X, Blob_Pos_Y + Render_Blob_Y) = Render_Blob_Color
    Next
  Next
EndProcedure

Procedure Render_Screen_Buffer()
  Protected Render_Screen_Buffer_X.w, Render_Screen_Buffer_Y.w
  
  StartDrawing(ScreenOutput())
  For Render_Screen_Buffer_Y = 0 To #Window_Size_Y
    For Render_Screen_Buffer_X = 0 To #Window_Size_X
      Plot(Render_Screen_Buffer_X, Render_Screen_Buffer_Y, Pal_Blob(Screen_Buffer(Render_Screen_Buffer_X, Render_Screen_Buffer_Y)))
    Next
  Next
  StopDrawing()
EndProcedure

Procedure Render_Screen_Clear()
  Dim Screen_Buffer(#Window_Size_X, #Window_Size_Y)
EndProcedure
-Shopro

Posted: Fri Jan 23, 2004 12:02 pm
by Saboteur
DirectX buffer???
In Linux works OK!!!!! :)

Posted: Fri Jan 23, 2004 12:12 pm
by Shopro
Saboteur:
Thanks:) It's a funny feeling that the code works in Linux

by DirectX, I meant the buffer you draw in, before you FlipBuffers()

Just noticed a mistake,
"This was the only simple way I could think of, but **doesn't** seem very optimized(drawing into a buffer, and drawing that into another)."

-Shopro