Import mojo2
Import brl.databuffer
#GLFW_WINDOW_WIDTH = 800
#GLFW_WINDOW_HEIGHT = 600
Function Main()
New MyApp
Return 0
End
Class MyApp Extends App
Field layers:Image[16]
Field ccanvas:Canvas
Field canvas:Canvas
Field layername:DrawList[16]
Field x:Int = 0
Field pixels:DataBuffer = New DataBuffer(4 * 320 * 200)
Method OnCreate()
canvas = New Canvas()
For Local i:Int = 0 To 15
layers[i] = New Image(800,600,.0,.0)
Next
ccanvas = New Canvas(layers[0])
' Clear all 16 layers & create 16 Drawlists
For Local i:Int = 0 To 15
layername[i] = New DrawList
ccanvas.SetRenderTarget(layers[i])
ccanvas.Clear(0,0,0,0)
Next
Return 0
End
Method OnUpdate()
If KeyHit( KEY_ESCAPE ) EndApp
End
Method OnRender()
ccanvas.SetRenderTarget(layers[1])
ccanvas.SetAlpha(0.1) ' 10% OPAQUE
ccanvas.DrawCircle(30,30,200) ' LAYER 1 VISIBLE
ccanvas.SetRenderTarget(layers[3])
ccanvas.SetAlpha(0.5) ' 50% OPAQUE
' ccanvas.DrawCircle(80,80,100) ' LAYER 3 IS CIRCLE MOVING TO THE RIGHT
ccanvas.SetRenderTarget(layers[10])
ccanvas.SetAlpha(1.0) ' 100% OPAQUE
' ccanvas.SetColor 255,255,0
' ccanvas.DrawCircle(200,100,100) ' VISIBLE LAYER
x = x + 2
x = x Mod 800
ccanvas.SetRenderTarget(layers[0])
ccanvas.SetColor 1,1,1
ccanvas.SetAlpha(0.1)
ccanvas.DrawImage(layers[3],x,0)
ccanvas.SetAlpha(1.0) ' 100% OPAQUE
ccanvas.SetBlendMode(BlendMode.Opaque2)
' -------------------------------------------------------
' LAYER 15 = RANDOM RECTANGLES
ccanvas.SetRenderTarget(layers[15])
For Local temp:=1 To 16
If Int(Rnd(1)>0.5) Then ccanvas.SetColor 0,0,0 Else ccanvas.SetColor 1,1,1
Local xx:= Int(Rnd(7)) ; Local yy:= Int(Rnd(7))
ccanvas.DrawRect xx*4,yy*4,2*4,2*4
Next
' LAYER 10 = CIRCLE
ccanvas.SetRenderTarget(layers[0])
ccanvas.SetColor(1,0,0)
ccanvas.SetAlpha(1.0)
ccanvas.SetColor(1,1,1)
' -------------------------------------------------------------------------------------------------------------------
ccanvas.SetAlpha(1.0)
ccanvas.DrawImage(layers[1],x/2,150) ' DRAW LAYER 1
' READ PIXELS
ccanvas.ReadPixels(0,0,320,200, pixels)
Local pos:Int = 4*320
For Local y:Int = 0 Until (100-1)
For Local x:Int = 0 Until 320
If pixels.PeekInt(pos) <> $ffffffff Then pixels.PokeInt(pos,$800000ff);
pos = pos + 4
Next
Next
' CHANGE PIXELS
pixels.PokeInt(150*320*4+Rnd(10,50)*4,$000000ff)
pixels.PokeInt(10*320*4+10*4,pixels.PeekInt(10*320*4+10*4) | $ff000000)
' WRITEPIXELS
layers[0].WritePixels(0, 0, 320, 200, pixels)
ccanvas.Flush()
canvas.Clear(0,0,0,0)
canvas.SetBlendMode(BlendMode.Opaque2)
canvas.DrawImage(layers[10],0,0)
canvas.DrawImage(layers[0],0,0)
canvas.SetAlpha(1.0)
canvas.SetBlendMode(BlendMode.Alpha)
canvas.DrawEllipse ( 150,150,50,20)' add material for non-default material (needed also for shaders)
canvas.SetAlpha(1.0)
canvas.SetBlendMode(BlendMode.Alpha)
canvas.SetColor(1,0,1)
canvas.DrawImage(layers[1],100,100)
canvas.SetAlpha(0.4)
canvas.DrawImage(layers[0],100,200+Sin( Millisecs*.1 )*200+20)
canvas.SetAlpha(1.0)
canvas.SetColor(1,1,1)
' DRAWLISTS
' --------------
' Prepare a few drawlists (batches of instructions) These are commands that hasn't become pixels yet (they are primitives, vectors, parametric graphics)
layername[0].Reset() ' Same as Clear() for pixels and all-already-drawn-graphics of a canvas (by which I mean when written pixels written by pixelwrite and these batches of commands has become pixels)
layername[0].SetColor(1,0,0) ' Red
layername[0].SetColor(1,1,1) ' White
layername[0].DrawRect(x,100,200,120)
layername[0].SetColor(0,0,0) ' Black
layername[0].SetColor(0,0,1) ' Blue
layername[0].SetColor(0,1,0) ' Green
layername[0].DrawText("This is an imagelist" ,x,50)
layername[0].DrawText("This is an imagelist" ,x+1,50)
' BATCHING GRAPHICS USING DRAWLISTS
' --------------------------------------
' Create another drawlist (batch)
layername[1].Reset()
layername[1].SetColor(0,0,1)
layername[1].DrawRect((x+x/3)*(400.0/64.0),50,400,90)
ccanvas.RenderDrawList(layername[0]) ' Draw the batch to ccanvas
canvas.PushMatrix()
canvas.Scale(64.0/400.0,64.0/90.0)
ccanvas.RenderDrawList(layername[1])
canvas.Scale(1.0,1.0)
canvas.PopMatrix()
ccanvas.ReadPixels(0,0,320,200, pixels)
Local pixel:Int[] = ColorToRgb(pixels.PeekInt(Int(Int(MouseX())*4+Int(MouseY())*320*4)))
Local r: Int = pixel[3] ; Local g: Int = pixel[2] ; Local b: Int = pixel[1] ; Local a: Int = pixel[0]
canvas.SetColor 1,0,0
canvas.DrawText( String(r).Split("~n")),DeviceWidth()/2,DeviceHeight()/2,0.5,0.5
canvas.DrawText( String(g).Split("~n")),DeviceWidth()/2,DeviceHeight()/2+20,0.5,0.5
canvas.DrawText( String(b).Split("~n")),DeviceWidth()/2,DeviceHeight()/2+40,0.5,0.5
canvas.DrawText( String(a).Split("~n")),DeviceWidth()/2,DeviceHeight()/2+60,0.5,0.5
canvas.SetColor 1,1,1 ' one then hex (3 or 4 bytes 0-255 if 3 or 4 values then 0-1
canvas.DrawImage(layers[10],0,0)
canvas.DrawImage(layers[0],0,0)
canvas.Flush()
End
End Class
Function ColorToRgb:Int[](value:Int)
Local resp:Int[] ; resp = resp.Resize(4)
Local v:Int = value ; resp[3] = v & 255
v = v Shr 8 ; resp[2] = v & 255
v = v Shr 8 ; resp[1] = v & 255
v = v Shr 8 ; resp[0] = v & 255
Return resp
End