Code archives/Graphics/B2D-->B3D

This code has been declared by its author to be Public Domain code.

Download source code

B2D-->B3D by John Pickford2001
A system for drawing 2D sprites in B3D. The plan is to make it 99% compatible tith B2D commands so porting B2D games will be trivial.

So far I have emulated LoadAnimImage and DrawImage which are the most common commands.

There are a couple of known issues:

If B3D resisizes and image\texture on loading then this code will not notice and get the UV's wrong. I'm looking for an elegant fix for this.

Transparent color must be 0,0,0 which appears to be a limitation of B3D at the moment.

How does it work?
Replace every drawImage and LoadAnimImage command in your code with a call to my functions. You also need an extra call to ClearDisplayList at the start of each frame (and of course Renderworld before FLIP).

Each time you draw a sprite a quad will be added to a mesh which will be drawn at renderworld. There's no need to worry about cameras or managing entities - existing code should work.

SPEED: Seems a fair bit slower than B2D. Hopefully I'll find a way to improve this.

FUTURE: I intend to add extra parameters to DrawImage which support scaling, rotation and variable alpha(tranlucency). This is ultimately the main reason for moving a 2D game to B3D - access to better rendering features.

A side effect of all this is future-proofing code as future editions of DirectX are dropping support for 2D.
;*******************************************************************
;
; 2Din3D	 By J.Pickford - Freeware!
;..........................................
;
; A set of 2D sprite functions implemented in B3D
;
; Functions are intended to be VERY close to B2D commands to make 
; conversion of B2D games easy
;
;
;
; This code is a work-in-progress. I hope to emulate more of the B2D
; functionality in future versions.
;
; Future Enhancements: Sprite Scaling, Rotation, Variable Alpha
;
;********************************************************************

Const maxframes=1000		;max number of animation frames allowed in a single texture

Type texturebank

	Field t_texture
	Field t_brush
	Field t_sx#[maxframes]
	Field t_sy#[maxframes]
	Field t_width#
    Field t_height#
    Field t_maxframe
	Field t_totalwidth#
	Field t_totalheight#

End Type

Const width#=640			;Screensize
Const height#=480


	Graphics3D width,height
	SetBuffer BackBuffer()
	
Global camera=CreateCamera()
Global pivot=CreateCamera()
Global displaylist=CreateMesh(camera)
Global lasttexture.texturebank



Global alien.texturebank=loadanimimageb3d ("alien.bmp",64,64)  ;Just an example



	clock#=0
	
	While Not MouseHit(2)
	
	
	
	ClearDisplayList() ;This resets the display list - ESSENTIAL!
	

	;"Draw" some stuff-------------------------------Actual drawing takes place at Renderworld()
	
		For f#=1 To 360 Step 5
			
			drawimageb3d (alien,width/2+width/2*Sin(clock/4)*Cos(clock+f),height/2+Cos(clock/5)*height/2*Sin(clock+f),(f/5) Mod 64)
	
		Next
	
	;should be at opposite corners of the screen 
		
		drawimageb3d (alien,0,0,(clock/5)Mod 64)
		drawimageb3d (alien,width-64,height-64,(clock/7)Mod 64)
	
	;-------------------------------------------------
		
		RenderWorld() ;Actual drawing takes place
		Color 255,255,255
		Text 100,10,"Click Right Mouse Button to Quit"
		Flip
	
		clock=clock+1
	
	Wend


	End

;--------------------------------------
; Call this at the start of each frame


Function ClearDisplayList()

	FreeEntity displaylist
	displaylist=CreateMesh(camera)
	PositionEntity displaylist,-width/2,-height/2,width/2
	lasttexture=Null
	
End Function

;------------------------------------------------------------------------
; LoadAnimImageB3D
;...................
;
;  Intended to be compatible with B2D command "LoadAnimImage"
;
;  Known problems: If B3D resizes texture because it's too big then
;                  the UV's will be wrong.  Looking for a neat fix...
;
;				   The transparent colour must be 0,0,0	
;-------------------------------------------------------------------------


Function LoadAnimImageB3D.texturebank (file$,swidth#,sheight#)

	this.texturebank=New texturebank
	this\t_texture=LoadTexture (file$,1+4)		;color + masked
	this\t_brush=CreateBrush()
	BrushTexture this\t_brush,this\t_texture
    BrushFX this\t_brush,1						;Full bright - no lighting needed

	this\t_totalwidth=TextureWidth (this\t_texture)
	this\t_totalheight=TextureHeight (this\t_texture)
	this\t_width=swidth
	this\t_height=sheight
	
	frame=0
	sy#=0
	
;Create the UV coords for each animation frame (just for speed later on)
	
	While sy<this\t_totalheight
	
	 	sx#=0
	 
		While sx<this\t_totalwidth
	
			this\t_sx[frame]=sx/this\t_totalwidth
			this\t_sy[frame]=sy/this\t_totalheight
			frame=frame+1
			sx=sx+swidth
		
		Wend
		
		sy=sy+sheight
	
	Wend
	
	
	this\t_maxframe=frame-1

	Return this

End Function


;--------------------------------------------------------------------------------
; DrawImageB3D (Simple sprite with no fancy functions)
;......................................................
;
;
; Intended to be compatible with the B2D equivelant (DrawImage)
; The only enhancement being x,y are floats allowing sub-pixel positioning
;
;--------------------------------------------------------------------------------

Function DrawImageB3D (texture.texturebank,x#,y#,frame)

	y=height-y	;in B3D y is up - in B2D y is down
		
;use existing surface except when switching source textures
	
	If texture=lasttexture Then surface=FindSurface (displaylist,texture\t_brush)
	If Not surface Then surface=CreateSurface (displaylist,texture\t_brush)
	lasttexture=texture
	
	w#=texture\t_width-1			;size of image (pixels)
	h#=texture\t_height-1
	tw#=w/texture\t_totalwidth		;size of image (texture coords)
	th#=h/texture\t_totalheight
	sx#=texture\t_sx[frame]			;position of image within texture (texture coords)
	sy#=texture\t_sy[frame]

	;								four vertices represent four corners of sprite

	v1=AddVertex (surface,x,y,0,sx,sy)
	v2=AddVertex (surface,x+w,y,0,sx+tw,sy)
	v3=AddVertex (surface,x,y-h,0,sx,sy+th)
	v4=AddVertex (surface,x+w,y-h,0,sx+tw,sy+th)
		 
	AddTriangle (surface,v1,v2,v3)	;two triangle make rectangular up image
	AddTriangle (surface,v2,v4,v3)

End Function

Comments

thelizardking2007
pretty nice :D


Code Archives Forum