Code archives/3D Graphics - Misc/CopyTexture/LoadImageTexture

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

Download source code

CopyTexture/LoadImageTexture by BlitzSupport2002
If you load multiple copies of a texture, then modify one of them, all copies are affected. These functions let you create and modify copies of a texture.

Just do this:

tex = LoadTexture ("blah.bmp")
copy = CopyTexture (tex)

... you can then modify 'copy' without affecting 'tex' :)
; -----------------------------------------------------------------------------
; LoadImageTexture / CopyTexture
; -----------------------------------------------------------------------------

; LoadImageTexture can be used in place of multiple calls to LoadTexture on the
; same file. Alternatively, load using the normal LoadTexture then use CopyTexture
; for copies you intend to modify (leaving the original intact)...

; Why? Using LoadTexture to try and load multiple copies of one texture, and
; then modifying one of them, results in ALL copies being modified (see the
; demo's comments)... they actually all refer to the same texture!

; LoadImageTexture loads a texture via an image,...

Function LoadImageTexture (f$, flags = 1)
	teximage = LoadImage (f$)
	iw = ImageWidth (teximage)
	ih = ImageHeight (teximage)
	If teximage
		tex = CreateTexture (iw, ih, flags)
		tw = TextureWidth (tex)
		th = TextureHeight (tex)
		ResizeImage teximage, tw, th
		ib = ImageBuffer (teximage)
		If tex
			tb = TextureBuffer (tex)
			CopyRect 0, 0, tw, th, 0, 0, ib, tb
			FreeImage teximage
			Return tex
		EndIf
	EndIf
End Function

; CopyTexture does... guess what?

Function CopyTexture (texture, flags = 1)
	tw = TextureWidth (texture): th = TextureHeight (texture)
	tex = CreateTexture (tw, th, flags)
	tb = TextureBuffer (texture)
	txb = TextureBuffer (tex)
	LockBuffer txb
	LockBuffer tb
	For x = 0 To tw - 1
		For y = 0 To th - 1
			WritePixelFast x, y, ReadPixelFast (x, y, tb), txb
		Next
	Next
	UnlockBuffer tb
	UnlockBuffer txb
	Return tex
End Function

; -----------------------------------------------------------------------------
; DEMO...
; -----------------------------------------------------------------------------

Graphics3D 640, 480

cam = CreateCamera ()
MoveEntity cam, 0, 0, -5

cube1 = CreateCube ()
cube2 = CreateCube ()

MoveEntity cube1, -2, 0, 0
MoveEntity cube2, 2, 0, 0

; -----------------------------------------------------------------------------
; THE WHOLE POINT OF THIS STUFF...!
; -----------------------------------------------------------------------------
; Try enabling these two lines (DISABLE THE NEXT TWO!) -- note that when the
; second texture is modified, the first is too! LoadImageTexture and CopyTexture
; get around this... you can either load all copies using LoadImageTexture, or
; load one copy, then make copies via CopyTexture -- whichever suits you.
; -----------------------------------------------------------------------------

; tex1 = LoadTexture ("grass.bmp")
; tex2 = LoadTexture ("grass.bmp")

tex1 = LoadImageTexture ("grass.bmp")
tex2 = LoadImageTexture ("grass.bmp") ; Or: tex2 = CopyTexture (tex1)

tw = TextureWidth (tex2)
th = TextureHeight (tex2)

txb = TextureBuffer (tex2)
LockBuffer txb
For x = 0 To tw - 1
	For y = 0 To th - 1
		WritePixelFast x, y, ReadPixelFast (x, y, txb) * 0.5, txb
	Next
Next
UnlockBuffer txb

EntityTexture cube1, tex1
EntityTexture cube2, tex2

Repeat

	TurnEntity cube1, 0.1, 0.2, 0.4
	TurnEntity cube2, -0.1, -0.2, -0.4
	
	RenderWorld
	Flip
	
Until KeyHit (1)

End

Comments

None.

Code Archives Forum