Code archives/Graphics/Fast 2D Blobby Objects/Metaballs in Max2D with OpenGL extras
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This program shows how to draw an `energy field` image using a special gradient curve, and then takes that image and renders it using LIGHTBLEND mode, to produce blobby objects. Several full-screen passes are then added using different blend modes and values to massage the visual data into something more useful. The end result is a gradient-shaded `band` which conforms to the contours of the blobby objects. This example uses some OpenGL calls but also still uses Max2D in a compatible way. This program could be used in a game or for some other application. It will be highly hardware accelerated if your OpenGL implementation supports using the GPU. It is fast! | |||||
'Blobby objects with BlitzMax using Max2D and some direct OpenGL 'Some special numbers Local ballsize:Int=512 Local ballsizehalf:Int=ballsize/2 'Set up the display Graphics 800,600,0 Cls 'Work out what the dividers needs to be Local balldivider:Float If ballsize=128 Then balldivider=64 '8x8 If ballsize=256 Then balldivider=256 '16x16 If ballsize=512 Then balldivider=1024 '32x32 Local lineardivider:Float If ballsize=128 Then lineardivider=0.5 If ballsize=256 Then lineardivider=1 If ballsize=512 Then lineardivider=2 'Render the gradient image For Local r:Float=1 To ballsize-1 Step 0.5 Local level:Float=r level:*level level=level/balldivider SetColor level,level,level 'For blobby gradient shape 'SetColor r/lineardivider,r/lineardivider,r/lineardivider 'For linear gradients DrawOval r/2,r/2,ballsize-r,ballsize-r Next 'Turn it into an image AutoMidHandle True Local img:TImage=CreateImage(ballsize,ballsize,1,FILTEREDIMAGE) GrabImage(img,0,0,0) 'Set the blend mode SetBlend LIGHTBLEND 'Keep drawing the image until you press Escape Repeat Cls glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA,GL_ONE) DrawImage img,400,300 DrawImage img,MouseX(),MouseY() glBlendFunc(GL_SRC_ALPHA,GL_ONE) glColor4b($40,$40,$40,$40) DrawRect 0,0,800,600 glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_DST_COLOR) glColor4b(0,0,0,$FF) Local Counter:Int For Counter:Int=1 To 3 DrawRect 0,0,800,600 Next glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE_MINUS_DST_COLOR) glColor4b($0,$0,$0,$0) DrawRect 0,0,800,600 glBlendFunc(GL_DST_COLOR,GL_DST_COLOR) glColor4b($FF,$FF,$FF,$FF) SetColor $FF,$FF,$FF For Counter:Int=1 To 3 DrawRect 0,0,800,600 Next glDisable(GL_BLEND) Flip Until KeyHit(KEY_ESCAPE) |
Comments
| ||
CANT.....STOP......PLAYING WITH THIS COOODE!!!! Excellent work! |
| ||
Great ! |
| ||
very nice. |
| ||
To fix this for v1.12 (demo at least) add SetGraphicsDriver(GLMax2DDriver()) above Graphics 800,600,0 and it works, to some extent. |
| ||
You shouldn't be setting the Max2d driver when it's doing custom OpenGL code, you should choose the GLGraphics() driver. |
| ||
it works ok in windowed mode but full screen? can you or angel convert it to 100% gl graphics? That would really help some of us trying to learn OGL. I know what its doing: A grayscale image is blended with another gray scale image and causes the effect. what I am interested on is how do you integrate the images in to ogl. I am going to try to work this out myself but a little help would be appreciated. I will post any progress. |
| ||
See this thread, it contains a pure OpenGL implementation: http://www.blitzbasic.com/Community/posts.php?topic=46378 The code may be slightly old - not sure but you might have to change to GLGraphics() to open a display. Also the blobs that it shows initially are based on a square blob field which creates inverted blobs (which I think are cool - since I invented them). Let me know if it works for you. |
| ||
thank you, I will check it out. |
| ||
Sorry to dig this up after so long but it's still useful. Here's an adaptation that uses a FBO and gets away with just two render passes, one to draw the individual blobs to a texture and the other to render that texture to the screen. It does combine Max2D & OpenGL but appears to work ok (for now). |
| ||
balls are touching.... u know what that means... |
| ||
tesuji, sounds like something I was looking for but when I run it, it looks like just a bunch of rendered green circles... any idea why this is? |
| ||
Nate, maybe a problem with the FBO and your gfx card? I'll try and put a up a plain grabpixmap version and or a faster opengl equivalent and see if that makes any difference. <edit> here's a slower grabimage version that doesn't rely on FBOs. Does this work? <edit2> gah. worked on the mac but got the same when I tried it on a PC. Determined that the grabimage wasn't including alpha even though it does on the mac. Change to Graphics 1024,768,0,0,GRAPHICS_BACKBUFFER | GRAPHICS_DEPTHBUFFER | GRAPHICS_ALPHABUFFER Hopefully that works. |
| ||
I get the green output with both versions, tesuji -- green balls moving over black background. BTW It looks like you're setting Hertz to 0 in the Graphics call! I have to take that out to make it do anything... |
| ||
Managed to replicate the issue on a PC. Hopefully fixed now. Code edited above and seems to work, at least from here. |
| ||
Hi tesuji, yep, both versions are working now, well done. (Just to check, still green, but shaded properly instead of being solid.) |
| ||
Thanks BlitzSupport. It should look something like this : |
| ||
Perfect, then! |
| ||
both examples work now! thanks! |
Code Archives Forum