Code archives/3D Graphics - Misc/CopyTexture/LoadImageTexture
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| 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