DreiDe - 3D Engine

BlitzMax Forums/BlitzMax Programming/DreiDe - 3D Engine

Hi,

I added some funky stuff :) The ability to use the Max2D commands in combination with DreiD, very cool. Only change you need to make to your source code is to use Flip and EndGraphics instead of the TDreiDe equivalents.

Here's the modified DreiDe.bmx:
Strict

Module Pub.DreiDe

ModuleInfo "Version: 2.31 Edited"
ModuleInfo "Author: Oliver Skawronek"
ModuleInfo "Edited by: Mikkel Fredborg"
ModuleInfo "License: Public Domain"

Import Brl.Max2D
Import Brl.GLMax2D
Import Pub.Glew
?Linux
Import "-lX11"
Import "-lXxf86vm"
? 
Import Brl.BlitzGL
Import Brl.System
Import "HardwareInfo.bmx"
Import "Entity.bmx"
Import "Pivot.bmx"
Import "Camera.bmx"
Import "Mesh.bmx"
Import "Surface.bmx"
Import "Material.bmx"
Import "Texture.bmx"
Import "3DSLoader.bmx"

Type TDreiDe
	
	Function Graphics3D:Int(Width:Int, Height:Int, Depth:Int=0, Hertz:Int=60, ..
	                        Fullscreen:Int=True)
		Local Flags:Int

		' Create Window + RenderContext
		SetGraphicsDriver GLMax2DDriver(),GRAPHICS_BACKBUFFER|GRAPHICS_DEPTHBUFFER
		If Fullscreen
			Graphics(Width,Height,Depth,Hertz|NOSYNC)
		Else
			Graphics(Width,Height,0,Hertz|NOSYNC)
		EndIf

		' Init OpenGL
		GlewInit()

		' Save current Screen Resolution
		THardwareInfo.ScreenWidth  = Width
		THardwareInfo.ScreenHeight = Height
		THardwareInfo.ScreenDepth  = Depth
		THardwareInfo.Fullscreen   = Fullscreen

		' Init DreiDe
		TEntity.List   = CreateList()
		TPivot.List    = CreateList()
		TCamera.List   = CreateList()
		TMesh.List     = CreateList()
		TSurface.List  = CreateList()
		TMaterial.List = CreateList()
		TTexture.List  = CreateList()

		' Get HardwareExtensions- and Limits
		THardwareInfo.GetInfo()

		' Enable Vertex- And Elementarrays
		glEnableClientState(GL_VERTEX_ARRAY)
		glEnableClientState(GL_NORMAL_ARRAY)
		glEnableClientState(GL_COLOR_ARRAY)

		' Enable seperate Specularcolor
		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR)

		' Display a blank screen
		glClear(GL_COLOR_BUFFER_BIT)
		
		Flip
		
		Return True
	End Function

	Function UseMax2D()

		Local x,y,w,h
		GetViewport(x,y,w,h)
		
		glDisable(GL_LIGHTING)
		glDisable(GL_DEPTH_TEST)
		glDisable(GL_SCISSOR_TEST)
		glDisable(GL_FOG)
		glDisable(GL_CULL_FACE)

		glMatrixMode GL_TEXTURE
		glLoadIdentity
		
		glMatrixMode GL_PROJECTION
		glLoadIdentity
		glOrtho 0,GraphicsWidth(),GraphicsHeight(),0,-1,1
		
		glMatrixMode GL_MODELVIEW
		glLoadIdentity
		
		SetViewport x,y,w,h

		'
		' Clear textures		
		For Local Layer = 0 Until THardwareInfo.MaxTextures
			glActiveTexture(GL_TEXTURE0+Layer)
				
			glDisable(GL_TEXTURE_CUBE_MAP)
			glDisable(GL_TEXTURE_GEN_S)
			glDisable(GL_TEXTURE_GEN_T)
			glDisable(GL_TEXTURE_GEN_R)

			glDisable(GL_TEXTURE_2D)
		Next
		
		'
		' Activate texture layer 0
		glActiveTexture(GL_TEXTURE0)

		'
		' To reset states!
		DrawRect -10,-10,5,5
				
	EndFunction

	Function DisplayStatus()
		Print "DreiDe Statusinfo:"
		Print ""

		' Display Screeninfo
		Print "Screeninfo: "
		Print " - Screen-Width:  "+THardwareInfo.ScreenWidth
		Print " - Screen-Height: "+THardwareInfo.ScreenHeight
		Print " - Screen-Depth:  "+THardwareInfo.ScreenDepth
		Print " - Fullscreen:    "+THardwareInfo.Fullscreen
		Print ""

		' Display Memoryinfo
		Print "Memoryinfo: "
		Print " - Allocated: "+MemAlloced()+" Bytes"
		Print " - Usage:     "+MemUsage()+" Bytes"
		Print ""

		' Display Number of Objects
		Print "Number of objects:"
		Print " - Entitys:   "+TEntity.List.Count()
		Print "  - Pivots:   "+TPivot.List.Count()
		Print "  - Cameras:  "+TCamera.List.Count()
		Print "  - Meshs:    "+TMesh.List.Count()
		Print " - Surfaces:  "+TSurface.List.Count()
		Print " - Materials: "+TMaterial.List.Count()
		Print " - Textures:  "+TTexture.List.Count()

		Print ""
		Print "- Ready -"
	End Function
End Type


And an example:
Strict

Rem
	Use Key-ESC to exit
End Rem

Framework Pub.DreiDe
Import Brl.JPGLoader
Import Brl.Random

Global Textures : TTexture[3]
Global Pixmap   : TPixmap
Global Material : TMaterial
Global Mesh     : TMesh
Global Camera   : TCamera

TDreiDe.Graphics3D(640, 480, 0, 0, False)

' Layer 0
Textures[0] = New TTexture
Textures[0].AddRenderMode(DDD_TEXTURE_MIPMAP)
Textures[0].SetBlendMode(DDD_TEXTURE_REPLACE)

Pixmap = LoadPixmap("media\layer0.jpg")
Textures[0].SetPixmap(Pixmap)

' Layer 1
Textures[1] = New TTexture
Textures[1].AddRenderMode(DDD_TEXTURE_MIPMAP)
Textures[1].SetBlendMode(DDD_TEXTURE_BLEND)

Pixmap = LoadPixmap("media\layer1.jpg")
Textures[1].SetPixmap(Pixmap)

' Layer 2
Textures[2] = New TTexture
Textures[2].AddRenderMode(DDD_TEXTURE_MIPMAP)
Textures[2].SetBlendMode(DDD_TEXTURE_ADD)

Pixmap = LoadPixmap("media\layer2.jpg")
Textures[2].SetPixmap(Pixmap)

Pixmap = Null
FlushMem()

Material = New TMaterial
Material.SetDiffuseColor(255,0,0)
Material.SetTexture(Textures[0], 0)
Material.SetTexture(Textures[1], 1)
Material.SetTexture(Textures[2], 2)

Mesh = T3DSLoader.Load("media\cube.3ds")
Mesh.SetMaterial(Material)

Camera = New TCamera
Camera.SetPosition(0.0, 0.0, 5.0)
Camera.SetClearColor(0.4, 0.6, 0.8)

' TLight-Module comming soon
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)

Local a:Float = 0.0
While Not KeyDown(KEY_ESCAPE)

	Mesh.Turn(0.0, 0.002, 0.001)
	
	Textures[1].Translate(0.0001, 0.0001)
	Textures[1].Turn(0.001)
	Textures[2].Translate(-0.0002, 0.0)
	
	Camera.Render()
	
	TDreiDe.UseMax2D()
	
	a:+ 0.01
			
	SetScale 1,1
	SetRotation 0
	SetBlend ALPHABLEND
	SetColor 255,255,255
	SetAlpha 1
	DrawText "Hello from Max2D!!!",0,Sin(a)*200+240
	
	Flip()
	
	FlushMem()
Wend

EndGraphics()
End

I slowed down the example because it's much too fast on my machine :)