2d Metaballs
Posted: Fri Jan 23, 2004 4:42 am
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
-Shopro
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