Working with Pointers
BlitzMax Forums/BlitzMax Programming/Working with Pointers
| ||
In finalizing the resource reloader in TileMax I realized that in order for this to be seamless to the rest of the code on Graphics mode change, I would need to update TImage and TSound variables that store the pointers to the TImage/TSounds. But... I'm having difficulty wrapping my head around this Global I:TImage=TMSoftLoadImage("image.png",I) Function SoftLoadImage:TImage(path:string, I:TImage) R:TMResource=new TMResource R.Path=path R.Image=loadimage(path) R.Pointer=VarPtr(I) return R.Image End Function Right now, no matter what I set TMResource.Pointer type to... for example: Field Pointer:int Ptr will give me a conversion error (unable to convert from TImage Ptr to Int Ptr) Field Pointer:Object Ptr - illegal pointer type Field Pointer:TImage Ptr - illegal pointer type ??? |
| ||
If you want the type instance to hold a copy of the image pointer then do somehting like:R.pointer = varptr(R.image) '//if R.pointer is an int then R.pointer = int(varptr(R.image)) |
| ||
So I updated it to:Global I:TImage=TMSoftLoadImage("image.png",I) Function SoftLoadImage:TImage(path:string, I:TImage) R:TMResource=new TMResource R.Path=path R.Image=loadimage(path) R.Pointer=Int(VarPtr(I)) return R.Image End Function Which is storing the address of variable I in an int variable... Now, how do I modify the original variable (I in this case) to the new value of a reloaded image? Which, if I understand correctly, is basically setting the original I value to the pointer value contained in R.Image? |
| ||
I'm not sure why you need a pointer here? Also, Varptr(I) is invalid the moment you leave that function, so it's not like you're going to get anything good out of that. Also, I believe that if you change the graphics driver/graphics settings, Max2D will just invalidate and reload the image frames. E.g., |
| ||
Ooops... should have been:Function SoftLoadImage:TImage(path:string, I:TImage var) R:TMResource=new TMResource R.Path=path R.Image=loadimage(path) R.Pointer=Int(VarPtr(I)) return R.Image End Function |
| ||
See my above response again. Edit: And there's still no guarantee what you point to is valid, since chances are you're sticking the image in a local. Once that goes out of scope, you're boned. |
| ||
So its best to do the resource management using an array.. thats the interim approach I've taken TMImage[num] TMSound[num] When reloaded.. it just replaces the image/sound accordingly. |
| ||
Except you don't need to do that, at least not with images. |
| ||
In finalizing the resource reloader in TileMax I realized that in order for this to be seamless to the rest of the code on Graphics mode change, I would need to update TImage and TSound variables that store the pointers to the TImage/TSounds. As Nilium has already stated, you don't need to do anything for images (not sure about sounds, but I would suspect graphics reinitialization has no effect whatsoever to sounds). |
| ||
Hmm.... I guess some testing is in order then... i was under the impression that a graphics mode switch caused the images to be dumped. |
| ||
A TImage holds a TPixmap copy of the data. If it does get dumped from VRAM on a mode change, it should be reloaded from the pixmap on the next Draw. Probably... |
| ||
Yep, works perfectly! |
| ||
Oh... well, crap... ok... no thats a good thing actually! |