pixies - sprites with zero filtering

Blitz3D Forums/Blitz3D Programming/pixies - sprites with zero filtering

The following was created while fixing my original overlay system in code archives.

It demonstrates use of sprites to achieve perfect pixel-texel mapping which results in zero filtering / blurring.

Odd sized textures and zoomed cameras may require some tweaks.

; pixies.bb
; by simon armstrong

; pixies are pixel perfect sprite overlays

; LoadPixie(camera,file$)
; CreatePixie(camera,texture)

; returns a sprite parented to a camera 
; with following features 
;  1:1 pixel-texel scale for zero filtered sharp overlays
;  position pixies in screen coordinates

; 20.8.2003 untested with odd sized sprites

displaywidth=800
displayheight=600

Graphics3D displaywidth,displayheight  

cam=CreateCamera() 
CameraRange cam,.1,1000 

pixie=LoadPixie(cam,"simon2.bmp")		;800,600,

While Not KeyHit(1) 
	PositionEntity pixie,MouseX(),MouseY(),0
	RenderWorld 
	UpdateWorld 
	TurnEntity cam,1,2,0	;test texel drift
	Flip 
	Wend 
End 

Function LoadPixie(camera,file$)
	texture=LoadTexture(file)
	Return CreatePixie(camera,texture)
End Function

Function CreatePixie(camera,texture)
; change these for viewports
	viewwidth=GraphicsWidth()
	viewheight=GraphicsHeight()
; find existing pixiespace parented to camera
	magic=0
	n=CountChildren(camera)
	For i=1 To n
		If EntityName(GetChild(camera,i))="pixiespace" 
			magic=GetChild(GetChild(camera,i),1)
		EndIf
	Next
	If magic=0
		magic=CreatePivot(camera) 
		NameEntity(magic,"pixiespace")
		aspect#=Float(viewheight)/viewwidth
		PositionEntity magic,-1,aspect,1 
		scale#=2.0/viewwidth 
		ScaleEntity magic,scale,-scale,-scale 
		magic=CreatePivot(magic)
		PositionEntity magic,-.5,-.5,0
	EndIf
; create sprite from texture as child of magic overlay	
	sprite=CreateSprite()			;,magic ???
	EntityParent sprite,magic		;cludge for blitz bug in createsprite(parent)
	brush=CreateBrush()
	BrushFX brush,1
	BrushTexture brush,texture
	PaintEntity sprite,brush
	FreeBrush brush
	SpriteViewMode sprite,2 
	scale#=1.0/viewwidth 
	ScaleSprite sprite,TextureWidth(texture)*scale,TextureHeight(texture)*scale
	Return sprite
End Function