Hey Jonathon, I tried to explain it to you earlier (math), but I think you 
still have a fundamental misunderstanding of how blending and blit_into 
works. Blending is combining pixels using the blending formula.  That 
formula determines the output of the resulting pixel. Normally this is done 
automatically in the framebuffer of drawn images, but you aren't doing; 
that you have two separate sets of data. With blitting you are writing your 
data to the texture. Writing data twice doesn't mean they combine 
automatically, even if they are different data sets.

Example: If you take two text files A and B, and output a file [not in 
append] and write file A to the same output, then write the file B to the 
same output. It doesn't become an intertwined mix of A and B, it just 
becomes B, since you are REPLACING the data. They don't just combine on 
their own in the data. This is the same as what you are doing, you are just 
replacing the data in those spots. It doesn't matter about alpha or colors; 
it's all data and you are replacing it. You need to COMBINE the data using 
the formula I linked you.

It's a slow day for me, but I made you an example using two images of the 
same size:


import pyglet
import ctypes


image_one = pyglet.image.load("one.png")
image_two = pyglet.image.load("two.png")


window = pyglet.window.Window()


def blend_color(color_src, color_dst, src_factor, dst_factor):
    # Blending Formula = source * src_factor + dst * dst_factor. Make sure 
they are int on return
    return int((color_src * src_factor + color_dst * dst_factor) * 255)
    
def blend_alpha(alpha_src, alpha_dst, src_factor, dst_factor):
    # Blend alpha, no source factor, can change if you want.
    return int((alpha_src + alpha_dst * dst_factor) * 255)


def combine_pixels(source, dst):
    """ source and dst are pixels of RGBA
    This demonstarates formula for glBlendFunc(GL_SRC_ALPHA, 
GL_ONE_MINUS_SRC_ALPHA)
    """
    converted_src = [px / 255 for px in source] # From bytes to values in 
relation to 1.
    converted_dst = [px / 255 for px in dst]


    # blend mode
    src_factor = converted_src[3]  # Source Factor: Source alpha. AKA 
GL_SRC_ALPHA
    dst_factor = (1 - converted_src[3])  # Dst Factor: 1 minus source alpha 
AKA GL_ONE_MINUS_SRC_ALPHA
    
    r = blend_color(converted_src[0], converted_dst[0], src_factor, 
dst_factor)
    g = blend_color(converted_src[1], converted_dst[1], src_factor, 
dst_factor)
    b = blend_color(converted_src[2], converted_dst[2], src_factor, 
dst_factor)
    a = blend_alpha(converted_src[3], converted_dst[3], src_factor, 
dst_factor)
         
    return r, g, b, a


    
# Turn both images in a list of RGBA int values.
pixel_data_one = list(image_one.get_image_data().get_data('RGBA', 
image_one.width 
* 4))
pixel_data_two = list(image_two.get_image_data().get_data('RGBA', 
image_two.width 
* 4))


combined_image = []
for i in range(0, len(pixel_data_one), 4):
    pixel_one = pixel_data_one[i:i + 4]
    pixel_two = pixel_data_two[i:i + 4]
    
    # Pixel_two (source) on top of pixel_one (destination)   
    combined_image.extend(combine_pixels(pixel_one, pixel_two))

data = (ctypes.c_ubyte * len(pixel_data_one))(*combined_image)
new_image = pyglet.image.ImageData(image_one.width, image_two.height, "RGBA"
, data)


new_image.save("combined_image.png")


# draw new image.
sprite = pyglet.sprite.Sprite(new_image, x=0, y=0)


@window.event
def on_draw():
    window.clear()
    
    sprite.draw()

pyglet.app.run()
    




On Thursday, March 19, 2020 at 11:18:32 AM UTC-5, Jonathon Parker wrote:
>
> So there is no solution for this?  All I want to do is:
>
> # imgA, imgB are identically sized instances of pyglet.image.ImageData in 
> RGBA format
>
> imgC = imgA + imgB
>
> # imgC is now imgA with imgB superimposed on top of it. Transparent pixels 
> in imgB allow *opaque* pixels in imgA to be visible
>
> I never thought something so simple would be so hard!
>
> On Wednesday, March 11, 2020 at 3:34:15 PM UTC-4, Jonathon Parker wrote:
>>
>> A minimal example
>>
>> # rawdata1 and rawdata2 are a list of c_ubytes
>>
>> my_texture_region = pyglet.image.ImageData(x, y, 'RGB', 
>> rawdata1).get_texture()
>> my_image = pyglet.image.ImageData(x, y, 'RGB', rawdata2)
>> my_texture_region.blit_into(my_image, 0, 0, 0)
>>
>> When I create a sprite using my_texture region, I only see my_image.  
>> What I want is my_image on top of my_texture_region.
>>
>> What am I doing wrong?
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pyglet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyglet-users/6301b590-20e5-4828-a2af-0268fd4f0753%40googlegroups.com.

Reply via email to