Strange Allegro bitmap loading

Started by
1 comment, last by Arith 14 years, 1 month ago
So I have a half decent terrain working in AllegroGL, which is randomly generated. Now I'm trying to superimpose a tga file as a heightmap using alpha values as a mask so that only certain portions of the tga affect the terrain. Problem is, the way it is now, it's soooo dodgy. Well, let me show you the function.. perhaps shed some light.

char TERRAIN::Superimpose(const char *bitmapfn, bool mask)
{
 BITMAP *overlay;

 int overlayr=0, overlayb=0, overlayg=0, overlaya=0;
 int pxcolour =0, lcount=0;

 overlay = load_bitmap(bitmapfn, NULL);

 if (!overlay) return 111;

 int overlayx=0, overlayy=0;
 for (int terrainy=0; terrainy<height; terrainy++)
  for (int terrainx=0; terrainx<width; terrainx++)
  {
   lcount ++;  
   pxcolour = getpixel(overlay, overlayx, overlayy);
   overlayr=0;
   overlayg=0;
   overlayb=0;
   overlaya=0;
   overlayr = getr(pxcolour);
   overlayg = getg(pxcolour);
   overlayb = getb(pxcolour);
   overlaya = geta(pxcolour);

   overlayx++;
   if (overlayx > overlay->w) 
   {
    overlayx=0;
    overlayy++;
    if (overlayy > overlay->h) continue;
   }

   if ((mask)&&(overlaya==0)) continue; // zero alpha skips current pixel

   Vertex[terrainx][terrainy].z = (float)(overlayr+overlayb+overlayg);
  }

 save_bitmap("./echooverlay.tga", overlay, NULL);
 destroy_bitmap(overlay);

 return 0;
}



If I comment out "if ((mask)&&(overlaya==0)) continue;" the hightmapping works.. sort of. The bitmap appears to be skewed on the terrain (ie the start of the bitmap appears in the middle of the terrain then wraps around) What's worse, the saved bitmap echooverlay.tga is completely blank except for a rogue white pixel usually in the first row. I've tried playing with direct pixel formats with limited success (other variations of geta, getpixel etc) and decided it's best to get some advice. I remember back when I did pure allegro projects that comparing pixels were a pain in the ass. If anyone has some insight it would be greatly appreciated. Arith Edit: Ok, minor tweaks yield that the alpha IS working and is superimposing the image somewhat as desired. However now my main problem is the skewed image. For some reason it puts a seam down the middle of my terrain and half the heightmap is on one end, and the other half on the other end. I've never seen allegro do that before.... [Edited by - Arith on February 23, 2010 2:03:45 PM]
Advertisement
Alright, as mentioned in my edit above, the heightmap IS working, but not the way I would have wanted. The function is very much the same as the one above.

Heightmap:
http://i138.photobucket.com/albums/q257/Serojin/heightmap.jpg
(the area outside of the black circle is transparent, not that it matters)


and here is the resulting terrain
http://i138.photobucket.com/albums/q257/Serojin/messedup.jpg

I have no idea what to do about this. I've tried initializing my heightmap container, put in allegro_gl_set_allegro_mode(); I just don't know. I've never had allegro do this to me before.

Also, the echooverlay.tga now copies the original heightmap properly..

Once again, if anyone has any thoughts, it would be much appreciated as this is really getting to me.

Thanks

Arith
Well, I got it to work. I have no idea why it did all that skewing. Only thing I can come up with is I had some sort of logic issue with the counters on the heightmap versus the terrain vertices. I merged them into one and it works. (originally I had hoped I could flip them by reversing the y order on the heightmap, but I guess I'll have to live with this for now)

char TERRAIN::Superimpose(const char *bitmapfn, bool mask){ allegro_gl_set_allegro_mode(); BITMAP *overlay; int overlayr=0, overlayb=0, overlayg=0, overlaya=0; int pxcolour =0, lcount=0; overlay = create_bitmap(200,200); clear_bitmap(overlay); overlay = load_bitmap(bitmapfn, NULL); if (!overlay) return 111; for (int terrainy=0; terrainy<height; terrainy++)  for (int terrainx=0; terrainx<width; terrainx++)  {   lcount ++;     pxcolour = getpixel(overlay, terrainx, terrainy);   overlayr = getr(pxcolour);   overlayg = getg(pxcolour);   overlayb = getb(pxcolour);   overlaya = geta(pxcolour);    if ((mask)&&(overlaya==0)) continue; // zero alpha skips current pixel   Vertex[terrainx][terrainy].z = (float)-(overlayr+overlayb+overlayg)/3;  } save_bitmap("./echooverlay.tga", overlay, NULL); destroy_bitmap(overlay); allegro_gl_unset_allegro_mode(); return 0;}



er. Thanks everyone for your input.. or something.

This topic is closed to new replies.

Advertisement