Mixing Monkey with OpenGl

Monkey Targets Forums/Desktop/Mixing Monkey with OpenGl

Emil_halim(Posted 2014) [#1]
Hi all,

this time i want to show you a way to mix your monkey code with some pure OpenGl code.

sometimes you want to make a certain thing that con not done with monkey only, so this demo for you.

the code
=========

#GLFW_USE_MINGW=False

'Ok, looks a bit crap and doesn't make much sense, but it's just a test of offset, pitch, byte order etc...
'
Import mojo

! #include <D:\MonkeyX\bananas\mak\dynamicimage\dynamicimage.buildv77a\glfw\glfw\include\GL/gl.h>

Class MyApp Extends App

	Field img:Image
	
	Method OnCreate()
	
		SetUpdateRate 60
		
	End
	
	Field fullscreen:=False
	
	Method OnUpdate()
	
#If TARGET="glfw"
		If KeyHit( KEY_SPACE )
			fullscreen=Not fullscreen
			If fullscreen
				GlfwGame.GetGlfwGame().SetGlfwWindow( 1024,768,8,8,8,0,0,0,True )
			Else
				GlfwGame.GetGlfwGame().SetGlfwWindow( 640,480,8,8,8,0,0,0,False )
			Endif
		End
#Endif
	end
	
	Method OnRender()
	
		If Not img
			Local w=256,h=256
		
			img=CreateImage(w,h,1,Image.MidHandle)
			
			Cls 128,0,255
			SetColor 255,128,0	'Orange!
			DrawRect 16,16,w-32,h-32
			SetColor 255,255,255
			DrawText "Hello World",w/2,h/2,.5,.5

			Local buf:=New Int[w*2*h]
			ReadPixels buf,0,0,w,h ,w,w*2

			For Local i:=0 Until w*h*2
				If i<w*h*2/3
					buf[i]|=$ff0000
				Else If i<w*h*4/3
					buf[i]|=$00ff00
				Else
					buf[i]|=$0000ff
				Endif
			Next
			
			For Local i=0 Until h
				For Local j=0 Until w*2
					buf[i*w*2+j]=buf[i*w*2+j] & $ffffff | (i*255/h) Shl 24
				Next
			Next
			
			img.WritePixels buf,0,0,w,h ,w,w*2
		End
		
		Cls
		Scale 2,2
		SetColor 255,255,255
		DrawImage img,MouseX/2.0,MouseY/2.0
		DrawText "Testing...",0,0
		
		inlineC
		  glMatrixMode(GL_MODELVIEW);
          glPushMatrix();

		  glTranslatef(	200, 100, 0);
		  glBegin(GL_QUADS);
		  glColor3f(1,0,1);
		  glTexCoord2f(0.0, 0.0); glVertex3f(-60.0, -30.0, 0.0);
		  glTexCoord2f(0.0, 1.0); glVertex3f(-60.0,  30.0, 0.0);
		  glTexCoord2f(1.0, 1.0); glVertex3f( 60.0,  30.0, 0.0);
		  glTexCoord2f(1.0, 0.0); glVertex3f( 60.0, -30.0, 0.0);
		  glEnd();
		  
		  glPopMatrix();

		endC

	End
	
End

Function Main()
	New MyApp
End




blabz(Posted 2014) [#2]
You shouldn't use the fixed function pipeline, it breaks portability.


Emil_halim(Posted 2014) [#3]
ok,

i added a new code that uses glDrawArrays for the sake of portability.

But as i said above , for win32 desktop we can use some codes that not found in monkey opengl . so that i post the topic here.

the code
========

#GLFW_USE_MINGW=False

'Ok, looks a bit crap and doesn't make much sense, but it's just a test of offset, pitch, byte order etc...
'
Import mojo

Import opengl.gles11

! #include <D:\MonkeyX\modules\opengl/gl.h>

Class MyApp Extends App

	Field img:Image
	
	Method OnCreate()
	
		SetUpdateRate 60
		
	End
	
	Field fullscreen:=False
	
	Method OnUpdate()
	
#If TARGET="glfw"
		If KeyHit( KEY_SPACE )
			fullscreen=Not fullscreen
			If fullscreen
				GlfwGame.GetGlfwGame().SetGlfwWindow( 1024,768,8,8,8,0,0,0,True )
			Else
				GlfwGame.GetGlfwGame().SetGlfwWindow( 640,480,8,8,8,0,0,0,False )
			Endif
		End
#Endif
	end
	
	Method OnRender()
	
		If Not img
			Local w=256,h=256
		
			img=CreateImage(w,h,1,Image.MidHandle)
			
			Cls 128,0,255
			SetColor 255,128,0	'Orange!
			DrawRect 16,16,w-32,h-32
			SetColor 255,255,255
			DrawText "Hello World",w/2,h/2,.5,.5

			Local buf:=New Int[w*2*h]
			ReadPixels buf,0,0,w,h ,w,w*2

			For Local i:=0 Until w*h*2
				If i<w*h*2/3
					buf[i]|=$ff0000
				Else If i<w*h*4/3
					buf[i]|=$00ff00
				Else
					buf[i]|=$0000ff
				Endif
			Next
			
			For Local i=0 Until h
				For Local j=0 Until w*2
					buf[i*w*2+j]=buf[i*w*2+j] & $ffffff | (i*255/h) Shl 24
				Next
			Next
			
			img.WritePixels buf,0,0,w,h ,w,w*2
		End
		
		Cls
		Scale 2,2
		SetColor 255,255,255
		DrawImage img,MouseX/2.0,MouseY/2.0
		DrawText "Testing...",0,0
		
		' using inlin c to pass code to cpp
		' using GLBegin-GLEnd
		inlineC
		  glMatrixMode(GL_MODELVIEW);
                  glPushMatrix();
		  glTranslatef(	200, 100, 0);
		  glBegin(GL_QUADS);
		  glColor3f(1,0,1);
		  glTexCoord2f(0.0, 0.0); glVertex3f(-60.0, -30.0, 0.0);
		  glTexCoord2f(0.0, 1.0); glVertex3f(-60.0,  30.0, 0.0);
		  glTexCoord2f(1.0, 1.0); glVertex3f( 60.0,  30.0, 0.0);
		  glTexCoord2f(1.0, 0.0); glVertex3f( 60.0, -30.0, 0.0);
		  glEnd();
		  glPopMatrix();
		endC
		
		  ' using imported opengl module
		  ' using GLDrawArrays
		  Local vert:Float[] = [-60.0, -30.0, 0.0 , -60.0,  30.0, 0.0 , 60.0,  30.0, 0.0 ,  60.0, -30.0, 0.0]
		  Local txtCord:Float[] = [0.0,0.0, 0.0,1.0, 1.0,1.0, 1.0,0.0] 
		  glMatrixMode(GL_MODELVIEW )
                  glPushMatrix()
		  glTranslatef(	400, 100, 0)
		  glColor4f(1,1,1,1)
		  glEnableClientState( GL_VERTEX_ARRAY )
		  glEnableClientState( GL_TEXTURE_COORD_ARRAY )	
		  !glVertexPointer( 3,GL_FLOAT,0,(Const Void*)&t_vert[0])
                  !glTexCoordPointer( 2,GL_FLOAT,0,(Const Void*)&t_txtCord[0])
                  !glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
                  glDisableClientState(GL_VERTEX_ARRAY)
                  glDisableClientState(GL_TEXTURE_COORD_ARRAY)
                  glPopMatrix();
	End
	
End

Function Main()
	New MyApp
End